@mrclrchtr/supi-code-intelligence 3.2.0 → 4.0.0
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/README.md +154 -435
- package/node_modules/@mrclrchtr/supi-code-runtime/README.md +8 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +2 -4
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
- package/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
- package/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +10 -1
- package/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +19 -29
- package/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +7 -1
- package/node_modules/@mrclrchtr/supi-code-runtime/src/query-result.ts +42 -0
- package/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +15 -10
- package/node_modules/@mrclrchtr/supi-core/package.json +2 -4
- package/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
- package/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
- package/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
- package/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
- package/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
- package/node_modules/@mrclrchtr/supi-lsp/README.md +72 -62
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/README.md +8 -0
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +2 -4
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +10 -1
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +19 -29
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +7 -1
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/query-result.ts +42 -0
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +15 -10
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/package.json +2 -4
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
- package/node_modules/@mrclrchtr/supi-lsp/package.json +4 -5
- package/node_modules/@mrclrchtr/supi-lsp/src/api.ts +9 -9
- package/node_modules/@mrclrchtr/supi-lsp/src/client/client.ts +70 -41
- package/node_modules/@mrclrchtr/supi-lsp/src/client/transport.ts +16 -13
- package/node_modules/@mrclrchtr/supi-lsp/src/config/config.ts +2 -2
- package/node_modules/@mrclrchtr/supi-lsp/src/config/lsp-settings.ts +0 -2
- package/node_modules/@mrclrchtr/supi-lsp/src/index.ts +6 -6
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-diagnostics.ts +5 -95
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-workspace-recovery.ts +4 -3
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-workspace-symbol.ts +44 -6
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager.ts +47 -65
- package/node_modules/@mrclrchtr/supi-lsp/src/provider/lsp-semantic-provider.ts +132 -79
- package/node_modules/@mrclrchtr/supi-lsp/src/provider/refactor-planning.ts +6 -14
- package/node_modules/@mrclrchtr/supi-lsp/src/session/readiness.ts +38 -0
- package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-controller.ts +87 -75
- package/node_modules/@mrclrchtr/supi-lsp/src/session/runtime-registration.ts +5 -5
- package/node_modules/@mrclrchtr/supi-lsp/src/session/{service-registry.ts → runtime-registry.ts} +163 -71
- package/node_modules/@mrclrchtr/supi-tree-sitter/README.md +4 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/README.md +8 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +2 -4
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/api.ts +10 -1
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/capability/types.ts +19 -29
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/index.ts +7 -1
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/query-result.ts +42 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/src/types.ts +15 -10
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/package.json +2 -4
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/api.ts +0 -4
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/evidence-badge.ts +3 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/index.ts +0 -4
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/llm.ts +0 -10
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/path-utils.ts +19 -15
- package/node_modules/@mrclrchtr/supi-tree-sitter/package.json +4 -21
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/bash/tree-sitter-bash.wasm +0 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/bash/tree-sitter-bash.wasm.json +2 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/c/tree-sitter-c.wasm +0 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/c/tree-sitter-c.wasm.json +2 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/go/tree-sitter-go.wasm +0 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/go/tree-sitter-go.wasm.json +2 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/javascript/tree-sitter-javascript.wasm +0 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/javascript/tree-sitter-javascript.wasm.json +2 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/kotlin/tree-sitter-kotlin.wasm +0 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/kotlin/tree-sitter-kotlin.wasm.json +2 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/python/tree-sitter-python.wasm +0 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/python/tree-sitter-python.wasm.json +2 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/r/tree-sitter-r.wasm +0 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/r/tree-sitter-r.wasm.json +2 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/rust/tree-sitter-rust.wasm.json +1 -1
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/sql/tree-sitter-sql.wasm +0 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/resources/grammars/sql/tree-sitter-sql.wasm.json +3 -3
- package/node_modules/@mrclrchtr/supi-tree-sitter/scripts/generate-kotlin-wasm.mjs +6 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/scripts/generate-sql-wasm.mjs +18 -4
- package/node_modules/@mrclrchtr/supi-tree-sitter/scripts/vendor-wasm.mjs +17 -1
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/api.ts +2 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/coordinates.ts +20 -41
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/index.ts +2 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/language.ts +7 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/operation-support.ts +40 -0
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/session/session.ts +9 -7
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/call-sites.ts +6 -1
- package/node_modules/@mrclrchtr/supi-tree-sitter/src/tool/callees.ts +76 -37
- package/node_modules/yaml/LICENSE +13 -0
- package/node_modules/yaml/README.md +172 -0
- package/node_modules/yaml/bin.mjs +11 -0
- package/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
- package/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
- package/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
- package/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
- package/node_modules/yaml/browser/dist/compose/composer.js +219 -0
- package/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
- package/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
- package/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
- package/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
- package/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
- package/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +225 -0
- package/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
- package/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
- package/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
- package/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
- package/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
- package/node_modules/yaml/browser/dist/doc/Document.js +335 -0
- package/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
- package/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
- package/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
- package/node_modules/yaml/browser/dist/doc/directives.js +176 -0
- package/node_modules/yaml/browser/dist/errors.js +57 -0
- package/node_modules/yaml/browser/dist/index.js +17 -0
- package/node_modules/yaml/browser/dist/log.js +11 -0
- package/node_modules/yaml/browser/dist/nodes/Alias.js +116 -0
- package/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
- package/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
- package/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
- package/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
- package/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
- package/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
- package/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
- package/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
- package/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
- package/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
- package/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
- package/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
- package/node_modules/yaml/browser/dist/parse/cst.js +98 -0
- package/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
- package/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
- package/node_modules/yaml/browser/dist/parse/parser.js +975 -0
- package/node_modules/yaml/browser/dist/public-api.js +102 -0
- package/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
- package/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
- package/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
- package/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
- package/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
- package/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
- package/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
- package/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
- package/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
- package/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
- package/node_modules/yaml/browser/dist/schema/tags.js +96 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
- package/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
- package/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
- package/node_modules/yaml/browser/dist/util.js +11 -0
- package/node_modules/yaml/browser/dist/visit.js +233 -0
- package/node_modules/yaml/browser/index.js +5 -0
- package/node_modules/yaml/browser/package.json +3 -0
- package/node_modules/yaml/dist/cli.d.ts +8 -0
- package/node_modules/yaml/dist/cli.mjs +201 -0
- package/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
- package/node_modules/yaml/dist/compose/compose-collection.js +90 -0
- package/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
- package/node_modules/yaml/dist/compose/compose-doc.js +45 -0
- package/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
- package/node_modules/yaml/dist/compose/compose-node.js +112 -0
- package/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
- package/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
- package/node_modules/yaml/dist/compose/composer.d.ts +63 -0
- package/node_modules/yaml/dist/compose/composer.js +224 -0
- package/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
- package/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
- package/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
- package/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
- package/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
- package/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
- package/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
- package/node_modules/yaml/dist/compose/resolve-end.js +39 -0
- package/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
- package/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
- package/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
- package/node_modules/yaml/dist/compose/resolve-flow-scalar.js +227 -0
- package/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
- package/node_modules/yaml/dist/compose/resolve-props.js +148 -0
- package/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
- package/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
- package/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
- package/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
- package/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
- package/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
- package/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
- package/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
- package/node_modules/yaml/dist/doc/Document.d.ts +141 -0
- package/node_modules/yaml/dist/doc/Document.js +337 -0
- package/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
- package/node_modules/yaml/dist/doc/anchors.js +76 -0
- package/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
- package/node_modules/yaml/dist/doc/applyReviver.js +57 -0
- package/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
- package/node_modules/yaml/dist/doc/createNode.js +90 -0
- package/node_modules/yaml/dist/doc/directives.d.ts +49 -0
- package/node_modules/yaml/dist/doc/directives.js +178 -0
- package/node_modules/yaml/dist/errors.d.ts +21 -0
- package/node_modules/yaml/dist/errors.js +62 -0
- package/node_modules/yaml/dist/index.d.ts +25 -0
- package/node_modules/yaml/dist/index.js +50 -0
- package/node_modules/yaml/dist/log.d.ts +3 -0
- package/node_modules/yaml/dist/log.js +19 -0
- package/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
- package/node_modules/yaml/dist/nodes/Alias.js +118 -0
- package/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
- package/node_modules/yaml/dist/nodes/Collection.js +151 -0
- package/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
- package/node_modules/yaml/dist/nodes/Node.js +40 -0
- package/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
- package/node_modules/yaml/dist/nodes/Pair.js +39 -0
- package/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
- package/node_modules/yaml/dist/nodes/Scalar.js +27 -0
- package/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
- package/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
- package/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
- package/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
- package/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
- package/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
- package/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
- package/node_modules/yaml/dist/nodes/identity.js +53 -0
- package/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
- package/node_modules/yaml/dist/nodes/toJS.js +39 -0
- package/node_modules/yaml/dist/options.d.ts +350 -0
- package/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
- package/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
- package/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
- package/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
- package/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
- package/node_modules/yaml/dist/parse/cst-visit.js +99 -0
- package/node_modules/yaml/dist/parse/cst.d.ts +109 -0
- package/node_modules/yaml/dist/parse/cst.js +112 -0
- package/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
- package/node_modules/yaml/dist/parse/lexer.js +723 -0
- package/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
- package/node_modules/yaml/dist/parse/line-counter.js +41 -0
- package/node_modules/yaml/dist/parse/parser.d.ts +84 -0
- package/node_modules/yaml/dist/parse/parser.js +980 -0
- package/node_modules/yaml/dist/public-api.d.ts +44 -0
- package/node_modules/yaml/dist/public-api.js +107 -0
- package/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
- package/node_modules/yaml/dist/schema/Schema.js +39 -0
- package/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
- package/node_modules/yaml/dist/schema/common/map.js +19 -0
- package/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
- package/node_modules/yaml/dist/schema/common/null.js +17 -0
- package/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
- package/node_modules/yaml/dist/schema/common/seq.js +19 -0
- package/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
- package/node_modules/yaml/dist/schema/common/string.js +16 -0
- package/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
- package/node_modules/yaml/dist/schema/core/bool.js +21 -0
- package/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
- package/node_modules/yaml/dist/schema/core/float.js +47 -0
- package/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
- package/node_modules/yaml/dist/schema/core/int.js +42 -0
- package/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
- package/node_modules/yaml/dist/schema/core/schema.js +25 -0
- package/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
- package/node_modules/yaml/dist/schema/json/schema.js +64 -0
- package/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
- package/node_modules/yaml/dist/schema/tags.d.ts +48 -0
- package/node_modules/yaml/dist/schema/tags.js +99 -0
- package/node_modules/yaml/dist/schema/types.d.ts +92 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
- package/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
- package/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
- package/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
- package/node_modules/yaml/dist/stringify/stringify.js +132 -0
- package/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
- package/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
- package/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
- package/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
- package/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
- package/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
- package/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
- package/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
- package/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
- package/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
- package/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
- package/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
- package/node_modules/yaml/dist/test-events.d.ts +4 -0
- package/node_modules/yaml/dist/test-events.js +134 -0
- package/node_modules/yaml/dist/util.d.ts +16 -0
- package/node_modules/yaml/dist/util.js +28 -0
- package/node_modules/yaml/dist/visit.d.ts +102 -0
- package/node_modules/yaml/dist/visit.js +236 -0
- package/node_modules/yaml/package.json +97 -0
- package/node_modules/yaml/util.js +2 -0
- package/package.json +9 -8
- package/src/analysis/architecture/discovery.ts +213 -227
- package/src/analysis/architecture/manifest.ts +147 -0
- package/src/analysis/architecture/model.ts +119 -52
- package/src/analysis/architecture/workspace-config.ts +229 -0
- package/src/analysis/{coverage/coverage-warnings.ts → capability/capability-warnings.ts} +41 -78
- package/src/analysis/evidence.ts +22 -5
- package/src/analysis/health/diagnostics.ts +183 -0
- package/src/analysis/health/recovery.ts +39 -0
- package/src/analysis/health/signals.ts +20 -0
- package/src/analysis/instruction-files.ts +60 -48
- package/src/analysis/provider.ts +31 -12
- package/src/analysis/readiness.ts +29 -9
- package/src/{tool/refactor-apply → analysis/refactor}/apply.ts +120 -26
- package/src/analysis/refactor/position.ts +6 -0
- package/src/analysis/refactor/safety.ts +4 -11
- package/src/analysis/references/locations.ts +20 -0
- package/src/analysis/references/semantic-refs.ts +21 -11
- package/src/{tool/graph → analysis/relations}/implementations.ts +27 -23
- package/src/analysis/relations/provider-locations.ts +179 -0
- package/src/{tool/graph → analysis/relations}/references.ts +25 -21
- package/src/{tool/graph → analysis/relations}/types.ts +4 -19
- package/src/analysis/search/ast-scan.ts +376 -0
- package/src/analysis/search/call-name.ts +68 -0
- package/src/analysis/search/deadline.ts +84 -0
- package/src/analysis/search/paths.ts +88 -0
- package/src/analysis/search/pattern.ts +290 -246
- package/src/analysis/target/anchored.ts +72 -27
- package/src/analysis/target/file.ts +292 -132
- package/src/analysis/target/identity.ts +237 -0
- package/src/analysis/target/symbol.ts +169 -86
- package/src/analysis/target/types.ts +36 -4
- package/src/api.ts +21 -4
- package/src/app/app.ts +53 -46
- package/src/extension.ts +68 -66
- package/src/session/capability-adapter.ts +26 -118
- package/src/session/find-types.ts +38 -0
- package/src/session/find-workflow.ts +141 -0
- package/src/session/graph/collect.ts +181 -0
- package/src/session/graph-types.ts +77 -0
- package/src/session/graph-workflow.ts +152 -0
- package/src/session/health-types.ts +134 -0
- package/src/session/health-workflow.ts +341 -0
- package/src/session/input/common.ts +216 -0
- package/src/session/input/health-refactor.ts +169 -0
- package/src/session/input/workflows.ts +211 -0
- package/src/session/inspect/collect.ts +304 -0
- package/src/session/inspect/file-point.ts +69 -0
- package/src/session/inspect-types.ts +78 -0
- package/src/session/inspect-workflow.ts +157 -0
- package/src/session/orientation/collect.ts +718 -0
- package/src/session/orientation/context-facts.ts +319 -0
- package/src/session/orientation/context-sections.ts +352 -0
- package/src/session/orientation-types.ts +97 -0
- package/src/session/orientation-workflow.ts +307 -0
- package/src/session/refactor-plans.ts +1 -1
- package/src/session/refactor-types.ts +51 -0
- package/src/session/refactor-workflow.ts +263 -0
- package/src/session/session.ts +263 -234
- package/src/session/target-candidates.ts +60 -0
- package/src/session/target-input.ts +98 -0
- package/src/session/target-store.ts +132 -29
- package/src/session/target-workflow.ts +254 -302
- package/src/session/workflow-control.ts +35 -0
- package/src/substrate/lsp/lifecycle.ts +9 -22
- package/src/substrate/lsp/maintenance.ts +75 -0
- package/src/substrate/lsp/recovery.ts +41 -25
- package/src/substrate/lsp/settings.ts +1 -10
- package/src/substrate/lsp/state.ts +2 -13
- package/src/tool/find/ast-kinds.ts +35 -0
- package/src/tool/find/execute.ts +22 -113
- package/src/tool/find/markdown.ts +85 -221
- package/src/tool/find/modes.ts +5 -0
- package/src/tool/find/render.ts +57 -0
- package/src/tool/find/tui.ts +1 -1
- package/src/tool/graph/calls-md.ts +17 -30
- package/src/tool/graph/execute.ts +42 -103
- package/src/tool/graph/implementations-md.ts +32 -54
- package/src/tool/graph/markdown-base.ts +73 -196
- package/src/tool/graph/provider-location-md.ts +9 -0
- package/src/tool/graph/references-md.ts +34 -27
- package/src/tool/graph/tui.ts +8 -26
- package/src/tool/guidance.ts +31 -48
- package/src/tool/health/execute.ts +15 -56
- package/src/tool/health/markdown.ts +199 -148
- package/src/tool/health/semantic-state.ts +24 -0
- package/src/tool/health/tui.ts +262 -36
- package/src/tool/infra/error-results.ts +0 -2
- package/src/tool/infra/progress.ts +2 -2
- package/src/tool/infra/workflow-control.ts +11 -0
- package/src/tool/inspect/execute.ts +23 -63
- package/src/tool/inspect/markdown.ts +114 -95
- package/src/tool/inspect/tui.ts +7 -7
- package/src/tool/orientation/execute.ts +50 -37
- package/src/tool/orientation/markdown.ts +26 -31
- package/src/tool/orientation/tui.ts +41 -39
- package/src/tool/refactor-apply/execute.ts +23 -9
- package/src/tool/refactor-apply/tui.ts +7 -3
- package/src/tool/refactor-plan/execute.ts +44 -61
- package/src/tool/refactor-plan/markdown.ts +33 -56
- package/src/tool/refactor-plan/tui.ts +10 -11
- package/src/tool/register.ts +6 -5
- package/src/tool/resolve/execute.ts +23 -69
- package/src/tool/resolve/markdown.ts +125 -114
- package/src/tool/resolve/tui.ts +11 -9
- package/src/tool/result/assembly.ts +125 -0
- package/src/tool/result/errors.ts +20 -34
- package/src/tool/result/find.ts +107 -21
- package/src/tool/result/graph.ts +163 -64
- package/src/tool/result/health.ts +170 -73
- package/src/tool/result/inspect.ts +183 -41
- package/src/tool/result/orientation.ts +118 -16
- package/src/tool/result/refactor.ts +101 -21
- package/src/tool/result/resolve.ts +243 -80
- package/src/tool/result/types.ts +100 -56
- package/src/tool/schemas.ts +160 -231
- package/src/tool/specs.ts +57 -168
- package/src/types/details.ts +2 -4
- package/src/types/execution.ts +6 -15
- package/src/types/index.ts +2 -4
- package/src/types/tool-names.ts +1 -2
- package/src/ui/footer.ts +3 -3
- package/src/ui/markdown/gather.ts +17 -65
- package/src/ui/markdown/overview-data.ts +143 -21
- package/src/ui/markdown/overview.ts +27 -8
- package/src/ui/markdown/types.ts +12 -16
- package/src/ui/status-command.ts +39 -31
- package/src/ui/status-overlay.ts +23 -15
- package/src/ui/tui/common.ts +121 -74
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
- package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
- package/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
- package/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
- package/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
- package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
- package/node_modules/@mrclrchtr/supi-lsp/src/diagnostics/diagnostic-augmentation.ts +0 -82
- package/node_modules/@mrclrchtr/supi-lsp/src/diagnostics/diagnostic-context.ts +0 -116
- package/node_modules/@mrclrchtr/supi-lsp/src/diagnostics/diagnostic-display.ts +0 -69
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/capability-index.ts +0 -24
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/client-pool.ts +0 -33
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/diagnostic-store.ts +0 -51
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/manager-stale-resync.ts +0 -47
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/recovery-coordinator.ts +0 -37
- package/node_modules/@mrclrchtr/supi-lsp/src/manager/workspace-router.ts +0 -44
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/abort-utils.ts +0 -31
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/substrate-types.ts +0 -11
- package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/types.ts +0 -2
- package/src/analysis/brief/directory.ts +0 -324
- package/src/analysis/brief/enrich.ts +0 -157
- package/src/analysis/brief/file.ts +0 -84
- package/src/analysis/brief/inventory.ts +0 -177
- package/src/analysis/brief/main.ts +0 -176
- package/src/analysis/brief/models.ts +0 -75
- package/src/analysis/brief/public-brief.ts +0 -179
- package/src/analysis/brief/summarize.ts +0 -208
- package/src/analysis/brief/types.ts +0 -27
- package/src/analysis/brief/use-case.ts +0 -264
- package/src/analysis/search/ripgrep.ts +0 -558
- package/src/analysis/signals/git.ts +0 -89
- package/src/analysis/signals/project.ts +0 -189
- package/src/analysis/target/bridge.ts +0 -152
- package/src/analysis/target/file-resolution.ts +0 -125
- package/src/analysis/target/planner.ts +0 -92
- package/src/analysis/target/query.ts +0 -74
- package/src/analysis/target/resolve-common.ts +0 -115
- package/src/analysis/target/service.ts +0 -229
- package/src/analysis/tests/likely-tests.ts +0 -174
- package/src/analysis/tests/test-discovery.ts +0 -540
- package/src/analysis/tests/vitest.ts +0 -87
- package/src/app/manager.ts +0 -65
- package/src/substrate/lsp/diagnostic-injection.ts +0 -203
- package/src/substrate/lsp/overrides.ts +0 -132
- package/src/tool/find/orchestrate.ts +0 -317
- package/src/tool/find/semantic-search.ts +0 -128
- package/src/tool/graph/collect-relation.ts +0 -372
- package/src/tool/graph/orchestrate.ts +0 -259
- package/src/tool/health/orchestrate.ts +0 -151
- package/src/tool/health/sections/diagnostics.ts +0 -182
- package/src/tool/health/sections/recovery.ts +0 -89
- package/src/tool/health/sections/signals.ts +0 -89
- package/src/tool/impact/analysis.ts +0 -220
- package/src/tool/impact/change-set-impact.ts +0 -152
- package/src/tool/impact/execute.ts +0 -125
- package/src/tool/impact/file-level-impact.ts +0 -82
- package/src/tool/impact/markdown.ts +0 -283
- package/src/tool/impact/orchestrate.ts +0 -97
- package/src/tool/impact/result.ts +0 -2
- package/src/tool/impact/single-impact.ts +0 -90
- package/src/tool/impact/tui.ts +0 -39
- package/src/tool/impact/types.ts +0 -34
- package/src/tool/infra/cross-field.ts +0 -335
- package/src/tool/infra/pipeline.ts +0 -334
- package/src/tool/infra/readiness-message.ts +0 -5
- package/src/tool/inspect/orchestrate.ts +0 -154
- package/src/tool/orientation/deps.ts +0 -63
- package/src/tool/orientation/mode.ts +0 -139
- package/src/tool/orientation/orchestrate.ts +0 -475
- package/src/tool/orientation/precise-target.ts +0 -253
- package/src/tool/params.ts +0 -15
- package/src/tool/refactor-apply/markdown.ts +0 -118
- package/src/tool/refactor-apply/orchestrate.ts +0 -84
- package/src/tool/refactor-plan/orchestrate.ts +0 -355
- package/src/tool/resolve/orchestrate.ts +0 -38
- package/src/tool/result/impact.ts +0 -50
- package/src/ui/markdown/brief.ts +0 -218
- package/src/ui/message-renderer.ts +0 -121
- package/src/ui/tui/index.ts +0 -37
- /package/src/{tool/graph → analysis/relations}/callees.ts +0 -0
|
@@ -1,558 +0,0 @@
|
|
|
1
|
-
// biome-ignore-all lint/style/noExcessiveLinesPerFile: ripgrep abort/process handling, JSON parsing, and path/scope helpers are cohesive search infrastructure
|
|
2
|
-
// Shared search helpers for code-intelligence search and routing helpers.
|
|
3
|
-
|
|
4
|
-
import { type ChildProcess, spawn } from "node:child_process";
|
|
5
|
-
import { existsSync } from "node:fs";
|
|
6
|
-
import * as path from "node:path";
|
|
7
|
-
import { resolveToolPath, uriToFile as uriToFileShared } from "@mrclrchtr/supi-core/path";
|
|
8
|
-
|
|
9
|
-
const LOW_SIGNAL_DIRS = new Set([
|
|
10
|
-
"node_modules",
|
|
11
|
-
".git",
|
|
12
|
-
".pnpm",
|
|
13
|
-
"dist",
|
|
14
|
-
"build",
|
|
15
|
-
"out",
|
|
16
|
-
".next",
|
|
17
|
-
".nuxt",
|
|
18
|
-
"coverage",
|
|
19
|
-
".turbo",
|
|
20
|
-
".cache",
|
|
21
|
-
"__pycache__",
|
|
22
|
-
".tsbuildinfo",
|
|
23
|
-
]);
|
|
24
|
-
|
|
25
|
-
/** Check if a file path contains an obviously low-signal directory segment. */
|
|
26
|
-
export function isLowSignalPath(filePath: string): boolean {
|
|
27
|
-
const segments = filePath.split(path.sep);
|
|
28
|
-
return segments.some((s) => LOW_SIGNAL_DIRS.has(s));
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/** Convert a file:// URI to a file path, matching the shared SuPi normalization. */
|
|
32
|
-
export const uriToFile = uriToFileShared;
|
|
33
|
-
|
|
34
|
-
/** Check whether a resolved file path is inside the current project (within cwd, not under node_modules or .pnpm). */
|
|
35
|
-
export function isInProjectPath(filePath: string, cwd: string): boolean {
|
|
36
|
-
const relativePath = path.relative(cwd, path.resolve(cwd, filePath));
|
|
37
|
-
if (relativePath.startsWith(`..${path.sep}`) || relativePath === "..") return false;
|
|
38
|
-
const normalized = relativePath.replaceAll("\\", "/");
|
|
39
|
-
return !(
|
|
40
|
-
normalized.includes("/node_modules/") ||
|
|
41
|
-
normalized.startsWith("node_modules/") ||
|
|
42
|
-
normalized.includes("/.pnpm/") ||
|
|
43
|
-
normalized.startsWith(".pnpm/")
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/** Result of resolving a user-provided `scope` value to an absolute path. */
|
|
48
|
-
export type ScopeResolution = { kind: "ok"; path: string } | { kind: "error"; reason: string };
|
|
49
|
-
|
|
50
|
-
/** Result of resolving a code_find `scope` value to one or more absolute paths. */
|
|
51
|
-
export type ScopeSetResolution =
|
|
52
|
-
| { kind: "ok"; paths: string[]; display: string | null }
|
|
53
|
-
| { kind: "error"; reason: string };
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Resolve a `scope` value to an absolute path using pi scope semantics:
|
|
57
|
-
* - strip leading `@`
|
|
58
|
-
* - resolve relative paths from `cwd`
|
|
59
|
-
* - require the resolved path to exist
|
|
60
|
-
*/
|
|
61
|
-
export function resolveScope(scope: string | undefined, cwd: string): ScopeResolution {
|
|
62
|
-
if (!scope) return { kind: "ok", path: cwd };
|
|
63
|
-
if (/[,;\s]/.test(scope)) {
|
|
64
|
-
return {
|
|
65
|
-
kind: "error",
|
|
66
|
-
reason: `Scope accepts a single directory or file path, not multiple: \`${scope}\``,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
return resolveSingleScope(scope, cwd);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Resolve a code_find scope input to one or more absolute paths.
|
|
74
|
-
*
|
|
75
|
-
* `code_find` is intentionally more flexible than other code-intelligence tools:
|
|
76
|
-
* it accepts `scope: ["docs", "packages"]` and also splits delimiter-separated
|
|
77
|
-
* strings such as `"docs packages"` only when no exact path by that name exists.
|
|
78
|
-
*/
|
|
79
|
-
export function resolveScopeSet(
|
|
80
|
-
scope: string | readonly string[] | undefined,
|
|
81
|
-
cwd: string,
|
|
82
|
-
): ScopeSetResolution {
|
|
83
|
-
if (scope === undefined) {
|
|
84
|
-
return { kind: "ok", paths: [cwd], display: null };
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const labels = typeof scope === "string" ? splitScopeString(scope, cwd) : [...scope];
|
|
88
|
-
if (labels.length === 0) {
|
|
89
|
-
return { kind: "error", reason: "Scope must include at least one directory or file path." };
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
const resolved: Array<{ label: string; path: string }> = [];
|
|
93
|
-
for (const label of labels) {
|
|
94
|
-
const trimmed = label.trim();
|
|
95
|
-
if (!trimmed) {
|
|
96
|
-
return { kind: "error", reason: "Scope must not include empty path entries." };
|
|
97
|
-
}
|
|
98
|
-
const single = resolveSingleScope(trimmed, cwd);
|
|
99
|
-
if (single.kind === "error") return single;
|
|
100
|
-
resolved.push({ label: trimmed, path: single.path });
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
const byPath = new Map<string, string>();
|
|
104
|
-
for (const entry of resolved) {
|
|
105
|
-
if (!byPath.has(entry.path)) byPath.set(entry.path, entry.label);
|
|
106
|
-
}
|
|
107
|
-
const paths = [...byPath.keys()];
|
|
108
|
-
const uniqueLabels = paths.map((p) => byPath.get(p) ?? p);
|
|
109
|
-
|
|
110
|
-
return {
|
|
111
|
-
kind: "ok",
|
|
112
|
-
paths,
|
|
113
|
-
display: uniqueLabels.length > 0 ? uniqueLabels.join(", ") : null,
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
function resolveSingleScope(scope: string, cwd: string): ScopeResolution {
|
|
118
|
-
const resolved = normalizePath(scope, cwd);
|
|
119
|
-
if (!existsSync(resolved)) {
|
|
120
|
-
return { kind: "error", reason: `Scope path not found: \`${scope}\`` };
|
|
121
|
-
}
|
|
122
|
-
return { kind: "ok", path: resolved };
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
function splitScopeString(scope: string, cwd: string): string[] {
|
|
126
|
-
const trimmed = scope.trim();
|
|
127
|
-
if (!trimmed) return [];
|
|
128
|
-
|
|
129
|
-
const exact = resolveSingleScope(trimmed, cwd);
|
|
130
|
-
if (exact.kind === "ok") return [trimmed];
|
|
131
|
-
|
|
132
|
-
const parts = trimmed
|
|
133
|
-
.split(/[,;\s]+/)
|
|
134
|
-
.map((part) => part.trim())
|
|
135
|
-
.filter((part) => part.length > 0);
|
|
136
|
-
return parts.length > 1 ? parts : [trimmed];
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/** Escape regex special characters. */
|
|
140
|
-
export function escapeRegex(s: string): string {
|
|
141
|
-
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/** Normalize a file/path value: strip leading @, resolve relative to cwd. */
|
|
145
|
-
export function normalizePath(input: string, cwd: string): string {
|
|
146
|
-
return resolveToolPath(cwd, input);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/** Render a file path relative to cwd when it is inside the workspace. */
|
|
150
|
-
export function toDisplayPath(cwd: string, filePath: string): string {
|
|
151
|
-
if (!path.isAbsolute(filePath)) {
|
|
152
|
-
return filePath.replaceAll("\\", "/");
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
const relativePath = path.relative(cwd, filePath);
|
|
156
|
-
if (!relativePath || relativePath === ".") {
|
|
157
|
-
return filePath;
|
|
158
|
-
}
|
|
159
|
-
if (relativePath.startsWith(`..${path.sep}`) || relativePath === "..") {
|
|
160
|
-
return filePath;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
return relativePath.replaceAll("\\", "/");
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
export interface RgMatch {
|
|
167
|
-
file: string;
|
|
168
|
-
line: number;
|
|
169
|
-
text: string;
|
|
170
|
-
/** Context lines surrounding this match (from -C flag). */
|
|
171
|
-
context?: Array<{ line: number; text: string }>;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
/** Result of a ripgrep invocation for callers that need both matches and execution errors. */
|
|
175
|
-
export interface RipgrepRunResult {
|
|
176
|
-
/** Parsed ripgrep matches, if any. */
|
|
177
|
-
matches: RgMatch[];
|
|
178
|
-
/** Non-no-match ripgrep execution error text, such as invalid regex syntax. */
|
|
179
|
-
error?: string;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/** Options for {@link runRipgrep} / {@link runRipgrepDetailed}. */
|
|
183
|
-
export interface RipgrepOptions {
|
|
184
|
-
maxMatches?: number;
|
|
185
|
-
contextLines?: number;
|
|
186
|
-
literal?: boolean;
|
|
187
|
-
filterLowSignal?: boolean;
|
|
188
|
-
/**
|
|
189
|
-
* Abort signal from the agent runtime. When aborted, the ripgrep child is
|
|
190
|
-
* killed and the call rejects with {@link RipgrepAbortedError} so the
|
|
191
|
-
* executor (and pi) can treat the tool call as cancelled rather than
|
|
192
|
-
* silently completing with partial matches.
|
|
193
|
-
*/
|
|
194
|
-
signal?: AbortSignal;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/** Hard upper bound on a single ripgrep invocation, matching the prior `execFileSync` timeout. */
|
|
198
|
-
const RIPGREP_TIMEOUT_MS = 10_000;
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* Thrown by {@link runRipgrepDetailed} when the supplied `AbortSignal` fires.
|
|
202
|
-
* Propagates out of executors so pi cancels the tool call instead of returning
|
|
203
|
-
* partial results.
|
|
204
|
-
*/
|
|
205
|
-
export class RipgrepAbortedError extends Error {
|
|
206
|
-
constructor(signal?: AbortSignal) {
|
|
207
|
-
const reason = signal?.reason;
|
|
208
|
-
super(reason instanceof Error ? reason.message : "ripgrep search was aborted");
|
|
209
|
-
this.name = "RipgrepAbortedError";
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Run ripgrep with JSON output and parse matches, filtering low-signal paths.
|
|
215
|
-
*
|
|
216
|
-
* Async and abort-aware: when `opts.signal` aborts, the ripgrep child is killed
|
|
217
|
-
* and the returned promise rejects with {@link RipgrepAbortedError}. Any
|
|
218
|
-
* non-abort ripgrep execution failure is still treated like an empty match set
|
|
219
|
-
* (or surfaces an error via {@link runRipgrepDetailed}).
|
|
220
|
-
*/
|
|
221
|
-
export async function runRipgrep(
|
|
222
|
-
pattern: string,
|
|
223
|
-
scopePath: string | readonly string[],
|
|
224
|
-
cwd: string,
|
|
225
|
-
opts?: RipgrepOptions,
|
|
226
|
-
): Promise<RgMatch[]> {
|
|
227
|
-
return (await runRipgrepDetailed(pattern, scopePath, cwd, opts)).matches;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Run ripgrep and preserve non-no-match execution errors for callers that need
|
|
232
|
-
* to distinguish invalid regex syntax from a genuine empty search result.
|
|
233
|
-
* Abort-aware: rejects with {@link RipgrepAbortedError} when `opts.signal` fires.
|
|
234
|
-
*/
|
|
235
|
-
export async function runRipgrepDetailed(
|
|
236
|
-
pattern: string,
|
|
237
|
-
scopePath: string | readonly string[],
|
|
238
|
-
cwd: string,
|
|
239
|
-
opts?: RipgrepOptions,
|
|
240
|
-
): Promise<RipgrepRunResult> {
|
|
241
|
-
const filter = opts?.filterLowSignal ?? true;
|
|
242
|
-
let proc: RgProcessResult;
|
|
243
|
-
try {
|
|
244
|
-
proc = await runRgProcess(
|
|
245
|
-
buildRipgrepArgs(pattern, scopePath, opts),
|
|
246
|
-
cwd,
|
|
247
|
-
RIPGREP_TIMEOUT_MS,
|
|
248
|
-
opts?.signal,
|
|
249
|
-
);
|
|
250
|
-
} catch (err: unknown) {
|
|
251
|
-
// Abort propagates so pi cancels the tool call. Any other unexpected spawn
|
|
252
|
-
// failure is treated like an empty match set, preserving prior behavior.
|
|
253
|
-
if (err instanceof RipgrepAbortedError) throw err;
|
|
254
|
-
return { matches: [] };
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
switch (proc.kind) {
|
|
258
|
-
case "missing":
|
|
259
|
-
return {
|
|
260
|
-
matches: [],
|
|
261
|
-
error:
|
|
262
|
-
"ripgrep (rg) is not available. Install it (e.g., `apt install ripgrep` or `brew install ripgrep`).",
|
|
263
|
-
};
|
|
264
|
-
case "ok":
|
|
265
|
-
case "nomatch":
|
|
266
|
-
return { matches: dedupeMatches(parseRgJson(proc.stdout, filter)) };
|
|
267
|
-
case "timeout":
|
|
268
|
-
// Timeout: yield any partial stdout matches with no error surfaced — an
|
|
269
|
-
// improvement over the prior execFileSync path, which discarded partial
|
|
270
|
-
// output on timeout (the timeout error lacked a `status`, so the old
|
|
271
|
-
// handleRipgrepError returned an empty match set).
|
|
272
|
-
return { matches: proc.stdout ? dedupeMatches(parseRgJson(proc.stdout, filter)) : [] };
|
|
273
|
-
case "error":
|
|
274
|
-
return {
|
|
275
|
-
matches: proc.stdout ? dedupeMatches(parseRgJson(proc.stdout, filter)) : [],
|
|
276
|
-
...(proc.stderr.trim() ? { error: proc.stderr.trim() } : {}),
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
function buildRipgrepArgs(
|
|
282
|
-
pattern: string,
|
|
283
|
-
scopePath: string | readonly string[],
|
|
284
|
-
opts?: { maxMatches?: number; contextLines?: number; literal?: boolean },
|
|
285
|
-
): string[] {
|
|
286
|
-
const args = ["--json", "-m", String(opts?.maxMatches ?? 30)];
|
|
287
|
-
if ((opts?.contextLines ?? 0) > 0) {
|
|
288
|
-
args.push("-C", String(opts?.contextLines ?? 0));
|
|
289
|
-
}
|
|
290
|
-
if (opts?.literal) {
|
|
291
|
-
args.push("-F");
|
|
292
|
-
}
|
|
293
|
-
args.push("-e", pattern, ...normalizeScopePathArgs(scopePath));
|
|
294
|
-
return args;
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
function normalizeScopePathArgs(scopePath: string | readonly string[]): string[] {
|
|
298
|
-
const paths = Array.isArray(scopePath) ? scopePath : [scopePath];
|
|
299
|
-
return paths.length > 0 ? [...paths] : ["."];
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
/** Discriminated result of a single ripgrep process run (see {@link runRgProcess}). */
|
|
303
|
-
type RgProcessResult =
|
|
304
|
-
| { kind: "ok"; stdout: string; stderr: string; status: number }
|
|
305
|
-
| { kind: "nomatch"; stdout: string; stderr: string; status: 1 }
|
|
306
|
-
| { kind: "error"; stdout: string; stderr: string; status: number }
|
|
307
|
-
| { kind: "timeout"; stdout: string; stderr: string }
|
|
308
|
-
| { kind: "missing" };
|
|
309
|
-
|
|
310
|
-
/**
|
|
311
|
-
* Spawn ripgrep, collect stdout/stderr, and resolve a discriminated result.
|
|
312
|
-
* Rejects with {@link RipgrepAbortedError} when `signal` aborts (the child is
|
|
313
|
-
* killed with SIGKILL). Maps exit codes: 0 → ok, 1 → nomatch, 2+ → error;
|
|
314
|
-
* ENOENT → missing (rg not installed); timeout → timeout.
|
|
315
|
-
*/
|
|
316
|
-
function runRgProcess(
|
|
317
|
-
args: string[],
|
|
318
|
-
cwd: string,
|
|
319
|
-
timeoutMs: number,
|
|
320
|
-
signal?: AbortSignal,
|
|
321
|
-
): Promise<RgProcessResult> {
|
|
322
|
-
return new Promise<RgProcessResult>((resolve, reject) => {
|
|
323
|
-
let child: ChildProcess;
|
|
324
|
-
try {
|
|
325
|
-
child = spawn("rg", args, { cwd, stdio: ["pipe", "pipe", "pipe"] });
|
|
326
|
-
} catch (err: unknown) {
|
|
327
|
-
if (isCodeError(err, "ENOENT")) {
|
|
328
|
-
resolve({ kind: "missing" });
|
|
329
|
-
return;
|
|
330
|
-
}
|
|
331
|
-
reject(err);
|
|
332
|
-
return;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
let stdout = "";
|
|
336
|
-
let stderr = "";
|
|
337
|
-
let timedOut = false;
|
|
338
|
-
let settled = false;
|
|
339
|
-
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
340
|
-
let abortListener: (() => void) | null = null;
|
|
341
|
-
|
|
342
|
-
const cleanup = (): void => {
|
|
343
|
-
if (timer) clearTimeout(timer);
|
|
344
|
-
if (abortListener && signal) signal.removeEventListener("abort", abortListener);
|
|
345
|
-
};
|
|
346
|
-
const settle = (r: RgProcessResult): void => {
|
|
347
|
-
if (settled) return;
|
|
348
|
-
settled = true;
|
|
349
|
-
cleanup();
|
|
350
|
-
resolve(r);
|
|
351
|
-
};
|
|
352
|
-
const failAbort = (): void => {
|
|
353
|
-
if (settled) return;
|
|
354
|
-
settled = true;
|
|
355
|
-
cleanup();
|
|
356
|
-
try {
|
|
357
|
-
child.kill("SIGKILL");
|
|
358
|
-
} catch {
|
|
359
|
-
// Child may already have exited; ignore.
|
|
360
|
-
}
|
|
361
|
-
reject(new RipgrepAbortedError(signal));
|
|
362
|
-
};
|
|
363
|
-
|
|
364
|
-
// Fast path: signal already aborted before any work is scheduled.
|
|
365
|
-
if (signal?.aborted) {
|
|
366
|
-
failAbort();
|
|
367
|
-
return;
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
child.stdout?.setEncoding("utf-8");
|
|
371
|
-
child.stderr?.setEncoding("utf-8");
|
|
372
|
-
child.stdout?.on("data", (d: string) => {
|
|
373
|
-
stdout += d;
|
|
374
|
-
});
|
|
375
|
-
child.stderr?.on("data", (d: string) => {
|
|
376
|
-
stderr += d;
|
|
377
|
-
});
|
|
378
|
-
|
|
379
|
-
timer = setTimeout(() => {
|
|
380
|
-
timedOut = true;
|
|
381
|
-
try {
|
|
382
|
-
child.kill("SIGTERM");
|
|
383
|
-
} catch {
|
|
384
|
-
// Ignore; the close handler will still fire.
|
|
385
|
-
}
|
|
386
|
-
}, timeoutMs);
|
|
387
|
-
|
|
388
|
-
if (signal) {
|
|
389
|
-
abortListener = () => failAbort();
|
|
390
|
-
signal.addEventListener("abort", abortListener);
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
child.on("error", (err: NodeJS.ErrnoException) => {
|
|
394
|
-
if (settled) return;
|
|
395
|
-
if (isCodeError(err, "ENOENT")) {
|
|
396
|
-
settle({ kind: "missing" });
|
|
397
|
-
return;
|
|
398
|
-
}
|
|
399
|
-
settle({ kind: "error", stdout, stderr, status: -1 });
|
|
400
|
-
});
|
|
401
|
-
|
|
402
|
-
child.on("close", (status: number | null) => {
|
|
403
|
-
if (settled) return;
|
|
404
|
-
if (timedOut) {
|
|
405
|
-
settle({ kind: "timeout", stdout, stderr });
|
|
406
|
-
return;
|
|
407
|
-
}
|
|
408
|
-
if (status === 0) settle({ kind: "ok", stdout, stderr, status });
|
|
409
|
-
else if (status === 1) settle({ kind: "nomatch", stdout, stderr, status });
|
|
410
|
-
else settle({ kind: "error", stdout, stderr, status: status ?? -1 });
|
|
411
|
-
});
|
|
412
|
-
});
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
function isCodeError(err: unknown, code: string): boolean {
|
|
416
|
-
return (
|
|
417
|
-
typeof err === "object" &&
|
|
418
|
-
err !== null &&
|
|
419
|
-
"code" in err &&
|
|
420
|
-
(err as { code: unknown }).code === code
|
|
421
|
-
);
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
interface RawRgEvent {
|
|
425
|
-
type: string;
|
|
426
|
-
data?: {
|
|
427
|
-
path?: { text: string };
|
|
428
|
-
line_number?: number;
|
|
429
|
-
lines?: { text: string };
|
|
430
|
-
};
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: JSON ripgrep output parsing with context line collection
|
|
434
|
-
function parseRgJson(output: string, filterLowSignal: boolean): RgMatch[] {
|
|
435
|
-
const matches: RgMatch[] = [];
|
|
436
|
-
// Pending context lines that precede the next match
|
|
437
|
-
let pendingContext: Array<{ line: number; text: string }> = [];
|
|
438
|
-
|
|
439
|
-
for (const line of output.split("\n")) {
|
|
440
|
-
if (!line.trim()) continue;
|
|
441
|
-
let parsed: RawRgEvent;
|
|
442
|
-
try {
|
|
443
|
-
parsed = JSON.parse(line);
|
|
444
|
-
} catch {
|
|
445
|
-
continue;
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
if (parsed.type === "context" && parsed.data) {
|
|
449
|
-
const lineNum = parsed.data.line_number;
|
|
450
|
-
const text = (parsed.data.lines?.text ?? "").trim();
|
|
451
|
-
if (lineNum) pendingContext.push({ line: lineNum, text });
|
|
452
|
-
continue;
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
if (parsed.type === "match" && parsed.data) {
|
|
456
|
-
const filePath = parsed.data.path?.text;
|
|
457
|
-
const lineNum = parsed.data.line_number;
|
|
458
|
-
const text = (parsed.data.lines?.text ?? "").trim();
|
|
459
|
-
if (filePath && lineNum) {
|
|
460
|
-
// Split pendingContext: lines before this match are "before" context,
|
|
461
|
-
// lines from before this match line that trail the previous match stay with it.
|
|
462
|
-
const beforeCtx = pendingContext.filter((c) => c.line < lineNum);
|
|
463
|
-
const trailingCtx = pendingContext.filter((c) => c.line >= lineNum);
|
|
464
|
-
|
|
465
|
-
// Attach trailing context from previous match to the last accepted match
|
|
466
|
-
if (beforeCtx.length > 0 && matches.length > 0) {
|
|
467
|
-
const prev = matches[matches.length - 1];
|
|
468
|
-
const prevTrailing = beforeCtx.filter((c) => c.line > prev.line);
|
|
469
|
-
if (prevTrailing.length > 0) {
|
|
470
|
-
prev.context = [...(prev.context ?? []), ...prevTrailing];
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
if (filterLowSignal && isLowSignalPath(filePath)) {
|
|
475
|
-
pendingContext = [];
|
|
476
|
-
continue;
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
const match: RgMatch = { file: filePath, line: lineNum, text };
|
|
480
|
-
// Leading context: lines just before this match
|
|
481
|
-
const leadingCtx =
|
|
482
|
-
matches.length > 0
|
|
483
|
-
? beforeCtx.filter(
|
|
484
|
-
(c) => c.line <= lineNum && c.line > (matches[matches.length - 1]?.line ?? 0),
|
|
485
|
-
)
|
|
486
|
-
: beforeCtx;
|
|
487
|
-
if (leadingCtx.length > 0) {
|
|
488
|
-
match.context = leadingCtx;
|
|
489
|
-
}
|
|
490
|
-
// Also include any pending context at/after this match's line (trailing from rg ordering)
|
|
491
|
-
pendingContext = trailingCtx;
|
|
492
|
-
matches.push(match);
|
|
493
|
-
} else {
|
|
494
|
-
pendingContext = [];
|
|
495
|
-
}
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
// Attach any trailing context lines to the last match
|
|
500
|
-
if (pendingContext.length > 0 && matches.length > 0) {
|
|
501
|
-
const last = matches[matches.length - 1];
|
|
502
|
-
last.context = [...(last.context ?? []), ...pendingContext];
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
return matches;
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
function dedupeMatches(matches: RgMatch[]): RgMatch[] {
|
|
509
|
-
const seen = new Set<string>();
|
|
510
|
-
const deduped: RgMatch[] = [];
|
|
511
|
-
for (const match of matches) {
|
|
512
|
-
const key = `${match.file}\u0000${match.line}\u0000${match.text}`;
|
|
513
|
-
if (seen.has(key)) continue;
|
|
514
|
-
seen.add(key);
|
|
515
|
-
deduped.push(match);
|
|
516
|
-
}
|
|
517
|
-
return deduped;
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
/**
|
|
521
|
-
* Minimal interface for a reference-like object with a URI and range start.
|
|
522
|
-
* Used by {@link filterOutDeclaration} to avoid coupling to a specific LspRef type.
|
|
523
|
-
*/
|
|
524
|
-
export interface HasLspPosition {
|
|
525
|
-
uri: string;
|
|
526
|
-
range: { start: { line: number; character: number } };
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
/**
|
|
530
|
-
* Filter out the declaration/definition location from LSP references.
|
|
531
|
-
* LSP's `textDocument/references` includes the declaration by default;
|
|
532
|
-
* for callers/affected analysis, the declaration is not a call site or affected reference.
|
|
533
|
-
*
|
|
534
|
-
* Uses {@link uriToFile} for robust URI-to-path conversion.
|
|
535
|
-
*/
|
|
536
|
-
export function filterOutDeclaration<T extends HasLspPosition>(
|
|
537
|
-
refs: T[],
|
|
538
|
-
targetFile: string,
|
|
539
|
-
targetPos: { line: number; character: number },
|
|
540
|
-
): T[] {
|
|
541
|
-
return refs.filter((ref) => {
|
|
542
|
-
const filePath = uriToFile(ref.uri);
|
|
543
|
-
if (filePath !== targetFile) return true;
|
|
544
|
-
const start = ref.range.start;
|
|
545
|
-
return start.line !== targetPos.line || start.character !== targetPos.character;
|
|
546
|
-
});
|
|
547
|
-
}
|
|
548
|
-
|
|
549
|
-
/** Group matches by file. */
|
|
550
|
-
export function groupByFile(matches: RgMatch[]): Map<string, RgMatch[]> {
|
|
551
|
-
const byFile = new Map<string, RgMatch[]>();
|
|
552
|
-
for (const m of matches) {
|
|
553
|
-
const group = byFile.get(m.file) ?? [];
|
|
554
|
-
group.push(m);
|
|
555
|
-
byFile.set(m.file, group);
|
|
556
|
-
}
|
|
557
|
-
return byFile;
|
|
558
|
-
}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { execFileSync } from "node:child_process";
|
|
2
|
-
import { createEvidenceList, renderEvidenceListDisclosure } from "../evidence.ts";
|
|
3
|
-
|
|
4
|
-
function scrubGitEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {
|
|
5
|
-
const next = { ...env };
|
|
6
|
-
for (const key of Object.keys(next)) {
|
|
7
|
-
if (key.startsWith("GIT_")) {
|
|
8
|
-
delete next[key];
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
return next;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
function execGit(cwd: string, args: string[]): string {
|
|
15
|
-
return execFileSync("git", args, {
|
|
16
|
-
cwd,
|
|
17
|
-
encoding: "utf-8",
|
|
18
|
-
env: scrubGitEnv(process.env),
|
|
19
|
-
stdio: ["ignore", "pipe", "ignore"],
|
|
20
|
-
timeout: 5000,
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export interface GitContext {
|
|
25
|
-
branch: string;
|
|
26
|
-
dirtyFiles: string[];
|
|
27
|
-
lastCommitMessage: string | null;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export function gatherGitContext(cwd: string): GitContext | null {
|
|
31
|
-
try {
|
|
32
|
-
const branch = execGit(cwd, ["branch", "--show-current"]).trim();
|
|
33
|
-
|
|
34
|
-
const status = execGit(cwd, ["status", "--porcelain"]).trim();
|
|
35
|
-
|
|
36
|
-
const dirtyFiles = status.split("\n").filter(Boolean).map(parsePorcelainPath);
|
|
37
|
-
|
|
38
|
-
let lastCommitMessage: string | null = null;
|
|
39
|
-
try {
|
|
40
|
-
lastCommitMessage = execGit(cwd, ["log", "-1", "--format=%s"]).trim();
|
|
41
|
-
} catch {
|
|
42
|
-
// No commits yet
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
return { branch, dirtyFiles, lastCommitMessage };
|
|
46
|
-
} catch {
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export function formatGitContext(ctx: GitContext): string {
|
|
52
|
-
const lines: string[] = [];
|
|
53
|
-
lines.push("## Git Context");
|
|
54
|
-
lines.push("");
|
|
55
|
-
lines.push(`Branch: \`${ctx.branch}\``);
|
|
56
|
-
if (ctx.dirtyFiles.length > 0) {
|
|
57
|
-
lines.push(
|
|
58
|
-
`Uncommitted: ${ctx.dirtyFiles.length} file${ctx.dirtyFiles.length !== 1 ? "s" : ""}`,
|
|
59
|
-
);
|
|
60
|
-
const evidence = createEvidenceList({
|
|
61
|
-
key: "health.dirtyFiles",
|
|
62
|
-
items: ctx.dirtyFiles,
|
|
63
|
-
maxResults: 5,
|
|
64
|
-
});
|
|
65
|
-
for (const f of evidence.items) {
|
|
66
|
-
lines.push(`- \`${f}\``);
|
|
67
|
-
}
|
|
68
|
-
const disclosure = renderEvidenceListDisclosure(evidence);
|
|
69
|
-
if (disclosure) {
|
|
70
|
-
lines.push(disclosure);
|
|
71
|
-
}
|
|
72
|
-
} else {
|
|
73
|
-
lines.push("Working tree clean.");
|
|
74
|
-
}
|
|
75
|
-
if (ctx.lastCommitMessage) {
|
|
76
|
-
lines.push(`Last commit: \`${ctx.lastCommitMessage}\``);
|
|
77
|
-
}
|
|
78
|
-
lines.push("");
|
|
79
|
-
return lines.join("\n");
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function parsePorcelainPath(line: string): string {
|
|
83
|
-
const rawPath = line[2] === " " ? line.slice(3) : line.slice(2);
|
|
84
|
-
const renameSeparator = " -> ";
|
|
85
|
-
const renamedPath = rawPath.includes(renameSeparator)
|
|
86
|
-
? (rawPath.split(renameSeparator).at(-1) ?? rawPath)
|
|
87
|
-
: rawPath;
|
|
88
|
-
return renamedPath.trim();
|
|
89
|
-
}
|