codesift-mcp 0.5.30 → 0.8.2
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 +7 -2
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +25 -3
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/git-hooks-installer.d.ts +2 -0
- package/dist/cli/git-hooks-installer.d.ts.map +1 -1
- package/dist/cli/git-hooks-installer.js +47 -7
- package/dist/cli/git-hooks-installer.js.map +1 -1
- package/dist/cli/hooks.d.ts.map +1 -1
- package/dist/cli/hooks.js +53 -0
- package/dist/cli/hooks.js.map +1 -1
- package/dist/cli/setup.d.ts +5 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +31 -5
- package/dist/cli/setup.js.map +1 -1
- package/dist/config.d.ts +2 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -1
- package/dist/config.js.map +1 -1
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.d.ts.map +1 -1
- package/dist/instructions.js +6 -1
- package/dist/instructions.js.map +1 -1
- package/dist/parser/extractors/_shared.js +2 -2
- package/dist/parser/extractors/_shared.js.map +1 -1
- package/dist/parser/extractors/hono.d.ts.map +1 -1
- package/dist/parser/extractors/hono.js +60 -15
- package/dist/parser/extractors/hono.js.map +1 -1
- package/dist/parser/extractors/php.d.ts +12 -0
- package/dist/parser/extractors/php.d.ts.map +1 -1
- package/dist/parser/extractors/php.js +440 -26
- package/dist/parser/extractors/php.js.map +1 -1
- package/dist/parser/extractors/python.js +4 -5
- package/dist/parser/extractors/python.js.map +1 -1
- package/dist/parser/extractors/typescript.d.ts.map +1 -1
- package/dist/parser/extractors/typescript.js +70 -22
- package/dist/parser/extractors/typescript.js.map +1 -1
- package/dist/register-tool-loaders.d.ts +22 -0
- package/dist/register-tool-loaders.d.ts.map +1 -1
- package/dist/register-tool-loaders.js +38 -0
- package/dist/register-tool-loaders.js.map +1 -1
- package/dist/register-tools.d.ts +3 -1
- package/dist/register-tools.d.ts.map +1 -1
- package/dist/register-tools.js +527 -7
- package/dist/register-tools.js.map +1 -1
- package/dist/retrieval/codebase-retrieval.d.ts.map +1 -1
- package/dist/retrieval/codebase-retrieval.js +22 -0
- package/dist/retrieval/codebase-retrieval.js.map +1 -1
- package/dist/retrieval/retrieval-schemas.d.ts +4 -0
- package/dist/retrieval/retrieval-schemas.d.ts.map +1 -1
- package/dist/retrieval/semantic-handlers.js +1 -1
- package/dist/retrieval/semantic-handlers.js.map +1 -1
- package/dist/search/semantic.d.ts +21 -5
- package/dist/search/semantic.d.ts.map +1 -1
- package/dist/search/semantic.js +129 -4
- package/dist/search/semantic.js.map +1 -1
- package/dist/search/tool-ranker.js +1 -1
- package/dist/search/tool-ranker.js.map +1 -1
- package/dist/server-helpers.js +1 -1
- package/dist/server-helpers.js.map +1 -1
- package/dist/storage/index-store.d.ts +13 -1
- package/dist/storage/index-store.d.ts.map +1 -1
- package/dist/storage/index-store.js +34 -33
- package/dist/storage/index-store.js.map +1 -1
- package/dist/storage/registry.d.ts +28 -4
- package/dist/storage/registry.d.ts.map +1 -1
- package/dist/storage/registry.js +126 -5
- package/dist/storage/registry.js.map +1 -1
- package/dist/storage/usage-stats.d.ts +2 -0
- package/dist/storage/usage-stats.d.ts.map +1 -1
- package/dist/storage/usage-stats.js +6 -0
- package/dist/storage/usage-stats.js.map +1 -1
- package/dist/tools/_helpers.d.ts +2 -0
- package/dist/tools/_helpers.d.ts.map +1 -1
- package/dist/tools/_helpers.js +16 -1
- package/dist/tools/_helpers.js.map +1 -1
- package/dist/tools/astro-audit.d.ts +40 -0
- package/dist/tools/astro-audit.d.ts.map +1 -1
- package/dist/tools/astro-audit.js +94 -5
- package/dist/tools/astro-audit.js.map +1 -1
- package/dist/tools/astro-env-validator.d.ts +38 -0
- package/dist/tools/astro-env-validator.d.ts.map +1 -0
- package/dist/tools/astro-env-validator.js +190 -0
- package/dist/tools/astro-env-validator.js.map +1 -0
- package/dist/tools/astro-helpers.js +2 -2
- package/dist/tools/astro-helpers.js.map +1 -1
- package/dist/tools/astro-image-audit.d.ts +35 -0
- package/dist/tools/astro-image-audit.d.ts.map +1 -0
- package/dist/tools/astro-image-audit.js +129 -0
- package/dist/tools/astro-image-audit.js.map +1 -0
- package/dist/tools/astro-middleware.d.ts.map +1 -1
- package/dist/tools/astro-middleware.js +36 -11
- package/dist/tools/astro-middleware.js.map +1 -1
- package/dist/tools/astro-migration.d.ts.map +1 -1
- package/dist/tools/astro-migration.js +66 -0
- package/dist/tools/astro-migration.js.map +1 -1
- package/dist/tools/astro-svg-components.d.ts +32 -0
- package/dist/tools/astro-svg-components.d.ts.map +1 -0
- package/dist/tools/astro-svg-components.js +123 -0
- package/dist/tools/astro-svg-components.js.map +1 -0
- package/dist/tools/context-tools.d.ts.map +1 -1
- package/dist/tools/context-tools.js +45 -7
- package/dist/tools/context-tools.js.map +1 -1
- package/dist/tools/conversation-tools.js +1 -1
- package/dist/tools/conversation-tools.js.map +1 -1
- package/dist/tools/index-tools.d.ts +12 -0
- package/dist/tools/index-tools.d.ts.map +1 -1
- package/dist/tools/index-tools.js +54 -6
- package/dist/tools/index-tools.js.map +1 -1
- package/dist/tools/insights-tools.d.ts +137 -0
- package/dist/tools/insights-tools.d.ts.map +1 -0
- package/dist/tools/insights-tools.js +438 -0
- package/dist/tools/insights-tools.js.map +1 -0
- package/dist/tools/pattern-tools.d.ts +7 -0
- package/dist/tools/pattern-tools.d.ts.map +1 -1
- package/dist/tools/pattern-tools.js +292 -19
- package/dist/tools/pattern-tools.js.map +1 -1
- package/dist/tools/php-tools.d.ts +78 -4
- package/dist/tools/php-tools.d.ts.map +1 -1
- package/dist/tools/php-tools.js +824 -42
- package/dist/tools/php-tools.js.map +1 -1
- package/dist/tools/php8-compat-tools.d.ts +62 -0
- package/dist/tools/php8-compat-tools.d.ts.map +1 -0
- package/dist/tools/php8-compat-tools.js +287 -0
- package/dist/tools/php8-compat-tools.js.map +1 -0
- package/dist/tools/php8-migration-candidates-tools.d.ts +68 -0
- package/dist/tools/php8-migration-candidates-tools.d.ts.map +1 -0
- package/dist/tools/php8-migration-candidates-tools.js +476 -0
- package/dist/tools/php8-migration-candidates-tools.js.map +1 -0
- package/dist/tools/phpstan-baseline-tools.d.ts +62 -0
- package/dist/tools/phpstan-baseline-tools.d.ts.map +1 -0
- package/dist/tools/phpstan-baseline-tools.js +263 -0
- package/dist/tools/phpstan-baseline-tools.js.map +1 -0
- package/dist/tools/project-tools.d.ts +4 -2
- package/dist/tools/project-tools.d.ts.map +1 -1
- package/dist/tools/project-tools.js +20 -7
- package/dist/tools/project-tools.js.map +1 -1
- package/dist/tools/react-tools.d.ts +39 -9
- package/dist/tools/react-tools.d.ts.map +1 -1
- package/dist/tools/react-tools.js +313 -18
- package/dist/tools/react-tools.js.map +1 -1
- package/dist/tools/search-tools.d.ts.map +1 -1
- package/dist/tools/search-tools.js +35 -5
- package/dist/tools/search-tools.js.map +1 -1
- package/dist/tools/status-tools.d.ts +1 -0
- package/dist/tools/status-tools.d.ts.map +1 -1
- package/dist/tools/status-tools.js +1 -0
- package/dist/tools/status-tools.js.map +1 -1
- package/dist/tools/symbol-tools.d.ts +11 -0
- package/dist/tools/symbol-tools.d.ts.map +1 -1
- package/dist/tools/symbol-tools.js +107 -6
- package/dist/tools/symbol-tools.js.map +1 -1
- package/dist/tools/yii-console-tools.d.ts +69 -0
- package/dist/tools/yii-console-tools.d.ts.map +1 -0
- package/dist/tools/yii-console-tools.js +256 -0
- package/dist/tools/yii-console-tools.js.map +1 -0
- package/dist/tools/yii-migrations-tools.d.ts +79 -0
- package/dist/tools/yii-migrations-tools.d.ts.map +1 -0
- package/dist/tools/yii-migrations-tools.js +543 -0
- package/dist/tools/yii-migrations-tools.js.map +1 -0
- package/dist/tools/yii-modules-tools.d.ts +63 -0
- package/dist/tools/yii-modules-tools.d.ts.map +1 -0
- package/dist/tools/yii-modules-tools.js +201 -0
- package/dist/tools/yii-modules-tools.js.map +1 -0
- package/dist/tools/yii-rbac-tools.d.ts +89 -0
- package/dist/tools/yii-rbac-tools.d.ts.map +1 -0
- package/dist/tools/yii-rbac-tools.js +238 -0
- package/dist/tools/yii-rbac-tools.js.map +1 -0
- package/dist/tools/yii3-attribute-candidates-tools.d.ts +72 -0
- package/dist/tools/yii3-attribute-candidates-tools.d.ts.map +1 -0
- package/dist/tools/yii3-attribute-candidates-tools.js +301 -0
- package/dist/tools/yii3-attribute-candidates-tools.js.map +1 -0
- package/dist/tools/yii3-migration-tools.d.ts +74 -0
- package/dist/tools/yii3-migration-tools.d.ts.map +1 -0
- package/dist/tools/yii3-migration-tools.js +440 -0
- package/dist/tools/yii3-migration-tools.js.map +1 -0
- package/dist/types.d.ts +5 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/constant-file-pattern.d.ts +3 -1
- package/dist/utils/constant-file-pattern.d.ts.map +1 -1
- package/dist/utils/constant-file-pattern.js +6 -4
- package/dist/utils/constant-file-pattern.js.map +1 -1
- package/dist/utils/heritage-edges.d.ts +29 -0
- package/dist/utils/heritage-edges.d.ts.map +1 -0
- package/dist/utils/heritage-edges.js +94 -0
- package/dist/utils/heritage-edges.js.map +1 -0
- package/dist/utils/source-stripper.d.ts +23 -0
- package/dist/utils/source-stripper.d.ts.map +1 -0
- package/dist/utils/source-stripper.js +239 -0
- package/dist/utils/source-stripper.js.map +1 -0
- package/dist/utils/ts-imports.d.ts +7 -1
- package/dist/utils/ts-imports.d.ts.map +1 -1
- package/dist/utils/ts-imports.js +40 -7
- package/dist/utils/ts-imports.js.map +1 -1
- package/dist/utils/tsconfig-paths.d.ts +6 -5
- package/dist/utils/tsconfig-paths.d.ts.map +1 -1
- package/dist/utils/tsconfig-paths.js +52 -14
- package/dist/utils/tsconfig-paths.js.map +1 -1
- package/dist/utils/wall-clock.d.ts +9 -0
- package/dist/utils/wall-clock.d.ts.map +1 -0
- package/dist/utils/wall-clock.js +19 -0
- package/dist/utils/wall-clock.js.map +1 -0
- package/package.json +1 -1
- package/rules/codesift.md +16 -6
- package/rules/codesift.mdc +10 -3
- package/rules/codex.md +10 -3
- package/rules/gemini.md +10 -3
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/** Declarations indexed for resolving heritage names → defining file. */
|
|
2
|
+
const DECL_KINDS = new Set(["class", "interface", "type"]);
|
|
3
|
+
function stripTrailingGeneric(name) {
|
|
4
|
+
const i = name.indexOf("<");
|
|
5
|
+
return i >= 0 ? name.slice(0, i) : name;
|
|
6
|
+
}
|
|
7
|
+
function normalizeHeritageRef(raw) {
|
|
8
|
+
const compact = raw.replace(/\s+/g, "");
|
|
9
|
+
const lt = compact.indexOf("<");
|
|
10
|
+
return lt >= 0 ? compact.slice(0, lt) : compact;
|
|
11
|
+
}
|
|
12
|
+
function buildDeclaredTypeFiles(index) {
|
|
13
|
+
const map = new Map();
|
|
14
|
+
for (const s of index.symbols) {
|
|
15
|
+
if (!DECL_KINDS.has(s.kind))
|
|
16
|
+
continue;
|
|
17
|
+
const baseName = stripTrailingGeneric(s.name).trim();
|
|
18
|
+
if (!baseName)
|
|
19
|
+
continue;
|
|
20
|
+
let set = map.get(baseName);
|
|
21
|
+
if (!set) {
|
|
22
|
+
set = new Set();
|
|
23
|
+
map.set(baseName, set);
|
|
24
|
+
}
|
|
25
|
+
set.add(s.file);
|
|
26
|
+
}
|
|
27
|
+
return map;
|
|
28
|
+
}
|
|
29
|
+
function resolveHeritageTargetFile(raw, nameToFiles) {
|
|
30
|
+
const norm = normalizeHeritageRef(raw);
|
|
31
|
+
if (!norm)
|
|
32
|
+
return { status: "unresolved" };
|
|
33
|
+
const candidates = [norm];
|
|
34
|
+
const dot = norm.lastIndexOf(".");
|
|
35
|
+
if (dot >= 0)
|
|
36
|
+
candidates.push(norm.slice(dot + 1));
|
|
37
|
+
let sawAmbiguous = false;
|
|
38
|
+
for (const key of candidates) {
|
|
39
|
+
const files = nameToFiles.get(key);
|
|
40
|
+
if (!files)
|
|
41
|
+
continue;
|
|
42
|
+
if (files.size === 1)
|
|
43
|
+
return { status: "resolved", file: [...files][0] };
|
|
44
|
+
sawAmbiguous = true;
|
|
45
|
+
}
|
|
46
|
+
return sawAmbiguous ? { status: "ambiguous" } : { status: "unresolved" };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Best-effort module-level edges from symbol `extends` / `implements`.
|
|
50
|
+
* Resolves each referenced type name to a file only when exactly one
|
|
51
|
+
* declaration (class / interface / type alias) with that simple name exists.
|
|
52
|
+
*
|
|
53
|
+
* Returns the edge list and a `stats` block counting heritage refs that could
|
|
54
|
+
* not be resolved (ambiguous: 2+ declarations with same simple name; unresolved:
|
|
55
|
+
* no declared type with that name) so callers can surface the gap instead of
|
|
56
|
+
* silently dropping edges.
|
|
57
|
+
*/
|
|
58
|
+
export function collectHeritageFileEdgesWithStats(index) {
|
|
59
|
+
const nameToFiles = buildDeclaredTypeFiles(index);
|
|
60
|
+
const out = [];
|
|
61
|
+
const seen = new Set();
|
|
62
|
+
const stats = { ambiguous: 0, unresolved: 0 };
|
|
63
|
+
const push = (sym, names, kind) => {
|
|
64
|
+
if (!names?.length)
|
|
65
|
+
return;
|
|
66
|
+
for (const raw of names) {
|
|
67
|
+
const res = resolveHeritageTargetFile(raw, nameToFiles);
|
|
68
|
+
if (res.status === "ambiguous") {
|
|
69
|
+
stats.ambiguous += 1;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (res.status === "unresolved") {
|
|
73
|
+
stats.unresolved += 1;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (res.file === sym.file)
|
|
77
|
+
continue;
|
|
78
|
+
const key = `${sym.file}|${res.file}|${kind}`;
|
|
79
|
+
if (seen.has(key))
|
|
80
|
+
continue;
|
|
81
|
+
seen.add(key);
|
|
82
|
+
out.push({ from: sym.file, to: res.file, kind });
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
for (const sym of index.symbols) {
|
|
86
|
+
push(sym, sym.extends, "extends");
|
|
87
|
+
push(sym, sym.implements, "implements");
|
|
88
|
+
}
|
|
89
|
+
return { edges: out, stats };
|
|
90
|
+
}
|
|
91
|
+
export function collectHeritageFileEdges(index) {
|
|
92
|
+
return collectHeritageFileEdgesWithStats(index).edges;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=heritage-edges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heritage-edges.js","sourceRoot":"","sources":["../../src/utils/heritage-edges.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single-pass character-level state machine that strips comments, string
|
|
3
|
+
* literals, template literals, and JS regex literals from source code,
|
|
4
|
+
* replacing each stripped character with whitespace so that downstream
|
|
5
|
+
* regex match positions remain stable.
|
|
6
|
+
*
|
|
7
|
+
* Tier 8 — promoted from Tier 7's react-tools internal helper. Used by both
|
|
8
|
+
* pattern-tools.ts (preprocessing for regex patterns with `preprocess: true`)
|
|
9
|
+
* and react-tools.ts (Suspense ancestor detection).
|
|
10
|
+
*
|
|
11
|
+
* Handles:
|
|
12
|
+
* - // line comments
|
|
13
|
+
* - block comments
|
|
14
|
+
* - 'single' / "double" / `template` string literals (with escape sequences)
|
|
15
|
+
* - JS regex literals /pattern/flags including character classes [...]
|
|
16
|
+
*
|
|
17
|
+
* Heuristic — distinguishes `/` as division from `/` as regex-start by
|
|
18
|
+
* examining the preceding non-whitespace token. Does not handle:
|
|
19
|
+
* - JSX text nodes (out of scope; JSX has no comment grammar between tags)
|
|
20
|
+
* - tagged template expressions ${...} contents (treated opaquely)
|
|
21
|
+
*/
|
|
22
|
+
export declare function stripCommentsAndStrings(source: string): string;
|
|
23
|
+
//# sourceMappingURL=source-stripper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-stripper.d.ts","sourceRoot":"","sources":["../../src/utils/source-stripper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAsN9D"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single-pass character-level state machine that strips comments, string
|
|
3
|
+
* literals, template literals, and JS regex literals from source code,
|
|
4
|
+
* replacing each stripped character with whitespace so that downstream
|
|
5
|
+
* regex match positions remain stable.
|
|
6
|
+
*
|
|
7
|
+
* Tier 8 — promoted from Tier 7's react-tools internal helper. Used by both
|
|
8
|
+
* pattern-tools.ts (preprocessing for regex patterns with `preprocess: true`)
|
|
9
|
+
* and react-tools.ts (Suspense ancestor detection).
|
|
10
|
+
*
|
|
11
|
+
* Handles:
|
|
12
|
+
* - // line comments
|
|
13
|
+
* - block comments
|
|
14
|
+
* - 'single' / "double" / `template` string literals (with escape sequences)
|
|
15
|
+
* - JS regex literals /pattern/flags including character classes [...]
|
|
16
|
+
*
|
|
17
|
+
* Heuristic — distinguishes `/` as division from `/` as regex-start by
|
|
18
|
+
* examining the preceding non-whitespace token. Does not handle:
|
|
19
|
+
* - JSX text nodes (out of scope; JSX has no comment grammar between tags)
|
|
20
|
+
* - tagged template expressions ${...} contents (treated opaquely)
|
|
21
|
+
*/
|
|
22
|
+
export function stripCommentsAndStrings(source) {
|
|
23
|
+
const out = [];
|
|
24
|
+
let i = 0;
|
|
25
|
+
const n = source.length;
|
|
26
|
+
let state = "code";
|
|
27
|
+
let lastCodeChar = "";
|
|
28
|
+
// Stack of template-literal contexts pending continuation after `${...}`
|
|
29
|
+
// expression interpolation. Each entry stores the brace depth at which to
|
|
30
|
+
// pop back to template state.
|
|
31
|
+
const templateStack = [];
|
|
32
|
+
let braceDepth = 0;
|
|
33
|
+
// JS keywords that legally precede a regex literal (start an expression).
|
|
34
|
+
// Adversarial Run 1 CRITICAL: `return /x/`, `throw /x/`, `case /x/` were
|
|
35
|
+
// previously misclassified as division because the preceding char was `n`
|
|
36
|
+
// (return) / `w` (throw) / `e` (case) — word chars failing the operator test.
|
|
37
|
+
const REGEX_PRECEDING_KEYWORDS = new Set([
|
|
38
|
+
"return", "throw", "case", "delete", "in", "of", "instanceof", "typeof",
|
|
39
|
+
"new", "void", "yield", "await", "do", "else",
|
|
40
|
+
]);
|
|
41
|
+
function isRegexContext(prev, prevToken) {
|
|
42
|
+
if (prev === "")
|
|
43
|
+
return true;
|
|
44
|
+
if (REGEX_PRECEDING_KEYWORDS.has(prevToken))
|
|
45
|
+
return true;
|
|
46
|
+
return /[=(,;!&|?:{[<>+\-*%^~]/.test(prev);
|
|
47
|
+
}
|
|
48
|
+
// Track most recent identifier-shaped token from the code stream so we can
|
|
49
|
+
// recognise keywords like `return` / `throw` before a `/`.
|
|
50
|
+
let prevToken = "";
|
|
51
|
+
let identBuf = "";
|
|
52
|
+
while (i < n) {
|
|
53
|
+
const c = source[i];
|
|
54
|
+
const next = i + 1 < n ? source[i + 1] : "";
|
|
55
|
+
if (state === "code") {
|
|
56
|
+
if (c === "/" && next === "/") {
|
|
57
|
+
if (identBuf.length > 0) {
|
|
58
|
+
prevToken = identBuf;
|
|
59
|
+
identBuf = "";
|
|
60
|
+
}
|
|
61
|
+
state = "lineComment";
|
|
62
|
+
out.push(" ", " ");
|
|
63
|
+
i += 2;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (c === "/" && next === "*") {
|
|
67
|
+
if (identBuf.length > 0) {
|
|
68
|
+
prevToken = identBuf;
|
|
69
|
+
identBuf = "";
|
|
70
|
+
}
|
|
71
|
+
state = "blockComment";
|
|
72
|
+
out.push(" ", " ");
|
|
73
|
+
i += 2;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (c === "/" && isRegexContext(lastCodeChar, prevToken)) {
|
|
77
|
+
state = "regex";
|
|
78
|
+
out.push(" ");
|
|
79
|
+
i++;
|
|
80
|
+
identBuf = "";
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (c === "'") {
|
|
84
|
+
state = "single";
|
|
85
|
+
out.push(" ");
|
|
86
|
+
i++;
|
|
87
|
+
lastCodeChar = c;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (c === '"') {
|
|
91
|
+
state = "double";
|
|
92
|
+
out.push(" ");
|
|
93
|
+
i++;
|
|
94
|
+
lastCodeChar = c;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (c === "`") {
|
|
98
|
+
state = "template";
|
|
99
|
+
out.push(" ");
|
|
100
|
+
i++;
|
|
101
|
+
lastCodeChar = c;
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
// Track brace depth — needed for template ${...} expression closure.
|
|
105
|
+
if (c === "{")
|
|
106
|
+
braceDepth++;
|
|
107
|
+
else if (c === "}") {
|
|
108
|
+
// Closing `}` may end a template ${} expression
|
|
109
|
+
if (templateStack.length > 0 && templateStack[templateStack.length - 1].braceDepth === braceDepth) {
|
|
110
|
+
templateStack.pop();
|
|
111
|
+
state = "template";
|
|
112
|
+
out.push(" ");
|
|
113
|
+
i++;
|
|
114
|
+
// Reset code-state token tracking
|
|
115
|
+
if (identBuf.length > 0) {
|
|
116
|
+
prevToken = identBuf;
|
|
117
|
+
identBuf = "";
|
|
118
|
+
}
|
|
119
|
+
lastCodeChar = "";
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
braceDepth--;
|
|
123
|
+
}
|
|
124
|
+
out.push(c);
|
|
125
|
+
if (/\s/.test(c)) {
|
|
126
|
+
// Whitespace flushes any identifier accumulated so far to prevToken.
|
|
127
|
+
if (identBuf.length > 0) {
|
|
128
|
+
prevToken = identBuf;
|
|
129
|
+
identBuf = "";
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
lastCodeChar = c;
|
|
134
|
+
// Track identifier-shaped tokens for keyword-aware regex detection.
|
|
135
|
+
if (/[A-Za-z_$]/.test(c) || (/[0-9]/.test(c) && identBuf.length > 0)) {
|
|
136
|
+
identBuf += c;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
if (identBuf.length > 0)
|
|
140
|
+
prevToken = identBuf;
|
|
141
|
+
identBuf = "";
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
i++;
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (state === "lineComment") {
|
|
148
|
+
if (c === "\n") {
|
|
149
|
+
state = "code";
|
|
150
|
+
out.push("\n");
|
|
151
|
+
i++;
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
out.push(" ");
|
|
155
|
+
i++;
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
if (state === "blockComment") {
|
|
159
|
+
if (c === "*" && next === "/") {
|
|
160
|
+
state = "code";
|
|
161
|
+
out.push(" ", " ");
|
|
162
|
+
i += 2;
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
out.push(c === "\n" ? "\n" : " ");
|
|
166
|
+
i++;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (state === "regex") {
|
|
170
|
+
if (c === "\\" && next) {
|
|
171
|
+
out.push(" ", " ");
|
|
172
|
+
i += 2;
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
if (c === "[") {
|
|
176
|
+
out.push(" ");
|
|
177
|
+
i++;
|
|
178
|
+
while (i < n && source[i] !== "]") {
|
|
179
|
+
if (source[i] === "\\" && i + 1 < n) {
|
|
180
|
+
out.push(" ", " ");
|
|
181
|
+
i += 2;
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
out.push(source[i] === "\n" ? "\n" : " ");
|
|
185
|
+
i++;
|
|
186
|
+
}
|
|
187
|
+
if (i < n) {
|
|
188
|
+
out.push(" ");
|
|
189
|
+
i++;
|
|
190
|
+
}
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
if (c === "/") {
|
|
194
|
+
// Adversarial Run 1: consume trailing regex flags `gimsuy...` so they
|
|
195
|
+
// don't leak into code stream as identifier characters.
|
|
196
|
+
out.push(" ");
|
|
197
|
+
i++;
|
|
198
|
+
while (i < n && /[gimsuyd]/.test(source[i])) {
|
|
199
|
+
out.push(" ");
|
|
200
|
+
i++;
|
|
201
|
+
}
|
|
202
|
+
state = "code";
|
|
203
|
+
lastCodeChar = "/";
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
out.push(c === "\n" ? "\n" : " ");
|
|
207
|
+
i++;
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
// string-like states: single, double, template
|
|
211
|
+
const closer = state === "single" ? "'" : state === "double" ? '"' : "`";
|
|
212
|
+
if (c === "\\" && next) {
|
|
213
|
+
out.push(" ", " ");
|
|
214
|
+
i += 2;
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
// Template ${...} interpolation — switch to code state, push template
|
|
218
|
+
// context onto stack so we resume after matching `}`.
|
|
219
|
+
if (state === "template" && c === "$" && next === "{") {
|
|
220
|
+
templateStack.push({ braceDepth: braceDepth });
|
|
221
|
+
braceDepth++;
|
|
222
|
+
state = "code";
|
|
223
|
+
out.push("$", "{"); // preserve in output so contents get processed
|
|
224
|
+
i += 2;
|
|
225
|
+
lastCodeChar = "{";
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
if (c === closer) {
|
|
229
|
+
state = "code";
|
|
230
|
+
out.push(" ");
|
|
231
|
+
i++;
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
out.push(c === "\n" ? "\n" : " ");
|
|
235
|
+
i++;
|
|
236
|
+
}
|
|
237
|
+
return out.join("");
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=source-stripper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-stripper.js","sourceRoot":"","sources":["../../src/utils/source-stripper.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,13 +15,19 @@
|
|
|
15
15
|
* - `import { } from "y"` (empty named clause) → runtime (module still evaluated)
|
|
16
16
|
* - `import * as ns from "y"` / default / side-effect → runtime
|
|
17
17
|
* - `export { X } from "y"` → runtime; `export type { X } from "y"` → type_only:true
|
|
18
|
+
* - per-specifier `export { type X, Y } from "y"` → runtime if any runtime export (same rule as imports)
|
|
18
19
|
* - `export * from "y"` → runtime; `export type * from "y"` → type_only:true
|
|
20
|
+
* - `import x = require("y")` → runtime edge to `y` (handled via `import_require_clause`)
|
|
21
|
+
*
|
|
22
|
+
* Limitation: `import { type X } from "m"` is modeled type-only when all named bindings are
|
|
23
|
+
* `type`-only; with `verbatimModuleSyntax`, TS may still emit a runtime module dependency —
|
|
24
|
+
* we do not read compilerOptions here, so graphs may under-report runtime edges in that mode.
|
|
19
25
|
*/
|
|
20
26
|
import type Parser from "web-tree-sitter";
|
|
21
27
|
export interface TsImportEdge {
|
|
22
28
|
/** raw specifier text from the import source (relative or bare/aliased) */
|
|
23
29
|
path: string;
|
|
24
|
-
/** true when
|
|
30
|
+
/** true when statement-level `import type` / `export type`, all per-specifier `type` bindings in a named clause, or `export type *`; see file header for edge cases */
|
|
25
31
|
is_type_only: boolean;
|
|
26
32
|
/** imported/re-exported names (for future use; empty for side-effect imports) */
|
|
27
33
|
specifiers: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ts-imports.d.ts","sourceRoot":"","sources":["../../src/utils/ts-imports.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ts-imports.d.ts","sourceRoot":"","sources":["../../src/utils/ts-imports.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAE1C,MAAM,WAAW,YAAY;IAC3B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,uKAAuK;IACvK,YAAY,EAAE,OAAO,CAAC;IACtB,iFAAiF;IACjF,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AA8GD,6DAA6D;AAC7D,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,YAAY,EAAE,CA+E1E"}
|
package/dist/utils/ts-imports.js
CHANGED
|
@@ -15,7 +15,13 @@
|
|
|
15
15
|
* - `import { } from "y"` (empty named clause) → runtime (module still evaluated)
|
|
16
16
|
* - `import * as ns from "y"` / default / side-effect → runtime
|
|
17
17
|
* - `export { X } from "y"` → runtime; `export type { X } from "y"` → type_only:true
|
|
18
|
+
* - per-specifier `export { type X, Y } from "y"` → runtime if any runtime export (same rule as imports)
|
|
18
19
|
* - `export * from "y"` → runtime; `export type * from "y"` → type_only:true
|
|
20
|
+
* - `import x = require("y")` → runtime edge to `y` (handled via `import_require_clause`)
|
|
21
|
+
*
|
|
22
|
+
* Limitation: `import { type X } from "m"` is modeled type-only when all named bindings are
|
|
23
|
+
* `type`-only; with `verbatimModuleSyntax`, TS may still emit a runtime module dependency —
|
|
24
|
+
* we do not read compilerOptions here, so graphs may under-report runtime edges in that mode.
|
|
19
25
|
*/
|
|
20
26
|
/** True when this statement node has a top-level `type` keyword child
|
|
21
27
|
* (e.g., `import type {...}` or `export type {...}`).
|
|
@@ -101,28 +107,48 @@ function walkImportClause(clause) {
|
|
|
101
107
|
}
|
|
102
108
|
return { specifiers, anyRuntimeSpecifier };
|
|
103
109
|
}
|
|
104
|
-
/** Walk an `export_clause` (named re-exports) to collect names
|
|
105
|
-
*
|
|
106
|
-
* export_statement, not per-specifier here (TS does not distinguish at the
|
|
107
|
-
* specifier level inside `export {X} from "y"` to the same extent as imports). */
|
|
110
|
+
/** Walk an `export_clause` (named re-exports) to collect names and whether any
|
|
111
|
+
* specifier is not `type`-only (mirrors `import_specifier` rules). */
|
|
108
112
|
function walkExportClause(clause) {
|
|
109
113
|
const specifiers = [];
|
|
114
|
+
let anyRuntimeSpecifier = false;
|
|
115
|
+
let namedCount = 0;
|
|
110
116
|
for (const spec of clause.namedChildren) {
|
|
111
117
|
if (spec.type !== "export_specifier")
|
|
112
118
|
continue;
|
|
119
|
+
namedCount += 1;
|
|
113
120
|
const nameNode = spec.childForFieldName("name");
|
|
114
121
|
const aliasNode = spec.childForFieldName("alias");
|
|
115
122
|
const emitName = (aliasNode ?? nameNode)?.text;
|
|
116
123
|
if (emitName)
|
|
117
124
|
specifiers.push(emitName);
|
|
125
|
+
const isTyped = spec.children.some((c) => c.type === "type" && c.text === "type");
|
|
126
|
+
if (!isTyped)
|
|
127
|
+
anyRuntimeSpecifier = true;
|
|
118
128
|
}
|
|
119
|
-
|
|
129
|
+
if (namedCount === 0)
|
|
130
|
+
anyRuntimeSpecifier = true;
|
|
131
|
+
return { specifiers, anyRuntimeSpecifier };
|
|
120
132
|
}
|
|
121
133
|
/** Walk the tree and return all import + re-export edges. */
|
|
122
134
|
export function extractTypeScriptImports(tree) {
|
|
123
135
|
const edges = [];
|
|
124
136
|
function visit(node) {
|
|
125
137
|
if (node.type === "import_statement") {
|
|
138
|
+
const requireClause = node.namedChildren.find((c) => c.type === "import_require_clause");
|
|
139
|
+
if (requireClause) {
|
|
140
|
+
const src = requireClause.childForFieldName("source");
|
|
141
|
+
if (!src)
|
|
142
|
+
return;
|
|
143
|
+
const path = src.text.replace(/^['"`]|['"`]$/g, "");
|
|
144
|
+
const id = requireClause.namedChildren.find((c) => c.type === "identifier");
|
|
145
|
+
edges.push({
|
|
146
|
+
path,
|
|
147
|
+
is_type_only: false,
|
|
148
|
+
specifiers: id ? [id.text] : [],
|
|
149
|
+
});
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
126
152
|
const path = getSourcePath(node);
|
|
127
153
|
if (!path)
|
|
128
154
|
return; // malformed; skip
|
|
@@ -149,11 +175,16 @@ export function extractTypeScriptImports(tree) {
|
|
|
149
175
|
visit(c);
|
|
150
176
|
return;
|
|
151
177
|
}
|
|
152
|
-
const
|
|
178
|
+
const stmtTypeOnly = statementIsTypeOnly(node);
|
|
153
179
|
let specifiers = [];
|
|
180
|
+
let sawNamedExportClause = false;
|
|
181
|
+
let anyRuntimeExportSpecifier = true;
|
|
154
182
|
for (const child of node.namedChildren) {
|
|
155
183
|
if (child.type === "export_clause") {
|
|
156
|
-
|
|
184
|
+
sawNamedExportClause = true;
|
|
185
|
+
const w = walkExportClause(child);
|
|
186
|
+
specifiers = w.specifiers;
|
|
187
|
+
anyRuntimeExportSpecifier = w.anyRuntimeSpecifier;
|
|
157
188
|
}
|
|
158
189
|
// namespace_export `export * as ns from "y"` → record `ns` as specifier
|
|
159
190
|
if (child.type === "namespace_export") {
|
|
@@ -162,6 +193,8 @@ export function extractTypeScriptImports(tree) {
|
|
|
162
193
|
specifiers.push(id.text);
|
|
163
194
|
}
|
|
164
195
|
}
|
|
196
|
+
const is_type_only = stmtTypeOnly ||
|
|
197
|
+
(sawNamedExportClause && !anyRuntimeExportSpecifier);
|
|
165
198
|
edges.push({ path, is_type_only, specifiers });
|
|
166
199
|
return;
|
|
167
200
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ts-imports.js","sourceRoot":"","sources":["../../src/utils/ts-imports.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ts-imports.js","sourceRoot":"","sources":["../../src/utils/ts-imports.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
* `tsconfig.json`, using `get-tsconfig` for `extends`-chain + paths handling.
|
|
4
4
|
*
|
|
5
5
|
* Two-level cache keeps long-running MCP server processes happy:
|
|
6
|
-
* - `dirToConfigCache`:
|
|
7
|
-
* (or null when none found up to repoRoot).
|
|
8
|
-
*
|
|
6
|
+
* - `dirToConfigCache`: `${repoRoot}::${importerDir}` → nearest tsconfig.json path
|
|
7
|
+
* (or null when none found up to repoRoot). Includes repoRoot so the same
|
|
8
|
+
* importer directory analyzed under different root boundaries does not reuse
|
|
9
|
+
* a stale tsconfig from another indexing scope.
|
|
9
10
|
* - `configCache`: tsconfig.json absolute path → parsed { matcher, baseUrl }.
|
|
10
11
|
*
|
|
11
12
|
* Both caches are cleared on `clearTsconfigCache()`. The graph builder calls
|
|
@@ -29,8 +30,8 @@ interface ResolvedTsconfig {
|
|
|
29
30
|
export declare function clearTsconfigCache(): void;
|
|
30
31
|
/** Walk up from `dir` to `repoRoot`, find nearest `tsconfig.json`.
|
|
31
32
|
* Returns absolute path of the config file, or null if none found.
|
|
32
|
-
* Caches
|
|
33
|
-
*
|
|
33
|
+
* Caches every ancestor visited during the walk under the compound `(repoRoot, dir)`
|
|
34
|
+
* key — sibling lookups under the same parent are O(1) after the first hit. */
|
|
34
35
|
declare function findNearestTsconfig(dir: string, repoRoot: string): string | null;
|
|
35
36
|
/** Parse a tsconfig.json (with `extends` chain) and build a paths matcher.
|
|
36
37
|
* Returns null on parse error. Caches successful parses only — failures are
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tsconfig-paths.d.ts","sourceRoot":"","sources":["../../src/utils/tsconfig-paths.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"tsconfig-paths.d.ts","sourceRoot":"","sources":["../../src/utils/tsconfig-paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,UAAU,gBAAgB;IACxB,YAAY,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IACvD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AA4BD,gEAAgE;AAChE,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC;AA0BD;;;+EAG+E;AAC/E,iBAAS,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyBzE;AAED;;;mDAGmD;AACnD,iBAAS,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CA8BjE;AAED;qCACqC;AACrC,iBAAS,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAcnD;AAED;;;;;;mEAMmE;AACnE,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAqCf;AAGD,eAAO,MAAM,MAAM;;;;;;;CAQlB,CAAC"}
|