@flyingrobots/graft 0.6.1 → 0.7.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 (561) hide show
  1. package/CHANGELOG.md +135 -0
  2. package/README.md +1 -1
  3. package/dist/adapters/json-text-decoder.d.ts +3 -0
  4. package/dist/adapters/json-text-decoder.d.ts.map +1 -0
  5. package/dist/adapters/json-text-decoder.js +12 -0
  6. package/dist/adapters/json-text-decoder.js.map +1 -0
  7. package/dist/adapters/node-paths.d.ts +3 -0
  8. package/dist/adapters/node-paths.d.ts.map +1 -0
  9. package/dist/adapters/node-paths.js +29 -0
  10. package/dist/adapters/node-paths.js.map +1 -0
  11. package/dist/adapters/repo-paths.d.ts.map +1 -1
  12. package/dist/adapters/repo-paths.js +40 -5
  13. package/dist/adapters/repo-paths.js.map +1 -1
  14. package/dist/api/tool-bridge.d.ts +1 -1
  15. package/dist/api/tool-bridge.d.ts.map +1 -1
  16. package/dist/api/tool-bridge.js +1 -1
  17. package/dist/api/tool-bridge.js.map +1 -1
  18. package/dist/cli/cli-error.d.ts.map +1 -1
  19. package/dist/cli/cli-error.js +47 -10
  20. package/dist/cli/cli-error.js.map +1 -1
  21. package/dist/cli/command-parser.d.ts +12 -3
  22. package/dist/cli/command-parser.d.ts.map +1 -1
  23. package/dist/cli/command-parser.js +161 -2
  24. package/dist/cli/command-parser.js.map +1 -1
  25. package/dist/cli/daemon-status-model.d.ts +87 -0
  26. package/dist/cli/daemon-status-model.d.ts.map +1 -0
  27. package/dist/cli/daemon-status-model.js +142 -0
  28. package/dist/cli/daemon-status-model.js.map +1 -0
  29. package/dist/cli/daemon-status-render.d.ts +3 -0
  30. package/dist/cli/daemon-status-render.d.ts.map +1 -0
  31. package/dist/cli/daemon-status-render.js +100 -0
  32. package/dist/cli/daemon-status-render.js.map +1 -0
  33. package/dist/cli/daemon-status.d.ts +7 -0
  34. package/dist/cli/daemon-status.d.ts.map +1 -0
  35. package/dist/cli/daemon-status.js +79 -0
  36. package/dist/cli/daemon-status.js.map +1 -0
  37. package/dist/cli/git-graft-enhance-model.d.ts +67 -0
  38. package/dist/cli/git-graft-enhance-model.d.ts.map +1 -0
  39. package/dist/cli/git-graft-enhance-model.js +55 -0
  40. package/dist/cli/git-graft-enhance-model.js.map +1 -0
  41. package/dist/cli/git-graft-enhance-render.d.ts +3 -0
  42. package/dist/cli/git-graft-enhance-render.d.ts.map +1 -0
  43. package/dist/cli/git-graft-enhance-render.js +29 -0
  44. package/dist/cli/git-graft-enhance-render.js.map +1 -0
  45. package/dist/cli/git-graft-enhance.d.ts +14 -0
  46. package/dist/cli/git-graft-enhance.d.ts.map +1 -0
  47. package/dist/cli/git-graft-enhance.js +29 -0
  48. package/dist/cli/git-graft-enhance.js.map +1 -0
  49. package/dist/cli/index-cmd.d.ts.map +1 -1
  50. package/dist/cli/index-cmd.js +18 -21
  51. package/dist/cli/index-cmd.js.map +1 -1
  52. package/dist/cli/index-model.d.ts +5 -9
  53. package/dist/cli/index-model.d.ts.map +1 -1
  54. package/dist/cli/index-model.js +20 -18
  55. package/dist/cli/index-model.js.map +1 -1
  56. package/dist/cli/init-client-config.d.ts +12 -7
  57. package/dist/cli/init-client-config.d.ts.map +1 -1
  58. package/dist/cli/init-client-config.js +105 -43
  59. package/dist/cli/init-client-config.js.map +1 -1
  60. package/dist/cli/init-model.d.ts +9 -2
  61. package/dist/cli/init-model.d.ts.map +1 -1
  62. package/dist/cli/init-model.js +52 -4
  63. package/dist/cli/init-model.js.map +1 -1
  64. package/dist/cli/init-render.d.ts.map +1 -1
  65. package/dist/cli/init-render.js +2 -2
  66. package/dist/cli/init-render.js.map +1 -1
  67. package/dist/cli/init.d.ts.map +1 -1
  68. package/dist/cli/init.js +11 -9
  69. package/dist/cli/init.js.map +1 -1
  70. package/dist/cli/json-document.d.ts +5 -0
  71. package/dist/cli/json-document.d.ts.map +1 -1
  72. package/dist/cli/json-document.js +9 -0
  73. package/dist/cli/json-document.js.map +1 -1
  74. package/dist/cli/main.d.ts +7 -0
  75. package/dist/cli/main.d.ts.map +1 -1
  76. package/dist/cli/main.js +49 -7
  77. package/dist/cli/main.js.map +1 -1
  78. package/dist/cli/migrate-local-history.d.ts.map +1 -1
  79. package/dist/cli/migrate-local-history.js +3 -2
  80. package/dist/cli/migrate-local-history.js.map +1 -1
  81. package/dist/cli/peer-command.d.ts +1 -1
  82. package/dist/cli/peer-command.d.ts.map +1 -1
  83. package/dist/cli/peer-command.js +1 -1
  84. package/dist/cli/peer-command.js.map +1 -1
  85. package/dist/contracts/capabilities.d.ts +5 -5
  86. package/dist/contracts/capabilities.d.ts.map +1 -1
  87. package/dist/contracts/capabilities.js +89 -0
  88. package/dist/contracts/capabilities.js.map +1 -1
  89. package/dist/contracts/causal-ontology.d.ts +17 -17
  90. package/dist/contracts/json-object.d.ts +0 -1
  91. package/dist/contracts/json-object.d.ts.map +1 -1
  92. package/dist/contracts/json-object.js +0 -10
  93. package/dist/contracts/json-object.js.map +1 -1
  94. package/dist/contracts/output-schema-cli.d.ts +277 -25
  95. package/dist/contracts/output-schema-cli.d.ts.map +1 -1
  96. package/dist/contracts/output-schema-cli.js +35 -3
  97. package/dist/contracts/output-schema-cli.js.map +1 -1
  98. package/dist/contracts/output-schema-fragments.d.ts +212 -87
  99. package/dist/contracts/output-schema-fragments.d.ts.map +1 -1
  100. package/dist/contracts/output-schema-fragments.js +49 -2
  101. package/dist/contracts/output-schema-fragments.js.map +1 -1
  102. package/dist/contracts/output-schema-mcp.d.ts +372 -47
  103. package/dist/contracts/output-schema-mcp.d.ts.map +1 -1
  104. package/dist/contracts/output-schema-mcp.js +217 -1
  105. package/dist/contracts/output-schema-mcp.js.map +1 -1
  106. package/dist/contracts/output-schema-meta.d.ts +2 -2
  107. package/dist/contracts/output-schema-meta.d.ts.map +1 -1
  108. package/dist/contracts/output-schemas.d.ts +7 -7
  109. package/dist/contracts/output-schemas.d.ts.map +1 -1
  110. package/dist/contracts/output-schemas.js +294 -6
  111. package/dist/contracts/output-schemas.js.map +1 -1
  112. package/dist/git/diff.d.ts +11 -0
  113. package/dist/git/diff.d.ts.map +1 -1
  114. package/dist/git/diff.js +50 -6
  115. package/dist/git/diff.js.map +1 -1
  116. package/dist/mcp/burden.d.ts.map +1 -1
  117. package/dist/mcp/burden.js +9 -0
  118. package/dist/mcp/burden.js.map +1 -1
  119. package/dist/mcp/context.d.ts +3 -2
  120. package/dist/mcp/context.d.ts.map +1 -1
  121. package/dist/mcp/context.js +2 -37
  122. package/dist/mcp/context.js.map +1 -1
  123. package/dist/mcp/daemon-server.d.ts +2 -0
  124. package/dist/mcp/daemon-server.d.ts.map +1 -1
  125. package/dist/mcp/daemon-server.js +6 -1
  126. package/dist/mcp/daemon-server.js.map +1 -1
  127. package/dist/mcp/daemon-session-host.d.ts +1 -0
  128. package/dist/mcp/daemon-session-host.d.ts.map +1 -1
  129. package/dist/mcp/daemon-session-host.js +3 -0
  130. package/dist/mcp/daemon-session-host.js.map +1 -1
  131. package/dist/mcp/daemon-stdio-bridge.d.ts +1 -0
  132. package/dist/mcp/daemon-stdio-bridge.d.ts.map +1 -1
  133. package/dist/mcp/daemon-stdio-bridge.js +1 -0
  134. package/dist/mcp/daemon-stdio-bridge.js.map +1 -1
  135. package/dist/mcp/monitor-tick-job.d.ts +1 -0
  136. package/dist/mcp/monitor-tick-job.d.ts.map +1 -1
  137. package/dist/mcp/monitor-tick-job.js +84 -29
  138. package/dist/mcp/monitor-tick-job.js.map +1 -1
  139. package/dist/mcp/monitor-types.d.ts +1 -1
  140. package/dist/mcp/monitor-types.d.ts.map +1 -1
  141. package/dist/mcp/persisted-local-history-graph.d.ts +2 -2
  142. package/dist/mcp/persisted-local-history-graph.d.ts.map +1 -1
  143. package/dist/mcp/persisted-local-history-graph.js +3 -2
  144. package/dist/mcp/persisted-local-history-graph.js.map +1 -1
  145. package/dist/mcp/persisted-local-history.d.ts +5 -5
  146. package/dist/mcp/persisted-local-history.js +2 -2
  147. package/dist/mcp/persisted-local-history.js.map +1 -1
  148. package/dist/mcp/persistent-monitor-runtime.d.ts +1 -0
  149. package/dist/mcp/persistent-monitor-runtime.d.ts.map +1 -1
  150. package/dist/mcp/persistent-monitor-runtime.js +35 -0
  151. package/dist/mcp/persistent-monitor-runtime.js.map +1 -1
  152. package/dist/mcp/repo-tool-worker-context.d.ts.map +1 -1
  153. package/dist/mcp/repo-tool-worker-context.js +5 -2
  154. package/dist/mcp/repo-tool-worker-context.js.map +1 -1
  155. package/dist/mcp/server-context.d.ts.map +1 -1
  156. package/dist/mcp/server-context.js +13 -0
  157. package/dist/mcp/server-context.js.map +1 -1
  158. package/dist/mcp/server-tool-access.d.ts +1 -1
  159. package/dist/mcp/server-tool-access.d.ts.map +1 -1
  160. package/dist/mcp/server-tool-access.js +3 -1
  161. package/dist/mcp/server-tool-access.js.map +1 -1
  162. package/dist/mcp/server.d.ts +3 -0
  163. package/dist/mcp/server.d.ts.map +1 -1
  164. package/dist/mcp/server.js +5 -3
  165. package/dist/mcp/server.js.map +1 -1
  166. package/dist/mcp/tool-registry.d.ts.map +1 -1
  167. package/dist/mcp/tool-registry.js +18 -0
  168. package/dist/mcp/tool-registry.js.map +1 -1
  169. package/dist/mcp/tools/code-find.d.ts.map +1 -1
  170. package/dist/mcp/tools/code-find.js +20 -0
  171. package/dist/mcp/tools/code-find.js.map +1 -1
  172. package/dist/mcp/tools/code-show.d.ts.map +1 -1
  173. package/dist/mcp/tools/code-show.js +24 -0
  174. package/dist/mcp/tools/code-show.js.map +1 -1
  175. package/dist/mcp/tools/diagnostic-models.d.ts +2 -0
  176. package/dist/mcp/tools/diagnostic-models.d.ts.map +1 -1
  177. package/dist/mcp/tools/doctor.d.ts.map +1 -1
  178. package/dist/mcp/tools/doctor.js +18 -1
  179. package/dist/mcp/tools/doctor.js.map +1 -1
  180. package/dist/mcp/tools/export-surface-diff.d.ts +3 -0
  181. package/dist/mcp/tools/export-surface-diff.d.ts.map +1 -0
  182. package/dist/mcp/tools/export-surface-diff.js +24 -0
  183. package/dist/mcp/tools/export-surface-diff.js.map +1 -0
  184. package/dist/mcp/tools/file-outline.js +1 -1
  185. package/dist/mcp/tools/file-outline.js.map +1 -1
  186. package/dist/mcp/tools/graft-edit.d.ts +3 -0
  187. package/dist/mcp/tools/graft-edit.d.ts.map +1 -0
  188. package/dist/mcp/tools/graft-edit.js +192 -0
  189. package/dist/mcp/tools/graft-edit.js.map +1 -0
  190. package/dist/mcp/tools/knowledge-map.d.ts +3 -0
  191. package/dist/mcp/tools/knowledge-map.d.ts.map +1 -0
  192. package/dist/mcp/tools/knowledge-map.js +31 -0
  193. package/dist/mcp/tools/knowledge-map.js.map +1 -0
  194. package/dist/mcp/tools/monitor-nudge.d.ts +3 -0
  195. package/dist/mcp/tools/monitor-nudge.d.ts.map +1 -0
  196. package/dist/mcp/tools/monitor-nudge.js +17 -0
  197. package/dist/mcp/tools/monitor-nudge.js.map +1 -0
  198. package/dist/mcp/tools/precision-warp.d.ts +3 -3
  199. package/dist/mcp/tools/precision-warp.d.ts.map +1 -1
  200. package/dist/mcp/tools/precision-warp.js +24 -15
  201. package/dist/mcp/tools/precision-warp.js.map +1 -1
  202. package/dist/mcp/tools/refactor-difficulty.d.ts +3 -0
  203. package/dist/mcp/tools/refactor-difficulty.d.ts.map +1 -0
  204. package/dist/mcp/tools/refactor-difficulty.js +36 -0
  205. package/dist/mcp/tools/refactor-difficulty.js.map +1 -0
  206. package/dist/mcp/tools/safe-read.js +2 -2
  207. package/dist/mcp/tools/safe-read.js.map +1 -1
  208. package/dist/mcp/tools/structural-blame.d.ts +3 -0
  209. package/dist/mcp/tools/structural-blame.d.ts.map +1 -0
  210. package/dist/mcp/tools/structural-blame.js +44 -0
  211. package/dist/mcp/tools/structural-blame.js.map +1 -0
  212. package/dist/mcp/tools/structural-churn.d.ts +3 -0
  213. package/dist/mcp/tools/structural-churn.d.ts.map +1 -0
  214. package/dist/mcp/tools/structural-churn.js +28 -0
  215. package/dist/mcp/tools/structural-churn.js.map +1 -0
  216. package/dist/mcp/tools/structural-log.d.ts +3 -0
  217. package/dist/mcp/tools/structural-log.d.ts.map +1 -0
  218. package/dist/mcp/tools/structural-log.js +38 -0
  219. package/dist/mcp/tools/structural-log.js.map +1 -0
  220. package/dist/mcp/tools/structural-review.d.ts +3 -0
  221. package/dist/mcp/tools/structural-review.d.ts.map +1 -0
  222. package/dist/mcp/tools/structural-review.js +55 -0
  223. package/dist/mcp/tools/structural-review.js.map +1 -0
  224. package/dist/mcp/warp-pool.d.ts +4 -4
  225. package/dist/mcp/warp-pool.d.ts.map +1 -1
  226. package/dist/mcp/warp-pool.js.map +1 -1
  227. package/dist/mcp/workspace-router-model.d.ts +2 -2
  228. package/dist/mcp/workspace-router-model.d.ts.map +1 -1
  229. package/dist/mcp/workspace-router-runtime.d.ts +3 -3
  230. package/dist/mcp/workspace-router-runtime.d.ts.map +1 -1
  231. package/dist/mcp/workspace-router-runtime.js +4 -1
  232. package/dist/mcp/workspace-router-runtime.js.map +1 -1
  233. package/dist/mcp/workspace-router.d.ts +3 -2
  234. package/dist/mcp/workspace-router.d.ts.map +1 -1
  235. package/dist/mcp/workspace-router.js +6 -0
  236. package/dist/mcp/workspace-router.js.map +1 -1
  237. package/dist/operations/adaptive-projection.d.ts +22 -0
  238. package/dist/operations/adaptive-projection.d.ts.map +1 -0
  239. package/dist/operations/adaptive-projection.js +36 -0
  240. package/dist/operations/adaptive-projection.js.map +1 -0
  241. package/dist/operations/agent-handoff.d.ts +25 -0
  242. package/dist/operations/agent-handoff.d.ts.map +1 -0
  243. package/dist/operations/agent-handoff.js +36 -0
  244. package/dist/operations/agent-handoff.js.map +1 -0
  245. package/dist/operations/capture-range.d.ts +33 -0
  246. package/dist/operations/capture-range.d.ts.map +1 -0
  247. package/dist/operations/capture-range.js +45 -0
  248. package/dist/operations/capture-range.js.map +1 -0
  249. package/dist/operations/conversation-primer.d.ts +27 -0
  250. package/dist/operations/conversation-primer.d.ts.map +1 -0
  251. package/dist/operations/conversation-primer.js +52 -0
  252. package/dist/operations/conversation-primer.js.map +1 -0
  253. package/dist/operations/cross-session-resume.d.ts +28 -0
  254. package/dist/operations/cross-session-resume.d.ts.map +1 -0
  255. package/dist/operations/cross-session-resume.js +79 -0
  256. package/dist/operations/cross-session-resume.js.map +1 -0
  257. package/dist/operations/deterministic-replay.d.ts +39 -0
  258. package/dist/operations/deterministic-replay.d.ts.map +1 -0
  259. package/dist/operations/deterministic-replay.js +90 -0
  260. package/dist/operations/deterministic-replay.js.map +1 -0
  261. package/dist/operations/export-surface-diff.d.ts +36 -0
  262. package/dist/operations/export-surface-diff.d.ts.map +1 -0
  263. package/dist/operations/export-surface-diff.js +298 -0
  264. package/dist/operations/export-surface-diff.js.map +1 -0
  265. package/dist/operations/footprint-parallelism.d.ts +25 -0
  266. package/dist/operations/footprint-parallelism.d.ts.map +1 -0
  267. package/dist/operations/footprint-parallelism.js +79 -0
  268. package/dist/operations/footprint-parallelism.js.map +1 -0
  269. package/dist/operations/graft-diff.d.ts.map +1 -1
  270. package/dist/operations/graft-diff.js +14 -7
  271. package/dist/operations/graft-diff.js.map +1 -1
  272. package/dist/operations/horizon-of-readability.d.ts +23 -0
  273. package/dist/operations/horizon-of-readability.d.ts.map +1 -0
  274. package/dist/operations/horizon-of-readability.js +39 -0
  275. package/dist/operations/horizon-of-readability.js.map +1 -0
  276. package/dist/operations/import-reference-impact.d.ts +13 -0
  277. package/dist/operations/import-reference-impact.d.ts.map +1 -0
  278. package/dist/operations/import-reference-impact.js +101 -0
  279. package/dist/operations/import-reference-impact.js.map +1 -0
  280. package/dist/operations/knowledge-map.d.ts +30 -0
  281. package/dist/operations/knowledge-map.d.ts.map +1 -0
  282. package/dist/operations/knowledge-map.js +64 -0
  283. package/dist/operations/knowledge-map.js.map +1 -0
  284. package/dist/operations/observation-cache.d.ts +8 -2
  285. package/dist/operations/observation-cache.d.ts.map +1 -1
  286. package/dist/operations/observation-cache.js +17 -5
  287. package/dist/operations/observation-cache.js.map +1 -1
  288. package/dist/operations/projection-safety.d.ts +31 -0
  289. package/dist/operations/projection-safety.d.ts.map +1 -0
  290. package/dist/operations/projection-safety.js +77 -0
  291. package/dist/operations/projection-safety.js.map +1 -0
  292. package/dist/operations/repo-workspace.js +3 -3
  293. package/dist/operations/repo-workspace.js.map +1 -1
  294. package/dist/operations/semantic-drift.d.ts +27 -0
  295. package/dist/operations/semantic-drift.d.ts.map +1 -0
  296. package/dist/operations/semantic-drift.js +46 -0
  297. package/dist/operations/semantic-drift.js.map +1 -0
  298. package/dist/operations/session-filtration.d.ts +36 -0
  299. package/dist/operations/session-filtration.d.ts.map +1 -0
  300. package/dist/operations/session-filtration.js +48 -0
  301. package/dist/operations/session-filtration.js.map +1 -0
  302. package/dist/operations/session-replay.d.ts +17 -0
  303. package/dist/operations/session-replay.d.ts.map +1 -0
  304. package/dist/operations/session-replay.js +59 -0
  305. package/dist/operations/session-replay.js.map +1 -0
  306. package/dist/operations/sludge-detector.d.ts +45 -0
  307. package/dist/operations/sludge-detector.d.ts.map +1 -0
  308. package/dist/operations/sludge-detector.js +278 -0
  309. package/dist/operations/sludge-detector.js.map +1 -0
  310. package/dist/operations/structural-blame.d.ts +67 -0
  311. package/dist/operations/structural-blame.d.ts.map +1 -0
  312. package/dist/operations/structural-blame.js +111 -0
  313. package/dist/operations/structural-blame.js.map +1 -0
  314. package/dist/operations/structural-review.d.ts +47 -0
  315. package/dist/operations/structural-review.d.ts.map +1 -0
  316. package/dist/operations/structural-review.js +225 -0
  317. package/dist/operations/structural-review.js.map +1 -0
  318. package/dist/operations/teaching-hints.d.ts +18 -0
  319. package/dist/operations/teaching-hints.d.ts.map +1 -0
  320. package/dist/operations/teaching-hints.js +35 -0
  321. package/dist/operations/teaching-hints.js.map +1 -0
  322. package/dist/parser/diff.d.ts +2 -0
  323. package/dist/parser/diff.d.ts.map +1 -1
  324. package/dist/parser/diff.js +7 -0
  325. package/dist/parser/diff.js.map +1 -1
  326. package/dist/ports/paths.d.ts +17 -0
  327. package/dist/ports/paths.d.ts.map +1 -0
  328. package/dist/ports/{warp.js → paths.js} +2 -2
  329. package/dist/ports/paths.js.map +1 -0
  330. package/dist/warp/ast-emitter.d.ts +28 -0
  331. package/dist/warp/ast-emitter.d.ts.map +1 -0
  332. package/dist/warp/ast-emitter.js +90 -0
  333. package/dist/warp/ast-emitter.js.map +1 -0
  334. package/dist/warp/ast-import-resolver.d.ts +13 -0
  335. package/dist/warp/ast-import-resolver.d.ts.map +1 -0
  336. package/dist/warp/ast-import-resolver.js +259 -0
  337. package/dist/warp/ast-import-resolver.js.map +1 -0
  338. package/dist/warp/commit-meta.d.ts +8 -0
  339. package/dist/warp/commit-meta.d.ts.map +1 -0
  340. package/dist/warp/commit-meta.js +13 -0
  341. package/dist/warp/commit-meta.js.map +1 -0
  342. package/dist/warp/context.d.ts +10 -0
  343. package/dist/warp/context.d.ts.map +1 -0
  344. package/dist/warp/context.js +26 -0
  345. package/dist/warp/context.js.map +1 -0
  346. package/dist/warp/dead-symbols.d.ts +40 -0
  347. package/dist/warp/dead-symbols.d.ts.map +1 -0
  348. package/dist/warp/dead-symbols.js +127 -0
  349. package/dist/warp/dead-symbols.js.map +1 -0
  350. package/dist/warp/drift-sentinel.d.ts +30 -0
  351. package/dist/warp/drift-sentinel.d.ts.map +1 -0
  352. package/dist/warp/drift-sentinel.js +65 -0
  353. package/dist/warp/drift-sentinel.js.map +1 -0
  354. package/dist/warp/index-head.d.ts +32 -0
  355. package/dist/warp/index-head.d.ts.map +1 -0
  356. package/dist/warp/index-head.js +245 -0
  357. package/dist/warp/index-head.js.map +1 -0
  358. package/dist/warp/observers.d.ts +6 -6
  359. package/dist/warp/observers.d.ts.map +1 -1
  360. package/dist/warp/observers.js +5 -4
  361. package/dist/warp/observers.js.map +1 -1
  362. package/dist/warp/open.d.ts +5 -4
  363. package/dist/warp/open.d.ts.map +1 -1
  364. package/dist/warp/open.js +24 -49
  365. package/dist/warp/open.js.map +1 -1
  366. package/dist/warp/outline-diff-trailer.d.ts +26 -0
  367. package/dist/warp/outline-diff-trailer.d.ts.map +1 -0
  368. package/dist/warp/outline-diff-trailer.js +68 -0
  369. package/dist/warp/outline-diff-trailer.js.map +1 -0
  370. package/dist/warp/refactor-difficulty.d.ts +38 -0
  371. package/dist/warp/refactor-difficulty.d.ts.map +1 -0
  372. package/dist/warp/refactor-difficulty.js +169 -0
  373. package/dist/warp/refactor-difficulty.js.map +1 -0
  374. package/dist/warp/references.d.ts +22 -0
  375. package/dist/warp/references.d.ts.map +1 -0
  376. package/dist/warp/references.js +57 -0
  377. package/dist/warp/references.js.map +1 -0
  378. package/dist/warp/stale-docs.d.ts +56 -0
  379. package/dist/warp/stale-docs.d.ts.map +1 -0
  380. package/dist/warp/stale-docs.js +149 -0
  381. package/dist/warp/stale-docs.js.map +1 -0
  382. package/dist/warp/structural-drift-detection.d.ts +49 -0
  383. package/dist/warp/structural-drift-detection.d.ts.map +1 -0
  384. package/dist/warp/structural-drift-detection.js +51 -0
  385. package/dist/warp/structural-drift-detection.js.map +1 -0
  386. package/dist/warp/structural-queries.d.ts +49 -0
  387. package/dist/warp/structural-queries.d.ts.map +1 -0
  388. package/dist/warp/structural-queries.js +175 -0
  389. package/dist/warp/structural-queries.js.map +1 -0
  390. package/dist/warp/symbol-timeline.d.ts +34 -0
  391. package/dist/warp/symbol-timeline.d.ts.map +1 -0
  392. package/dist/warp/symbol-timeline.js +127 -0
  393. package/dist/warp/symbol-timeline.js.map +1 -0
  394. package/dist/warp/traverse-hydrate.d.ts +23 -0
  395. package/dist/warp/traverse-hydrate.d.ts.map +1 -0
  396. package/dist/warp/traverse-hydrate.js +39 -0
  397. package/dist/warp/traverse-hydrate.js.map +1 -0
  398. package/dist/warp/warp-reference-count.d.ts +19 -0
  399. package/dist/warp/warp-reference-count.d.ts.map +1 -0
  400. package/dist/warp/warp-reference-count.js +32 -0
  401. package/dist/warp/warp-reference-count.js.map +1 -0
  402. package/dist/warp/warp-structural-blame.d.ts +20 -0
  403. package/dist/warp/warp-structural-blame.d.ts.map +1 -0
  404. package/dist/warp/warp-structural-blame.js +43 -0
  405. package/dist/warp/warp-structural-blame.js.map +1 -0
  406. package/dist/warp/warp-structural-churn.d.ts +30 -0
  407. package/dist/warp/warp-structural-churn.d.ts.map +1 -0
  408. package/dist/warp/warp-structural-churn.js +213 -0
  409. package/dist/warp/warp-structural-churn.js.map +1 -0
  410. package/dist/warp/warp-structural-log.d.ts +35 -0
  411. package/dist/warp/warp-structural-log.d.ts.map +1 -0
  412. package/dist/warp/warp-structural-log.js +104 -0
  413. package/dist/warp/warp-structural-log.js.map +1 -0
  414. package/docs/CLI.md +68 -4
  415. package/docs/MCP.md +23 -0
  416. package/docs/SETUP.md +101 -20
  417. package/package.json +5 -3
  418. package/src/adapters/json-text-decoder.ts +11 -0
  419. package/src/adapters/node-paths.ts +35 -0
  420. package/src/adapters/repo-paths.ts +45 -4
  421. package/src/api/tool-bridge.ts +2 -1
  422. package/src/cli/cli-error.ts +49 -10
  423. package/src/cli/command-parser.ts +185 -3
  424. package/src/cli/daemon-status-model.ts +238 -0
  425. package/src/cli/daemon-status-render.ts +102 -0
  426. package/src/cli/daemon-status.ts +100 -0
  427. package/src/cli/git-graft-enhance-model.ts +131 -0
  428. package/src/cli/git-graft-enhance-render.ts +33 -0
  429. package/src/cli/git-graft-enhance.ts +54 -0
  430. package/src/cli/index-cmd.ts +18 -22
  431. package/src/cli/index-model.ts +21 -22
  432. package/src/cli/init-client-config.ts +167 -38
  433. package/src/cli/init-model.ts +57 -2
  434. package/src/cli/init-render.ts +2 -2
  435. package/src/cli/init.ts +11 -9
  436. package/src/cli/json-document.ts +11 -0
  437. package/src/cli/main.ts +53 -6
  438. package/src/cli/migrate-local-history.ts +3 -2
  439. package/src/cli/peer-command.ts +2 -1
  440. package/src/contracts/capabilities.ts +90 -0
  441. package/src/contracts/json-object.ts +1 -11
  442. package/src/contracts/output-schema-cli.ts +36 -3
  443. package/src/contracts/output-schema-fragments.ts +52 -2
  444. package/src/contracts/output-schema-mcp.ts +219 -0
  445. package/src/contracts/output-schemas.ts +300 -6
  446. package/src/git/diff.ts +61 -0
  447. package/src/mcp/burden.ts +9 -0
  448. package/src/mcp/context.ts +5 -42
  449. package/src/mcp/daemon-server.ts +8 -1
  450. package/src/mcp/daemon-session-host.ts +4 -0
  451. package/src/mcp/daemon-stdio-bridge.ts +2 -0
  452. package/src/mcp/monitor-tick-job.ts +90 -39
  453. package/src/mcp/monitor-types.ts +1 -1
  454. package/src/mcp/persisted-local-history-graph.ts +5 -4
  455. package/src/mcp/persisted-local-history.ts +2 -2
  456. package/src/mcp/persistent-monitor-runtime.ts +37 -0
  457. package/src/mcp/repo-tool-worker-context.ts +5 -2
  458. package/src/mcp/server-context.ts +15 -2
  459. package/src/mcp/server-tool-access.ts +4 -1
  460. package/src/mcp/server.ts +8 -3
  461. package/src/mcp/tool-registry.ts +18 -0
  462. package/src/mcp/tools/code-find.ts +23 -0
  463. package/src/mcp/tools/code-show.ts +27 -0
  464. package/src/mcp/tools/diagnostic-models.ts +2 -0
  465. package/src/mcp/tools/doctor.ts +18 -1
  466. package/src/mcp/tools/export-surface-diff.ts +26 -0
  467. package/src/mcp/tools/file-outline.ts +1 -1
  468. package/src/mcp/tools/graft-edit.ts +276 -0
  469. package/src/mcp/tools/knowledge-map.ts +34 -0
  470. package/src/mcp/tools/monitor-nudge.ts +19 -0
  471. package/src/mcp/tools/precision-warp.ts +27 -16
  472. package/src/mcp/tools/refactor-difficulty.ts +42 -0
  473. package/src/mcp/tools/safe-read.ts +2 -2
  474. package/src/mcp/tools/structural-blame.ts +55 -0
  475. package/src/mcp/tools/structural-churn.ts +28 -0
  476. package/src/mcp/tools/structural-log.ts +41 -0
  477. package/src/mcp/tools/structural-review.ts +63 -0
  478. package/src/mcp/warp-pool.ts +6 -6
  479. package/src/mcp/workspace-router-model.ts +2 -2
  480. package/src/mcp/workspace-router-runtime.ts +11 -8
  481. package/src/mcp/workspace-router.ts +9 -2
  482. package/src/operations/adaptive-projection.ts +54 -0
  483. package/src/operations/agent-handoff.ts +59 -0
  484. package/src/operations/capture-range.ts +64 -0
  485. package/src/operations/conversation-primer.ts +82 -0
  486. package/src/operations/cross-session-resume.ts +104 -0
  487. package/src/operations/deterministic-replay.ts +143 -0
  488. package/src/operations/export-surface-diff.ts +355 -0
  489. package/src/operations/footprint-parallelism.ts +98 -0
  490. package/src/operations/graft-diff.ts +14 -7
  491. package/src/operations/horizon-of-readability.ts +60 -0
  492. package/src/operations/import-reference-impact.ts +143 -0
  493. package/src/operations/knowledge-map.ts +96 -0
  494. package/src/operations/observation-cache.ts +20 -4
  495. package/src/operations/projection-safety.ts +111 -0
  496. package/src/operations/repo-workspace.ts +3 -3
  497. package/src/operations/semantic-drift.ts +70 -0
  498. package/src/operations/session-filtration.ts +76 -0
  499. package/src/operations/session-replay.ts +73 -0
  500. package/src/operations/sludge-detector.ts +356 -0
  501. package/src/operations/structural-blame.ts +197 -0
  502. package/src/operations/structural-review.ts +317 -0
  503. package/src/operations/teaching-hints.ts +52 -0
  504. package/src/parser/diff.ts +7 -0
  505. package/src/ports/paths.ts +22 -0
  506. package/src/warp/ast-emitter.ts +133 -0
  507. package/src/warp/ast-import-resolver.ts +333 -0
  508. package/src/warp/commit-meta.ts +19 -0
  509. package/src/warp/context.ts +48 -0
  510. package/src/warp/dead-symbols.ts +174 -0
  511. package/src/warp/drift-sentinel.ts +101 -0
  512. package/src/warp/index-head.ts +348 -0
  513. package/src/warp/observers.ts +8 -7
  514. package/src/warp/open.ts +40 -66
  515. package/src/warp/outline-diff-trailer.ts +100 -0
  516. package/src/warp/plumbing.d.ts +11 -2
  517. package/src/warp/refactor-difficulty.ts +257 -0
  518. package/src/warp/references.ts +77 -0
  519. package/src/warp/stale-docs.ts +210 -0
  520. package/src/warp/structural-drift-detection.ts +97 -0
  521. package/src/warp/structural-queries.ts +258 -0
  522. package/src/warp/symbol-timeline.ts +209 -0
  523. package/src/warp/traverse-hydrate.ts +61 -0
  524. package/src/warp/warp-reference-count.ts +47 -0
  525. package/src/warp/warp-structural-blame.ts +65 -0
  526. package/src/warp/warp-structural-churn.ts +309 -0
  527. package/src/warp/warp-structural-log.ts +149 -0
  528. package/dist/ports/warp.d.ts +0 -45
  529. package/dist/ports/warp.d.ts.map +0 -1
  530. package/dist/ports/warp.js.map +0 -1
  531. package/dist/warp/identity-resolver.d.ts +0 -14
  532. package/dist/warp/identity-resolver.d.ts.map +0 -1
  533. package/dist/warp/identity-resolver.js +0 -31
  534. package/dist/warp/identity-resolver.js.map +0 -1
  535. package/dist/warp/indexer-git.d.ts +0 -22
  536. package/dist/warp/indexer-git.d.ts.map +0 -1
  537. package/dist/warp/indexer-git.js +0 -148
  538. package/dist/warp/indexer-git.js.map +0 -1
  539. package/dist/warp/indexer-graph.d.ts +0 -17
  540. package/dist/warp/indexer-graph.d.ts.map +0 -1
  541. package/dist/warp/indexer-graph.js +0 -179
  542. package/dist/warp/indexer-graph.js.map +0 -1
  543. package/dist/warp/indexer-model.d.ts +0 -51
  544. package/dist/warp/indexer-model.d.ts.map +0 -1
  545. package/dist/warp/indexer-model.js +0 -21
  546. package/dist/warp/indexer-model.js.map +0 -1
  547. package/dist/warp/indexer.d.ts +0 -9
  548. package/dist/warp/indexer.d.ts.map +0 -1
  549. package/dist/warp/indexer.js +0 -112
  550. package/dist/warp/indexer.js.map +0 -1
  551. package/dist/warp/symbol-identity.d.ts +0 -11
  552. package/dist/warp/symbol-identity.d.ts.map +0 -1
  553. package/dist/warp/symbol-identity.js +0 -67
  554. package/dist/warp/symbol-identity.js.map +0 -1
  555. package/src/ports/warp.ts +0 -55
  556. package/src/warp/identity-resolver.ts +0 -35
  557. package/src/warp/indexer-git.ts +0 -182
  558. package/src/warp/indexer-graph.ts +0 -276
  559. package/src/warp/indexer-model.ts +0 -69
  560. package/src/warp/indexer.ts +0 -186
  561. package/src/warp/symbol-identity.ts +0 -100
@@ -0,0 +1,309 @@
1
+ // ---------------------------------------------------------------------------
2
+ // WARP-based Structural Churn — aggregate-backed graph query
3
+ // ---------------------------------------------------------------------------
4
+
5
+ import type { AggregateResult, QueryResultV1, TickReceipt } from "@git-stunts/git-warp";
6
+ import type { WarpContext } from "./context.js";
7
+ import { observeGraph } from "./context.js";
8
+
9
+ export interface ChurnEntry {
10
+ readonly symbol: string;
11
+ readonly filePath: string;
12
+ readonly kind: string;
13
+ readonly changeCount: number;
14
+ readonly lastChangedSha: string;
15
+ readonly lastChangedDate: string;
16
+ }
17
+
18
+ export interface StructuralChurnResult {
19
+ readonly entries: readonly ChurnEntry[];
20
+ readonly totalSymbols: number;
21
+ readonly totalCommitsAnalyzed: number;
22
+ readonly summary: string;
23
+ }
24
+
25
+ /** Options for WARP-based churn analysis. */
26
+ export interface WarpChurnOptions {
27
+ readonly limit?: number;
28
+ readonly path?: string;
29
+ }
30
+
31
+ const CHANGE_EDGE_LABELS = ["adds", "changes", "removes"] as const;
32
+ type ChangeEdgeLabel = typeof CHANGE_EDGE_LABELS[number];
33
+
34
+ interface ChurnCandidate {
35
+ readonly id: string;
36
+ readonly symbol: string;
37
+ readonly filePath: string;
38
+ readonly kind: string;
39
+ }
40
+
41
+ interface ChurnDiscovery {
42
+ readonly candidates: readonly ChurnCandidate[];
43
+ readonly receipts: readonly TickReceipt[];
44
+ }
45
+
46
+ /**
47
+ * Compute structural churn entirely from the WARP graph.
48
+ *
49
+ * The count itself is computed with QueryBuilder.aggregate() over
50
+ * commit nodes whose outgoing structural-change edges touch each symbol.
51
+ * This keeps commit enumeration and per-symbol count accumulation inside
52
+ * WARP instead of walking every commit in this operation.
53
+ */
54
+ export async function structuralChurnFromGraph(
55
+ ctx: WarpContext,
56
+ options?: WarpChurnOptions,
57
+ ): Promise<StructuralChurnResult> {
58
+ const limit = options?.limit ?? 20;
59
+ const pathFilter = options?.path;
60
+
61
+ const obs = await observeGraph(ctx, {
62
+ match: ["commit:*", "sym:*"],
63
+ expose: ["sha", "tick", "name", "kind"],
64
+ });
65
+
66
+ const totalCommitsAnalyzed = await countCommits(obs);
67
+ if (totalCommitsAnalyzed === 0) {
68
+ return { entries: [], totalSymbols: 0, totalCommitsAnalyzed: 0, summary: "No indexed commits." };
69
+ }
70
+
71
+ const discovery = await discoverChurnCandidates(ctx, obs, pathFilter);
72
+ const scored = await Promise.all(discovery.candidates.map(async (candidate): Promise<ChurnEntry | null> => {
73
+ const touch = await aggregateTouchesForSymbol(obs, candidate.id, discovery.receipts);
74
+ if (touch.changeCount === 0 || touch.lastChangedTick === null) return null;
75
+
76
+ return {
77
+ symbol: candidate.symbol,
78
+ filePath: candidate.filePath,
79
+ kind: candidate.kind,
80
+ changeCount: touch.changeCount,
81
+ lastChangedSha: await shaForTick(obs, touch.lastChangedTick),
82
+ lastChangedDate: "",
83
+ };
84
+ }));
85
+
86
+ const sorted = scored
87
+ .filter((entry): entry is ChurnEntry => entry !== null)
88
+ .sort((a, b) => b.changeCount - a.changeCount);
89
+
90
+ const entries = sorted.slice(0, limit);
91
+ const top = entries[0];
92
+ const topName = top?.symbol ?? "none";
93
+ const topCount = top?.changeCount ?? 0;
94
+ const summary = entries.length === 0
95
+ ? "No structural changes found."
96
+ : `${String(sorted.length)} symbols across ${String(totalCommitsAnalyzed)} commits. Hottest: ${topName} (${String(topCount)} changes).`;
97
+
98
+ return {
99
+ entries,
100
+ totalSymbols: sorted.length,
101
+ totalCommitsAnalyzed,
102
+ summary,
103
+ };
104
+ }
105
+
106
+ async function countCommits(
107
+ obs: Awaited<ReturnType<typeof observeGraph>>,
108
+ ): Promise<number> {
109
+ const result = await obs.query()
110
+ .match("commit:*")
111
+ .aggregate({ count: true })
112
+ .run() as AggregateResult;
113
+ return result.count ?? 0;
114
+ }
115
+
116
+ async function discoverChurnCandidates(
117
+ ctx: WarpContext,
118
+ obs: Awaited<ReturnType<typeof observeGraph>>,
119
+ pathFilter: string | undefined,
120
+ ): Promise<ChurnDiscovery> {
121
+ const candidates: ChurnCandidate[] = [];
122
+
123
+ const current = await obs.query()
124
+ .match("sym:*")
125
+ .select(["id", "props"])
126
+ .run() as QueryResultV1;
127
+
128
+ for (const node of current.nodes) {
129
+ if (node.id === undefined) continue;
130
+ const parsed = parseSymId(node.id);
131
+ if (parsed === null) continue;
132
+ if (!matchesPathFilter(parsed.filePath, pathFilter)) continue;
133
+
134
+ candidates.push({
135
+ id: node.id,
136
+ symbol: parsed.symbol,
137
+ filePath: parsed.filePath,
138
+ kind: typeof node.props?.["kind"] === "string" ? node.props["kind"] : "unknown",
139
+ });
140
+ }
141
+
142
+ const { receipts } = await ctx.app.core().materialize({ receipts: true });
143
+ for (const symId of removedSymIds(receipts)) {
144
+ if (candidates.some((candidate) => candidate.id === symId)) continue;
145
+
146
+ const parsed = parseSymId(symId);
147
+ if (parsed === null) continue;
148
+ if (!matchesPathFilter(parsed.filePath, pathFilter)) continue;
149
+
150
+ candidates.push({
151
+ id: symId,
152
+ symbol: parsed.symbol,
153
+ filePath: parsed.filePath,
154
+ kind: await removedSymbolKind(ctx, symId, receipts),
155
+ });
156
+ }
157
+
158
+ return { candidates, receipts };
159
+ }
160
+
161
+ function removedSymIds(receipts: readonly TickReceipt[]): string[] {
162
+ const ids: string[] = [];
163
+ for (const receipt of receipts) {
164
+ for (const op of receipt.ops) {
165
+ if (op.op !== "NodeTombstone" || op.result !== "applied" || !op.target.startsWith("sym:")) continue;
166
+ if (!ids.includes(op.target)) {
167
+ ids.push(op.target);
168
+ }
169
+ }
170
+ }
171
+ return ids;
172
+ }
173
+
174
+ async function removedSymbolKind(
175
+ ctx: WarpContext,
176
+ symId: string,
177
+ receipts: readonly TickReceipt[],
178
+ ): Promise<string> {
179
+ const removalTicks = receipts
180
+ .filter((receipt) => receipt.ops.some((op) =>
181
+ op.op === "NodeTombstone" &&
182
+ op.result === "applied" &&
183
+ op.target === symId,
184
+ ))
185
+ .map((receipt) => receipt.lamport)
186
+ .sort((a, b) => b - a);
187
+
188
+ const lastRemovalTick = removalTicks[0];
189
+ if (lastRemovalTick === undefined || lastRemovalTick <= 1) return "unknown";
190
+
191
+ const beforeRemoval = await observeGraph(
192
+ ctx,
193
+ { match: symId, expose: ["kind"] },
194
+ { source: { kind: "live", ceiling: lastRemovalTick - 1 } },
195
+ );
196
+ const props = await beforeRemoval.getNodeProps(symId);
197
+ return typeof props?.["kind"] === "string" ? props["kind"] : "unknown";
198
+ }
199
+
200
+ async function aggregateTouchesForSymbol(
201
+ obs: Awaited<ReturnType<typeof observeGraph>>,
202
+ symId: string,
203
+ receipts: readonly TickReceipt[],
204
+ ): Promise<{ changeCount: number; lastChangedTick: number | null }> {
205
+ const aggregates = await Promise.all(
206
+ CHANGE_EDGE_LABELS.map((label) => aggregateTouchesForLabel(obs, symId, label)),
207
+ );
208
+
209
+ const changeCount = aggregates.reduce((sum, result) => sum + result.count, 0);
210
+ const lastChangedTick = aggregates.reduce<number | null>((latest, result) => {
211
+ if (result.maxTick === null) return latest;
212
+ if (latest === null || result.maxTick > latest) return result.maxTick;
213
+ return latest;
214
+ }, null);
215
+
216
+ if (changeCount > 0) {
217
+ return { changeCount, lastChangedTick };
218
+ }
219
+
220
+ // QueryBuilder starts from live node sets; a tombstoned sym can be
221
+ // discovered from tick receipts but cannot be matched as a live node.
222
+ // Use the receipt edge-add outcomes as the WARP-native fallback for
223
+ // symbols whose final state is removed.
224
+ return receiptTouchesForSymbol(symId, receipts);
225
+ }
226
+
227
+ async function aggregateTouchesForLabel(
228
+ obs: Awaited<ReturnType<typeof observeGraph>>,
229
+ symId: string,
230
+ label: ChangeEdgeLabel,
231
+ ): Promise<{ count: number; maxTick: number | null }> {
232
+ const result = await obs.query()
233
+ .match("commit:*")
234
+ .where((node) => node.edgesOut.some((edge) => edge.label === label && edge.to === symId))
235
+ .aggregate({ count: true, max: "tick" })
236
+ .run() as AggregateResult;
237
+
238
+ return {
239
+ count: result.count ?? 0,
240
+ maxTick: typeof result.max === "number" && result.max > 0 ? result.max : null,
241
+ };
242
+ }
243
+
244
+ async function shaForTick(
245
+ obs: Awaited<ReturnType<typeof observeGraph>>,
246
+ tick: number,
247
+ ): Promise<string> {
248
+ const result = await obs.query()
249
+ .match("commit:*")
250
+ .where({ tick })
251
+ .select(["id", "props"])
252
+ .run() as QueryResultV1;
253
+
254
+ const commit = result.nodes[0];
255
+ if (commit === undefined) return "";
256
+ return typeof commit.props?.["sha"] === "string"
257
+ ? commit.props["sha"]
258
+ : commit.id?.slice("commit:".length) ?? "";
259
+ }
260
+
261
+ function parseSymId(symId: string): { filePath: string; symbol: string } | null {
262
+ if (!symId.startsWith("sym:")) return null;
263
+
264
+ const withoutPrefix = symId.slice("sym:".length);
265
+ const lastColon = withoutPrefix.lastIndexOf(":");
266
+ if (lastColon === -1) return null;
267
+
268
+ return {
269
+ filePath: withoutPrefix.slice(0, lastColon),
270
+ symbol: withoutPrefix.slice(lastColon + 1),
271
+ };
272
+ }
273
+
274
+ function matchesPathFilter(filePath: string, pathFilter: string | undefined): boolean {
275
+ return pathFilter === undefined || filePath.startsWith(pathFilter);
276
+ }
277
+
278
+ function receiptTouchesForSymbol(
279
+ symId: string,
280
+ receipts: readonly TickReceipt[],
281
+ ): { changeCount: number; lastChangedTick: number | null } {
282
+ let changeCount = 0;
283
+ let lastChangedTick: number | null = null;
284
+
285
+ for (const receipt of receipts) {
286
+ for (const op of receipt.ops) {
287
+ if (op.op !== "EdgeAdd" || op.result !== "applied") continue;
288
+ if (!isChangeEdgeToSymbol(op.target, symId)) continue;
289
+
290
+ changeCount++;
291
+ if (lastChangedTick === null || receipt.lamport > lastChangedTick) {
292
+ lastChangedTick = receipt.lamport;
293
+ }
294
+ }
295
+ }
296
+
297
+ return { changeCount, lastChangedTick };
298
+ }
299
+
300
+ function isChangeEdgeToSymbol(edgeKey: string, symId: string): boolean {
301
+ const [from, to, label] = edgeKey.split("\0");
302
+ return from?.startsWith("commit:") === true &&
303
+ to === symId &&
304
+ isChangeEdgeLabel(label);
305
+ }
306
+
307
+ function isChangeEdgeLabel(label: string | undefined): label is ChangeEdgeLabel {
308
+ return CHANGE_EDGE_LABELS.some((candidate) => candidate === label);
309
+ }
@@ -0,0 +1,149 @@
1
+ // ---------------------------------------------------------------------------
2
+ // WARP-based Structural Log — replaces git log SHA walking
3
+ // ---------------------------------------------------------------------------
4
+
5
+ import type { QueryResultV1 } from "@git-stunts/git-warp";
6
+ import type { WarpContext } from "./context.js";
7
+ import { observeGraph } from "./context.js";
8
+
9
+ /** A symbol that was added, removed, or changed in a commit. */
10
+ export interface StructuralLogSymbolChange {
11
+ readonly name: string;
12
+ readonly kind: string;
13
+ readonly signature?: string | undefined;
14
+ readonly exported: boolean;
15
+ readonly filePath: string;
16
+ }
17
+
18
+ export interface StructuralLogEntry {
19
+ readonly sha: string;
20
+ readonly message: string;
21
+ readonly author: string;
22
+ readonly date: string;
23
+ readonly symbols: {
24
+ readonly added: readonly StructuralLogSymbolChange[];
25
+ readonly removed: readonly StructuralLogSymbolChange[];
26
+ readonly changed: readonly StructuralLogSymbolChange[];
27
+ };
28
+ readonly summary: string;
29
+ }
30
+
31
+ /** Options for WARP-based structural log. */
32
+ export interface WarpLogOptions {
33
+ readonly limit?: number;
34
+ readonly path?: string;
35
+ }
36
+
37
+ /**
38
+ * Produce a structural log entirely from the WARP graph.
39
+ *
40
+ * Walks commit nodes in reverse tick order (most recent first),
41
+ * traverses outgoing adds/changes/removes edges per commit to
42
+ * collect symbol changes. Zero git subprocess calls.
43
+ */
44
+ export async function structuralLogFromGraph(
45
+ ctx: WarpContext,
46
+ options?: WarpLogOptions,
47
+ ): Promise<readonly StructuralLogEntry[]> {
48
+ const limit = options?.limit ?? 20;
49
+ const pathFilter = options?.path;
50
+
51
+ // Query all commit nodes
52
+ const obs = await observeGraph(ctx, {
53
+ match: ["commit:*", "sym:*"],
54
+ expose: ["sha", "tick", "message", "author", "date", "name", "kind", "signature", "exported"],
55
+ });
56
+
57
+ const commitResult = await obs.query()
58
+ .match("commit:*")
59
+ .select(["id", "props"])
60
+ .run() as QueryResultV1;
61
+
62
+ const commits: { id: string; sha: string; tick: number; message: string; author: string; date: string }[] = [];
63
+ for (const node of commitResult.nodes) {
64
+ if (node.id === undefined) continue;
65
+ const props = node.props ?? {};
66
+ commits.push({
67
+ id: node.id,
68
+ sha: typeof props["sha"] === "string" ? props["sha"] : node.id.slice("commit:".length),
69
+ tick: typeof props["tick"] === "number" ? props["tick"] : 0,
70
+ message: typeof props["message"] === "string" ? props["message"] : "",
71
+ author: typeof props["author"] === "string" ? props["author"] : "",
72
+ date: typeof props["date"] === "string" ? props["date"] : "",
73
+ });
74
+ }
75
+
76
+ if (commits.length === 0) return [];
77
+
78
+ // Sort by tick descending (most recent first)
79
+ commits.sort((a, b) => b.tick - a.tick);
80
+ const scoped = commits.slice(0, limit);
81
+
82
+ // For each commit, traverse edges to get symbol changes
83
+ const edgeLabels = [
84
+ { label: "adds", key: "added" },
85
+ { label: "changes", key: "changed" },
86
+ { label: "removes", key: "removed" },
87
+ ] as const;
88
+
89
+ const entries: StructuralLogEntry[] = [];
90
+
91
+ for (const commit of scoped) {
92
+ const added: StructuralLogSymbolChange[] = [];
93
+ const changed: StructuralLogSymbolChange[] = [];
94
+ const removed: StructuralLogSymbolChange[] = [];
95
+
96
+ for (const { label, key } of edgeLabels) {
97
+ const symIds = await obs.traverse.bfs(commit.id, {
98
+ dir: "out",
99
+ labelFilter: label,
100
+ maxDepth: 1,
101
+ });
102
+
103
+ for (const symId of symIds) {
104
+ if (!symId.startsWith("sym:")) continue;
105
+
106
+ const withoutPrefix = symId.slice("sym:".length);
107
+ const lastColon = withoutPrefix.lastIndexOf(":");
108
+ if (lastColon === -1) continue;
109
+
110
+ const filePath = withoutPrefix.slice(0, lastColon);
111
+ const symbolName = withoutPrefix.slice(lastColon + 1);
112
+
113
+ if (pathFilter !== undefined && !filePath.startsWith(pathFilter)) continue;
114
+
115
+ const symProps = await obs.getNodeProps(symId);
116
+ const kind = typeof symProps?.["kind"] === "string" ? symProps["kind"] : "unknown";
117
+ const signature = typeof symProps?.["signature"] === "string" ? symProps["signature"] : undefined;
118
+ const exported = typeof symProps?.["exported"] === "boolean" ? symProps["exported"] : false;
119
+
120
+ const change: StructuralLogSymbolChange = {
121
+ name: symbolName,
122
+ kind,
123
+ signature,
124
+ exported,
125
+ filePath,
126
+ };
127
+
128
+ if (key === "added") added.push(change);
129
+ else if (key === "changed") changed.push(change);
130
+ else removed.push(change);
131
+ }
132
+ }
133
+
134
+ const totalChanges = added.length + changed.length + removed.length;
135
+
136
+ entries.push({
137
+ sha: commit.sha,
138
+ author: commit.author,
139
+ date: commit.date,
140
+ message: commit.message,
141
+ symbols: { added, removed, changed },
142
+ summary: totalChanges === 0
143
+ ? "No structural changes."
144
+ : `${String(added.length)} added, ${String(changed.length)} changed, ${String(removed.length)} removed.`,
145
+ });
146
+ }
147
+
148
+ return entries;
149
+ }
@@ -1,45 +0,0 @@
1
- export interface WarpObserverLens {
2
- readonly match: string | readonly string[];
3
- readonly expose?: readonly string[] | undefined;
4
- readonly redact?: readonly string[] | undefined;
5
- }
6
- export interface WarpObserverOptions {
7
- readonly source?: {
8
- readonly kind: "live";
9
- readonly ceiling: number | null;
10
- } | undefined;
11
- }
12
- export interface WarpEdge {
13
- readonly from: string;
14
- readonly to: string;
15
- readonly label: string;
16
- }
17
- export interface WarpObserver {
18
- getNodes(): Promise<string[]>;
19
- getNodeProps(nodeId: string): Promise<Record<string, unknown> | null>;
20
- getEdges(): Promise<readonly WarpEdge[]>;
21
- }
22
- export interface WarpPatchBuilder {
23
- addNode(id: string): unknown;
24
- setProperty(id: string, key: string, value: unknown): unknown;
25
- addEdge(from: string, to: string, label: string): unknown;
26
- removeNode(id: string): unknown;
27
- removeEdge(from: string, to: string, label: string): unknown;
28
- }
29
- export interface WarpMaterializeReceiptOp {
30
- readonly op: string;
31
- readonly result: string;
32
- readonly target: string;
33
- }
34
- export interface WarpMaterializeReceipt {
35
- readonly lamport: number;
36
- readonly ops: readonly WarpMaterializeReceiptOp[];
37
- }
38
- export interface WarpHandle {
39
- hasNode(nodeId: string): Promise<boolean>;
40
- observer(lens: WarpObserverLens, options?: WarpObserverOptions): Promise<WarpObserver>;
41
- patch(build: (patch: WarpPatchBuilder) => void | Promise<void>): Promise<string>;
42
- materialize(): Promise<void>;
43
- materializeReceipts(): Promise<readonly WarpMaterializeReceipt[]>;
44
- }
45
- //# sourceMappingURL=warp.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"warp.d.ts","sourceRoot":"","sources":["../../src/ports/warp.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CACjD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;KACjC,GAAG,SAAS,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACtE,QAAQ,IAAI,OAAO,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IAC9D,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1D,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC9D;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,SAAS,wBAAwB,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACvF,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjF,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,mBAAmB,IAAI,OAAO,CAAC,SAAS,sBAAsB,EAAE,CAAC,CAAC;CACnE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"warp.js","sourceRoot":"","sources":["../../src/ports/warp.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,4DAA4D;AAC5D,8EAA8E"}
@@ -1,14 +0,0 @@
1
- /**
2
- * WARP Identity Resolver — creates an IdentityResolver backed by
3
- * the WARP graph. Reads symbol identityId properties through the
4
- * observer lens system.
5
- */
6
- import type { WarpHandle } from "../ports/warp.js";
7
- import type { IdentityResolver } from "../operations/diff-identity.js";
8
- /**
9
- * Create an IdentityResolver that queries WARP for canonical symbol
10
- * identities. Each call reads the current frontier snapshot — the
11
- * resolver is stateless between calls.
12
- */
13
- export declare function createWarpIdentityResolver(warp: WarpHandle): IdentityResolver;
14
- //# sourceMappingURL=identity-resolver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"identity-resolver.d.ts","sourceRoot":"","sources":["../../src/warp/identity-resolver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAGvE;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,UAAU,GAAG,gBAAgB,CAmB7E"}
@@ -1,31 +0,0 @@
1
- /**
2
- * WARP Identity Resolver — creates an IdentityResolver backed by
3
- * the WARP graph. Reads symbol identityId properties through the
4
- * observer lens system.
5
- */
6
- import { fileSymbolsLens, observe } from "./observers.js";
7
- /**
8
- * Create an IdentityResolver that queries WARP for canonical symbol
9
- * identities. Each call reads the current frontier snapshot — the
10
- * resolver is stateless between calls.
11
- */
12
- export function createWarpIdentityResolver(warp) {
13
- return async (filePath) => {
14
- const lens = fileSymbolsLens(filePath);
15
- const obs = await observe(warp, lens);
16
- const nodes = await obs.getNodes();
17
- const identities = new Map();
18
- for (const nodeId of nodes) {
19
- const props = await obs.getNodeProps(nodeId);
20
- if (props === null)
21
- continue;
22
- const name = props["name"];
23
- const identityId = props["identityId"];
24
- if (typeof name === "string" && typeof identityId === "string") {
25
- identities.set(name, identityId);
26
- }
27
- }
28
- return identities;
29
- };
30
- }
31
- //# sourceMappingURL=identity-resolver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"identity-resolver.js","sourceRoot":"","sources":["../../src/warp/identity-resolver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAAgB;IACzD,OAAO,KAAK,EAAE,QAAgB,EAAE,EAAE;QAChC,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE7C,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC7C,IAAI,KAAK,KAAK,IAAI;gBAAE,SAAS;YAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3B,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;YACvC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC/D,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC"}
@@ -1,22 +0,0 @@
1
- import type { GitClient } from "../ports/git.js";
2
- import { type PreparedChange } from "./indexer-model.js";
3
- export declare function listCommits(gitClient: GitClient, cwd: string, from?: string, to?: string): Promise<string[]>;
4
- export declare function getCommitChanges(gitClient: GitClient, sha: string, cwd: string): Promise<{
5
- status: string;
6
- path: string;
7
- previousPath?: string;
8
- }[]>;
9
- export declare function getCommitMeta(gitClient: GitClient, sha: string, cwd: string): Promise<{
10
- message: string;
11
- author: string;
12
- email: string;
13
- timestamp: string;
14
- }>;
15
- export declare function hasParent(gitClient: GitClient, sha: string, cwd: string): Promise<boolean>;
16
- export declare function getParentSha(gitClient: GitClient, sha: string, cwd: string): Promise<string>;
17
- export declare function prepareChange(gitClient: GitClient, cwd: string, sha: string, parentRef: string, parentExists: boolean, change: {
18
- status: string;
19
- path: string;
20
- previousPath?: string;
21
- }): Promise<PreparedChange>;
22
- //# sourceMappingURL=indexer-git.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"indexer-git.d.ts","sourceRoot":"","sources":["../../src/warp/indexer-git.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAA+B,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAUtF,wBAAsB,WAAW,CAC/B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,MAAM,EACb,EAAE,CAAC,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,EAAE,CAAC,CAKnB;AAED,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAqBpE;AAED,wBAAsB,aAAa,CACjC,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAIhF;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOhG;AAED,wBAAsB,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAElG;AAED,wBAAsB,aAAa,CACjC,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,OAAO,EACrB,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9D,OAAO,CAAC,cAAc,CAAC,CAgGzB"}