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
@@ -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
@@ -34,10 +35,18 @@ const TS_EXTENSIONS = [
34
35
  ".d.ts",
35
36
  ".js",
36
37
  ".jsx",
38
+ ".mts",
39
+ ".cts",
40
+ ".mjs",
41
+ ".cjs",
37
42
  "/index.ts",
38
43
  "/index.tsx",
39
44
  "/index.d.ts",
40
45
  "/index.js",
46
+ "/index.mts",
47
+ "/index.cts",
48
+ "/index.mjs",
49
+ "/index.cjs",
41
50
  ];
42
51
  /** Clear both caches. Called at the start of `index_folder`. */
43
52
  export function clearTsconfigCache() {
@@ -52,20 +61,37 @@ function isDirInsideRepo(repoRootAbs, dir) {
52
61
  const rel = relative(repoRootAbs, abs);
53
62
  return rel !== "" && !isAbsolute(rel) && !rel.startsWith(`..${sep}`) && !rel.startsWith("..");
54
63
  }
64
+ /** True when `resolvedFileAbs` is a file path inside `repoRootAbs` (no `..` escape). */
65
+ function isResolvedFileInsideRepo(repoRootAbs, resolvedFileAbs) {
66
+ const abs = resolve(resolvedFileAbs);
67
+ const rel = relative(repoRootAbs, abs);
68
+ return (rel !== "" &&
69
+ !isAbsolute(rel) &&
70
+ !rel.startsWith(`..${sep}`) &&
71
+ !rel.startsWith(".."));
72
+ }
73
+ function dirToConfigCacheKey(importerDir, repoRoot) {
74
+ return `${resolve(repoRoot)}::${resolve(importerDir)}`;
75
+ }
55
76
  /** Walk up from `dir` to `repoRoot`, find nearest `tsconfig.json`.
56
77
  * Returns absolute path of the config file, or null if none found.
57
- * Caches result only for the requested `dir` (not every ancestor) so late-added
58
- * or removed tsconfig files are 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. */
59
80
  function findNearestTsconfig(dir, repoRoot) {
60
- const cached = dirToConfigCache.get(dir);
81
+ const cacheKey = dirToConfigCacheKey(dir, repoRoot);
82
+ const cached = dirToConfigCache.get(cacheKey);
61
83
  if (cached !== undefined)
62
84
  return cached;
63
85
  const repoRootAbs = resolve(repoRoot);
86
+ const visited = [];
64
87
  let cur = resolve(dir);
65
88
  while (isDirInsideRepo(repoRootAbs, cur)) {
89
+ visited.push(cur);
66
90
  const candidate = join(cur, "tsconfig.json");
67
91
  if (existsSync(candidate)) {
68
- dirToConfigCache.set(dir, candidate);
92
+ for (const v of visited) {
93
+ dirToConfigCache.set(dirToConfigCacheKey(v, repoRoot), candidate);
94
+ }
69
95
  return candidate;
70
96
  }
71
97
  const parent = dirname(cur);
@@ -73,7 +99,9 @@ function findNearestTsconfig(dir, repoRoot) {
73
99
  break;
74
100
  cur = parent;
75
101
  }
76
- dirToConfigCache.set(dir, null);
102
+ for (const v of visited) {
103
+ dirToConfigCache.set(dirToConfigCacheKey(v, repoRoot), null);
104
+ }
77
105
  return null;
78
106
  }
79
107
  /** Parse a tsconfig.json (with `extends` chain) and build a paths matcher.
@@ -141,6 +169,11 @@ export function resolveTsAliasedImport(importerFile, importPath, repoRoot) {
141
169
  // Relative paths are not aliases — short-circuit.
142
170
  if (importPath.startsWith("."))
143
171
  return null;
172
+ // Absolute POSIX/Windows specifiers must not join against baseUrl/paths targets
173
+ // (would escape intended repo scope).
174
+ if (isAbsolute(importPath))
175
+ return null;
176
+ const repoRootAbs = resolve(repoRoot);
144
177
  const importerDir = dirname(resolve(importerFile));
145
178
  const configPath = findNearestTsconfig(importerDir, repoRoot);
146
179
  if (!configPath)
@@ -148,21 +181,26 @@ export function resolveTsAliasedImport(importerFile, importPath, repoRoot) {
148
181
  const config = loadTsconfig(configPath);
149
182
  if (!config)
150
183
  return null;
184
+ const acceptResolved = (hit) => {
185
+ if (!hit)
186
+ return null;
187
+ return isResolvedFileInsideRepo(repoRootAbs, hit) ? hit : null;
188
+ };
151
189
  // Try paths matcher first (alias mappings).
152
190
  if (config.pathsMatcher) {
153
191
  const candidates = config.pathsMatcher(importPath);
154
192
  for (const candidate of candidates) {
155
- const hit = probeFile(candidate);
156
- if (hit)
157
- return hit;
193
+ const accepted = acceptResolved(probeFile(candidate));
194
+ if (accepted)
195
+ return accepted;
158
196
  }
159
197
  }
160
198
  // Fallback: bare specifier resolved against baseUrl.
161
199
  if (config.baseUrl) {
162
200
  const candidate = join(config.baseUrl, importPath);
163
- const hit = probeFile(candidate);
164
- if (hit)
165
- return hit;
201
+ const accepted = acceptResolved(probeFile(candidate));
202
+ if (accepted)
203
+ return accepted;
166
204
  }
167
205
  return null;
168
206
  }
@@ -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.5.30",
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
@@ -159,11 +159,14 @@ Use this table to pick the right tool for each task:
159
159
  | starting a task, want tool recommendations | `plan_turn(query=...)` |
160
160
  | React codebase | `trace_component_tree("App")` + `analyze_hooks` |
161
161
  | React anti-patterns | `search_patterns("hook-in-condition")` |
162
- | React derived state | `search_patterns("derived-state")` |
163
- | React stale closure | `search_patterns("stale-closure-setstate")` |
164
- | React context perf trap | `search_patterns("context-provider-value-inline")` |
162
+ | React derived state | `search_patterns("derived-state")` (T5) / `derived-state-reducer` / `derived-state-custom-setter` (T6) |
163
+ | React stale closure | `search_patterns("stale-closure-setstate")` (T5) / `stale-closure-toggle` / `stale-closure-broken-functional` (T6) |
164
+ | React context perf trap | `search_patterns("context-provider-value-inline")` (T5) / `context-provider-value-via-variable` / `context-provider-value-inline-destructured` (T6) |
165
165
  | React tabnabbing security | `search_patterns("jsx-no-target-blank")` |
166
166
  | React button submit foot-gun | `search_patterns("button-no-type")` |
167
+ | React lazy without Suspense | `search_patterns("react-lazy-no-suspense-same-file")` (T6 single-file) |
168
+ | React RSC non-serializable | `search_patterns("rsc-non-serializable-prop")` / `rsc-non-serializable-prop-deep` (T6 — Map/Set/Class) |
169
+ | React ErrorBoundary incomplete | `search_patterns("error-boundary-incomplete")` (T6) |
167
170
  | React render-tree depth | `analyze_renders` → `entry.prop_chain_depth` (NOT prop-flow depth) |
168
171
  | React call graph (clean) | `trace_call_chain(filter_react_hooks=true)` |
169
172
  | new Next.js project (first look) | `framework_audit` |
@@ -188,10 +191,17 @@ Use this table to pick the right tool for each task:
188
191
  - `include_source=true` — include source code in results
189
192
 
190
193
  ### search_text
191
- - `group_by_file=true` ~80% output reduction on many matches
192
- - `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:**
193
201
  - `ranked=true` — classifies hits by containing function, deduplicates (max 2/function), ranks by centrality. Returns `containing_symbol` field. Takes precedence over `auto_group`.
194
- - `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.
195
205
 
196
206
  ### assemble_context levels
197
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)