trail-code 0.0.0-stage → 0.28.0-semantic.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +567 -2
- package/dist/ai/crux.d.ts +88 -0
- package/dist/ai/crux.d.ts.map +1 -0
- package/dist/ai/crux.js +219 -0
- package/dist/ai/crux.js.map +1 -0
- package/dist/ai/failure.d.ts +60 -0
- package/dist/ai/failure.d.ts.map +1 -0
- package/dist/ai/failure.js +86 -0
- package/dist/ai/failure.js.map +1 -0
- package/dist/ai/llm/anthropic.d.ts +37 -0
- package/dist/ai/llm/anthropic.d.ts.map +1 -0
- package/dist/ai/llm/anthropic.js +144 -0
- package/dist/ai/llm/anthropic.js.map +1 -0
- package/dist/ai/llm/factory.d.ts +28 -0
- package/dist/ai/llm/factory.d.ts.map +1 -0
- package/dist/ai/llm/factory.js +36 -0
- package/dist/ai/llm/factory.js.map +1 -0
- package/dist/ai/llm/litellm.d.ts +34 -0
- package/dist/ai/llm/litellm.d.ts.map +1 -0
- package/dist/ai/llm/litellm.js +45 -0
- package/dist/ai/llm/litellm.js.map +1 -0
- package/dist/ai/llm/openai.d.ts +145 -0
- package/dist/ai/llm/openai.d.ts.map +1 -0
- package/dist/ai/llm/openai.js +629 -0
- package/dist/ai/llm/openai.js.map +1 -0
- package/dist/ai/llm/orcarouter.d.ts +34 -0
- package/dist/ai/llm/orcarouter.d.ts.map +1 -0
- package/dist/ai/llm/orcarouter.js +45 -0
- package/dist/ai/llm/orcarouter.js.map +1 -0
- package/dist/ai/llm/recover-tool.d.ts +21 -0
- package/dist/ai/llm/recover-tool.d.ts.map +1 -0
- package/dist/ai/llm/recover-tool.js +109 -0
- package/dist/ai/llm/recover-tool.js.map +1 -0
- package/dist/ai/llm/types.d.ts +122 -0
- package/dist/ai/llm/types.d.ts.map +1 -0
- package/dist/ai/llm/types.js +33 -0
- package/dist/ai/llm/types.js.map +1 -0
- package/dist/ai/providers.d.ts +59 -0
- package/dist/ai/providers.d.ts.map +1 -0
- package/dist/ai/providers.js +54 -0
- package/dist/ai/providers.js.map +1 -0
- package/dist/ai/summarize.d.ts +25 -0
- package/dist/ai/summarize.d.ts.map +1 -0
- package/dist/ai/summarize.js +34 -0
- package/dist/ai/summarize.js.map +1 -0
- package/dist/ai/synthesize.d.ts +40 -0
- package/dist/ai/synthesize.d.ts.map +1 -0
- package/dist/ai/synthesize.js +230 -0
- package/dist/ai/synthesize.js.map +1 -0
- package/dist/ask/ask.d.ts +199 -0
- package/dist/ask/ask.d.ts.map +1 -0
- package/dist/ask/ask.js +1291 -0
- package/dist/ask/ask.js.map +1 -0
- package/dist/ask/file-rank.d.ts +72 -0
- package/dist/ask/file-rank.d.ts.map +1 -0
- package/dist/ask/file-rank.js +160 -0
- package/dist/ask/file-rank.js.map +1 -0
- package/dist/ask/file-selection.d.ts +22 -0
- package/dist/ask/file-selection.d.ts.map +1 -0
- package/dist/ask/file-selection.js +66 -0
- package/dist/ask/file-selection.js.map +1 -0
- package/dist/ask/fuse.d.ts +195 -0
- package/dist/ask/fuse.d.ts.map +1 -0
- package/dist/ask/fuse.js +344 -0
- package/dist/ask/fuse.js.map +1 -0
- package/dist/ask/graphrank.d.ts +61 -0
- package/dist/ask/graphrank.d.ts.map +1 -0
- package/dist/ask/graphrank.js +130 -0
- package/dist/ask/graphrank.js.map +1 -0
- package/dist/ask/index-file.d.ts +44 -0
- package/dist/ask/index-file.d.ts.map +1 -0
- package/dist/ask/index-file.js +128 -0
- package/dist/ask/index-file.js.map +1 -0
- package/dist/ask/semantic.d.ts +42 -0
- package/dist/ask/semantic.d.ts.map +1 -0
- package/dist/ask/semantic.js +293 -0
- package/dist/ask/semantic.js.map +1 -0
- package/dist/bin/graft.d.ts +3 -0
- package/dist/bin/graft.d.ts.map +1 -0
- package/dist/bin/graft.js +14 -0
- package/dist/bin/graft.js.map +1 -0
- package/dist/bin/trail.d.ts +3 -0
- package/dist/bin/trail.d.ts.map +1 -0
- package/dist/bin/trail.js +13 -0
- package/dist/bin/trail.js.map +1 -0
- package/dist/blast/blast-cli.d.ts +35 -0
- package/dist/blast/blast-cli.d.ts.map +1 -0
- package/dist/blast/blast-cli.js +155 -0
- package/dist/blast/blast-cli.js.map +1 -0
- package/dist/blast/blast.d.ts +128 -0
- package/dist/blast/blast.d.ts.map +1 -0
- package/dist/blast/blast.js +383 -0
- package/dist/blast/blast.js.map +1 -0
- package/dist/blast/diff.d.ts +53 -0
- package/dist/blast/diff.d.ts.map +1 -0
- package/dist/blast/diff.js +193 -0
- package/dist/blast/diff.js.map +1 -0
- package/dist/blast/evidence.d.ts +51 -0
- package/dist/blast/evidence.d.ts.map +1 -0
- package/dist/blast/evidence.js +162 -0
- package/dist/blast/evidence.js.map +1 -0
- package/dist/blast/modules.d.ts +33 -0
- package/dist/blast/modules.d.ts.map +1 -0
- package/dist/blast/modules.js +83 -0
- package/dist/blast/modules.js.map +1 -0
- package/dist/blast/name.d.ts +74 -0
- package/dist/blast/name.d.ts.map +1 -0
- package/dist/blast/name.js +269 -0
- package/dist/blast/name.js.map +1 -0
- package/dist/blast/owners.d.ts +85 -0
- package/dist/blast/owners.d.ts.map +1 -0
- package/dist/blast/owners.js +272 -0
- package/dist/blast/owners.js.map +1 -0
- package/dist/blast/render.d.ts +46 -0
- package/dist/blast/render.d.ts.map +1 -0
- package/dist/blast/render.js +422 -0
- package/dist/blast/render.js.map +1 -0
- package/dist/blast/viz.d.ts +37 -0
- package/dist/blast/viz.d.ts.map +1 -0
- package/dist/blast/viz.js +180 -0
- package/dist/blast/viz.js.map +1 -0
- package/dist/brand.d.ts +111 -0
- package/dist/brand.d.ts.map +1 -0
- package/dist/brand.js +282 -0
- package/dist/brand.js.map +1 -0
- package/dist/claude/build-progress.d.ts +30 -0
- package/dist/claude/build-progress.d.ts.map +1 -0
- package/dist/claude/build-progress.js +81 -0
- package/dist/claude/build-progress.js.map +1 -0
- package/dist/claude/hermes-skill-template.d.ts +16 -0
- package/dist/claude/hermes-skill-template.d.ts.map +1 -0
- package/dist/claude/hermes-skill-template.js +154 -0
- package/dist/claude/hermes-skill-template.js.map +1 -0
- package/dist/claude/init.d.ts +65 -0
- package/dist/claude/init.d.ts.map +1 -0
- package/dist/claude/init.js +258 -0
- package/dist/claude/init.js.map +1 -0
- package/dist/claude/paths.d.ts +9 -0
- package/dist/claude/paths.d.ts.map +1 -0
- package/dist/claude/paths.js +22 -0
- package/dist/claude/paths.js.map +1 -0
- package/dist/claude/session-metrics.d.ts +73 -0
- package/dist/claude/session-metrics.d.ts.map +1 -0
- package/dist/claude/session-metrics.js +209 -0
- package/dist/claude/session-metrics.js.map +1 -0
- package/dist/claude/settings-merge.d.ts +76 -0
- package/dist/claude/settings-merge.d.ts.map +1 -0
- package/dist/claude/settings-merge.js +283 -0
- package/dist/claude/settings-merge.js.map +1 -0
- package/dist/claude/skill-template.d.ts +13 -0
- package/dist/claude/skill-template.d.ts.map +1 -0
- package/dist/claude/skill-template.js +290 -0
- package/dist/claude/skill-template.js.map +1 -0
- package/dist/claude/state.d.ts +85 -0
- package/dist/claude/state.d.ts.map +1 -0
- package/dist/claude/state.js +88 -0
- package/dist/claude/state.js.map +1 -0
- package/dist/claude/stats.d.ts +5 -0
- package/dist/claude/stats.d.ts.map +1 -0
- package/dist/claude/stats.js +24 -0
- package/dist/claude/stats.js.map +1 -0
- package/dist/cli-epilogue.d.ts +12 -0
- package/dist/cli-epilogue.d.ts.map +1 -0
- package/dist/cli-epilogue.js +72 -0
- package/dist/cli-epilogue.js.map +1 -0
- package/dist/cli-meta.d.ts +82 -0
- package/dist/cli-meta.d.ts.map +1 -0
- package/dist/cli-meta.js +238 -0
- package/dist/cli-meta.js.map +1 -0
- package/dist/cli-picker.d.ts +139 -0
- package/dist/cli-picker.d.ts.map +1 -0
- package/dist/cli-picker.js +439 -0
- package/dist/cli-picker.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1638 -0
- package/dist/cli.js.map +1 -0
- package/dist/context/batches.d.ts +29 -0
- package/dist/context/batches.d.ts.map +1 -0
- package/dist/context/batches.js +130 -0
- package/dist/context/batches.js.map +1 -0
- package/dist/context/build.d.ts +57 -0
- package/dist/context/build.d.ts.map +1 -0
- package/dist/context/build.js +396 -0
- package/dist/context/build.js.map +1 -0
- package/dist/context/check.d.ts +42 -0
- package/dist/context/check.d.ts.map +1 -0
- package/dist/context/check.js +162 -0
- package/dist/context/check.js.map +1 -0
- package/dist/context/map-dir.d.ts +13 -0
- package/dist/context/map-dir.d.ts.map +1 -0
- package/dist/context/map-dir.js +81 -0
- package/dist/context/map-dir.js.map +1 -0
- package/dist/context/node-file.d.ts +109 -0
- package/dist/context/node-file.d.ts.map +1 -0
- package/dist/context/node-file.js +390 -0
- package/dist/context/node-file.js.map +1 -0
- package/dist/context/price.d.ts +49 -0
- package/dist/context/price.d.ts.map +1 -0
- package/dist/context/price.js +83 -0
- package/dist/context/price.js.map +1 -0
- package/dist/context/savings.d.ts +67 -0
- package/dist/context/savings.d.ts.map +1 -0
- package/dist/context/savings.js +125 -0
- package/dist/context/savings.js.map +1 -0
- package/dist/engine.d.ts +85 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +122 -0
- package/dist/engine.js.map +1 -0
- package/dist/graph/bindings.d.ts +64 -0
- package/dist/graph/bindings.d.ts.map +1 -0
- package/dist/graph/bindings.js +713 -0
- package/dist/graph/bindings.js.map +1 -0
- package/dist/graph/build-run.d.ts +25 -0
- package/dist/graph/build-run.d.ts.map +1 -0
- package/dist/graph/build-run.js +121 -0
- package/dist/graph/build-run.js.map +1 -0
- package/dist/graph/build.d.ts +88 -0
- package/dist/graph/build.d.ts.map +1 -0
- package/dist/graph/build.js +386 -0
- package/dist/graph/build.js.map +1 -0
- package/dist/graph/cards.d.ts +46 -0
- package/dist/graph/cards.d.ts.map +1 -0
- package/dist/graph/cards.js +280 -0
- package/dist/graph/cards.js.map +1 -0
- package/dist/graph/check.d.ts +25 -0
- package/dist/graph/check.d.ts.map +1 -0
- package/dist/graph/check.js +192 -0
- package/dist/graph/check.js.map +1 -0
- package/dist/graph/container.d.ts +63 -0
- package/dist/graph/container.d.ts.map +1 -0
- package/dist/graph/container.js +191 -0
- package/dist/graph/container.js.map +1 -0
- package/dist/graph/depth-parser.d.ts +61 -0
- package/dist/graph/depth-parser.d.ts.map +1 -0
- package/dist/graph/depth-parser.js +153 -0
- package/dist/graph/depth-parser.js.map +1 -0
- package/dist/graph/enrich.d.ts +62 -0
- package/dist/graph/enrich.d.ts.map +1 -0
- package/dist/graph/enrich.js +258 -0
- package/dist/graph/enrich.js.map +1 -0
- package/dist/graph/extract-cache.d.ts +101 -0
- package/dist/graph/extract-cache.d.ts.map +1 -0
- package/dist/graph/extract-cache.js +199 -0
- package/dist/graph/extract-cache.js.map +1 -0
- package/dist/graph/extract.d.ts +85 -0
- package/dist/graph/extract.d.ts.map +1 -0
- package/dist/graph/extract.js +2377 -0
- package/dist/graph/extract.js.map +1 -0
- package/dist/graph/fingerprint.d.ts +76 -0
- package/dist/graph/fingerprint.d.ts.map +1 -0
- package/dist/graph/fingerprint.js +160 -0
- package/dist/graph/fingerprint.js.map +1 -0
- package/dist/graph/generic.d.ts +74 -0
- package/dist/graph/generic.d.ts.map +1 -0
- package/dist/graph/generic.js +773 -0
- package/dist/graph/generic.js.map +1 -0
- package/dist/graph/invariants.d.ts +33 -0
- package/dist/graph/invariants.d.ts.map +1 -0
- package/dist/graph/invariants.js +52 -0
- package/dist/graph/invariants.js.map +1 -0
- package/dist/graph/load.d.ts +29 -0
- package/dist/graph/load.d.ts.map +1 -0
- package/dist/graph/load.js +97 -0
- package/dist/graph/load.js.map +1 -0
- package/dist/graph/lsp/client.d.ts +61 -0
- package/dist/graph/lsp/client.d.ts.map +1 -0
- package/dist/graph/lsp/client.js +217 -0
- package/dist/graph/lsp/client.js.map +1 -0
- package/dist/graph/lsp/enrich.d.ts +11 -0
- package/dist/graph/lsp/enrich.d.ts.map +1 -0
- package/dist/graph/lsp/enrich.js +163 -0
- package/dist/graph/lsp/enrich.js.map +1 -0
- package/dist/graph/lsp/registry.d.ts +22 -0
- package/dist/graph/lsp/registry.d.ts.map +1 -0
- package/dist/graph/lsp/registry.js +71 -0
- package/dist/graph/lsp/registry.js.map +1 -0
- package/dist/graph/map.d.ts +107 -0
- package/dist/graph/map.d.ts.map +1 -0
- package/dist/graph/map.js +239 -0
- package/dist/graph/map.js.map +1 -0
- package/dist/graph/markdown.d.ts +22 -0
- package/dist/graph/markdown.d.ts.map +1 -0
- package/dist/graph/markdown.js +143 -0
- package/dist/graph/markdown.js.map +1 -0
- package/dist/graph/native.d.ts +46 -0
- package/dist/graph/native.d.ts.map +1 -0
- package/dist/graph/native.js +169 -0
- package/dist/graph/native.js.map +1 -0
- package/dist/graph/queries/c.scm +13 -0
- package/dist/graph/queries/c_sharp.scm +19 -0
- package/dist/graph/queries/clojure.scm +58 -0
- package/dist/graph/queries/cpp.scm +23 -0
- package/dist/graph/queries/dart.scm +42 -0
- package/dist/graph/queries/elixir.scm +54 -0
- package/dist/graph/queries/gleam.scm +51 -0
- package/dist/graph/queries/java.scm +20 -0
- package/dist/graph/queries/kotlin.scm +43 -0
- package/dist/graph/queries/lua.scm +36 -0
- package/dist/graph/queries/nix.scm +32 -0
- package/dist/graph/queries/php.scm +40 -0
- package/dist/graph/queries/ruby.scm +65 -0
- package/dist/graph/queries/rust.scm +41 -0
- package/dist/graph/queries/scala.scm +66 -0
- package/dist/graph/queries/solidity.scm +43 -0
- package/dist/graph/queries/swift.scm +51 -0
- package/dist/graph/refresh.d.ts +106 -0
- package/dist/graph/refresh.d.ts.map +1 -0
- package/dist/graph/refresh.js +430 -0
- package/dist/graph/refresh.js.map +1 -0
- package/dist/graph/relations.d.ts +14 -0
- package/dist/graph/relations.d.ts.map +1 -0
- package/dist/graph/relations.js +8 -0
- package/dist/graph/relations.js.map +1 -0
- package/dist/graph/resolve.d.ts +17 -0
- package/dist/graph/resolve.d.ts.map +1 -0
- package/dist/graph/resolve.js +716 -0
- package/dist/graph/resolve.js.map +1 -0
- package/dist/graph/root.d.ts +11 -0
- package/dist/graph/root.d.ts.map +1 -0
- package/dist/graph/root.js +40 -0
- package/dist/graph/root.js.map +1 -0
- package/dist/graph/scopes.d.ts +40 -0
- package/dist/graph/scopes.d.ts.map +1 -0
- package/dist/graph/scopes.js +383 -0
- package/dist/graph/scopes.js.map +1 -0
- package/dist/graph/seed.d.ts +38 -0
- package/dist/graph/seed.d.ts.map +1 -0
- package/dist/graph/seed.js +229 -0
- package/dist/graph/seed.js.map +1 -0
- package/dist/graph/source-files.d.ts +46 -0
- package/dist/graph/source-files.d.ts.map +1 -0
- package/dist/graph/source-files.js +118 -0
- package/dist/graph/source-files.js.map +1 -0
- package/dist/graph/traverse-cli.d.ts +55 -0
- package/dist/graph/traverse-cli.d.ts.map +1 -0
- package/dist/graph/traverse-cli.js +189 -0
- package/dist/graph/traverse-cli.js.map +1 -0
- package/dist/graph/traverse.d.ts +112 -0
- package/dist/graph/traverse.d.ts.map +1 -0
- package/dist/graph/traverse.js +192 -0
- package/dist/graph/traverse.js.map +1 -0
- package/dist/graph/types.d.ts +78 -0
- package/dist/graph/types.d.ts.map +1 -0
- package/dist/graph/types.js +14 -0
- package/dist/graph/types.js.map +1 -0
- package/dist/graph/wasm-runtime.d.ts +19 -0
- package/dist/graph/wasm-runtime.d.ts.map +1 -0
- package/dist/graph/wasm-runtime.js +38 -0
- package/dist/graph/wasm-runtime.js.map +1 -0
- package/dist/graph/workspace-cli.d.ts +56 -0
- package/dist/graph/workspace-cli.d.ts.map +1 -0
- package/dist/graph/workspace-cli.js +111 -0
- package/dist/graph/workspace-cli.js.map +1 -0
- package/dist/graph/workspace.d.ts +172 -0
- package/dist/graph/workspace.d.ts.map +1 -0
- package/dist/graph/workspace.js +714 -0
- package/dist/graph/workspace.js.map +1 -0
- package/dist/graph/write.d.ts +13 -0
- package/dist/graph/write.d.ts.map +1 -0
- package/dist/graph/write.js +86 -0
- package/dist/graph/write.js.map +1 -0
- package/dist/hosts/antigravity.d.ts +14 -0
- package/dist/hosts/antigravity.d.ts.map +1 -0
- package/dist/hosts/antigravity.js +59 -0
- package/dist/hosts/antigravity.js.map +1 -0
- package/dist/hosts/auto.d.ts +37 -0
- package/dist/hosts/auto.d.ts.map +1 -0
- package/dist/hosts/auto.js +141 -0
- package/dist/hosts/auto.js.map +1 -0
- package/dist/hosts/claude-global.d.ts +72 -0
- package/dist/hosts/claude-global.d.ts.map +1 -0
- package/dist/hosts/claude-global.js +230 -0
- package/dist/hosts/claude-global.js.map +1 -0
- package/dist/hosts/config-write.d.ts +36 -0
- package/dist/hosts/config-write.d.ts.map +1 -0
- package/dist/hosts/config-write.js +64 -0
- package/dist/hosts/config-write.js.map +1 -0
- package/dist/hosts/init.d.ts +28 -0
- package/dist/hosts/init.d.ts.map +1 -0
- package/dist/hosts/init.js +89 -0
- package/dist/hosts/init.js.map +1 -0
- package/dist/hosts/instructions.d.ts +14 -0
- package/dist/hosts/instructions.d.ts.map +1 -0
- package/dist/hosts/instructions.js +95 -0
- package/dist/hosts/instructions.js.map +1 -0
- package/dist/hosts/mcp-config.d.ts +78 -0
- package/dist/hosts/mcp-config.d.ts.map +1 -0
- package/dist/hosts/mcp-config.js +251 -0
- package/dist/hosts/mcp-config.js.map +1 -0
- package/dist/hosts/plan.d.ts +32 -0
- package/dist/hosts/plan.d.ts.map +1 -0
- package/dist/hosts/plan.js +73 -0
- package/dist/hosts/plan.js.map +1 -0
- package/dist/hosts/registry.d.ts +41 -0
- package/dist/hosts/registry.d.ts.map +1 -0
- package/dist/hosts/registry.js +164 -0
- package/dist/hosts/registry.js.map +1 -0
- package/dist/hosts/retract.d.ts +47 -0
- package/dist/hosts/retract.d.ts.map +1 -0
- package/dist/hosts/retract.js +520 -0
- package/dist/hosts/retract.js.map +1 -0
- package/dist/hosts/sections.d.ts +47 -0
- package/dist/hosts/sections.d.ts.map +1 -0
- package/dist/hosts/sections.js +127 -0
- package/dist/hosts/sections.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest/fs.d.ts +79 -0
- package/dist/ingest/fs.d.ts.map +1 -0
- package/dist/ingest/fs.js +306 -0
- package/dist/ingest/fs.js.map +1 -0
- package/dist/init-guard.d.ts +16 -0
- package/dist/init-guard.d.ts.map +1 -0
- package/dist/init-guard.js +27 -0
- package/dist/init-guard.js.map +1 -0
- package/dist/mcp/instructions.d.ts +5 -0
- package/dist/mcp/instructions.d.ts.map +1 -0
- package/dist/mcp/instructions.js +64 -0
- package/dist/mcp/instructions.js.map +1 -0
- package/dist/mcp/kept-listing.d.ts +27 -0
- package/dist/mcp/kept-listing.d.ts.map +1 -0
- package/dist/mcp/kept-listing.js +63 -0
- package/dist/mcp/kept-listing.js.map +1 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +147 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tool-names.d.ts +27 -0
- package/dist/mcp/tool-names.d.ts.map +1 -0
- package/dist/mcp/tool-names.js +47 -0
- package/dist/mcp/tool-names.js.map +1 -0
- package/dist/mcp/tools.d.ts +22 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +440 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/node-version.d.ts +15 -0
- package/dist/node-version.d.ts.map +1 -0
- package/dist/node-version.js +23 -0
- package/dist/node-version.js.map +1 -0
- package/dist/search/grep-cli.d.ts +35 -0
- package/dist/search/grep-cli.d.ts.map +1 -0
- package/dist/search/grep-cli.js +115 -0
- package/dist/search/grep-cli.js.map +1 -0
- package/dist/search/grep.d.ts +60 -0
- package/dist/search/grep.d.ts.map +1 -0
- package/dist/search/grep.js +143 -0
- package/dist/search/grep.js.map +1 -0
- package/dist/search/ignored-code.d.ts +9 -0
- package/dist/search/ignored-code.d.ts.map +1 -0
- package/dist/search/ignored-code.js +73 -0
- package/dist/search/ignored-code.js.map +1 -0
- package/dist/search/user-regexp.d.ts +26 -0
- package/dist/search/user-regexp.d.ts.map +1 -0
- package/dist/search/user-regexp.js +150 -0
- package/dist/search/user-regexp.js.map +1 -0
- package/dist/telemetry/contract.d.ts +117 -0
- package/dist/telemetry/contract.d.ts.map +1 -0
- package/dist/telemetry/contract.js +341 -0
- package/dist/telemetry/contract.js.map +1 -0
- package/dist/telemetry/flush.d.ts +21 -0
- package/dist/telemetry/flush.d.ts.map +1 -0
- package/dist/telemetry/flush.js +85 -0
- package/dist/telemetry/flush.js.map +1 -0
- package/dist/telemetry/gate.d.ts +30 -0
- package/dist/telemetry/gate.d.ts.map +1 -0
- package/dist/telemetry/gate.js +81 -0
- package/dist/telemetry/gate.js.map +1 -0
- package/dist/telemetry/identity.d.ts +40 -0
- package/dist/telemetry/identity.d.ts.map +1 -0
- package/dist/telemetry/identity.js +80 -0
- package/dist/telemetry/identity.js.map +1 -0
- package/dist/telemetry/index.d.ts +18 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +16 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/key.d.ts +21 -0
- package/dist/telemetry/key.d.ts.map +1 -0
- package/dist/telemetry/key.js +49 -0
- package/dist/telemetry/key.js.map +1 -0
- package/dist/telemetry/notice.d.ts +19 -0
- package/dist/telemetry/notice.d.ts.map +1 -0
- package/dist/telemetry/notice.js +93 -0
- package/dist/telemetry/notice.js.map +1 -0
- package/dist/telemetry/queue.d.ts +35 -0
- package/dist/telemetry/queue.d.ts.map +1 -0
- package/dist/telemetry/queue.js +162 -0
- package/dist/telemetry/queue.js.map +1 -0
- package/dist/telemetry/send.d.ts +19 -0
- package/dist/telemetry/send.d.ts.map +1 -0
- package/dist/telemetry/send.js +84 -0
- package/dist/telemetry/send.js.map +1 -0
- package/dist/telemetry/sessions.d.ts +25 -0
- package/dist/telemetry/sessions.d.ts.map +1 -0
- package/dist/telemetry/sessions.js +104 -0
- package/dist/telemetry/sessions.js.map +1 -0
- package/dist/telemetry/track.d.ts +62 -0
- package/dist/telemetry/track.d.ts.map +1 -0
- package/dist/telemetry/track.js +143 -0
- package/dist/telemetry/track.js.map +1 -0
- package/dist/upkeep-run.d.ts +22 -0
- package/dist/upkeep-run.d.ts.map +1 -0
- package/dist/upkeep-run.js +85 -0
- package/dist/upkeep-run.js.map +1 -0
- package/dist/upkeep.d.ts +127 -0
- package/dist/upkeep.d.ts.map +1 -0
- package/dist/upkeep.js +252 -0
- package/dist/upkeep.js.map +1 -0
- package/dist/util/actions-folder.d.ts +2 -0
- package/dist/util/actions-folder.d.ts.map +1 -0
- package/dist/util/actions-folder.js +9 -0
- package/dist/util/actions-folder.js.map +1 -0
- package/dist/util/browser.d.ts +3 -0
- package/dist/util/browser.d.ts.map +1 -0
- package/dist/util/browser.js +14 -0
- package/dist/util/browser.js.map +1 -0
- package/dist/util/child-process.d.ts +15 -0
- package/dist/util/child-process.d.ts.map +1 -0
- package/dist/util/child-process.js +15 -0
- package/dist/util/child-process.js.map +1 -0
- package/dist/util/front-matter.d.ts +46 -0
- package/dist/util/front-matter.d.ts.map +1 -0
- package/dist/util/front-matter.js +113 -0
- package/dist/util/front-matter.js.map +1 -0
- package/dist/util/id.d.ts +7 -0
- package/dist/util/id.d.ts.map +1 -0
- package/dist/util/id.js +14 -0
- package/dist/util/id.js.map +1 -0
- package/dist/util/paths.d.ts +29 -0
- package/dist/util/paths.d.ts.map +1 -0
- package/dist/util/paths.js +71 -0
- package/dist/util/paths.js.map +1 -0
- package/dist/util/private-file.d.ts +14 -0
- package/dist/util/private-file.d.ts.map +1 -0
- package/dist/util/private-file.js +82 -0
- package/dist/util/private-file.js.map +1 -0
- package/dist/util/source.d.ts +4 -0
- package/dist/util/source.d.ts.map +1 -0
- package/dist/util/source.js +12 -0
- package/dist/util/source.js.map +1 -0
- package/dist/util/spinner.d.ts +15 -0
- package/dist/util/spinner.d.ts.map +1 -0
- package/dist/util/spinner.js +52 -0
- package/dist/util/spinner.js.map +1 -0
- package/dist/util/state.d.ts +120 -0
- package/dist/util/state.d.ts.map +1 -0
- package/dist/util/state.js +264 -0
- package/dist/util/state.js.map +1 -0
- package/dist/vendor/grammars/tree-sitter-go.LICENSE +21 -0
- package/dist/vendor/grammars/tree-sitter-go.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-java.LICENSE +21 -0
- package/dist/vendor/grammars/tree-sitter-java.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-kotlin.LICENSE +9 -0
- package/dist/vendor/grammars/tree-sitter-kotlin.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-php.LICENSE +22 -0
- package/dist/vendor/grammars/tree-sitter-php.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-python.LICENSE +21 -0
- package/dist/vendor/grammars/tree-sitter-python.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-r.LICENSE +9 -0
- package/dist/vendor/grammars/tree-sitter-r.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-swift.LICENSE +21 -0
- package/dist/vendor/grammars/tree-sitter-swift.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-tsx.wasm +0 -0
- package/dist/vendor/grammars/tree-sitter-typescript.LICENSE +21 -0
- package/dist/vendor/grammars/tree-sitter-typescript.wasm +0 -0
- package/dist/viewer/app.js +2 -0
- package/dist/viewer/index.html +49 -0
- package/dist/viewer/style.css +154 -0
- package/dist/viz/assemble.d.ts +83 -0
- package/dist/viz/assemble.d.ts.map +1 -0
- package/dist/viz/assemble.js +101 -0
- package/dist/viz/assemble.js.map +1 -0
- package/dist/viz/export.d.ts +39 -0
- package/dist/viz/export.d.ts.map +1 -0
- package/dist/viz/export.js +98 -0
- package/dist/viz/export.js.map +1 -0
- package/dist/viz/serve.d.ts +13 -0
- package/dist/viz/serve.d.ts.map +1 -0
- package/dist/viz/serve.js +130 -0
- package/dist/viz/serve.js.map +1 -0
- package/package.json +115 -4
- package/scripts/build-grammar-wasm.mjs +112 -0
- package/scripts/build-viewer.mjs +44 -0
- package/scripts/graph-quality.mjs +117 -0
- package/scripts/pack-trail.mjs +53 -0
- package/scripts/postinstall.mjs +65 -0
- package/scripts/run-tests.mjs +72 -0
- package/scripts/stamp-telemetry-key.mjs +56 -0
- package/scripts/tally-audit.mjs +140 -0
- package/scripts/vendor-grammars.mjs +53 -0
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retraction: undo every edit graft has ever made to a repo.
|
|
3
|
+
*
|
|
4
|
+
* `init` is additive — it writes the files the *currently selected* hosts need
|
|
5
|
+
* and never looks at the rest. So a repo wired by an older version (or by the
|
|
6
|
+
* same version with different `--agents`) keeps the files that run produced,
|
|
7
|
+
* and the two sets accumulate. Retraction is the missing half: it walks every
|
|
8
|
+
* target graft could ever have written and removes graft's contribution, so
|
|
9
|
+
* `retract` + `init` converges the repo on exactly this version's intent.
|
|
10
|
+
*
|
|
11
|
+
* The target list is derived from the same registries `init` writes through
|
|
12
|
+
* (`HOSTS`, `mcpTargets`, `hookTargets`, `claudeTargets`), so a host added
|
|
13
|
+
* later is retractable for free — there is no second list to keep in sync.
|
|
14
|
+
* Only {@link LEGACY_TARGETS} is hand-maintained, and only for paths that have
|
|
15
|
+
* been *removed* from those registries: once a host is gone, nothing else
|
|
16
|
+
* remembers the file it used to write.
|
|
17
|
+
*
|
|
18
|
+
* Two invariants, both load-bearing:
|
|
19
|
+
* 1. Never delete what graft did not write. Inside a file the user owns, only
|
|
20
|
+
* the marker-fenced region and graft-named keys are touched; foreign MCP
|
|
21
|
+
* servers, hooks, and settings are preserved byte for byte.
|
|
22
|
+
* 2. Never leave an empty shell. A file that held nothing but graft's
|
|
23
|
+
* contribution is deleted, not truncated to `{}` or a blank document —
|
|
24
|
+
* an orphan file is the very residue this exists to remove.
|
|
25
|
+
*/
|
|
26
|
+
import { readFileSync, writeFileSync, existsSync, rmSync, rmdirSync, statSync, readdirSync } from 'node:fs';
|
|
27
|
+
import { join, dirname } from 'node:path';
|
|
28
|
+
import { homedir } from 'node:os';
|
|
29
|
+
import { HOSTS, hostRelPath } from './registry.js';
|
|
30
|
+
import { ALL_MARKERS } from './sections.js';
|
|
31
|
+
import { mcpTargets, stripTomlSection } from './mcp-config.js';
|
|
32
|
+
import { claudeGlobalTargets } from './claude-global.js';
|
|
33
|
+
import { antigravitySkillTargets } from './antigravity.js';
|
|
34
|
+
import { claudeTargetsFor, legacyClaudeTargets, TRAIL_HOOK, TRAIL_STATUSLINE, trailSkillPath } from '../claude/init.js';
|
|
35
|
+
import { isGraftAllowEntry, isGraftFooterRegex } from '../claude/settings-merge.js';
|
|
36
|
+
/** Both names a file can go by: graft's, and trail's in a repo that uses trail. */
|
|
37
|
+
const NAMES = ['graft', 'trail'];
|
|
38
|
+
/**
|
|
39
|
+
* Paths that older versions wrote and the live registries no longer mention.
|
|
40
|
+
* Empty today — every host in `HOSTS` since the multi-host layer landed is
|
|
41
|
+
* still there, and the marker string and the `graft` name have never changed,
|
|
42
|
+
* so the derived list covers every version to date.
|
|
43
|
+
*
|
|
44
|
+
* This is where a *removed* host's file goes. Deleting an entry from `HOSTS`
|
|
45
|
+
* without adding it here is what strands a file in every existing repo.
|
|
46
|
+
*/
|
|
47
|
+
const LEGACY_TARGETS = [];
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
// primitive operations
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
/** True when a file has no non-whitespace content left. */
|
|
52
|
+
function isBlank(text) {
|
|
53
|
+
return text.trim() === '';
|
|
54
|
+
}
|
|
55
|
+
function removeFile(path, apply) {
|
|
56
|
+
if (!existsSync(path))
|
|
57
|
+
return 'absent';
|
|
58
|
+
if (apply) {
|
|
59
|
+
rmSync(path, { force: true });
|
|
60
|
+
pruneEmptyDirs(dirname(path));
|
|
61
|
+
}
|
|
62
|
+
return 'deleted';
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Walk up from a just-emptied directory removing empty ancestors, so retracting
|
|
66
|
+
* `.claude/skills/graft/SKILL.md` doesn't leave a hollow `skills/graft/` behind.
|
|
67
|
+
* Stops at the first non-empty directory — never climbs out of the repo, because
|
|
68
|
+
* any ancestor that far up has other content in it.
|
|
69
|
+
*/
|
|
70
|
+
function pruneEmptyDirs(dir) {
|
|
71
|
+
for (let d = dir, i = 0; i < 6; i++) {
|
|
72
|
+
try {
|
|
73
|
+
if (readdirSync(d).length > 0)
|
|
74
|
+
return;
|
|
75
|
+
rmdirSync(d); // throws on a non-empty dir — exactly the guard we want
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return; // not a dir, not empty, or not ours to remove
|
|
79
|
+
}
|
|
80
|
+
const parent = dirname(d);
|
|
81
|
+
if (parent === d)
|
|
82
|
+
return;
|
|
83
|
+
d = parent;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Strip the marker-fenced graft block from a file the user owns.
|
|
88
|
+
*
|
|
89
|
+
* Paragraph spacing around the removed block is collapsed back to a single
|
|
90
|
+
* blank line, so a file that had prose either side of the block reads exactly
|
|
91
|
+
* as it did before graft appended to it.
|
|
92
|
+
*/
|
|
93
|
+
function stripSection(path, apply, markers = ALL_MARKERS) {
|
|
94
|
+
if (!existsSync(path))
|
|
95
|
+
return 'absent';
|
|
96
|
+
const text = readFileSync(path, 'utf8');
|
|
97
|
+
// Every region graft may own, not just the instruction block. A file can hold
|
|
98
|
+
// both the instructions and a brain's rules, and leaving one behind would
|
|
99
|
+
// strand rules in a repo the user has uninstalled graft from.
|
|
100
|
+
if (!markers.some((m) => text.includes(m.start)))
|
|
101
|
+
return 'absent';
|
|
102
|
+
const eol = text.includes('\r\n') ? '\r\n' : '\n';
|
|
103
|
+
const lines = text.split(/\r\n|\n/);
|
|
104
|
+
const out = [];
|
|
105
|
+
let closing = null;
|
|
106
|
+
let found = false;
|
|
107
|
+
for (const line of lines) {
|
|
108
|
+
const t = line.trim();
|
|
109
|
+
if (closing === null) {
|
|
110
|
+
const open = markers.find((m) => m.start === t);
|
|
111
|
+
if (open) {
|
|
112
|
+
closing = open.end;
|
|
113
|
+
found = true;
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
if (t === closing)
|
|
119
|
+
closing = null;
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
out.push(line);
|
|
123
|
+
}
|
|
124
|
+
if (!found)
|
|
125
|
+
return 'absent';
|
|
126
|
+
// Collapse the run of blank lines the block left behind, and trim the edges.
|
|
127
|
+
const collapsed = out
|
|
128
|
+
.join('\n')
|
|
129
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
130
|
+
.replace(/^\n+/, '')
|
|
131
|
+
.replace(/\n+$/, '\n');
|
|
132
|
+
if (!apply)
|
|
133
|
+
return isBlank(collapsed) ? 'deleted' : 'removed';
|
|
134
|
+
if (isBlank(collapsed))
|
|
135
|
+
return removeFile(path, true);
|
|
136
|
+
writeFileSync(path, eol === '\n' ? collapsed : collapsed.replace(/\n/g, '\r\n'));
|
|
137
|
+
return 'removed';
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Delete `<topKey>.graft` from a JSON config, preserving every other server.
|
|
141
|
+
* An unparseable file is reported and left alone — the user may have comments or
|
|
142
|
+
* a half-finished edit in there, and rewriting it would lose more than it fixes.
|
|
143
|
+
*/
|
|
144
|
+
function removeJsonKey(path, topKey, apply) {
|
|
145
|
+
if (!existsSync(path))
|
|
146
|
+
return 'absent';
|
|
147
|
+
let root;
|
|
148
|
+
try {
|
|
149
|
+
root = JSON.parse(readFileSync(path, 'utf8'));
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return 'skipped-unparseable';
|
|
153
|
+
}
|
|
154
|
+
if (typeof root !== 'object' || root === null || Array.isArray(root))
|
|
155
|
+
return 'skipped-unparseable';
|
|
156
|
+
const bucket = root[topKey];
|
|
157
|
+
if (typeof bucket !== 'object' || bucket === null || Array.isArray(bucket))
|
|
158
|
+
return 'absent';
|
|
159
|
+
const map = bucket;
|
|
160
|
+
// Either name: a repo that uses trail registers the server as `trail`.
|
|
161
|
+
const ours = ['graft', 'trail'].filter((k) => k in map);
|
|
162
|
+
if (ours.length === 0)
|
|
163
|
+
return 'absent';
|
|
164
|
+
if (!apply) {
|
|
165
|
+
return Object.keys(map).length === ours.length && Object.keys(root).length === 1 ? 'deleted' : 'removed';
|
|
166
|
+
}
|
|
167
|
+
for (const k of ours)
|
|
168
|
+
delete map[k];
|
|
169
|
+
if (Object.keys(map).length === 0)
|
|
170
|
+
delete root[topKey];
|
|
171
|
+
if (Object.keys(root).length === 0)
|
|
172
|
+
return removeFile(path, true);
|
|
173
|
+
writeFileSync(path, `${JSON.stringify(root, null, 2)}\n`);
|
|
174
|
+
return 'removed';
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Delete the `[mcp_servers.graft]` and `[mcp_servers.trail]` tables from a TOML config.
|
|
178
|
+
*
|
|
179
|
+
* Line-based on purpose: a real TOML parse-and-reserialize would reformat the
|
|
180
|
+
* user's whole file. The table runs from its header to the next `[`-header or
|
|
181
|
+
* EOF, which is exactly what `upsertCodexToml` appends.
|
|
182
|
+
*/
|
|
183
|
+
function removeTomlSection(path, apply) {
|
|
184
|
+
if (!existsSync(path))
|
|
185
|
+
return 'absent';
|
|
186
|
+
const graft = stripTomlSection(readFileSync(path, 'utf8'), 'graft');
|
|
187
|
+
const trail = stripTomlSection(graft.rest, 'trail');
|
|
188
|
+
const kept = trail.rest;
|
|
189
|
+
if (!graft.found && !trail.found)
|
|
190
|
+
return 'absent';
|
|
191
|
+
if (!apply)
|
|
192
|
+
return isBlank(kept) ? 'deleted' : 'removed';
|
|
193
|
+
if (isBlank(kept))
|
|
194
|
+
return removeFile(path, true);
|
|
195
|
+
writeFileSync(path, kept.endsWith('\n') ? kept : `${kept}\n`);
|
|
196
|
+
return 'removed';
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Remove graft's fragments from `.claude/settings.json`, keeping the user's.
|
|
200
|
+
*
|
|
201
|
+
* The statusline check is by *shim path*, not exact string equality: an older
|
|
202
|
+
* version's command differed in shape, and `mergeGraftSettings` would read that
|
|
203
|
+
* as a hand-written statusline and refuse to touch it forever. Matching the
|
|
204
|
+
* helper path recognizes graft's own output across every version that wrote it.
|
|
205
|
+
*/
|
|
206
|
+
function stripClaudeSettings(path, apply) {
|
|
207
|
+
if (!existsSync(path))
|
|
208
|
+
return 'absent';
|
|
209
|
+
let root;
|
|
210
|
+
try {
|
|
211
|
+
root = JSON.parse(readFileSync(path, 'utf8'));
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
return 'skipped-unparseable';
|
|
215
|
+
}
|
|
216
|
+
if (typeof root !== 'object' || root === null || Array.isArray(root))
|
|
217
|
+
return 'skipped-unparseable';
|
|
218
|
+
const before = JSON.stringify(root);
|
|
219
|
+
const isGraftCmd = (v) => /(graft|trail)-statusline\.cjs|\.trail\/statusline\.cjs/.test(JSON.stringify(v ?? ''));
|
|
220
|
+
for (const key of ['statusLine', 'subagentStatusLine']) {
|
|
221
|
+
if (root[key] !== undefined && isGraftCmd(root[key]))
|
|
222
|
+
delete root[key];
|
|
223
|
+
}
|
|
224
|
+
if (root.hooks && typeof root.hooks === 'object' && !Array.isArray(root.hooks)) {
|
|
225
|
+
for (const event of Object.keys(root.hooks)) {
|
|
226
|
+
const prior = root.hooks[event];
|
|
227
|
+
if (!Array.isArray(prior))
|
|
228
|
+
continue;
|
|
229
|
+
const kept = prior.filter((e) => !/(graft|trail)-hooks\.cjs|\/\.trail\/hook\.cjs/.test(JSON.stringify(e ?? '')));
|
|
230
|
+
if (kept.length === 0)
|
|
231
|
+
delete root.hooks[event];
|
|
232
|
+
else
|
|
233
|
+
root.hooks[event] = kept;
|
|
234
|
+
}
|
|
235
|
+
if (Object.keys(root.hooks).length === 0)
|
|
236
|
+
delete root.hooks;
|
|
237
|
+
}
|
|
238
|
+
if (Array.isArray(root.footerLinksRegexes)) {
|
|
239
|
+
const kept = root.footerLinksRegexes.filter((r) => !isGraftFooterRegex(r));
|
|
240
|
+
if (kept.length === 0)
|
|
241
|
+
delete root.footerLinksRegexes;
|
|
242
|
+
else
|
|
243
|
+
root.footerLinksRegexes = kept;
|
|
244
|
+
}
|
|
245
|
+
if (root.permissions && Array.isArray(root.permissions.allow)) {
|
|
246
|
+
const kept = root.permissions.allow.filter((a) => !isGraftAllowEntry(a));
|
|
247
|
+
if (kept.length === 0)
|
|
248
|
+
delete root.permissions.allow;
|
|
249
|
+
else
|
|
250
|
+
root.permissions.allow = kept;
|
|
251
|
+
if (Object.keys(root.permissions).length === 0)
|
|
252
|
+
delete root.permissions;
|
|
253
|
+
}
|
|
254
|
+
const after = JSON.stringify(root);
|
|
255
|
+
if (after === before)
|
|
256
|
+
return 'absent';
|
|
257
|
+
if (!apply)
|
|
258
|
+
return Object.keys(root).length === 0 ? 'deleted' : 'removed';
|
|
259
|
+
if (Object.keys(root).length === 0)
|
|
260
|
+
return removeFile(path, true);
|
|
261
|
+
writeFileSync(path, `${JSON.stringify(root, null, 2)}\n`);
|
|
262
|
+
return 'removed';
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Remove graft's hook entries from a hooks config: Codex's `~/.codex/hooks.json`
|
|
266
|
+
* (PostToolUse/SessionStart/etc.), or Cursor's `.cursor/hooks.json`, whose
|
|
267
|
+
* schema `version` is graft's too, so a file holding nothing else goes.
|
|
268
|
+
*/
|
|
269
|
+
function stripHookEntries(path, apply, ours = []) {
|
|
270
|
+
if (!existsSync(path))
|
|
271
|
+
return 'absent';
|
|
272
|
+
let root;
|
|
273
|
+
try {
|
|
274
|
+
root = JSON.parse(readFileSync(path, 'utf8'));
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
return 'skipped-unparseable';
|
|
278
|
+
}
|
|
279
|
+
if (typeof root !== 'object' || root === null || Array.isArray(root))
|
|
280
|
+
return 'skipped-unparseable';
|
|
281
|
+
if (!root.hooks || typeof root.hooks !== 'object' || Array.isArray(root.hooks))
|
|
282
|
+
return 'absent';
|
|
283
|
+
const before = JSON.stringify(root);
|
|
284
|
+
for (const event of Object.keys(root.hooks)) {
|
|
285
|
+
const prior = root.hooks[event];
|
|
286
|
+
if (!Array.isArray(prior))
|
|
287
|
+
continue;
|
|
288
|
+
const kept = prior.filter((e) => !/(graft|trail)-hooks\.cjs/.test(JSON.stringify(e ?? '')));
|
|
289
|
+
if (kept.length === 0)
|
|
290
|
+
delete root.hooks[event];
|
|
291
|
+
else
|
|
292
|
+
root.hooks[event] = kept;
|
|
293
|
+
}
|
|
294
|
+
if (Object.keys(root.hooks).length === 0)
|
|
295
|
+
delete root.hooks;
|
|
296
|
+
if (JSON.stringify(root) === before)
|
|
297
|
+
return 'absent';
|
|
298
|
+
const empty = Object.keys(root).every((k) => ours.includes(k));
|
|
299
|
+
if (!apply)
|
|
300
|
+
return empty ? 'deleted' : 'removed';
|
|
301
|
+
if (empty)
|
|
302
|
+
return removeFile(path, true);
|
|
303
|
+
writeFileSync(path, `${JSON.stringify(root, null, 2)}\n`);
|
|
304
|
+
return 'removed';
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Drop graft's block from `.gitignore` / `.ignore`.
|
|
308
|
+
*
|
|
309
|
+
* Both are written as a comment line plus entries; the comment is graft's own
|
|
310
|
+
* wording, so it identifies the block. Entries are matched individually too, so
|
|
311
|
+
* a hand-tidied file (comment deleted, entry kept) still retracts cleanly.
|
|
312
|
+
*/
|
|
313
|
+
function stripIgnoreEntries(path, entries, apply) {
|
|
314
|
+
if (!existsSync(path))
|
|
315
|
+
return 'absent';
|
|
316
|
+
const text = readFileSync(path, 'utf8');
|
|
317
|
+
const kept = text
|
|
318
|
+
.split('\n')
|
|
319
|
+
.filter((l) => {
|
|
320
|
+
const t = l.trim();
|
|
321
|
+
if (t.startsWith('#') && t.includes('graft'))
|
|
322
|
+
return false;
|
|
323
|
+
return !entries.some((re) => re.test(t));
|
|
324
|
+
})
|
|
325
|
+
.join('\n')
|
|
326
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
327
|
+
.replace(/^\n+/, '')
|
|
328
|
+
.replace(/\n+$/, '\n');
|
|
329
|
+
if (kept === text)
|
|
330
|
+
return 'absent';
|
|
331
|
+
if (!apply)
|
|
332
|
+
return isBlank(kept) ? 'deleted' : 'removed';
|
|
333
|
+
if (isBlank(kept))
|
|
334
|
+
return removeFile(path, true);
|
|
335
|
+
writeFileSync(path, kept.endsWith('\n') ? kept : `${kept}\n`);
|
|
336
|
+
return 'removed';
|
|
337
|
+
}
|
|
338
|
+
function removeDir(path, apply) {
|
|
339
|
+
try {
|
|
340
|
+
if (!statSync(path).isDirectory())
|
|
341
|
+
return 'absent';
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
return 'absent';
|
|
345
|
+
}
|
|
346
|
+
if (apply) {
|
|
347
|
+
rmSync(path, { recursive: true, force: true });
|
|
348
|
+
pruneEmptyDirs(dirname(path));
|
|
349
|
+
}
|
|
350
|
+
return 'deleted';
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Every target graft could have written, in removal order.
|
|
354
|
+
*
|
|
355
|
+
* Derived from the live registries, NOT hand-listed: `HOSTS` gives the
|
|
356
|
+
* instruction files, `mcpTargets` over *all* host ids gives the MCP configs
|
|
357
|
+
* (with the format and top-level key each one needs), and `claudeTargets`
|
|
358
|
+
* gives the Claude Code layer. That's what keeps this complete as hosts are
|
|
359
|
+
* added — see the module note.
|
|
360
|
+
*/
|
|
361
|
+
function targets(repo, opts) {
|
|
362
|
+
const home = opts.home ?? homedir();
|
|
363
|
+
const exclude = new Set(opts.exclude ?? []);
|
|
364
|
+
const out = [];
|
|
365
|
+
/**
|
|
366
|
+
* Paths a *kept* host also writes, which must survive even though some other,
|
|
367
|
+
* unselected host names them too.
|
|
368
|
+
*
|
|
369
|
+
* Three hosts share `AGENTS.md` (agents, hermes, antigravity). Excluding by host
|
|
370
|
+
* id alone would strip that shared block on behalf of a host nobody selected,
|
|
371
|
+
* and the only reason the end state came out right was that `init` happened to
|
|
372
|
+
* rewrite it immediately afterwards. Exclude by path as well, so retraction
|
|
373
|
+
* never depends on what runs next.
|
|
374
|
+
*/
|
|
375
|
+
// Under both names: init rewrites a kept host under the repo's name and
|
|
376
|
+
// clears the other name's copy itself.
|
|
377
|
+
const keptPaths = new Set();
|
|
378
|
+
for (const host of HOSTS) {
|
|
379
|
+
if (exclude.has(host.id))
|
|
380
|
+
for (const n of NAMES)
|
|
381
|
+
keptPaths.add(join(repo, hostRelPath(host, n)));
|
|
382
|
+
}
|
|
383
|
+
for (const t of mcpTargets(repo, [...exclude], { home }))
|
|
384
|
+
keptPaths.add(t.path);
|
|
385
|
+
if (exclude.has('claude')) {
|
|
386
|
+
for (const n of NAMES)
|
|
387
|
+
for (const t of [...claudeTargetsFor(repo, n, home), ...legacyClaudeTargets(repo, n)])
|
|
388
|
+
keptPaths.add(t.path);
|
|
389
|
+
for (const t of claudeGlobalTargets(home))
|
|
390
|
+
keptPaths.add(t.path);
|
|
391
|
+
}
|
|
392
|
+
if (exclude.has('agents')) { /* hookTargets removed in trail-solo-grafo */ }
|
|
393
|
+
if (exclude.has('cursor')) { /* cursorHookTargets removed in trail-solo-grafo */ }
|
|
394
|
+
if (exclude.has('antigravity'))
|
|
395
|
+
for (const n of NAMES)
|
|
396
|
+
for (const t of antigravitySkillTargets(home, n))
|
|
397
|
+
keptPaths.add(t.path);
|
|
398
|
+
/** Queue a target unless a kept host owns that path, or it's already queued. */
|
|
399
|
+
const seen = new Set();
|
|
400
|
+
const add = (t) => {
|
|
401
|
+
if (keptPaths.has(t.path) || seen.has(t.path))
|
|
402
|
+
return;
|
|
403
|
+
seen.add(t.path);
|
|
404
|
+
out.push(t);
|
|
405
|
+
};
|
|
406
|
+
// 1. Instruction files, one per host and name. Owned files go wholesale;
|
|
407
|
+
// shared files lose only their fenced block (either name's).
|
|
408
|
+
for (const host of HOSTS) {
|
|
409
|
+
if (exclude.has(host.id))
|
|
410
|
+
continue;
|
|
411
|
+
for (const n of NAMES) {
|
|
412
|
+
const path = join(repo, hostRelPath(host, n));
|
|
413
|
+
add(host.kind === 'owned'
|
|
414
|
+
? { hostId: host.id, path, what: `${n}-owned instruction file`, scope: 'repo', run: (a) => removeFile(path, a) }
|
|
415
|
+
: { hostId: host.id, path, what: 'fenced graft section', scope: 'repo', run: (a) => stripSection(path, a) });
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
// 1b. Instruction files from hosts that no longer exist in the registry.
|
|
419
|
+
for (const legacy of LEGACY_TARGETS) {
|
|
420
|
+
const path = join(repo, legacy.relPath);
|
|
421
|
+
add({
|
|
422
|
+
hostId: 'legacy', path, what: legacy.what, scope: 'repo',
|
|
423
|
+
run: (a) => (legacy.kind === 'owned' ? removeFile(path, a) : stripSection(path, a)),
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
// 2. MCP registrations. Asking for every host id at once yields the union of
|
|
427
|
+
// config files, each already carrying its format and top-level key.
|
|
428
|
+
const allIds = HOSTS.map((h) => h.id).filter((id) => !exclude.has(id));
|
|
429
|
+
for (const t of mcpTargets(repo, allIds, { home })) {
|
|
430
|
+
if (opts.global === false && t.scope === 'global')
|
|
431
|
+
continue;
|
|
432
|
+
add({
|
|
433
|
+
hostId: t.hostId, path: t.path, what: t.what, scope: t.scope,
|
|
434
|
+
run: (a) => (t.format === 'toml' ? removeTomlSection(t.path, a) : removeJsonKey(t.path, t.topKey, a)),
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
// 3. Claude Code: settings fragments, both shims, the skill, and the .mcp.json key.
|
|
438
|
+
if (!exclude.has('claude')) {
|
|
439
|
+
const [settings, , , , mcp] = legacyClaudeTargets(repo, 'graft').map((t) => t.path);
|
|
440
|
+
const local = join(repo, '.claude', 'settings.local.json');
|
|
441
|
+
const trailHook = join(repo, TRAIL_HOOK);
|
|
442
|
+
const trailSl = join(repo, TRAIL_STATUSLINE);
|
|
443
|
+
// The shims and skill under both names: a repo that moved to trail's names
|
|
444
|
+
// still comes out clean, and so does one a teammate on graft re-wired.
|
|
445
|
+
const named = ['graft', 'trail'].flatMap((n) => {
|
|
446
|
+
const [, statusline, hooks, skill] = legacyClaudeTargets(repo, n).map((t) => t.path);
|
|
447
|
+
return [
|
|
448
|
+
{ hostId: 'claude', path: statusline, what: 'statusline shim', scope: 'repo', run: (a) => removeFile(statusline, a) },
|
|
449
|
+
{ hostId: 'claude', path: hooks, what: 'hooks shim', scope: 'repo', run: (a) => removeFile(hooks, a) },
|
|
450
|
+
{ hostId: 'claude', path: skill, what: `${n} skill`, scope: 'repo', run: (a) => removeFile(skill, a) },
|
|
451
|
+
];
|
|
452
|
+
});
|
|
453
|
+
for (const t of [
|
|
454
|
+
{ hostId: 'claude', path: settings, what: 'statusline + hooks + allowlist + footer regex', scope: 'repo', run: (a) => stripClaudeSettings(settings, a) },
|
|
455
|
+
{ hostId: 'claude', path: local, what: 'trail statusline + allowlist', scope: 'repo', run: (a) => stripClaudeSettings(local, a) },
|
|
456
|
+
{ hostId: 'claude', path: trailHook, what: 'hooks shim', scope: 'repo', run: (a) => removeFile(trailHook, a) },
|
|
457
|
+
{ hostId: 'claude', path: trailSl, what: 'statusline shim', scope: 'repo', run: (a) => removeFile(trailSl, a) },
|
|
458
|
+
...named,
|
|
459
|
+
{ hostId: 'claude', path: mcp, what: 'mcpServers entry', scope: 'repo', run: (a) => removeJsonKey(mcp, 'mcpServers', a) },
|
|
460
|
+
])
|
|
461
|
+
add(t);
|
|
462
|
+
}
|
|
463
|
+
// 3b. Cursor's repo-local hooks: removed in trail-solo-grafo
|
|
464
|
+
// 4. Global: Claude Code's user-level copy and Antigravity's shared skill.
|
|
465
|
+
if (opts.global !== false) {
|
|
466
|
+
if (!exclude.has('claude')) {
|
|
467
|
+
const [shim, settings, mcp] = claudeGlobalTargets(home);
|
|
468
|
+
for (const t of [
|
|
469
|
+
{ hostId: 'claude', path: shim.path, what: shim.what, scope: 'global', run: (a) => removeFile(shim.path, a) },
|
|
470
|
+
{ hostId: 'claude', path: settings.path, what: settings.what, scope: 'global', run: (a) => stripClaudeSettings(settings.path, a) },
|
|
471
|
+
{ hostId: 'claude', path: mcp.path, what: mcp.what, scope: 'global', run: (a) => removeJsonKey(mcp.path, 'mcpServers', a) },
|
|
472
|
+
{ hostId: 'claude', path: trailSkillPath(home), what: 'trail skill', scope: 'global', run: (a) => removeFile(trailSkillPath(home), a) },
|
|
473
|
+
])
|
|
474
|
+
add(t);
|
|
475
|
+
}
|
|
476
|
+
// agents (Codex) hook targets removed in trail-solo-grafo
|
|
477
|
+
if (!exclude.has('antigravity')) {
|
|
478
|
+
for (const t of NAMES.flatMap((n) => antigravitySkillTargets(home, n))) {
|
|
479
|
+
add({ hostId: t.hostId, path: t.path, what: t.what, scope: 'global', run: (a) => removeFile(t.path, a) });
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
// 5. The graph cache and the ignore entries that admit it. Last, so a failure
|
|
484
|
+
// here can't strand the wiring half-retracted.
|
|
485
|
+
if (opts.cache !== false) {
|
|
486
|
+
const cache = join(repo, 'graft');
|
|
487
|
+
const trailCache = join(repo, '.trail', 'cache');
|
|
488
|
+
const gitignore = join(repo, '.gitignore');
|
|
489
|
+
const ignore = join(repo, '.ignore');
|
|
490
|
+
for (const t of [
|
|
491
|
+
{ hostId: 'graph', path: cache, what: 'local graph cache', scope: 'repo', run: (a) => removeDir(cache, a) },
|
|
492
|
+
{ hostId: 'graph', path: trailCache, what: 'local graph cache', scope: 'repo', run: (a) => removeDir(trailCache, a) },
|
|
493
|
+
{ hostId: 'graph', path: gitignore, what: 'graft/ ignore entry', scope: 'repo', run: (a) => stripIgnoreEntries(gitignore, [/^\/?graft\/?$/], a) },
|
|
494
|
+
{ hostId: 'graph', path: ignore, what: 'graft/ search re-admit entries', scope: 'repo', run: (a) => stripIgnoreEntries(ignore, [/^!?graft\/?$/, /^graft\/\.(cache|graph)\/?$/], a) },
|
|
495
|
+
])
|
|
496
|
+
add(t);
|
|
497
|
+
}
|
|
498
|
+
return out;
|
|
499
|
+
}
|
|
500
|
+
// ---------------------------------------------------------------------------
|
|
501
|
+
// public API
|
|
502
|
+
// ---------------------------------------------------------------------------
|
|
503
|
+
/** What a retraction *would* remove. Pure — touches nothing. */
|
|
504
|
+
export function planRetract(repo, opts = {}) {
|
|
505
|
+
return targets(repo, { ...opts, apply: false }).map(({ run, ...t }) => ({ ...t, action: run(false) }));
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* Remove graft's contribution from every target. Reports every target it
|
|
509
|
+
* considered, including the ones that were already clean, so a caller can show
|
|
510
|
+
* either the full sweep or just what changed.
|
|
511
|
+
*/
|
|
512
|
+
export function runRetract(repo, opts = {}) {
|
|
513
|
+
const apply = opts.apply !== false;
|
|
514
|
+
return targets(repo, opts).map(({ run, ...t }) => ({ ...t, action: run(apply) }));
|
|
515
|
+
}
|
|
516
|
+
/** The subset worth showing a user: targets that had something to remove. */
|
|
517
|
+
export function changed(retractions) {
|
|
518
|
+
return retractions.filter((r) => r.action !== 'absent');
|
|
519
|
+
}
|
|
520
|
+
//# sourceMappingURL=retract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retract.js","sourceRoot":"","sources":["../../src/hosts/retract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { Brand } from '../brand.js';
|
|
2
|
+
export declare const START = "<!-- graft:start -->";
|
|
3
|
+
export declare const END = "<!-- graft:end -->";
|
|
4
|
+
/** The same block in a repo wired by trail. */
|
|
5
|
+
export declare const TRAIL_START = "<!-- trail:start -->";
|
|
6
|
+
export declare const TRAIL_END = "<!-- trail:end -->";
|
|
7
|
+
/**
|
|
8
|
+
* A brain's rules go in their OWN fenced block, not inside the instruction
|
|
9
|
+
* block above.
|
|
10
|
+
*
|
|
11
|
+
* They have to be separately addressable: the instruction body is static and
|
|
12
|
+
* rewritten by `init`, while rules change whenever the brain does and are
|
|
13
|
+
* refreshed on their own. One pair of markers for both would mean every rules
|
|
14
|
+
* refresh rewrites the instructions too, and `graft uninstall` could not remove
|
|
15
|
+
* one without the other.
|
|
16
|
+
*/
|
|
17
|
+
export declare const BRAIN_START = "<!-- graft:brain:start -->";
|
|
18
|
+
export declare const BRAIN_END = "<!-- graft:brain:end -->";
|
|
19
|
+
/** One addressable managed region in a file the user owns. */
|
|
20
|
+
export interface Markers {
|
|
21
|
+
start: string;
|
|
22
|
+
end: string;
|
|
23
|
+
}
|
|
24
|
+
export declare const GRAFT_MARKERS: Markers;
|
|
25
|
+
export declare const TRAIL_MARKERS: Markers;
|
|
26
|
+
export declare const BRAIN_MARKERS: Markers;
|
|
27
|
+
/** Every managed region graft may own in a user-owned file. */
|
|
28
|
+
export declare const ALL_MARKERS: Markers[];
|
|
29
|
+
/** The instruction block's markers under each name. */
|
|
30
|
+
export declare function markersFor(name: Brand): Markers;
|
|
31
|
+
export type UpsertAction = 'created' | 'appended' | 'replaced' | 'unchanged';
|
|
32
|
+
type LineEnding = '\n' | '\r\n';
|
|
33
|
+
export declare function fencedBlock(body: string, eol?: LineEnding, markers?: Markers): string;
|
|
34
|
+
/**
|
|
35
|
+
* Write `body` into the block fenced by `markers`, keeping the rest of the file.
|
|
36
|
+
*
|
|
37
|
+
* `replaces` names blocks this one supersedes: a repo moving from graft's
|
|
38
|
+
* names to trail's has a `graft:start` block where the `trail:start` one
|
|
39
|
+
* goes. The block takes the place of its own markers if they're there, or of
|
|
40
|
+
* the first superseded block, and any other superseded block goes, so the
|
|
41
|
+
* file never ends up with both.
|
|
42
|
+
*/
|
|
43
|
+
export declare function upsertSection(filePath: string, body: string, markers?: Markers, replaces?: Markers[]): {
|
|
44
|
+
action: UpsertAction;
|
|
45
|
+
};
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=sections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sections.d.ts","sourceRoot":"","sources":["../../src/hosts/sections.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,eAAO,MAAM,KAAK,yBAAyB,CAAC;AAC5C,eAAO,MAAM,GAAG,uBAAuB,CAAC;AAExC,+CAA+C;AAC/C,eAAO,MAAM,WAAW,yBAAyB,CAAC;AAClD,eAAO,MAAM,SAAS,uBAAuB,CAAC;AAE9C;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,+BAA+B,CAAC;AACxD,eAAO,MAAM,SAAS,6BAA6B,CAAC;AAEpD,8DAA8D;AAC9D,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,aAAa,EAAE,OAAoC,CAAC;AACjE,eAAO,MAAM,aAAa,EAAE,OAAgD,CAAC;AAC7E,eAAO,MAAM,aAAa,EAAE,OAAgD,CAAC;AAE7E,+DAA+D;AAC/D,eAAO,MAAM,WAAW,EAAE,OAAO,EAAkD,CAAC;AAEpF,uDAAuD;AACvD,wBAAgB,UAAU,CAAC,IAAI,EAAE,KAAK,GAAG,OAAO,CAE/C;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;AAE7E,KAAK,UAAU,GAAG,IAAI,GAAG,MAAM,CAAC;AAEhC,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,UAAiB,EAAE,OAAO,GAAE,OAAuB,GAAG,MAAM,CAM1G;AAuCD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,OAAuB,EAAE,QAAQ,GAAE,OAAO,EAAO,GAAG;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,CA6ClJ"}
|