contextpro-mcp 0.0.0-stage → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (466) hide show
  1. package/CHANGELOG.md +425 -0
  2. package/INSTALL.md +218 -0
  3. package/INSTRUCTIONS.md +33 -0
  4. package/LICENSE +21 -0
  5. package/NOTICE +12 -0
  6. package/README.md +89 -2
  7. package/SECURITY.md +29 -0
  8. package/agent-guide.md +354 -0
  9. package/agent-instructions.md +1 -0
  10. package/build/core/agent-setup.d.ts +5 -0
  11. package/build/core/agent-setup.d.ts.map +1 -0
  12. package/build/core/agent-setup.js +95 -0
  13. package/build/core/agent-setup.js.map +1 -0
  14. package/build/core/artifacts.d.ts +64 -0
  15. package/build/core/artifacts.d.ts.map +1 -0
  16. package/build/core/artifacts.js +370 -0
  17. package/build/core/artifacts.js.map +1 -0
  18. package/build/core/bounded-source.d.ts +15 -0
  19. package/build/core/bounded-source.d.ts.map +1 -0
  20. package/build/core/bounded-source.js +78 -0
  21. package/build/core/bounded-source.js.map +1 -0
  22. package/build/core/changed-since.d.ts +20 -0
  23. package/build/core/changed-since.d.ts.map +1 -0
  24. package/build/core/changed-since.js +43 -0
  25. package/build/core/changed-since.js.map +1 -0
  26. package/build/core/chat-model.d.ts +8 -0
  27. package/build/core/chat-model.d.ts.map +1 -0
  28. package/build/core/chat-model.js +135 -0
  29. package/build/core/chat-model.js.map +1 -0
  30. package/build/core/clustering.d.ts +6 -0
  31. package/build/core/clustering.d.ts.map +1 -0
  32. package/build/core/clustering.js +201 -0
  33. package/build/core/clustering.js.map +1 -0
  34. package/build/core/context-metadata.d.ts +50 -0
  35. package/build/core/context-metadata.d.ts.map +1 -0
  36. package/build/core/context-metadata.js +118 -0
  37. package/build/core/context-metadata.js.map +1 -0
  38. package/build/core/data-dir.d.ts +5 -0
  39. package/build/core/data-dir.d.ts.map +1 -0
  40. package/build/core/data-dir.js +61 -0
  41. package/build/core/data-dir.js.map +1 -0
  42. package/build/core/db-native.d.ts +28 -0
  43. package/build/core/db-native.d.ts.map +1 -0
  44. package/build/core/db-native.js +120 -0
  45. package/build/core/db-native.js.map +1 -0
  46. package/build/core/db.d.ts +294 -0
  47. package/build/core/db.d.ts.map +1 -0
  48. package/build/core/db.js +1047 -0
  49. package/build/core/db.js.map +1 -0
  50. package/build/core/doctor.d.ts +13 -0
  51. package/build/core/doctor.d.ts.map +1 -0
  52. package/build/core/doctor.js +55 -0
  53. package/build/core/doctor.js.map +1 -0
  54. package/build/core/efficiency.d.ts +16 -0
  55. package/build/core/efficiency.d.ts.map +1 -0
  56. package/build/core/efficiency.js +170 -0
  57. package/build/core/efficiency.js.map +1 -0
  58. package/build/core/embedding-tracker.d.ts +25 -0
  59. package/build/core/embedding-tracker.d.ts.map +1 -0
  60. package/build/core/embedding-tracker.js +228 -0
  61. package/build/core/embedding-tracker.js.map +1 -0
  62. package/build/core/embeddings.d.ts +90 -0
  63. package/build/core/embeddings.d.ts.map +1 -0
  64. package/build/core/embeddings.js +693 -0
  65. package/build/core/embeddings.js.map +1 -0
  66. package/build/core/evidence-state.d.ts +42 -0
  67. package/build/core/evidence-state.d.ts.map +1 -0
  68. package/build/core/evidence-state.js +153 -0
  69. package/build/core/evidence-state.js.map +1 -0
  70. package/build/core/extractor-stamp.d.ts +10 -0
  71. package/build/core/extractor-stamp.d.ts.map +1 -0
  72. package/build/core/extractor-stamp.js +51 -0
  73. package/build/core/extractor-stamp.js.map +1 -0
  74. package/build/core/feature-brief-cache.d.ts +37 -0
  75. package/build/core/feature-brief-cache.d.ts.map +1 -0
  76. package/build/core/feature-brief-cache.js +100 -0
  77. package/build/core/feature-brief-cache.js.map +1 -0
  78. package/build/core/file-fingerprint.d.ts +15 -0
  79. package/build/core/file-fingerprint.d.ts.map +1 -0
  80. package/build/core/file-fingerprint.js +24 -0
  81. package/build/core/file-fingerprint.js.map +1 -0
  82. package/build/core/graph-analytics.d.ts +46 -0
  83. package/build/core/graph-analytics.d.ts.map +1 -0
  84. package/build/core/graph-analytics.js +371 -0
  85. package/build/core/graph-analytics.js.map +1 -0
  86. package/build/core/hub.d.ts +23 -0
  87. package/build/core/hub.d.ts.map +1 -0
  88. package/build/core/hub.js +123 -0
  89. package/build/core/hub.js.map +1 -0
  90. package/build/core/ignore-dirs.d.ts +7 -0
  91. package/build/core/ignore-dirs.d.ts.map +1 -0
  92. package/build/core/ignore-dirs.js +84 -0
  93. package/build/core/ignore-dirs.js.map +1 -0
  94. package/build/core/index-freshness.d.ts +15 -0
  95. package/build/core/index-freshness.d.ts.map +1 -0
  96. package/build/core/index-freshness.js +96 -0
  97. package/build/core/index-freshness.js.map +1 -0
  98. package/build/core/index-reconcile.d.ts +28 -0
  99. package/build/core/index-reconcile.d.ts.map +1 -0
  100. package/build/core/index-reconcile.js +129 -0
  101. package/build/core/index-reconcile.js.map +1 -0
  102. package/build/core/local-daemon.d.ts +5 -0
  103. package/build/core/local-daemon.d.ts.map +1 -0
  104. package/build/core/local-daemon.js +282 -0
  105. package/build/core/local-daemon.js.map +1 -0
  106. package/build/core/memory-graph.d.ts +68 -0
  107. package/build/core/memory-graph.d.ts.map +1 -0
  108. package/build/core/memory-graph.js +152 -0
  109. package/build/core/memory-graph.js.map +1 -0
  110. package/build/core/native-repair.d.ts +12 -0
  111. package/build/core/native-repair.d.ts.map +1 -0
  112. package/build/core/native-repair.js +167 -0
  113. package/build/core/native-repair.js.map +1 -0
  114. package/build/core/native-runtime.d.ts +12 -0
  115. package/build/core/native-runtime.d.ts.map +1 -0
  116. package/build/core/native-runtime.js +38 -0
  117. package/build/core/native-runtime.js.map +1 -0
  118. package/build/core/pagerank.d.ts +29 -0
  119. package/build/core/pagerank.d.ts.map +1 -0
  120. package/build/core/pagerank.js +90 -0
  121. package/build/core/pagerank.js.map +1 -0
  122. package/build/core/parser-process.d.ts +21 -0
  123. package/build/core/parser-process.d.ts.map +1 -0
  124. package/build/core/parser-process.js +103 -0
  125. package/build/core/parser-process.js.map +1 -0
  126. package/build/core/parser-worker.d.ts +2 -0
  127. package/build/core/parser-worker.d.ts.map +1 -0
  128. package/build/core/parser-worker.js +17 -0
  129. package/build/core/parser-worker.js.map +1 -0
  130. package/build/core/parser.d.ts +66 -0
  131. package/build/core/parser.d.ts.map +1 -0
  132. package/build/core/parser.js +750 -0
  133. package/build/core/parser.js.map +1 -0
  134. package/build/core/path-guard.d.ts +6 -0
  135. package/build/core/path-guard.d.ts.map +1 -0
  136. package/build/core/path-guard.js +55 -0
  137. package/build/core/path-guard.js.map +1 -0
  138. package/build/core/process-lifecycle.d.ts +30 -0
  139. package/build/core/process-lifecycle.d.ts.map +1 -0
  140. package/build/core/process-lifecycle.js +129 -0
  141. package/build/core/process-lifecycle.js.map +1 -0
  142. package/build/core/project-config.d.ts +83 -0
  143. package/build/core/project-config.d.ts.map +1 -0
  144. package/build/core/project-config.js +302 -0
  145. package/build/core/project-config.js.map +1 -0
  146. package/build/core/project-graph.d.ts +69 -0
  147. package/build/core/project-graph.d.ts.map +1 -0
  148. package/build/core/project-graph.js +874 -0
  149. package/build/core/project-graph.js.map +1 -0
  150. package/build/core/provider-config.d.ts +15 -0
  151. package/build/core/provider-config.d.ts.map +1 -0
  152. package/build/core/provider-config.js +67 -0
  153. package/build/core/provider-config.js.map +1 -0
  154. package/build/core/provider-usage.d.ts +21 -0
  155. package/build/core/provider-usage.d.ts.map +1 -0
  156. package/build/core/provider-usage.js +52 -0
  157. package/build/core/provider-usage.js.map +1 -0
  158. package/build/core/python-language-server.d.ts +23 -0
  159. package/build/core/python-language-server.d.ts.map +1 -0
  160. package/build/core/python-language-server.js +217 -0
  161. package/build/core/python-language-server.js.map +1 -0
  162. package/build/core/python-runtime-identity.d.ts +3 -0
  163. package/build/core/python-runtime-identity.d.ts.map +1 -0
  164. package/build/core/python-runtime-identity.js +53 -0
  165. package/build/core/python-runtime-identity.js.map +1 -0
  166. package/build/core/reconcile-scheduler.d.ts +20 -0
  167. package/build/core/reconcile-scheduler.d.ts.map +1 -0
  168. package/build/core/reconcile-scheduler.js +58 -0
  169. package/build/core/reconcile-scheduler.js.map +1 -0
  170. package/build/core/request-context.d.ts +7 -0
  171. package/build/core/request-context.d.ts.map +1 -0
  172. package/build/core/request-context.js +17 -0
  173. package/build/core/request-context.js.map +1 -0
  174. package/build/core/request-root.d.ts +19 -0
  175. package/build/core/request-root.d.ts.map +1 -0
  176. package/build/core/request-root.js +26 -0
  177. package/build/core/request-root.js.map +1 -0
  178. package/build/core/root-guard.d.ts +9 -0
  179. package/build/core/root-guard.d.ts.map +1 -0
  180. package/build/core/root-guard.js +64 -0
  181. package/build/core/root-guard.js.map +1 -0
  182. package/build/core/roots-detect.d.ts +17 -0
  183. package/build/core/roots-detect.d.ts.map +1 -0
  184. package/build/core/roots-detect.js +63 -0
  185. package/build/core/roots-detect.js.map +1 -0
  186. package/build/core/runtime-session.d.ts +5 -0
  187. package/build/core/runtime-session.d.ts.map +1 -0
  188. package/build/core/runtime-session.js +10 -0
  189. package/build/core/runtime-session.js.map +1 -0
  190. package/build/core/scip-index.d.ts +71 -0
  191. package/build/core/scip-index.d.ts.map +1 -0
  192. package/build/core/scip-index.js +343 -0
  193. package/build/core/scip-index.js.map +1 -0
  194. package/build/core/semantic-diff.d.ts +32 -0
  195. package/build/core/semantic-diff.d.ts.map +1 -0
  196. package/build/core/semantic-diff.js +259 -0
  197. package/build/core/semantic-diff.js.map +1 -0
  198. package/build/core/source-context.d.ts +3 -0
  199. package/build/core/source-context.d.ts.map +1 -0
  200. package/build/core/source-context.js +86 -0
  201. package/build/core/source-context.js.map +1 -0
  202. package/build/core/source-mask.d.ts +8 -0
  203. package/build/core/source-mask.d.ts.map +1 -0
  204. package/build/core/source-mask.js +156 -0
  205. package/build/core/source-mask.js.map +1 -0
  206. package/build/core/source-mutation.d.ts +16 -0
  207. package/build/core/source-mutation.d.ts.map +1 -0
  208. package/build/core/source-mutation.js +193 -0
  209. package/build/core/source-mutation.js.map +1 -0
  210. package/build/core/sql-schema.d.ts +59 -0
  211. package/build/core/sql-schema.d.ts.map +1 -0
  212. package/build/core/sql-schema.js +218 -0
  213. package/build/core/sql-schema.js.map +1 -0
  214. package/build/core/startup-health.d.ts +40 -0
  215. package/build/core/startup-health.d.ts.map +1 -0
  216. package/build/core/startup-health.js +132 -0
  217. package/build/core/startup-health.js.map +1 -0
  218. package/build/core/team-ledger.d.ts +60 -0
  219. package/build/core/team-ledger.d.ts.map +1 -0
  220. package/build/core/team-ledger.js +171 -0
  221. package/build/core/team-ledger.js.map +1 -0
  222. package/build/core/test-impact.d.ts +23 -0
  223. package/build/core/test-impact.d.ts.map +1 -0
  224. package/build/core/test-impact.js +131 -0
  225. package/build/core/test-impact.js.map +1 -0
  226. package/build/core/tool-metrics.d.ts +29 -0
  227. package/build/core/tool-metrics.d.ts.map +1 -0
  228. package/build/core/tool-metrics.js +74 -0
  229. package/build/core/tool-metrics.js.map +1 -0
  230. package/build/core/tool-profile.d.ts +12 -0
  231. package/build/core/tool-profile.d.ts.map +1 -0
  232. package/build/core/tool-profile.js +102 -0
  233. package/build/core/tool-profile.js.map +1 -0
  234. package/build/core/tool-trace.d.ts +8 -0
  235. package/build/core/tool-trace.d.ts.map +1 -0
  236. package/build/core/tool-trace.js +70 -0
  237. package/build/core/tool-trace.js.map +1 -0
  238. package/build/core/tree-sitter-runtime.d.ts +20 -0
  239. package/build/core/tree-sitter-runtime.d.ts.map +1 -0
  240. package/build/core/tree-sitter-runtime.js +324 -0
  241. package/build/core/tree-sitter-runtime.js.map +1 -0
  242. package/build/core/tree-sitter.d.ts +6 -0
  243. package/build/core/tree-sitter.d.ts.map +1 -0
  244. package/build/core/tree-sitter.js +24 -0
  245. package/build/core/tree-sitter.js.map +1 -0
  246. package/build/core/typescript-reference-process.d.ts +30 -0
  247. package/build/core/typescript-reference-process.d.ts.map +1 -0
  248. package/build/core/typescript-reference-process.js +124 -0
  249. package/build/core/typescript-reference-process.js.map +1 -0
  250. package/build/core/typescript-reference-worker.d.ts +2 -0
  251. package/build/core/typescript-reference-worker.d.ts.map +1 -0
  252. package/build/core/typescript-reference-worker.js +14 -0
  253. package/build/core/typescript-reference-worker.js.map +1 -0
  254. package/build/core/typescript-references.d.ts +71 -0
  255. package/build/core/typescript-references.d.ts.map +1 -0
  256. package/build/core/typescript-references.js +392 -0
  257. package/build/core/typescript-references.js.map +1 -0
  258. package/build/core/typescript-skeleton.d.ts +5 -0
  259. package/build/core/typescript-skeleton.d.ts.map +1 -0
  260. package/build/core/typescript-skeleton.js +49 -0
  261. package/build/core/typescript-skeleton.js.map +1 -0
  262. package/build/core/walker.d.ts +16 -0
  263. package/build/core/walker.d.ts.map +1 -0
  264. package/build/core/walker.js +152 -0
  265. package/build/core/walker.js.map +1 -0
  266. package/build/core/workspace-router.d.ts +28 -0
  267. package/build/core/workspace-router.d.ts.map +1 -0
  268. package/build/core/workspace-router.js +93 -0
  269. package/build/core/workspace-router.js.map +1 -0
  270. package/build/core/worktree-gc.d.ts +16 -0
  271. package/build/core/worktree-gc.d.ts.map +1 -0
  272. package/build/core/worktree-gc.js +69 -0
  273. package/build/core/worktree-gc.js.map +1 -0
  274. package/build/core/worktree-overlay.d.ts +22 -0
  275. package/build/core/worktree-overlay.d.ts.map +1 -0
  276. package/build/core/worktree-overlay.js +84 -0
  277. package/build/core/worktree-overlay.js.map +1 -0
  278. package/build/core/worktree-root-guard.d.ts +8 -0
  279. package/build/core/worktree-root-guard.d.ts.map +1 -0
  280. package/build/core/worktree-root-guard.js +82 -0
  281. package/build/core/worktree-root-guard.js.map +1 -0
  282. package/build/core/worktree-seed.d.ts +14 -0
  283. package/build/core/worktree-seed.d.ts.map +1 -0
  284. package/build/core/worktree-seed.js +98 -0
  285. package/build/core/worktree-seed.js.map +1 -0
  286. package/build/git/shadow.d.ts +40 -0
  287. package/build/git/shadow.d.ts.map +1 -0
  288. package/build/git/shadow.js +298 -0
  289. package/build/git/shadow.js.map +1 -0
  290. package/build/index.d.ts +3 -0
  291. package/build/index.d.ts.map +1 -0
  292. package/build/index.js +634 -0
  293. package/build/index.js.map +1 -0
  294. package/build/tools/agentic-context.d.ts +86 -0
  295. package/build/tools/agentic-context.d.ts.map +1 -0
  296. package/build/tools/agentic-context.js +1546 -0
  297. package/build/tools/agentic-context.js.map +1 -0
  298. package/build/tools/blast-radius.d.ts +24 -0
  299. package/build/tools/blast-radius.d.ts.map +1 -0
  300. package/build/tools/blast-radius.js +231 -0
  301. package/build/tools/blast-radius.js.map +1 -0
  302. package/build/tools/changed-since.d.ts +7 -0
  303. package/build/tools/changed-since.d.ts.map +1 -0
  304. package/build/tools/changed-since.js +68 -0
  305. package/build/tools/changed-since.js.map +1 -0
  306. package/build/tools/compiler-actions.d.ts +26 -0
  307. package/build/tools/compiler-actions.d.ts.map +1 -0
  308. package/build/tools/compiler-actions.js +121 -0
  309. package/build/tools/compiler-actions.js.map +1 -0
  310. package/build/tools/context-tree.d.ts +9 -0
  311. package/build/tools/context-tree.d.ts.map +1 -0
  312. package/build/tools/context-tree.js +131 -0
  313. package/build/tools/context-tree.js.map +1 -0
  314. package/build/tools/context.d.ts +37 -0
  315. package/build/tools/context.d.ts.map +1 -0
  316. package/build/tools/context.js +800 -0
  317. package/build/tools/context.js.map +1 -0
  318. package/build/tools/diff.d.ts +9 -0
  319. package/build/tools/diff.d.ts.map +1 -0
  320. package/build/tools/diff.js +176 -0
  321. package/build/tools/diff.js.map +1 -0
  322. package/build/tools/directory-prior.d.ts +16 -0
  323. package/build/tools/directory-prior.d.ts.map +1 -0
  324. package/build/tools/directory-prior.js +121 -0
  325. package/build/tools/directory-prior.js.map +1 -0
  326. package/build/tools/discovery-documents.d.ts +11 -0
  327. package/build/tools/discovery-documents.d.ts.map +1 -0
  328. package/build/tools/discovery-documents.js +71 -0
  329. package/build/tools/discovery-documents.js.map +1 -0
  330. package/build/tools/discovery-hints.d.ts +25 -0
  331. package/build/tools/discovery-hints.d.ts.map +1 -0
  332. package/build/tools/discovery-hints.js +329 -0
  333. package/build/tools/discovery-hints.js.map +1 -0
  334. package/build/tools/efficiency-report.d.ts +13 -0
  335. package/build/tools/efficiency-report.d.ts.map +1 -0
  336. package/build/tools/efficiency-report.js +78 -0
  337. package/build/tools/efficiency-report.js.map +1 -0
  338. package/build/tools/evidence-retrieval.d.ts +33 -0
  339. package/build/tools/evidence-retrieval.d.ts.map +1 -0
  340. package/build/tools/evidence-retrieval.js +200 -0
  341. package/build/tools/evidence-retrieval.js.map +1 -0
  342. package/build/tools/exact-references.d.ts +10 -0
  343. package/build/tools/exact-references.d.ts.map +1 -0
  344. package/build/tools/exact-references.js +351 -0
  345. package/build/tools/exact-references.js.map +1 -0
  346. package/build/tools/explain.d.ts +14 -0
  347. package/build/tools/explain.d.ts.map +1 -0
  348. package/build/tools/explain.js +370 -0
  349. package/build/tools/explain.js.map +1 -0
  350. package/build/tools/feature-brief.d.ts +7 -0
  351. package/build/tools/feature-brief.d.ts.map +1 -0
  352. package/build/tools/feature-brief.js +89 -0
  353. package/build/tools/feature-brief.js.map +1 -0
  354. package/build/tools/feature-hub.d.ts +15 -0
  355. package/build/tools/feature-hub.d.ts.map +1 -0
  356. package/build/tools/feature-hub.js +404 -0
  357. package/build/tools/feature-hub.js.map +1 -0
  358. package/build/tools/file-skeleton.d.ts +7 -0
  359. package/build/tools/file-skeleton.d.ts.map +1 -0
  360. package/build/tools/file-skeleton.js +190 -0
  361. package/build/tools/file-skeleton.js.map +1 -0
  362. package/build/tools/grep.d.ts +25 -0
  363. package/build/tools/grep.d.ts.map +1 -0
  364. package/build/tools/grep.js +341 -0
  365. package/build/tools/grep.js.map +1 -0
  366. package/build/tools/impact-delta.d.ts +7 -0
  367. package/build/tools/impact-delta.d.ts.map +1 -0
  368. package/build/tools/impact-delta.js +102 -0
  369. package/build/tools/impact-delta.js.map +1 -0
  370. package/build/tools/memory-tools.d.ts +69 -0
  371. package/build/tools/memory-tools.d.ts.map +1 -0
  372. package/build/tools/memory-tools.js +366 -0
  373. package/build/tools/memory-tools.js.map +1 -0
  374. package/build/tools/planning-helpers.d.ts +26 -0
  375. package/build/tools/planning-helpers.d.ts.map +1 -0
  376. package/build/tools/planning-helpers.js +269 -0
  377. package/build/tools/planning-helpers.js.map +1 -0
  378. package/build/tools/project-graph.d.ts +19 -0
  379. package/build/tools/project-graph.d.ts.map +1 -0
  380. package/build/tools/project-graph.js +259 -0
  381. package/build/tools/project-graph.js.map +1 -0
  382. package/build/tools/propose-commit.d.ts +9 -0
  383. package/build/tools/propose-commit.d.ts.map +1 -0
  384. package/build/tools/propose-commit.js +156 -0
  385. package/build/tools/propose-commit.js.map +1 -0
  386. package/build/tools/register-tools.d.ts +18 -0
  387. package/build/tools/register-tools.d.ts.map +1 -0
  388. package/build/tools/register-tools.js +1131 -0
  389. package/build/tools/register-tools.js.map +1 -0
  390. package/build/tools/reindex.d.ts +76 -0
  391. package/build/tools/reindex.d.ts.map +1 -0
  392. package/build/tools/reindex.js +871 -0
  393. package/build/tools/reindex.js.map +1 -0
  394. package/build/tools/related.d.ts +6 -0
  395. package/build/tools/related.d.ts.map +1 -0
  396. package/build/tools/related.js +143 -0
  397. package/build/tools/related.js.map +1 -0
  398. package/build/tools/repo-map.d.ts +59 -0
  399. package/build/tools/repo-map.d.ts.map +1 -0
  400. package/build/tools/repo-map.js +270 -0
  401. package/build/tools/repo-map.js.map +1 -0
  402. package/build/tools/resolve-symbol.d.ts +41 -0
  403. package/build/tools/resolve-symbol.d.ts.map +1 -0
  404. package/build/tools/resolve-symbol.js +250 -0
  405. package/build/tools/resolve-symbol.js.map +1 -0
  406. package/build/tools/retrieval-helpers.d.ts +35 -0
  407. package/build/tools/retrieval-helpers.d.ts.map +1 -0
  408. package/build/tools/retrieval-helpers.js +302 -0
  409. package/build/tools/retrieval-helpers.js.map +1 -0
  410. package/build/tools/scip-index.d.ts +12 -0
  411. package/build/tools/scip-index.d.ts.map +1 -0
  412. package/build/tools/scip-index.js +66 -0
  413. package/build/tools/scip-index.js.map +1 -0
  414. package/build/tools/scoped-discovery.d.ts +7 -0
  415. package/build/tools/scoped-discovery.d.ts.map +1 -0
  416. package/build/tools/scoped-discovery.js +89 -0
  417. package/build/tools/scoped-discovery.js.map +1 -0
  418. package/build/tools/search.d.ts +62 -0
  419. package/build/tools/search.d.ts.map +1 -0
  420. package/build/tools/search.js +419 -0
  421. package/build/tools/search.js.map +1 -0
  422. package/build/tools/semantic-diff.d.ts +7 -0
  423. package/build/tools/semantic-diff.d.ts.map +1 -0
  424. package/build/tools/semantic-diff.js +45 -0
  425. package/build/tools/semantic-diff.js.map +1 -0
  426. package/build/tools/semantic-identifiers.d.ts +51 -0
  427. package/build/tools/semantic-identifiers.d.ts.map +1 -0
  428. package/build/tools/semantic-identifiers.js +522 -0
  429. package/build/tools/semantic-identifiers.js.map +1 -0
  430. package/build/tools/semantic-navigate.d.ts +18 -0
  431. package/build/tools/semantic-navigate.d.ts.map +1 -0
  432. package/build/tools/semantic-navigate.js +413 -0
  433. package/build/tools/semantic-navigate.js.map +1 -0
  434. package/build/tools/semantic-search.d.ts +30 -0
  435. package/build/tools/semantic-search.d.ts.map +1 -0
  436. package/build/tools/semantic-search.js +466 -0
  437. package/build/tools/semantic-search.js.map +1 -0
  438. package/build/tools/sql-schema.d.ts +23 -0
  439. package/build/tools/sql-schema.d.ts.map +1 -0
  440. package/build/tools/sql-schema.js +155 -0
  441. package/build/tools/sql-schema.js.map +1 -0
  442. package/build/tools/static-analysis.d.ts +7 -0
  443. package/build/tools/static-analysis.d.ts.map +1 -0
  444. package/build/tools/static-analysis.js +331 -0
  445. package/build/tools/static-analysis.js.map +1 -0
  446. package/build/tools/status.d.ts +74 -0
  447. package/build/tools/status.d.ts.map +1 -0
  448. package/build/tools/status.js +227 -0
  449. package/build/tools/status.js.map +1 -0
  450. package/build/tools/symbolic-edit.d.ts +57 -0
  451. package/build/tools/symbolic-edit.d.ts.map +1 -0
  452. package/build/tools/symbolic-edit.js +500 -0
  453. package/build/tools/symbolic-edit.js.map +1 -0
  454. package/build/tools/test-impact.d.ts +7 -0
  455. package/build/tools/test-impact.d.ts.map +1 -0
  456. package/build/tools/test-impact.js +34 -0
  457. package/build/tools/test-impact.js.map +1 -0
  458. package/build/tools/test-map.d.ts +8 -0
  459. package/build/tools/test-map.d.ts.map +1 -0
  460. package/build/tools/test-map.js +75 -0
  461. package/build/tools/test-map.js.map +1 -0
  462. package/docs/README.md +35 -0
  463. package/docs/architecture.md +35 -0
  464. package/docs/configuration.md +207 -0
  465. package/docs/maintenance.md +77 -0
  466. package/package.json +80 -4
@@ -0,0 +1,500 @@
1
+ // Symbolic find and edit tools — Serena-parity symbol-level operations
2
+ // FEATURE: Symbol-precise editing without LSP — parser-driven find / replace / insert / rename
3
+ import { readFile } from "fs/promises";
4
+ import { createHash } from "node:crypto";
5
+ import { extname } from "path";
6
+ import { resolveProjectPath } from "../core/path-guard.js";
7
+ import { analyzeContent, analyzeFile, flattenSymbols, isSupportedFile } from "../core/parser.js";
8
+ import { sourceMaskFlags } from "../core/source-mask.js";
9
+ import { getGrammarName, validateSyntax } from "../core/tree-sitter.js";
10
+ import { walkDirectory } from "../core/walker.js";
11
+ import { getDB } from "../core/db.js";
12
+ import { assertSourceUnchanged, captureSource, publishSource, withSourceMutation } from "../core/source-mutation.js";
13
+ import { createRestorePoint } from "../git/shadow.js";
14
+ import { invalidateSearchCache } from "./semantic-search.js";
15
+ import { invalidateIdentifierSearchCache } from "./semantic-identifiers.js";
16
+ function buildNamePath(parentChain, name) {
17
+ return parentChain.length > 0 ? `${parentChain.join("/")}/${name}` : name;
18
+ }
19
+ function flattenWithNamePath(symbols, parentChain = []) {
20
+ const out = [];
21
+ for (const sym of symbols) {
22
+ const namePath = buildNamePath(parentChain, sym.name);
23
+ out.push({ symbol: sym, namePath, parentChain });
24
+ if (sym.children.length > 0) {
25
+ out.push(...flattenWithNamePath(sym.children, [...parentChain, sym.name]));
26
+ }
27
+ }
28
+ return out;
29
+ }
30
+ function wildcardToRegExp(pattern) {
31
+ // `*` matches any run of name characters (not /); `**` matches across path separators.
32
+ const escaped = pattern
33
+ .replace(/[.+?^${}()|[\]\\]/g, "\\$&")
34
+ .replace(/\*\*/g, "@@DS@@")
35
+ .replace(/\*/g, "[^/]*")
36
+ .replace(/@@DS@@/g, ".*");
37
+ return new RegExp(`^${escaped}$`);
38
+ }
39
+ function matchesNamePathPattern(candidate, pattern, substringMatching) {
40
+ // Bare "*" or "**" lists everything — common LLM expectation for "all symbols".
41
+ if (pattern === "*" || pattern === "**")
42
+ return true;
43
+ // Wildcard support: any pattern containing * is treated as a glob over the name path.
44
+ if (pattern.includes("*")) {
45
+ const re = wildcardToRegExp(pattern.startsWith("/") ? pattern.slice(1) : pattern);
46
+ if (re.test(candidate))
47
+ return true;
48
+ // Also try matching just the last path segment for convenience (e.g. "get*").
49
+ const last = candidate.split("/").pop() ?? candidate;
50
+ return wildcardToRegExp(pattern).test(last);
51
+ }
52
+ if (pattern.startsWith("/")) {
53
+ return candidate === pattern.slice(1);
54
+ }
55
+ if (pattern.includes("/")) {
56
+ if (candidate === pattern)
57
+ return true;
58
+ return candidate.endsWith(`/${pattern}`);
59
+ }
60
+ const parts = candidate.split("/");
61
+ const last = parts[parts.length - 1];
62
+ if (substringMatching)
63
+ return last.includes(pattern);
64
+ return last === pattern;
65
+ }
66
+ function withinKindFilter(symbol, includeKinds, excludeKinds) {
67
+ if (includeKinds && includeKinds.length > 0 && !includeKinds.includes(symbol.kind))
68
+ return false;
69
+ if (excludeKinds && excludeKinds.length > 0 && excludeKinds.includes(symbol.kind))
70
+ return false;
71
+ return true;
72
+ }
73
+ function toFoundEntry(match, filePath, content, includeBody, depth) {
74
+ const entry = {
75
+ name: match.symbol.name,
76
+ kind: match.symbol.kind,
77
+ namePath: match.namePath,
78
+ path: filePath,
79
+ line: match.symbol.line,
80
+ endLine: match.symbol.endLine,
81
+ signature: match.symbol.signature,
82
+ };
83
+ if (includeBody) {
84
+ const { startIndex, endIndex } = match.symbol;
85
+ entry.body = startIndex !== undefined && endIndex !== undefined
86
+ ? content.slice(startIndex, endIndex)
87
+ : content.split("\n").slice(match.symbol.line - 1, match.symbol.endLine).join("\n");
88
+ }
89
+ if (depth > 0 && match.symbol.children.length > 0) {
90
+ entry.children = match.symbol.children.map((child) => toFoundEntry({ symbol: child, namePath: `${match.namePath}/${child.name}`, parentChain: [...match.parentChain, match.symbol.name] }, filePath, content, includeBody, depth - 1));
91
+ }
92
+ return entry;
93
+ }
94
+ async function findInOneFile(rootDir, relativePath, options) {
95
+ const fullPath = resolveProjectPath(rootDir, relativePath, "relativePath");
96
+ if (!isSupportedFile(fullPath))
97
+ return [];
98
+ try {
99
+ const content = await readFile(fullPath, "utf-8");
100
+ const analysis = await analyzeContent(fullPath, content);
101
+ const contentHash = createHash("sha256").update(content).digest("hex");
102
+ const flat = flattenWithNamePath(analysis.symbols);
103
+ const includeBody = options.includeBody === true;
104
+ const depth = Math.max(0, Math.floor(options.depth ?? 0));
105
+ return flat
106
+ .filter((match) => matchesNamePathPattern(match.namePath, options.namePathPattern, options.substringMatching === true))
107
+ .filter((match) => withinKindFilter(match.symbol, options.includeKinds, options.excludeKinds))
108
+ .map((match) => ({ ...toFoundEntry(match, relativePath, content, includeBody, depth), contentHash }));
109
+ }
110
+ catch {
111
+ return [];
112
+ }
113
+ }
114
+ export async function findSymbol(options) {
115
+ const max = Math.max(1, Math.floor(options.maxMatches ?? 50));
116
+ const collected = [];
117
+ if (options.relativePath) {
118
+ const file = options.relativePath;
119
+ const matches = await findInOneFile(options.rootDir, file, options);
120
+ collected.push(...matches);
121
+ }
122
+ else {
123
+ const db = await getDB(options.rootDir);
124
+ const dbFiles = db.getAllFiles();
125
+ let files;
126
+ if (dbFiles.length > 0) {
127
+ files = dbFiles.map((file) => file.path);
128
+ }
129
+ else {
130
+ const entries = await walkDirectory({ rootDir: options.rootDir, depthLimit: 0 });
131
+ files = entries.filter((entry) => !entry.isDirectory).map((entry) => entry.relativePath);
132
+ }
133
+ for (const file of files) {
134
+ if (collected.length >= max)
135
+ break;
136
+ const matches = await findInOneFile(options.rootDir, file, options);
137
+ for (const match of matches) {
138
+ if (collected.length >= max)
139
+ break;
140
+ collected.push(match);
141
+ }
142
+ }
143
+ }
144
+ if (options.format === "json") {
145
+ return JSON.stringify({ pattern: options.namePathPattern, count: collected.length, results: collected.slice(0, max) }, null, 2);
146
+ }
147
+ if (collected.length === 0) {
148
+ return `No symbols matched pattern "${options.namePathPattern}"${options.relativePath ? ` in ${options.relativePath}` : ""}.`;
149
+ }
150
+ const lines = [`Found ${collected.length} symbol(s) for "${options.namePathPattern}":`, ""];
151
+ for (const entry of collected.slice(0, max)) {
152
+ lines.push(`${entry.kind}: ${entry.namePath}`);
153
+ lines.push(` ${entry.path}:L${entry.line}${entry.endLine > entry.line ? `-L${entry.endLine}` : ""}`);
154
+ if (entry.signature && entry.signature !== entry.name)
155
+ lines.push(` signature: ${entry.signature.substring(0, 200)}`);
156
+ if (entry.body) {
157
+ lines.push(" body:");
158
+ for (const bodyLine of entry.body.split("\n").slice(0, 60)) {
159
+ lines.push(` ${bodyLine}`);
160
+ }
161
+ if (entry.body.split("\n").length > 60)
162
+ lines.push(` ... (${entry.body.split("\n").length - 60} more lines)`);
163
+ }
164
+ if (entry.children && entry.children.length > 0) {
165
+ lines.push(` children: ${entry.children.map((child) => `${child.kind}:${child.name}`).join(", ")}`);
166
+ }
167
+ lines.push("");
168
+ }
169
+ return lines.join("\n").trimEnd();
170
+ }
171
+ async function locateSymbolForEdit(rootDir, relativePath, namePath, content) {
172
+ const fullPath = resolveProjectPath(rootDir, relativePath, "relativePath");
173
+ if (!isSupportedFile(fullPath)) {
174
+ throw new Error(`File is not a supported source language: ${relativePath}`);
175
+ }
176
+ const analysis = content === undefined ? await analyzeFile(fullPath) : await analyzeContent(fullPath, content);
177
+ const flat = flattenWithNamePath(analysis.symbols);
178
+ const matches = flat.filter((match) => matchesNamePathPattern(match.namePath, namePath, false));
179
+ if (matches.length === 0) {
180
+ throw new Error(`Symbol "${namePath}" not found in ${relativePath}.`);
181
+ }
182
+ if (matches.length > 1) {
183
+ const candidates = matches.map((match) => match.namePath).join(", ");
184
+ throw new Error(`Symbol pattern "${namePath}" is ambiguous in ${relativePath}: matched [${candidates}]. Pass an absolute name path starting with "/" (e.g., "/${matches[0].namePath}") to disambiguate.`);
185
+ }
186
+ return { symbol: matches[0].symbol, parentChain: matches[0].parentChain, analysis, fullPath };
187
+ }
188
+ function detectIndent(line) {
189
+ const match = line.match(/^[ \t]*/);
190
+ return match ? match[0] : "";
191
+ }
192
+ function insertLines(content, position, payload) {
193
+ const lines = content.split("\n");
194
+ const head = lines.slice(0, position);
195
+ const tail = lines.slice(position);
196
+ return [...head, ...payload.split("\n"), ...tail].join("\n");
197
+ }
198
+ function looksLikeDefinitionStart(body, kind) {
199
+ // Export wrappers may precede the declaration on a separate line. Validate
200
+ // the declaration start while retaining the original wrapper in the edit.
201
+ const declaration = body.trimStart().replace(/^export\s+(?:default\s+)?/, "");
202
+ const firstLine = declaration.split("\n").find((line) => line.trim().length > 0) ?? "";
203
+ const trimmed = firstLine.trim();
204
+ if (trimmed.length === 0)
205
+ return false;
206
+ // Generic checks that cover most languages and kinds
207
+ if (kind === "function") {
208
+ return /^(?:export\s+)?(?:async\s+)?(?:function|fn|func|def|pub\s+(?:async\s+)?fn)\b/.test(trimmed)
209
+ || /=\s*(?:async\s+)?(?:\([^)]*\)|[a-zA-Z_$]\w*)\s*=>/.test(trimmed)
210
+ || /^(?:export\s+)?(?:const|let|var)\b.*=\s*(?:async\s*)?(?:function|\(|[a-zA-Z_$])/.test(trimmed);
211
+ }
212
+ if (kind === "method") {
213
+ return /^(?:public|private|protected|static|async|readonly|get|set)?\s*[a-zA-Z_$][\w$]*\s*(?:<[^>]*>)?\s*\(/.test(trimmed)
214
+ || /^(?:async\s+)?def\s+/.test(trimmed);
215
+ }
216
+ if (kind === "class" || kind === "interface" || kind === "enum" || kind === "type" || kind === "struct" || kind === "trait") {
217
+ return new RegExp(`^(?:export\\s+|pub\\s+)?(?:abstract\\s+)?${kind}\\b`).test(trimmed)
218
+ || /^export\s+default\s+(class|interface|enum|type)\b/.test(trimmed);
219
+ }
220
+ if (kind === "const" || kind === "variable") {
221
+ return /^(?:export\s+)?(?:const|let|var)\s+[a-zA-Z_$]/.test(trimmed);
222
+ }
223
+ return true;
224
+ }
225
+ function detectBodyIndent(originalLines, symbol) {
226
+ // Use indent from the FIRST non-blank line of the body (line after symbol.line),
227
+ // not the definition line itself. Falls back to the definition-line indent if the body is empty.
228
+ for (let i = symbol.line; i < symbol.endLine && i < originalLines.length; i++) {
229
+ const line = originalLines[i];
230
+ if (line.trim().length === 0)
231
+ continue;
232
+ return detectIndent(line);
233
+ }
234
+ return detectIndent(originalLines[symbol.line - 1] ?? "");
235
+ }
236
+ function indentWidth(line) {
237
+ const match = line.match(/^[ \t]*/);
238
+ return match ? match[0].length : 0;
239
+ }
240
+ function reindentBody(body, definitionIndent) {
241
+ const bodyLines = body.split("\n");
242
+ if (bodyLines.length === 0)
243
+ return body;
244
+ // The provided body has its own internal indentation that MUST be preserved relative to the
245
+ // first (signature) line. We re-anchor the whole block so the signature line sits at
246
+ // `definitionIndent`, and every other line keeps its indent RELATIVE to the signature line.
247
+ //
248
+ // Find the base indent = indent of the first non-blank line (the signature). Then for each
249
+ // line, the new indent = definitionIndent + (lineIndent - baseIndent), clamped at 0 so a body
250
+ // line that is less-indented than the signature doesn't go negative.
251
+ let baseIndent = 0;
252
+ let baseFound = false;
253
+ for (const line of bodyLines) {
254
+ if (line.trim().length === 0)
255
+ continue;
256
+ baseIndent = indentWidth(line);
257
+ baseFound = true;
258
+ break;
259
+ }
260
+ if (!baseFound)
261
+ return body;
262
+ return bodyLines
263
+ .map((line) => {
264
+ if (line.trim().length === 0)
265
+ return "";
266
+ const lineIndent = indentWidth(line);
267
+ const relativeIndent = Math.max(0, lineIndent - baseIndent);
268
+ return `${definitionIndent}${" ".repeat(relativeIndent)}${line.trimStart()}`;
269
+ })
270
+ .join("\n");
271
+ }
272
+ function invalidateCaches() {
273
+ invalidateSearchCache();
274
+ invalidateIdentifierSearchCache();
275
+ }
276
+ async function assertEditKeepsSyntaxValid(relativePath, fullPath, originalContent, nextContent, operation) {
277
+ const ext = extname(fullPath).toLowerCase();
278
+ // Only enforce when the original file parsed cleanly — otherwise we'd block edits that fix
279
+ // a pre-existing syntax error.
280
+ const before = await validateSyntax(originalContent, ext);
281
+ if (!before.checked || !before.ok)
282
+ return;
283
+ const after = await validateSyntax(nextContent, ext);
284
+ if (after.checked && !after.ok) {
285
+ const loc = after.firstError ? ` at L${after.firstError.line}:${after.firstError.column} (${after.firstError.type})` : "";
286
+ throw new Error(`${operation}: the edit would introduce a syntax error${loc} in ${relativePath}. ` +
287
+ `The file was NOT modified. Check the body's indentation and that it includes the full ` +
288
+ `definition. (No restore point was created because nothing was written.)`);
289
+ }
290
+ }
291
+ export async function replaceSymbolBody(options) {
292
+ return withSourceMutation(options.rootDir, () => replaceSymbolBodyLocked(options));
293
+ }
294
+ async function replaceSymbolBodyLocked(options) {
295
+ const snapshot = captureSource(options.rootDir, options.relativePath);
296
+ assertExpectedHash(snapshot, options.expectedContentHash);
297
+ const content = snapshot.content;
298
+ if (content === null)
299
+ throw new Error(`Source file does not exist: ${options.relativePath}`);
300
+ const { symbol, fullPath } = await locateSymbolForEdit(options.rootDir, options.relativePath, options.namePath, content);
301
+ const lines = content.split("\n");
302
+ const definitionIndent = detectIndent(lines[symbol.line - 1] ?? "");
303
+ if (!looksLikeDefinitionStart(options.body, symbol.kind)) {
304
+ throw new Error(`replace_symbol_body: the provided 'body' does not look like a ${symbol.kind} definition. ` +
305
+ `'body' must include the full definition (signature line through closing brace/dedent). ` +
306
+ `For "${options.namePath}" in ${options.relativePath} the original signature starts with: ` +
307
+ `"${(lines[symbol.line - 1] ?? "").trim().slice(0, 120)}". ` +
308
+ `If you only want to change the inner body, include the original signature and braces; ` +
309
+ `replace_symbol_body replaces the entire symbol span (L${symbol.line}-L${symbol.endLine}).`);
310
+ }
311
+ assertExactSpan(symbol);
312
+ let replacement = reindentBody(options.body, definitionIndent).trimStart();
313
+ if (content.includes("\r\n"))
314
+ replacement = replacement.replace(/\r?\n/g, "\r\n");
315
+ const next = content.slice(0, symbol.startIndex) + replacement + content.slice(symbol.endIndex);
316
+ // Validate BEFORE writing or creating a restore point so a broken edit leaves no trace.
317
+ await assertEditKeepsSyntaxValid(options.relativePath, fullPath, content, next, "replace_symbol_body");
318
+ await createRestorePoint(options.rootDir, [options.relativePath], options.message ?? `replace_symbol_body:${options.namePath}`);
319
+ await publishSource(options.rootDir, snapshot, next);
320
+ invalidateCaches();
321
+ return `Replaced ${symbol.kind} "${options.namePath}" in ${options.relativePath} (was L${symbol.line}-L${symbol.endLine}). Syntax validated.`;
322
+ }
323
+ const DECORATOR_LINE_RE = /^(@[\w$.]|#\[)/;
324
+ /**
325
+ * Walk upward past any contiguous single-line decorator/annotation lines directly above a
326
+ * symbol's own definition line (`@Injectable()`, `@Log()`, Python `@staticmethod`, Rust
327
+ * `#[derive(...)]`), so a "before" insertion lands above the decorator block instead of
328
+ * splicing between a decorator and the symbol it attaches to (which silently reassigns the
329
+ * decorator to whatever gets inserted). `defLine0` is the symbol's own 0-based line index;
330
+ * returns that unchanged when no decorator lines precede it. Does not attempt to span
331
+ * multi-line decorator argument lists (e.g. `@Component({ ... })`) — those fall back to the
332
+ * original position rather than risk misidentifying unrelated preceding code.
333
+ */
334
+ function decoratorBlockStartLine(lines, defLine0) {
335
+ let start = defLine0;
336
+ let i = defLine0 - 1;
337
+ while (i >= 0 && DECORATOR_LINE_RE.test(lines[i].trim())) {
338
+ start = i;
339
+ i--;
340
+ }
341
+ return start;
342
+ }
343
+ export async function insertAroundSymbol(options) {
344
+ return withSourceMutation(options.rootDir, () => insertAroundSymbolLocked(options));
345
+ }
346
+ async function insertAroundSymbolLocked(options) {
347
+ const snapshot = captureSource(options.rootDir, options.relativePath);
348
+ assertExpectedHash(snapshot, options.expectedContentHash);
349
+ const content = snapshot.content;
350
+ if (content === null)
351
+ throw new Error(`Source file does not exist: ${options.relativePath}`);
352
+ const { symbol, fullPath } = await locateSymbolForEdit(options.rootDir, options.relativePath, options.namePath, content);
353
+ const lines = content.split("\n");
354
+ const insertion = options.position === "before"
355
+ ? `${options.body}\n`
356
+ : `\n${options.body}`;
357
+ const insertLine = options.position === "before"
358
+ ? decoratorBlockStartLine(lines, symbol.line - 1)
359
+ : symbol.endLine;
360
+ assertExactSpan(symbol);
361
+ // Whole-line insertion is safe only when there is no neighboring code on the boundary.
362
+ const boundary = options.position === "before" ? symbol.startIndex : symbol.endIndex;
363
+ const lineStart = content.lastIndexOf("\n", boundary - 1) + 1;
364
+ const lineEnd = content.indexOf("\n", boundary);
365
+ const adjacent = options.position === "before"
366
+ ? content.slice(lineStart, boundary)
367
+ : content.slice(boundary, lineEnd < 0 ? content.length : lineEnd);
368
+ const next = adjacent.trim().length === 0
369
+ ? insertLines(content, insertLine, insertion)
370
+ : content.slice(0, boundary) + "\n" + options.body + "\n" + content.slice(boundary);
371
+ await assertEditKeepsSyntaxValid(options.relativePath, fullPath, content, next, `insert_${options.position}_symbol`);
372
+ await createRestorePoint(options.rootDir, [options.relativePath], options.message ?? `insert_${options.position}_symbol:${options.namePath}`);
373
+ await publishSource(options.rootDir, snapshot, next);
374
+ invalidateCaches();
375
+ return `Inserted ${options.position} ${symbol.kind} "${options.namePath}" in ${options.relativePath} at L${options.position === "before" ? insertLine + 1 : symbol.endLine + 1}. Syntax validated.`;
376
+ }
377
+ function escapeRegex(input) {
378
+ return input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
379
+ }
380
+ /** Shared offset-preserving mask prevents renames inside comments and literal text. */
381
+ function maskStringsAndComments(content, filePath) {
382
+ return sourceMaskFlags(content, filePath);
383
+ }
384
+ /** Word-boundary rename that skips occurrences inside string literals and comments. */
385
+ function renameOutsideStringsAndComments(text, oldName, newName, filePath) {
386
+ const masked = maskStringsAndComments(text, filePath);
387
+ const pattern = new RegExp(`(?<![\\p{L}\\p{N}_$])${escapeRegex(oldName)}(?![\\p{L}\\p{N}_$])`, "gu");
388
+ let occurrences = 0;
389
+ let skipped = 0;
390
+ const result = text.replace(pattern, (match, offset) => {
391
+ if (masked[offset]) {
392
+ skipped++;
393
+ return match;
394
+ }
395
+ occurrences++;
396
+ return newName;
397
+ });
398
+ return { result, occurrences, skipped };
399
+ }
400
+ export async function renameSymbol(options) {
401
+ return withSourceMutation(options.rootDir, () => renameSymbolLocked(options));
402
+ }
403
+ async function renameSymbolLocked(options) {
404
+ const snapshot = captureSource(options.rootDir, options.relativePath);
405
+ assertExpectedHash(snapshot, options.expectedContentHash);
406
+ if (snapshot.content === null)
407
+ throw new Error(`Source file does not exist: ${options.relativePath}`);
408
+ const { symbol, fullPath, analysis } = await locateSymbolForEdit(options.rootDir, options.relativePath, options.namePath, snapshot.content);
409
+ const oldName = symbol.name;
410
+ assertRenameName(options.newName, fullPath);
411
+ if (options.newName === oldName)
412
+ throw new Error(`rename_symbol: new name "${options.newName}" is identical to the existing name. No rename performed.`);
413
+ const collision = flattenSymbols(analysis.symbols).find((sym) => sym.name === options.newName);
414
+ if (collision)
415
+ throw new Error(`rename_symbol: a ${collision.kind} named "${options.newName}" already exists at L${collision.line}. Choose a different name.`);
416
+ const candidateFiles = new Set([options.relativePath]);
417
+ const db = await getDB(options.rootDir);
418
+ const dbFile = db.getFile(options.relativePath);
419
+ if (dbFile) {
420
+ const fileMap = new Map(db.getAllFiles().map((file) => [file.id, file.path]));
421
+ for (const importer of db.getImportersOf(dbFile.id)) {
422
+ const path = fileMap.get(importer.source_file_id);
423
+ if (path)
424
+ candidateFiles.add(path);
425
+ }
426
+ for (const caller of db.getCallersOf(oldName)) {
427
+ const path = fileMap.get(caller.file_id);
428
+ if (path)
429
+ candidateFiles.add(path);
430
+ }
431
+ }
432
+ const staged = [];
433
+ let totalSkipped = 0;
434
+ for (const file of candidateFiles) {
435
+ const source = file === options.relativePath ? snapshot : captureSource(options.rootDir, file);
436
+ if (source.content === null)
437
+ throw new Error(`rename_symbol: candidate ${file} is missing. No files were modified; refresh the index and retry.`);
438
+ const renamed = renameOutsideStringsAndComments(source.content, oldName, options.newName, source.path);
439
+ totalSkipped += renamed.skipped;
440
+ if (renamed.occurrences === 0)
441
+ continue;
442
+ // Validate every candidate even when its original syntax is already broken: rename must
443
+ // never publish an unchecked batch. Use the replacement tools to repair broken source.
444
+ const validation = await validateSyntax(renamed.result, extname(source.path).toLowerCase());
445
+ if (!validation.checked || !validation.ok) {
446
+ throw new Error(`rename_symbol: proposed rename cannot be syntax validated in ${file}${validation.firstError ? ` at L${validation.firstError.line}` : ""}. No files were modified.`);
447
+ }
448
+ staged.push({ file, snapshot: source, next: renamed.result, occurrences: renamed.occurrences });
449
+ }
450
+ for (const item of staged)
451
+ assertSourceUnchanged(options.rootDir, item.snapshot);
452
+ const restore = await createRestorePoint(options.rootDir, staged.map((item) => item.file), options.message ?? `rename_symbol:${oldName}->${options.newName}`);
453
+ const completed = [];
454
+ try {
455
+ for (const item of staged) {
456
+ await publishSource(options.rootDir, item.snapshot, item.next);
457
+ completed.push(item.file);
458
+ }
459
+ }
460
+ catch (error) {
461
+ throw new Error(`rename_symbol failed: ${error instanceof Error ? error.message : String(error)} Updated files: ${completed.join(", ") || "none"}. Pending files: ${staged.filter((item) => !completed.includes(item.file)).map((item) => item.file).join(", ")}. Restore point: ${restore.id}.`);
462
+ }
463
+ finally {
464
+ invalidateCaches();
465
+ }
466
+ const occurrences = staged.find((item) => item.file === options.relativePath)?.occurrences ?? 0;
467
+ const skipNote = totalSkipped ? ` (${totalSkipped} occurrence(s) inside string literals/comments left untouched)` : "";
468
+ return `Renamed ${symbol.kind} "${oldName}" → "${options.newName}" in ${options.relativePath} (${occurrences} occurrences in definition file, ${Math.max(0, completed.length - 1)} other file(s) updated based on import/call graph).${skipNote}`;
469
+ }
470
+ // Structural grammars sometimes accept keywords in identifier positions. Reject reserved
471
+ // names separately; syntax validation of every staged file remains necessary as well.
472
+ export function assertRenameName(name, filePath) {
473
+ const language = getGrammarName(extname(filePath).toLowerCase()) ?? "unknown";
474
+ const js = ["typescript", "tsx", "javascript"].includes(language);
475
+ if (!(js ? /^[A-Za-z_$][A-Za-z0-9_$]*$/ : /^[A-Za-z_][A-Za-z0-9_]*$/).test(name)) {
476
+ throw new Error(`Invalid new symbol name "${name}" for ${language}.`);
477
+ }
478
+ const reserved = {
479
+ javascript: "await break case catch class const continue debugger default delete do else enum export extends false finally for function if implements import in instanceof interface let new null package private protected public return static super switch this throw true try typeof var void while with yield",
480
+ python: "False None True and as assert async await break class continue def del elif else except finally for from global if import in is lambda nonlocal not or pass raise return try while with yield",
481
+ rust: "as async await break const continue crate dyn else enum extern false fn for if impl in let loop match mod move mut pub ref return self Self static struct super trait true type unsafe use where while abstract become box do final macro override priv typeof unsized virtual yield try",
482
+ go: "break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import return var",
483
+ java: "abstract assert boolean break byte case catch char class const continue default do double else enum extends final finally float for goto if implements import instanceof int interface long native new package private protected public return short static strictfp super switch synchronized this throw throws transient try void volatile while true false null _",
484
+ c: "auto break case char const continue default do double else enum extern float for goto if inline int long register restrict return short signed sizeof static struct switch typedef union unsigned void volatile while _Alignas _Alignof _Atomic _Bool _Complex _Generic _Imaginary _Noreturn _Static_assert _Thread_local",
485
+ };
486
+ const words = reserved[js ? "javascript" : language]
487
+ ?? "as break case catch class const continue default do else enum export extends false finally for function if import in new null private protected public return static struct super switch this throw true try type typeof var void while with yield";
488
+ if (new Set(words.split(" ")).has(name))
489
+ throw new Error(`Invalid new symbol name "${name}": reserved keyword in ${language}. No files were modified.`);
490
+ }
491
+ function assertExpectedHash(snapshot, expected) {
492
+ if (expected !== undefined && snapshot.hash !== expected)
493
+ throw new Error(`Source conflict: ${snapshot.path} does not match expectedContentHash. Read current content and retry.`);
494
+ }
495
+ function assertExactSpan(symbol) {
496
+ if (symbol.startIndex === undefined || symbol.endIndex === undefined || symbol.sharedDeclaration) {
497
+ throw new Error(`Cannot safely edit "${symbol.name}": an unambiguous exact source span is unavailable. Use a checked whole-file edit instead.`);
498
+ }
499
+ }
500
+ //# sourceMappingURL=symbolic-edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbolic-edit.js","sourceRoot":"","sources":["../../src/tools/symbolic-edit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface TestImpactToolOptions {
2
+ rootDir: string;
3
+ since?: string;
4
+ format?: "text" | "json";
5
+ }
6
+ export declare function getTestImpact(options: TestImpactToolOptions): Promise<string>;
7
+ //# sourceMappingURL=test-impact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-impact.d.ts","sourceRoot":"","sources":["../../src/tools/test-impact.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAMnF"}
@@ -0,0 +1,34 @@
1
+ // test_impact tool — agent-facing wrapper selecting tests affected by a change set.
2
+ // FEATURE: "Which tests must I run for my change since <ref>" — token-lean, with a
3
+ // safe run-all fallback when build config changed.
4
+ import { computeTestImpact } from "../core/test-impact.js";
5
+ export async function getTestImpact(options) {
6
+ const result = await computeTestImpact(options.rootDir, { since: options.since });
7
+ if (options.format === "json") {
8
+ return JSON.stringify(result, null, 2);
9
+ }
10
+ return formatTestImpact(result);
11
+ }
12
+ function formatTestImpact(result) {
13
+ const lines = [
14
+ `=== Test Impact (since ${result.ref}) ===`,
15
+ `Changed files: ${result.changedFiles.length} | Impacted tests: ${result.tests.length}`,
16
+ "",
17
+ ];
18
+ if (result.runAll) {
19
+ lines.push(`⚠ RUN ALL TESTS: ${result.runAllReason}`);
20
+ lines.push("A scoped selection can't be trusted for this change set.");
21
+ return lines.join("\n");
22
+ }
23
+ if (result.tests.length === 0) {
24
+ lines.push(result.changedFiles.length === 0
25
+ ? "No changes detected."
26
+ : "No tests map to the changed files. Consider adding coverage.");
27
+ return lines.join("\n");
28
+ }
29
+ for (const test of result.tests) {
30
+ lines.push(` → ${test.path} (${test.reason}, ${Math.round(test.score * 100)}%)`);
31
+ }
32
+ return lines.join("\n");
33
+ }
34
+ //# sourceMappingURL=test-impact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-impact.js","sourceRoot":"","sources":["../../src/tools/test-impact.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,mFAAmF;AACnF,mDAAmD;AAEnD,OAAO,EAAE,iBAAiB,EAAyB,MAAM,wBAAwB,CAAC;AAQlF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA8B;IAChE,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAClF,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAwB;IAChD,MAAM,KAAK,GAAG;QACZ,0BAA0B,MAAM,CAAC,GAAG,OAAO;QAC3C,kBAAkB,MAAM,CAAC,YAAY,CAAC,MAAM,sBAAsB,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE;QACvF,EAAE;KACH,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;QACvE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YACzC,CAAC,CAAC,sBAAsB;YACxB,CAAC,CAAC,8DAA8D,CAAC,CAAC;QACpE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface TestMapOptions {
2
+ rootDir: string;
3
+ file?: string;
4
+ symbol?: string;
5
+ changed?: boolean;
6
+ }
7
+ export declare function getTestMap(options: TestMapOptions): Promise<string>;
8
+ //# sourceMappingURL=test-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-map.d.ts","sourceRoot":"","sources":["../../src/tools/test-map.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA0BD,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA8CzE"}