contextpro-mcp 0.0.0-stage → 1.4.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 +416 -0
  2. package/INSTALL.md +128 -0
  3. package/INSTRUCTIONS.md +33 -0
  4. package/LICENSE +21 -0
  5. package/NOTICE +12 -0
  6. package/README.md +164 -2
  7. package/SECURITY.md +27 -0
  8. package/agent-guide.md +323 -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 +94 -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 +53 -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 +8 -0
  179. package/build/core/root-guard.d.ts.map +1 -0
  180. package/build/core/root-guard.js +53 -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 +599 -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 +349 -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 +26 -0
  463. package/docs/architecture.md +35 -0
  464. package/docs/configuration.md +178 -0
  465. package/docs/maintenance.md +77 -0
  466. package/package.json +80 -4
@@ -0,0 +1,343 @@
1
+ // Optional SCIP JSON index adapter for exact cross-language reference facts
2
+ // FEATURE: SCIP import — normalize external code indexes into portable Context+ evidence
3
+ import { createHash } from "crypto";
4
+ import { mkdir, readFile } from "fs/promises";
5
+ import { dirname } from "path";
6
+ import { resolveProjectPath, toProjectRelativePath } from "./path-guard.js";
7
+ import { writeFileAtomic } from "./artifacts.js";
8
+ import { getDB } from "./db.js";
9
+ export const DEFAULT_SCIP_CACHE_PATH = ".contextpro/scip-index.json";
10
+ function asRecord(value) {
11
+ return value && typeof value === "object" && !Array.isArray(value)
12
+ ? value
13
+ : null;
14
+ }
15
+ function getField(record, ...keys) {
16
+ for (const key of keys) {
17
+ if (Object.prototype.hasOwnProperty.call(record, key))
18
+ return record[key];
19
+ }
20
+ return undefined;
21
+ }
22
+ function asString(value) {
23
+ return typeof value === "string" && value.length > 0 ? value : undefined;
24
+ }
25
+ function asBoolean(value) {
26
+ return value === true;
27
+ }
28
+ function asArray(value) {
29
+ return Array.isArray(value) ? value : [];
30
+ }
31
+ function normalizeRelativeScipPath(path) {
32
+ return path.replace(/\\/g, "/").replace(/^\/+/, "") || ".";
33
+ }
34
+ function parseScipSymbolName(symbol) {
35
+ const parts = symbol.trim().split(/\s+/).filter(Boolean);
36
+ const descriptor = [...parts].reverse().find((part) => part !== "." && part !== "local") ?? symbol;
37
+ const segments = descriptor.split(/[\/#.:]/).map((part) => part.trim()).filter(Boolean);
38
+ const raw = segments.at(-1) ?? descriptor;
39
+ return raw.replace(/\(\)$/, "").replace(/[^\w$-]+$/g, "") || symbol.slice(0, 80);
40
+ }
41
+ export function scipSymbolDisplayName(symbol) {
42
+ return parseScipSymbolName(symbol);
43
+ }
44
+ function parseRange(value) {
45
+ const numbers = asArray(value)
46
+ .map((item) => Number(item))
47
+ .filter((item) => Number.isFinite(item));
48
+ if (numbers.length < 3)
49
+ return null;
50
+ if (numbers.length === 3) {
51
+ return {
52
+ line: numbers[0] + 1,
53
+ column: numbers[1] + 1,
54
+ endLine: numbers[0] + 1,
55
+ endColumn: numbers[2] + 1,
56
+ };
57
+ }
58
+ return {
59
+ line: numbers[0] + 1,
60
+ column: numbers[1] + 1,
61
+ endLine: numbers[2] + 1,
62
+ endColumn: numbers[3] + 1,
63
+ };
64
+ }
65
+ function parseSymbolRole(value) {
66
+ const numeric = Number(value ?? 0);
67
+ return Number.isFinite(numeric) && (numeric & 65) !== 0 ? "definition" : "reference";
68
+ }
69
+ function parseSignature(value) {
70
+ if (typeof value === "string")
71
+ return value;
72
+ const record = asRecord(value);
73
+ if (!record)
74
+ return undefined;
75
+ return asString(getField(record, "text", "markdown", "language"));
76
+ }
77
+ function parseDocumentation(value) {
78
+ if (typeof value === "string")
79
+ return value;
80
+ const entries = asArray(value).map((entry) => typeof entry === "string" ? entry : "").filter(Boolean);
81
+ return entries.length > 0 ? entries.join("\n") : undefined;
82
+ }
83
+ function parseRelationships(value) {
84
+ return asArray(value).flatMap((item) => {
85
+ const record = asRecord(item);
86
+ if (!record)
87
+ return [];
88
+ const targetSymbol = asString(getField(record, "symbol", "target_symbol", "targetSymbol"));
89
+ if (!targetSymbol)
90
+ return [];
91
+ return [{
92
+ targetSymbol,
93
+ isReference: asBoolean(getField(record, "is_reference", "isReference")),
94
+ isImplementation: asBoolean(getField(record, "is_implementation", "isImplementation")),
95
+ isTypeDefinition: asBoolean(getField(record, "is_type_definition", "isTypeDefinition")),
96
+ isDefinition: asBoolean(getField(record, "is_definition", "isDefinition")),
97
+ }];
98
+ });
99
+ }
100
+ function coerceNormalizedIndex(raw, sourcePath) {
101
+ const record = asRecord(raw);
102
+ if (!record || record.version !== 1 || !Array.isArray(record.symbols) || !Array.isArray(record.occurrences)) {
103
+ return null;
104
+ }
105
+ return {
106
+ version: 1,
107
+ sourcePath: asString(record.sourcePath) ?? sourcePath,
108
+ importedAt: asString(record.importedAt) ?? new Date().toISOString(),
109
+ documents: Number(record.documents ?? 0),
110
+ symbols: record.symbols.flatMap((item) => {
111
+ const symbol = asRecord(item);
112
+ if (!symbol || !asString(symbol.symbol) || !asString(symbol.name))
113
+ return [];
114
+ return [{
115
+ symbol: asString(symbol.symbol),
116
+ name: asString(symbol.name),
117
+ kind: asString(symbol.kind),
118
+ file: asString(symbol.file),
119
+ line: typeof symbol.line === "number" ? symbol.line : undefined,
120
+ documentation: asString(symbol.documentation),
121
+ signature: asString(symbol.signature),
122
+ relationships: parseRelationships(symbol.relationships),
123
+ }];
124
+ }),
125
+ occurrences: record.occurrences.flatMap((item) => {
126
+ const occurrence = asRecord(item);
127
+ if (!occurrence || !asString(occurrence.file) || !asString(occurrence.symbol) || !asString(occurrence.name))
128
+ return [];
129
+ const line = Number(occurrence.line);
130
+ const column = Number(occurrence.column);
131
+ if (!Number.isFinite(line) || !Number.isFinite(column))
132
+ return [];
133
+ return [{
134
+ file: normalizeRelativeScipPath(asString(occurrence.file)),
135
+ symbol: asString(occurrence.symbol),
136
+ name: asString(occurrence.name),
137
+ line,
138
+ column,
139
+ endLine: typeof occurrence.endLine === "number" ? occurrence.endLine : undefined,
140
+ endColumn: typeof occurrence.endColumn === "number" ? occurrence.endColumn : undefined,
141
+ role: occurrence.role === "definition" ? "definition" : "reference",
142
+ syntaxKind: asString(occurrence.syntaxKind),
143
+ }];
144
+ }),
145
+ };
146
+ }
147
+ export function normalizeScipIndex(raw, sourcePath) {
148
+ const normalized = coerceNormalizedIndex(raw, sourcePath);
149
+ if (normalized)
150
+ return normalized;
151
+ const root = asRecord(raw);
152
+ const documents = asArray(root ? getField(root, "documents") : undefined);
153
+ const symbols = new Map();
154
+ const occurrences = [];
155
+ const ensureSymbol = (symbol, patch = {}) => {
156
+ const existing = symbols.get(symbol);
157
+ const next = {
158
+ symbol,
159
+ name: patch.name ?? existing?.name ?? parseScipSymbolName(symbol),
160
+ kind: patch.kind ?? existing?.kind,
161
+ file: patch.file ?? existing?.file,
162
+ line: patch.line ?? existing?.line,
163
+ documentation: patch.documentation ?? existing?.documentation,
164
+ signature: patch.signature ?? existing?.signature,
165
+ relationships: patch.relationships ?? existing?.relationships ?? [],
166
+ };
167
+ symbols.set(symbol, next);
168
+ };
169
+ for (const document of documents) {
170
+ const doc = asRecord(document);
171
+ if (!doc)
172
+ continue;
173
+ const path = asString(getField(doc, "relative_path", "relativePath", "path"));
174
+ if (!path)
175
+ continue;
176
+ const file = normalizeRelativeScipPath(path);
177
+ for (const item of asArray(getField(doc, "symbols"))) {
178
+ const record = asRecord(item);
179
+ const symbol = record ? asString(getField(record, "symbol")) : undefined;
180
+ if (!record || !symbol)
181
+ continue;
182
+ ensureSymbol(symbol, {
183
+ name: asString(getField(record, "display_name", "displayName", "name")) ?? parseScipSymbolName(symbol),
184
+ kind: asString(getField(record, "kind")),
185
+ documentation: parseDocumentation(getField(record, "documentation")),
186
+ signature: parseSignature(getField(record, "signature_documentation", "signatureDocumentation")),
187
+ relationships: parseRelationships(getField(record, "relationships")),
188
+ });
189
+ }
190
+ for (const item of asArray(getField(doc, "occurrences"))) {
191
+ const record = asRecord(item);
192
+ const symbol = record ? asString(getField(record, "symbol")) : undefined;
193
+ const range = record ? parseRange(getField(record, "range")) : null;
194
+ if (!record || !symbol || !range)
195
+ continue;
196
+ const role = parseSymbolRole(getField(record, "symbol_roles", "symbolRoles"));
197
+ const name = parseScipSymbolName(symbol);
198
+ const occurrence = {
199
+ file,
200
+ symbol,
201
+ name,
202
+ line: range.line,
203
+ column: range.column,
204
+ endLine: range.endLine,
205
+ endColumn: range.endColumn,
206
+ role,
207
+ syntaxKind: asString(getField(record, "syntax_kind", "syntaxKind")),
208
+ };
209
+ occurrences.push(occurrence);
210
+ ensureSymbol(symbol, role === "definition" ? { name, file, line: range.line } : { name });
211
+ }
212
+ }
213
+ return {
214
+ version: 1,
215
+ sourcePath,
216
+ importedAt: new Date().toISOString(),
217
+ documents: documents.length,
218
+ symbols: [...symbols.values()].sort((a, b) => a.symbol.localeCompare(b.symbol)),
219
+ occurrences: occurrences.sort((a, b) => a.file.localeCompare(b.file) || a.line - b.line || a.column - b.column),
220
+ };
221
+ }
222
+ export async function importScipIndex(rootDir, indexPath) {
223
+ const sourceFullPath = resolveProjectPath(rootDir, indexPath, "index_path");
224
+ const sourcePath = toProjectRelativePath(rootDir, sourceFullPath, "index_path");
225
+ let raw;
226
+ try {
227
+ raw = JSON.parse(await readFile(sourceFullPath, "utf-8"));
228
+ }
229
+ catch (error) {
230
+ if (error instanceof SyntaxError) {
231
+ throw new Error(`scip_import: failed to parse "${sourcePath}" as JSON: ${error.message}. Re-export the SCIP index and try again.`);
232
+ }
233
+ throw error;
234
+ }
235
+ const index = normalizeScipIndex(raw, sourcePath);
236
+ const cachePath = resolveProjectPath(rootDir, DEFAULT_SCIP_CACHE_PATH, "scip cache");
237
+ await mkdir(dirname(cachePath), { recursive: true });
238
+ await writeFileAtomic(cachePath, JSON.stringify(index, null, 2) + "\n");
239
+ // A SCIP import changes what buildProjectGraph/exact_references produce (new resolved
240
+ // references, possibly new file nodes) without touching any file's content hash, so it
241
+ // needs to bump the index generation itself — otherwise generation-keyed caches (the
242
+ // project graph cache, artifact freshness checks) would keep serving pre-import results.
243
+ const db = await getDB(rootDir);
244
+ db.bumpIndexGeneration();
245
+ return { cachePath, index };
246
+ }
247
+ export async function loadScipIndex(rootDir, indexPath) {
248
+ const candidates = indexPath
249
+ ? [indexPath]
250
+ : [DEFAULT_SCIP_CACHE_PATH, ".contextpro/index.scip.json", "index.scip.json"];
251
+ for (const candidate of candidates) {
252
+ try {
253
+ const fullPath = resolveProjectPath(rootDir, candidate, "scip index");
254
+ const sourcePath = toProjectRelativePath(rootDir, fullPath, "scip index");
255
+ const raw = JSON.parse(await readFile(fullPath, "utf-8"));
256
+ return normalizeScipIndex(raw, sourcePath);
257
+ }
258
+ catch (error) {
259
+ if (error instanceof SyntaxError) {
260
+ process.stderr.write(`[contextpro/scip] cache corrupt at "${candidate}": ${error.message}. Re-import via scip_import.\n`);
261
+ return null;
262
+ }
263
+ const code = error.code;
264
+ if (code && code !== "ENOENT")
265
+ throw error;
266
+ }
267
+ }
268
+ return null;
269
+ }
270
+ async function readContextLine(rootDir, file, line) {
271
+ try {
272
+ const fullPath = resolveProjectPath(rootDir, file, "reference file");
273
+ const content = await readFile(fullPath, "utf-8");
274
+ return content.split("\n")[Math.max(0, line - 1)]?.trim().slice(0, 160) ?? "";
275
+ }
276
+ catch {
277
+ return "";
278
+ }
279
+ }
280
+ function symbolDigest(symbol) {
281
+ return createHash("sha1").update(symbol).digest("hex").slice(0, 16);
282
+ }
283
+ export function scipSymbolNodeId(symbol) {
284
+ return `symbol:scip:${symbolDigest(symbol)}`;
285
+ }
286
+ export async function findScipReferences(options) {
287
+ const index = await loadScipIndex(options.rootDir, options.indexPath);
288
+ if (!index)
289
+ return null;
290
+ const file = options.file ? toProjectRelativePath(options.rootDir, options.file, "file") : undefined;
291
+ const targetSymbols = new Set();
292
+ if (file && options.line) {
293
+ for (const occurrence of index.occurrences) {
294
+ if (occurrence.file !== file)
295
+ continue;
296
+ if (occurrence.line !== options.line)
297
+ continue;
298
+ if (occurrence.name === options.symbolName || occurrence.symbol.includes(options.symbolName)) {
299
+ targetSymbols.add(occurrence.symbol);
300
+ }
301
+ }
302
+ }
303
+ if (targetSymbols.size === 0) {
304
+ for (const symbol of index.symbols) {
305
+ if (symbol.name === options.symbolName || symbol.symbol.includes(options.symbolName)) {
306
+ targetSymbols.add(symbol.symbol);
307
+ }
308
+ }
309
+ }
310
+ if (targetSymbols.size === 0) {
311
+ for (const occurrence of index.occurrences) {
312
+ if (occurrence.name === options.symbolName)
313
+ targetSymbols.add(occurrence.symbol);
314
+ }
315
+ }
316
+ if (targetSymbols.size === 0)
317
+ return null;
318
+ const limit = Math.max(1, Math.min(options.limit ?? 100, 500));
319
+ const allOccurrences = index.occurrences
320
+ .filter((occurrence) => targetSymbols.has(occurrence.symbol))
321
+ .sort((a, b) => Number(b.role === "definition") - Number(a.role === "definition") || a.file.localeCompare(b.file) || a.line - b.line || a.column - b.column);
322
+ const occurrences = allOccurrences.slice(0, limit);
323
+ const references = [];
324
+ for (const occurrence of occurrences) {
325
+ references.push({
326
+ file: occurrence.file,
327
+ line: occurrence.line,
328
+ column: occurrence.column,
329
+ context: await readContextLine(options.rootDir, occurrence.file, occurrence.line),
330
+ isDefinition: occurrence.role === "definition",
331
+ confidence: "SCIP_RESOLVED",
332
+ symbol: occurrence.symbol,
333
+ });
334
+ }
335
+ return {
336
+ symbol: options.symbolName,
337
+ total: allOccurrences.length,
338
+ symbols: [...targetSymbols].sort(),
339
+ confidence: "SCIP_RESOLVED",
340
+ references,
341
+ };
342
+ }
343
+ //# sourceMappingURL=scip-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scip-index.js","sourceRoot":"","sources":["../../src/core/scip-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export type SymbolChange = "added" | "removed" | "modified" | "moved";
2
+ export interface SemanticSymbolChange {
3
+ name: string;
4
+ kind: string;
5
+ change: SymbolChange;
6
+ /** New-side line (or old-side line for removals). */
7
+ line: number;
8
+ signature: string | null;
9
+ }
10
+ export interface SemanticFileDiff {
11
+ path: string;
12
+ status: "added" | "removed" | "modified";
13
+ symbols: SemanticSymbolChange[];
14
+ }
15
+ export interface SemanticDiffSummary {
16
+ filesChanged: number;
17
+ added: number;
18
+ removed: number;
19
+ modified: number;
20
+ moved: number;
21
+ }
22
+ export interface SemanticDiffResult {
23
+ ref: string;
24
+ files: SemanticFileDiff[];
25
+ summary: SemanticDiffSummary;
26
+ }
27
+ export interface SemanticDiffOptions {
28
+ /** Git ref to diff the working tree against (e.g. "HEAD", "main"). */
29
+ since?: string;
30
+ }
31
+ export declare function computeSemanticDiff(rootDir: string, options?: SemanticDiffOptions): Promise<SemanticDiffResult>;
32
+ //# sourceMappingURL=semantic-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-diff.d.ts","sourceRoot":"","sources":["../../src/core/semantic-diff.ts"],"names":[],"mappings":"AA6BA,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;AAEtE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;IACzC,OAAO,EAAE,oBAAoB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,OAAO,EAAE,mBAAmB,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAuND,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAmD7B"}
@@ -0,0 +1,259 @@
1
+ // semantic_diff — AST-level symbol change detection between git revisions.
2
+ //
3
+ // FEATURE: A line-based git diff tells an agent which LINES changed; it cannot
4
+ // say which SYMBOLS changed, and it flags pure reformatting as a change. This
5
+ // computes, per changed file, which symbols were added / removed / modified
6
+ // (body actually changed) / moved (only relocated), by parsing BOTH the old blob
7
+ // and the new content with tree-sitter and diffing the symbol sets. Output is
8
+ // token-lean and pairs with change_impact/blast_radius (what changed → what it
9
+ // affects). Reformatting that leaves symbol bodies semantically identical is
10
+ // intentionally ignored.
11
+ //
12
+ // KNOWN LIMITATIONS (modified-vs-reformatted is a heuristic, not a tokenizer):
13
+ // - A whitespace-only edit INSIDE a regexp literal (`/a - b/` → `/a-b/`) is not
14
+ // detected — telling a regex from a `/` division reliably needs full
15
+ // tokenization; masking it heuristically risks corrupting real code comparison.
16
+ // - The fingerprint is regex-based, not an AST-node hash, so exotic formatting
17
+ // edge cases may slip through. The complete fix is per-node structural hashing
18
+ // via the tree-sitter parse (a larger follow-up); the current heuristic covers
19
+ // the common cases (string/template literals, indentation, punctuation spacing)
20
+ // and is validated by the test suite.
21
+ import { execFile } from "child_process";
22
+ import { promisify } from "util";
23
+ import { readFile } from "fs/promises";
24
+ import { analyzeContent, flattenSymbols, isSupportedFile } from "./parser.js";
25
+ import { resolveProjectPath } from "./path-guard.js";
26
+ const execFileAsync = promisify(execFile);
27
+ function symbolKey(symbol) {
28
+ // Include parent context so a class method (Foo.bar) is keyed distinctly from a
29
+ // top-level bar — and so method add/remove/modify is reported as a method change,
30
+ // not collapsed into a coarse change on the enclosing class.
31
+ return `${symbol.kind}:${symbol.parentName ? `${symbol.parentName}.` : ""}${symbol.name}`;
32
+ }
33
+ function displayName(symbol) {
34
+ return symbol.parentName ? `${symbol.parentName}.${symbol.name}` : symbol.name;
35
+ }
36
+ // Languages where leading indentation is syntactically significant — there, the
37
+ // indentation level is part of the meaning and must survive into the fingerprint.
38
+ const INDENT_SIGNIFICANT_EXTS = new Set([".py", ".pyi", ".yaml", ".yml", ".coffee", ".hs", ".elm", ".fs", ".nim"]);
39
+ /**
40
+ * A formatting-insensitive — but NOT whitespace-blind — view of a symbol's source
41
+ * span. String/char literals are EXTRACTED first (in both branches) and replaced
42
+ * with a word-only placeholder, so neither the whitespace-collapse (indent branch)
43
+ * nor the punctuation-strip (free-form branch) can rewrite their contents. The
44
+ * captured literals are appended verbatim, so any in-string edit — "a b"->"a b",
45
+ * "a - b"->"a-b", "a -b"->"a- b" — still changes the fingerprint, while pure code
46
+ * reformatting does not. For indentation-significant languages we also keep per-line
47
+ * indent DEPTH (block structure is semantic); free-form languages collapse layout.
48
+ */
49
+ function bodyFingerprint(symbol, lines, path) {
50
+ const start = Math.max(0, symbol.line - 1);
51
+ const end = Math.min(lines.length, Math.max(symbol.endLine, symbol.line));
52
+ const span = lines.slice(start, end);
53
+ const ext = path.slice(path.lastIndexOf(".")).toLowerCase();
54
+ const literals = [];
55
+ // An order-sensitive serialization of captured literals, appended to the
56
+ // fingerprint so an edit INSIDE any literal changes it.
57
+ const tail = () => (literals.length > 0 ? "_LITS_" + literals.join("_LITSEP_") : "");
58
+ if (INDENT_SIGNIFICANT_EXTS.has(ext)) {
59
+ // Indentation is semantic here, so we keep per-line structure. Mask single-line
60
+ // literals per line; multiline literals are rare in these languages and fall
61
+ // through to whitespace-collapse (acceptable, documented limitation). Use the
62
+ // EXACT indent width as the depth marker so e.g. 2-space vs 3-space — a real
63
+ // block-level change — produces different fingerprints (no /2 bucketing).
64
+ const body = span
65
+ .map((line) => maskStringLiterals(line, literals))
66
+ .map((line) => {
67
+ const indentRun = line.match(/^[ \t]*/);
68
+ const indent = (indentRun ? indentRun[0] : "").replace(/\t/g, " ").length;
69
+ const content = line.trim().replace(/[ \t]+/g, " ");
70
+ return content.length > 0 ? "I".repeat(indent) + ">" + content : "";
71
+ })
72
+ .filter((line) => line.length > 0)
73
+ .join("\n");
74
+ return body + tail();
75
+ }
76
+ // Free-form languages: mask literals across the WHOLE span first (joined with
77
+ // newlines), so a MULTILINE template literal is captured as one literal and its
78
+ // contents can't be rewritten by normalization. Then collapse layout (multi-line
79
+ // vs single-line, trailing ws) and strip whitespace adjacent to punctuation
80
+ // (`(){`, `() {`, `; }` all match). Note: regexp literals are NOT masked — telling
81
+ // a `/…/` regex from a `/` division reliably needs full tokenization, so a
82
+ // whitespace-only edit inside a regex literal is a known, narrow blind spot.
83
+ const masked = maskStringLiterals(span.join("\n"), literals);
84
+ const joined = masked.split("\n").map((line) => line.trim()).filter((line) => line.length > 0).join(" ");
85
+ return joined.replace(/[ \t]*([^\w\s])[ \t]*/g, "$1") + tail();
86
+ }
87
+ // A placeholder made of word characters only, so neither whitespace-collapse nor
88
+ // punctuation-strip normalization can alter or split it.
89
+ function literalPlaceholder(index) {
90
+ return "LIT" + index + "LIT";
91
+ }
92
+ /**
93
+ * Replace each '…', "…", or `…` literal in `text` with a word-only placeholder,
94
+ * pushing the verbatim literal (quotes included) into `literals`. Escaped quotes
95
+ * inside a literal are handled. The placeholder survives all later normalization;
96
+ * the captured literal is what makes an in-string edit change the fingerprint.
97
+ */
98
+ function maskStringLiterals(text, literals) {
99
+ return text.replace(/(["'`])(?:\\.|(?!\1)[\s\S])*\1/g, (lit) => {
100
+ const placeholder = literalPlaceholder(literals.length);
101
+ literals.push(lit);
102
+ return placeholder;
103
+ });
104
+ }
105
+ async function gitDiffNameStatus(rootDir, ref) {
106
+ try {
107
+ const { stdout } = await execFileAsync("git", ["diff", "--name-status", ref], {
108
+ cwd: rootDir,
109
+ timeout: 15000,
110
+ maxBuffer: 1024 * 1024,
111
+ });
112
+ return stdout
113
+ .trim()
114
+ .split("\n")
115
+ .filter((line) => line.trim().length > 0)
116
+ .map((line) => {
117
+ const parts = line.split("\t");
118
+ const status = parts[0].trim();
119
+ // Rename (R###) and copy (C###) records carry TWO paths: old then new.
120
+ // The new-side path is what exists in the working tree; the old-side path
121
+ // is where the OLD blob lives. Without this, the tab-joined "old\tnew"
122
+ // path breaks both `git show <ref>:<path>` and the working-tree read.
123
+ if (/^[RC]\d*/.test(status) && parts.length >= 3) {
124
+ return { status, oldPath: parts[1].trim(), path: parts[2].trim() };
125
+ }
126
+ return { status, path: parts.slice(1).join("\t").trim() };
127
+ });
128
+ }
129
+ catch (error) {
130
+ // git exits 128 for an unresolvable ref (a typo'd baseline like `mian`). An
131
+ // EMPTY diff exits 0, so reaching here means the ref/command genuinely failed —
132
+ // surface it instead of silently reporting "no changes" and skipping review.
133
+ throw new Error(`semantic_diff: could not diff against '${ref}' — ${error instanceof Error ? error.message.split("\n")[0] : String(error)}`);
134
+ }
135
+ }
136
+ async function gitUntrackedFiles(rootDir) {
137
+ try {
138
+ const { stdout } = await execFileAsync("git", ["ls-files", "--others", "--exclude-standard"], {
139
+ cwd: rootDir,
140
+ timeout: 10000,
141
+ maxBuffer: 1024 * 1024,
142
+ });
143
+ return stdout.trim().split("\n").map((l) => l.trim()).filter((l) => l.length > 0);
144
+ }
145
+ catch {
146
+ return [];
147
+ }
148
+ }
149
+ async function gitShow(rootDir, ref, path) {
150
+ try {
151
+ const { stdout } = await execFileAsync("git", ["show", `${ref}:${path}`], {
152
+ cwd: rootDir,
153
+ timeout: 15000,
154
+ maxBuffer: 4 * 1024 * 1024,
155
+ });
156
+ return stdout;
157
+ }
158
+ catch {
159
+ return null;
160
+ }
161
+ }
162
+ async function readWorkingTree(rootDir, path) {
163
+ try {
164
+ const full = resolveProjectPath(rootDir, path, "semantic-diff file");
165
+ return await readFile(full, "utf-8");
166
+ }
167
+ catch {
168
+ return null;
169
+ }
170
+ }
171
+ function classifyFile(oldSymbols, oldLines, newSymbols, newLines, path) {
172
+ const changes = [];
173
+ const oldByKey = new Map(oldSymbols.map((s) => [symbolKey(s), s]));
174
+ const newByKey = new Map(newSymbols.map((s) => [symbolKey(s), s]));
175
+ for (const newSym of newSymbols) {
176
+ const key = symbolKey(newSym);
177
+ const oldSym = oldByKey.get(key);
178
+ if (!oldSym) {
179
+ changes.push({ name: displayName(newSym), kind: newSym.kind, change: "added", line: newSym.line, signature: newSym.signature });
180
+ continue;
181
+ }
182
+ // Compare formatting-insensitive body fingerprints. The signature text is itself
183
+ // formatting-sensitive (tree-sitter captures it differently across layouts), so
184
+ // relying on it would flag pure reformatting; the fingerprint already includes
185
+ // the signature line, so a real signature change still shows up as a body change.
186
+ const oldBody = bodyFingerprint(oldSym, oldLines, path);
187
+ const newBody = bodyFingerprint(newSym, newLines, path);
188
+ if (oldBody !== newBody) {
189
+ changes.push({ name: displayName(newSym), kind: newSym.kind, change: "modified", line: newSym.line, signature: newSym.signature });
190
+ }
191
+ else if (oldSym.line !== newSym.line) {
192
+ changes.push({ name: displayName(newSym), kind: newSym.kind, change: "moved", line: newSym.line, signature: newSym.signature });
193
+ }
194
+ }
195
+ for (const oldSym of oldSymbols) {
196
+ if (!newByKey.has(symbolKey(oldSym))) {
197
+ changes.push({ name: displayName(oldSym), kind: oldSym.kind, change: "removed", line: oldSym.line, signature: oldSym.signature });
198
+ }
199
+ }
200
+ // Suppress coarse parent-container "modified" entries when the real change is in
201
+ // a member. A class whose method changed has a different full-body fingerprint
202
+ // and would otherwise be reported as modified ON TOP OF the precise method
203
+ // change, polluting the token-lean member-level summary. If any change targets a
204
+ // descendant (name starts with "<parent>."), drop the parent's own "modified".
205
+ const changedNames = new Set(changes.map((c) => c.name));
206
+ return changes.filter((c) => {
207
+ if (c.change !== "modified")
208
+ return true;
209
+ const hasChangedMember = [...changedNames].some((other) => other !== c.name && other.startsWith(`${c.name}.`));
210
+ return !hasChangedMember;
211
+ });
212
+ }
213
+ export async function computeSemanticDiff(rootDir, options = {}) {
214
+ const ref = options.since ?? "HEAD";
215
+ const tracked = await gitDiffNameStatus(rootDir, ref);
216
+ // `git diff` omits untracked files, but "what changed since main" must include
217
+ // brand-new files an agent just created — surface them as additions.
218
+ const trackedPaths = new Set(tracked.map((e) => e.path));
219
+ const untracked = (await gitUntrackedFiles(rootDir))
220
+ .filter((path) => !trackedPaths.has(path))
221
+ .map((path) => ({ status: "A", path }));
222
+ const entries = [...tracked, ...untracked].filter((e) => isSupportedFile(e.path));
223
+ const files = [];
224
+ for (const entry of entries) {
225
+ const isDelete = entry.status.startsWith("D");
226
+ const isAdd = entry.status.startsWith("A");
227
+ const oldRaw = isAdd ? null : await gitShow(rootDir, ref, entry.oldPath ?? entry.path);
228
+ const newRaw = isDelete ? null : await readWorkingTree(rootDir, entry.path);
229
+ const oldAnalysis = oldRaw != null ? await analyzeContent(entry.oldPath ?? entry.path, oldRaw) : null;
230
+ const newAnalysis = newRaw != null ? await analyzeContent(entry.path, newRaw) : null;
231
+ // Flatten nested symbols (class methods, etc.) so a method change is reported
232
+ // as a method change, not collapsed into a coarse change on its parent class.
233
+ const oldSymbols = oldAnalysis ? flattenSymbols(oldAnalysis.symbols) : [];
234
+ const newSymbols = newAnalysis ? flattenSymbols(newAnalysis.symbols) : [];
235
+ const oldLines = (oldRaw ?? "").split("\n");
236
+ const newLines = (newRaw ?? "").split("\n");
237
+ const symbols = classifyFile(oldSymbols, oldLines, newSymbols, newLines, entry.path);
238
+ if (symbols.length === 0 && !isAdd && !isDelete)
239
+ continue;
240
+ files.push({
241
+ path: entry.path,
242
+ status: isAdd ? "added" : isDelete ? "removed" : "modified",
243
+ symbols,
244
+ });
245
+ }
246
+ const summary = {
247
+ filesChanged: files.length,
248
+ added: 0,
249
+ removed: 0,
250
+ modified: 0,
251
+ moved: 0,
252
+ };
253
+ for (const file of files) {
254
+ for (const sym of file.symbols)
255
+ summary[sym.change] += 1;
256
+ }
257
+ return { ref, files, summary };
258
+ }
259
+ //# sourceMappingURL=semantic-diff.js.map