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,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI wiring + human formatter for `graft grep`.
|
|
3
|
+
*
|
|
4
|
+
* Kept out of cli.ts (argument wiring only) and out of grep.ts (pure core,
|
|
5
|
+
* unit-testable against hand-built fixture graphs without touching a real
|
|
6
|
+
* repo root) — same split as traverse.ts/traverse-cli.ts. `formatGrepResult`
|
|
7
|
+
* is exported so `graft_find_all` in `src/mcp/tools.ts` renders the identical
|
|
8
|
+
* report, rather than re-implementing it.
|
|
9
|
+
*/
|
|
10
|
+
import { resolve } from "node:path";
|
|
11
|
+
import { contextDirFor } from "../context/node-file.js";
|
|
12
|
+
import { withSavings } from "../context/savings.js";
|
|
13
|
+
import { loadGraphCached } from "../graph/load.js";
|
|
14
|
+
import { grepGraph } from "./grep.js";
|
|
15
|
+
import { cmd } from "../brand.js";
|
|
16
|
+
import { ignoredCode, ignoredLabel } from "./ignored-code.js";
|
|
17
|
+
function groupHeader(g) {
|
|
18
|
+
if (g.symbol)
|
|
19
|
+
return `${g.symbol.name} · ${g.symbol.kind} · ${g.symbol.path}:${g.symbol.span} · ${g.inDegree} in-edges`;
|
|
20
|
+
return `${g.path} (module level) · ${g.inDegree} in-edges`;
|
|
21
|
+
}
|
|
22
|
+
function formatGroup(g) {
|
|
23
|
+
const lines = [groupHeader(g)];
|
|
24
|
+
for (const h of g.hits)
|
|
25
|
+
lines.push(` L${h.line}: ${h.text}`);
|
|
26
|
+
return lines.join("\n");
|
|
27
|
+
}
|
|
28
|
+
/** `"<pattern>" — N hits in M symbols across K files (searched T indexed files)` */
|
|
29
|
+
export function formatGrepHeader(result) {
|
|
30
|
+
const filesHit = new Set(result.groups.map((g) => g.path)).size;
|
|
31
|
+
return `"${result.pattern}" — ${result.totalHits} hits in ${result.groups.length} symbols across ${filesHit} files (searched ${result.filesSearched} indexed files)`;
|
|
32
|
+
}
|
|
33
|
+
/** Loud truncation note — dropped counts are never silent. */
|
|
34
|
+
function truncationNote(result) {
|
|
35
|
+
const { files, hits } = result.truncated;
|
|
36
|
+
if (files === 0 && hits === 0)
|
|
37
|
+
return null;
|
|
38
|
+
const parts = [];
|
|
39
|
+
if (hits > 0)
|
|
40
|
+
parts.push(`${hits} more hit${hits === 1 ? "" : "s"} beyond the cap`);
|
|
41
|
+
if (files > 0)
|
|
42
|
+
parts.push(`${files} indexed file${files === 1 ? "" : "s"} unreadable`);
|
|
43
|
+
return `(truncated: ${parts.join(", ")} — narrow with --in or refine the pattern)`;
|
|
44
|
+
}
|
|
45
|
+
/** Full human report: header, blank line, then one block per group (header +
|
|
46
|
+
* indented hit lines), each block separated by a blank line. */
|
|
47
|
+
export function formatGrepResult(result) {
|
|
48
|
+
// The truncation note rides directly under the header, not at the bottom:
|
|
49
|
+
// "never silent" has to survive a `head -N` too (same reason the savings
|
|
50
|
+
// line is a header — see withSavings).
|
|
51
|
+
const note = truncationNote(result);
|
|
52
|
+
const head = note ? `${formatGrepHeader(result)}\n${note}` : formatGrepHeader(result);
|
|
53
|
+
const blocks = [head, "", ...result.groups.map((g) => formatGroup(g) + "\n")];
|
|
54
|
+
const out = blocks.join("\n").replace(/\n+$/, "\n");
|
|
55
|
+
return withSavings(out, result.saved);
|
|
56
|
+
}
|
|
57
|
+
/** Loud, actionable zero-hit note (never a bare empty result) — printed to
|
|
58
|
+
* stderr; the caller still exits 0, since "no hits in the indexed graph" is
|
|
59
|
+
* not an error, just a reason to fall back to a real grep.
|
|
60
|
+
*
|
|
61
|
+
* Truncation is never silent, even on the zero-hit path: if some indexed
|
|
62
|
+
* files couldn't be read (`truncated.files > 0`), that's called out too —
|
|
63
|
+
* otherwise a zero-hit result on a stale graph or wrong root reads as "no
|
|
64
|
+
* matches" when really some files were never searched at all.
|
|
65
|
+
*
|
|
66
|
+
* `ignored`: git-ignored code under the root (see `ignoredCode`). When there
|
|
67
|
+
* is some, the note names it instead of saying all the code was searched. */
|
|
68
|
+
export function zeroHitNote(result, ignored = []) {
|
|
69
|
+
const retry = `no hits for "${result.pattern}" in ${result.filesSearched} indexed files. The pattern may be too specific — retry ${cmd("graft grep")} with a bare symbol name or short substring (drop the receiver, full signature, and regex anchors).`;
|
|
70
|
+
const base = ignored.length
|
|
71
|
+
? `${retry} Git-ignored code isn't indexed and wasn't searched: ${ignoredLabel(ignored)}. Run grep -rn there, and on docs and configs`
|
|
72
|
+
: `${retry} All indexed code was searched; use raw grep -rn only for genuinely unindexed files (docs, configs, brand-new files)`;
|
|
73
|
+
const { files } = result.truncated;
|
|
74
|
+
if (files === 0)
|
|
75
|
+
return base;
|
|
76
|
+
return `${base} — note: ${files} indexed file${files === 1 ? "" : "s"} could not be read (stale graph? run ${cmd("graft build")})`;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Resolve the graph at `dir` (respecting `--dir`), run `grepGraph`, and print
|
|
80
|
+
* either the human report or `--json`. Exits the process (code 1) when
|
|
81
|
+
* there's no graph at all or the pattern fails to compile as a regex — both
|
|
82
|
+
* are caller-facing mistakes, not recoverable states. Zero hits is NOT an
|
|
83
|
+
* error: it prints a loud note to stderr and exits 0.
|
|
84
|
+
*/
|
|
85
|
+
export function runGrepCommand(pattern, dir, opts) {
|
|
86
|
+
const root = resolve(dir);
|
|
87
|
+
const contextDir = contextDirFor(root, opts.globalDir);
|
|
88
|
+
const graph = loadGraphCached(contextDir);
|
|
89
|
+
if (!graph) {
|
|
90
|
+
console.error(`✗ no graph — run ${cmd("graft build")} first`);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
let result;
|
|
94
|
+
try {
|
|
95
|
+
result = grepGraph(graph, root, pattern, { ignoreCase: opts.ignoreCase, fixed: opts.fixed, in: opts.in });
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
// `new RegExp` throws SyntaxError; anything else (an unindexed `--in` prefix)
|
|
99
|
+
// is a different mistake and must not be reported as a bad pattern.
|
|
100
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
101
|
+
console.error(err instanceof SyntaxError ? `✗ invalid pattern "${pattern}": ${message}` : `✗ ${message}`);
|
|
102
|
+
process.exit(1);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (opts.json) {
|
|
106
|
+
console.log(JSON.stringify(result, null, 2));
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (result.totalHits === 0) {
|
|
110
|
+
console.error(zeroHitNote(result, ignoredCode(root)));
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
process.stdout.write(formatGrepResult(result));
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=grep-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grep-cli.js","sourceRoot":"","sources":["../../src/search/grep-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { GraphV1 } from "../graph/types.js";
|
|
2
|
+
import { type Savings } from "../context/savings.js";
|
|
3
|
+
export interface GrepHit {
|
|
4
|
+
line: number;
|
|
5
|
+
/** Trimmed line text, capped at 160 chars. */
|
|
6
|
+
text: string;
|
|
7
|
+
}
|
|
8
|
+
export interface GrepSymbolRef {
|
|
9
|
+
id: string;
|
|
10
|
+
/** Qualified scope-joined name (e.g. `FastAPI.include_router`), not just
|
|
11
|
+
* the bare symbol name — the id's segment after the file-path `#`. */
|
|
12
|
+
name: string;
|
|
13
|
+
kind: string;
|
|
14
|
+
path: string;
|
|
15
|
+
span: string;
|
|
16
|
+
}
|
|
17
|
+
export interface GrepGroup {
|
|
18
|
+
/** null → file-level: the hit lies outside every indexed symbol's span
|
|
19
|
+
* (module-level code — imports, top-level statements, module constants). */
|
|
20
|
+
symbol: GrepSymbolRef | null;
|
|
21
|
+
path: string;
|
|
22
|
+
/** Incoming WALK_RELATIONS edges targeting the symbol — always 0 for
|
|
23
|
+
* file-level groups (there's no single symbol id to count edges against). */
|
|
24
|
+
inDegree: number;
|
|
25
|
+
hits: GrepHit[];
|
|
26
|
+
}
|
|
27
|
+
export interface GrepResult {
|
|
28
|
+
pattern: string;
|
|
29
|
+
/** Indexed file nodes considered (after the `in` filter), whether or not
|
|
30
|
+
* each was actually readable — matches the CLI's "searched N indexed
|
|
31
|
+
* files" wording. */
|
|
32
|
+
filesSearched: number;
|
|
33
|
+
/** Hits actually collected (<= maxHits). */
|
|
34
|
+
totalHits: number;
|
|
35
|
+
/** Sorted: inDegree desc, then path asc. */
|
|
36
|
+
groups: GrepGroup[];
|
|
37
|
+
/** Dropped counts — never silent. `files`: indexed file nodes that
|
|
38
|
+
* couldn't be read from disk. `hits`: matches found beyond `maxHits`,
|
|
39
|
+
* counted but not collected. */
|
|
40
|
+
truncated: {
|
|
41
|
+
files: number;
|
|
42
|
+
hits: number;
|
|
43
|
+
};
|
|
44
|
+
/** Tokens-saved baseline: the files that had hits, read whole. Undefined
|
|
45
|
+
* when there were no hits or the graph predates file sizing. */
|
|
46
|
+
saved?: Savings;
|
|
47
|
+
}
|
|
48
|
+
export interface GrepOptions {
|
|
49
|
+
ignoreCase?: boolean;
|
|
50
|
+
/** Treat `pattern` as a literal string (regex-escaped), not a regex. */
|
|
51
|
+
fixed?: boolean;
|
|
52
|
+
/** Narrow to file nodes at or under this repo-relative path prefix — the same
|
|
53
|
+
* segment-aware rule `ask --in` and `callers --in` use. Either separator. */
|
|
54
|
+
in?: string;
|
|
55
|
+
/** Stop collecting hits after this many; the rest are tallied into
|
|
56
|
+
* `truncated.hits`. Default 300. */
|
|
57
|
+
maxHits?: number;
|
|
58
|
+
}
|
|
59
|
+
export declare function grepGraph(graph: GraphV1, repoRoot: string, pattern: string, opts?: GrepOptions): GrepResult;
|
|
60
|
+
//# sourceMappingURL=grep.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../src/search/grep.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAU,MAAM,mBAAmB,CAAC;AAIzD,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAIjE,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX;0EACsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB;gFAC4E;IAC5E,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb;iFAC6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB;;yBAEqB;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB;;oCAEgC;IAChC,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C;oEACgE;IAChE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wEAAwE;IACxE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;iFAC6E;IAC7E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;wCACoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAgED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,UAAU,CA4E/G"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `graft grep` core: regex search over the graph's indexed files, with hits
|
|
3
|
+
* grouped by their innermost enclosing symbol and ranked by incoming-edge
|
|
4
|
+
* count (coupling) — a grep that answers "which of these hits matters",
|
|
5
|
+
* because plain `grep -rn` gives no way to tell a hit inside a
|
|
6
|
+
* heavily-depended-on function from one inside dead code.
|
|
7
|
+
*
|
|
8
|
+
* Pure I/O + regex, no CLI/MCP concerns: `grep-cli.ts` formats this into
|
|
9
|
+
* human text and wires the CLI command; `mcp/tools.ts` renders the same
|
|
10
|
+
* shape for the `graft_find_all` tool.
|
|
11
|
+
*/
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { WALK_RELATIONS } from "../graph/relations.js";
|
|
14
|
+
import { assertPrefixIndexed, pathUnderPrefix } from "../graph/scopes.js";
|
|
15
|
+
import { normalizePathPrefix } from "../util/paths.js";
|
|
16
|
+
import { savingsFor } from "../context/savings.js";
|
|
17
|
+
import { readSourceFile } from "../util/source.js";
|
|
18
|
+
import { userRegExp } from "./user-regexp.js";
|
|
19
|
+
const DEFAULT_MAX_HITS = 300;
|
|
20
|
+
const MAX_HIT_TEXT = 160;
|
|
21
|
+
const SPAN_RE = /^L(\d+)-L(\d+)$/;
|
|
22
|
+
function escapeRegExp(s) {
|
|
23
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
24
|
+
}
|
|
25
|
+
function spanBounds(span) {
|
|
26
|
+
const m = SPAN_RE.exec(span);
|
|
27
|
+
if (!m)
|
|
28
|
+
return null;
|
|
29
|
+
return { start: Number(m[1]), end: Number(m[2]) };
|
|
30
|
+
}
|
|
31
|
+
/** The file's symbol nodes, sorted ascending by span start — the order
|
|
32
|
+
* `enclosingSymbol` scans in to find the innermost containing span. */
|
|
33
|
+
function symbolsOf(graph, path) {
|
|
34
|
+
const out = [];
|
|
35
|
+
for (const n of graph.nodes) {
|
|
36
|
+
if (n.kind === "file" || n.path !== path)
|
|
37
|
+
continue;
|
|
38
|
+
const b = spanBounds(n.span);
|
|
39
|
+
if (b)
|
|
40
|
+
out.push({ node: n, start: b.start, end: b.end });
|
|
41
|
+
}
|
|
42
|
+
out.sort((a, b) => a.start - b.start);
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
/** Innermost symbol containing `line`: among spans that contain it, the one
|
|
46
|
+
* with the greatest start line. Symbols are pre-sorted ascending by start,
|
|
47
|
+
* so the last containing match seen wins, and the scan can stop as soon as
|
|
48
|
+
* a span starts after `line` — nothing later in the sort can contain it. */
|
|
49
|
+
function enclosingSymbol(symbols, line) {
|
|
50
|
+
let found = null;
|
|
51
|
+
for (const s of symbols) {
|
|
52
|
+
if (s.start > line)
|
|
53
|
+
break;
|
|
54
|
+
if (line <= s.end)
|
|
55
|
+
found = s.node;
|
|
56
|
+
}
|
|
57
|
+
return found;
|
|
58
|
+
}
|
|
59
|
+
/** Incoming WALK_RELATIONS edge count per target id — one pass over
|
|
60
|
+
* `graph.edges`, computed once per call and shared across every hit. */
|
|
61
|
+
function computeInDegree(graph) {
|
|
62
|
+
const deg = new Map();
|
|
63
|
+
for (const e of graph.edges) {
|
|
64
|
+
if (!WALK_RELATIONS.has(e.relation))
|
|
65
|
+
continue;
|
|
66
|
+
deg.set(e.target, (deg.get(e.target) ?? 0) + 1);
|
|
67
|
+
}
|
|
68
|
+
return deg;
|
|
69
|
+
}
|
|
70
|
+
function toSymbolRef(n) {
|
|
71
|
+
const hash = n.id.indexOf("#");
|
|
72
|
+
return { id: n.id, name: hash >= 0 ? n.id.slice(hash + 1) : n.name, kind: n.kind, path: n.path, span: n.span };
|
|
73
|
+
}
|
|
74
|
+
export function grepGraph(graph, repoRoot, pattern, opts = {}) {
|
|
75
|
+
const maxHits = opts.maxHits ?? DEFAULT_MAX_HITS;
|
|
76
|
+
const flags = opts.ignoreCase ? "i" : "";
|
|
77
|
+
// A pattern is a regex by design; userRegExp rebuilds it from escaped literals and refuses a nested repeat.
|
|
78
|
+
const regex = opts.fixed ? new RegExp(escapeRegExp(pattern), flags) : userRegExp(pattern, flags);
|
|
79
|
+
const inDegree = computeInDegree(graph);
|
|
80
|
+
// Same segment-aware prefix rule as `ask --in` / `callers --in`, and the same
|
|
81
|
+
// loud failure when it matches nothing — `--in` used to mean a bare substring
|
|
82
|
+
// here and a path prefix there, so `--in src` also swept up `lib/mysrc/`.
|
|
83
|
+
const inPrefix = opts.in ? normalizePathPrefix(opts.in) : undefined;
|
|
84
|
+
if (inPrefix)
|
|
85
|
+
assertPrefixIndexed(graph, inPrefix);
|
|
86
|
+
const fileNodes = graph.nodes.filter((n) => n.kind === "file" && (inPrefix === undefined || pathUnderPrefix(n.path, inPrefix)));
|
|
87
|
+
const groups = new Map();
|
|
88
|
+
let collected = 0;
|
|
89
|
+
let truncatedHits = 0;
|
|
90
|
+
let truncatedFiles = 0;
|
|
91
|
+
for (const file of fileNodes) {
|
|
92
|
+
let text;
|
|
93
|
+
try {
|
|
94
|
+
const decoded = readSourceFile(join(repoRoot, file.path));
|
|
95
|
+
if (decoded === null) {
|
|
96
|
+
truncatedFiles++; // unsupported encoding (e.g. UTF-16BE) — same posture as unreadable
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
text = decoded;
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
truncatedFiles++;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const symbols = symbolsOf(graph, file.path);
|
|
106
|
+
const lines = text.split("\n");
|
|
107
|
+
for (let i = 0; i < lines.length; i++) {
|
|
108
|
+
const raw = lines[i];
|
|
109
|
+
if (!regex.test(raw))
|
|
110
|
+
continue;
|
|
111
|
+
if (collected >= maxHits) {
|
|
112
|
+
truncatedHits++;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
collected++;
|
|
116
|
+
const lineNo = i + 1;
|
|
117
|
+
const sym = enclosingSymbol(symbols, lineNo);
|
|
118
|
+
const key = sym ? sym.id : `file:${file.path}`;
|
|
119
|
+
let group = groups.get(key);
|
|
120
|
+
if (!group) {
|
|
121
|
+
group = {
|
|
122
|
+
symbol: sym ? toSymbolRef(sym) : null,
|
|
123
|
+
path: file.path,
|
|
124
|
+
inDegree: sym ? (inDegree.get(sym.id) ?? 0) : 0,
|
|
125
|
+
hits: [],
|
|
126
|
+
};
|
|
127
|
+
groups.set(key, group);
|
|
128
|
+
}
|
|
129
|
+
const trimmed = raw.trim();
|
|
130
|
+
group.hits.push({ line: lineNo, text: trimmed.length > MAX_HIT_TEXT ? trimmed.slice(0, MAX_HIT_TEXT) : trimmed });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const sortedGroups = [...groups.values()].sort((a, b) => b.inDegree - a.inDegree || a.path.localeCompare(b.path));
|
|
134
|
+
return {
|
|
135
|
+
pattern,
|
|
136
|
+
filesSearched: fileNodes.length,
|
|
137
|
+
totalHits: collected,
|
|
138
|
+
groups: sortedGroups,
|
|
139
|
+
truncated: { files: truncatedFiles, hits: truncatedHits },
|
|
140
|
+
saved: savingsFor(graph, sortedGroups.map((g) => g.path)),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=grep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grep.js","sourceRoot":"","sources":["../../src/search/grep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAgB,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AA4D9C,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,YAAY,GAAG,GAAG,CAAC;AACzB,MAAM,OAAO,GAAG,iBAAiB,CAAC;AAElC,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACpD,CAAC;AAQD;uEACuE;AACvE,SAAS,SAAS,CAAC,KAAc,EAAE,IAAY;IAC7C,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI;YAAE,SAAS;QACnD,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACtC,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;4EAG4E;AAC5E,SAAS,eAAe,CAAC,OAAqB,EAAE,IAAY;IAC1D,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI;YAAE,MAAM;QAC1B,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG;YAAE,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;IACpC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;wEACwE;AACxE,SAAS,eAAe,CAAC,KAAc;IACrC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;YAAE,SAAS;QAC9C,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACjH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc,EAAE,QAAgB,EAAE,OAAe,EAAE,OAAoB,EAAE;IACjG,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,gBAAgB,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACzC,4GAA4G;IAC5G,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAEjG,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACxC,8EAA8E;IAC9E,8EAA8E;IAC9E,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,IAAI,QAAQ;QAAE,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAClC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,eAAe,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAC1F,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC5C,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1D,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,cAAc,EAAE,CAAC,CAAC,oEAAoE;gBACtF,SAAS;YACX,CAAC;YACD,IAAI,GAAG,OAAO,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,cAAc,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACrB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,SAAS;YAE/B,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;gBACzB,aAAa,EAAE,CAAC;gBAChB,SAAS;YACX,CAAC;YACD,SAAS,EAAE,CAAC;YAEZ,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;YACrB,MAAM,GAAG,GAAG,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7C,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/C,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,KAAK,GAAG;oBACN,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;oBACrC,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC/C,IAAI,EAAE,EAAE;iBACT,CAAC;gBACF,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACzB,CAAC;YACD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACpH,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAElH,OAAO;QACL,OAAO;QACP,aAAa,EAAE,SAAS,CAAC,MAAM;QAC/B,SAAS,EAAE,SAAS;QACpB,MAAM,EAAE,YAAY;QACpB,SAAS,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE;QACzD,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;KAC1D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git-ignored folders and files under `root` holding code the map would
|
|
3
|
+
* otherwise index, repo-relative, folders ending in `/`. Dependency, build and
|
|
4
|
+
* dot folders are left out. Empty outside git, or when git can't say.
|
|
5
|
+
*/
|
|
6
|
+
export declare function ignoredCode(root: string, limit?: number): string[];
|
|
7
|
+
/** `a/, b/ and 3 more`. */
|
|
8
|
+
export declare function ignoredLabel(paths: string[], shown?: number): string;
|
|
9
|
+
//# sourceMappingURL=ignored-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignored-code.d.ts","sourceRoot":"","sources":["../../src/search/ignored-code.ts"],"names":[],"mappings":"AAsCA;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,EAAE,CAgB9D;AAED,2BAA2B;AAC3B,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,SAAI,GAAG,MAAM,CAG/D"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code the map leaves out because git ignores it, named when a search comes up
|
|
3
|
+
* empty. A migration repo kept the old app's code in git-ignored dumps (they
|
|
4
|
+
* held credentials); `trail grep` found nothing, said all indexed code was
|
|
5
|
+
* searched, and the agent's own grep then found the file. After that the agent
|
|
6
|
+
* stopped trusting trail for the session.
|
|
7
|
+
*/
|
|
8
|
+
import { WINHIDE } from "../util/child-process.js";
|
|
9
|
+
import { spawnSync } from "node:child_process";
|
|
10
|
+
import { readdirSync } from "node:fs";
|
|
11
|
+
import { extname, join } from "node:path";
|
|
12
|
+
import { supportedExtensions } from "../graph/source-files.js";
|
|
13
|
+
import { shouldSkipDir } from "../ingest/fs.js";
|
|
14
|
+
/** Most entries one ignored folder's walk looks at before giving up on it. */
|
|
15
|
+
const WALK_CAP = 2000;
|
|
16
|
+
function holdsCode(dir, exts) {
|
|
17
|
+
const stack = [dir];
|
|
18
|
+
let seen = 0;
|
|
19
|
+
while (stack.length && seen < WALK_CAP) {
|
|
20
|
+
const at = stack.pop();
|
|
21
|
+
let entries;
|
|
22
|
+
try {
|
|
23
|
+
entries = readdirSync(at, { withFileTypes: true });
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
for (const e of entries) {
|
|
29
|
+
if (++seen > WALK_CAP)
|
|
30
|
+
break;
|
|
31
|
+
if (e.isDirectory()) {
|
|
32
|
+
if (!shouldSkipDir(e.name))
|
|
33
|
+
stack.push(join(at, e.name));
|
|
34
|
+
}
|
|
35
|
+
else if (exts.has(extname(e.name).toLowerCase()))
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Git-ignored folders and files under `root` holding code the map would
|
|
43
|
+
* otherwise index, repo-relative, folders ending in `/`. Dependency, build and
|
|
44
|
+
* dot folders are left out. Empty outside git, or when git can't say.
|
|
45
|
+
*/
|
|
46
|
+
export function ignoredCode(root, limit = 20) {
|
|
47
|
+
const r = spawnSync("git", ["ls-files", "--others", "--ignored", "--exclude-standard", "--directory", "--no-empty-directory"], { ...WINHIDE, cwd: root,
|
|
48
|
+
encoding: "utf8",
|
|
49
|
+
timeout: 3000,
|
|
50
|
+
});
|
|
51
|
+
if (r.status !== 0 || typeof r.stdout !== "string")
|
|
52
|
+
return [];
|
|
53
|
+
const exts = new Set(supportedExtensions());
|
|
54
|
+
const out = [];
|
|
55
|
+
for (const entry of r.stdout.split("\n")) {
|
|
56
|
+
if (!entry)
|
|
57
|
+
continue;
|
|
58
|
+
if (entry.replace(/\/$/, "").split("/").some((p) => shouldSkipDir(p)))
|
|
59
|
+
continue;
|
|
60
|
+
const code = entry.endsWith("/") ? holdsCode(join(root, entry), exts) : exts.has(extname(entry).toLowerCase());
|
|
61
|
+
if (code)
|
|
62
|
+
out.push(entry);
|
|
63
|
+
if (out.length >= limit)
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
return out;
|
|
67
|
+
}
|
|
68
|
+
/** `a/, b/ and 3 more`. */
|
|
69
|
+
export function ignoredLabel(paths, shown = 3) {
|
|
70
|
+
const head = paths.slice(0, shown).join(", ");
|
|
71
|
+
return paths.length > shown ? `${head} and ${paths.length - shown} more` : head;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=ignored-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignored-code.js","sourceRoot":"","sources":["../../src/search/ignored-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The regular expression `graft grep` and `graft_find_all` search with, built
|
|
3
|
+
* from the pattern the person (or their agent) typed. A grep takes a regex by
|
|
4
|
+
* design, so the pattern's syntax is kept; what this adds is that the RegExp
|
|
5
|
+
* is never made from the raw text:
|
|
6
|
+
*
|
|
7
|
+
* - every literal character goes through the metacharacter escape, and only
|
|
8
|
+
* regex syntax from a fixed set is written as itself, so the source handed
|
|
9
|
+
* to `RegExp` is the typed pattern, character for character, rebuilt from
|
|
10
|
+
* known parts;
|
|
11
|
+
* - a repeat of a group that already repeats (`(a+)+`, `(\w*\s)*`) is refused
|
|
12
|
+
* with a SyntaxError, as an invalid pattern is: on a long line it backtracks
|
|
13
|
+
* exponentially and holds the search (the MCP server with it) for minutes.
|
|
14
|
+
* `--fixed` still searches for such text literally.
|
|
15
|
+
*
|
|
16
|
+
* Every other pattern compiles to exactly what `new RegExp(pattern)` gives,
|
|
17
|
+
* and an invalid one still throws `RegExp`'s own SyntaxError.
|
|
18
|
+
*/
|
|
19
|
+
/** Thrown for a repeat of a repeating group: a SyntaxError, so callers report it as they report an invalid pattern. */
|
|
20
|
+
export declare const NESTED_REPEAT = "a repeated group that repeats inside, like (a+)+, can take minutes on one long line; repeat only the inside, or use --fixed";
|
|
21
|
+
/**
|
|
22
|
+
* `pattern` as a RegExp with `flags`, rebuilt from escaped literals and fixed syntax. Throws SyntaxError for an
|
|
23
|
+
* invalid pattern, and for a repeat of a group that repeats inside (see NESTED_REPEAT).
|
|
24
|
+
*/
|
|
25
|
+
export declare function userRegExp(pattern: string, flags?: string): RegExp;
|
|
26
|
+
//# sourceMappingURL=user-regexp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-regexp.d.ts","sourceRoot":"","sources":["../../src/search/user-regexp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AA8BH,uHAAuH;AACvH,eAAO,MAAM,aAAa,gIACqG,CAAC;AAEhI;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,CAiF9D"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The regular expression `graft grep` and `graft_find_all` search with, built
|
|
3
|
+
* from the pattern the person (or their agent) typed. A grep takes a regex by
|
|
4
|
+
* design, so the pattern's syntax is kept; what this adds is that the RegExp
|
|
5
|
+
* is never made from the raw text:
|
|
6
|
+
*
|
|
7
|
+
* - every literal character goes through the metacharacter escape, and only
|
|
8
|
+
* regex syntax from a fixed set is written as itself, so the source handed
|
|
9
|
+
* to `RegExp` is the typed pattern, character for character, rebuilt from
|
|
10
|
+
* known parts;
|
|
11
|
+
* - a repeat of a group that already repeats (`(a+)+`, `(\w*\s)*`) is refused
|
|
12
|
+
* with a SyntaxError, as an invalid pattern is: on a long line it backtracks
|
|
13
|
+
* exponentially and holds the search (the MCP server with it) for minutes.
|
|
14
|
+
* `--fixed` still searches for such text literally.
|
|
15
|
+
*
|
|
16
|
+
* Every other pattern compiles to exactly what `new RegExp(pattern)` gives,
|
|
17
|
+
* and an invalid one still throws `RegExp`'s own SyntaxError.
|
|
18
|
+
*/
|
|
19
|
+
/** One literal character, escaped when it is a regex metacharacter (`.` → `\.`). */
|
|
20
|
+
const literal = (c) => c.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
21
|
+
/** A metacharacter as regex syntax: each written from a constant, never from the pattern. */
|
|
22
|
+
function syntax(c) {
|
|
23
|
+
switch (c) {
|
|
24
|
+
case ".": return ".";
|
|
25
|
+
case "*": return "*";
|
|
26
|
+
case "+": return "+";
|
|
27
|
+
case "?": return "?";
|
|
28
|
+
case "^": return "^";
|
|
29
|
+
case "$": return "$";
|
|
30
|
+
case "{": return "{";
|
|
31
|
+
case "}": return "}";
|
|
32
|
+
case "(": return "(";
|
|
33
|
+
case ")": return ")";
|
|
34
|
+
case "|": return "|";
|
|
35
|
+
case "[": return "[";
|
|
36
|
+
case "]": return "]";
|
|
37
|
+
case "\\": return "\\";
|
|
38
|
+
default: throw new SyntaxError(`not regex syntax: ${c}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const META = new Set([".", "*", "+", "?", "^", "$", "{", "}", "(", ")", "|", "[", "]", "\\"]);
|
|
42
|
+
/** `{n}`, `{n,}`, `{n,m}` at the start of the text: its bounds. */
|
|
43
|
+
const BRACES = /^\{(\d+)(,(\d*))?\}/;
|
|
44
|
+
/** Thrown for a repeat of a repeating group: a SyntaxError, so callers report it as they report an invalid pattern. */
|
|
45
|
+
export const NESTED_REPEAT = "a repeated group that repeats inside, like (a+)+, can take minutes on one long line; repeat only the inside, or use --fixed";
|
|
46
|
+
/**
|
|
47
|
+
* `pattern` as a RegExp with `flags`, rebuilt from escaped literals and fixed syntax. Throws SyntaxError for an
|
|
48
|
+
* invalid pattern, and for a repeat of a group that repeats inside (see NESTED_REPEAT).
|
|
49
|
+
*/
|
|
50
|
+
export function userRegExp(pattern, flags = "") {
|
|
51
|
+
let out = "";
|
|
52
|
+
let inClass = false;
|
|
53
|
+
// Per open group: whether anything in it repeats (a quantifier with a top over 1).
|
|
54
|
+
const groups = [false];
|
|
55
|
+
// What a quantifier here applies to: a group (and whether it repeats inside), another atom, or nothing.
|
|
56
|
+
let last = null;
|
|
57
|
+
const repeatNow = () => { groups[groups.length - 1] = true; };
|
|
58
|
+
for (let i = 0; i < pattern.length;) {
|
|
59
|
+
const c = pattern[i];
|
|
60
|
+
if (c === "\\") {
|
|
61
|
+
const n = pattern[i + 1];
|
|
62
|
+
// A trailing `\` is written as it is: RegExp refuses it in its own words.
|
|
63
|
+
if (n === undefined)
|
|
64
|
+
out += syntax("\\");
|
|
65
|
+
else
|
|
66
|
+
out += META.has(n) ? literal(n) : syntax("\\") + literal(n);
|
|
67
|
+
i += n === undefined ? 1 : 2;
|
|
68
|
+
last = { group: false, repeats: false };
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (inClass) {
|
|
72
|
+
if (c === "]") {
|
|
73
|
+
inClass = false;
|
|
74
|
+
last = { group: false, repeats: false };
|
|
75
|
+
}
|
|
76
|
+
out += META.has(c) ? syntax(c) : literal(c);
|
|
77
|
+
i++;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (!META.has(c)) {
|
|
81
|
+
out += literal(c);
|
|
82
|
+
last = { group: false, repeats: false };
|
|
83
|
+
i++;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const braces = c === "{" ? BRACES.exec(pattern.slice(i)) : null;
|
|
87
|
+
if (c === "*" || c === "+" || c === "?" || braces) {
|
|
88
|
+
const repeats = braces ? (braces[2] !== undefined ? braces[3] === "" || Number(braces[3]) > 1 : Number(braces[1]) > 1) : c !== "?";
|
|
89
|
+
if (repeats && last?.group && last.repeats)
|
|
90
|
+
throw new SyntaxError(`Invalid regular expression: /${pattern}/: ${NESTED_REPEAT}`);
|
|
91
|
+
if (repeats)
|
|
92
|
+
repeatNow();
|
|
93
|
+
if (braces) {
|
|
94
|
+
out += syntax("{");
|
|
95
|
+
for (const d of braces[0].slice(1, -1))
|
|
96
|
+
out += literal(d);
|
|
97
|
+
out += syntax("}");
|
|
98
|
+
i += braces[0].length;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
out += syntax(c);
|
|
102
|
+
i++;
|
|
103
|
+
}
|
|
104
|
+
// A lazy repeat (`+?`): the `?` is part of it.
|
|
105
|
+
if (pattern[i] === "?") {
|
|
106
|
+
out += syntax("?");
|
|
107
|
+
i++;
|
|
108
|
+
}
|
|
109
|
+
last = null;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (c === "[") {
|
|
113
|
+
inClass = true;
|
|
114
|
+
out += syntax("[");
|
|
115
|
+
i++;
|
|
116
|
+
if (pattern[i] === "^") {
|
|
117
|
+
out += syntax("^");
|
|
118
|
+
i++;
|
|
119
|
+
}
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (c === "(") {
|
|
123
|
+
groups.push(false);
|
|
124
|
+
out += syntax("(");
|
|
125
|
+
i++;
|
|
126
|
+
// `(?:`, `(?=`, `(?<name>`: the `?` opens the group's kind, it repeats nothing.
|
|
127
|
+
if (pattern[i] === "?") {
|
|
128
|
+
out += syntax("?");
|
|
129
|
+
i++;
|
|
130
|
+
}
|
|
131
|
+
last = null;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (c === ")") {
|
|
135
|
+
const repeats = groups.length > 1 ? groups.pop() : false;
|
|
136
|
+
if (repeats)
|
|
137
|
+
repeatNow();
|
|
138
|
+
out += syntax(")");
|
|
139
|
+
last = { group: true, repeats };
|
|
140
|
+
i++;
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
// `.` is an atom; `^`, `$` and `|` leave nothing to repeat; a lone `{`, `}` or `]` is a literal in this mode.
|
|
144
|
+
out += syntax(c);
|
|
145
|
+
last = c === "." || c === "{" || c === "}" || c === "]" ? { group: false, repeats: false } : null;
|
|
146
|
+
i++;
|
|
147
|
+
}
|
|
148
|
+
return new RegExp(out, flags);
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=user-regexp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-regexp.js","sourceRoot":"","sources":["../../src/search/user-regexp.ts"],"names":[],"mappings":"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"}
|