@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
@@ -78,6 +78,34 @@ const tripwireSchema = z.object({
78
78
  recommendation: z.string(),
79
79
  }).strict();
80
80
 
81
+ const graftEditReasonSchema = z.enum([
82
+ "NOT_FOUND",
83
+ "OLD_STRING_NOT_FOUND",
84
+ "OLD_STRING_AMBIGUOUS",
85
+ "BINARY",
86
+ "LOCKFILE",
87
+ "MINIFIED",
88
+ "BUILD_OUTPUT",
89
+ "SECRET",
90
+ "GRAFTIGNORE",
91
+ ]);
92
+
93
+ const graftEditDriftWarningSchema = z.object({
94
+ kind: z.literal("structural_pattern_reintroduced"),
95
+ severity: z.literal("advisory"),
96
+ pattern: z.literal("jsdoc_typedef"),
97
+ basis: z.literal("session_local_graft_edit"),
98
+ message: z.string(),
99
+ current: z.object({
100
+ path: z.string(),
101
+ direction: z.literal("added"),
102
+ }).strict(),
103
+ previous: z.object({
104
+ path: z.string(),
105
+ direction: z.literal("removed"),
106
+ }).strict(),
107
+ }).strict();
108
+
81
109
  const outlineEntrySchema: z.ZodType = z.lazy(() => z.object({
82
110
  _brand: z.literal("OutlineEntry").optional(),
83
111
  kind: z.string(),
@@ -120,6 +148,7 @@ const diffEntrySchema: z.ZodType = z.lazy(() => z.object({
120
148
  _brand: z.literal("DiffEntry").optional(),
121
149
  name: z.string(),
122
150
  kind: z.string(),
151
+ exported: z.boolean().optional(),
123
152
  signature: z.string().optional(),
124
153
  oldSignature: z.string().optional(),
125
154
  childDiff: outlineDiffSchema.optional(),
@@ -141,6 +170,45 @@ const burdenByKindSchema = z.object({
141
170
  diagnostic: burdenBucketSchema,
142
171
  }).strict();
143
172
 
173
+ const sludgeSignalSchema = z.object({
174
+ kind: z.enum([
175
+ "phantom_shape",
176
+ "cast_density",
177
+ "homeless_constructor",
178
+ "free_function_data_behavior",
179
+ "god_file",
180
+ ]),
181
+ severity: z.enum(["low", "medium", "high"]),
182
+ message: z.string(),
183
+ line: z.number().int().positive().optional(),
184
+ symbol: z.string().optional(),
185
+ evidence: z.string(),
186
+ }).strict();
187
+
188
+ const sludgeFileReportSchema = z.object({
189
+ path: z.string(),
190
+ score: z.number().int().nonnegative(),
191
+ metrics: z.object({
192
+ typedefCount: z.number().int().nonnegative(),
193
+ typeCastCount: z.number().int().nonnegative(),
194
+ classCount: z.number().int().nonnegative(),
195
+ functionCount: z.number().int().nonnegative(),
196
+ symbolCount: z.number().int().nonnegative(),
197
+ homelessConstructorCount: z.number().int().nonnegative(),
198
+ freeFunctionDataBehaviorCount: z.number().int().nonnegative(),
199
+ }).strict(),
200
+ signals: z.array(sludgeSignalSchema),
201
+ }).strict();
202
+
203
+ const sludgeReportSchema = z.object({
204
+ scannedFiles: z.number().int().nonnegative(),
205
+ filesWithSignals: z.number().int().nonnegative(),
206
+ totalSignals: z.number().int().nonnegative(),
207
+ score: z.number().int().nonnegative(),
208
+ files: z.array(sludgeFileReportSchema),
209
+ summary: z.string(),
210
+ }).strict();
211
+
144
212
  const receiptSchema = z.object({
145
213
  sessionId: z.string(),
146
214
  traceId: z.string(),
@@ -193,6 +261,33 @@ const runtimeLocalProvenanceSchema = z.object({
193
261
  provenanceLevel: z.literal("artifact_history"),
194
262
  }).strict();
195
263
 
264
+ const gitGraftEnhanceBodySchema = z.object({
265
+ range: z.object({
266
+ since: z.string(),
267
+ head: z.string(),
268
+ }).strict(),
269
+ structural: z.object({
270
+ changedFiles: z.number().int().nonnegative(),
271
+ addedSymbols: z.number().int().nonnegative(),
272
+ removedSymbols: z.number().int().nonnegative(),
273
+ changedSymbols: z.number().int().nonnegative(),
274
+ topFilesByChangeCount: z.array(z.object({
275
+ path: z.string(),
276
+ status: z.string(),
277
+ changeCount: z.number().int().nonnegative(),
278
+ summary: z.string(),
279
+ }).strict()),
280
+ }).strict(),
281
+ exports: z.object({
282
+ changed: z.boolean(),
283
+ semverImpact: z.enum(["major", "minor", "patch", "none"]),
284
+ addedExports: z.number().int().nonnegative(),
285
+ removedExports: z.number().int().nonnegative(),
286
+ changedExports: z.number().int().nonnegative(),
287
+ }).strict(),
288
+ warnings: z.array(z.string()),
289
+ }).strict();
290
+
196
291
  const runtimeStagedTargetSchema = z.discriminatedUnion("availability", [
197
292
  runtimeLocalProvenanceSchema.extend({
198
293
  availability: z.literal("none"),
@@ -540,7 +635,7 @@ const activeCausalWorkspaceSchema = z.object({
540
635
  latestReadEvent: readEventSchema.nullable(),
541
636
  latestStageEvent: stageEventSchema.nullable(),
542
637
  latestTransitionEvent: transitionEventSchema.nullable(),
543
- repoConcurrency: repoConcurrencySummarySchema,
638
+ repoConcurrency: repoConcurrencySummarySchema.nullable(),
544
639
  checkoutEpoch: z.number().int().nonnegative(),
545
640
  lastTransition: repoTransitionSchema.nullable(),
546
641
  semanticTransition: repoSemanticTransitionSchema.nullable(),
@@ -693,7 +788,7 @@ const monitorStatusSchema = z.object({
693
788
 
694
789
  const monitorActionSchema = z.object({
695
790
  ok: z.boolean(),
696
- action: z.enum(["start", "pause", "resume", "stop"]),
791
+ action: z.enum(["start", "pause", "resume", "stop", "nudge"]),
697
792
  created: z.boolean(),
698
793
  changed: z.boolean(),
699
794
  status: monitorStatusSchema.optional(),
@@ -818,6 +913,20 @@ const mcpOutputBodySchemas: Record<McpToolName, z.ZodType> = {
818
913
  lastReadAt: z.string().optional(),
819
914
  diff: outlineDiffSchema.optional(),
820
915
  }).strict(),
916
+ graft_edit: z.object({
917
+ path: z.string(),
918
+ operation: z.literal("replace"),
919
+ projection: z.enum(["edited", "refused"]),
920
+ status: z.enum(["edited", "refused"]),
921
+ changed: z.boolean(),
922
+ matches: z.number().int().nonnegative(),
923
+ replacements: z.number().int().nonnegative(),
924
+ reason: graftEditReasonSchema.optional(),
925
+ reasonDetail: z.string().optional(),
926
+ next: z.array(z.string()).optional(),
927
+ actual: actualSchema.optional(),
928
+ driftWarnings: z.array(graftEditDriftWarningSchema).optional(),
929
+ }).strict(),
821
930
  file_outline: z.union([
822
931
  z.object({
823
932
  path: z.string(),
@@ -949,6 +1058,7 @@ const mcpOutputBodySchemas: Record<McpToolName, z.ZodType> = {
949
1058
  monitor_start: monitorActionSchema,
950
1059
  monitor_pause: monitorActionSchema,
951
1060
  monitor_resume: monitorActionSchema,
1061
+ monitor_nudge: monitorActionSchema,
952
1062
  monitor_stop: monitorActionSchema,
953
1063
  workspace_authorize: workspaceAuthorizeSchema,
954
1064
  workspace_authorizations: z.object({
@@ -1018,6 +1128,7 @@ const mcpOutputBodySchemas: Record<McpToolName, z.ZodType> = {
1018
1128
  attribution: attributionSummarySchema,
1019
1129
  persistedLocalHistory: persistedLocalHistorySummarySchema,
1020
1130
  recommendedNextAction: causalSurfaceNextActionSchema,
1131
+ sludge: sludgeReportSchema.optional(),
1021
1132
  }).strict(),
1022
1133
  stats: z.object({
1023
1134
  totalReads: z.number().int().nonnegative(),
@@ -1029,10 +1140,170 @@ const mcpOutputBodySchemas: Record<McpToolName, z.ZodType> = {
1029
1140
  totalNonReadBytesReturned: z.number().int().nonnegative(),
1030
1141
  burdenByKind: burdenByKindSchema,
1031
1142
  }).strict(),
1143
+ graft_churn: z.object({
1144
+ entries: z.array(z.object({
1145
+ symbol: z.string(),
1146
+ filePath: z.string(),
1147
+ kind: z.string(),
1148
+ changeCount: z.number().int().positive(),
1149
+ lastChangedSha: z.string(),
1150
+ lastChangedDate: z.string(),
1151
+ }).strict()),
1152
+ totalSymbols: z.number().int().nonnegative(),
1153
+ totalCommitsAnalyzed: z.number().int().nonnegative(),
1154
+ summary: z.string(),
1155
+ }).strict(),
1156
+ graft_exports: z.object({
1157
+ base: z.string(),
1158
+ head: z.string(),
1159
+ added: z.array(z.object({
1160
+ symbol: z.string(),
1161
+ filePath: z.string(),
1162
+ kind: z.string(),
1163
+ changeType: z.literal("added"),
1164
+ signature: z.string().optional(),
1165
+ }).strict()),
1166
+ removed: z.array(z.object({
1167
+ symbol: z.string(),
1168
+ filePath: z.string(),
1169
+ kind: z.string(),
1170
+ changeType: z.literal("removed"),
1171
+ signature: z.string().optional(),
1172
+ }).strict()),
1173
+ changed: z.array(z.object({
1174
+ symbol: z.string(),
1175
+ filePath: z.string(),
1176
+ kind: z.string(),
1177
+ changeType: z.literal("signature_changed"),
1178
+ signature: z.string().optional(),
1179
+ previousSignature: z.string().optional(),
1180
+ }).strict()),
1181
+ semverImpact: z.enum(["major", "minor", "patch", "none"]),
1182
+ summary: z.string(),
1183
+ }).strict(),
1184
+ graft_log: z.object({
1185
+ entries: z.array(z.object({
1186
+ sha: z.string(),
1187
+ message: z.string(),
1188
+ author: z.string(),
1189
+ date: z.string(),
1190
+ symbols: z.object({
1191
+ added: z.array(z.object({
1192
+ name: z.string(),
1193
+ kind: z.string(),
1194
+ signature: z.string().optional(),
1195
+ exported: z.boolean(),
1196
+ filePath: z.string(),
1197
+ }).strict()),
1198
+ removed: z.array(z.object({
1199
+ name: z.string(),
1200
+ kind: z.string(),
1201
+ signature: z.string().optional(),
1202
+ exported: z.boolean(),
1203
+ filePath: z.string(),
1204
+ }).strict()),
1205
+ changed: z.array(z.object({
1206
+ name: z.string(),
1207
+ kind: z.string(),
1208
+ signature: z.string().optional(),
1209
+ exported: z.boolean(),
1210
+ filePath: z.string(),
1211
+ }).strict()),
1212
+ }).strict(),
1213
+ summary: z.string(),
1214
+ }).strict()),
1215
+ count: z.number().int().nonnegative(),
1216
+ layer: z.literal("commit_worldline"),
1217
+ }).strict(),
1218
+ graft_blame: z.object({
1219
+ symbol: z.string(),
1220
+ filePath: z.string(),
1221
+ changeCount: z.number().int().nonnegative(),
1222
+ createdInCommit: z.string().nullable(),
1223
+ lastSignatureChange: z.string().nullable(),
1224
+ referenceCount: z.number().int().nonnegative(),
1225
+ history: z.array(z.object({
1226
+ sha: z.string(),
1227
+ tick: z.number(),
1228
+ changeKind: z.string(),
1229
+ present: z.boolean(),
1230
+ signature: z.string().nullable(),
1231
+ }).strict()),
1232
+ }).strict(),
1233
+ graft_difficulty: z.object({
1234
+ symbol: z.string(),
1235
+ path: z.string().optional(),
1236
+ entries: z.array(z.object({
1237
+ symbol: z.string(),
1238
+ filePath: z.string(),
1239
+ kind: z.string(),
1240
+ score: z.number().nonnegative(),
1241
+ risk: z.enum(["low", "medium", "high"]),
1242
+ recommendation: z.enum(["refactor_freely", "refactor_with_tests", "plan_before_refactor"]),
1243
+ curvature: z.object({
1244
+ changeCount: z.number().int().nonnegative(),
1245
+ signatureChangeCount: z.number().int().nonnegative(),
1246
+ score: z.number().nonnegative(),
1247
+ }).strict(),
1248
+ friction: z.object({
1249
+ referenceCount: z.number().int().nonnegative(),
1250
+ referencingFiles: z.array(z.string()),
1251
+ score: z.number().nonnegative(),
1252
+ }).strict(),
1253
+ }).strict()),
1254
+ total: z.number().int().nonnegative(),
1255
+ summary: z.string(),
1256
+ }).strict(),
1257
+ graft_review: z.object({
1258
+ base: z.string(),
1259
+ head: z.string(),
1260
+ totalFiles: z.number().int().nonnegative(),
1261
+ categories: z.object({
1262
+ structural: z.number().int().nonnegative(),
1263
+ formatting: z.number().int().nonnegative(),
1264
+ test: z.number().int().nonnegative(),
1265
+ docs: z.number().int().nonnegative(),
1266
+ config: z.number().int().nonnegative(),
1267
+ }).strict(),
1268
+ files: z.array(z.object({
1269
+ path: z.string(),
1270
+ category: z.enum(["structural", "formatting", "test", "docs", "config"]),
1271
+ structuralChanges: z.object({
1272
+ added: z.number().int().nonnegative(),
1273
+ removed: z.number().int().nonnegative(),
1274
+ changed: z.number().int().nonnegative(),
1275
+ }).strict().optional(),
1276
+ }).strict()),
1277
+ breakingChanges: z.array(z.object({
1278
+ symbol: z.string(),
1279
+ kind: z.string(),
1280
+ filePath: z.string(),
1281
+ changeType: z.enum(["removed_export", "signature_changed", "type_changed"]),
1282
+ previousSignature: z.string().optional(),
1283
+ newSignature: z.string().optional(),
1284
+ impactedFiles: z.number().int().nonnegative(),
1285
+ impactedFilePaths: z.array(z.string()),
1286
+ }).strict()),
1287
+ summary: z.string(),
1288
+ }).strict(),
1289
+ knowledge_map: z.object({
1290
+ totalFiles: z.number().int().nonnegative(),
1291
+ totalSymbols: z.number().int().nonnegative(),
1292
+ files: z.array(z.object({
1293
+ path: z.string(),
1294
+ symbols: z.array(z.string()),
1295
+ readCount: z.number().int().positive(),
1296
+ lastReadAt: z.string(),
1297
+ stale: z.boolean(),
1298
+ }).strict()),
1299
+ staleFiles: z.array(z.string()),
1300
+ directoryCoverage: z.record(z.string(), z.number().int().nonnegative()),
1301
+ }).strict(),
1032
1302
  };
1033
1303
 
1034
1304
  export const MCP_OUTPUT_SCHEMAS: Record<McpToolName, z.ZodType> = {
1035
1305
  safe_read: withMcpCommon("safe_read", mcpOutputBodySchemas.safe_read),
1306
+ graft_edit: withMcpCommon("graft_edit", mcpOutputBodySchemas.graft_edit),
1036
1307
  file_outline: withMcpCommon("file_outline", mcpOutputBodySchemas.file_outline),
1037
1308
  read_range: withMcpCommon("read_range", mcpOutputBodySchemas.read_range),
1038
1309
  changed_since: withMcpCommon("changed_since", mcpOutputBodySchemas.changed_since),
@@ -1049,6 +1320,7 @@ export const MCP_OUTPUT_SCHEMAS: Record<McpToolName, z.ZodType> = {
1049
1320
  monitor_start: withMcpCommon("monitor_start", mcpOutputBodySchemas.monitor_start),
1050
1321
  monitor_pause: withMcpCommon("monitor_pause", mcpOutputBodySchemas.monitor_pause),
1051
1322
  monitor_resume: withMcpCommon("monitor_resume", mcpOutputBodySchemas.monitor_resume),
1323
+ monitor_nudge: withMcpCommon("monitor_nudge", mcpOutputBodySchemas.monitor_nudge),
1052
1324
  monitor_stop: withMcpCommon("monitor_stop", mcpOutputBodySchemas.monitor_stop),
1053
1325
  workspace_authorize: withMcpCommon("workspace_authorize", mcpOutputBodySchemas.workspace_authorize),
1054
1326
  workspace_authorizations: withMcpCommon(
@@ -1069,6 +1341,13 @@ export const MCP_OUTPUT_SCHEMAS: Record<McpToolName, z.ZodType> = {
1069
1341
  explain: withMcpCommon("explain", mcpOutputBodySchemas.explain),
1070
1342
  doctor: withMcpCommon("doctor", mcpOutputBodySchemas.doctor),
1071
1343
  stats: withMcpCommon("stats", mcpOutputBodySchemas.stats),
1344
+ graft_churn: withMcpCommon("graft_churn", mcpOutputBodySchemas.graft_churn),
1345
+ graft_exports: withMcpCommon("graft_exports", mcpOutputBodySchemas.graft_exports),
1346
+ graft_log: withMcpCommon("graft_log", mcpOutputBodySchemas.graft_log),
1347
+ graft_blame: withMcpCommon("graft_blame", mcpOutputBodySchemas.graft_blame),
1348
+ graft_difficulty: withMcpCommon("graft_difficulty", mcpOutputBodySchemas.graft_difficulty),
1349
+ graft_review: withMcpCommon("graft_review", mcpOutputBodySchemas.graft_review),
1350
+ knowledge_map: withMcpCommon("knowledge_map", mcpOutputBodySchemas.knowledge_map),
1072
1351
  };
1073
1352
 
1074
1353
  const initActionSchema = z.object({
@@ -1100,7 +1379,16 @@ const suggestedMcpServerSchema = z.object({
1100
1379
  mcpServers: z.object({
1101
1380
  graft: z.object({
1102
1381
  command: z.literal("npx"),
1103
- args: z.tuple([z.literal("-y"), z.literal("@flyingrobots/graft"), z.literal("serve")]),
1382
+ args: z.union([
1383
+ z.tuple([z.literal("-y"), z.literal("@flyingrobots/graft"), z.literal("serve")]),
1384
+ z.tuple([
1385
+ z.literal("-y"),
1386
+ z.literal("@flyingrobots/graft"),
1387
+ z.literal("serve"),
1388
+ z.literal("--runtime"),
1389
+ z.literal("daemon"),
1390
+ ]),
1391
+ ]),
1104
1392
  }).strict(),
1105
1393
  }).strict(),
1106
1394
  }).strict();
@@ -1117,9 +1405,8 @@ export const CLI_OUTPUT_SCHEMAS: Record<CliCommandName, z.ZodType> = {
1117
1405
  index: withCliCommon("index", z.object({
1118
1406
  ok: z.boolean(),
1119
1407
  cwd: z.string(),
1120
- from: z.string().nullable(),
1121
- commitsIndexed: z.number().int().nonnegative().optional(),
1122
- patchesWritten: z.number().int().nonnegative().optional(),
1408
+ filesIndexed: z.number().int().nonnegative().optional(),
1409
+ nodesEmitted: z.number().int().nonnegative().optional(),
1123
1410
  error: z.string().optional(),
1124
1411
  }).strict()),
1125
1412
  read_safe: withCliPeerCommon("read_safe", mcpOutputBodySchemas.safe_read),
@@ -1131,6 +1418,12 @@ export const CLI_OUTPUT_SCHEMAS: Record<CliCommandName, z.ZodType> = {
1131
1418
  struct_map: withCliPeerCommon("struct_map", mcpOutputBodySchemas.graft_map),
1132
1419
  symbol_show: withCliPeerCommon("symbol_show", mcpOutputBodySchemas.code_show),
1133
1420
  symbol_find: withCliPeerCommon("symbol_find", mcpOutputBodySchemas.code_find),
1421
+ struct_churn: withCliPeerCommon("struct_churn", mcpOutputBodySchemas.graft_churn),
1422
+ struct_exports: withCliPeerCommon("struct_exports", mcpOutputBodySchemas.graft_exports),
1423
+ struct_log: withCliPeerCommon("struct_log", mcpOutputBodySchemas.graft_log),
1424
+ symbol_blame: withCliPeerCommon("symbol_blame", mcpOutputBodySchemas.graft_blame),
1425
+ symbol_difficulty: withCliPeerCommon("symbol_difficulty", mcpOutputBodySchemas.graft_difficulty),
1426
+ struct_review: withCliPeerCommon("struct_review", mcpOutputBodySchemas.graft_review),
1134
1427
  diag_doctor: withCliPeerCommon("diag_doctor", mcpOutputBodySchemas.doctor),
1135
1428
  diag_activity: withCliPeerCommon("diag_activity", mcpOutputBodySchemas.activity_view),
1136
1429
  diag_explain: withCliPeerCommon("diag_explain", mcpOutputBodySchemas.explain),
@@ -1167,6 +1460,7 @@ export const CLI_OUTPUT_SCHEMAS: Record<CliCommandName, z.ZodType> = {
1167
1460
  edges: z.array(z.record(z.string(), z.unknown())),
1168
1461
  error: z.string().optional(),
1169
1462
  }).strict()),
1463
+ git_graft_enhance: withCliCommon("git_graft_enhance", gitGraftEnhanceBodySchema),
1170
1464
  };
1171
1465
 
1172
1466
  export function getMcpOutputSchemaMeta(tool: McpToolName): OutputSchemaMeta {
package/src/git/diff.ts CHANGED
@@ -48,6 +48,67 @@ async function objectExists(ref: string, filePath: string, cwd: string, gitClien
48
48
  * Throws GitError for invalid refs or non-git directories.
49
49
  * Returns empty array only when there are genuinely no changes.
50
50
  */
51
+
52
+ export type ChangedFileStatus = "added" | "modified" | "deleted" | "renamed";
53
+
54
+ export interface ChangedFile {
55
+ readonly path: string;
56
+ readonly status: ChangedFileStatus;
57
+ readonly oldPath?: string;
58
+ }
59
+
60
+ const STATUS_MAP: Record<string, ChangedFileStatus> = {
61
+ A: "added",
62
+ M: "modified",
63
+ D: "deleted",
64
+ R: "renamed",
65
+ };
66
+
67
+ function parseNameStatus(output: string): ChangedFile[] {
68
+ if (output === "") return [];
69
+ const lines = output.split("\n");
70
+ const result: ChangedFile[] = [];
71
+ for (const line of lines) {
72
+ const statusCode = line[0];
73
+ if (statusCode === undefined) continue;
74
+ const baseStatus = statusCode === "R" || statusCode === "C" ? statusCode : statusCode;
75
+ const status = STATUS_MAP[baseStatus] ?? "modified";
76
+ const parts = line.split("\t");
77
+ if (statusCode === "R" || statusCode === "C") {
78
+ const oldPath = parts[1];
79
+ const newPath = parts[2];
80
+ if (oldPath !== undefined && newPath !== undefined) {
81
+ result.push({ path: newPath, status, oldPath });
82
+ }
83
+ } else {
84
+ const filePath = parts[1];
85
+ if (filePath !== undefined) {
86
+ result.push({ path: filePath, status });
87
+ }
88
+ }
89
+ }
90
+ return result;
91
+ }
92
+
93
+ /**
94
+ * List files changed between two refs with rename detection.
95
+ * Returns structured data including status and old path for renames.
96
+ */
97
+ export async function getChangedFilesWithStatus(opts: ChangedFilesOptions): Promise<ChangedFile[]> {
98
+ const base = opts.base ?? "HEAD";
99
+ const args = opts.head !== undefined
100
+ ? ["diff-tree", "--no-commit-id", "--name-status", "-M", "-r", base, opts.head]
101
+ : ["diff-index", "--name-status", "-M", base, "--"];
102
+
103
+ try {
104
+ const output = (await git(opts.git, args, opts.cwd)).trim();
105
+ return parseNameStatus(output);
106
+ } catch (err: unknown) {
107
+ const msg = err instanceof Error ? err.message : String(err);
108
+ throw new GitError(`git diff failed: ${msg}`);
109
+ }
110
+ }
111
+
51
112
  export async function getChangedFiles(opts: ChangedFilesOptions): Promise<string[]> {
52
113
  const base = opts.base ?? "HEAD";
53
114
  const args = opts.head !== undefined
package/src/mcp/burden.ts CHANGED
@@ -15,6 +15,7 @@ const ZERO_BUCKET: BurdenBucket = Object.freeze({ calls: 0, bytesReturned: 0 });
15
15
 
16
16
  const TOOL_BURDEN_KIND: Record<McpToolName, BurdenKind> = {
17
17
  safe_read: "read",
18
+ graft_edit: "state",
18
19
  file_outline: "read",
19
20
  read_range: "read",
20
21
  changed_since: "read",
@@ -31,6 +32,7 @@ const TOOL_BURDEN_KIND: Record<McpToolName, BurdenKind> = {
31
32
  monitor_start: "diagnostic",
32
33
  monitor_pause: "diagnostic",
33
34
  monitor_resume: "diagnostic",
35
+ monitor_nudge: "diagnostic",
34
36
  monitor_stop: "diagnostic",
35
37
  workspace_authorize: "diagnostic",
36
38
  workspace_authorizations: "diagnostic",
@@ -48,6 +50,13 @@ const TOOL_BURDEN_KIND: Record<McpToolName, BurdenKind> = {
48
50
  explain: "diagnostic",
49
51
  doctor: "diagnostic",
50
52
  stats: "diagnostic",
53
+ graft_churn: "search",
54
+ graft_exports: "search",
55
+ graft_log: "search",
56
+ graft_blame: "search",
57
+ graft_difficulty: "search",
58
+ graft_review: "search",
59
+ knowledge_map: "diagnostic",
51
60
  };
52
61
 
53
62
  export function emptyBurdenByKind(): BurdenByKind {
@@ -2,8 +2,7 @@
2
2
  // ToolContext — shared dependencies injected into every tool handler
3
3
  // ---------------------------------------------------------------------------
4
4
 
5
- import * as fs from "node:fs";
6
- import * as path from "node:path";
5
+ import { createRepoPathResolver } from "../adapters/repo-paths.js";
7
6
  import type { ObservationCache } from "./cache.js";
8
7
  import type { Metrics } from "./metrics.js";
9
8
  import type { GovernorTracker } from "../session/tracker.js";
@@ -12,7 +11,7 @@ import type { FileSystem } from "../ports/filesystem.js";
12
11
  import type { JsonCodec } from "../ports/codec.js";
13
12
  import type { ProcessRunner } from "../ports/process-runner.js";
14
13
  import type { GitClient } from "../ports/git.js";
15
- import type { WarpHandle } from "../ports/warp.js";
14
+ import type { WarpContext } from "../warp/context.js";
16
15
  import type { RepoObservation } from "./repo-state.js";
17
16
  import type { RunCaptureConfig } from "./run-capture-config.js";
18
17
  import type { RuntimeObservabilityState, ToolCallFootprintRegion } from "./runtime-observability.js";
@@ -81,7 +80,7 @@ export interface ToolContext {
81
80
  readonly regions?: readonly ToolCallFootprintRegion[];
82
81
  }): void;
83
82
  resolvePath(relative: string): string;
84
- getWarp(): Promise<WarpHandle>;
83
+ getWarp(): Promise<WarpContext>;
85
84
  getRepoState(): RepoObservation;
86
85
  getCausalContext(): RuntimeCausalContext;
87
86
  getWorkspaceOverlayFooting(): Promise<RuntimeWorkspaceOverlayFooting | null>;
@@ -100,6 +99,7 @@ export interface ToolContext {
100
99
  pauseMonitor(request: WorkspaceBindRequest): Promise<MonitorActionResult>;
101
100
  resumeMonitor(request: WorkspaceBindRequest): Promise<MonitorActionResult>;
102
101
  stopMonitor(request: WorkspaceBindRequest): Promise<MonitorActionResult>;
102
+ nudgeMonitor(request: WorkspaceBindRequest): Promise<MonitorActionResult>;
103
103
  listWorkspaceAuthorizations(): Promise<readonly AuthorizedWorkspaceView[]>;
104
104
  authorizeWorkspace(request: WorkspaceAuthorizeRequest): Promise<WorkspaceAuthorizeResult>;
105
105
  revokeWorkspace(request: WorkspaceBindRequest): Promise<WorkspaceRevokeResult>;
@@ -111,44 +111,7 @@ export interface ToolContext {
111
111
  * Symlinks are resolved before the confinement check to prevent escapes.
112
112
  */
113
113
  export function createPathResolver(projectRoot: string): (input: string) => string {
114
- const normalizedRoot = path.resolve(projectRoot);
115
-
116
- // Resolve the project root itself through symlinks for consistent comparison
117
- let realProjectRoot: string;
118
- try {
119
- realProjectRoot = fs.realpathSync(normalizedRoot);
120
- } catch {
121
- realProjectRoot = normalizedRoot;
122
- }
123
-
124
- return (input: string): string => {
125
- // Resolve: absolute paths are taken as-is, relative paths join to projectRoot
126
- const resolved = path.isAbsolute(input)
127
- ? path.resolve(input)
128
- : path.resolve(normalizedRoot, input);
129
-
130
- // Logical confinement check (catches ".." traversal without needing fs access)
131
- const logicalRel = path.relative(normalizedRoot, resolved);
132
- if (logicalRel.startsWith("..") || path.isAbsolute(logicalRel)) {
133
- throw new Error(`Path traversal blocked: ${input}`);
134
- }
135
-
136
- // Resolve symlinks before a second confinement check to prevent symlink escapes
137
- let real: string;
138
- try {
139
- real = fs.realpathSync(resolved);
140
- } catch {
141
- // Target doesn't exist yet — return the logical path (already passed confinement)
142
- return resolved;
143
- }
144
-
145
- // Symlink confinement check: the real path must be within the real project root
146
- const realRel = path.relative(realProjectRoot, real);
147
- if (realRel.startsWith("..") || path.isAbsolute(realRel)) {
148
- throw new Error(`Path traversal blocked: ${input}`);
149
- }
150
- return resolved;
151
- };
114
+ return createRepoPathResolver(projectRoot);
152
115
  }
153
116
 
154
117
  /**
@@ -34,6 +34,8 @@ export interface StartDaemonServerOptions {
34
34
  readonly env?: Readonly<Record<string, string | undefined>> | undefined;
35
35
  readonly runCapture?: Partial<RunCaptureConfig> | undefined;
36
36
  readonly runtimeObservability?: Partial<RuntimeObservabilityState> | undefined;
37
+ readonly workerPoolSize?: number | undefined;
38
+ readonly persistedLocalHistoryGraph?: boolean | undefined;
37
39
  }
38
40
 
39
41
  export interface GraftDaemonServer {
@@ -55,7 +57,9 @@ export async function startDaemonServer(options: StartDaemonServerOptions = {}):
55
57
  graftDir,
56
58
  });
57
59
  const daemonScheduler = new DaemonJobScheduler();
58
- const daemonWorkerPool = new ChildProcessDaemonWorkerPool();
60
+ const daemonWorkerPool = new ChildProcessDaemonWorkerPool({
61
+ ...(options.workerPoolSize !== undefined ? { size: options.workerPoolSize } : {}),
62
+ });
59
63
  const monitorRuntime = new PersistentMonitorRuntime({
60
64
  fs: nodeFs,
61
65
  codec: new CanonicalJsonCodec(),
@@ -103,6 +107,9 @@ export async function startDaemonServer(options: StartDaemonServerOptions = {}):
103
107
  ...(options.runtimeObservability !== undefined
104
108
  ? { runtimeObservability: options.runtimeObservability }
105
109
  : {}),
110
+ ...(options.persistedLocalHistoryGraph !== undefined
111
+ ? { persistedLocalHistoryGraph: options.persistedLocalHistoryGraph }
112
+ : {}),
106
113
  });
107
114
 
108
115
  const httpServer = http.createServer((req, res) => {
@@ -40,6 +40,7 @@ export interface CreateDaemonSessionHostOptions {
40
40
  readonly env?: Readonly<Record<string, string | undefined>> | undefined;
41
41
  readonly runCapture?: Partial<RunCaptureConfig> | undefined;
42
42
  readonly runtimeObservability?: Partial<RuntimeObservabilityState> | undefined;
43
+ readonly persistedLocalHistoryGraph?: boolean | undefined;
43
44
  }
44
45
 
45
46
  export interface DaemonSessionHost {
@@ -125,6 +126,9 @@ async function createDaemonSession(
125
126
  ...(options.runtimeObservability !== undefined
126
127
  ? { runtimeObservability: options.runtimeObservability }
127
128
  : {}),
129
+ ...(options.persistedLocalHistoryGraph !== undefined
130
+ ? { persistedLocalHistoryGraph: options.persistedLocalHistoryGraph }
131
+ : {}),
128
132
  });
129
133
  const session: DaemonSession = {
130
134
  id: newSessionId,
@@ -176,6 +176,7 @@ function internalErrorResponse(
176
176
 
177
177
  export interface StartDaemonBackedStdioBridgeOptions {
178
178
  socketPath?: string;
179
+ spawnIfMissing?: boolean;
179
180
  ensureReady?: ((options?: EnsureDaemonReadyOptions) => Promise<string>) | undefined;
180
181
  }
181
182
 
@@ -184,6 +185,7 @@ export async function startDaemonBackedStdioBridge(
184
185
  ): Promise<void> {
185
186
  const socketPath = await (options.ensureReady ?? ensureDaemonReady)({
186
187
  ...(options.socketPath !== undefined ? { socketPath: options.socketPath } : {}),
188
+ ...(options.spawnIfMissing !== undefined ? { spawnIfMissing: options.spawnIfMissing } : {}),
187
189
  });
188
190
  const stdioTransport = new StdioServerTransport();
189
191
  const daemonTransport = new StreamableHTTPClientTransport(