@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,100 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
3
+ import { type z } from "zod";
4
+ import { mcpOutputBodySchemas } from "../contracts/output-schema-mcp.js";
5
+ import { createLocalSocketFetch, ensureDaemonReady } from "../mcp/daemon-stdio-bridge.js";
6
+ import { GRAFT_VERSION } from "../version.js";
7
+ import type { DaemonStatusReadSnapshot } from "./daemon-status-model.js";
8
+
9
+ const MCP_PATH = "/mcp";
10
+
11
+ export interface ReadDaemonStatusOptions {
12
+ readonly cwd: string;
13
+ readonly socketPath?: string | undefined;
14
+ }
15
+
16
+ function readToolText(result: unknown): string {
17
+ const content = (result as { readonly content?: unknown }).content;
18
+ if (!Array.isArray(content)) {
19
+ throw new Error("Daemon tool returned no content");
20
+ }
21
+ const text = content.find((item): item is { readonly type: "text"; readonly text: string } => {
22
+ return typeof item === "object"
23
+ && item !== null
24
+ && (item as { readonly type?: unknown }).type === "text"
25
+ && typeof (item as { readonly text?: unknown }).text === "string";
26
+ });
27
+ if (text === undefined) {
28
+ throw new Error("Daemon tool returned no text content");
29
+ }
30
+ return text.text;
31
+ }
32
+
33
+ function stripMcpCommon(value: unknown): unknown {
34
+ if (typeof value !== "object" || value === null) {
35
+ return value;
36
+ }
37
+ const body = { ...(value as Record<string, unknown>) };
38
+ delete body["_schema"];
39
+ delete body["_receipt"];
40
+ delete body["tripwire"];
41
+ return body;
42
+ }
43
+
44
+ function parseToolBody<T>(schema: z.ZodType<T>, result: unknown): T {
45
+ return schema.parse(stripMcpCommon(JSON.parse(readToolText(result)) as unknown));
46
+ }
47
+
48
+ export async function readDaemonStatusSnapshot(
49
+ options: ReadDaemonStatusOptions,
50
+ ): Promise<DaemonStatusReadSnapshot> {
51
+ const socketPath = await ensureDaemonReady({
52
+ ...(options.socketPath !== undefined ? { socketPath: options.socketPath } : {}),
53
+ spawnIfMissing: false,
54
+ });
55
+ const transport = new StreamableHTTPClientTransport(
56
+ new URL(`http://graft${MCP_PATH}`),
57
+ { fetch: createLocalSocketFetch(socketPath) },
58
+ );
59
+ const client = new Client({
60
+ name: "graft-cli-daemon-status",
61
+ version: GRAFT_VERSION,
62
+ });
63
+
64
+ await client.connect(transport as unknown as Parameters<Client["connect"]>[0]);
65
+ try {
66
+ const call = async <T>(
67
+ tool: string,
68
+ schema: z.ZodType<T>,
69
+ args: Record<string, unknown> = {},
70
+ ): Promise<T> => {
71
+ const result = await client.callTool({
72
+ name: tool,
73
+ arguments: args,
74
+ });
75
+ return parseToolBody(schema, result);
76
+ };
77
+
78
+ const [status, sessions, currentRepo, monitors, workspaceStatus, authorizations] = await Promise.all([
79
+ call("daemon_status", mcpOutputBodySchemas.daemon_status),
80
+ call("daemon_sessions", mcpOutputBodySchemas.daemon_sessions),
81
+ call("daemon_repos", mcpOutputBodySchemas.daemon_repos, { cwd: options.cwd }),
82
+ call("daemon_monitors", mcpOutputBodySchemas.daemon_monitors),
83
+ call("workspace_status", mcpOutputBodySchemas.workspace_status),
84
+ call("workspace_authorizations", mcpOutputBodySchemas.workspace_authorizations),
85
+ ]);
86
+
87
+ return {
88
+ status,
89
+ sessions,
90
+ currentRepo,
91
+ monitors,
92
+ workspaceStatus,
93
+ authorizations,
94
+ };
95
+ } finally {
96
+ await client.close().catch(() => {
97
+ return undefined;
98
+ });
99
+ }
100
+ }
@@ -0,0 +1,131 @@
1
+ export type GitGraftEnhanceSemverImpact = "major" | "minor" | "patch" | "none";
2
+
3
+ export interface GitGraftEnhanceDiffBucket {
4
+ readonly length: number;
5
+ }
6
+
7
+ export interface GitGraftEnhanceFileDiff {
8
+ readonly path: string;
9
+ readonly status: string;
10
+ readonly summary: string;
11
+ readonly diff: {
12
+ readonly added: GitGraftEnhanceDiffBucket;
13
+ readonly removed: GitGraftEnhanceDiffBucket;
14
+ readonly changed: GitGraftEnhanceDiffBucket;
15
+ readonly unchangedCount?: number | undefined;
16
+ };
17
+ }
18
+
19
+ export interface GitGraftEnhanceStructuralInput {
20
+ readonly base: string;
21
+ readonly head: string;
22
+ readonly summary: string;
23
+ readonly layer: string;
24
+ readonly files: readonly GitGraftEnhanceFileDiff[];
25
+ readonly refused?: readonly unknown[] | undefined;
26
+ }
27
+
28
+ export interface GitGraftEnhanceExportsInput {
29
+ readonly base: string;
30
+ readonly head: string;
31
+ readonly added: readonly unknown[];
32
+ readonly removed: readonly unknown[];
33
+ readonly changed: readonly unknown[];
34
+ readonly semverImpact: GitGraftEnhanceSemverImpact;
35
+ readonly summary: string;
36
+ }
37
+
38
+ export interface BuildGitGraftEnhanceModelInput {
39
+ readonly since: string;
40
+ readonly head: string;
41
+ readonly structural: GitGraftEnhanceStructuralInput;
42
+ readonly exports: GitGraftEnhanceExportsInput;
43
+ }
44
+
45
+ export interface GitGraftEnhanceTopFile {
46
+ readonly path: string;
47
+ readonly status: string;
48
+ readonly changeCount: number;
49
+ readonly summary: string;
50
+ }
51
+
52
+ export interface GitGraftEnhanceModel {
53
+ readonly range: {
54
+ readonly since: string;
55
+ readonly head: string;
56
+ };
57
+ readonly structural: {
58
+ readonly changedFiles: number;
59
+ readonly addedSymbols: number;
60
+ readonly removedSymbols: number;
61
+ readonly changedSymbols: number;
62
+ readonly topFilesByChangeCount: readonly GitGraftEnhanceTopFile[];
63
+ };
64
+ readonly exports: {
65
+ readonly changed: boolean;
66
+ readonly semverImpact: GitGraftEnhanceSemverImpact;
67
+ readonly addedExports: number;
68
+ readonly removedExports: number;
69
+ readonly changedExports: number;
70
+ };
71
+ readonly warnings: readonly string[];
72
+ }
73
+
74
+ function fileChangeCount(file: GitGraftEnhanceFileDiff): number {
75
+ return file.diff.added.length + file.diff.removed.length + file.diff.changed.length;
76
+ }
77
+
78
+ function topFiles(files: readonly GitGraftEnhanceFileDiff[]): readonly GitGraftEnhanceTopFile[] {
79
+ return [...files]
80
+ .map((file) => ({
81
+ path: file.path,
82
+ status: file.status,
83
+ changeCount: fileChangeCount(file),
84
+ summary: file.summary,
85
+ }))
86
+ .sort((a, b) => b.changeCount - a.changeCount || a.path.localeCompare(b.path))
87
+ .slice(0, 5);
88
+ }
89
+
90
+ function buildWarnings(input: BuildGitGraftEnhanceModelInput): readonly string[] {
91
+ const warnings: string[] = [];
92
+ if (input.structural.files.length === 0) {
93
+ warnings.push("No structural changes found for this range.");
94
+ }
95
+ const refusedCount = input.structural.refused?.length ?? 0;
96
+ if (refusedCount > 0) {
97
+ warnings.push(`${String(refusedCount)} structural files were refused by policy.`);
98
+ }
99
+ return warnings;
100
+ }
101
+
102
+ export function buildGitGraftEnhanceModel(input: BuildGitGraftEnhanceModelInput): GitGraftEnhanceModel {
103
+ const addedSymbols = input.structural.files.reduce((total, file) => total + file.diff.added.length, 0);
104
+ const removedSymbols = input.structural.files.reduce((total, file) => total + file.diff.removed.length, 0);
105
+ const changedSymbols = input.structural.files.reduce((total, file) => total + file.diff.changed.length, 0);
106
+ const addedExports = input.exports.added.length;
107
+ const removedExports = input.exports.removed.length;
108
+ const changedExports = input.exports.changed.length;
109
+
110
+ return {
111
+ range: {
112
+ since: input.since,
113
+ head: input.head,
114
+ },
115
+ structural: {
116
+ changedFiles: input.structural.files.length,
117
+ addedSymbols,
118
+ removedSymbols,
119
+ changedSymbols,
120
+ topFilesByChangeCount: topFiles(input.structural.files),
121
+ },
122
+ exports: {
123
+ changed: addedExports + removedExports + changedExports > 0,
124
+ semverImpact: input.exports.semverImpact,
125
+ addedExports,
126
+ removedExports,
127
+ changedExports,
128
+ },
129
+ warnings: buildWarnings(input),
130
+ };
131
+ }
@@ -0,0 +1,33 @@
1
+ import type { GitGraftEnhanceModel } from "./git-graft-enhance-model.js";
2
+
3
+ export function renderGitGraftEnhance(model: GitGraftEnhanceModel): string {
4
+ const lines = [
5
+ "Git Graft Enhance",
6
+ `range: ${model.range.since}..${model.range.head}`,
7
+ "",
8
+ "Structural",
9
+ `files: ${String(model.structural.changedFiles)}`,
10
+ `symbols: +${String(model.structural.addedSymbols)} -${String(model.structural.removedSymbols)} ~${String(model.structural.changedSymbols)}`,
11
+ "",
12
+ "Exports",
13
+ `exports: ${model.exports.changed ? "changed" : "unchanged"}`,
14
+ `semver impact: ${model.exports.semverImpact}`,
15
+ `export symbols: +${String(model.exports.addedExports)} -${String(model.exports.removedExports)} ~${String(model.exports.changedExports)}`,
16
+ ];
17
+
18
+ if (model.structural.topFilesByChangeCount.length > 0) {
19
+ lines.push("", "Top files");
20
+ for (const file of model.structural.topFilesByChangeCount) {
21
+ lines.push(`- ${file.path} (${file.status}, ${String(file.changeCount)}): ${file.summary}`);
22
+ }
23
+ }
24
+
25
+ if (model.warnings.length > 0) {
26
+ lines.push("", "warnings:");
27
+ for (const warning of model.warnings) {
28
+ lines.push(`- ${warning}`);
29
+ }
30
+ }
31
+
32
+ return lines.join("\n");
33
+ }
@@ -0,0 +1,54 @@
1
+ import { CanonicalJsonCodec } from "../adapters/canonical-json.js";
2
+ import { attachCliSchemaMeta, validateCliOutput } from "../contracts/output-schemas.js";
3
+ import type { JsonObject } from "../contracts/json-object.js";
4
+ import type { McpToolName } from "../contracts/capabilities.js";
5
+ import {
6
+ buildGitGraftEnhanceModel,
7
+ type GitGraftEnhanceExportsInput,
8
+ type GitGraftEnhanceStructuralInput,
9
+ } from "./git-graft-enhance-model.js";
10
+ import { renderGitGraftEnhance } from "./git-graft-enhance-render.js";
11
+ import { invokePeerCommand, type Writer } from "./peer-command.js";
12
+
13
+ const codec = new CanonicalJsonCodec();
14
+
15
+ export type GitGraftEnhancePeerInvoker = (
16
+ cwd: string,
17
+ tool: McpToolName,
18
+ args: JsonObject,
19
+ ) => Promise<JsonObject>;
20
+
21
+ export interface RunGitGraftEnhanceOptions {
22
+ readonly cwd: string;
23
+ readonly since: string;
24
+ readonly head?: string | undefined;
25
+ readonly json: boolean;
26
+ readonly stdout?: Writer | undefined;
27
+ readonly invokePeer?: GitGraftEnhancePeerInvoker | undefined;
28
+ }
29
+
30
+ function emitJson(model: ReturnType<typeof buildGitGraftEnhanceModel>, writer: Writer): void {
31
+ writer.write(`${codec.encode(validateCliOutput("git_graft_enhance", attachCliSchemaMeta("git_graft_enhance", model)))}\n`);
32
+ }
33
+
34
+ export async function runGitGraftEnhance(options: RunGitGraftEnhanceOptions): Promise<void> {
35
+ const stdout = options.stdout ?? process.stdout;
36
+ const head = options.head ?? "HEAD";
37
+ const invoke = options.invokePeer ?? invokePeerCommand;
38
+ const args = { base: options.since, head };
39
+ const structural = await invoke(options.cwd, "graft_since", args) as unknown as GitGraftEnhanceStructuralInput;
40
+ const exports = await invoke(options.cwd, "graft_exports", args) as unknown as GitGraftEnhanceExportsInput;
41
+ const model = buildGitGraftEnhanceModel({
42
+ since: options.since,
43
+ head,
44
+ structural,
45
+ exports,
46
+ });
47
+
48
+ if (options.json) {
49
+ emitJson(model, stdout);
50
+ return;
51
+ }
52
+
53
+ stdout.write(`${renderGitGraftEnhance(model)}\n`);
54
+ }
@@ -1,7 +1,8 @@
1
1
  import { CanonicalJsonCodec } from "../adapters/canonical-json.js";
2
2
  import { nodeGit } from "../adapters/node-git.js";
3
+ import { nodePathOps } from "../adapters/node-paths.js";
3
4
  import { attachCliSchemaMeta, validateCliOutput } from "../contracts/output-schemas.js";
4
- import { indexCommits } from "../warp/indexer.js";
5
+ import { indexHead } from "../warp/index-head.js";
5
6
  import { openWarp } from "../warp/open.js";
6
7
  import { writeCliError } from "./cli-error.js";
7
8
  import {
@@ -39,33 +40,31 @@ export async function runIndex(options: RunIndexOptions = {}): Promise<void> {
39
40
  const stderr = options.stderr ?? process.stderr;
40
41
 
41
42
  try {
42
- const { json, from } = parseIndexCommandArgs(args);
43
- const warp = await openWarp({ cwd });
44
- const result = await indexCommits(warp, {
43
+ const { json, paths } = parseIndexCommandArgs(args);
44
+ const app = await openWarp({ cwd });
45
+ const ctx = { app, strandId: null };
46
+ const result = await indexHead({
45
47
  cwd,
46
48
  git: nodeGit,
47
- ...(from !== null ? { from } : {}),
49
+ pathOps: nodePathOps,
50
+ ctx,
51
+ ...(paths.length > 0 ? { paths } : {}),
48
52
  });
49
53
 
50
- if (!result.ok) {
51
- throw new Error(result.error);
52
- }
53
-
54
54
  if (json) {
55
55
  emitIndexJson(buildIndexCliSuccess({
56
56
  cwd,
57
- from,
58
- commitsIndexed: result.commitsIndexed,
59
- patchesWritten: result.patchesWritten,
57
+ filesIndexed: result.filesIndexed,
58
+ nodesEmitted: result.nodesEmitted,
60
59
  }), stdout);
61
60
  return;
62
61
  }
63
62
 
64
63
  writeLine(stdout);
65
- writeLine(stdout, `Indexing structural history in ${cwd}`);
64
+ writeLine(stdout, `Indexing HEAD in ${cwd}`);
66
65
  writeLine(stdout);
67
- writeLine(stdout, ` commits indexed: ${String(result.commitsIndexed)}`);
68
- writeLine(stdout, ` patches written: ${String(result.patchesWritten)}`);
66
+ writeLine(stdout, ` files indexed: ${String(result.filesIndexed)}`);
67
+ writeLine(stdout, ` nodes emitted: ${String(result.nodesEmitted)}`);
69
68
  writeLine(stdout);
70
69
  writeLine(stdout, "Done.");
71
70
  writeLine(stdout);
@@ -76,19 +75,16 @@ export async function runIndex(options: RunIndexOptions = {}): Promise<void> {
76
75
  try {
77
76
  return parseIndexCommandArgs(args);
78
77
  } catch {
79
- return {
80
- json: args.includes("--json"),
81
- from: args.find((arg) => arg !== "--json" && !arg.startsWith("--")) ?? null,
82
- };
78
+ return { json: args.includes("--json") };
83
79
  }
84
80
  })();
85
81
  if (parsed.json) {
86
- emitIndexJson(buildIndexCliFailure({ cwd, from: parsed.from, error: message }), stdout);
82
+ emitIndexJson(buildIndexCliFailure({ cwd, error: message }), stdout);
87
83
  return;
88
84
  }
89
85
  writeCliError(stderr, message, {
90
- usage: "graft index [<from-ref>] [--json]",
91
- nextSteps: ["Use `--json` if you want a machine-readable indexing report."],
86
+ usage: "graft index [--path <path>] [--json]",
87
+ nextSteps: ["Use `--path <path>` for lazy per-file indexing and `--json` for machine-readable output."],
92
88
  });
93
89
  }
94
90
  }
@@ -2,7 +2,7 @@ import { z } from "zod";
2
2
 
3
3
  const indexCommandArgsSchema = z.object({
4
4
  json: z.boolean(),
5
- from: z.string().nullable(),
5
+ paths: z.array(z.string()),
6
6
  });
7
7
 
8
8
  export type IndexCommandArgs = z.infer<typeof indexCommandArgsSchema>;
@@ -10,15 +10,13 @@ export type IndexCommandArgs = z.infer<typeof indexCommandArgsSchema>;
10
10
  const indexSuccessSchema = z.object({
11
11
  ok: z.literal(true),
12
12
  cwd: z.string(),
13
- from: z.string().nullable(),
14
- commitsIndexed: z.number().int().nonnegative(),
15
- patchesWritten: z.number().int().nonnegative(),
13
+ filesIndexed: z.number().int().nonnegative(),
14
+ nodesEmitted: z.number().int().nonnegative(),
16
15
  });
17
16
 
18
17
  const indexFailureSchema = z.object({
19
18
  ok: z.literal(false),
20
19
  cwd: z.string(),
21
- from: z.string().nullable(),
22
20
  error: z.string(),
23
21
  });
24
22
 
@@ -28,49 +26,50 @@ export type IndexCliResult = z.infer<typeof indexCliResultSchema>;
28
26
 
29
27
  export function parseIndexCommandArgs(args: readonly string[]): IndexCommandArgs {
30
28
  let json = false;
31
- let from: string | null = null;
29
+ const paths: string[] = [];
32
30
 
33
- for (const arg of args) {
31
+ for (let index = 0; index < args.length; index++) {
32
+ const arg = args[index];
33
+ if (arg === undefined) continue;
34
34
  if (arg === "--json") {
35
35
  json = true;
36
36
  continue;
37
37
  }
38
- if (arg.startsWith("--")) {
39
- throw new Error(`Unknown index arguments: ${arg}`);
40
- }
41
- if (from !== null) {
42
- throw new Error(`Unknown index arguments: ${arg}`);
38
+ if (arg === "--path") {
39
+ const value = args[index + 1];
40
+ if (value === undefined) {
41
+ throw new Error("Missing value for --path");
42
+ }
43
+ paths.push(value);
44
+ index++;
45
+ continue;
43
46
  }
44
- from = arg;
47
+ throw new Error(`Unknown index arguments: ${arg}`);
45
48
  }
46
49
 
47
- return indexCommandArgsSchema.parse({ json, from });
50
+ return indexCommandArgsSchema.parse({ json, paths });
48
51
  }
49
52
 
50
53
  export function buildIndexCliSuccess(input: {
51
54
  readonly cwd: string;
52
- readonly from: string | null;
53
- readonly commitsIndexed: number;
54
- readonly patchesWritten: number;
55
+ readonly filesIndexed: number;
56
+ readonly nodesEmitted: number;
55
57
  }): IndexCliResult {
56
58
  return indexSuccessSchema.parse({
57
59
  ok: true,
58
60
  cwd: input.cwd,
59
- from: input.from,
60
- commitsIndexed: input.commitsIndexed,
61
- patchesWritten: input.patchesWritten,
61
+ filesIndexed: input.filesIndexed,
62
+ nodesEmitted: input.nodesEmitted,
62
63
  });
63
64
  }
64
65
 
65
66
  export function buildIndexCliFailure(input: {
66
67
  readonly cwd: string;
67
- readonly from: string | null;
68
68
  readonly error: string;
69
69
  }): IndexCliResult {
70
70
  return indexFailureSchema.parse({
71
71
  ok: false,
72
72
  cwd: input.cwd,
73
- from: input.from,
74
73
  error: input.error,
75
74
  });
76
75
  }