@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,155 @@
|
|
|
1
|
+
import { dirname, join } from 'node:path';
|
|
2
|
+
import { readFile, readdir } from 'node:fs/promises';
|
|
3
|
+
const workspaceCache = new Map();
|
|
4
|
+
const startDirToWorkspaceToml = new Map();
|
|
5
|
+
async function readFileOpt(path) {
|
|
6
|
+
try {
|
|
7
|
+
return await readFile(path, 'utf-8');
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Returns the member list when a [workspace] section exists (may be empty),
|
|
15
|
+
* or null when the toml has no [workspace] section at all.
|
|
16
|
+
*/
|
|
17
|
+
function parseWorkspaceMembers(toml) {
|
|
18
|
+
const sectionRe = /^\s*\[workspace\]\s*$/m;
|
|
19
|
+
const wsMatch = toml.match(sectionRe);
|
|
20
|
+
if (!wsMatch)
|
|
21
|
+
return null;
|
|
22
|
+
const rest = toml.slice(wsMatch.index + wsMatch[0].length);
|
|
23
|
+
const nextSection = rest.search(/^\s*\[[^\]]+\]\s*$/m);
|
|
24
|
+
const section = nextSection >= 0 ? rest.slice(0, nextSection) : rest;
|
|
25
|
+
const arrMatch = section.match(/members\s*=\s*\[([\s\S]*?)\]/);
|
|
26
|
+
if (!arrMatch)
|
|
27
|
+
return [];
|
|
28
|
+
const members = [];
|
|
29
|
+
const strRe = /["']([^"']+)["']/g;
|
|
30
|
+
let mm;
|
|
31
|
+
while ((mm = strRe.exec(arrMatch[1])) !== null)
|
|
32
|
+
members.push(mm[1]);
|
|
33
|
+
return members;
|
|
34
|
+
}
|
|
35
|
+
function parsePackageName(toml) {
|
|
36
|
+
const pkgMatch = toml.match(/^\s*\[package\]\s*$/m);
|
|
37
|
+
if (!pkgMatch)
|
|
38
|
+
return null;
|
|
39
|
+
const rest = toml.slice(pkgMatch.index + pkgMatch[0].length);
|
|
40
|
+
const next = rest.search(/^\s*\[[^\]]+\]\s*$/m);
|
|
41
|
+
const section = next >= 0 ? rest.slice(0, next) : rest;
|
|
42
|
+
const nameMatch = section.match(/^\s*name\s*=\s*["']([^"']+)["']/m);
|
|
43
|
+
return nameMatch ? nameMatch[1] : null;
|
|
44
|
+
}
|
|
45
|
+
function escapeRegex(s) {
|
|
46
|
+
return s.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
|
|
47
|
+
}
|
|
48
|
+
async function expandMemberPattern(workspaceDir, pattern) {
|
|
49
|
+
if (pattern.startsWith('!'))
|
|
50
|
+
return [];
|
|
51
|
+
if (!pattern.includes('*'))
|
|
52
|
+
return [join(workspaceDir, pattern)];
|
|
53
|
+
const segments = pattern.split('/');
|
|
54
|
+
let dirs = [workspaceDir];
|
|
55
|
+
for (const seg of segments) {
|
|
56
|
+
if (!seg.includes('*')) {
|
|
57
|
+
dirs = dirs.map(d => join(d, seg));
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const regex = new RegExp('^' + seg.split('*').map(escapeRegex).join('.*') + '$');
|
|
61
|
+
const next = [];
|
|
62
|
+
for (const d of dirs) {
|
|
63
|
+
try {
|
|
64
|
+
const entries = await readdir(d, { withFileTypes: true });
|
|
65
|
+
for (const e of entries) {
|
|
66
|
+
if (e.isDirectory() && regex.test(e.name))
|
|
67
|
+
next.push(join(d, e.name));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch { /* skip */ }
|
|
71
|
+
}
|
|
72
|
+
dirs = next;
|
|
73
|
+
}
|
|
74
|
+
return dirs;
|
|
75
|
+
}
|
|
76
|
+
async function loadWorkspaceInfo(workspaceDir, workspaceToml, isWorkspace) {
|
|
77
|
+
const crates = new Map();
|
|
78
|
+
const addCrate = (name, srcRoot) => {
|
|
79
|
+
crates.set(name.replace(/-/g, '_'), { name, srcRoot });
|
|
80
|
+
};
|
|
81
|
+
// ripgrep's root Cargo.toml ships BOTH [workspace] and [package] — handle either.
|
|
82
|
+
const rootName = parsePackageName(workspaceToml);
|
|
83
|
+
if (rootName)
|
|
84
|
+
addCrate(rootName, join(workspaceDir, 'src'));
|
|
85
|
+
if (isWorkspace) {
|
|
86
|
+
const members = parseWorkspaceMembers(workspaceToml) ?? [];
|
|
87
|
+
for (const pattern of members) {
|
|
88
|
+
const memberDirs = await expandMemberPattern(workspaceDir, pattern);
|
|
89
|
+
for (const memberDir of memberDirs) {
|
|
90
|
+
const memberToml = await readFileOpt(join(memberDir, 'Cargo.toml'));
|
|
91
|
+
if (!memberToml)
|
|
92
|
+
continue;
|
|
93
|
+
const name = parsePackageName(memberToml);
|
|
94
|
+
if (!name)
|
|
95
|
+
continue;
|
|
96
|
+
addCrate(name, join(memberDir, 'src'));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return { workspaceDir, crates };
|
|
101
|
+
}
|
|
102
|
+
export async function findRustWorkspace(startDir) {
|
|
103
|
+
if (startDirToWorkspaceToml.has(startDir)) {
|
|
104
|
+
const tomlPath = startDirToWorkspaceToml.get(startDir);
|
|
105
|
+
return tomlPath ? workspaceCache.get(tomlPath) ?? null : null;
|
|
106
|
+
}
|
|
107
|
+
let workspaceTomlPath = null;
|
|
108
|
+
let workspaceTomlContent = null;
|
|
109
|
+
let nearestTomlPath = null;
|
|
110
|
+
let nearestTomlContent = null;
|
|
111
|
+
let dir = startDir;
|
|
112
|
+
for (let i = 0; i < 64; i++) {
|
|
113
|
+
const tomlPath = join(dir, 'Cargo.toml');
|
|
114
|
+
const content = await readFileOpt(tomlPath);
|
|
115
|
+
if (content !== null) {
|
|
116
|
+
if (!nearestTomlContent) {
|
|
117
|
+
nearestTomlPath = tomlPath;
|
|
118
|
+
nearestTomlContent = content;
|
|
119
|
+
}
|
|
120
|
+
if (parseWorkspaceMembers(content) !== null) {
|
|
121
|
+
workspaceTomlPath = tomlPath;
|
|
122
|
+
workspaceTomlContent = content;
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const parent = dirname(dir);
|
|
127
|
+
if (parent === dir)
|
|
128
|
+
break;
|
|
129
|
+
dir = parent;
|
|
130
|
+
}
|
|
131
|
+
let chosenPath = null;
|
|
132
|
+
let chosenContent = null;
|
|
133
|
+
let chosenIsWorkspace = false;
|
|
134
|
+
if (workspaceTomlPath && workspaceTomlContent) {
|
|
135
|
+
chosenPath = workspaceTomlPath;
|
|
136
|
+
chosenContent = workspaceTomlContent;
|
|
137
|
+
chosenIsWorkspace = true;
|
|
138
|
+
}
|
|
139
|
+
else if (nearestTomlPath && nearestTomlContent) {
|
|
140
|
+
chosenPath = nearestTomlPath;
|
|
141
|
+
chosenContent = nearestTomlContent;
|
|
142
|
+
}
|
|
143
|
+
if (!chosenPath || !chosenContent) {
|
|
144
|
+
startDirToWorkspaceToml.set(startDir, null);
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
startDirToWorkspaceToml.set(startDir, chosenPath);
|
|
148
|
+
const cached = workspaceCache.get(chosenPath);
|
|
149
|
+
if (cached !== undefined)
|
|
150
|
+
return cached;
|
|
151
|
+
const info = await loadWorkspaceInfo(dirname(chosenPath), chosenContent, chosenIsWorkspace);
|
|
152
|
+
workspaceCache.set(chosenPath, info);
|
|
153
|
+
return info;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=rust-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rust-workspace.js","sourceRoot":"","sources":["../../src/indexer/rust-workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { IndexedFile, SymbolEdge } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build symbol-level edges for a set of files.
|
|
4
|
+
*
|
|
5
|
+
* For each symbol:
|
|
6
|
+
* - exports: file → symbol (for exported symbols)
|
|
7
|
+
* - calls: resolved to a qualified "fileId#name" edge where the callee name
|
|
8
|
+
* matches an export of one of the file's resolved imports; bare names that
|
|
9
|
+
* cannot be resolved are kept as-is (external/dynamic calls).
|
|
10
|
+
* - extends / implements: stored as bare names (resolved at query time)
|
|
11
|
+
*
|
|
12
|
+
* @param files The files to build edges for.
|
|
13
|
+
* @param outEdges File-level import graph: fileId → [importedFileId, ...]
|
|
14
|
+
* @param allFiles Full file map used to look up exports of imported files.
|
|
15
|
+
* For buildIndex this is the same set as `files`; for patch
|
|
16
|
+
* it is the full index.files map (includes unchanged files).
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildSymbolEdges(files: IndexedFile[], outEdges: Map<string, string[]>, allFiles: Map<string, IndexedFile>): SymbolEdge[];
|
|
19
|
+
//# sourceMappingURL=symbol-edges.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbol-edges.d.ts","sourceRoot":"","sources":["../../src/indexer/symbol-edges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE3D;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAAE,EACpB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAC/B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GACjC,UAAU,EAAE,CAiGd"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build symbol-level edges for a set of files.
|
|
3
|
+
*
|
|
4
|
+
* For each symbol:
|
|
5
|
+
* - exports: file → symbol (for exported symbols)
|
|
6
|
+
* - calls: resolved to a qualified "fileId#name" edge where the callee name
|
|
7
|
+
* matches an export of one of the file's resolved imports; bare names that
|
|
8
|
+
* cannot be resolved are kept as-is (external/dynamic calls).
|
|
9
|
+
* - extends / implements: stored as bare names (resolved at query time)
|
|
10
|
+
*
|
|
11
|
+
* @param files The files to build edges for.
|
|
12
|
+
* @param outEdges File-level import graph: fileId → [importedFileId, ...]
|
|
13
|
+
* @param allFiles Full file map used to look up exports of imported files.
|
|
14
|
+
* For buildIndex this is the same set as `files`; for patch
|
|
15
|
+
* it is the full index.files map (includes unchanged files).
|
|
16
|
+
*/
|
|
17
|
+
export function buildSymbolEdges(files, outEdges, allFiles) {
|
|
18
|
+
// Pre-build export lookup: fileId → Set<exportedSymbolName>
|
|
19
|
+
const exportsByFile = new Map();
|
|
20
|
+
// Suffix index for qualified names: fileId → Map<suffix, fullExportName>.
|
|
21
|
+
// Java methods are stored as "Class.method"; Ruby as "Class::method" or "Module::Class".
|
|
22
|
+
// Bare callees ("method") need to resolve back to the qualified export.
|
|
23
|
+
// If a file has two exports with the same suffix (rare in practice), drop both
|
|
24
|
+
// from the suffix index so we don't pick arbitrarily.
|
|
25
|
+
const suffixIndexByFile = new Map();
|
|
26
|
+
for (const [id, file] of allFiles) {
|
|
27
|
+
exportsByFile.set(id, new Set(file.exports));
|
|
28
|
+
const suffixMap = new Map();
|
|
29
|
+
const ambiguous = new Set();
|
|
30
|
+
for (const exp of file.exports) {
|
|
31
|
+
// Split on last '.' or '::'. Tree-sitter Java/Ruby extractors don't mix separators.
|
|
32
|
+
const dotIdx = exp.lastIndexOf('.');
|
|
33
|
+
const colonIdx = exp.lastIndexOf('::');
|
|
34
|
+
const sepIdx = Math.max(dotIdx, colonIdx);
|
|
35
|
+
if (sepIdx <= 0)
|
|
36
|
+
continue;
|
|
37
|
+
const sepLen = colonIdx === sepIdx ? 2 : 1;
|
|
38
|
+
const suffix = exp.slice(sepIdx + sepLen);
|
|
39
|
+
if (!suffix)
|
|
40
|
+
continue;
|
|
41
|
+
if (suffixMap.has(suffix))
|
|
42
|
+
ambiguous.add(suffix);
|
|
43
|
+
else
|
|
44
|
+
suffixMap.set(suffix, exp);
|
|
45
|
+
}
|
|
46
|
+
for (const a of ambiguous)
|
|
47
|
+
suffixMap.delete(a);
|
|
48
|
+
suffixIndexByFile.set(id, suffixMap);
|
|
49
|
+
}
|
|
50
|
+
const edges = [];
|
|
51
|
+
for (const file of files) {
|
|
52
|
+
const importedFileIds = outEdges.get(file.id) ?? [];
|
|
53
|
+
for (const sym of file.symbols) {
|
|
54
|
+
// exports: file → symbol
|
|
55
|
+
if (sym.isExported) {
|
|
56
|
+
edges.push({ from: file.id, to: sym.id, type: 'exports' });
|
|
57
|
+
}
|
|
58
|
+
// calls: resolve bare name → qualified id where possible
|
|
59
|
+
for (const callSite of sym.calls) {
|
|
60
|
+
const callee = callSite.name;
|
|
61
|
+
const line = callSite.line;
|
|
62
|
+
// Already qualified (intra-file resolution in ts-parser produces "fileId#name")
|
|
63
|
+
if (callee.includes('#')) {
|
|
64
|
+
edges.push({ from: sym.id, to: callee, type: 'calls', line });
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
// Try to resolve against imported files.
|
|
68
|
+
// Pass 1: direct export match (TS/JS, anything that exports bare names).
|
|
69
|
+
let resolved = null;
|
|
70
|
+
for (const importedId of importedFileIds) {
|
|
71
|
+
if (exportsByFile.get(importedId)?.has(callee)) {
|
|
72
|
+
resolved = `${importedId}#${callee}`;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Pass 2: suffix match against qualified exports (Java/Ruby). Only resolve
|
|
77
|
+
// if exactly one imported file's suffix index contains this callee — else
|
|
78
|
+
// we'd be guessing.
|
|
79
|
+
if (!resolved) {
|
|
80
|
+
let matchFile = null;
|
|
81
|
+
let matchFull = null;
|
|
82
|
+
let multiple = false;
|
|
83
|
+
for (const importedId of importedFileIds) {
|
|
84
|
+
const full = suffixIndexByFile.get(importedId)?.get(callee);
|
|
85
|
+
if (full) {
|
|
86
|
+
if (matchFile) {
|
|
87
|
+
multiple = true;
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
matchFile = importedId;
|
|
91
|
+
matchFull = full;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (matchFile && matchFull && !multiple) {
|
|
95
|
+
resolved = `${matchFile}#${matchFull}`;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// A2: drop unresolvable bare-name 'calls' edges. They're noise — query-time
|
|
99
|
+
// lookups always use qualified `fileId#name` ids, so bare-name targets
|
|
100
|
+
// never match and just bloat the symInEdges reverse-adjacency map.
|
|
101
|
+
// 'extends' / 'implements' bare-name edges are kept (queryable by class name).
|
|
102
|
+
if (resolved) {
|
|
103
|
+
edges.push({ from: sym.id, to: resolved, type: 'calls', line });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// extends / implements
|
|
107
|
+
if (sym.extendsName) {
|
|
108
|
+
edges.push({ from: sym.id, to: sym.extendsName, type: 'extends' });
|
|
109
|
+
}
|
|
110
|
+
for (const iface of sym.implementsNames) {
|
|
111
|
+
edges.push({ from: sym.id, to: iface, type: 'implements' });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return edges;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=symbol-edges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbol-edges.js","sourceRoot":"","sources":["../../src/indexer/symbol-edges.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { DomainEvidence } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Returns true if any directory segment in the relative path contains a test
|
|
4
|
+
* infrastructure word (e.g. "e2e-tests/", "locators/", "__tests__/", "qa/"),
|
|
5
|
+
* or if the filename matches a per-language test convention.
|
|
6
|
+
* Works for any project structure — no hardcoded paths.
|
|
7
|
+
*/
|
|
8
|
+
export declare function isTestPath(relativePath: string): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Split a name into lowercase tokens by camelCase, PascalCase, snake_case,
|
|
11
|
+
* kebab-case, and dot boundaries. Filters out stop words and single-char tokens.
|
|
12
|
+
*/
|
|
13
|
+
export declare function tokenizeName(name: string): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Build the domainMap Record<string, DomainEvidence> for a file from:
|
|
16
|
+
* 1. Non-generic directory segments in the relative path (path source)
|
|
17
|
+
* 2. Effective filename tokens (filename source, with dir-entry promotion)
|
|
18
|
+
* 3. Exported symbol names (symbol source)
|
|
19
|
+
*
|
|
20
|
+
* Import specifiers are intentionally excluded: what a file imports describes
|
|
21
|
+
* its dependencies, not its identity. Adding them caused high-fan-out files
|
|
22
|
+
* (routers, layout roots, API clients) to match every query for the features
|
|
23
|
+
* they depend on — pure noise. Identity comes from path and exports only.
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildFileDomains(relativePath: string, exports: string[]): Record<string, DomainEvidence>;
|
|
26
|
+
//# sourceMappingURL=tokenize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenize.d.ts","sourceRoot":"","sources":["../../src/indexer/tokenize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA2ElD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAmBxD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CASnD;AAsBD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EAAE,GAChB,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAgEhC"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { basename, extname } from 'node:path';
|
|
2
|
+
const STOP_WORDS = new Set([
|
|
3
|
+
'index', 'component', 'util', 'helper', 'default',
|
|
4
|
+
'type', 'interface', 'class', 'function', 'const', 'enum',
|
|
5
|
+
'module', 'export', 'import', 'test', 'spec', 'mock',
|
|
6
|
+
'base', 'abstract', 'impl', 'main', 'app', 'core',
|
|
7
|
+
'get', 'set', 'has', 'is', 'on', 'to', 'from', 'with',
|
|
8
|
+
'new', 'init',
|
|
9
|
+
'handler', 'wrapper', 'provider', 'manager',
|
|
10
|
+
'props', 'state', 'context', 'config', 'options', 'params',
|
|
11
|
+
]);
|
|
12
|
+
const GENERIC_DIRS = new Set([
|
|
13
|
+
'src', 'lib', 'app', 'apps', 'packages', 'pkg', 'source', 'code',
|
|
14
|
+
'components', 'pages', 'views', 'screens', 'features',
|
|
15
|
+
]);
|
|
16
|
+
// Directory-entry filenames: when a file has one of these names, use the
|
|
17
|
+
// parent directory name instead for the 'filename' source token.
|
|
18
|
+
const DIR_ENTRY_NAMES = new Set(['index', '__init__', 'mod', 'page', 'route', 'layout', 'loading']);
|
|
19
|
+
// Words that, when found as a token in any path segment, mark a file as test infrastructure.
|
|
20
|
+
// Matched via tokenizeName so word-boundary splitting handles e2e-tests, __tests__, pageObjects etc.
|
|
21
|
+
// Compound forms (integrationtest, uitests, etc.) are listed because tokenizeName won't split
|
|
22
|
+
// all-lowercase compounds without separators.
|
|
23
|
+
const TEST_SEGMENT_WORDS = new Set([
|
|
24
|
+
'test', 'tests', 'spec', 'specs', 'e2e', 'mock', 'mocks', 'fixture', 'fixtures',
|
|
25
|
+
'stub', 'stubs', 'locator', 'locators', 'pageobject', 'pageobjects',
|
|
26
|
+
'automation', 'cypress', 'playwright', 'selenium', 'nightwatch', 'webdriver',
|
|
27
|
+
// QA top-level directories
|
|
28
|
+
'qa', 'qe',
|
|
29
|
+
// Compound test-dir names (tokenizeName doesn't split all-lowercase compounds)
|
|
30
|
+
'unittest', 'unittests',
|
|
31
|
+
'integrationtest', 'integrationtests',
|
|
32
|
+
'whiteboxtest', 'whiteboxtests',
|
|
33
|
+
'blackboxtest', 'blackboxtests',
|
|
34
|
+
'uitest', 'uitests',
|
|
35
|
+
'apitest', 'apitests',
|
|
36
|
+
'e2etest', 'e2etests',
|
|
37
|
+
'smoketest', 'smoketests',
|
|
38
|
+
'loadtest', 'loadtests',
|
|
39
|
+
'perftest', 'perftests',
|
|
40
|
+
]);
|
|
41
|
+
/**
|
|
42
|
+
* Detects test files by filename convention across the supported languages.
|
|
43
|
+
* Case-sensitive checks on the stem avoid false positives like `latest.js`,
|
|
44
|
+
* `Contest.java`, `Manifest.java`.
|
|
45
|
+
*/
|
|
46
|
+
function isTestFilename(filename) {
|
|
47
|
+
const lower = filename.toLowerCase();
|
|
48
|
+
// 1. JS/TS dotted: foo.test.ts, foo.spec.js, foo.mock.tsx, foo.e2e.ts, foo.cy.ts
|
|
49
|
+
if (/\.(test|spec|mock|e2e|cy)\.[a-z]+$/.test(lower))
|
|
50
|
+
return true;
|
|
51
|
+
// 2. Snake_case suffix: foo_test.go, foo_spec.rb, foo_test.py, foo_tests.rs, foo_test.cpp
|
|
52
|
+
if (/_(?:tests?|specs?)\.[a-z]+$/.test(lower))
|
|
53
|
+
return true;
|
|
54
|
+
// 3. Snake_case prefix: test_foo.py, test_foo.cpp
|
|
55
|
+
if (/^test_.+\.(?:py|cpp|cc|cxx|h|hpp)$/.test(lower))
|
|
56
|
+
return true;
|
|
57
|
+
// 4. Pytest config
|
|
58
|
+
if (lower === 'conftest.py')
|
|
59
|
+
return true;
|
|
60
|
+
// 5. CamelCase suffix on stem (Java/Kotlin/C#/PHP): MyClassTest.java, MySpec.kt, MyITCase.java
|
|
61
|
+
const stem = filename.replace(/\.[^.]+$/, '');
|
|
62
|
+
if (/(?:Test|Tests|Spec|Specs|ITCase)$/.test(stem))
|
|
63
|
+
return true;
|
|
64
|
+
// 6. CamelCase prefix on stem (Java/Kotlin/C#/PHP): TestMyClass.java
|
|
65
|
+
if (/^Test[A-Z]/.test(stem))
|
|
66
|
+
return true;
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Returns true if any directory segment in the relative path contains a test
|
|
71
|
+
* infrastructure word (e.g. "e2e-tests/", "locators/", "__tests__/", "qa/"),
|
|
72
|
+
* or if the filename matches a per-language test convention.
|
|
73
|
+
* Works for any project structure — no hardcoded paths.
|
|
74
|
+
*/
|
|
75
|
+
export function isTestPath(relativePath) {
|
|
76
|
+
const normalized = relativePath.replace(/\\/g, '/');
|
|
77
|
+
const parts = normalized.split('/');
|
|
78
|
+
const filename = parts[parts.length - 1];
|
|
79
|
+
if (isTestFilename(filename))
|
|
80
|
+
return true;
|
|
81
|
+
// Check all directory segments
|
|
82
|
+
const dirParts = parts.slice(0, -1);
|
|
83
|
+
for (const segment of dirParts) {
|
|
84
|
+
const tokens = tokenizeName(segment);
|
|
85
|
+
for (const token of tokens) {
|
|
86
|
+
if (TEST_SEGMENT_WORDS.has(token))
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
// Also check the raw lowercased segment for compound words like "e2e" that survive intact
|
|
90
|
+
const lower = segment.toLowerCase();
|
|
91
|
+
if (TEST_SEGMENT_WORDS.has(lower))
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Split a name into lowercase tokens by camelCase, PascalCase, snake_case,
|
|
98
|
+
* kebab-case, and dot boundaries. Filters out stop words and single-char tokens.
|
|
99
|
+
*/
|
|
100
|
+
export function tokenizeName(name) {
|
|
101
|
+
const parts = name
|
|
102
|
+
.replace(/([a-z])([A-Z])/g, '$1 $2')
|
|
103
|
+
.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
|
|
104
|
+
.split(/[\s\-_.\/]+/)
|
|
105
|
+
.map(p => p.toLowerCase())
|
|
106
|
+
.filter(p => p.length > 1 && !STOP_WORDS.has(p));
|
|
107
|
+
return parts;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Additive pluralization: for each token length >= 5, add the singular form
|
|
111
|
+
* if the token ends in 's' or 'es' and the singular isn't already present.
|
|
112
|
+
* Both forms coexist. Copies evidence counts from the plural origin entry.
|
|
113
|
+
*/
|
|
114
|
+
function addPlurals(map) {
|
|
115
|
+
for (const [token, evidence] of Object.entries(map)) {
|
|
116
|
+
if (token.length < 5)
|
|
117
|
+
continue;
|
|
118
|
+
let singular = null;
|
|
119
|
+
if (token.endsWith('es') && token.length > 4) {
|
|
120
|
+
singular = token.slice(0, -2);
|
|
121
|
+
}
|
|
122
|
+
else if (token.endsWith('s')) {
|
|
123
|
+
singular = token.slice(0, -1);
|
|
124
|
+
}
|
|
125
|
+
if (singular && singular.length >= 4 && !STOP_WORDS.has(singular) && !map[singular]) {
|
|
126
|
+
map[singular] = { ...evidence };
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Build the domainMap Record<string, DomainEvidence> for a file from:
|
|
132
|
+
* 1. Non-generic directory segments in the relative path (path source)
|
|
133
|
+
* 2. Effective filename tokens (filename source, with dir-entry promotion)
|
|
134
|
+
* 3. Exported symbol names (symbol source)
|
|
135
|
+
*
|
|
136
|
+
* Import specifiers are intentionally excluded: what a file imports describes
|
|
137
|
+
* its dependencies, not its identity. Adding them caused high-fan-out files
|
|
138
|
+
* (routers, layout roots, API clients) to match every query for the features
|
|
139
|
+
* they depend on — pure noise. Identity comes from path and exports only.
|
|
140
|
+
*/
|
|
141
|
+
export function buildFileDomains(relativePath, exports) {
|
|
142
|
+
const domainMap = {};
|
|
143
|
+
function addToken(token, source) {
|
|
144
|
+
if (!domainMap[token])
|
|
145
|
+
domainMap[token] = { filename: 0, path: 0, symbol: 0 };
|
|
146
|
+
domainMap[token][source]++;
|
|
147
|
+
}
|
|
148
|
+
const normalized = relativePath.replace(/\\/g, '/');
|
|
149
|
+
const parts = normalized.split('/');
|
|
150
|
+
const dirParts = parts.slice(0, -1);
|
|
151
|
+
const filenamePart = parts[parts.length - 1] ?? '';
|
|
152
|
+
const filenameWithoutExt = basename(filenamePart, extname(filenamePart));
|
|
153
|
+
const filenameLower = filenameWithoutExt.toLowerCase();
|
|
154
|
+
// 1. Directory segments → path source
|
|
155
|
+
for (const part of dirParts) {
|
|
156
|
+
const lower = part.toLowerCase();
|
|
157
|
+
if (!GENERIC_DIRS.has(lower)) {
|
|
158
|
+
for (const token of tokenizeName(part)) {
|
|
159
|
+
addToken(token, 'path');
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// 2. Effective filename → filename source
|
|
164
|
+
// If the filename is a directory-entry name, use parent dir name instead
|
|
165
|
+
let effectiveFilename;
|
|
166
|
+
if (DIR_ENTRY_NAMES.has(filenameLower)) {
|
|
167
|
+
// Use the immediate parent directory name
|
|
168
|
+
effectiveFilename = dirParts[dirParts.length - 1] ?? '';
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
effectiveFilename = filenameWithoutExt;
|
|
172
|
+
}
|
|
173
|
+
if (effectiveFilename) {
|
|
174
|
+
const effLower = effectiveFilename.toLowerCase();
|
|
175
|
+
if (!GENERIC_DIRS.has(effLower) && !STOP_WORDS.has(effLower)) {
|
|
176
|
+
for (const token of tokenizeName(effectiveFilename)) {
|
|
177
|
+
addToken(token, 'filename');
|
|
178
|
+
}
|
|
179
|
+
// Compound form
|
|
180
|
+
const compound = effLower;
|
|
181
|
+
if (compound.length > 3 && !STOP_WORDS.has(compound)) {
|
|
182
|
+
addToken(compound, 'filename');
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// 3. Exported symbol names → symbol source
|
|
187
|
+
for (const exp of exports) {
|
|
188
|
+
for (const token of tokenizeName(exp)) {
|
|
189
|
+
addToken(token, 'symbol');
|
|
190
|
+
}
|
|
191
|
+
const fullLower = exp.toLowerCase();
|
|
192
|
+
if (fullLower.length > 3 && !STOP_WORDS.has(fullLower)) {
|
|
193
|
+
addToken(fullLower, 'symbol');
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// 4. Additive pluralization
|
|
197
|
+
addPlurals(domainMap);
|
|
198
|
+
return domainMap;
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=tokenize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../../src/indexer/tokenize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SymbolNode } from '../types.js';
|
|
2
|
+
export interface TsParseResult {
|
|
3
|
+
imports: string[];
|
|
4
|
+
exports: string[];
|
|
5
|
+
hasDefaultExport: boolean;
|
|
6
|
+
symbols: SymbolNode[];
|
|
7
|
+
reexportRatio: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function parseTsContent(content: string, fileId: string, isTsx?: boolean): TsParseResult;
|
|
10
|
+
//# sourceMappingURL=ts-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ts-parser.d.ts","sourceRoot":"","sources":["../../src/indexer/ts-parser.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAwB,MAAM,aAAa,CAAC;AAubpE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB;AAkBD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,UAAQ,GACZ,aAAa,CA4Kf"}
|