@flyingrobots/graft 0.6.0 → 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 (563) hide show
  1. package/ADVANCED_GUIDE.md +52 -0
  2. package/CHANGELOG.md +142 -0
  3. package/GUIDE.md +53 -0
  4. package/README.md +1 -1
  5. package/dist/adapters/json-text-decoder.d.ts +3 -0
  6. package/dist/adapters/json-text-decoder.d.ts.map +1 -0
  7. package/dist/adapters/json-text-decoder.js +12 -0
  8. package/dist/adapters/json-text-decoder.js.map +1 -0
  9. package/dist/adapters/node-paths.d.ts +3 -0
  10. package/dist/adapters/node-paths.d.ts.map +1 -0
  11. package/dist/adapters/node-paths.js +29 -0
  12. package/dist/adapters/node-paths.js.map +1 -0
  13. package/dist/adapters/repo-paths.d.ts.map +1 -1
  14. package/dist/adapters/repo-paths.js +40 -5
  15. package/dist/adapters/repo-paths.js.map +1 -1
  16. package/dist/api/tool-bridge.d.ts +1 -1
  17. package/dist/api/tool-bridge.d.ts.map +1 -1
  18. package/dist/api/tool-bridge.js +1 -1
  19. package/dist/api/tool-bridge.js.map +1 -1
  20. package/dist/cli/cli-error.d.ts.map +1 -1
  21. package/dist/cli/cli-error.js +47 -10
  22. package/dist/cli/cli-error.js.map +1 -1
  23. package/dist/cli/command-parser.d.ts +12 -3
  24. package/dist/cli/command-parser.d.ts.map +1 -1
  25. package/dist/cli/command-parser.js +161 -2
  26. package/dist/cli/command-parser.js.map +1 -1
  27. package/dist/cli/daemon-status-model.d.ts +87 -0
  28. package/dist/cli/daemon-status-model.d.ts.map +1 -0
  29. package/dist/cli/daemon-status-model.js +142 -0
  30. package/dist/cli/daemon-status-model.js.map +1 -0
  31. package/dist/cli/daemon-status-render.d.ts +3 -0
  32. package/dist/cli/daemon-status-render.d.ts.map +1 -0
  33. package/dist/cli/daemon-status-render.js +100 -0
  34. package/dist/cli/daemon-status-render.js.map +1 -0
  35. package/dist/cli/daemon-status.d.ts +7 -0
  36. package/dist/cli/daemon-status.d.ts.map +1 -0
  37. package/dist/cli/daemon-status.js +79 -0
  38. package/dist/cli/daemon-status.js.map +1 -0
  39. package/dist/cli/git-graft-enhance-model.d.ts +67 -0
  40. package/dist/cli/git-graft-enhance-model.d.ts.map +1 -0
  41. package/dist/cli/git-graft-enhance-model.js +55 -0
  42. package/dist/cli/git-graft-enhance-model.js.map +1 -0
  43. package/dist/cli/git-graft-enhance-render.d.ts +3 -0
  44. package/dist/cli/git-graft-enhance-render.d.ts.map +1 -0
  45. package/dist/cli/git-graft-enhance-render.js +29 -0
  46. package/dist/cli/git-graft-enhance-render.js.map +1 -0
  47. package/dist/cli/git-graft-enhance.d.ts +14 -0
  48. package/dist/cli/git-graft-enhance.d.ts.map +1 -0
  49. package/dist/cli/git-graft-enhance.js +29 -0
  50. package/dist/cli/git-graft-enhance.js.map +1 -0
  51. package/dist/cli/index-cmd.d.ts.map +1 -1
  52. package/dist/cli/index-cmd.js +18 -21
  53. package/dist/cli/index-cmd.js.map +1 -1
  54. package/dist/cli/index-model.d.ts +5 -9
  55. package/dist/cli/index-model.d.ts.map +1 -1
  56. package/dist/cli/index-model.js +20 -18
  57. package/dist/cli/index-model.js.map +1 -1
  58. package/dist/cli/init-client-config.d.ts +12 -7
  59. package/dist/cli/init-client-config.d.ts.map +1 -1
  60. package/dist/cli/init-client-config.js +105 -43
  61. package/dist/cli/init-client-config.js.map +1 -1
  62. package/dist/cli/init-model.d.ts +9 -2
  63. package/dist/cli/init-model.d.ts.map +1 -1
  64. package/dist/cli/init-model.js +52 -4
  65. package/dist/cli/init-model.js.map +1 -1
  66. package/dist/cli/init-render.d.ts.map +1 -1
  67. package/dist/cli/init-render.js +2 -2
  68. package/dist/cli/init-render.js.map +1 -1
  69. package/dist/cli/init.d.ts.map +1 -1
  70. package/dist/cli/init.js +11 -9
  71. package/dist/cli/init.js.map +1 -1
  72. package/dist/cli/json-document.d.ts +5 -0
  73. package/dist/cli/json-document.d.ts.map +1 -1
  74. package/dist/cli/json-document.js +9 -0
  75. package/dist/cli/json-document.js.map +1 -1
  76. package/dist/cli/main.d.ts +7 -0
  77. package/dist/cli/main.d.ts.map +1 -1
  78. package/dist/cli/main.js +49 -7
  79. package/dist/cli/main.js.map +1 -1
  80. package/dist/cli/migrate-local-history.d.ts.map +1 -1
  81. package/dist/cli/migrate-local-history.js +3 -2
  82. package/dist/cli/migrate-local-history.js.map +1 -1
  83. package/dist/cli/peer-command.d.ts +1 -1
  84. package/dist/cli/peer-command.d.ts.map +1 -1
  85. package/dist/cli/peer-command.js +1 -1
  86. package/dist/cli/peer-command.js.map +1 -1
  87. package/dist/contracts/capabilities.d.ts +5 -5
  88. package/dist/contracts/capabilities.d.ts.map +1 -1
  89. package/dist/contracts/capabilities.js +89 -0
  90. package/dist/contracts/capabilities.js.map +1 -1
  91. package/dist/contracts/causal-ontology.d.ts +17 -17
  92. package/dist/contracts/json-object.d.ts +0 -1
  93. package/dist/contracts/json-object.d.ts.map +1 -1
  94. package/dist/contracts/json-object.js +0 -10
  95. package/dist/contracts/json-object.js.map +1 -1
  96. package/dist/contracts/output-schema-cli.d.ts +277 -25
  97. package/dist/contracts/output-schema-cli.d.ts.map +1 -1
  98. package/dist/contracts/output-schema-cli.js +35 -3
  99. package/dist/contracts/output-schema-cli.js.map +1 -1
  100. package/dist/contracts/output-schema-fragments.d.ts +212 -87
  101. package/dist/contracts/output-schema-fragments.d.ts.map +1 -1
  102. package/dist/contracts/output-schema-fragments.js +49 -2
  103. package/dist/contracts/output-schema-fragments.js.map +1 -1
  104. package/dist/contracts/output-schema-mcp.d.ts +372 -47
  105. package/dist/contracts/output-schema-mcp.d.ts.map +1 -1
  106. package/dist/contracts/output-schema-mcp.js +217 -1
  107. package/dist/contracts/output-schema-mcp.js.map +1 -1
  108. package/dist/contracts/output-schema-meta.d.ts +2 -2
  109. package/dist/contracts/output-schema-meta.d.ts.map +1 -1
  110. package/dist/contracts/output-schemas.d.ts +7 -7
  111. package/dist/contracts/output-schemas.d.ts.map +1 -1
  112. package/dist/contracts/output-schemas.js +294 -6
  113. package/dist/contracts/output-schemas.js.map +1 -1
  114. package/dist/git/diff.d.ts +11 -0
  115. package/dist/git/diff.d.ts.map +1 -1
  116. package/dist/git/diff.js +50 -6
  117. package/dist/git/diff.js.map +1 -1
  118. package/dist/mcp/burden.d.ts.map +1 -1
  119. package/dist/mcp/burden.js +9 -0
  120. package/dist/mcp/burden.js.map +1 -1
  121. package/dist/mcp/context.d.ts +3 -2
  122. package/dist/mcp/context.d.ts.map +1 -1
  123. package/dist/mcp/context.js +2 -37
  124. package/dist/mcp/context.js.map +1 -1
  125. package/dist/mcp/daemon-server.d.ts +2 -0
  126. package/dist/mcp/daemon-server.d.ts.map +1 -1
  127. package/dist/mcp/daemon-server.js +6 -1
  128. package/dist/mcp/daemon-server.js.map +1 -1
  129. package/dist/mcp/daemon-session-host.d.ts +1 -0
  130. package/dist/mcp/daemon-session-host.d.ts.map +1 -1
  131. package/dist/mcp/daemon-session-host.js +3 -0
  132. package/dist/mcp/daemon-session-host.js.map +1 -1
  133. package/dist/mcp/daemon-stdio-bridge.d.ts +1 -0
  134. package/dist/mcp/daemon-stdio-bridge.d.ts.map +1 -1
  135. package/dist/mcp/daemon-stdio-bridge.js +1 -0
  136. package/dist/mcp/daemon-stdio-bridge.js.map +1 -1
  137. package/dist/mcp/monitor-tick-job.d.ts +1 -0
  138. package/dist/mcp/monitor-tick-job.d.ts.map +1 -1
  139. package/dist/mcp/monitor-tick-job.js +84 -29
  140. package/dist/mcp/monitor-tick-job.js.map +1 -1
  141. package/dist/mcp/monitor-types.d.ts +1 -1
  142. package/dist/mcp/monitor-types.d.ts.map +1 -1
  143. package/dist/mcp/persisted-local-history-graph.d.ts +2 -2
  144. package/dist/mcp/persisted-local-history-graph.d.ts.map +1 -1
  145. package/dist/mcp/persisted-local-history-graph.js +3 -2
  146. package/dist/mcp/persisted-local-history-graph.js.map +1 -1
  147. package/dist/mcp/persisted-local-history.d.ts +5 -5
  148. package/dist/mcp/persisted-local-history.js +2 -2
  149. package/dist/mcp/persisted-local-history.js.map +1 -1
  150. package/dist/mcp/persistent-monitor-runtime.d.ts +1 -0
  151. package/dist/mcp/persistent-monitor-runtime.d.ts.map +1 -1
  152. package/dist/mcp/persistent-monitor-runtime.js +35 -0
  153. package/dist/mcp/persistent-monitor-runtime.js.map +1 -1
  154. package/dist/mcp/repo-tool-worker-context.d.ts.map +1 -1
  155. package/dist/mcp/repo-tool-worker-context.js +5 -2
  156. package/dist/mcp/repo-tool-worker-context.js.map +1 -1
  157. package/dist/mcp/server-context.d.ts.map +1 -1
  158. package/dist/mcp/server-context.js +13 -0
  159. package/dist/mcp/server-context.js.map +1 -1
  160. package/dist/mcp/server-tool-access.d.ts +1 -1
  161. package/dist/mcp/server-tool-access.d.ts.map +1 -1
  162. package/dist/mcp/server-tool-access.js +3 -1
  163. package/dist/mcp/server-tool-access.js.map +1 -1
  164. package/dist/mcp/server.d.ts +3 -0
  165. package/dist/mcp/server.d.ts.map +1 -1
  166. package/dist/mcp/server.js +5 -3
  167. package/dist/mcp/server.js.map +1 -1
  168. package/dist/mcp/tool-registry.d.ts.map +1 -1
  169. package/dist/mcp/tool-registry.js +18 -0
  170. package/dist/mcp/tool-registry.js.map +1 -1
  171. package/dist/mcp/tools/code-find.d.ts.map +1 -1
  172. package/dist/mcp/tools/code-find.js +20 -0
  173. package/dist/mcp/tools/code-find.js.map +1 -1
  174. package/dist/mcp/tools/code-show.d.ts.map +1 -1
  175. package/dist/mcp/tools/code-show.js +24 -0
  176. package/dist/mcp/tools/code-show.js.map +1 -1
  177. package/dist/mcp/tools/diagnostic-models.d.ts +2 -0
  178. package/dist/mcp/tools/diagnostic-models.d.ts.map +1 -1
  179. package/dist/mcp/tools/doctor.d.ts.map +1 -1
  180. package/dist/mcp/tools/doctor.js +18 -1
  181. package/dist/mcp/tools/doctor.js.map +1 -1
  182. package/dist/mcp/tools/export-surface-diff.d.ts +3 -0
  183. package/dist/mcp/tools/export-surface-diff.d.ts.map +1 -0
  184. package/dist/mcp/tools/export-surface-diff.js +24 -0
  185. package/dist/mcp/tools/export-surface-diff.js.map +1 -0
  186. package/dist/mcp/tools/file-outline.js +1 -1
  187. package/dist/mcp/tools/file-outline.js.map +1 -1
  188. package/dist/mcp/tools/graft-edit.d.ts +3 -0
  189. package/dist/mcp/tools/graft-edit.d.ts.map +1 -0
  190. package/dist/mcp/tools/graft-edit.js +192 -0
  191. package/dist/mcp/tools/graft-edit.js.map +1 -0
  192. package/dist/mcp/tools/knowledge-map.d.ts +3 -0
  193. package/dist/mcp/tools/knowledge-map.d.ts.map +1 -0
  194. package/dist/mcp/tools/knowledge-map.js +31 -0
  195. package/dist/mcp/tools/knowledge-map.js.map +1 -0
  196. package/dist/mcp/tools/monitor-nudge.d.ts +3 -0
  197. package/dist/mcp/tools/monitor-nudge.d.ts.map +1 -0
  198. package/dist/mcp/tools/monitor-nudge.js +17 -0
  199. package/dist/mcp/tools/monitor-nudge.js.map +1 -0
  200. package/dist/mcp/tools/precision-warp.d.ts +3 -3
  201. package/dist/mcp/tools/precision-warp.d.ts.map +1 -1
  202. package/dist/mcp/tools/precision-warp.js +24 -15
  203. package/dist/mcp/tools/precision-warp.js.map +1 -1
  204. package/dist/mcp/tools/refactor-difficulty.d.ts +3 -0
  205. package/dist/mcp/tools/refactor-difficulty.d.ts.map +1 -0
  206. package/dist/mcp/tools/refactor-difficulty.js +36 -0
  207. package/dist/mcp/tools/refactor-difficulty.js.map +1 -0
  208. package/dist/mcp/tools/safe-read.js +2 -2
  209. package/dist/mcp/tools/safe-read.js.map +1 -1
  210. package/dist/mcp/tools/structural-blame.d.ts +3 -0
  211. package/dist/mcp/tools/structural-blame.d.ts.map +1 -0
  212. package/dist/mcp/tools/structural-blame.js +44 -0
  213. package/dist/mcp/tools/structural-blame.js.map +1 -0
  214. package/dist/mcp/tools/structural-churn.d.ts +3 -0
  215. package/dist/mcp/tools/structural-churn.d.ts.map +1 -0
  216. package/dist/mcp/tools/structural-churn.js +28 -0
  217. package/dist/mcp/tools/structural-churn.js.map +1 -0
  218. package/dist/mcp/tools/structural-log.d.ts +3 -0
  219. package/dist/mcp/tools/structural-log.d.ts.map +1 -0
  220. package/dist/mcp/tools/structural-log.js +38 -0
  221. package/dist/mcp/tools/structural-log.js.map +1 -0
  222. package/dist/mcp/tools/structural-review.d.ts +3 -0
  223. package/dist/mcp/tools/structural-review.d.ts.map +1 -0
  224. package/dist/mcp/tools/structural-review.js +55 -0
  225. package/dist/mcp/tools/structural-review.js.map +1 -0
  226. package/dist/mcp/warp-pool.d.ts +4 -4
  227. package/dist/mcp/warp-pool.d.ts.map +1 -1
  228. package/dist/mcp/warp-pool.js.map +1 -1
  229. package/dist/mcp/workspace-router-model.d.ts +2 -2
  230. package/dist/mcp/workspace-router-model.d.ts.map +1 -1
  231. package/dist/mcp/workspace-router-runtime.d.ts +3 -3
  232. package/dist/mcp/workspace-router-runtime.d.ts.map +1 -1
  233. package/dist/mcp/workspace-router-runtime.js +4 -1
  234. package/dist/mcp/workspace-router-runtime.js.map +1 -1
  235. package/dist/mcp/workspace-router.d.ts +3 -2
  236. package/dist/mcp/workspace-router.d.ts.map +1 -1
  237. package/dist/mcp/workspace-router.js +6 -0
  238. package/dist/mcp/workspace-router.js.map +1 -1
  239. package/dist/operations/adaptive-projection.d.ts +22 -0
  240. package/dist/operations/adaptive-projection.d.ts.map +1 -0
  241. package/dist/operations/adaptive-projection.js +36 -0
  242. package/dist/operations/adaptive-projection.js.map +1 -0
  243. package/dist/operations/agent-handoff.d.ts +25 -0
  244. package/dist/operations/agent-handoff.d.ts.map +1 -0
  245. package/dist/operations/agent-handoff.js +36 -0
  246. package/dist/operations/agent-handoff.js.map +1 -0
  247. package/dist/operations/capture-range.d.ts +33 -0
  248. package/dist/operations/capture-range.d.ts.map +1 -0
  249. package/dist/operations/capture-range.js +45 -0
  250. package/dist/operations/capture-range.js.map +1 -0
  251. package/dist/operations/conversation-primer.d.ts +27 -0
  252. package/dist/operations/conversation-primer.d.ts.map +1 -0
  253. package/dist/operations/conversation-primer.js +52 -0
  254. package/dist/operations/conversation-primer.js.map +1 -0
  255. package/dist/operations/cross-session-resume.d.ts +28 -0
  256. package/dist/operations/cross-session-resume.d.ts.map +1 -0
  257. package/dist/operations/cross-session-resume.js +79 -0
  258. package/dist/operations/cross-session-resume.js.map +1 -0
  259. package/dist/operations/deterministic-replay.d.ts +39 -0
  260. package/dist/operations/deterministic-replay.d.ts.map +1 -0
  261. package/dist/operations/deterministic-replay.js +90 -0
  262. package/dist/operations/deterministic-replay.js.map +1 -0
  263. package/dist/operations/export-surface-diff.d.ts +36 -0
  264. package/dist/operations/export-surface-diff.d.ts.map +1 -0
  265. package/dist/operations/export-surface-diff.js +298 -0
  266. package/dist/operations/export-surface-diff.js.map +1 -0
  267. package/dist/operations/footprint-parallelism.d.ts +25 -0
  268. package/dist/operations/footprint-parallelism.d.ts.map +1 -0
  269. package/dist/operations/footprint-parallelism.js +79 -0
  270. package/dist/operations/footprint-parallelism.js.map +1 -0
  271. package/dist/operations/graft-diff.d.ts.map +1 -1
  272. package/dist/operations/graft-diff.js +14 -7
  273. package/dist/operations/graft-diff.js.map +1 -1
  274. package/dist/operations/horizon-of-readability.d.ts +23 -0
  275. package/dist/operations/horizon-of-readability.d.ts.map +1 -0
  276. package/dist/operations/horizon-of-readability.js +39 -0
  277. package/dist/operations/horizon-of-readability.js.map +1 -0
  278. package/dist/operations/import-reference-impact.d.ts +13 -0
  279. package/dist/operations/import-reference-impact.d.ts.map +1 -0
  280. package/dist/operations/import-reference-impact.js +101 -0
  281. package/dist/operations/import-reference-impact.js.map +1 -0
  282. package/dist/operations/knowledge-map.d.ts +30 -0
  283. package/dist/operations/knowledge-map.d.ts.map +1 -0
  284. package/dist/operations/knowledge-map.js +64 -0
  285. package/dist/operations/knowledge-map.js.map +1 -0
  286. package/dist/operations/observation-cache.d.ts +8 -2
  287. package/dist/operations/observation-cache.d.ts.map +1 -1
  288. package/dist/operations/observation-cache.js +17 -5
  289. package/dist/operations/observation-cache.js.map +1 -1
  290. package/dist/operations/projection-safety.d.ts +31 -0
  291. package/dist/operations/projection-safety.d.ts.map +1 -0
  292. package/dist/operations/projection-safety.js +77 -0
  293. package/dist/operations/projection-safety.js.map +1 -0
  294. package/dist/operations/repo-workspace.js +3 -3
  295. package/dist/operations/repo-workspace.js.map +1 -1
  296. package/dist/operations/semantic-drift.d.ts +27 -0
  297. package/dist/operations/semantic-drift.d.ts.map +1 -0
  298. package/dist/operations/semantic-drift.js +46 -0
  299. package/dist/operations/semantic-drift.js.map +1 -0
  300. package/dist/operations/session-filtration.d.ts +36 -0
  301. package/dist/operations/session-filtration.d.ts.map +1 -0
  302. package/dist/operations/session-filtration.js +48 -0
  303. package/dist/operations/session-filtration.js.map +1 -0
  304. package/dist/operations/session-replay.d.ts +17 -0
  305. package/dist/operations/session-replay.d.ts.map +1 -0
  306. package/dist/operations/session-replay.js +59 -0
  307. package/dist/operations/session-replay.js.map +1 -0
  308. package/dist/operations/sludge-detector.d.ts +45 -0
  309. package/dist/operations/sludge-detector.d.ts.map +1 -0
  310. package/dist/operations/sludge-detector.js +278 -0
  311. package/dist/operations/sludge-detector.js.map +1 -0
  312. package/dist/operations/structural-blame.d.ts +67 -0
  313. package/dist/operations/structural-blame.d.ts.map +1 -0
  314. package/dist/operations/structural-blame.js +111 -0
  315. package/dist/operations/structural-blame.js.map +1 -0
  316. package/dist/operations/structural-review.d.ts +47 -0
  317. package/dist/operations/structural-review.d.ts.map +1 -0
  318. package/dist/operations/structural-review.js +225 -0
  319. package/dist/operations/structural-review.js.map +1 -0
  320. package/dist/operations/teaching-hints.d.ts +18 -0
  321. package/dist/operations/teaching-hints.d.ts.map +1 -0
  322. package/dist/operations/teaching-hints.js +35 -0
  323. package/dist/operations/teaching-hints.js.map +1 -0
  324. package/dist/parser/diff.d.ts +2 -0
  325. package/dist/parser/diff.d.ts.map +1 -1
  326. package/dist/parser/diff.js +7 -0
  327. package/dist/parser/diff.js.map +1 -1
  328. package/dist/ports/paths.d.ts +17 -0
  329. package/dist/ports/paths.d.ts.map +1 -0
  330. package/dist/ports/{warp.js → paths.js} +2 -2
  331. package/dist/ports/paths.js.map +1 -0
  332. package/dist/warp/ast-emitter.d.ts +28 -0
  333. package/dist/warp/ast-emitter.d.ts.map +1 -0
  334. package/dist/warp/ast-emitter.js +90 -0
  335. package/dist/warp/ast-emitter.js.map +1 -0
  336. package/dist/warp/ast-import-resolver.d.ts +13 -0
  337. package/dist/warp/ast-import-resolver.d.ts.map +1 -0
  338. package/dist/warp/ast-import-resolver.js +259 -0
  339. package/dist/warp/ast-import-resolver.js.map +1 -0
  340. package/dist/warp/commit-meta.d.ts +8 -0
  341. package/dist/warp/commit-meta.d.ts.map +1 -0
  342. package/dist/warp/commit-meta.js +13 -0
  343. package/dist/warp/commit-meta.js.map +1 -0
  344. package/dist/warp/context.d.ts +10 -0
  345. package/dist/warp/context.d.ts.map +1 -0
  346. package/dist/warp/context.js +26 -0
  347. package/dist/warp/context.js.map +1 -0
  348. package/dist/warp/dead-symbols.d.ts +40 -0
  349. package/dist/warp/dead-symbols.d.ts.map +1 -0
  350. package/dist/warp/dead-symbols.js +127 -0
  351. package/dist/warp/dead-symbols.js.map +1 -0
  352. package/dist/warp/drift-sentinel.d.ts +30 -0
  353. package/dist/warp/drift-sentinel.d.ts.map +1 -0
  354. package/dist/warp/drift-sentinel.js +65 -0
  355. package/dist/warp/drift-sentinel.js.map +1 -0
  356. package/dist/warp/index-head.d.ts +32 -0
  357. package/dist/warp/index-head.d.ts.map +1 -0
  358. package/dist/warp/index-head.js +245 -0
  359. package/dist/warp/index-head.js.map +1 -0
  360. package/dist/warp/observers.d.ts +6 -6
  361. package/dist/warp/observers.d.ts.map +1 -1
  362. package/dist/warp/observers.js +5 -4
  363. package/dist/warp/observers.js.map +1 -1
  364. package/dist/warp/open.d.ts +5 -4
  365. package/dist/warp/open.d.ts.map +1 -1
  366. package/dist/warp/open.js +24 -49
  367. package/dist/warp/open.js.map +1 -1
  368. package/dist/warp/outline-diff-trailer.d.ts +26 -0
  369. package/dist/warp/outline-diff-trailer.d.ts.map +1 -0
  370. package/dist/warp/outline-diff-trailer.js +68 -0
  371. package/dist/warp/outline-diff-trailer.js.map +1 -0
  372. package/dist/warp/refactor-difficulty.d.ts +38 -0
  373. package/dist/warp/refactor-difficulty.d.ts.map +1 -0
  374. package/dist/warp/refactor-difficulty.js +169 -0
  375. package/dist/warp/refactor-difficulty.js.map +1 -0
  376. package/dist/warp/references.d.ts +22 -0
  377. package/dist/warp/references.d.ts.map +1 -0
  378. package/dist/warp/references.js +57 -0
  379. package/dist/warp/references.js.map +1 -0
  380. package/dist/warp/stale-docs.d.ts +56 -0
  381. package/dist/warp/stale-docs.d.ts.map +1 -0
  382. package/dist/warp/stale-docs.js +149 -0
  383. package/dist/warp/stale-docs.js.map +1 -0
  384. package/dist/warp/structural-drift-detection.d.ts +49 -0
  385. package/dist/warp/structural-drift-detection.d.ts.map +1 -0
  386. package/dist/warp/structural-drift-detection.js +51 -0
  387. package/dist/warp/structural-drift-detection.js.map +1 -0
  388. package/dist/warp/structural-queries.d.ts +49 -0
  389. package/dist/warp/structural-queries.d.ts.map +1 -0
  390. package/dist/warp/structural-queries.js +175 -0
  391. package/dist/warp/structural-queries.js.map +1 -0
  392. package/dist/warp/symbol-timeline.d.ts +34 -0
  393. package/dist/warp/symbol-timeline.d.ts.map +1 -0
  394. package/dist/warp/symbol-timeline.js +127 -0
  395. package/dist/warp/symbol-timeline.js.map +1 -0
  396. package/dist/warp/traverse-hydrate.d.ts +23 -0
  397. package/dist/warp/traverse-hydrate.d.ts.map +1 -0
  398. package/dist/warp/traverse-hydrate.js +39 -0
  399. package/dist/warp/traverse-hydrate.js.map +1 -0
  400. package/dist/warp/warp-reference-count.d.ts +19 -0
  401. package/dist/warp/warp-reference-count.d.ts.map +1 -0
  402. package/dist/warp/warp-reference-count.js +32 -0
  403. package/dist/warp/warp-reference-count.js.map +1 -0
  404. package/dist/warp/warp-structural-blame.d.ts +20 -0
  405. package/dist/warp/warp-structural-blame.d.ts.map +1 -0
  406. package/dist/warp/warp-structural-blame.js +43 -0
  407. package/dist/warp/warp-structural-blame.js.map +1 -0
  408. package/dist/warp/warp-structural-churn.d.ts +30 -0
  409. package/dist/warp/warp-structural-churn.d.ts.map +1 -0
  410. package/dist/warp/warp-structural-churn.js +213 -0
  411. package/dist/warp/warp-structural-churn.js.map +1 -0
  412. package/dist/warp/warp-structural-log.d.ts +35 -0
  413. package/dist/warp/warp-structural-log.d.ts.map +1 -0
  414. package/dist/warp/warp-structural-log.js +104 -0
  415. package/dist/warp/warp-structural-log.js.map +1 -0
  416. package/docs/CLI.md +68 -4
  417. package/docs/MCP.md +23 -0
  418. package/docs/SETUP.md +779 -0
  419. package/package.json +10 -7
  420. package/src/adapters/json-text-decoder.ts +11 -0
  421. package/src/adapters/node-paths.ts +35 -0
  422. package/src/adapters/repo-paths.ts +45 -4
  423. package/src/api/tool-bridge.ts +2 -1
  424. package/src/cli/cli-error.ts +49 -10
  425. package/src/cli/command-parser.ts +185 -3
  426. package/src/cli/daemon-status-model.ts +238 -0
  427. package/src/cli/daemon-status-render.ts +102 -0
  428. package/src/cli/daemon-status.ts +100 -0
  429. package/src/cli/git-graft-enhance-model.ts +131 -0
  430. package/src/cli/git-graft-enhance-render.ts +33 -0
  431. package/src/cli/git-graft-enhance.ts +54 -0
  432. package/src/cli/index-cmd.ts +18 -22
  433. package/src/cli/index-model.ts +21 -22
  434. package/src/cli/init-client-config.ts +167 -38
  435. package/src/cli/init-model.ts +57 -2
  436. package/src/cli/init-render.ts +2 -2
  437. package/src/cli/init.ts +11 -9
  438. package/src/cli/json-document.ts +11 -0
  439. package/src/cli/main.ts +53 -6
  440. package/src/cli/migrate-local-history.ts +3 -2
  441. package/src/cli/peer-command.ts +2 -1
  442. package/src/contracts/capabilities.ts +90 -0
  443. package/src/contracts/json-object.ts +1 -11
  444. package/src/contracts/output-schema-cli.ts +36 -3
  445. package/src/contracts/output-schema-fragments.ts +52 -2
  446. package/src/contracts/output-schema-mcp.ts +219 -0
  447. package/src/contracts/output-schemas.ts +300 -6
  448. package/src/git/diff.ts +61 -0
  449. package/src/mcp/burden.ts +9 -0
  450. package/src/mcp/context.ts +5 -42
  451. package/src/mcp/daemon-server.ts +8 -1
  452. package/src/mcp/daemon-session-host.ts +4 -0
  453. package/src/mcp/daemon-stdio-bridge.ts +2 -0
  454. package/src/mcp/monitor-tick-job.ts +90 -39
  455. package/src/mcp/monitor-types.ts +1 -1
  456. package/src/mcp/persisted-local-history-graph.ts +5 -4
  457. package/src/mcp/persisted-local-history.ts +2 -2
  458. package/src/mcp/persistent-monitor-runtime.ts +37 -0
  459. package/src/mcp/repo-tool-worker-context.ts +5 -2
  460. package/src/mcp/server-context.ts +15 -2
  461. package/src/mcp/server-tool-access.ts +4 -1
  462. package/src/mcp/server.ts +8 -3
  463. package/src/mcp/tool-registry.ts +18 -0
  464. package/src/mcp/tools/code-find.ts +23 -0
  465. package/src/mcp/tools/code-show.ts +27 -0
  466. package/src/mcp/tools/diagnostic-models.ts +2 -0
  467. package/src/mcp/tools/doctor.ts +18 -1
  468. package/src/mcp/tools/export-surface-diff.ts +26 -0
  469. package/src/mcp/tools/file-outline.ts +1 -1
  470. package/src/mcp/tools/graft-edit.ts +276 -0
  471. package/src/mcp/tools/knowledge-map.ts +34 -0
  472. package/src/mcp/tools/monitor-nudge.ts +19 -0
  473. package/src/mcp/tools/precision-warp.ts +27 -16
  474. package/src/mcp/tools/refactor-difficulty.ts +42 -0
  475. package/src/mcp/tools/safe-read.ts +2 -2
  476. package/src/mcp/tools/structural-blame.ts +55 -0
  477. package/src/mcp/tools/structural-churn.ts +28 -0
  478. package/src/mcp/tools/structural-log.ts +41 -0
  479. package/src/mcp/tools/structural-review.ts +63 -0
  480. package/src/mcp/warp-pool.ts +6 -6
  481. package/src/mcp/workspace-router-model.ts +2 -2
  482. package/src/mcp/workspace-router-runtime.ts +11 -8
  483. package/src/mcp/workspace-router.ts +9 -2
  484. package/src/operations/adaptive-projection.ts +54 -0
  485. package/src/operations/agent-handoff.ts +59 -0
  486. package/src/operations/capture-range.ts +64 -0
  487. package/src/operations/conversation-primer.ts +82 -0
  488. package/src/operations/cross-session-resume.ts +104 -0
  489. package/src/operations/deterministic-replay.ts +143 -0
  490. package/src/operations/export-surface-diff.ts +355 -0
  491. package/src/operations/footprint-parallelism.ts +98 -0
  492. package/src/operations/graft-diff.ts +14 -7
  493. package/src/operations/horizon-of-readability.ts +60 -0
  494. package/src/operations/import-reference-impact.ts +143 -0
  495. package/src/operations/knowledge-map.ts +96 -0
  496. package/src/operations/observation-cache.ts +20 -4
  497. package/src/operations/projection-safety.ts +111 -0
  498. package/src/operations/repo-workspace.ts +3 -3
  499. package/src/operations/semantic-drift.ts +70 -0
  500. package/src/operations/session-filtration.ts +76 -0
  501. package/src/operations/session-replay.ts +73 -0
  502. package/src/operations/sludge-detector.ts +356 -0
  503. package/src/operations/structural-blame.ts +197 -0
  504. package/src/operations/structural-review.ts +317 -0
  505. package/src/operations/teaching-hints.ts +52 -0
  506. package/src/parser/diff.ts +7 -0
  507. package/src/ports/paths.ts +22 -0
  508. package/src/warp/ast-emitter.ts +133 -0
  509. package/src/warp/ast-import-resolver.ts +333 -0
  510. package/src/warp/commit-meta.ts +19 -0
  511. package/src/warp/context.ts +48 -0
  512. package/src/warp/dead-symbols.ts +174 -0
  513. package/src/warp/drift-sentinel.ts +101 -0
  514. package/src/warp/index-head.ts +348 -0
  515. package/src/warp/observers.ts +8 -7
  516. package/src/warp/open.ts +40 -66
  517. package/src/warp/outline-diff-trailer.ts +100 -0
  518. package/src/warp/plumbing.d.ts +11 -2
  519. package/src/warp/refactor-difficulty.ts +257 -0
  520. package/src/warp/references.ts +77 -0
  521. package/src/warp/stale-docs.ts +210 -0
  522. package/src/warp/structural-drift-detection.ts +97 -0
  523. package/src/warp/structural-queries.ts +258 -0
  524. package/src/warp/symbol-timeline.ts +209 -0
  525. package/src/warp/traverse-hydrate.ts +61 -0
  526. package/src/warp/warp-reference-count.ts +47 -0
  527. package/src/warp/warp-structural-blame.ts +65 -0
  528. package/src/warp/warp-structural-churn.ts +309 -0
  529. package/src/warp/warp-structural-log.ts +149 -0
  530. package/dist/ports/warp.d.ts +0 -45
  531. package/dist/ports/warp.d.ts.map +0 -1
  532. package/dist/ports/warp.js.map +0 -1
  533. package/dist/warp/identity-resolver.d.ts +0 -14
  534. package/dist/warp/identity-resolver.d.ts.map +0 -1
  535. package/dist/warp/identity-resolver.js +0 -31
  536. package/dist/warp/identity-resolver.js.map +0 -1
  537. package/dist/warp/indexer-git.d.ts +0 -22
  538. package/dist/warp/indexer-git.d.ts.map +0 -1
  539. package/dist/warp/indexer-git.js +0 -148
  540. package/dist/warp/indexer-git.js.map +0 -1
  541. package/dist/warp/indexer-graph.d.ts +0 -17
  542. package/dist/warp/indexer-graph.d.ts.map +0 -1
  543. package/dist/warp/indexer-graph.js +0 -179
  544. package/dist/warp/indexer-graph.js.map +0 -1
  545. package/dist/warp/indexer-model.d.ts +0 -51
  546. package/dist/warp/indexer-model.d.ts.map +0 -1
  547. package/dist/warp/indexer-model.js +0 -21
  548. package/dist/warp/indexer-model.js.map +0 -1
  549. package/dist/warp/indexer.d.ts +0 -9
  550. package/dist/warp/indexer.d.ts.map +0 -1
  551. package/dist/warp/indexer.js +0 -112
  552. package/dist/warp/indexer.js.map +0 -1
  553. package/dist/warp/symbol-identity.d.ts +0 -11
  554. package/dist/warp/symbol-identity.d.ts.map +0 -1
  555. package/dist/warp/symbol-identity.js +0 -67
  556. package/dist/warp/symbol-identity.js.map +0 -1
  557. package/src/ports/warp.ts +0 -55
  558. package/src/warp/identity-resolver.ts +0 -35
  559. package/src/warp/indexer-git.ts +0 -182
  560. package/src/warp/indexer-graph.ts +0 -276
  561. package/src/warp/indexer-model.ts +0 -69
  562. package/src/warp/indexer.ts +0 -186
  563. package/src/warp/symbol-identity.ts +0 -100
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flyingrobots/graft",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "Context governor and between-commit activity surface for coding agents",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@10.30.0",
@@ -21,29 +21,32 @@
21
21
  "bin/",
22
22
  "dist/",
23
23
  "src/",
24
+ "ADVANCED_GUIDE.md",
24
25
  "ARCHITECTURE.md",
26
+ "CHANGELOG.md",
25
27
  "CODE_OF_CONDUCT.md",
26
- "docs/ADVANCED_GUIDE.md",
28
+ "GUIDE.md",
27
29
  "docs/CLI.md",
28
- "docs/GUIDE.md",
29
30
  "docs/MCP.md",
31
+ "docs/SETUP.md",
30
32
  "LICENSE",
31
33
  "NOTICE",
32
- "README.md",
33
- "CHANGELOG.md"
34
+ "README.md"
34
35
  ],
35
36
  "scripts": {
36
37
  "graft": "node ./bin/graft.js",
37
38
  "build": "tsc -p tsconfig.build.json",
38
39
  "prepack": "pnpm build",
39
- "test": "vitest run",
40
+ "test": "tsx scripts/run-isolated-tests.ts",
41
+ "test:local": "vitest run",
40
42
  "test:watch": "vitest",
41
43
  "lint": "eslint .",
42
44
  "typecheck": "tsc --noEmit",
43
45
  "pack:check": "pnpm pack --dry-run",
46
+ "guard:agent-worktrees": "tsx scripts/check-agent-worktree-hygiene.ts",
44
47
  "security:check": "tsx scripts/check-release-security.ts",
45
48
  "release:surface-gate": "vitest run --run test/unit/release/package-library-surface.test.ts test/unit/release/three-surface-capability-posture.test.ts",
46
- "release:check": "pnpm lint && pnpm typecheck && pnpm release:surface-gate && pnpm test && pnpm security:check && pnpm pack:check"
49
+ "release:check": "pnpm guard:agent-worktrees && pnpm lint && pnpm typecheck && pnpm release:surface-gate && pnpm test && pnpm security:check && pnpm pack:check"
47
50
  },
48
51
  "engines": {
49
52
  "node": ">=20.11.0"
@@ -0,0 +1,11 @@
1
+ import { type JsonObject, parseJsonObject } from "../contracts/json-object.js";
2
+
3
+ export function parseJsonTextObject(text: string, label: string): JsonObject {
4
+ let parsed: unknown;
5
+ try {
6
+ parsed = JSON.parse(text) as unknown;
7
+ } catch {
8
+ throw new Error(`${label} was not valid JSON`);
9
+ }
10
+ return parseJsonObject(parsed, label);
11
+ }
@@ -0,0 +1,35 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Node PathOps adapter — implements PathOps using node:path
3
+ // ---------------------------------------------------------------------------
4
+
5
+ import * as path from "node:path";
6
+ import type { PathOps } from "../ports/paths.js";
7
+
8
+ function toForwardSlash(p: string): string {
9
+ return p.replaceAll("\\", "/");
10
+ }
11
+
12
+ function stripTrailingSlash(p: string): string {
13
+ if (p === "/") return p;
14
+ return p.endsWith("/") ? p.slice(0, -1) : p;
15
+ }
16
+
17
+ function normalizeImpl(p: string): string {
18
+ return stripTrailingSlash(toForwardSlash(path.normalize(p)));
19
+ }
20
+
21
+ export const nodePathOps: PathOps = {
22
+ normalize(p: string): string {
23
+ return normalizeImpl(p);
24
+ },
25
+
26
+ isWithin(filePath: string, directory: string): boolean {
27
+ const normFile = normalizeImpl(filePath);
28
+ const normDir = normalizeImpl(directory);
29
+ return normFile === normDir || normFile.startsWith(`${normDir}/`);
30
+ },
31
+
32
+ join(...segments: string[]): string {
33
+ return normalizeImpl(path.join(...segments));
34
+ },
35
+ };
@@ -1,13 +1,54 @@
1
+ import * as fs from "node:fs";
1
2
  import * as path from "node:path";
2
3
 
4
+ function pathEscapesRoot(root: string, target: string): boolean {
5
+ const relative = path.relative(root, target);
6
+ return relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative);
7
+ }
8
+
9
+ function realPathOrSelf(target: string): string {
10
+ try {
11
+ return fs.realpathSync.native(target);
12
+ } catch {
13
+ return target;
14
+ }
15
+ }
16
+
17
+ function nearestExistingAncestor(target: string): string {
18
+ let current = target;
19
+ while (current.length > 0) {
20
+ try {
21
+ fs.lstatSync(current);
22
+ return current;
23
+ } catch {
24
+ const parent = path.dirname(current);
25
+ if (parent === current) {
26
+ return current;
27
+ }
28
+ current = parent;
29
+ }
30
+ }
31
+ return target;
32
+ }
33
+
3
34
  export function createRepoPathResolver(projectRoot: string): (input: string) => string {
35
+ const normalizedRoot = path.resolve(projectRoot);
36
+ const realProjectRoot = realPathOrSelf(normalizedRoot);
37
+
4
38
  return (input: string): string => {
5
- if (path.isAbsolute(input)) return input;
6
- const resolved = path.resolve(projectRoot, input);
7
- const relative = path.relative(projectRoot, resolved);
8
- if (relative.startsWith("..")) {
39
+ const resolved = path.isAbsolute(input)
40
+ ? path.resolve(input)
41
+ : path.resolve(normalizedRoot, input);
42
+
43
+ if (pathEscapesRoot(normalizedRoot, resolved)) {
9
44
  throw new Error(`Path traversal blocked: ${input}`);
10
45
  }
46
+
47
+ const realAncestor = realPathOrSelf(nearestExistingAncestor(resolved));
48
+ if (pathEscapesRoot(realProjectRoot, realAncestor)) {
49
+ throw new Error(`Path traversal blocked: ${input}`);
50
+ }
51
+
11
52
  return resolved;
12
53
  };
13
54
  }
@@ -1,5 +1,6 @@
1
1
  import type { McpToolName } from "../contracts/capabilities.js";
2
- import { type JsonObject, parseJsonTextObject } from "../contracts/json-object.js";
2
+ import type { JsonObject } from "../contracts/json-object.js";
3
+ import { parseJsonTextObject } from "../adapters/json-text-decoder.js";
3
4
  import { getMcpOutputSchema, type McpOutputFor } from "../contracts/output-schemas.js";
4
5
  import type { GraftServer, McpToolResult } from "../mcp/server.js";
5
6
 
@@ -39,29 +39,50 @@ export function describeCliFailure(argv: readonly string[]): CliErrorDetails {
39
39
 
40
40
  if (group === "serve") {
41
41
  return {
42
- usage: "graft serve",
43
- nextSteps: ["Run `graft help` to see the explicit transport entrypoints."],
42
+ usage: "graft serve [--runtime <repo-local|daemon>] [--socket <path>] [--no-autostart]",
43
+ nextSteps: [
44
+ "`graft serve` is repo-local stdio. Use `graft serve --runtime daemon` for the daemon-backed stdio bridge.",
45
+ ],
44
46
  };
45
47
  }
46
48
 
47
49
  if (group === "daemon") {
50
+ if (subcommand === "status") {
51
+ return {
52
+ usage: "graft daemon status [--socket <path>]",
53
+ nextSteps: ["Start the daemon with `graft daemon` or target another daemon with `--socket <path>`."],
54
+ };
55
+ }
48
56
  return {
49
- usage: "graft daemon [--socket <path>]",
50
- nextSteps: ["Run `graft help` to see the daemon and grouped command surfaces."],
57
+ usage: "graft daemon [--socket <path>] | graft daemon status [--socket <path>]",
58
+ nextSteps: ["Run `graft daemon status` to inspect an already-running daemon without mutating daemon state."],
51
59
  };
52
60
  }
53
61
 
62
+ if (group === "doctor") {
63
+ return { usage: "graft doctor [--sludge] [--path <path>] [--json]" };
64
+ }
65
+
54
66
  if (group === "index") {
55
67
  return {
56
- usage: "graft index [<from-ref>] [--json]",
57
- nextSteps: ["Use `--json` for machine-readable output."],
68
+ usage: "graft index [--path <path>] [--json]",
69
+ nextSteps: ["Use `--path <path>` for lazy per-file indexing and `--json` for machine-readable output."],
70
+ };
71
+ }
72
+
73
+ if (group === "enhance") {
74
+ return {
75
+ usage: "git-graft enhance --since <ref> [--head <ref>] [--json]",
76
+ nextSteps: [
77
+ "Use `git graft enhance --since <ref>` after package install, or `git-graft enhance --since <ref>` via the direct binary.",
78
+ ],
58
79
  };
59
80
  }
60
81
 
61
82
  if (group === "init") {
62
83
  return {
63
84
  usage:
64
- "graft init [--json] [--write-claude-mcp] [--write-claude-hooks] "
85
+ "graft init [--json] [--mcp-runtime <repo-local|daemon>] [--write-claude-mcp] [--write-claude-hooks] "
65
86
  + "[--write-target-git-hooks] [--write-codex-mcp] [--write-cursor-mcp] "
66
87
  + "[--write-windsurf-mcp] [--write-continue-mcp] [--write-cline-mcp]",
67
88
  nextSteps: ["Run `graft help` to confirm the repo-local bootstrap surfaces."],
@@ -97,8 +118,20 @@ export function describeCliFailure(argv: readonly string[]): CliErrorDetails {
97
118
  if (subcommand === "map") {
98
119
  return { usage: "graft struct map [<directory>] [--json]" };
99
120
  }
121
+ if (subcommand === "churn") {
122
+ return { usage: "graft struct churn [--path <path>] [--limit <n>] [--json]" };
123
+ }
124
+ if (subcommand === "exports") {
125
+ return { usage: "graft struct exports [<base-ref> <head-ref>] [--json]" };
126
+ }
127
+ if (subcommand === "log") {
128
+ return { usage: "graft struct log [--path <path>] [--limit <n>] [--json]" };
129
+ }
130
+ if (subcommand === "review") {
131
+ return { usage: "graft struct review [--base <ref>] [--head <ref>] [--json]" };
132
+ }
100
133
  return {
101
- usage: "graft struct <diff|since|map> ...",
134
+ usage: "graft struct <diff|since|map|churn|exports|log|review> ...",
102
135
  nextSteps: ["Run `graft help` to see the available structural subcommands."],
103
136
  };
104
137
  }
@@ -110,8 +143,14 @@ export function describeCliFailure(argv: readonly string[]): CliErrorDetails {
110
143
  if (subcommand === "show") {
111
144
  return { usage: "graft symbol show <symbol> [--path <path>] [--ref <ref>] [--json]" };
112
145
  }
146
+ if (subcommand === "blame") {
147
+ return { usage: "graft symbol blame <symbol> [--path <path>] [--json]" };
148
+ }
149
+ if (subcommand === "difficulty") {
150
+ return { usage: "graft symbol difficulty <symbol> [--path <path>] [--limit <n>] [--json]" };
151
+ }
113
152
  return {
114
- usage: "graft symbol <find|show> ...",
153
+ usage: "graft symbol <find|show|blame|difficulty> ...",
115
154
  nextSteps: ["Run `graft help` to see the available symbol subcommands."],
116
155
  };
117
156
  }
@@ -130,7 +169,7 @@ export function describeCliFailure(argv: readonly string[]): CliErrorDetails {
130
169
  return { usage: "graft diag local-history-dag [--limit <n>] [--json]" };
131
170
  }
132
171
  if (subcommand === "doctor") {
133
- return { usage: "graft diag doctor [--json]" };
172
+ return { usage: "graft diag doctor [--sludge] [--path <path>] [--json]" };
134
173
  }
135
174
  if (subcommand === "explain") {
136
175
  return { usage: "graft diag explain <reason-code> [--json]" };
@@ -12,6 +12,19 @@ export interface ParsedCommand {
12
12
  args: Record<string, unknown>;
13
13
  }
14
14
 
15
+ export type ServeRuntime = "repo-local" | "daemon";
16
+
17
+ export interface ParsedServeCommand {
18
+ readonly runtime: ServeRuntime;
19
+ readonly socketPath?: string | undefined;
20
+ readonly spawnIfMissing?: boolean | undefined;
21
+ }
22
+
23
+ export interface ParsedDaemonCommand {
24
+ readonly action: "start" | "status";
25
+ readonly socketPath?: string | undefined;
26
+ }
27
+
15
28
  export function resolveEntrypointArgs(
16
29
  args: readonly string[],
17
30
  stdinIsTTY: boolean | undefined,
@@ -65,10 +78,50 @@ function parsePositiveInt(raw: string | undefined, flag: string): number {
65
78
  return value;
66
79
  }
67
80
 
68
- export function parseDaemonCommand(cwd: string, argv: string[]): { socketPath?: string } {
81
+ export function parseDaemonCommand(cwd: string, argv: string[]): ParsedDaemonCommand {
82
+ const action = argv[0] === "status" ? "status" : "start";
83
+ if (action === "status") {
84
+ argv.shift();
85
+ }
69
86
  const socketPath = consumeOption(argv, "--socket");
70
87
  expectNoArgs(argv);
71
- return socketPath !== undefined ? { socketPath: path.resolve(cwd, socketPath) } : {};
88
+ return {
89
+ action,
90
+ ...(socketPath !== undefined ? { socketPath: path.resolve(cwd, socketPath) } : {}),
91
+ };
92
+ }
93
+
94
+ function parseServeRuntime(raw: string | undefined): ServeRuntime {
95
+ if (raw === undefined || raw === "repo-local") {
96
+ return "repo-local";
97
+ }
98
+ if (raw === "daemon") {
99
+ return "daemon";
100
+ }
101
+ throw new Error(`--runtime must be repo-local or daemon, got ${raw}`);
102
+ }
103
+
104
+ export function parseServeCommand(cwd: string, argv: string[]): ParsedServeCommand {
105
+ const runtime = parseServeRuntime(consumeOption(argv, "--runtime"));
106
+ const socketPath = consumeOption(argv, "--socket");
107
+ const noAutostart = consumeFlag(argv, "--no-autostart");
108
+ expectNoArgs(argv);
109
+
110
+ if (runtime === "repo-local") {
111
+ if (socketPath !== undefined) {
112
+ throw new Error("--socket requires --runtime daemon");
113
+ }
114
+ if (noAutostart) {
115
+ throw new Error("--no-autostart requires --runtime daemon");
116
+ }
117
+ return { runtime };
118
+ }
119
+
120
+ return {
121
+ runtime,
122
+ ...(socketPath !== undefined ? { socketPath: path.resolve(cwd, socketPath) } : {}),
123
+ ...(noAutostart ? { spawnIfMissing: false } : {}),
124
+ };
72
125
  }
73
126
 
74
127
  export function parseGlobalOptions(
@@ -161,6 +214,62 @@ function parseStructCommand(argv: string[]): ParsedCommand {
161
214
  };
162
215
  }
163
216
 
217
+ if (subcommand === "churn") {
218
+ const filePath = consumeOption(argv, "--path");
219
+ const limitRaw = consumeOption(argv, "--limit");
220
+ expectNoArgs(argv);
221
+ return {
222
+ command: "struct_churn",
223
+ json,
224
+ args: {
225
+ ...(filePath !== undefined ? { path: filePath } : {}),
226
+ ...(limitRaw !== undefined ? { limit: parsePositiveInt(limitRaw, "--limit") } : {}),
227
+ },
228
+ };
229
+ }
230
+
231
+ if (subcommand === "exports") {
232
+ const base = argv[0]?.startsWith("--") === false ? consumePositional(argv, "base ref") : undefined;
233
+ const head = argv[0]?.startsWith("--") === false ? consumePositional(argv, "head ref") : undefined;
234
+ expectNoArgs(argv);
235
+ return {
236
+ command: "struct_exports",
237
+ json,
238
+ args: {
239
+ ...(base !== undefined ? { base } : {}),
240
+ ...(head !== undefined ? { head } : {}),
241
+ },
242
+ };
243
+ }
244
+
245
+ if (subcommand === "log") {
246
+ const filePath = consumeOption(argv, "--path");
247
+ const limitRaw = consumeOption(argv, "--limit");
248
+ expectNoArgs(argv);
249
+ return {
250
+ command: "struct_log",
251
+ json,
252
+ args: {
253
+ ...(filePath !== undefined ? { path: filePath } : {}),
254
+ ...(limitRaw !== undefined ? { limit: parsePositiveInt(limitRaw, "--limit") } : {}),
255
+ },
256
+ };
257
+ }
258
+
259
+ if (subcommand === "review") {
260
+ const base = consumeOption(argv, "--base");
261
+ const head = consumeOption(argv, "--head");
262
+ expectNoArgs(argv);
263
+ return {
264
+ command: "struct_review",
265
+ json,
266
+ args: {
267
+ ...(base !== undefined ? { base } : {}),
268
+ ...(head !== undefined ? { head } : {}),
269
+ },
270
+ };
271
+ }
272
+
164
273
  throw new Error(`Unknown struct subcommand: ${subcommand}`);
165
274
  }
166
275
 
@@ -200,6 +309,36 @@ function parseSymbolCommand(argv: string[]): ParsedCommand {
200
309
  };
201
310
  }
202
311
 
312
+ if (subcommand === "blame") {
313
+ const symbol = consumePositional(argv, "symbol");
314
+ const filePath = consumeOption(argv, "--path");
315
+ expectNoArgs(argv);
316
+ return {
317
+ command: "symbol_blame",
318
+ json,
319
+ args: {
320
+ symbol,
321
+ ...(filePath !== undefined ? { path: filePath } : {}),
322
+ },
323
+ };
324
+ }
325
+
326
+ if (subcommand === "difficulty") {
327
+ const symbol = consumePositional(argv, "symbol");
328
+ const filePath = consumeOption(argv, "--path");
329
+ const limitRaw = consumeOption(argv, "--limit");
330
+ expectNoArgs(argv);
331
+ return {
332
+ command: "symbol_difficulty",
333
+ json,
334
+ args: {
335
+ symbol,
336
+ ...(filePath !== undefined ? { path: filePath } : {}),
337
+ ...(limitRaw !== undefined ? { limit: parsePositiveInt(limitRaw, "--limit") } : {}),
338
+ },
339
+ };
340
+ }
341
+
203
342
  throw new Error(`Unknown symbol subcommand: ${subcommand}`);
204
343
  }
205
344
 
@@ -224,8 +363,17 @@ function parseDiagCommand(argv: string[]): ParsedCommand {
224
363
  const json = consumeFlag(argv, "--json");
225
364
 
226
365
  if (subcommand === "doctor") {
366
+ const sludge = consumeFlag(argv, "--sludge");
367
+ const filePath = consumeOption(argv, "--path");
227
368
  expectNoArgs(argv);
228
- return { command: "diag_doctor", json, args: {} };
369
+ return {
370
+ command: "diag_doctor",
371
+ json,
372
+ args: {
373
+ ...(sludge ? { sludge } : {}),
374
+ ...(filePath !== undefined ? { path: filePath } : {}),
375
+ },
376
+ };
229
377
  }
230
378
 
231
379
  if (subcommand === "activity") {
@@ -289,14 +437,48 @@ function parseDiagCommand(argv: string[]): ParsedCommand {
289
437
  throw new Error(`Unknown diag subcommand: ${subcommand}`);
290
438
  }
291
439
 
440
+ function parseEnhanceCommand(argv: string[]): ParsedCommand {
441
+ const json = consumeFlag(argv, "--json");
442
+ const since = consumeOption(argv, "--since");
443
+ const head = consumeOption(argv, "--head");
444
+ if (since === undefined) {
445
+ expectNoArgs(argv);
446
+ throw new Error("Missing --since");
447
+ }
448
+ expectNoArgs(argv);
449
+ return {
450
+ command: "git_graft_enhance",
451
+ json,
452
+ args: {
453
+ since,
454
+ ...(head !== undefined ? { head } : {}),
455
+ },
456
+ };
457
+ }
458
+
292
459
  export function parseCommand(argv: string[]): ParsedCommand {
293
460
  const group = consumePositional(argv, "command");
294
461
 
462
+ if (group === "doctor") {
463
+ const json = consumeFlag(argv, "--json");
464
+ const sludge = consumeFlag(argv, "--sludge");
465
+ const filePath = consumeOption(argv, "--path");
466
+ expectNoArgs(argv);
467
+ return {
468
+ command: "diag_doctor",
469
+ json,
470
+ args: {
471
+ ...(sludge ? { sludge } : {}),
472
+ ...(filePath !== undefined ? { path: filePath } : {}),
473
+ },
474
+ };
475
+ }
295
476
  if (group === "read") return parseReadCommand(argv);
296
477
  if (group === "struct") return parseStructCommand(argv);
297
478
  if (group === "symbol") return parseSymbolCommand(argv);
298
479
  if (group === "migrate") return parseMigrateCommand(argv);
299
480
  if (group === "diag") return parseDiagCommand(argv);
481
+ if (group === "enhance") return parseEnhanceCommand(argv);
300
482
 
301
483
  throw new Error(`Unknown command: ${group}`);
302
484
  }