@cstart/coldstart 2.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 +236 -0
- package/dist/cache/disk-cache.d.ts +14 -0
- package/dist/cache/disk-cache.d.ts.map +1 -0
- package/dist/cache/disk-cache.js +371 -0
- package/dist/cache/disk-cache.js.map +1 -0
- package/dist/cli.d.ts +18 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +206 -0
- package/dist/cli.js.map +1 -0
- package/dist/constants.d.ts +8 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +111 -0
- package/dist/constants.js.map +1 -0
- package/dist/daemon-lock.d.ts +63 -0
- package/dist/daemon-lock.d.ts.map +1 -0
- package/dist/daemon-lock.js +218 -0
- package/dist/daemon-lock.js.map +1 -0
- package/dist/daemon-log.d.ts +26 -0
- package/dist/daemon-log.d.ts.map +1 -0
- package/dist/daemon-log.js +110 -0
- package/dist/daemon-log.js.map +1 -0
- package/dist/index-manager.d.ts +103 -0
- package/dist/index-manager.d.ts.map +1 -0
- package/dist/index-manager.js +361 -0
- package/dist/index-manager.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +724 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/content-tokens.d.ts +74 -0
- package/dist/indexer/content-tokens.d.ts.map +1 -0
- package/dist/indexer/content-tokens.js +406 -0
- package/dist/indexer/content-tokens.js.map +1 -0
- package/dist/indexer/cpp-include-roots.d.ts +7 -0
- package/dist/indexer/cpp-include-roots.d.ts.map +1 -0
- package/dist/indexer/cpp-include-roots.js +166 -0
- package/dist/indexer/cpp-include-roots.js.map +1 -0
- package/dist/indexer/csharp-synthetic.d.ts +9 -0
- package/dist/indexer/csharp-synthetic.d.ts.map +1 -0
- package/dist/indexer/csharp-synthetic.js +51 -0
- package/dist/indexer/csharp-synthetic.js.map +1 -0
- package/dist/indexer/django-synthetic.d.ts +12 -0
- package/dist/indexer/django-synthetic.d.ts.map +1 -0
- package/dist/indexer/django-synthetic.js +49 -0
- package/dist/indexer/django-synthetic.js.map +1 -0
- package/dist/indexer/extractors/angularjs.d.ts +16 -0
- package/dist/indexer/extractors/angularjs.d.ts.map +1 -0
- package/dist/indexer/extractors/angularjs.js +49 -0
- package/dist/indexer/extractors/angularjs.js.map +1 -0
- package/dist/indexer/extractors/cpp.d.ts +9 -0
- package/dist/indexer/extractors/cpp.d.ts.map +1 -0
- package/dist/indexer/extractors/cpp.js +254 -0
- package/dist/indexer/extractors/cpp.js.map +1 -0
- package/dist/indexer/extractors/csharp.d.ts +19 -0
- package/dist/indexer/extractors/csharp.d.ts.map +1 -0
- package/dist/indexer/extractors/csharp.js +327 -0
- package/dist/indexer/extractors/csharp.js.map +1 -0
- package/dist/indexer/extractors/env.d.ts +9 -0
- package/dist/indexer/extractors/env.d.ts.map +1 -0
- package/dist/indexer/extractors/env.js +43 -0
- package/dist/indexer/extractors/env.js.map +1 -0
- package/dist/indexer/extractors/go.d.ts +9 -0
- package/dist/indexer/extractors/go.d.ts.map +1 -0
- package/dist/indexer/extractors/go.js +227 -0
- package/dist/indexer/extractors/go.js.map +1 -0
- package/dist/indexer/extractors/graphql.d.ts +22 -0
- package/dist/indexer/extractors/graphql.d.ts.map +1 -0
- package/dist/indexer/extractors/graphql.js +88 -0
- package/dist/indexer/extractors/graphql.js.map +1 -0
- package/dist/indexer/extractors/groovy.d.ts +9 -0
- package/dist/indexer/extractors/groovy.d.ts.map +1 -0
- package/dist/indexer/extractors/groovy.js +356 -0
- package/dist/indexer/extractors/groovy.js.map +1 -0
- package/dist/indexer/extractors/java.d.ts +10 -0
- package/dist/indexer/extractors/java.d.ts.map +1 -0
- package/dist/indexer/extractors/java.js +586 -0
- package/dist/indexer/extractors/java.js.map +1 -0
- package/dist/indexer/extractors/kotlin.d.ts +10 -0
- package/dist/indexer/extractors/kotlin.d.ts.map +1 -0
- package/dist/indexer/extractors/kotlin.js +398 -0
- package/dist/indexer/extractors/kotlin.js.map +1 -0
- package/dist/indexer/extractors/node-helpers.d.ts +13 -0
- package/dist/indexer/extractors/node-helpers.d.ts.map +1 -0
- package/dist/indexer/extractors/node-helpers.js +17 -0
- package/dist/indexer/extractors/node-helpers.js.map +1 -0
- package/dist/indexer/extractors/parser-factory.d.ts +4 -0
- package/dist/indexer/extractors/parser-factory.d.ts.map +1 -0
- package/dist/indexer/extractors/parser-factory.js +28 -0
- package/dist/indexer/extractors/parser-factory.js.map +1 -0
- package/dist/indexer/extractors/php.d.ts +17 -0
- package/dist/indexer/extractors/php.d.ts.map +1 -0
- package/dist/indexer/extractors/php.js +363 -0
- package/dist/indexer/extractors/php.js.map +1 -0
- package/dist/indexer/extractors/python.d.ts +14 -0
- package/dist/indexer/extractors/python.d.ts.map +1 -0
- package/dist/indexer/extractors/python.js +449 -0
- package/dist/indexer/extractors/python.js.map +1 -0
- package/dist/indexer/extractors/ruby.d.ts +10 -0
- package/dist/indexer/extractors/ruby.d.ts.map +1 -0
- package/dist/indexer/extractors/ruby.js +996 -0
- package/dist/indexer/extractors/ruby.js.map +1 -0
- package/dist/indexer/extractors/rust.d.ts +9 -0
- package/dist/indexer/extractors/rust.d.ts.map +1 -0
- package/dist/indexer/extractors/rust.js +322 -0
- package/dist/indexer/extractors/rust.js.map +1 -0
- package/dist/indexer/extractors/toml.d.ts +9 -0
- package/dist/indexer/extractors/toml.d.ts.map +1 -0
- package/dist/indexer/extractors/toml.js +84 -0
- package/dist/indexer/extractors/toml.js.map +1 -0
- package/dist/indexer/extractors/xml.d.ts +9 -0
- package/dist/indexer/extractors/xml.d.ts.map +1 -0
- package/dist/indexer/extractors/xml.js +163 -0
- package/dist/indexer/extractors/xml.js.map +1 -0
- package/dist/indexer/extractors/yaml.d.ts +9 -0
- package/dist/indexer/extractors/yaml.d.ts.map +1 -0
- package/dist/indexer/extractors/yaml.js +117 -0
- package/dist/indexer/extractors/yaml.js.map +1 -0
- package/dist/indexer/git.d.ts +19 -0
- package/dist/indexer/git.d.ts.map +1 -0
- package/dist/indexer/git.js +55 -0
- package/dist/indexer/git.js.map +1 -0
- package/dist/indexer/graph.d.ts +7 -0
- package/dist/indexer/graph.d.ts.map +1 -0
- package/dist/indexer/graph.js +20 -0
- package/dist/indexer/graph.js.map +1 -0
- package/dist/indexer/indexed-file.d.ts +15 -0
- package/dist/indexer/indexed-file.d.ts.map +1 -0
- package/dist/indexer/indexed-file.js +50 -0
- package/dist/indexer/indexed-file.js.map +1 -0
- package/dist/indexer/invariants.d.ts +15 -0
- package/dist/indexer/invariants.d.ts.map +1 -0
- package/dist/indexer/invariants.js +96 -0
- package/dist/indexer/invariants.js.map +1 -0
- package/dist/indexer/laravel-synthetic.d.ts +10 -0
- package/dist/indexer/laravel-synthetic.d.ts.map +1 -0
- package/dist/indexer/laravel-synthetic.js +78 -0
- package/dist/indexer/laravel-synthetic.js.map +1 -0
- package/dist/indexer/parser.d.ts +4 -0
- package/dist/indexer/parser.d.ts.map +1 -0
- package/dist/indexer/parser.js +499 -0
- package/dist/indexer/parser.js.map +1 -0
- package/dist/indexer/patch.d.ts +3 -0
- package/dist/indexer/patch.d.ts.map +1 -0
- package/dist/indexer/patch.js +291 -0
- package/dist/indexer/patch.js.map +1 -0
- package/dist/indexer/rails-synthetic.d.ts +11 -0
- package/dist/indexer/rails-synthetic.d.ts.map +1 -0
- package/dist/indexer/rails-synthetic.js +80 -0
- package/dist/indexer/rails-synthetic.js.map +1 -0
- package/dist/indexer/reconcile.d.ts +9 -0
- package/dist/indexer/reconcile.d.ts.map +1 -0
- package/dist/indexer/reconcile.js +96 -0
- package/dist/indexer/reconcile.js.map +1 -0
- package/dist/indexer/resolvers/cpp.d.ts +15 -0
- package/dist/indexer/resolvers/cpp.d.ts.map +1 -0
- package/dist/indexer/resolvers/cpp.js +35 -0
- package/dist/indexer/resolvers/cpp.js.map +1 -0
- package/dist/indexer/resolvers/csharp.d.ts +2 -0
- package/dist/indexer/resolvers/csharp.d.ts.map +1 -0
- package/dist/indexer/resolvers/csharp.js +89 -0
- package/dist/indexer/resolvers/csharp.js.map +1 -0
- package/dist/indexer/resolvers/generic.d.ts +10 -0
- package/dist/indexer/resolvers/generic.d.ts.map +1 -0
- package/dist/indexer/resolvers/generic.js +35 -0
- package/dist/indexer/resolvers/generic.js.map +1 -0
- package/dist/indexer/resolvers/go.d.ts +2 -0
- package/dist/indexer/resolvers/go.d.ts.map +1 -0
- package/dist/indexer/resolvers/go.js +171 -0
- package/dist/indexer/resolvers/go.js.map +1 -0
- package/dist/indexer/resolvers/index.d.ts +26 -0
- package/dist/indexer/resolvers/index.d.ts.map +1 -0
- package/dist/indexer/resolvers/index.js +301 -0
- package/dist/indexer/resolvers/index.js.map +1 -0
- package/dist/indexer/resolvers/java.d.ts +17 -0
- package/dist/indexer/resolvers/java.d.ts.map +1 -0
- package/dist/indexer/resolvers/java.js +104 -0
- package/dist/indexer/resolvers/java.js.map +1 -0
- package/dist/indexer/resolvers/php.d.ts +2 -0
- package/dist/indexer/resolvers/php.d.ts.map +1 -0
- package/dist/indexer/resolvers/php.js +108 -0
- package/dist/indexer/resolvers/php.js.map +1 -0
- package/dist/indexer/resolvers/python.d.ts +17 -0
- package/dist/indexer/resolvers/python.d.ts.map +1 -0
- package/dist/indexer/resolvers/python.js +63 -0
- package/dist/indexer/resolvers/python.js.map +1 -0
- package/dist/indexer/resolvers/ruby.d.ts +13 -0
- package/dist/indexer/resolvers/ruby.d.ts.map +1 -0
- package/dist/indexer/resolvers/ruby.js +199 -0
- package/dist/indexer/resolvers/ruby.js.map +1 -0
- package/dist/indexer/resolvers/rust.d.ts +12 -0
- package/dist/indexer/resolvers/rust.d.ts.map +1 -0
- package/dist/indexer/resolvers/rust.js +61 -0
- package/dist/indexer/resolvers/rust.js.map +1 -0
- package/dist/indexer/resolvers/shared.d.ts +18 -0
- package/dist/indexer/resolvers/shared.d.ts.map +1 -0
- package/dist/indexer/resolvers/shared.js +71 -0
- package/dist/indexer/resolvers/shared.js.map +1 -0
- package/dist/indexer/rust-workspace.d.ts +25 -0
- package/dist/indexer/rust-workspace.d.ts.map +1 -0
- package/dist/indexer/rust-workspace.js +155 -0
- package/dist/indexer/rust-workspace.js.map +1 -0
- package/dist/indexer/symbol-edges.d.ts +19 -0
- package/dist/indexer/symbol-edges.d.ts.map +1 -0
- package/dist/indexer/symbol-edges.js +117 -0
- package/dist/indexer/symbol-edges.js.map +1 -0
- package/dist/indexer/tokenize.d.ts +26 -0
- package/dist/indexer/tokenize.d.ts.map +1 -0
- package/dist/indexer/tokenize.js +200 -0
- package/dist/indexer/tokenize.js.map +1 -0
- package/dist/indexer/ts-parser.d.ts +10 -0
- package/dist/indexer/ts-parser.d.ts.map +1 -0
- package/dist/indexer/ts-parser.js +605 -0
- package/dist/indexer/ts-parser.js.map +1 -0
- package/dist/indexer/walker.d.ts +9 -0
- package/dist/indexer/walker.d.ts.map +1 -0
- package/dist/indexer/walker.js +91 -0
- package/dist/indexer/walker.js.map +1 -0
- package/dist/init.d.ts +111 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +787 -0
- package/dist/init.js.map +1 -0
- package/dist/kb/cli.d.ts +2 -0
- package/dist/kb/cli.d.ts.map +1 -0
- package/dist/kb/cli.js +377 -0
- package/dist/kb/cli.js.map +1 -0
- package/dist/kb/commit.d.ts +6 -0
- package/dist/kb/commit.d.ts.map +1 -0
- package/dist/kb/commit.js +84 -0
- package/dist/kb/commit.js.map +1 -0
- package/dist/kb/fold.d.ts +42 -0
- package/dist/kb/fold.d.ts.map +1 -0
- package/dist/kb/fold.js +285 -0
- package/dist/kb/fold.js.map +1 -0
- package/dist/kb/freshness.d.ts +9 -0
- package/dist/kb/freshness.d.ts.map +1 -0
- package/dist/kb/freshness.js +52 -0
- package/dist/kb/freshness.js.map +1 -0
- package/dist/kb/git.d.ts +4 -0
- package/dist/kb/git.d.ts.map +1 -0
- package/dist/kb/git.js +28 -0
- package/dist/kb/git.js.map +1 -0
- package/dist/kb/ids.d.ts +8 -0
- package/dist/kb/ids.d.ts.map +1 -0
- package/dist/kb/ids.js +42 -0
- package/dist/kb/ids.js.map +1 -0
- package/dist/kb/lint.d.ts +23 -0
- package/dist/kb/lint.d.ts.map +1 -0
- package/dist/kb/lint.js +102 -0
- package/dist/kb/lint.js.map +1 -0
- package/dist/kb/lookup.d.ts +55 -0
- package/dist/kb/lookup.d.ts.map +1 -0
- package/dist/kb/lookup.js +92 -0
- package/dist/kb/lookup.js.map +1 -0
- package/dist/kb/notes-index.d.ts +31 -0
- package/dist/kb/notes-index.d.ts.map +1 -0
- package/dist/kb/notes-index.js +0 -0
- package/dist/kb/notes-index.js.map +1 -0
- package/dist/kb/raw-log.d.ts +34 -0
- package/dist/kb/raw-log.d.ts.map +1 -0
- package/dist/kb/raw-log.js +106 -0
- package/dist/kb/raw-log.js.map +1 -0
- package/dist/kb/render.d.ts +17 -0
- package/dist/kb/render.d.ts.map +1 -0
- package/dist/kb/render.js +101 -0
- package/dist/kb/render.js.map +1 -0
- package/dist/kb/search.d.ts +110 -0
- package/dist/kb/search.d.ts.map +1 -0
- package/dist/kb/search.js +453 -0
- package/dist/kb/search.js.map +1 -0
- package/dist/kb/store.d.ts +35 -0
- package/dist/kb/store.d.ts.map +1 -0
- package/dist/kb/store.js +160 -0
- package/dist/kb/store.js.map +1 -0
- package/dist/kb/types.d.ts +142 -0
- package/dist/kb/types.d.ts.map +1 -0
- package/dist/kb/types.js +13 -0
- package/dist/kb/types.js.map +1 -0
- package/dist/kb/view-template.d.ts +8 -0
- package/dist/kb/view-template.d.ts.map +1 -0
- package/dist/kb/view-template.js +8 -0
- package/dist/kb/view-template.js.map +1 -0
- package/dist/kb/view.d.ts +42 -0
- package/dist/kb/view.d.ts.map +1 -0
- package/dist/kb/view.js +118 -0
- package/dist/kb/view.js.map +1 -0
- package/dist/kb/write.d.ts +72 -0
- package/dist/kb/write.d.ts.map +1 -0
- package/dist/kb/write.js +345 -0
- package/dist/kb/write.js.map +1 -0
- package/dist/keeper-state.d.ts +29 -0
- package/dist/keeper-state.d.ts.map +1 -0
- package/dist/keeper-state.js +89 -0
- package/dist/keeper-state.js.map +1 -0
- package/dist/keeper.d.ts +23 -0
- package/dist/keeper.d.ts.map +1 -0
- package/dist/keeper.js +105 -0
- package/dist/keeper.js.map +1 -0
- package/dist/migrate.d.ts +9 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +102 -0
- package/dist/migrate.js.map +1 -0
- package/dist/restart.d.ts +15 -0
- package/dist/restart.d.ts.map +1 -0
- package/dist/restart.js +48 -0
- package/dist/restart.js.map +1 -0
- package/dist/server/find.d.ts +39 -0
- package/dist/server/find.d.ts.map +1 -0
- package/dist/server/find.js +979 -0
- package/dist/server/find.js.map +1 -0
- package/dist/server/mcp.d.ts +117 -0
- package/dist/server/mcp.d.ts.map +1 -0
- package/dist/server/mcp.js +301 -0
- package/dist/server/mcp.js.map +1 -0
- package/dist/server/searcher.d.ts +14 -0
- package/dist/server/searcher.d.ts.map +1 -0
- package/dist/server/searcher.js +146 -0
- package/dist/server/searcher.js.map +1 -0
- package/dist/server/tools.d.ts +17 -0
- package/dist/server/tools.d.ts.map +1 -0
- package/dist/server/tools.js +875 -0
- package/dist/server/tools.js.map +1 -0
- package/dist/status.d.ts +12 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +157 -0
- package/dist/status.js.map +1 -0
- package/dist/types.d.ts +138 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/watcher.d.ts +11 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +67 -0
- package/dist/watcher.js.map +1 -0
- package/hooks/canonical-find-key.mjs +68 -0
- package/hooks/codex-find-nudge.mjs +15 -0
- package/hooks/codex-find-preguard.mjs +14 -0
- package/hooks/codex-kb-elicit.mjs +329 -0
- package/hooks/codex-kb-recall.mjs +151 -0
- package/hooks/codex-nudge-handler.mjs +370 -0
- package/hooks/codex-preguard-handler.mjs +75 -0
- package/hooks/codex-run-hook.mjs +132 -0
- package/hooks/coldstart-call.mjs +58 -0
- package/hooks/cursor-find-nudge.mjs +15 -0
- package/hooks/cursor-find-preguard.mjs +14 -0
- package/hooks/cursor-input.mjs +72 -0
- package/hooks/cursor-kb-elicit.mjs +335 -0
- package/hooks/cursor-kb-recall.mjs +138 -0
- package/hooks/cursor-nudge-handler.mjs +33 -0
- package/hooks/cursor-preguard-handler.mjs +39 -0
- package/hooks/cursor-run-hook.mjs +129 -0
- package/hooks/find-nudge.mjs +15 -0
- package/hooks/find-preguard.mjs +14 -0
- package/hooks/kb-elicit.mjs +334 -0
- package/hooks/kb-recall.mjs +151 -0
- package/hooks/nudge-handler.mjs +370 -0
- package/hooks/preguard-handler.mjs +75 -0
- package/hooks/run-hook.mjs +132 -0
- package/package.json +69 -0
- package/templates/coldstart.cli.md +60 -0
- package/templates/coldstart.mcp.md +59 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { childrenOfType, firstChildOfType } from './node-helpers.js';
|
|
3
|
+
import { makeParser } from './parser-factory.js';
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
6
|
+
const xmlModule = require('@tree-sitter-grammars/tree-sitter-xml');
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
|
+
const getParser = makeParser(xmlModule.xml);
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Helpers
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
/**
|
|
13
|
+
* Extract the quoted string value from an AttValue node.
|
|
14
|
+
* AttValue text includes the quotes, e.g., '"userService"' or "'foo'".
|
|
15
|
+
*/
|
|
16
|
+
function unquoteAttValue(text) {
|
|
17
|
+
return text.slice(1, -1);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Check if attribute name matches a target after considering namespaces.
|
|
21
|
+
* Matches 'id', 'name:id', 'android:id', etc.
|
|
22
|
+
*/
|
|
23
|
+
function attrNameMatches(attrName, targetName) {
|
|
24
|
+
return attrName === targetName || attrName.endsWith(`:${targetName}`);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Walk element nodes recursively and extract symbols.
|
|
28
|
+
* Skips prolog (comments) and only extracts from element nodes.
|
|
29
|
+
*/
|
|
30
|
+
function extractSymbolsFromElement(elemNode, symbols, seen, fileId) {
|
|
31
|
+
// Find the tag node (STag for paired tags, EmptyElemTag for self-closing)
|
|
32
|
+
const stag = firstChildOfType(elemNode, 'STag');
|
|
33
|
+
const emptytag = firstChildOfType(elemNode, 'EmptyElemTag');
|
|
34
|
+
const tagNode = stag || emptytag;
|
|
35
|
+
if (tagNode) {
|
|
36
|
+
const nameNode = firstChildOfType(tagNode, 'Name');
|
|
37
|
+
const tagName = nameNode?.text ?? '';
|
|
38
|
+
// Visit attributes for id/name/key/ref and class (they're children of the tag node)
|
|
39
|
+
const attrs = childrenOfType(tagNode, 'Attribute');
|
|
40
|
+
for (const attr of attrs) {
|
|
41
|
+
const attrNameNode = firstChildOfType(attr, 'Name');
|
|
42
|
+
const valueNode = firstChildOfType(attr, 'AttValue');
|
|
43
|
+
if (!attrNameNode || !valueNode)
|
|
44
|
+
continue;
|
|
45
|
+
const attrName = attrNameNode.text;
|
|
46
|
+
const rawValue = valueNode.text;
|
|
47
|
+
const value = unquoteAttValue(rawValue);
|
|
48
|
+
// Extract id/name/key/ref attribute values (handle namespaced attributes like android:id)
|
|
49
|
+
if ((attrNameMatches(attrName, 'id') || attrNameMatches(attrName, 'name') ||
|
|
50
|
+
attrNameMatches(attrName, 'key') || attrNameMatches(attrName, 'ref')) &&
|
|
51
|
+
value) {
|
|
52
|
+
if (!seen.has(value)) {
|
|
53
|
+
seen.add(value);
|
|
54
|
+
symbols.push({
|
|
55
|
+
id: `${fileId}#${value}`,
|
|
56
|
+
name: value,
|
|
57
|
+
kind: 'constant',
|
|
58
|
+
startLine: attr.startPosition.row + 1,
|
|
59
|
+
endLine: attr.endPosition.row + 1,
|
|
60
|
+
isExported: true,
|
|
61
|
+
calls: [],
|
|
62
|
+
implementsNames: [],
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Extract class="..." — take the last segment after dots
|
|
67
|
+
if (attrName === 'class' && value) {
|
|
68
|
+
const lastSegment = value.split('.').pop() || '';
|
|
69
|
+
if (lastSegment && !seen.has(lastSegment)) {
|
|
70
|
+
seen.add(lastSegment);
|
|
71
|
+
symbols.push({
|
|
72
|
+
id: `${fileId}#${lastSegment}`,
|
|
73
|
+
name: lastSegment,
|
|
74
|
+
kind: 'constant',
|
|
75
|
+
startLine: attr.startPosition.row + 1,
|
|
76
|
+
endLine: attr.endPosition.row + 1,
|
|
77
|
+
isExported: true,
|
|
78
|
+
calls: [],
|
|
79
|
+
implementsNames: [],
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Check element tag name for Maven coords (artifactId, groupId)
|
|
85
|
+
if (tagName === 'artifactId' || tagName === 'groupId') {
|
|
86
|
+
// Extract text content from child CharData nodes
|
|
87
|
+
const content = firstChildOfType(elemNode, 'content');
|
|
88
|
+
if (content) {
|
|
89
|
+
const charData = childrenOfType(content, 'CharData');
|
|
90
|
+
for (const cd of charData) {
|
|
91
|
+
const text = cd.text.trim();
|
|
92
|
+
if (text && !seen.has(text)) {
|
|
93
|
+
seen.add(text);
|
|
94
|
+
symbols.push({
|
|
95
|
+
id: `${fileId}#${text}`,
|
|
96
|
+
name: text,
|
|
97
|
+
kind: 'constant',
|
|
98
|
+
startLine: cd.startPosition.row + 1,
|
|
99
|
+
endLine: cd.endPosition.row + 1,
|
|
100
|
+
isExported: true,
|
|
101
|
+
calls: [],
|
|
102
|
+
implementsNames: [],
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Recursively visit nested elements
|
|
110
|
+
// They can be direct children or inside a content node
|
|
111
|
+
let childrenToVisit = childrenOfType(elemNode, 'element');
|
|
112
|
+
if (childrenToVisit.length === 0) {
|
|
113
|
+
const content = firstChildOfType(elemNode, 'content');
|
|
114
|
+
if (content) {
|
|
115
|
+
childrenToVisit = childrenOfType(content, 'element');
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
for (const child of childrenToVisit) {
|
|
119
|
+
extractSymbolsFromElement(child, symbols, seen, fileId);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
// Public API
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
125
|
+
const MAX_STRING = 32000;
|
|
126
|
+
const CHUNK_SIZE = 4096;
|
|
127
|
+
function parseContent(parser, content) {
|
|
128
|
+
if (content.length <= MAX_STRING) {
|
|
129
|
+
return parser.parse(content);
|
|
130
|
+
}
|
|
131
|
+
return parser.parse((startIndex) => {
|
|
132
|
+
if (startIndex >= content.length)
|
|
133
|
+
return null;
|
|
134
|
+
return content.slice(startIndex, startIndex + CHUNK_SIZE);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
export function parseXmlContent(content, fileId) {
|
|
138
|
+
const parser = getParser();
|
|
139
|
+
let tree;
|
|
140
|
+
try {
|
|
141
|
+
tree = parseContent(parser, content);
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
throw new Error(`Tree-sitter failed to parse XML (${content.length} chars): ${err}`);
|
|
145
|
+
}
|
|
146
|
+
const root = tree.rootNode;
|
|
147
|
+
const symbols = [];
|
|
148
|
+
const seen = new Set();
|
|
149
|
+
// Walk top-level children: skip prolog (comments), extract from elements
|
|
150
|
+
for (const node of root.namedChildren) {
|
|
151
|
+
if (node.type === 'element') {
|
|
152
|
+
extractSymbolsFromElement(node, symbols, seen, fileId);
|
|
153
|
+
}
|
|
154
|
+
// Skip prolog and other non-element nodes
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
imports: [],
|
|
158
|
+
exports: symbols.map(s => s.name),
|
|
159
|
+
hasDefaultExport: false,
|
|
160
|
+
symbols,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=xml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml.js","sourceRoot":"","sources":["../../../src/indexer/extractors/xml.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SymbolNode } from '../../types.js';
|
|
2
|
+
export interface YamlParseResult {
|
|
3
|
+
imports: string[];
|
|
4
|
+
exports: string[];
|
|
5
|
+
hasDefaultExport: false;
|
|
6
|
+
symbols: SymbolNode[];
|
|
7
|
+
}
|
|
8
|
+
export declare function parseYamlContent(content: string, fileId: string): YamlParseResult;
|
|
9
|
+
//# sourceMappingURL=yaml.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml.d.ts","sourceRoot":"","sources":["../../../src/indexer/extractors/yaml.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAYjD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,EAAE,KAAK,CAAC;IACxB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AA2CD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,CAgEjF"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { makeParser } from './parser-factory.js';
|
|
3
|
+
const require = createRequire(import.meta.url);
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
5
|
+
const yamlModule = require('@tree-sitter-grammars/tree-sitter-yaml');
|
|
6
|
+
const getParser = makeParser(yamlModule);
|
|
7
|
+
/**
|
|
8
|
+
* Pull the scalar key text from a `block_mapping_pair`'s key child.
|
|
9
|
+
* Shape: pair → flow_node → plain_scalar → string_scalar (or similar).
|
|
10
|
+
* Returns null if the key isn't a plain scalar (e.g. a complex/flow-style key).
|
|
11
|
+
*/
|
|
12
|
+
function getPairKey(pairNode) {
|
|
13
|
+
const keyNode = pairNode.namedChild(0);
|
|
14
|
+
if (!keyNode)
|
|
15
|
+
return null;
|
|
16
|
+
const text = keyNode.text;
|
|
17
|
+
if (!text)
|
|
18
|
+
return null;
|
|
19
|
+
const trimmed = text.trim();
|
|
20
|
+
if (!/^[A-Za-z_][\w-]*$/.test(trimmed))
|
|
21
|
+
return null;
|
|
22
|
+
return trimmed;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Find the first `block_mapping` reachable through nested `block_node` wrappers.
|
|
26
|
+
* Returns null if the value isn't a mapping (scalar, sequence, etc).
|
|
27
|
+
*/
|
|
28
|
+
function findBlockMapping(node) {
|
|
29
|
+
if (!node)
|
|
30
|
+
return null;
|
|
31
|
+
if (node.type === 'block_mapping')
|
|
32
|
+
return node;
|
|
33
|
+
if (node.type === 'block_node' || node.type === 'flow_node') {
|
|
34
|
+
for (let i = 0; i < node.namedChildCount; i++) {
|
|
35
|
+
const found = findBlockMapping(node.namedChild(i));
|
|
36
|
+
if (found)
|
|
37
|
+
return found;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
function findTopLevelMapping(root) {
|
|
43
|
+
if (!root)
|
|
44
|
+
return null;
|
|
45
|
+
if (root.type === 'block_mapping')
|
|
46
|
+
return root;
|
|
47
|
+
for (let i = 0; i < root.namedChildCount; i++) {
|
|
48
|
+
const found = findTopLevelMapping(root.namedChild(i));
|
|
49
|
+
if (found)
|
|
50
|
+
return found;
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
export function parseYamlContent(content, fileId) {
|
|
55
|
+
const parser = getParser();
|
|
56
|
+
const tree = parser.parse(content);
|
|
57
|
+
const symbols = [];
|
|
58
|
+
const seen = new Set();
|
|
59
|
+
const topMapping = findTopLevelMapping(tree.rootNode);
|
|
60
|
+
if (!topMapping) {
|
|
61
|
+
return { imports: [], exports: [], hasDefaultExport: false, symbols };
|
|
62
|
+
}
|
|
63
|
+
for (let i = 0; i < topMapping.namedChildCount; i++) {
|
|
64
|
+
const pair = topMapping.namedChild(i);
|
|
65
|
+
if (pair.type !== 'block_mapping_pair')
|
|
66
|
+
continue;
|
|
67
|
+
const key = getPairKey(pair);
|
|
68
|
+
if (!key)
|
|
69
|
+
continue;
|
|
70
|
+
if (!seen.has(key)) {
|
|
71
|
+
seen.add(key);
|
|
72
|
+
symbols.push({
|
|
73
|
+
id: `${fileId}#${key}`,
|
|
74
|
+
name: key,
|
|
75
|
+
kind: 'constant',
|
|
76
|
+
startLine: pair.startPosition.row + 1,
|
|
77
|
+
endLine: pair.startPosition.row + 1,
|
|
78
|
+
isExported: true,
|
|
79
|
+
calls: [],
|
|
80
|
+
implementsNames: [],
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
const valueNode = pair.namedChild(1);
|
|
84
|
+
const nested = valueNode ? findBlockMapping(valueNode) : null;
|
|
85
|
+
if (!nested)
|
|
86
|
+
continue;
|
|
87
|
+
for (let j = 0; j < nested.namedChildCount; j++) {
|
|
88
|
+
const sub = nested.namedChild(j);
|
|
89
|
+
if (sub.type !== 'block_mapping_pair')
|
|
90
|
+
continue;
|
|
91
|
+
const subKey = getPairKey(sub);
|
|
92
|
+
if (!subKey)
|
|
93
|
+
continue;
|
|
94
|
+
const fullName = `${key}.${subKey}`;
|
|
95
|
+
if (seen.has(fullName))
|
|
96
|
+
continue;
|
|
97
|
+
seen.add(fullName);
|
|
98
|
+
symbols.push({
|
|
99
|
+
id: `${fileId}#${fullName}`,
|
|
100
|
+
name: fullName,
|
|
101
|
+
kind: 'constant',
|
|
102
|
+
startLine: sub.startPosition.row + 1,
|
|
103
|
+
endLine: sub.startPosition.row + 1,
|
|
104
|
+
isExported: true,
|
|
105
|
+
calls: [],
|
|
106
|
+
implementsNames: [],
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
imports: [],
|
|
112
|
+
exports: symbols.map(s => s.name),
|
|
113
|
+
hasDefaultExport: false,
|
|
114
|
+
symbols,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=yaml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml.js","sourceRoot":"","sources":["../../../src/indexer/extractors/yaml.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get the current HEAD commit hash. Returns '' if unavailable.
|
|
3
|
+
*/
|
|
4
|
+
export declare function getGitHead(rootDir: string): Promise<string>;
|
|
5
|
+
/**
|
|
6
|
+
* Repo-relative paths changed between `fromHead` and the current HEAD.
|
|
7
|
+
* `--no-renames` so a rename yields BOTH sides (delete + add) — the index
|
|
8
|
+
* needs the old path removed and the new one added. null = git couldn't
|
|
9
|
+
* answer (not a repo, fromHead unknown after gc/rebase, no git binary);
|
|
10
|
+
* callers fall back to a filesystem walk.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getGitChangedFiles(rootDir: string, fromHead: string): Promise<string[] | null>;
|
|
13
|
+
/**
|
|
14
|
+
* Repo-relative paths dirty vs HEAD (modified/staged/untracked). `-uall`
|
|
15
|
+
* lists files inside untracked directories individually. null = git
|
|
16
|
+
* couldn't answer.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getGitDirtyFiles(rootDir: string): Promise<string[] | null>;
|
|
19
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/indexer/git.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASjE;AAID;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAUpG;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAehF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
/**
|
|
5
|
+
* Get the current HEAD commit hash. Returns '' if unavailable.
|
|
6
|
+
*/
|
|
7
|
+
export async function getGitHead(rootDir) {
|
|
8
|
+
try {
|
|
9
|
+
const { stdout } = await execFileAsync('git', ['rev-parse', 'HEAD'], {
|
|
10
|
+
cwd: rootDir,
|
|
11
|
+
});
|
|
12
|
+
return stdout.trim();
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return '';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const GIT_BUF = 64 * 1024 * 1024;
|
|
19
|
+
/**
|
|
20
|
+
* Repo-relative paths changed between `fromHead` and the current HEAD.
|
|
21
|
+
* `--no-renames` so a rename yields BOTH sides (delete + add) — the index
|
|
22
|
+
* needs the old path removed and the new one added. null = git couldn't
|
|
23
|
+
* answer (not a repo, fromHead unknown after gc/rebase, no git binary);
|
|
24
|
+
* callers fall back to a filesystem walk.
|
|
25
|
+
*/
|
|
26
|
+
export async function getGitChangedFiles(rootDir, fromHead) {
|
|
27
|
+
try {
|
|
28
|
+
const { stdout } = await execFileAsync('git', ['diff', '--name-only', '--no-renames', '-z', fromHead, 'HEAD'], { cwd: rootDir, maxBuffer: GIT_BUF });
|
|
29
|
+
return stdout.split('\0').filter(Boolean);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Repo-relative paths dirty vs HEAD (modified/staged/untracked). `-uall`
|
|
37
|
+
* lists files inside untracked directories individually. null = git
|
|
38
|
+
* couldn't answer.
|
|
39
|
+
*/
|
|
40
|
+
export async function getGitDirtyFiles(rootDir) {
|
|
41
|
+
try {
|
|
42
|
+
const { stdout } = await execFileAsync('git', ['status', '--porcelain', '--no-renames', '-uall', '-z'], { cwd: rootDir, maxBuffer: GIT_BUF });
|
|
43
|
+
// -z: NUL-separated `XY path` records (no rename `-> ` forms with --no-renames).
|
|
44
|
+
const out = [];
|
|
45
|
+
for (const entry of stdout.split('\0')) {
|
|
46
|
+
if (entry.length > 3)
|
|
47
|
+
out.push(entry.slice(3));
|
|
48
|
+
}
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/indexer/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe;IAC9C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE;YACnE,GAAG,EAAE,OAAO;SACb,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAe,EAAE,QAAgB;IACxE,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CACpC,KAAK,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EACtE,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CACrC,CAAC;QACF,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAe;IACpD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CACpC,KAAK,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,EAC/D,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CACrC,CAAC;QACF,iFAAiF;QACjF,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/indexer/graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAChC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAChC;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,SAAS,CAoBtE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function buildGraph(nodeIds, edges) {
|
|
2
|
+
const outSets = new Map();
|
|
3
|
+
const inSets = new Map();
|
|
4
|
+
for (const id of nodeIds) {
|
|
5
|
+
outSets.set(id, new Set());
|
|
6
|
+
inSets.set(id, new Set());
|
|
7
|
+
}
|
|
8
|
+
for (const edge of edges) {
|
|
9
|
+
outSets.get(edge.from)?.add(edge.to);
|
|
10
|
+
inSets.get(edge.to)?.add(edge.from);
|
|
11
|
+
}
|
|
12
|
+
const outEdges = new Map();
|
|
13
|
+
const inEdges = new Map();
|
|
14
|
+
for (const [id, set] of outSets)
|
|
15
|
+
outEdges.set(id, [...set]);
|
|
16
|
+
for (const [id, set] of inSets)
|
|
17
|
+
inEdges.set(id, [...set]);
|
|
18
|
+
return { outEdges, inEdges };
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/indexer/graph.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,UAAU,CAAC,OAAiB,EAAE,KAAa;IACzD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE9C,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC5C,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,OAAO;QAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC5D,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAE1D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { IndexedFile, Language, ParsedFile } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* The portion of an IndexedFile that is derived purely from identity + the
|
|
4
|
+
* parser output — i.e. every field EXCEPT the five that each call site computes
|
|
5
|
+
* itself: `domainMap`, `isTestFile`, `importedByCount`,
|
|
6
|
+
* `transitiveImportedByCount`, `isBarrel`.
|
|
7
|
+
*
|
|
8
|
+
* Three places build IndexedFiles (full index, incremental patch, probe). They
|
|
9
|
+
* used to hand-copy ~20 fields each, and they drifted: the patch path silently
|
|
10
|
+
* dropped `constantReferences` / `djangoConventionRefs` / etc., which deleted a
|
|
11
|
+
* file's synthetic (convention) edges on every incremental edit. Constructing
|
|
12
|
+
* the shared fields from one function keeps the three in lock-step.
|
|
13
|
+
*/
|
|
14
|
+
export declare function baseIndexedFile(id: string, path: string, relativePath: string, language: Language, parsed: ParsedFile): Omit<IndexedFile, 'domainMap' | 'isTestFile' | 'importedByCount' | 'transitiveImportedByCount' | 'isBarrel'>;
|
|
15
|
+
//# sourceMappingURL=indexed-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexed-file.d.ts","sourceRoot":"","sources":["../../src/indexer/indexed-file.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErE;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,UAAU,GACjB,IAAI,CACL,WAAW,EACX,WAAW,GAAG,YAAY,GAAG,iBAAiB,GAAG,2BAA2B,GAAG,UAAU,CAC1F,CAkCA"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { statSync } from 'node:fs';
|
|
2
|
+
/**
|
|
3
|
+
* The portion of an IndexedFile that is derived purely from identity + the
|
|
4
|
+
* parser output — i.e. every field EXCEPT the five that each call site computes
|
|
5
|
+
* itself: `domainMap`, `isTestFile`, `importedByCount`,
|
|
6
|
+
* `transitiveImportedByCount`, `isBarrel`.
|
|
7
|
+
*
|
|
8
|
+
* Three places build IndexedFiles (full index, incremental patch, probe). They
|
|
9
|
+
* used to hand-copy ~20 fields each, and they drifted: the patch path silently
|
|
10
|
+
* dropped `constantReferences` / `djangoConventionRefs` / etc., which deleted a
|
|
11
|
+
* file's synthetic (convention) edges on every incremental edit. Constructing
|
|
12
|
+
* the shared fields from one function keeps the three in lock-step.
|
|
13
|
+
*/
|
|
14
|
+
export function baseIndexedFile(id, path, relativePath, language, parsed) {
|
|
15
|
+
// Fingerprint stamped at parse time: the parser just read this exact content,
|
|
16
|
+
// so stat-now describes the bytes the index reflects. Reconcile compares
|
|
17
|
+
// stat-later against this pair to detect edits without hashing.
|
|
18
|
+
let mtimeMs, sizeBytes;
|
|
19
|
+
try {
|
|
20
|
+
const st = statSync(path);
|
|
21
|
+
mtimeMs = st.mtimeMs;
|
|
22
|
+
sizeBytes = st.size;
|
|
23
|
+
}
|
|
24
|
+
catch { /* raced delete — fingerprint stays absent */ }
|
|
25
|
+
return {
|
|
26
|
+
id,
|
|
27
|
+
path,
|
|
28
|
+
relativePath,
|
|
29
|
+
language,
|
|
30
|
+
mtimeMs,
|
|
31
|
+
sizeBytes,
|
|
32
|
+
exports: parsed.exports,
|
|
33
|
+
hasDefaultExport: parsed.hasDefaultExport,
|
|
34
|
+
imports: parsed.imports,
|
|
35
|
+
hash: parsed.hash,
|
|
36
|
+
lineCount: parsed.lineCount,
|
|
37
|
+
tokenEstimate: parsed.tokenEstimate,
|
|
38
|
+
symbols: parsed.symbols,
|
|
39
|
+
reexportRatio: parsed.reexportRatio,
|
|
40
|
+
packageName: parsed.packageName,
|
|
41
|
+
constantReferences: parsed.constantReferences,
|
|
42
|
+
partialDeclarations: parsed.partialDeclarations,
|
|
43
|
+
eloquentRelations: parsed.eloquentRelations,
|
|
44
|
+
containerResolutions: parsed.containerResolutions,
|
|
45
|
+
djangoConventionRefs: parsed.djangoConventionRefs,
|
|
46
|
+
submoduleImportCandidates: parsed.submoduleImportCandidates,
|
|
47
|
+
contentTokens: parsed.contentTokens,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=indexed-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexed-file.js","sourceRoot":"","sources":["../../src/indexer/indexed-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAC7B,EAAU,EACV,IAAY,EACZ,YAAoB,EACpB,QAAkB,EAClB,MAAkB;IAKlB,8EAA8E;IAC9E,yEAAyE;IACzE,gEAAgE;IAChE,IAAI,OAA2B,EAAE,SAA6B,CAAC;IAC/D,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1B,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;QACrB,SAAS,GAAG,EAAE,CAAC,IAAI,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC,CAAC,6CAA6C,CAAC,CAAC;IACzD,OAAO;QACL,EAAE;QACF,IAAI;QACJ,YAAY;QACZ,QAAQ;QACR,OAAO;QACP,SAAS;QACT,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;QAC7C,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;QAC/C,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;QACjD,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;QACjD,yBAAyB,EAAE,MAAM,CAAC,yBAAyB;QAC3D,aAAa,EAAE,MAAM,CAAC,aAAa;KACpC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-patch invariant lint — cheap structural checks run after every
|
|
3
|
+
* incremental patch (and after startup reconcile). A violation means the
|
|
4
|
+
* in-memory index is internally inconsistent — i.e. a patch bug — so the
|
|
5
|
+
* caller logs loudly and queues a full rebuild rather than serving (and
|
|
6
|
+
* cache-persisting) a corrupt graph.
|
|
7
|
+
*
|
|
8
|
+
* Deliberately bounded: exhaustive existence checks are O(files + edges);
|
|
9
|
+
* the quadratic-ish mirror check is stride-sampled. Returns at most
|
|
10
|
+
* `sampleLimit` problem strings — the point is "corrupt or not", not a
|
|
11
|
+
* full diff.
|
|
12
|
+
*/
|
|
13
|
+
import type { CodebaseIndex } from '../types.js';
|
|
14
|
+
export declare function lintIndexInvariants(index: CodebaseIndex, sampleLimit?: number): string[];
|
|
15
|
+
//# sourceMappingURL=invariants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariants.d.ts","sourceRoot":"","sources":["../../src/indexer/invariants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,aAAa,CAAC;AAmBjE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,SAAI,GAAG,MAAM,EAAE,CAqEnF"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
const MIRROR_SAMPLE = 2000;
|
|
2
|
+
/**
|
|
3
|
+
* The fileId a symbolEdge endpoint asserts, or null when the ref carries no
|
|
4
|
+
* file claim to verify. Qualified refs ("src/a.ts#foo") always do. Bare refs
|
|
5
|
+
* are LEGITIMATE for 'extends'/'implements' targets (kept as queryable class
|
|
6
|
+
* names by design — see symbol-edges.ts) — flagging those would turn every
|
|
7
|
+
* repo with inheritance into an infinite rebuild loop. The only bare ref
|
|
8
|
+
* that IS a fileId by construction is the 'exports' edge's from-side.
|
|
9
|
+
*/
|
|
10
|
+
function assertedFile(ref, type, side) {
|
|
11
|
+
const hash = ref.indexOf('#');
|
|
12
|
+
if (hash > 0)
|
|
13
|
+
return ref.slice(0, hash);
|
|
14
|
+
if (type === 'exports' && side === 'from')
|
|
15
|
+
return ref;
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
export function lintIndexInvariants(index, sampleLimit = 5) {
|
|
19
|
+
const problems = [];
|
|
20
|
+
const files = index.files;
|
|
21
|
+
const full = () => problems.length >= sampleLimit;
|
|
22
|
+
// 1. flat import edges point at indexed files
|
|
23
|
+
for (const e of index.edges) {
|
|
24
|
+
if (!files.has(e.from))
|
|
25
|
+
problems.push(`edge.from not in files: ${e.from} → ${e.to}`);
|
|
26
|
+
else if (!files.has(e.to))
|
|
27
|
+
problems.push(`edge.to not in files: ${e.from} → ${e.to}`);
|
|
28
|
+
if (full())
|
|
29
|
+
return problems;
|
|
30
|
+
}
|
|
31
|
+
// 2. adjacency keys/targets exist; sampled mirror check (out ↔ in)
|
|
32
|
+
let seen = 0;
|
|
33
|
+
let totalOut = 0;
|
|
34
|
+
for (const outs of index.outEdges.values())
|
|
35
|
+
totalOut += outs.length;
|
|
36
|
+
const stride = Math.max(1, Math.floor(totalOut / MIRROR_SAMPLE));
|
|
37
|
+
for (const [from, outs] of index.outEdges) {
|
|
38
|
+
if (!files.has(from) && outs.length > 0) {
|
|
39
|
+
problems.push(`outEdges key not in files: ${from}`);
|
|
40
|
+
if (full())
|
|
41
|
+
return problems;
|
|
42
|
+
}
|
|
43
|
+
for (const to of outs) {
|
|
44
|
+
if (!files.has(to)) {
|
|
45
|
+
problems.push(`outEdges target not in files: ${from} → ${to}`);
|
|
46
|
+
if (full())
|
|
47
|
+
return problems;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
if (seen++ % stride === 0) {
|
|
51
|
+
if (!(index.inEdges.get(to) ?? []).includes(from)) {
|
|
52
|
+
problems.push(`adjacency not mirrored in inEdges: ${from} → ${to}`);
|
|
53
|
+
if (full())
|
|
54
|
+
return problems;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
for (const [to, ins] of index.inEdges) {
|
|
60
|
+
if (!files.has(to) && ins.length > 0) {
|
|
61
|
+
problems.push(`inEdges key not in files: ${to}`);
|
|
62
|
+
if (full())
|
|
63
|
+
return problems;
|
|
64
|
+
}
|
|
65
|
+
for (const from of ins) {
|
|
66
|
+
if (!files.has(from)) {
|
|
67
|
+
problems.push(`inEdges source not in files: ${from} → ${to}`);
|
|
68
|
+
if (full())
|
|
69
|
+
return problems;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// 3. symbol edges' asserted file sides exist (bare class-name targets skipped)
|
|
74
|
+
for (const se of index.symbolEdges) {
|
|
75
|
+
const fromFile = assertedFile(se.from, se.type, 'from');
|
|
76
|
+
const toFile = assertedFile(se.to, se.type, 'to');
|
|
77
|
+
if (fromFile !== null && !files.has(fromFile))
|
|
78
|
+
problems.push(`symbolEdge.from file not in files: ${se.from}`);
|
|
79
|
+
else if (toFile !== null && !files.has(toFile))
|
|
80
|
+
problems.push(`symbolEdge.to file not in files: ${se.to}`);
|
|
81
|
+
if (full())
|
|
82
|
+
return problems;
|
|
83
|
+
}
|
|
84
|
+
// 4. content-token postings reference indexed files
|
|
85
|
+
for (const [token, ids] of index.contentTokenPostings) {
|
|
86
|
+
for (const id of ids) {
|
|
87
|
+
if (!files.has(id)) {
|
|
88
|
+
problems.push(`posting references dead file: "${token}" → ${id}`);
|
|
89
|
+
if (full())
|
|
90
|
+
return problems;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return problems;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=invariants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariants.js","sourceRoot":"","sources":["../../src/indexer/invariants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Edge, IndexedFile } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Laravel synthetic edges:
|
|
4
|
+
* - Eloquent relationships (hasMany, belongsTo, etc) gated to app/Models/:
|
|
5
|
+
* Parse class string references in relationship method arguments and emit edges.
|
|
6
|
+
* - Container resolutions (app(), resolve(), bind(), singleton()):
|
|
7
|
+
* Parse class string references in any PHP file and emit edges to DI container registrations.
|
|
8
|
+
*/
|
|
9
|
+
export declare function addLaravelSyntheticEdges(indexedFiles: IndexedFile[], edges: Edge[], fullFileIdSet: Set<string>, rootDir: string): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=laravel-synthetic.d.ts.map
|