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.
Files changed (207) hide show
  1. package/README.md +7 -2
  2. package/dist/cli/commands.d.ts.map +1 -1
  3. package/dist/cli/commands.js +25 -3
  4. package/dist/cli/commands.js.map +1 -1
  5. package/dist/cli/git-hooks-installer.d.ts +2 -0
  6. package/dist/cli/git-hooks-installer.d.ts.map +1 -1
  7. package/dist/cli/git-hooks-installer.js +47 -7
  8. package/dist/cli/git-hooks-installer.js.map +1 -1
  9. package/dist/cli/hooks.d.ts.map +1 -1
  10. package/dist/cli/hooks.js +53 -0
  11. package/dist/cli/hooks.js.map +1 -1
  12. package/dist/cli/setup.d.ts +5 -0
  13. package/dist/cli/setup.d.ts.map +1 -1
  14. package/dist/cli/setup.js +31 -5
  15. package/dist/cli/setup.js.map +1 -1
  16. package/dist/config.d.ts +2 -1
  17. package/dist/config.d.ts.map +1 -1
  18. package/dist/config.js +10 -1
  19. package/dist/config.js.map +1 -1
  20. package/dist/instructions.d.ts +1 -1
  21. package/dist/instructions.d.ts.map +1 -1
  22. package/dist/instructions.js +6 -1
  23. package/dist/instructions.js.map +1 -1
  24. package/dist/parser/extractors/_shared.js +2 -2
  25. package/dist/parser/extractors/_shared.js.map +1 -1
  26. package/dist/parser/extractors/hono.d.ts.map +1 -1
  27. package/dist/parser/extractors/hono.js +60 -15
  28. package/dist/parser/extractors/hono.js.map +1 -1
  29. package/dist/parser/extractors/php.d.ts +12 -0
  30. package/dist/parser/extractors/php.d.ts.map +1 -1
  31. package/dist/parser/extractors/php.js +440 -26
  32. package/dist/parser/extractors/php.js.map +1 -1
  33. package/dist/parser/extractors/python.js +4 -5
  34. package/dist/parser/extractors/python.js.map +1 -1
  35. package/dist/parser/extractors/typescript.d.ts.map +1 -1
  36. package/dist/parser/extractors/typescript.js +70 -22
  37. package/dist/parser/extractors/typescript.js.map +1 -1
  38. package/dist/register-tool-loaders.d.ts +22 -0
  39. package/dist/register-tool-loaders.d.ts.map +1 -1
  40. package/dist/register-tool-loaders.js +38 -0
  41. package/dist/register-tool-loaders.js.map +1 -1
  42. package/dist/register-tools.d.ts +3 -1
  43. package/dist/register-tools.d.ts.map +1 -1
  44. package/dist/register-tools.js +527 -7
  45. package/dist/register-tools.js.map +1 -1
  46. package/dist/retrieval/codebase-retrieval.d.ts.map +1 -1
  47. package/dist/retrieval/codebase-retrieval.js +22 -0
  48. package/dist/retrieval/codebase-retrieval.js.map +1 -1
  49. package/dist/retrieval/retrieval-schemas.d.ts +4 -0
  50. package/dist/retrieval/retrieval-schemas.d.ts.map +1 -1
  51. package/dist/retrieval/semantic-handlers.js +1 -1
  52. package/dist/retrieval/semantic-handlers.js.map +1 -1
  53. package/dist/search/semantic.d.ts +21 -5
  54. package/dist/search/semantic.d.ts.map +1 -1
  55. package/dist/search/semantic.js +129 -4
  56. package/dist/search/semantic.js.map +1 -1
  57. package/dist/search/tool-ranker.js +1 -1
  58. package/dist/search/tool-ranker.js.map +1 -1
  59. package/dist/server-helpers.js +1 -1
  60. package/dist/server-helpers.js.map +1 -1
  61. package/dist/storage/index-store.d.ts +13 -1
  62. package/dist/storage/index-store.d.ts.map +1 -1
  63. package/dist/storage/index-store.js +34 -33
  64. package/dist/storage/index-store.js.map +1 -1
  65. package/dist/storage/registry.d.ts +28 -4
  66. package/dist/storage/registry.d.ts.map +1 -1
  67. package/dist/storage/registry.js +126 -5
  68. package/dist/storage/registry.js.map +1 -1
  69. package/dist/storage/usage-stats.d.ts +2 -0
  70. package/dist/storage/usage-stats.d.ts.map +1 -1
  71. package/dist/storage/usage-stats.js +6 -0
  72. package/dist/storage/usage-stats.js.map +1 -1
  73. package/dist/tools/_helpers.d.ts +2 -0
  74. package/dist/tools/_helpers.d.ts.map +1 -1
  75. package/dist/tools/_helpers.js +16 -1
  76. package/dist/tools/_helpers.js.map +1 -1
  77. package/dist/tools/astro-audit.d.ts +40 -0
  78. package/dist/tools/astro-audit.d.ts.map +1 -1
  79. package/dist/tools/astro-audit.js +94 -5
  80. package/dist/tools/astro-audit.js.map +1 -1
  81. package/dist/tools/astro-env-validator.d.ts +38 -0
  82. package/dist/tools/astro-env-validator.d.ts.map +1 -0
  83. package/dist/tools/astro-env-validator.js +190 -0
  84. package/dist/tools/astro-env-validator.js.map +1 -0
  85. package/dist/tools/astro-helpers.js +2 -2
  86. package/dist/tools/astro-helpers.js.map +1 -1
  87. package/dist/tools/astro-image-audit.d.ts +35 -0
  88. package/dist/tools/astro-image-audit.d.ts.map +1 -0
  89. package/dist/tools/astro-image-audit.js +129 -0
  90. package/dist/tools/astro-image-audit.js.map +1 -0
  91. package/dist/tools/astro-middleware.d.ts.map +1 -1
  92. package/dist/tools/astro-middleware.js +36 -11
  93. package/dist/tools/astro-middleware.js.map +1 -1
  94. package/dist/tools/astro-migration.d.ts.map +1 -1
  95. package/dist/tools/astro-migration.js +66 -0
  96. package/dist/tools/astro-migration.js.map +1 -1
  97. package/dist/tools/astro-svg-components.d.ts +32 -0
  98. package/dist/tools/astro-svg-components.d.ts.map +1 -0
  99. package/dist/tools/astro-svg-components.js +123 -0
  100. package/dist/tools/astro-svg-components.js.map +1 -0
  101. package/dist/tools/context-tools.d.ts.map +1 -1
  102. package/dist/tools/context-tools.js +45 -7
  103. package/dist/tools/context-tools.js.map +1 -1
  104. package/dist/tools/conversation-tools.js +1 -1
  105. package/dist/tools/conversation-tools.js.map +1 -1
  106. package/dist/tools/index-tools.d.ts +12 -0
  107. package/dist/tools/index-tools.d.ts.map +1 -1
  108. package/dist/tools/index-tools.js +54 -6
  109. package/dist/tools/index-tools.js.map +1 -1
  110. package/dist/tools/insights-tools.d.ts +137 -0
  111. package/dist/tools/insights-tools.d.ts.map +1 -0
  112. package/dist/tools/insights-tools.js +438 -0
  113. package/dist/tools/insights-tools.js.map +1 -0
  114. package/dist/tools/pattern-tools.d.ts +7 -0
  115. package/dist/tools/pattern-tools.d.ts.map +1 -1
  116. package/dist/tools/pattern-tools.js +292 -19
  117. package/dist/tools/pattern-tools.js.map +1 -1
  118. package/dist/tools/php-tools.d.ts +78 -4
  119. package/dist/tools/php-tools.d.ts.map +1 -1
  120. package/dist/tools/php-tools.js +824 -42
  121. package/dist/tools/php-tools.js.map +1 -1
  122. package/dist/tools/php8-compat-tools.d.ts +62 -0
  123. package/dist/tools/php8-compat-tools.d.ts.map +1 -0
  124. package/dist/tools/php8-compat-tools.js +287 -0
  125. package/dist/tools/php8-compat-tools.js.map +1 -0
  126. package/dist/tools/php8-migration-candidates-tools.d.ts +68 -0
  127. package/dist/tools/php8-migration-candidates-tools.d.ts.map +1 -0
  128. package/dist/tools/php8-migration-candidates-tools.js +476 -0
  129. package/dist/tools/php8-migration-candidates-tools.js.map +1 -0
  130. package/dist/tools/phpstan-baseline-tools.d.ts +62 -0
  131. package/dist/tools/phpstan-baseline-tools.d.ts.map +1 -0
  132. package/dist/tools/phpstan-baseline-tools.js +263 -0
  133. package/dist/tools/phpstan-baseline-tools.js.map +1 -0
  134. package/dist/tools/project-tools.d.ts +4 -2
  135. package/dist/tools/project-tools.d.ts.map +1 -1
  136. package/dist/tools/project-tools.js +20 -7
  137. package/dist/tools/project-tools.js.map +1 -1
  138. package/dist/tools/react-tools.d.ts +39 -9
  139. package/dist/tools/react-tools.d.ts.map +1 -1
  140. package/dist/tools/react-tools.js +313 -18
  141. package/dist/tools/react-tools.js.map +1 -1
  142. package/dist/tools/search-tools.d.ts.map +1 -1
  143. package/dist/tools/search-tools.js +35 -5
  144. package/dist/tools/search-tools.js.map +1 -1
  145. package/dist/tools/status-tools.d.ts +1 -0
  146. package/dist/tools/status-tools.d.ts.map +1 -1
  147. package/dist/tools/status-tools.js +1 -0
  148. package/dist/tools/status-tools.js.map +1 -1
  149. package/dist/tools/symbol-tools.d.ts +11 -0
  150. package/dist/tools/symbol-tools.d.ts.map +1 -1
  151. package/dist/tools/symbol-tools.js +107 -6
  152. package/dist/tools/symbol-tools.js.map +1 -1
  153. package/dist/tools/yii-console-tools.d.ts +69 -0
  154. package/dist/tools/yii-console-tools.d.ts.map +1 -0
  155. package/dist/tools/yii-console-tools.js +256 -0
  156. package/dist/tools/yii-console-tools.js.map +1 -0
  157. package/dist/tools/yii-migrations-tools.d.ts +79 -0
  158. package/dist/tools/yii-migrations-tools.d.ts.map +1 -0
  159. package/dist/tools/yii-migrations-tools.js +543 -0
  160. package/dist/tools/yii-migrations-tools.js.map +1 -0
  161. package/dist/tools/yii-modules-tools.d.ts +63 -0
  162. package/dist/tools/yii-modules-tools.d.ts.map +1 -0
  163. package/dist/tools/yii-modules-tools.js +201 -0
  164. package/dist/tools/yii-modules-tools.js.map +1 -0
  165. package/dist/tools/yii-rbac-tools.d.ts +89 -0
  166. package/dist/tools/yii-rbac-tools.d.ts.map +1 -0
  167. package/dist/tools/yii-rbac-tools.js +238 -0
  168. package/dist/tools/yii-rbac-tools.js.map +1 -0
  169. package/dist/tools/yii3-attribute-candidates-tools.d.ts +72 -0
  170. package/dist/tools/yii3-attribute-candidates-tools.d.ts.map +1 -0
  171. package/dist/tools/yii3-attribute-candidates-tools.js +301 -0
  172. package/dist/tools/yii3-attribute-candidates-tools.js.map +1 -0
  173. package/dist/tools/yii3-migration-tools.d.ts +74 -0
  174. package/dist/tools/yii3-migration-tools.d.ts.map +1 -0
  175. package/dist/tools/yii3-migration-tools.js +440 -0
  176. package/dist/tools/yii3-migration-tools.js.map +1 -0
  177. package/dist/types.d.ts +5 -1
  178. package/dist/types.d.ts.map +1 -1
  179. package/dist/utils/constant-file-pattern.d.ts +3 -1
  180. package/dist/utils/constant-file-pattern.d.ts.map +1 -1
  181. package/dist/utils/constant-file-pattern.js +6 -4
  182. package/dist/utils/constant-file-pattern.js.map +1 -1
  183. package/dist/utils/heritage-edges.d.ts +29 -0
  184. package/dist/utils/heritage-edges.d.ts.map +1 -0
  185. package/dist/utils/heritage-edges.js +94 -0
  186. package/dist/utils/heritage-edges.js.map +1 -0
  187. package/dist/utils/source-stripper.d.ts +23 -0
  188. package/dist/utils/source-stripper.d.ts.map +1 -0
  189. package/dist/utils/source-stripper.js +239 -0
  190. package/dist/utils/source-stripper.js.map +1 -0
  191. package/dist/utils/ts-imports.d.ts +7 -1
  192. package/dist/utils/ts-imports.d.ts.map +1 -1
  193. package/dist/utils/ts-imports.js +40 -7
  194. package/dist/utils/ts-imports.js.map +1 -1
  195. package/dist/utils/tsconfig-paths.d.ts +6 -5
  196. package/dist/utils/tsconfig-paths.d.ts.map +1 -1
  197. package/dist/utils/tsconfig-paths.js +52 -14
  198. package/dist/utils/tsconfig-paths.js.map +1 -1
  199. package/dist/utils/wall-clock.d.ts +9 -0
  200. package/dist/utils/wall-clock.d.ts.map +1 -0
  201. package/dist/utils/wall-clock.js +19 -0
  202. package/dist/utils/wall-clock.js.map +1 -0
  203. package/package.json +1 -1
  204. package/rules/codesift.md +16 -6
  205. package/rules/codesift.mdc +10 -3
  206. package/rules/codex.md +10 -3
  207. 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 entire statement is type-only OR every named specifier is `type`-only */
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;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAE1C,MAAM,WAAW,YAAY;IAC3B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,sFAAsF;IACtF,YAAY,EAAE,OAAO,CAAC;IACtB,iFAAiF;IACjF,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAqGD,6DAA6D;AAC7D,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,YAAY,EAAE,CAqD1E"}
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"}
@@ -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
- * Returns specifiers list. Type-only-ness is derived from the parent
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
- return specifiers;
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 is_type_only = statementIsTypeOnly(node);
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
- specifiers = walkExportClause(child);
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":"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"}
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`: importer directory absolute path → nearest tsconfig.json path
7
- * (or null when none found up to repoRoot). Entries are per queried dir only
8
- * so adding/removing tsconfig is visible after `clearTsconfigCache()`.
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 result only for the requested `dir` (not every ancestor) so late-added
33
- * or removed tsconfig files are visible on the next lookup after cache clear. */
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;;;;;;;;;;;;;;;;;;;;;GAqBG;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;AAoBD,gEAAgE;AAChE,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC;AAUD;;;iFAGiF;AACjF,iBAAS,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBzE;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,CA4Bf;AAGD,eAAO,MAAM,MAAM;;;;;;;CAQlB,CAAC"}
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"}