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,396 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `init` — build the `.context/` graph from a code repository.
|
|
3
|
+
*
|
|
4
|
+
* Pipeline (no database, no embeddings):
|
|
5
|
+
* 1. Walk the repo for source files.
|
|
6
|
+
* 2. Summarize each file to prose (one LLM call per file, cached by content hash).
|
|
7
|
+
* 3. Synthesize a CURATED node set from the labeled summaries (the synthesizer
|
|
8
|
+
* decides granularity: subsystems, notable files, and concepts). This is
|
|
9
|
+
* one LLM call per batch of summaries; the batches are independent, so they
|
|
10
|
+
* run concurrently, and each is cached by content. Where the batches are cut,
|
|
11
|
+
* and why that decides what the next build costs, is `./batches.ts`.
|
|
12
|
+
* 4. Resolve node names → slugs and links → edges; attribute each node to its
|
|
13
|
+
* source files so staleness stays exact.
|
|
14
|
+
* 5. Write one markdown file per node (preserving human notes) + a manifest.
|
|
15
|
+
*/
|
|
16
|
+
import { readFileSync, writeFileSync, renameSync, mkdirSync, existsSync } from "node:fs";
|
|
17
|
+
import { join, resolve } from "node:path";
|
|
18
|
+
import { walkDir } from "../ingest/fs.js";
|
|
19
|
+
import { filterByOnlyDirs } from "../graph/source-files.js";
|
|
20
|
+
import { readFingerprint } from "../graph/fingerprint.js";
|
|
21
|
+
import { contentHash } from "../util/id.js";
|
|
22
|
+
import { relPosix } from "../util/paths.js";
|
|
23
|
+
import { readSourceFile } from "../util/source.js";
|
|
24
|
+
import { readFollowNestedRepos, readFollowSubmodules, readIncludeDirs } from "../util/state.js";
|
|
25
|
+
import { LlmFailureGate } from "../ai/failure.js";
|
|
26
|
+
import { planSynthesis } from "./batches.js";
|
|
27
|
+
import { CACHE_DIR, MANIFEST_VERSION, contextDirFor, deleteNode, digestSources, existingNodeSlugs, slugify, writeManifest, writeNode, } from "./node-file.js";
|
|
28
|
+
/** Extensions treated as source code. */
|
|
29
|
+
export const CODE_EXTENSIONS = [
|
|
30
|
+
".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
|
|
31
|
+
".py", ".go", ".rs", ".java", ".kt", ".scala",
|
|
32
|
+
".rb", ".php", ".c", ".h", ".cpp", ".hpp", ".cc",
|
|
33
|
+
".cs", ".swift", ".gleam", ".sql", ".sh", ".proto",
|
|
34
|
+
];
|
|
35
|
+
/**
|
|
36
|
+
* Synthesis calls in flight at once. Small on purpose, and separate from phase 1's
|
|
37
|
+
* `-j`: there each call is one small file summary, here each is a whole batch of
|
|
38
|
+
* summaries — a long, expensive request, of which a big repo has a handful rather
|
|
39
|
+
* than hundreds.
|
|
40
|
+
*/
|
|
41
|
+
const DEFAULT_SYNTH_CONCURRENCY = 4;
|
|
42
|
+
/** CLI/API `--only-dir` wins; otherwise the whitelist recorded in the graph
|
|
43
|
+
* fingerprint — the same source `checkGraph` / `probeDrift` use, so a later
|
|
44
|
+
* `--deep` without the flag still skips files the wiring pass excluded. */
|
|
45
|
+
function resolveOnlyDirs(outDir, explicit) {
|
|
46
|
+
const list = explicit && explicit.length > 0 ? explicit : (readFingerprint(outDir)?.onlyDirs ?? []);
|
|
47
|
+
return list.length > 0 ? new Set(list) : undefined;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Files the concept pass summarizes (and `checkContext` re-hashes): the same
|
|
51
|
+
* walk as before (`--include-dir` / submodule flags from state, minus the
|
|
52
|
+
* output dir), then {@link filterByOnlyDirs}. Shared so build and check cannot
|
|
53
|
+
* disagree about what "current" means under a whitelist.
|
|
54
|
+
*/
|
|
55
|
+
export function listContextFiles(root, outDir, exts, explicitOnlyDirs) {
|
|
56
|
+
const walked = walkDir(root, readIncludeDirs(root), {
|
|
57
|
+
followSubmodules: readFollowSubmodules(root),
|
|
58
|
+
followNestedRepos: readFollowNestedRepos(root),
|
|
59
|
+
})
|
|
60
|
+
.filter((f) => exts.some((e) => f.toLowerCase().endsWith(e)))
|
|
61
|
+
.filter((f) => !f.startsWith(outDir));
|
|
62
|
+
return filterByOnlyDirs(walked, root, resolveOnlyDirs(outDir, explicitOnlyDirs));
|
|
63
|
+
}
|
|
64
|
+
export async function buildContext(dir, opts) {
|
|
65
|
+
const root = resolve(dir);
|
|
66
|
+
const outDir = contextDirFor(root, opts.contextDir);
|
|
67
|
+
const exts = opts.extensions ?? CODE_EXTENSIONS;
|
|
68
|
+
// Read the same persisted walk choices as the Tier-1 wiring graph, so the
|
|
69
|
+
// Tier-2 concept pipeline sees exactly the same directories and submodules.
|
|
70
|
+
// `--only-dir` is applied with the same prefix match as wiring (CLI/API, else
|
|
71
|
+
// the fingerprint) so out-of-scope files are never summarized or synthesized.
|
|
72
|
+
const files = listContextFiles(root, outDir, exts, opts.onlyDirs);
|
|
73
|
+
const cache = loadCache(outDir);
|
|
74
|
+
// Flush the summary cache to disk during phase 1 so a build interrupted
|
|
75
|
+
// partway (session/rate limit, crash, Ctrl-C) resumes without re-summarizing
|
|
76
|
+
// the files it already did. Throttled to keep disk churn negligible; on the
|
|
77
|
+
// next run every already-summarized file is a content-hash cache hit ($0).
|
|
78
|
+
let lastFlush = Date.now();
|
|
79
|
+
const flushEveryMs = summaryCheckpointMs();
|
|
80
|
+
const maybeFlush = () => {
|
|
81
|
+
const now = Date.now();
|
|
82
|
+
if (now - lastFlush < flushEveryMs)
|
|
83
|
+
return;
|
|
84
|
+
lastFlush = now;
|
|
85
|
+
saveCache(outDir, cache);
|
|
86
|
+
};
|
|
87
|
+
const result = {
|
|
88
|
+
contextDir: outDir,
|
|
89
|
+
files: 0,
|
|
90
|
+
summarized: 0,
|
|
91
|
+
cached: 0,
|
|
92
|
+
batches: 0,
|
|
93
|
+
nodes: 0,
|
|
94
|
+
links: 0,
|
|
95
|
+
errors: [],
|
|
96
|
+
failedFiles: 0,
|
|
97
|
+
skippedFiles: 0,
|
|
98
|
+
};
|
|
99
|
+
// Phase 1: summarize each file, concurrent, content-hash cached.
|
|
100
|
+
//
|
|
101
|
+
// The gate is shared with the crux pass (`graph/enrich.ts`): once the provider has
|
|
102
|
+
// clearly stopped serving — a spent quota, a rejected key — the remaining files are
|
|
103
|
+
// not attempted. This pass is where #127's 1,617 doomed calls were spent, one per
|
|
104
|
+
// file, before the build exited 0.
|
|
105
|
+
const gate = new LlmFailureGate();
|
|
106
|
+
const work = await mapWithConcurrency(files, Math.max(1, opts.concurrency ?? 8), async (file, i) => {
|
|
107
|
+
const rel = relPosix(root, file);
|
|
108
|
+
opts.onProgress?.({ phase: "summarize", index: i, total: files.length, file: rel });
|
|
109
|
+
let code;
|
|
110
|
+
try {
|
|
111
|
+
const decoded = readSourceFile(file);
|
|
112
|
+
if (decoded === null)
|
|
113
|
+
return undefined; // unsupported encoding (e.g. UTF-16BE) — skip, not an error
|
|
114
|
+
code = decoded;
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
result.errors.push(`${rel}: ${errMsg(err)}`);
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
const hash = contentHash(code);
|
|
121
|
+
const hit = cache.summaries[rel];
|
|
122
|
+
if (hit && hit.hash === hash) {
|
|
123
|
+
result.cached++;
|
|
124
|
+
return { rel, hash, summary: hit.summary };
|
|
125
|
+
}
|
|
126
|
+
// A cache hit is still served after the gate closes (it costs nothing) — only
|
|
127
|
+
// the call is skipped.
|
|
128
|
+
if (gate.stopped) {
|
|
129
|
+
gate.skip();
|
|
130
|
+
return { rel, hash };
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
const summary = await opts.summarizer.summarize(code, { path: rel });
|
|
134
|
+
cache.summaries[rel] = { hash, summary };
|
|
135
|
+
result.summarized++;
|
|
136
|
+
maybeFlush();
|
|
137
|
+
gate.succeeded();
|
|
138
|
+
return { rel, hash, summary };
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
const message = errMsg(err);
|
|
142
|
+
result.errors.push(`${rel}: ${message}`);
|
|
143
|
+
gate.record(message);
|
|
144
|
+
return { rel, hash }; // covered (counts against staleness) but not summarized
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
result.failedFiles = gate.failed;
|
|
148
|
+
result.skippedFiles = gate.skipped;
|
|
149
|
+
result.fatal = gate.fatal;
|
|
150
|
+
// Phase 1 done: persist every summary before the (also LLM-backed) synthesis
|
|
151
|
+
// phase, so an interruption there never discards phase-1 work.
|
|
152
|
+
saveCache(outDir, cache);
|
|
153
|
+
const processed = work.filter((w) => w !== undefined);
|
|
154
|
+
result.files = processed.length;
|
|
155
|
+
const hashByPath = new Map(processed.map((w) => [w.rel, w.hash]));
|
|
156
|
+
// Phase 2: synthesize curated nodes from the summaries, batched + cached.
|
|
157
|
+
const summarized = processed
|
|
158
|
+
.filter((w) => Boolean(w.summary))
|
|
159
|
+
.map((w) => ({ path: w.rel, summary: w.summary }))
|
|
160
|
+
.sort((a, b) => a.path.localeCompare(b.path));
|
|
161
|
+
const batches = planSynthesis(summarized, hashByPath);
|
|
162
|
+
result.batches = batches.length;
|
|
163
|
+
/**
|
|
164
|
+
* One batch's synthesis, cached and failure-gated exactly as phase 1 is: a cache
|
|
165
|
+
* hit is served even once the gate has closed (it costs nothing), only the call
|
|
166
|
+
* is skipped.
|
|
167
|
+
*/
|
|
168
|
+
async function synthesizeBatch(batch, b) {
|
|
169
|
+
let nodes = cache.synth[batch.key];
|
|
170
|
+
// An empty array is a miss, not a hit: caching [] made a silent empty
|
|
171
|
+
// synthesis permanent, the same trap #177 closed for the meaning pass (#129).
|
|
172
|
+
if (Array.isArray(nodes) && nodes.length > 0)
|
|
173
|
+
return { nodes, cached: true, state: "ok" };
|
|
174
|
+
if (gate.stopped) {
|
|
175
|
+
gate.skip();
|
|
176
|
+
return { nodes: [], cached: false, state: "skipped" };
|
|
177
|
+
}
|
|
178
|
+
try {
|
|
179
|
+
nodes = await opts.synthesizer.synthesize(batch.files);
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
// Recorded, not thrown. A provider that has stopped serving fails every
|
|
183
|
+
// batch the same way, so the gate turns the first of those into a loud
|
|
184
|
+
// fatal and the rest into skipped calls, and the CLI already reports a
|
|
185
|
+
// concept pass with errors as a degraded meaning tier. Rethrowing instead
|
|
186
|
+
// would write no graph at all and leave the synthesis cache unsaved, so the
|
|
187
|
+
// next run would re-synthesize every batch that did work.
|
|
188
|
+
const message = errMsg(err);
|
|
189
|
+
result.errors.push(`synthesis batch ${b + 1}/${batches.length}: ${message}`);
|
|
190
|
+
gate.record(message);
|
|
191
|
+
return { nodes: [], cached: false, state: "failed" };
|
|
192
|
+
}
|
|
193
|
+
if (nodes.length > 0)
|
|
194
|
+
cache.synth[batch.key] = nodes;
|
|
195
|
+
else
|
|
196
|
+
delete cache.synth[batch.key];
|
|
197
|
+
gate.succeeded();
|
|
198
|
+
return { nodes, cached: false, state: "ok" };
|
|
199
|
+
}
|
|
200
|
+
// A batch is an independent unit of work — its call sees only its own summaries,
|
|
201
|
+
// and nothing is merged until every call is in (phase 3) — so the batches run
|
|
202
|
+
// concurrently, the way phase 1's per-file calls already do. The slow part is
|
|
203
|
+
// the round-trip, and a big repo otherwise serializes every one of them.
|
|
204
|
+
//
|
|
205
|
+
// Results are collected in BATCH order, whatever order the calls finish in.
|
|
206
|
+
// That is what makes this safe: the merge below is order-sensitive (first name
|
|
207
|
+
// registered wins, longest summary wins), so consuming batches as they completed
|
|
208
|
+
// would make the graph a function of network timing, and two builds of the same
|
|
209
|
+
// repo could disagree.
|
|
210
|
+
let synthesized = 0;
|
|
211
|
+
const outcomes = await mapWithConcurrency(batches, Math.max(1, opts.synthConcurrency ?? DEFAULT_SYNTH_CONCURRENCY), async (batch, b) => {
|
|
212
|
+
const outcome = await synthesizeBatch(batch, b);
|
|
213
|
+
// Reported on completion, like the crux pass (`graph/enrich.ts`): with several
|
|
214
|
+
// calls in flight the next batch is not the one that is running, so `index`
|
|
215
|
+
// counts finished batches and `file` names the one that just landed. The CLI
|
|
216
|
+
// prints them as one overwritten line, which only reads as progress if the
|
|
217
|
+
// counter never goes backwards.
|
|
218
|
+
opts.onProgress?.({ phase: "synthesize", index: synthesized++, total: batches.length, file: `batch ${b + 1}` });
|
|
219
|
+
return outcome;
|
|
220
|
+
});
|
|
221
|
+
// One log line per batch, in batch order: printed as the calls land it would
|
|
222
|
+
// report which call was fastest, which is noise on a run whose output does not
|
|
223
|
+
// depend on how the calls interleaved.
|
|
224
|
+
const synthNodes = [];
|
|
225
|
+
for (const [b, out] of outcomes.entries()) {
|
|
226
|
+
const links = out.nodes.reduce((n, node) => n + node.links.length, 0);
|
|
227
|
+
const note = out.cached ? " (cached)" : out.state === "failed" ? " (failed)" : out.state === "skipped" ? " (skipped)" : "";
|
|
228
|
+
console.error(` synthesis batch ${b + 1}/${batches.length}: ${out.nodes.length} nodes, ${links} links${note}`);
|
|
229
|
+
synthNodes.push(...out.nodes);
|
|
230
|
+
}
|
|
231
|
+
// The gate is shared with phase 1, so these counts now cover both LLM passes.
|
|
232
|
+
result.failedFiles = gate.failed;
|
|
233
|
+
result.skippedFiles = gate.skipped;
|
|
234
|
+
result.fatal = gate.fatal;
|
|
235
|
+
// Drop cache entries for batches we no longer produce, so it can't grow forever.
|
|
236
|
+
// Skip empty arrays so a failed batch is retried on the next --deep, not frozen.
|
|
237
|
+
cache.synth = Object.fromEntries(batches.flatMap(({ key }) => {
|
|
238
|
+
const v = cache.synth[key];
|
|
239
|
+
return v && v.length > 0 ? [[key, v]] : [];
|
|
240
|
+
}));
|
|
241
|
+
saveCache(outDir, cache);
|
|
242
|
+
// Phase 3: merge synth nodes by slug, building a name→slug resolution table.
|
|
243
|
+
const drafts = new Map();
|
|
244
|
+
const nameToSlug = new Map();
|
|
245
|
+
for (const n of synthNodes) {
|
|
246
|
+
const slug = slugify(n.name);
|
|
247
|
+
let draft = drafts.get(slug);
|
|
248
|
+
if (!draft) {
|
|
249
|
+
draft = { name: n.name, slug, type: n.type || "concept", summary: n.summary ?? "", sources: new Map(), links: new Map() };
|
|
250
|
+
drafts.set(slug, draft);
|
|
251
|
+
}
|
|
252
|
+
if ((n.summary?.length ?? 0) > draft.summary.length)
|
|
253
|
+
draft.summary = n.summary;
|
|
254
|
+
if (n.type && draft.type === "concept")
|
|
255
|
+
draft.type = n.type;
|
|
256
|
+
for (const src of n.sources) {
|
|
257
|
+
const hash = hashByPath.get(src);
|
|
258
|
+
if (hash)
|
|
259
|
+
draft.sources.set(src, hash);
|
|
260
|
+
}
|
|
261
|
+
registerName(nameToSlug, n.name, slug);
|
|
262
|
+
}
|
|
263
|
+
// Phase 4: resolve links to slugs (both endpoints must be defined nodes).
|
|
264
|
+
for (const n of synthNodes) {
|
|
265
|
+
const from = drafts.get(slugify(n.name));
|
|
266
|
+
if (!from)
|
|
267
|
+
continue;
|
|
268
|
+
for (const link of n.links) {
|
|
269
|
+
const to = resolveSlug(nameToSlug, link.to);
|
|
270
|
+
if (!to || to === from.slug)
|
|
271
|
+
continue;
|
|
272
|
+
const key = `${to}|${link.relation}`;
|
|
273
|
+
if (!from.links.has(key))
|
|
274
|
+
from.links.set(key, { to, relation: link.relation, description: link.description });
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Concept nodes the model didn't attribute to files inherit the provenance of
|
|
278
|
+
// the nodes they link to, so they still go stale when their subject changes.
|
|
279
|
+
for (const draft of drafts.values()) {
|
|
280
|
+
if (draft.sources.size > 0)
|
|
281
|
+
continue;
|
|
282
|
+
for (const link of draft.links.values()) {
|
|
283
|
+
const target = drafts.get(link.to);
|
|
284
|
+
if (target)
|
|
285
|
+
for (const [p, h] of target.sources)
|
|
286
|
+
draft.sources.set(p, h);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
// Phase 5: finalize, reconcile with disk, write.
|
|
290
|
+
const nodes = [...drafts.values()].map((d) => {
|
|
291
|
+
const sources = [...d.sources.entries()]
|
|
292
|
+
.map(([path, hash]) => ({ path, hash }))
|
|
293
|
+
.sort((a, b) => a.path.localeCompare(b.path));
|
|
294
|
+
return {
|
|
295
|
+
name: d.name,
|
|
296
|
+
slug: d.slug,
|
|
297
|
+
type: d.type || "concept",
|
|
298
|
+
summary: d.summary,
|
|
299
|
+
sources,
|
|
300
|
+
sourcesDigest: digestSources(sources),
|
|
301
|
+
links: [...d.links.values()].sort((a, b) => a.to.localeCompare(b.to)),
|
|
302
|
+
human: "",
|
|
303
|
+
};
|
|
304
|
+
});
|
|
305
|
+
nodes.sort((a, b) => a.slug.localeCompare(b.slug));
|
|
306
|
+
const liveSlugs = new Set(nodes.map((n) => n.slug));
|
|
307
|
+
for (const slug of existingNodeSlugs(outDir)) {
|
|
308
|
+
if (!liveSlugs.has(slug))
|
|
309
|
+
deleteNode(outDir, slug);
|
|
310
|
+
}
|
|
311
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
312
|
+
opts.onProgress?.({ phase: "write", index: i, total: nodes.length, file: nodes[i].slug });
|
|
313
|
+
writeNode(outDir, nodes[i]);
|
|
314
|
+
}
|
|
315
|
+
result.nodes = nodes.length;
|
|
316
|
+
result.links = nodes.reduce((n, node) => n + node.links.length, 0);
|
|
317
|
+
// Failure mode 2 (#129): a model can emit real tool_calls whose quality
|
|
318
|
+
// collapsed (many batches, zero links) with nothing per-batch in the log.
|
|
319
|
+
if (result.links === 0 && result.batches > 1) {
|
|
320
|
+
console.error(`⚠ synthesis produced 0 links across ${result.batches} batches — the model may be degrading; see per-batch counts above`);
|
|
321
|
+
}
|
|
322
|
+
// Manifest: authoritative file→hash map (every processed file) + node roster.
|
|
323
|
+
const fileRefs = processed
|
|
324
|
+
.map((w) => ({ path: w.rel, hash: w.hash }))
|
|
325
|
+
.sort((a, b) => a.path.localeCompare(b.path));
|
|
326
|
+
const manifest = {
|
|
327
|
+
version: MANIFEST_VERSION,
|
|
328
|
+
model: opts.model,
|
|
329
|
+
repoDigest: digestSources(fileRefs),
|
|
330
|
+
files: fileRefs,
|
|
331
|
+
nodes: nodes.map((n) => ({
|
|
332
|
+
slug: n.slug,
|
|
333
|
+
name: n.name,
|
|
334
|
+
type: n.type,
|
|
335
|
+
sources: n.sources.map((s) => s.path),
|
|
336
|
+
sourcesDigest: n.sourcesDigest,
|
|
337
|
+
})),
|
|
338
|
+
};
|
|
339
|
+
writeManifest(outDir, manifest);
|
|
340
|
+
return result;
|
|
341
|
+
}
|
|
342
|
+
function registerName(table, name, slug) {
|
|
343
|
+
const key = name.trim().toLowerCase();
|
|
344
|
+
if (key && !table.has(key))
|
|
345
|
+
table.set(key, slug);
|
|
346
|
+
}
|
|
347
|
+
function resolveSlug(table, name) {
|
|
348
|
+
return table.get(name.trim().toLowerCase());
|
|
349
|
+
}
|
|
350
|
+
function errMsg(err) {
|
|
351
|
+
return err instanceof Error ? err.message : String(err);
|
|
352
|
+
}
|
|
353
|
+
function cachePath(outDir) {
|
|
354
|
+
return join(outDir, CACHE_DIR, "summaries.json");
|
|
355
|
+
}
|
|
356
|
+
function loadCache(outDir) {
|
|
357
|
+
const path = cachePath(outDir);
|
|
358
|
+
if (existsSync(path)) {
|
|
359
|
+
try {
|
|
360
|
+
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
361
|
+
return { summaries: parsed.summaries ?? {}, synth: parsed.synth ?? {} };
|
|
362
|
+
}
|
|
363
|
+
catch {
|
|
364
|
+
/* fall through to empty */
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
return { summaries: {}, synth: {} };
|
|
368
|
+
}
|
|
369
|
+
function saveCache(outDir, cache) {
|
|
370
|
+
const path = cachePath(outDir);
|
|
371
|
+
mkdirSync(join(outDir, CACHE_DIR), { recursive: true });
|
|
372
|
+
// Atomic: a kill mid-write can't leave a truncated (unparseable) cache that
|
|
373
|
+
// would throw away every prior summary on the next load.
|
|
374
|
+
const tmp = `${path}.tmp`;
|
|
375
|
+
writeFileSync(tmp, JSON.stringify(cache, null, 2));
|
|
376
|
+
renameSync(tmp, path);
|
|
377
|
+
}
|
|
378
|
+
/** Min interval between phase-1 cache flushes. Env seam for tests. */
|
|
379
|
+
function summaryCheckpointMs() {
|
|
380
|
+
const raw = Number(process.env.GRAFT_SUMMARY_CHECKPOINT_MS);
|
|
381
|
+
return Number.isFinite(raw) && raw >= 0 ? raw : 15_000;
|
|
382
|
+
}
|
|
383
|
+
/** Run `fn` over `items` with at most `limit` in flight, preserving order. */
|
|
384
|
+
async function mapWithConcurrency(items, limit, fn) {
|
|
385
|
+
const results = new Array(items.length);
|
|
386
|
+
let next = 0;
|
|
387
|
+
const workers = Array.from({ length: Math.min(limit, items.length) }, async () => {
|
|
388
|
+
while (next < items.length) {
|
|
389
|
+
const i = next++;
|
|
390
|
+
results[i] = await fn(items[i], i);
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
await Promise.all(workers);
|
|
394
|
+
return results;
|
|
395
|
+
}
|
|
396
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/context/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export interface CheckResult {
|
|
2
|
+
ok: boolean;
|
|
3
|
+
/** True when there is no graph at all (init has never run). */
|
|
4
|
+
missing: boolean;
|
|
5
|
+
contentDrift: Array<{
|
|
6
|
+
path: string;
|
|
7
|
+
from: string;
|
|
8
|
+
to: string;
|
|
9
|
+
}>;
|
|
10
|
+
removed: string[];
|
|
11
|
+
coverage: string[];
|
|
12
|
+
indexDrift: string[];
|
|
13
|
+
}
|
|
14
|
+
export interface CheckOptions {
|
|
15
|
+
contextDir?: string;
|
|
16
|
+
extensions?: string[];
|
|
17
|
+
}
|
|
18
|
+
export declare function checkContext(dir: string, opts?: CheckOptions): CheckResult;
|
|
19
|
+
/** A cheap, query-time staleness signal (unlike {@link checkContext}, which
|
|
20
|
+
* re-hashes every file for CI). */
|
|
21
|
+
export interface FreshnessResult {
|
|
22
|
+
/** Recorded source files that are no longer on disk. */
|
|
23
|
+
missing: number;
|
|
24
|
+
/** Total source files the manifest recorded. */
|
|
25
|
+
total: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* How many recorded source files have vanished from disk — an existence-only
|
|
29
|
+
* check (stat, never a read or a hash), safe to call on a hot path like session
|
|
30
|
+
* start. This catches the common "index built on a different tree" case: a
|
|
31
|
+
* branch switch, a `git checkout` to an older commit, an unpulled move — states
|
|
32
|
+
* where graft would otherwise confidently point at files that aren't there and
|
|
33
|
+
* send the agent chasing them. Returns null when there's no graph at all.
|
|
34
|
+
*/
|
|
35
|
+
export declare function indexFreshness(dir: string, opts?: CheckOptions): FreshnessResult | null;
|
|
36
|
+
/** One-line staleness banner for orientation/query output, or null when the
|
|
37
|
+
* index is fresh (or absent). Terse on purpose — it rides atop the orientation
|
|
38
|
+
* the agent reads first, so it must earn its tokens. */
|
|
39
|
+
export declare function staleBanner(f: FreshnessResult | null): string | null;
|
|
40
|
+
/** Render a check result as a human-readable report. */
|
|
41
|
+
export declare function formatCheckReport(r: CheckResult, label?: string): string;
|
|
42
|
+
//# sourceMappingURL=check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/context/check.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,+DAA+D;IAC/D,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB,GAAG,WAAW,CAyE9E;AAED;mCACmC;AACnC,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB,GAAG,eAAe,GAAG,IAAI,CAU3F;AAED;;wDAEwD;AACxD,wBAAgB,WAAW,CAAC,CAAC,EAAE,eAAe,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAOpE;AAED,wDAAwD;AACxD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,SAAgB,GAAG,MAAM,CAyB/E"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `check` — is the committed `.context/` graph still in sync with the code?
|
|
3
|
+
*
|
|
4
|
+
* Pure I/O + hashing: no LLM, no network, milliseconds. It re-hashes the source
|
|
5
|
+
* files the manifest recorded and compares. Meant to run in CI: exit 0 when the
|
|
6
|
+
* graph is fresh, 1 when it has drifted (so a PR that changed code but not the
|
|
7
|
+
* graph fails until `graft build --deep` is re-run and committed).
|
|
8
|
+
*
|
|
9
|
+
* Drift categories:
|
|
10
|
+
* content a recorded source file's bytes changed
|
|
11
|
+
* removed a recorded source file no longer exists
|
|
12
|
+
* coverage a code file exists that no node was built from (new/uningested)
|
|
13
|
+
* index a node's frontmatter disagrees with the manifest (hand-edited)
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync } from "node:fs";
|
|
16
|
+
import { resolve } from "node:path";
|
|
17
|
+
import { contentHash } from "../util/id.js";
|
|
18
|
+
import { relPosix } from "../util/paths.js";
|
|
19
|
+
import { readSourceFile } from "../util/source.js";
|
|
20
|
+
import { CODE_EXTENSIONS, listContextFiles } from "./build.js";
|
|
21
|
+
import { contextDirFor, readManifest, readNodes } from "./node-file.js";
|
|
22
|
+
import { brand, cmd } from "../brand.js";
|
|
23
|
+
export function checkContext(dir, opts = {}) {
|
|
24
|
+
const root = resolve(dir);
|
|
25
|
+
const outDir = contextDirFor(root, opts.contextDir);
|
|
26
|
+
const exts = opts.extensions ?? CODE_EXTENSIONS;
|
|
27
|
+
const result = {
|
|
28
|
+
ok: false,
|
|
29
|
+
missing: false,
|
|
30
|
+
contentDrift: [],
|
|
31
|
+
removed: [],
|
|
32
|
+
coverage: [],
|
|
33
|
+
indexDrift: [],
|
|
34
|
+
};
|
|
35
|
+
const manifest = readManifest(outDir);
|
|
36
|
+
if (!manifest) {
|
|
37
|
+
result.missing = true;
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
// Current code files on disk (same persisted directory/submodule choices
|
|
41
|
+
// `init` used, including the `--only-dir` whitelist from the fingerprint),
|
|
42
|
+
// so this freshness check never disagrees with buildContext about what
|
|
43
|
+
// "current" means.
|
|
44
|
+
const current = new Map(); // rel → hash
|
|
45
|
+
for (const file of listContextFiles(root, outDir, exts)) {
|
|
46
|
+
try {
|
|
47
|
+
const source = readSourceFile(file);
|
|
48
|
+
if (source === null)
|
|
49
|
+
continue; // unsupported encoding (e.g. UTF-16BE) → treat as removed below
|
|
50
|
+
current.set(relPosix(root, file), contentHash(source));
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Unreadable now → treat as removed below (it won't be in `current`).
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Compare the manifest's recorded files against what's on disk.
|
|
57
|
+
const recorded = new Set();
|
|
58
|
+
for (const ref of manifest.files) {
|
|
59
|
+
recorded.add(ref.path);
|
|
60
|
+
const now = current.get(ref.path);
|
|
61
|
+
if (now === undefined) {
|
|
62
|
+
result.removed.push(ref.path);
|
|
63
|
+
}
|
|
64
|
+
else if (now !== ref.hash) {
|
|
65
|
+
result.contentDrift.push({ path: ref.path, from: short(ref.hash), to: short(now) });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
for (const path of current.keys()) {
|
|
69
|
+
if (!recorded.has(path))
|
|
70
|
+
result.coverage.push(path);
|
|
71
|
+
}
|
|
72
|
+
// Node frontmatter must agree with the manifest roster (catches hand edits).
|
|
73
|
+
const manifestNodes = new Map(manifest.nodes.map((n) => [n.slug, n]));
|
|
74
|
+
const onDisk = readNodes(outDir);
|
|
75
|
+
const seen = new Set();
|
|
76
|
+
for (const node of onDisk) {
|
|
77
|
+
seen.add(node.slug);
|
|
78
|
+
const m = manifestNodes.get(node.slug);
|
|
79
|
+
if (!m) {
|
|
80
|
+
result.indexDrift.push(`${node.slug}: node file not in manifest`);
|
|
81
|
+
}
|
|
82
|
+
else if (m.sourcesDigest !== node.sourcesDigest) {
|
|
83
|
+
result.indexDrift.push(`${node.slug}: frontmatter digest ≠ manifest`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
for (const slug of manifestNodes.keys()) {
|
|
87
|
+
if (!seen.has(slug))
|
|
88
|
+
result.indexDrift.push(`${slug}: in manifest but node file missing`);
|
|
89
|
+
}
|
|
90
|
+
result.ok =
|
|
91
|
+
result.contentDrift.length === 0 &&
|
|
92
|
+
result.removed.length === 0 &&
|
|
93
|
+
result.coverage.length === 0 &&
|
|
94
|
+
result.indexDrift.length === 0;
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* How many recorded source files have vanished from disk — an existence-only
|
|
99
|
+
* check (stat, never a read or a hash), safe to call on a hot path like session
|
|
100
|
+
* start. This catches the common "index built on a different tree" case: a
|
|
101
|
+
* branch switch, a `git checkout` to an older commit, an unpulled move — states
|
|
102
|
+
* where graft would otherwise confidently point at files that aren't there and
|
|
103
|
+
* send the agent chasing them. Returns null when there's no graph at all.
|
|
104
|
+
*/
|
|
105
|
+
export function indexFreshness(dir, opts = {}) {
|
|
106
|
+
const root = resolve(dir);
|
|
107
|
+
const outDir = contextDirFor(root, opts.contextDir);
|
|
108
|
+
const manifest = readManifest(outDir);
|
|
109
|
+
if (!manifest)
|
|
110
|
+
return null;
|
|
111
|
+
let missing = 0;
|
|
112
|
+
for (const ref of manifest.files) {
|
|
113
|
+
if (!existsSync(resolve(root, ref.path)))
|
|
114
|
+
missing++;
|
|
115
|
+
}
|
|
116
|
+
return { missing, total: manifest.files.length };
|
|
117
|
+
}
|
|
118
|
+
/** One-line staleness banner for orientation/query output, or null when the
|
|
119
|
+
* index is fresh (or absent). Terse on purpose — it rides atop the orientation
|
|
120
|
+
* the agent reads first, so it must earn its tokens. */
|
|
121
|
+
export function staleBanner(f) {
|
|
122
|
+
if (!f || f.missing === 0)
|
|
123
|
+
return null;
|
|
124
|
+
return (`⚠ ${brand()}'s index may be ahead of your working tree: ${f.missing} of ${f.total} indexed ` +
|
|
125
|
+
`files are not on disk (branch switch or uncommitted move?). If ${brand()} names a path that ` +
|
|
126
|
+
`isn't there, don't chase it — \`${cmd("graft grep")}\` the symbol to find where it lives now; run \`${cmd("graft build")}\` to refresh.`);
|
|
127
|
+
}
|
|
128
|
+
/** Render a check result as a human-readable report. */
|
|
129
|
+
export function formatCheckReport(r, label = "graft check") {
|
|
130
|
+
if (r.missing) {
|
|
131
|
+
return `${label}: NO GRAPH\n\nNo graft/manifest.json found. Run \`${cmd("graft build --deep")}\` first.`;
|
|
132
|
+
}
|
|
133
|
+
if (r.ok)
|
|
134
|
+
return `${label}: OK — the graph is in sync with the code.`;
|
|
135
|
+
const lines = [`${label}: STALE`, ""];
|
|
136
|
+
if (r.contentDrift.length) {
|
|
137
|
+
lines.push(`changed (${r.contentDrift.length}):`);
|
|
138
|
+
for (const c of r.contentDrift)
|
|
139
|
+
lines.push(` ~ ${c.path} (${c.from} → ${c.to})`);
|
|
140
|
+
}
|
|
141
|
+
if (r.removed.length) {
|
|
142
|
+
lines.push(`removed (${r.removed.length}):`);
|
|
143
|
+
for (const p of r.removed)
|
|
144
|
+
lines.push(` - ${p}`);
|
|
145
|
+
}
|
|
146
|
+
if (r.coverage.length) {
|
|
147
|
+
lines.push(`not in graph (${r.coverage.length}):`);
|
|
148
|
+
for (const p of r.coverage)
|
|
149
|
+
lines.push(` + ${p}`);
|
|
150
|
+
}
|
|
151
|
+
if (r.indexDrift.length) {
|
|
152
|
+
lines.push(`index mismatch (${r.indexDrift.length}):`);
|
|
153
|
+
for (const s of r.indexDrift)
|
|
154
|
+
lines.push(` ! ${s}`);
|
|
155
|
+
}
|
|
156
|
+
lines.push("", `Run \`${cmd("graft build --deep")}\` to regenerate, then commit graft/.`);
|
|
157
|
+
return lines.join("\n");
|
|
158
|
+
}
|
|
159
|
+
function short(hash) {
|
|
160
|
+
return hash.slice(0, 8);
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/context/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** The map's folder in a repo on trail, relative to the repo. */
|
|
2
|
+
export declare const TRAIL_MAP_DIR: string;
|
|
3
|
+
/** The map's folder everywhere else. */
|
|
4
|
+
export declare const GRAFT_MAP_DIR = "graft";
|
|
5
|
+
/**
|
|
6
|
+
* Absolute path of `root`'s code map folder. A repo is on trail once its
|
|
7
|
+
* hooks say so or it has `.trail/learnings/`, which `trail init` makes before
|
|
8
|
+
* anything else, so nothing it writes lands in `graft/` first.
|
|
9
|
+
*/
|
|
10
|
+
export declare function mapDirFor(root: string): string;
|
|
11
|
+
/** Whether `dir` is a repo's trail map folder, which `.trail/.gitignore` keeps out of git. */
|
|
12
|
+
export declare function isTrailMapDir(root: string, dir: string): boolean;
|
|
13
|
+
//# sourceMappingURL=map-dir.d.ts.map
|