VibeVM
Contents
On this page
en
Publisher
org.vibevm.core
Version
1.0.0latest
Audiences
user
Reading time
4 min
Rendered
Read aloud
never

Remove VibeVM from a project

01When a project is finished and must leave without a trace of the tool that helped build it, one operation removes every vibe file and reference while keeping the product and its build intact.

02
Show me the scrape plan for the VibeVM project in the current folder, then export a scraped copy of it into a new folder named product-clean beside the project, and prove that the copy builds without vibe.

the vibevm skill installed for your agent; a project with vibe.toml and a scrape contract adapted to it: vibe scrape contract init writes a conservative default that refuses to delete files whose modification it cannot prove and checks health with cargo; the project's native build tool on the PATH

../product-clean exists, holds no vibevm/ directory, no vibe.toml, no vibe.lock and no managed block in the agent instruction files, and its native build and tests pass

  • test ! -e ../product-clean/vibe.toml
  • test ! -e ../product-clean/vibevm

What happens

03The agent creates the contract with vibe scrape contract init if the project has none and adapts it: for vibe's own trees you never edited it sets modified = "delete", and it keeps a health check that fits the project. It runs vibe scrape --plan, which reads the contract, classifies every file the tool ever wrote or marked, and prints the complete plan without writing anything: what is deleted, what is rewritten, what is kept under a neutral name. Then it runs vibe scrape --output with the absolute path of the new folder, which creates the scraped copy and runs the project's health checks on it; the original is untouched. The copy is a plain project of its language: no manifest, no lock file, no dependency tree, no boot files, no managed block, no source annotations that pointed at specifications.

04 A scraped tree is a project tree for which every contract-selected Vibe path, dependency, managed marker, source annotation, tool script and environment reference is absent or explicitly retained under a neutral identity, and whose required native health panel is accepted after scraping under the declared strict or no-regression baseline policy. A retained non-pass verdict is never described as an unconditional pass.

By hand

051. Create the contract. The default is conservative: it names vibe's trees, refuses anything it cannot prove unmodified, and checks health with cargo:

06
vibe scrape contract init --path hello-vibe
Scrape contract
  ✓ created  <TMP>/work/hello-vibe/vibevm/scrape/contract.toml
Review the contract, then run `vibe scrape contract check`.

072. Adapt it. A fresh project has no modification baseline for vibe's files, so the two [[classify]] rules refuse them as unknown. If you never edited those trees, set modified = "delete" on both. Replace the [[healthcheck]] if the project is not a Rust workspace. Then validate: vibe scrape contract check --path hello-vibe.

083. Look at the plan:

09
vibe scrape --plan --path hello-vibe

104. Export to a new folder, which must not exist yet and is named without ..:

11
vibe scrape --output hello-clean --path hello-vibe

125. Or scrape in place, which is a recoverable transaction and requires explicit authorisation: vibe scrape --in-place --assume-yes. If it is interrupted, vibe scrape --recover --path <root> settles the pending transaction.

13 vibe scrape --recover --path <project> settles the one pending user-local transaction. Recovery reads the journaled contract and plan, never the possibly removed project contract. A new scrape refuses while recovery is pending.

14The commands in one place. vibe scrape contract init writes a conservative default only when none exists, and contract check parses and plans it without writing. vibe scrape --plan is read-only and, given no mode, plans the in-place form, the larger risk. --output creates the export in a folder that must not exist and never changes the source tree. --in-place runs the journaled transaction, shows the census of modified and deleted files when interactive, and unattended needs --assume-yes after a green plan. Planning and checking run everywhere; in this first epoch the mutating modes run on Windows only, where the safety mechanics have been proven.

15 vibe scrape contract init writes a conservative default contract only when absent; vibe scrape contract check parses and plans it read-only. Existing contracts are never silently refreshed by install or a language discipline.
16 vibe scrape --plan [--contract <path>] [--output <dir> | --in-place] is read-only. With neither execution mode, it plans the in-place form because that is the larger risk surface; it writes no project, journal, quarantine or report file.
17 vibe scrape --output <absent-dir> [--contract <path>] creates a scraped export and never changes the source tree. The destination must be absent; adoption of an existing directory is forbidden.
18 vibe scrape --in-place [--contract <path>] executes the journaled in-place transaction. Interactive use shows the exact modified-file and deletion census; unattended use requires --assume-yes after a green plan.
19 Epoch-1 contract parsing, planning and contract checking are portable. Mutating --output, --in-place and --recover execution is enabled only on Windows, where the implementation proves handle-relative exclusive directory creation, no-replace publication, write/delete-denying namespace seals and restartable cleanup. Linux, macOS and other hosts return the typed blocker scrape-platform-unsupported before journal creation or project mutation. Their wire/state-machine shape remains portable, but the product does not claim a weaker check-then-rename implementation as support.

The contract

20What counts as vibe's and what counts as yours is not guessed from file names; a contract says it. The contract lives at vibevm/scrape/contract.toml in the project: vibe scrape contract init writes the conservative default, vibe scrape contract check validates one, and --contract <file> reads another. A contained contract is the last file removed, so the plan can be re-read until the end.

21 The default is the project-root literal vibevm/scrape/contract.toml. Every operand inside it is project-root-relative regardless of where an alternate contract lives. Contract location never changes mutation authority.

22A scrape never deletes a path blindly: a build script that calls a vibe tool, generated product sources that sit beside disposable generated state, an authored specification that shares a tree with generated boot output, all are dispositioned by the contract, and untouched files stay byte-identical.

23 Product preservation means: all untouched files are byte-identical; every authored source rewrite is metadata erasure-equivalent; every declared relocation preserves exact bytes and mode; native manifests and lockfiles describe the scraped dependency graph; the health oracle accepts the result.

24The contract is strict: unknown tables and values are rejected, schema is 1, and every id is unique. Files you wrote under vibevm/vibespecs are never taken for generated because of their folder; a contract that wants zero residue names them for deletion or relocation itself. Generated code, tests and models the project accepted are product and stay unless a row names them. Globs only select; bytes change only through typed adapters, never through a regex or a shell rewrite. Zero residue means zero registered identities, paths and markers, not the word «vibe» in your prose.

25 The TOML schema rejects unknown tables, fields, tagged kinds and enum values. schema must equal 1; every id is a unique portable token across classification, rewrite, relocation, assertion and health rows.
26 Authored files under vibevm/vibespecs are not generated merely because of their directory. A full zero-residue contract must explicitly delete them or relocate them to a neutral home. No built-in policy silently decides their value.
27 Generated cells, seams, tests, models and other useful application source are authored product once accepted into the project. They remain unless an exact contract relocation or deletion row names them. Origin in a discipline is not deletion authority.
28 Globs select candidates; they never rewrite bytes. Authored source and structural manifests are changed only by a closed typed adapter. Generic regex replacement, shell rewrite hooks, implicit format conversion and whole-document reserialization are forbidden.
29 Zero residue means zero registered Vibe identities, paths and markers selected by this contract. It does not mean deleting an ordinary word such as “vibe” from prose, nor undoing architectural choices learned while using a discipline.

30You supply the policy, the engine supplies the mechanics and the verdicts. Anything the sealed contract and the observed tree cannot decide is a blocker, never a guess. The tool does not rewrite git history, does not publish, and does not remove what was deployed to your machine; those stay explicit operations.

31 The owner supplies policy: delete, keep, relocate, strip, retain, required checks and acceptable baseline mode. The engine supplies all mechanics and verdicts. Any state not decidable from the sealed contract and observed tree is a blocker, never a guess or best-effort success.
32 Schema 1 does not reverse the historical influence of VibeVM on product architecture, infer replacements for arbitrary runtime libraries, mutate Git history, publish artifacts, or silently remove user-global deployments. Schema 1 does not discover, report or remove receipt-owned user-global deployments; the operator runs the existing explicit undeploy operation separately when external removal is desired.

Edge cases and rules

33Scrape is not clean. vibe clean removes what vibe can regenerate and keeps the relationship; scrape removes the relationship itself, which is why it needs a contract, a health proof and a recoverable commit.

34 PROP-053 vibe clean removes regenerable dependency and boot products while retaining authored project state and vibe.lock. Scrape is not clean: it removes the Vibe relationship itself and therefore requires a contract, native health proof and recoverable commit.

35--output and --in-place are mutually exclusive; a plan is always available before either.

36 --output and --in-place are mutually exclusive. --recover accepts neither mode nor contract because the durable journal already fixes both.

37The words attach and detach are reserved for a future live-tool relationship, such as connecting a debugger; scrape is never an alias for them.

38 Scrape is the terminal cleaning operation defined here: it removes the selected VibeVM repository layer while preserving the native product. The command vocabulary deliberately reserves attach and detach for a future live-tool relationship such as connecting and disconnecting a debugger. Scrape is never an alias for that future runtime operation, and no detach spelling is accepted by this command.

For an agent

This page has a machine mirror. The citation carries the version rather than latest, so what an agent quotes does not move under it.

spec://org.vibevm.core/vibevm-docs@1.0.0/lifecycle/scrape

.md.xmlllms.txt