codesift-mcp 0.7.0 → 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 (158) hide show
  1. package/README.md +3 -3
  2. package/dist/cli/git-hooks-installer.d.ts.map +1 -1
  3. package/dist/cli/git-hooks-installer.js +18 -5
  4. package/dist/cli/git-hooks-installer.js.map +1 -1
  5. package/dist/cli/hooks.d.ts.map +1 -1
  6. package/dist/cli/hooks.js +53 -0
  7. package/dist/cli/hooks.js.map +1 -1
  8. package/dist/cli/setup.d.ts +5 -0
  9. package/dist/cli/setup.d.ts.map +1 -1
  10. package/dist/cli/setup.js +31 -5
  11. package/dist/cli/setup.js.map +1 -1
  12. package/dist/config.d.ts +2 -1
  13. package/dist/config.d.ts.map +1 -1
  14. package/dist/config.js +10 -1
  15. package/dist/config.js.map +1 -1
  16. package/dist/instructions.d.ts +1 -1
  17. package/dist/instructions.d.ts.map +1 -1
  18. package/dist/instructions.js +6 -1
  19. package/dist/instructions.js.map +1 -1
  20. package/dist/parser/extractors/hono.d.ts.map +1 -1
  21. package/dist/parser/extractors/hono.js +21 -13
  22. package/dist/parser/extractors/hono.js.map +1 -1
  23. package/dist/parser/extractors/php.d.ts +12 -0
  24. package/dist/parser/extractors/php.d.ts.map +1 -1
  25. package/dist/parser/extractors/php.js +440 -26
  26. package/dist/parser/extractors/php.js.map +1 -1
  27. package/dist/register-tool-loaders.d.ts +16 -0
  28. package/dist/register-tool-loaders.d.ts.map +1 -1
  29. package/dist/register-tool-loaders.js +26 -0
  30. package/dist/register-tool-loaders.js.map +1 -1
  31. package/dist/register-tools.d.ts +3 -1
  32. package/dist/register-tools.d.ts.map +1 -1
  33. package/dist/register-tools.js +354 -7
  34. package/dist/register-tools.js.map +1 -1
  35. package/dist/retrieval/codebase-retrieval.d.ts.map +1 -1
  36. package/dist/retrieval/codebase-retrieval.js +22 -0
  37. package/dist/retrieval/codebase-retrieval.js.map +1 -1
  38. package/dist/retrieval/retrieval-schemas.d.ts +4 -0
  39. package/dist/retrieval/retrieval-schemas.d.ts.map +1 -1
  40. package/dist/retrieval/semantic-handlers.js +1 -1
  41. package/dist/retrieval/semantic-handlers.js.map +1 -1
  42. package/dist/search/semantic.d.ts +21 -5
  43. package/dist/search/semantic.d.ts.map +1 -1
  44. package/dist/search/semantic.js +129 -4
  45. package/dist/search/semantic.js.map +1 -1
  46. package/dist/search/tool-ranker.js +1 -1
  47. package/dist/search/tool-ranker.js.map +1 -1
  48. package/dist/server-helpers.js +1 -1
  49. package/dist/server-helpers.js.map +1 -1
  50. package/dist/storage/index-store.d.ts.map +1 -1
  51. package/dist/storage/index-store.js +7 -5
  52. package/dist/storage/index-store.js.map +1 -1
  53. package/dist/storage/registry.d.ts +28 -4
  54. package/dist/storage/registry.d.ts.map +1 -1
  55. package/dist/storage/registry.js +126 -5
  56. package/dist/storage/registry.js.map +1 -1
  57. package/dist/storage/usage-stats.d.ts +2 -0
  58. package/dist/storage/usage-stats.d.ts.map +1 -1
  59. package/dist/storage/usage-stats.js +6 -0
  60. package/dist/storage/usage-stats.js.map +1 -1
  61. package/dist/tools/_helpers.d.ts.map +1 -1
  62. package/dist/tools/_helpers.js +14 -0
  63. package/dist/tools/_helpers.js.map +1 -1
  64. package/dist/tools/conversation-tools.js +1 -1
  65. package/dist/tools/conversation-tools.js.map +1 -1
  66. package/dist/tools/index-tools.d.ts +12 -0
  67. package/dist/tools/index-tools.d.ts.map +1 -1
  68. package/dist/tools/index-tools.js +52 -5
  69. package/dist/tools/index-tools.js.map +1 -1
  70. package/dist/tools/insights-tools.d.ts +137 -0
  71. package/dist/tools/insights-tools.d.ts.map +1 -0
  72. package/dist/tools/insights-tools.js +438 -0
  73. package/dist/tools/insights-tools.js.map +1 -0
  74. package/dist/tools/pattern-tools.d.ts +7 -0
  75. package/dist/tools/pattern-tools.d.ts.map +1 -1
  76. package/dist/tools/pattern-tools.js +287 -15
  77. package/dist/tools/pattern-tools.js.map +1 -1
  78. package/dist/tools/php-tools.d.ts +78 -4
  79. package/dist/tools/php-tools.d.ts.map +1 -1
  80. package/dist/tools/php-tools.js +824 -42
  81. package/dist/tools/php-tools.js.map +1 -1
  82. package/dist/tools/php8-compat-tools.d.ts +62 -0
  83. package/dist/tools/php8-compat-tools.d.ts.map +1 -0
  84. package/dist/tools/php8-compat-tools.js +287 -0
  85. package/dist/tools/php8-compat-tools.js.map +1 -0
  86. package/dist/tools/php8-migration-candidates-tools.d.ts +68 -0
  87. package/dist/tools/php8-migration-candidates-tools.d.ts.map +1 -0
  88. package/dist/tools/php8-migration-candidates-tools.js +476 -0
  89. package/dist/tools/php8-migration-candidates-tools.js.map +1 -0
  90. package/dist/tools/phpstan-baseline-tools.d.ts +62 -0
  91. package/dist/tools/phpstan-baseline-tools.d.ts.map +1 -0
  92. package/dist/tools/phpstan-baseline-tools.js +263 -0
  93. package/dist/tools/phpstan-baseline-tools.js.map +1 -0
  94. package/dist/tools/project-tools.d.ts +4 -2
  95. package/dist/tools/project-tools.d.ts.map +1 -1
  96. package/dist/tools/project-tools.js +19 -6
  97. package/dist/tools/project-tools.js.map +1 -1
  98. package/dist/tools/react-tools.d.ts +24 -0
  99. package/dist/tools/react-tools.d.ts.map +1 -1
  100. package/dist/tools/react-tools.js +292 -3
  101. package/dist/tools/react-tools.js.map +1 -1
  102. package/dist/tools/search-tools.d.ts.map +1 -1
  103. package/dist/tools/search-tools.js +35 -5
  104. package/dist/tools/search-tools.js.map +1 -1
  105. package/dist/tools/symbol-tools.d.ts.map +1 -1
  106. package/dist/tools/symbol-tools.js +4 -1
  107. package/dist/tools/symbol-tools.js.map +1 -1
  108. package/dist/tools/yii-console-tools.d.ts +69 -0
  109. package/dist/tools/yii-console-tools.d.ts.map +1 -0
  110. package/dist/tools/yii-console-tools.js +256 -0
  111. package/dist/tools/yii-console-tools.js.map +1 -0
  112. package/dist/tools/yii-migrations-tools.d.ts +79 -0
  113. package/dist/tools/yii-migrations-tools.d.ts.map +1 -0
  114. package/dist/tools/yii-migrations-tools.js +543 -0
  115. package/dist/tools/yii-migrations-tools.js.map +1 -0
  116. package/dist/tools/yii-modules-tools.d.ts +63 -0
  117. package/dist/tools/yii-modules-tools.d.ts.map +1 -0
  118. package/dist/tools/yii-modules-tools.js +201 -0
  119. package/dist/tools/yii-modules-tools.js.map +1 -0
  120. package/dist/tools/yii-rbac-tools.d.ts +89 -0
  121. package/dist/tools/yii-rbac-tools.d.ts.map +1 -0
  122. package/dist/tools/yii-rbac-tools.js +238 -0
  123. package/dist/tools/yii-rbac-tools.js.map +1 -0
  124. package/dist/tools/yii3-attribute-candidates-tools.d.ts +72 -0
  125. package/dist/tools/yii3-attribute-candidates-tools.d.ts.map +1 -0
  126. package/dist/tools/yii3-attribute-candidates-tools.js +301 -0
  127. package/dist/tools/yii3-attribute-candidates-tools.js.map +1 -0
  128. package/dist/tools/yii3-migration-tools.d.ts +74 -0
  129. package/dist/tools/yii3-migration-tools.d.ts.map +1 -0
  130. package/dist/tools/yii3-migration-tools.js +440 -0
  131. package/dist/tools/yii3-migration-tools.js.map +1 -0
  132. package/dist/types.d.ts +5 -1
  133. package/dist/types.d.ts.map +1 -1
  134. package/dist/utils/constant-file-pattern.d.ts +3 -1
  135. package/dist/utils/constant-file-pattern.d.ts.map +1 -1
  136. package/dist/utils/constant-file-pattern.js +6 -4
  137. package/dist/utils/constant-file-pattern.js.map +1 -1
  138. package/dist/utils/heritage-edges.d.ts +16 -0
  139. package/dist/utils/heritage-edges.d.ts.map +1 -1
  140. package/dist/utils/heritage-edges.js +31 -10
  141. package/dist/utils/heritage-edges.js.map +1 -1
  142. package/dist/utils/source-stripper.d.ts +23 -0
  143. package/dist/utils/source-stripper.d.ts.map +1 -0
  144. package/dist/utils/source-stripper.js +239 -0
  145. package/dist/utils/source-stripper.js.map +1 -0
  146. package/dist/utils/tsconfig-paths.d.ts +2 -2
  147. package/dist/utils/tsconfig-paths.d.ts.map +1 -1
  148. package/dist/utils/tsconfig-paths.js +10 -4
  149. package/dist/utils/tsconfig-paths.js.map +1 -1
  150. package/dist/utils/wall-clock.d.ts +9 -0
  151. package/dist/utils/wall-clock.d.ts.map +1 -0
  152. package/dist/utils/wall-clock.js +19 -0
  153. package/dist/utils/wall-clock.js.map +1 -0
  154. package/package.json +1 -1
  155. package/rules/codesift.md +10 -3
  156. package/rules/codesift.mdc +10 -3
  157. package/rules/codex.md +10 -3
  158. package/rules/gemini.md +10 -3
@@ -29,45 +29,66 @@ function buildDeclaredTypeFiles(index) {
29
29
  function resolveHeritageTargetFile(raw, nameToFiles) {
30
30
  const norm = normalizeHeritageRef(raw);
31
31
  if (!norm)
32
- return null;
32
+ return { status: "unresolved" };
33
33
  const candidates = [norm];
34
34
  const dot = norm.lastIndexOf(".");
35
35
  if (dot >= 0)
36
36
  candidates.push(norm.slice(dot + 1));
37
+ let sawAmbiguous = false;
37
38
  for (const key of candidates) {
38
39
  const files = nameToFiles.get(key);
39
- if (files?.size === 1)
40
- return [...files][0];
40
+ if (!files)
41
+ continue;
42
+ if (files.size === 1)
43
+ return { status: "resolved", file: [...files][0] };
44
+ sawAmbiguous = true;
41
45
  }
42
- return null;
46
+ return sawAmbiguous ? { status: "ambiguous" } : { status: "unresolved" };
43
47
  }
44
48
  /**
45
49
  * Best-effort module-level edges from symbol `extends` / `implements`.
46
50
  * Resolves each referenced type name to a file only when exactly one
47
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.
48
57
  */
49
- export function collectHeritageFileEdges(index) {
58
+ export function collectHeritageFileEdgesWithStats(index) {
50
59
  const nameToFiles = buildDeclaredTypeFiles(index);
51
60
  const out = [];
52
61
  const seen = new Set();
62
+ const stats = { ambiguous: 0, unresolved: 0 };
53
63
  const push = (sym, names, kind) => {
54
64
  if (!names?.length)
55
65
  return;
56
66
  for (const raw of names) {
57
- const toFile = resolveHeritageTargetFile(raw, nameToFiles);
58
- if (!toFile || toFile === sym.file)
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;
59
74
  continue;
60
- const key = `${sym.file}|${toFile}|${kind}`;
75
+ }
76
+ if (res.file === sym.file)
77
+ continue;
78
+ const key = `${sym.file}|${res.file}|${kind}`;
61
79
  if (seen.has(key))
62
80
  continue;
63
81
  seen.add(key);
64
- out.push({ from: sym.file, to: toFile, kind });
82
+ out.push({ from: sym.file, to: res.file, kind });
65
83
  }
66
84
  };
67
85
  for (const sym of index.symbols) {
68
86
  push(sym, sym.extends, "extends");
69
87
  push(sym, sym.implements, "implements");
70
88
  }
71
- return out;
89
+ return { edges: out, stats };
90
+ }
91
+ export function collectHeritageFileEdges(index) {
92
+ return collectHeritageFileEdgesWithStats(index).edges;
72
93
  }
73
94
  //# sourceMappingURL=heritage-edges.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"heritage-edges.js","sourceRoot":"","sources":["../../src/utils/heritage-edges.ts"],"names":[],"mappings":"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"}
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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"}
@@ -30,8 +30,8 @@ interface ResolvedTsconfig {
30
30
  export declare function clearTsconfigCache(): void;
31
31
  /** Walk up from `dir` to `repoRoot`, find nearest `tsconfig.json`.
32
32
  * Returns absolute path of the config file, or null if none found.
33
- * Caches per `(repoRoot, dir)` pair so late-added or removed tsconfig files are
34
- * 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. */
35
35
  declare function findNearestTsconfig(dir: string, repoRoot: string): string | null;
36
36
  /** Parse a tsconfig.json (with `extends` chain) and build a paths matcher.
37
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;;;;;;;;;;;;;;;;;;;;;;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;;;mDAGmD;AACnD,iBAAS,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmBzE;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"}
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"}
@@ -75,19 +75,23 @@ function dirToConfigCacheKey(importerDir, repoRoot) {
75
75
  }
76
76
  /** Walk up from `dir` to `repoRoot`, find nearest `tsconfig.json`.
77
77
  * Returns absolute path of the config file, or null if none found.
78
- * Caches per `(repoRoot, dir)` pair so late-added or removed tsconfig files are
79
- * visible on the next lookup after cache clear. */
78
+ * Caches every ancestor visited during the walk under the compound `(repoRoot, dir)`
79
+ * key sibling lookups under the same parent are O(1) after the first hit. */
80
80
  function findNearestTsconfig(dir, repoRoot) {
81
81
  const cacheKey = dirToConfigCacheKey(dir, repoRoot);
82
82
  const cached = dirToConfigCache.get(cacheKey);
83
83
  if (cached !== undefined)
84
84
  return cached;
85
85
  const repoRootAbs = resolve(repoRoot);
86
+ const visited = [];
86
87
  let cur = resolve(dir);
87
88
  while (isDirInsideRepo(repoRootAbs, cur)) {
89
+ visited.push(cur);
88
90
  const candidate = join(cur, "tsconfig.json");
89
91
  if (existsSync(candidate)) {
90
- dirToConfigCache.set(cacheKey, candidate);
92
+ for (const v of visited) {
93
+ dirToConfigCache.set(dirToConfigCacheKey(v, repoRoot), candidate);
94
+ }
91
95
  return candidate;
92
96
  }
93
97
  const parent = dirname(cur);
@@ -95,7 +99,9 @@ function findNearestTsconfig(dir, repoRoot) {
95
99
  break;
96
100
  cur = parent;
97
101
  }
98
- dirToConfigCache.set(cacheKey, null);
102
+ for (const v of visited) {
103
+ dirToConfigCache.set(dirToConfigCacheKey(v, repoRoot), null);
104
+ }
99
105
  return null;
100
106
  }
101
107
  /** Parse a tsconfig.json (with `extends` chain) and build a paths matcher.
@@ -1 +1 @@
1
- {"version":3,"file":"tsconfig-paths.js","sourceRoot":"","sources":["../../src/utils/tsconfig-paths.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tsconfig-paths.js","sourceRoot":"","sources":["../../src/utils/tsconfig-paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Race a promise against a wall-clock timer. On timeout, resolves to the
3
+ * sentinel returned by `onTimeout`. The original work continues to completion
4
+ * and is discarded — there is no cancellation token plumbed through the
5
+ * search pipeline. That is intentional: cancellation would require touching
6
+ * every async leaf in the codebase. Discarding the result is sufficient.
7
+ */
8
+ export declare function raceWallClock<T, R>(work: Promise<T>, ms: number, onTimeout: () => R): Promise<T | R>;
9
+ //# sourceMappingURL=wall-clock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wall-clock.d.ts","sourceRoot":"","sources":["../../src/utils/wall-clock.ts"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,CAAC,EAChC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAChB,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,CAAC,GACjB,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAKhB"}
@@ -0,0 +1,19 @@
1
+ // Shared wall-clock cap helpers. Used by hot search paths whose telemetry
2
+ // shows occasional 5-15 minute runaway calls (broad queries on huge repos,
3
+ // cold semantic embeddings). The cap returns control to the agent quickly
4
+ // with an actionable hint instead of hanging the conversation.
5
+ const TIMEOUT = Symbol("codesift.wall-clock.timeout");
6
+ /**
7
+ * Race a promise against a wall-clock timer. On timeout, resolves to the
8
+ * sentinel returned by `onTimeout`. The original work continues to completion
9
+ * and is discarded — there is no cancellation token plumbed through the
10
+ * search pipeline. That is intentional: cancellation would require touching
11
+ * every async leaf in the codebase. Discarding the result is sufficient.
12
+ */
13
+ export function raceWallClock(work, ms, onTimeout) {
14
+ return Promise.race([
15
+ work,
16
+ new Promise((resolve) => setTimeout(() => resolve(TIMEOUT), ms)),
17
+ ]).then((v) => (v === TIMEOUT ? onTimeout() : v));
18
+ }
19
+ //# sourceMappingURL=wall-clock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wall-clock.js","sourceRoot":"","sources":["../../src/utils/wall-clock.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,2EAA2E;AAC3E,0EAA0E;AAC1E,+DAA+D;AAE/D,MAAM,OAAO,GAAG,MAAM,CAAC,6BAA6B,CAAC,CAAC;AAEtD;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAgB,EAChB,EAAU,EACV,SAAkB;IAElB,OAAO,OAAO,CAAC,IAAI,CAAC;QAClB,IAAI;QACJ,IAAI,OAAO,CAAiB,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;KACjF,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAE,CAAO,CAAC,CAAC,CAAC;AAC3D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codesift-mcp",
3
- "version": "0.7.0",
3
+ "version": "0.8.2",
4
4
  "description": "MCP server for code intelligence — 146 tools for symbol search, call graph, semantic search, route tracing, community detection, LSP bridge, secret detection, conversation search, and Hono framework intelligence",
5
5
  "license": "BSL-1.1",
6
6
  "author": "Greg Laskowski",
package/rules/codesift.md CHANGED
@@ -191,10 +191,17 @@ Use this table to pick the right tool for each task:
191
191
  - `include_source=true` — include source code in results
192
192
 
193
193
  ### search_text
194
- - `group_by_file=true` ~80% output reduction on many matches
195
- - `auto_group=true` auto-switch to grouped above 50 matches
194
+ **Decision tree (read first):**
195
+ - **Identifier-only query** (e.g. `OrganizationService`, `useAuth`, `handleLogin`) → use `ranked=true`. Returns symbol-grouped, centrality-ranked hits with `containing_symbol`. Saves 1-3 follow-up `get_symbol` calls. **Auto-applied server-side** when caller passes no grouping options and the query matches `^[A-Za-z_][A-Za-z0-9_]{2,}$`.
196
+ - **Error string / unknown phrase** (e.g. `"connection refused"`, `"is not a function"`) → omit grouping options. Server auto-groups by file above 30 matches.
197
+ - **Already passing `top_k≥30`** → set `group_by_file=true` explicitly.
198
+ - **ALWAYS** pass `file_pattern=` when scope is known.
199
+
200
+ **Param reference:**
196
201
  - `ranked=true` — classifies hits by containing function, deduplicates (max 2/function), ranks by centrality. Returns `containing_symbol` field. Takes precedence over `auto_group`.
197
- - `file_pattern=`always pass when scope is known
202
+ - `group_by_file=true`~80% output reduction on many matches.
203
+ - `auto_group=true` — auto-switch to grouped above 50 matches.
204
+ - `file_pattern=` — required scope filter for repos > 500 files.
198
205
 
199
206
  ### assemble_context levels
200
207
  - `L0` — full source (use when editing)
@@ -174,10 +174,17 @@ Use this table to pick the right tool for each task:
174
174
  - `include_source=true` — include source code in results
175
175
 
176
176
  ### search_text
177
- - `group_by_file=true` ~80% output reduction on many matches
178
- - `auto_group=true` auto-switch to grouped above 50 matches
177
+ **Decision tree (read first):**
178
+ - **Identifier-only query** (e.g. `OrganizationService`, `useAuth`, `handleLogin`) → use `ranked=true`. Returns symbol-grouped, centrality-ranked hits with `containing_symbol`. Saves 1-3 follow-up `get_symbol` calls. **Auto-applied server-side** when caller passes no grouping options and the query matches `^[A-Za-z_][A-Za-z0-9_]{2,}$`.
179
+ - **Error string / unknown phrase** (e.g. `"connection refused"`, `"is not a function"`) → omit grouping options. Server auto-groups by file above 30 matches.
180
+ - **Already passing `top_k≥30`** → set `group_by_file=true` explicitly.
181
+ - **ALWAYS** pass `file_pattern=` when scope is known.
182
+
183
+ **Param reference:**
179
184
  - `ranked=true` — classifies hits by containing function, deduplicates (max 2/function), ranks by centrality. Returns `containing_symbol` field. Takes precedence over `auto_group`.
180
- - `file_pattern=`always pass when scope is known
185
+ - `group_by_file=true`~80% output reduction on many matches.
186
+ - `auto_group=true` — auto-switch to grouped above 50 matches.
187
+ - `file_pattern=` — required scope filter for repos > 500 files.
181
188
 
182
189
  ### assemble_context levels
183
190
  - `L0` — full source (use when editing)
package/rules/codex.md CHANGED
@@ -169,10 +169,17 @@ Use this table to pick the right tool for each task:
169
169
  - `include_source=true` — include source code in results
170
170
 
171
171
  ### search_text
172
- - `group_by_file=true` ~80% output reduction on many matches
173
- - `auto_group=true` auto-switch to grouped above 50 matches
172
+ **Decision tree (read first):**
173
+ - **Identifier-only query** (e.g. `OrganizationService`, `useAuth`, `handleLogin`) → use `ranked=true`. Returns symbol-grouped, centrality-ranked hits with `containing_symbol`. Saves 1-3 follow-up `get_symbol` calls. **Auto-applied server-side** when caller passes no grouping options and the query matches `^[A-Za-z_][A-Za-z0-9_]{2,}$`.
174
+ - **Error string / unknown phrase** (e.g. `"connection refused"`, `"is not a function"`) → omit grouping options. Server auto-groups by file above 30 matches.
175
+ - **Already passing `top_k≥30`** → set `group_by_file=true` explicitly.
176
+ - **ALWAYS** pass `file_pattern=` when scope is known.
177
+
178
+ **Param reference:**
174
179
  - `ranked=true` — classifies hits by containing function, deduplicates (max 2/function), ranks by centrality. Returns `containing_symbol` field. Takes precedence over `auto_group`.
175
- - `file_pattern=`always pass when scope is known
180
+ - `group_by_file=true`~80% output reduction on many matches.
181
+ - `auto_group=true` — auto-switch to grouped above 50 matches.
182
+ - `file_pattern=` — required scope filter for repos > 500 files.
176
183
 
177
184
  ### assemble_context levels
178
185
  - `L0` — full source (use when editing)
package/rules/gemini.md CHANGED
@@ -170,10 +170,17 @@ Use this table to pick the right tool for each task:
170
170
  - `include_source=true` — include source code in results
171
171
 
172
172
  ### search_text
173
- - `group_by_file=true` ~80% output reduction on many matches
174
- - `auto_group=true` auto-switch to grouped above 50 matches
173
+ **Decision tree (read first):**
174
+ - **Identifier-only query** (e.g. `OrganizationService`, `useAuth`, `handleLogin`) → use `ranked=true`. Returns symbol-grouped, centrality-ranked hits with `containing_symbol`. Saves 1-3 follow-up `get_symbol` calls. **Auto-applied server-side** when caller passes no grouping options and the query matches `^[A-Za-z_][A-Za-z0-9_]{2,}$`.
175
+ - **Error string / unknown phrase** (e.g. `"connection refused"`, `"is not a function"`) → omit grouping options. Server auto-groups by file above 30 matches.
176
+ - **Already passing `top_k≥30`** → set `group_by_file=true` explicitly.
177
+ - **ALWAYS** pass `file_pattern=` when scope is known.
178
+
179
+ **Param reference:**
175
180
  - `ranked=true` — classifies hits by containing function, deduplicates (max 2/function), ranks by centrality. Returns `containing_symbol` field. Takes precedence over `auto_group`.
176
- - `file_pattern=`always pass when scope is known
181
+ - `group_by_file=true`~80% output reduction on many matches.
182
+ - `auto_group=true` — auto-switch to grouped above 50 matches.
183
+ - `file_pattern=` — required scope filter for repos > 500 files.
177
184
 
178
185
  ### assemble_context levels
179
186
  - `L0` — full source (use when editing)