@flyingrobots/graft 0.6.1 → 0.7.1

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 (665) hide show
  1. package/CHANGELOG.md +148 -0
  2. package/README.md +1 -2
  3. package/bin/graft.js +26 -26
  4. package/dist/adapters/json-text-decoder.d.ts +3 -0
  5. package/dist/adapters/json-text-decoder.d.ts.map +1 -0
  6. package/dist/adapters/json-text-decoder.js +12 -0
  7. package/dist/adapters/json-text-decoder.js.map +1 -0
  8. package/dist/adapters/node-paths.d.ts +3 -0
  9. package/dist/adapters/node-paths.d.ts.map +1 -0
  10. package/dist/adapters/node-paths.js +29 -0
  11. package/dist/adapters/node-paths.js.map +1 -0
  12. package/dist/adapters/repo-paths.d.ts.map +1 -1
  13. package/dist/adapters/repo-paths.js +40 -5
  14. package/dist/adapters/repo-paths.js.map +1 -1
  15. package/dist/api/tool-bridge.d.ts +1 -1
  16. package/dist/api/tool-bridge.d.ts.map +1 -1
  17. package/dist/api/tool-bridge.js +1 -1
  18. package/dist/api/tool-bridge.js.map +1 -1
  19. package/dist/cli/cli-error.d.ts.map +1 -1
  20. package/dist/cli/cli-error.js +47 -10
  21. package/dist/cli/cli-error.js.map +1 -1
  22. package/dist/cli/command-parser.d.ts +12 -3
  23. package/dist/cli/command-parser.d.ts.map +1 -1
  24. package/dist/cli/command-parser.js +161 -2
  25. package/dist/cli/command-parser.js.map +1 -1
  26. package/dist/cli/daemon-status-model.d.ts +87 -0
  27. package/dist/cli/daemon-status-model.d.ts.map +1 -0
  28. package/dist/cli/daemon-status-model.js +142 -0
  29. package/dist/cli/daemon-status-model.js.map +1 -0
  30. package/dist/cli/daemon-status-render.d.ts +3 -0
  31. package/dist/cli/daemon-status-render.d.ts.map +1 -0
  32. package/dist/cli/daemon-status-render.js +100 -0
  33. package/dist/cli/daemon-status-render.js.map +1 -0
  34. package/dist/cli/daemon-status.d.ts +7 -0
  35. package/dist/cli/daemon-status.d.ts.map +1 -0
  36. package/dist/cli/daemon-status.js +79 -0
  37. package/dist/cli/daemon-status.js.map +1 -0
  38. package/dist/cli/git-graft-enhance-model.d.ts +67 -0
  39. package/dist/cli/git-graft-enhance-model.d.ts.map +1 -0
  40. package/dist/cli/git-graft-enhance-model.js +55 -0
  41. package/dist/cli/git-graft-enhance-model.js.map +1 -0
  42. package/dist/cli/git-graft-enhance-render.d.ts +3 -0
  43. package/dist/cli/git-graft-enhance-render.d.ts.map +1 -0
  44. package/dist/cli/git-graft-enhance-render.js +29 -0
  45. package/dist/cli/git-graft-enhance-render.js.map +1 -0
  46. package/dist/cli/git-graft-enhance.d.ts +14 -0
  47. package/dist/cli/git-graft-enhance.d.ts.map +1 -0
  48. package/dist/cli/git-graft-enhance.js +29 -0
  49. package/dist/cli/git-graft-enhance.js.map +1 -0
  50. package/dist/cli/index-cmd.d.ts.map +1 -1
  51. package/dist/cli/index-cmd.js +18 -21
  52. package/dist/cli/index-cmd.js.map +1 -1
  53. package/dist/cli/index-model.d.ts +5 -9
  54. package/dist/cli/index-model.d.ts.map +1 -1
  55. package/dist/cli/index-model.js +20 -18
  56. package/dist/cli/index-model.js.map +1 -1
  57. package/dist/cli/init-client-config.d.ts +12 -7
  58. package/dist/cli/init-client-config.d.ts.map +1 -1
  59. package/dist/cli/init-client-config.js +145 -47
  60. package/dist/cli/init-client-config.js.map +1 -1
  61. package/dist/cli/init-model.d.ts +9 -2
  62. package/dist/cli/init-model.d.ts.map +1 -1
  63. package/dist/cli/init-model.js +54 -6
  64. package/dist/cli/init-model.js.map +1 -1
  65. package/dist/cli/init-render.d.ts.map +1 -1
  66. package/dist/cli/init-render.js +2 -2
  67. package/dist/cli/init-render.js.map +1 -1
  68. package/dist/cli/init.d.ts.map +1 -1
  69. package/dist/cli/init.js +11 -9
  70. package/dist/cli/init.js.map +1 -1
  71. package/dist/cli/json-document.d.ts +6 -0
  72. package/dist/cli/json-document.d.ts.map +1 -1
  73. package/dist/cli/json-document.js +12 -0
  74. package/dist/cli/json-document.js.map +1 -1
  75. package/dist/cli/main.d.ts +7 -0
  76. package/dist/cli/main.d.ts.map +1 -1
  77. package/dist/cli/main.js +49 -7
  78. package/dist/cli/main.js.map +1 -1
  79. package/dist/cli/migrate-local-history.d.ts.map +1 -1
  80. package/dist/cli/migrate-local-history.js +3 -2
  81. package/dist/cli/migrate-local-history.js.map +1 -1
  82. package/dist/cli/peer-command.d.ts +1 -1
  83. package/dist/cli/peer-command.d.ts.map +1 -1
  84. package/dist/cli/peer-command.js +1 -1
  85. package/dist/cli/peer-command.js.map +1 -1
  86. package/dist/contracts/capabilities.d.ts +5 -5
  87. package/dist/contracts/capabilities.d.ts.map +1 -1
  88. package/dist/contracts/capabilities.js +89 -0
  89. package/dist/contracts/capabilities.js.map +1 -1
  90. package/dist/contracts/causal-ontology.d.ts +17 -17
  91. package/dist/contracts/json-object.d.ts +0 -1
  92. package/dist/contracts/json-object.d.ts.map +1 -1
  93. package/dist/contracts/json-object.js +0 -10
  94. package/dist/contracts/json-object.js.map +1 -1
  95. package/dist/contracts/output-schema-cli.d.ts +277 -25
  96. package/dist/contracts/output-schema-cli.d.ts.map +1 -1
  97. package/dist/contracts/output-schema-cli.js +35 -3
  98. package/dist/contracts/output-schema-cli.js.map +1 -1
  99. package/dist/contracts/output-schema-fragments.d.ts +212 -87
  100. package/dist/contracts/output-schema-fragments.d.ts.map +1 -1
  101. package/dist/contracts/output-schema-fragments.js +49 -2
  102. package/dist/contracts/output-schema-fragments.js.map +1 -1
  103. package/dist/contracts/output-schema-mcp.d.ts +372 -47
  104. package/dist/contracts/output-schema-mcp.d.ts.map +1 -1
  105. package/dist/contracts/output-schema-mcp.js +217 -1
  106. package/dist/contracts/output-schema-mcp.js.map +1 -1
  107. package/dist/contracts/output-schema-meta.d.ts +2 -2
  108. package/dist/contracts/output-schema-meta.d.ts.map +1 -1
  109. package/dist/contracts/output-schemas.d.ts +7 -7
  110. package/dist/contracts/output-schemas.d.ts.map +1 -1
  111. package/dist/contracts/output-schemas.js +294 -6
  112. package/dist/contracts/output-schemas.js.map +1 -1
  113. package/dist/git/diff.d.ts +11 -0
  114. package/dist/git/diff.d.ts.map +1 -1
  115. package/dist/git/diff.js +50 -6
  116. package/dist/git/diff.js.map +1 -1
  117. package/dist/hooks/posttooluse-read.js +1 -1
  118. package/dist/hooks/posttooluse-read.js.map +1 -1
  119. package/dist/hooks/pretooluse-read.js +1 -1
  120. package/dist/hooks/pretooluse-read.js.map +1 -1
  121. package/dist/mcp/burden.d.ts.map +1 -1
  122. package/dist/mcp/burden.js +9 -0
  123. package/dist/mcp/burden.js.map +1 -1
  124. package/dist/mcp/context.d.ts +3 -2
  125. package/dist/mcp/context.d.ts.map +1 -1
  126. package/dist/mcp/context.js +2 -37
  127. package/dist/mcp/context.js.map +1 -1
  128. package/dist/mcp/daemon-server.d.ts +2 -0
  129. package/dist/mcp/daemon-server.d.ts.map +1 -1
  130. package/dist/mcp/daemon-server.js +6 -1
  131. package/dist/mcp/daemon-server.js.map +1 -1
  132. package/dist/mcp/daemon-session-host.d.ts +1 -0
  133. package/dist/mcp/daemon-session-host.d.ts.map +1 -1
  134. package/dist/mcp/daemon-session-host.js +3 -0
  135. package/dist/mcp/daemon-session-host.js.map +1 -1
  136. package/dist/mcp/daemon-stdio-bridge.d.ts +1 -0
  137. package/dist/mcp/daemon-stdio-bridge.d.ts.map +1 -1
  138. package/dist/mcp/daemon-stdio-bridge.js +1 -0
  139. package/dist/mcp/daemon-stdio-bridge.js.map +1 -1
  140. package/dist/mcp/daemon-worker-child-pool.d.ts +2 -0
  141. package/dist/mcp/daemon-worker-child-pool.d.ts.map +1 -1
  142. package/dist/mcp/daemon-worker-child-pool.js +10 -3
  143. package/dist/mcp/daemon-worker-child-pool.js.map +1 -1
  144. package/dist/mcp/daemon-worker-pool.d.ts +1 -1
  145. package/dist/mcp/daemon-worker-pool.d.ts.map +1 -1
  146. package/dist/mcp/daemon-worker-pool.js +1 -1
  147. package/dist/mcp/daemon-worker-pool.js.map +1 -1
  148. package/dist/mcp/monitor-tick-job.d.ts +1 -0
  149. package/dist/mcp/monitor-tick-job.d.ts.map +1 -1
  150. package/dist/mcp/monitor-tick-job.js +84 -29
  151. package/dist/mcp/monitor-tick-job.js.map +1 -1
  152. package/dist/mcp/monitor-types.d.ts +1 -1
  153. package/dist/mcp/monitor-types.d.ts.map +1 -1
  154. package/dist/mcp/persisted-local-history-graph.d.ts +2 -2
  155. package/dist/mcp/persisted-local-history-graph.d.ts.map +1 -1
  156. package/dist/mcp/persisted-local-history-graph.js +3 -2
  157. package/dist/mcp/persisted-local-history-graph.js.map +1 -1
  158. package/dist/mcp/persisted-local-history.d.ts +5 -5
  159. package/dist/mcp/persisted-local-history.js +2 -2
  160. package/dist/mcp/persisted-local-history.js.map +1 -1
  161. package/dist/mcp/persistent-monitor-runtime.d.ts +1 -0
  162. package/dist/mcp/persistent-monitor-runtime.d.ts.map +1 -1
  163. package/dist/mcp/persistent-monitor-runtime.js +35 -0
  164. package/dist/mcp/persistent-monitor-runtime.js.map +1 -1
  165. package/dist/mcp/repo-tool-worker-context.d.ts.map +1 -1
  166. package/dist/mcp/repo-tool-worker-context.js +5 -2
  167. package/dist/mcp/repo-tool-worker-context.js.map +1 -1
  168. package/dist/mcp/server-context.d.ts.map +1 -1
  169. package/dist/mcp/server-context.js +13 -0
  170. package/dist/mcp/server-context.js.map +1 -1
  171. package/dist/mcp/server-tool-access.d.ts +1 -1
  172. package/dist/mcp/server-tool-access.d.ts.map +1 -1
  173. package/dist/mcp/server-tool-access.js +3 -1
  174. package/dist/mcp/server-tool-access.js.map +1 -1
  175. package/dist/mcp/server.d.ts +3 -0
  176. package/dist/mcp/server.d.ts.map +1 -1
  177. package/dist/mcp/server.js +5 -3
  178. package/dist/mcp/server.js.map +1 -1
  179. package/dist/mcp/tool-registry.d.ts.map +1 -1
  180. package/dist/mcp/tool-registry.js +18 -0
  181. package/dist/mcp/tool-registry.js.map +1 -1
  182. package/dist/mcp/tools/code-find.d.ts.map +1 -1
  183. package/dist/mcp/tools/code-find.js +20 -0
  184. package/dist/mcp/tools/code-find.js.map +1 -1
  185. package/dist/mcp/tools/code-show.d.ts.map +1 -1
  186. package/dist/mcp/tools/code-show.js +24 -0
  187. package/dist/mcp/tools/code-show.js.map +1 -1
  188. package/dist/mcp/tools/diagnostic-models.d.ts +2 -0
  189. package/dist/mcp/tools/diagnostic-models.d.ts.map +1 -1
  190. package/dist/mcp/tools/doctor.d.ts.map +1 -1
  191. package/dist/mcp/tools/doctor.js +18 -1
  192. package/dist/mcp/tools/doctor.js.map +1 -1
  193. package/dist/mcp/tools/export-surface-diff.d.ts +3 -0
  194. package/dist/mcp/tools/export-surface-diff.d.ts.map +1 -0
  195. package/dist/mcp/tools/export-surface-diff.js +24 -0
  196. package/dist/mcp/tools/export-surface-diff.js.map +1 -0
  197. package/dist/mcp/tools/file-outline.js +1 -1
  198. package/dist/mcp/tools/file-outline.js.map +1 -1
  199. package/dist/mcp/tools/graft-edit.d.ts +3 -0
  200. package/dist/mcp/tools/graft-edit.d.ts.map +1 -0
  201. package/dist/mcp/tools/graft-edit.js +192 -0
  202. package/dist/mcp/tools/graft-edit.js.map +1 -0
  203. package/dist/mcp/tools/knowledge-map.d.ts +3 -0
  204. package/dist/mcp/tools/knowledge-map.d.ts.map +1 -0
  205. package/dist/mcp/tools/knowledge-map.js +31 -0
  206. package/dist/mcp/tools/knowledge-map.js.map +1 -0
  207. package/dist/mcp/tools/monitor-nudge.d.ts +3 -0
  208. package/dist/mcp/tools/monitor-nudge.d.ts.map +1 -0
  209. package/dist/mcp/tools/monitor-nudge.js +17 -0
  210. package/dist/mcp/tools/monitor-nudge.js.map +1 -0
  211. package/dist/mcp/tools/precision-warp.d.ts +3 -3
  212. package/dist/mcp/tools/precision-warp.d.ts.map +1 -1
  213. package/dist/mcp/tools/precision-warp.js +24 -15
  214. package/dist/mcp/tools/precision-warp.js.map +1 -1
  215. package/dist/mcp/tools/refactor-difficulty.d.ts +3 -0
  216. package/dist/mcp/tools/refactor-difficulty.d.ts.map +1 -0
  217. package/dist/mcp/tools/refactor-difficulty.js +36 -0
  218. package/dist/mcp/tools/refactor-difficulty.js.map +1 -0
  219. package/dist/mcp/tools/safe-read.js +2 -2
  220. package/dist/mcp/tools/safe-read.js.map +1 -1
  221. package/dist/mcp/tools/structural-blame.d.ts +3 -0
  222. package/dist/mcp/tools/structural-blame.d.ts.map +1 -0
  223. package/dist/mcp/tools/structural-blame.js +44 -0
  224. package/dist/mcp/tools/structural-blame.js.map +1 -0
  225. package/dist/mcp/tools/structural-churn.d.ts +3 -0
  226. package/dist/mcp/tools/structural-churn.d.ts.map +1 -0
  227. package/dist/mcp/tools/structural-churn.js +28 -0
  228. package/dist/mcp/tools/structural-churn.js.map +1 -0
  229. package/dist/mcp/tools/structural-log.d.ts +3 -0
  230. package/dist/mcp/tools/structural-log.d.ts.map +1 -0
  231. package/dist/mcp/tools/structural-log.js +38 -0
  232. package/dist/mcp/tools/structural-log.js.map +1 -0
  233. package/dist/mcp/tools/structural-review.d.ts +3 -0
  234. package/dist/mcp/tools/structural-review.d.ts.map +1 -0
  235. package/dist/mcp/tools/structural-review.js +55 -0
  236. package/dist/mcp/tools/structural-review.js.map +1 -0
  237. package/dist/mcp/warp-pool.d.ts +4 -4
  238. package/dist/mcp/warp-pool.d.ts.map +1 -1
  239. package/dist/mcp/warp-pool.js.map +1 -1
  240. package/dist/mcp/workspace-router-model.d.ts +2 -2
  241. package/dist/mcp/workspace-router-model.d.ts.map +1 -1
  242. package/dist/mcp/workspace-router-runtime.d.ts +3 -3
  243. package/dist/mcp/workspace-router-runtime.d.ts.map +1 -1
  244. package/dist/mcp/workspace-router-runtime.js +4 -1
  245. package/dist/mcp/workspace-router-runtime.js.map +1 -1
  246. package/dist/mcp/workspace-router.d.ts +3 -2
  247. package/dist/mcp/workspace-router.d.ts.map +1 -1
  248. package/dist/mcp/workspace-router.js +6 -0
  249. package/dist/mcp/workspace-router.js.map +1 -1
  250. package/dist/operations/adaptive-projection.d.ts +22 -0
  251. package/dist/operations/adaptive-projection.d.ts.map +1 -0
  252. package/dist/operations/adaptive-projection.js +36 -0
  253. package/dist/operations/adaptive-projection.js.map +1 -0
  254. package/dist/operations/agent-handoff.d.ts +25 -0
  255. package/dist/operations/agent-handoff.d.ts.map +1 -0
  256. package/dist/operations/agent-handoff.js +36 -0
  257. package/dist/operations/agent-handoff.js.map +1 -0
  258. package/dist/operations/capture-range.d.ts +33 -0
  259. package/dist/operations/capture-range.d.ts.map +1 -0
  260. package/dist/operations/capture-range.js +45 -0
  261. package/dist/operations/capture-range.js.map +1 -0
  262. package/dist/operations/conversation-primer.d.ts +27 -0
  263. package/dist/operations/conversation-primer.d.ts.map +1 -0
  264. package/dist/operations/conversation-primer.js +52 -0
  265. package/dist/operations/conversation-primer.js.map +1 -0
  266. package/dist/operations/cross-session-resume.d.ts +28 -0
  267. package/dist/operations/cross-session-resume.d.ts.map +1 -0
  268. package/dist/operations/cross-session-resume.js +79 -0
  269. package/dist/operations/cross-session-resume.js.map +1 -0
  270. package/dist/operations/deterministic-replay.d.ts +39 -0
  271. package/dist/operations/deterministic-replay.d.ts.map +1 -0
  272. package/dist/operations/deterministic-replay.js +90 -0
  273. package/dist/operations/deterministic-replay.js.map +1 -0
  274. package/dist/operations/export-surface-diff.d.ts +36 -0
  275. package/dist/operations/export-surface-diff.d.ts.map +1 -0
  276. package/dist/operations/export-surface-diff.js +298 -0
  277. package/dist/operations/export-surface-diff.js.map +1 -0
  278. package/dist/operations/footprint-parallelism.d.ts +25 -0
  279. package/dist/operations/footprint-parallelism.d.ts.map +1 -0
  280. package/dist/operations/footprint-parallelism.js +79 -0
  281. package/dist/operations/footprint-parallelism.js.map +1 -0
  282. package/dist/operations/graft-diff.d.ts.map +1 -1
  283. package/dist/operations/graft-diff.js +14 -7
  284. package/dist/operations/graft-diff.js.map +1 -1
  285. package/dist/operations/horizon-of-readability.d.ts +23 -0
  286. package/dist/operations/horizon-of-readability.d.ts.map +1 -0
  287. package/dist/operations/horizon-of-readability.js +39 -0
  288. package/dist/operations/horizon-of-readability.js.map +1 -0
  289. package/dist/operations/import-reference-impact.d.ts +13 -0
  290. package/dist/operations/import-reference-impact.d.ts.map +1 -0
  291. package/dist/operations/import-reference-impact.js +101 -0
  292. package/dist/operations/import-reference-impact.js.map +1 -0
  293. package/dist/operations/knowledge-map.d.ts +30 -0
  294. package/dist/operations/knowledge-map.d.ts.map +1 -0
  295. package/dist/operations/knowledge-map.js +64 -0
  296. package/dist/operations/knowledge-map.js.map +1 -0
  297. package/dist/operations/observation-cache.d.ts +8 -2
  298. package/dist/operations/observation-cache.d.ts.map +1 -1
  299. package/dist/operations/observation-cache.js +17 -5
  300. package/dist/operations/observation-cache.js.map +1 -1
  301. package/dist/operations/projection-safety.d.ts +31 -0
  302. package/dist/operations/projection-safety.d.ts.map +1 -0
  303. package/dist/operations/projection-safety.js +77 -0
  304. package/dist/operations/projection-safety.js.map +1 -0
  305. package/dist/operations/repo-workspace.js +3 -3
  306. package/dist/operations/repo-workspace.js.map +1 -1
  307. package/dist/operations/semantic-drift.d.ts +27 -0
  308. package/dist/operations/semantic-drift.d.ts.map +1 -0
  309. package/dist/operations/semantic-drift.js +46 -0
  310. package/dist/operations/semantic-drift.js.map +1 -0
  311. package/dist/operations/session-filtration.d.ts +36 -0
  312. package/dist/operations/session-filtration.d.ts.map +1 -0
  313. package/dist/operations/session-filtration.js +48 -0
  314. package/dist/operations/session-filtration.js.map +1 -0
  315. package/dist/operations/session-replay.d.ts +17 -0
  316. package/dist/operations/session-replay.d.ts.map +1 -0
  317. package/dist/operations/session-replay.js +59 -0
  318. package/dist/operations/session-replay.js.map +1 -0
  319. package/dist/operations/sludge-detector.d.ts +45 -0
  320. package/dist/operations/sludge-detector.d.ts.map +1 -0
  321. package/dist/operations/sludge-detector.js +278 -0
  322. package/dist/operations/sludge-detector.js.map +1 -0
  323. package/dist/operations/structural-blame.d.ts +67 -0
  324. package/dist/operations/structural-blame.d.ts.map +1 -0
  325. package/dist/operations/structural-blame.js +111 -0
  326. package/dist/operations/structural-blame.js.map +1 -0
  327. package/dist/operations/structural-review.d.ts +47 -0
  328. package/dist/operations/structural-review.d.ts.map +1 -0
  329. package/dist/operations/structural-review.js +225 -0
  330. package/dist/operations/structural-review.js.map +1 -0
  331. package/dist/operations/teaching-hints.d.ts +18 -0
  332. package/dist/operations/teaching-hints.d.ts.map +1 -0
  333. package/dist/operations/teaching-hints.js +35 -0
  334. package/dist/operations/teaching-hints.js.map +1 -0
  335. package/dist/parser/diff.d.ts +2 -0
  336. package/dist/parser/diff.d.ts.map +1 -1
  337. package/dist/parser/diff.js +7 -0
  338. package/dist/parser/diff.js.map +1 -1
  339. package/dist/ports/paths.d.ts +17 -0
  340. package/dist/ports/paths.d.ts.map +1 -0
  341. package/dist/ports/{warp.js → paths.js} +2 -2
  342. package/dist/ports/paths.js.map +1 -0
  343. package/dist/version.d.ts.map +1 -1
  344. package/dist/version.js +3 -1
  345. package/dist/version.js.map +1 -1
  346. package/dist/warp/ast-emitter.d.ts +28 -0
  347. package/dist/warp/ast-emitter.d.ts.map +1 -0
  348. package/dist/warp/ast-emitter.js +90 -0
  349. package/dist/warp/ast-emitter.js.map +1 -0
  350. package/dist/warp/ast-import-resolver.d.ts +13 -0
  351. package/dist/warp/ast-import-resolver.d.ts.map +1 -0
  352. package/dist/warp/ast-import-resolver.js +259 -0
  353. package/dist/warp/ast-import-resolver.js.map +1 -0
  354. package/dist/warp/commit-meta.d.ts +8 -0
  355. package/dist/warp/commit-meta.d.ts.map +1 -0
  356. package/dist/warp/commit-meta.js +13 -0
  357. package/dist/warp/commit-meta.js.map +1 -0
  358. package/dist/warp/context.d.ts +10 -0
  359. package/dist/warp/context.d.ts.map +1 -0
  360. package/dist/warp/context.js +26 -0
  361. package/dist/warp/context.js.map +1 -0
  362. package/dist/warp/dead-symbols.d.ts +40 -0
  363. package/dist/warp/dead-symbols.d.ts.map +1 -0
  364. package/dist/warp/dead-symbols.js +127 -0
  365. package/dist/warp/dead-symbols.js.map +1 -0
  366. package/dist/warp/drift-sentinel.d.ts +30 -0
  367. package/dist/warp/drift-sentinel.d.ts.map +1 -0
  368. package/dist/warp/drift-sentinel.js +65 -0
  369. package/dist/warp/drift-sentinel.js.map +1 -0
  370. package/dist/warp/index-head.d.ts +32 -0
  371. package/dist/warp/index-head.d.ts.map +1 -0
  372. package/dist/warp/index-head.js +245 -0
  373. package/dist/warp/index-head.js.map +1 -0
  374. package/dist/warp/observers.d.ts +6 -6
  375. package/dist/warp/observers.d.ts.map +1 -1
  376. package/dist/warp/observers.js +5 -4
  377. package/dist/warp/observers.js.map +1 -1
  378. package/dist/warp/open.d.ts +5 -4
  379. package/dist/warp/open.d.ts.map +1 -1
  380. package/dist/warp/open.js +24 -49
  381. package/dist/warp/open.js.map +1 -1
  382. package/dist/warp/outline-diff-trailer.d.ts +26 -0
  383. package/dist/warp/outline-diff-trailer.d.ts.map +1 -0
  384. package/dist/warp/outline-diff-trailer.js +68 -0
  385. package/dist/warp/outline-diff-trailer.js.map +1 -0
  386. package/dist/warp/refactor-difficulty.d.ts +38 -0
  387. package/dist/warp/refactor-difficulty.d.ts.map +1 -0
  388. package/dist/warp/refactor-difficulty.js +169 -0
  389. package/dist/warp/refactor-difficulty.js.map +1 -0
  390. package/dist/warp/references.d.ts +22 -0
  391. package/dist/warp/references.d.ts.map +1 -0
  392. package/dist/warp/references.js +57 -0
  393. package/dist/warp/references.js.map +1 -0
  394. package/dist/warp/stale-docs.d.ts +56 -0
  395. package/dist/warp/stale-docs.d.ts.map +1 -0
  396. package/dist/warp/stale-docs.js +149 -0
  397. package/dist/warp/stale-docs.js.map +1 -0
  398. package/dist/warp/structural-drift-detection.d.ts +49 -0
  399. package/dist/warp/structural-drift-detection.d.ts.map +1 -0
  400. package/dist/warp/structural-drift-detection.js +51 -0
  401. package/dist/warp/structural-drift-detection.js.map +1 -0
  402. package/dist/warp/structural-queries.d.ts +49 -0
  403. package/dist/warp/structural-queries.d.ts.map +1 -0
  404. package/dist/warp/structural-queries.js +175 -0
  405. package/dist/warp/structural-queries.js.map +1 -0
  406. package/dist/warp/symbol-timeline.d.ts +34 -0
  407. package/dist/warp/symbol-timeline.d.ts.map +1 -0
  408. package/dist/warp/symbol-timeline.js +127 -0
  409. package/dist/warp/symbol-timeline.js.map +1 -0
  410. package/dist/warp/traverse-hydrate.d.ts +23 -0
  411. package/dist/warp/traverse-hydrate.d.ts.map +1 -0
  412. package/dist/warp/traverse-hydrate.js +39 -0
  413. package/dist/warp/traverse-hydrate.js.map +1 -0
  414. package/dist/warp/warp-reference-count.d.ts +19 -0
  415. package/dist/warp/warp-reference-count.d.ts.map +1 -0
  416. package/dist/warp/warp-reference-count.js +32 -0
  417. package/dist/warp/warp-reference-count.js.map +1 -0
  418. package/dist/warp/warp-structural-blame.d.ts +20 -0
  419. package/dist/warp/warp-structural-blame.d.ts.map +1 -0
  420. package/dist/warp/warp-structural-blame.js +43 -0
  421. package/dist/warp/warp-structural-blame.js.map +1 -0
  422. package/dist/warp/warp-structural-churn.d.ts +30 -0
  423. package/dist/warp/warp-structural-churn.d.ts.map +1 -0
  424. package/dist/warp/warp-structural-churn.js +213 -0
  425. package/dist/warp/warp-structural-churn.js.map +1 -0
  426. package/dist/warp/warp-structural-log.d.ts +35 -0
  427. package/dist/warp/warp-structural-log.d.ts.map +1 -0
  428. package/dist/warp/warp-structural-log.js +104 -0
  429. package/dist/warp/warp-structural-log.js.map +1 -0
  430. package/docs/CLI.md +68 -4
  431. package/docs/MCP.md +23 -0
  432. package/docs/SETUP.md +112 -27
  433. package/package.json +13 -6
  434. package/dist/ports/warp.d.ts +0 -45
  435. package/dist/ports/warp.d.ts.map +0 -1
  436. package/dist/ports/warp.js.map +0 -1
  437. package/dist/warp/identity-resolver.d.ts +0 -14
  438. package/dist/warp/identity-resolver.d.ts.map +0 -1
  439. package/dist/warp/identity-resolver.js +0 -31
  440. package/dist/warp/identity-resolver.js.map +0 -1
  441. package/dist/warp/indexer-git.d.ts +0 -22
  442. package/dist/warp/indexer-git.d.ts.map +0 -1
  443. package/dist/warp/indexer-git.js +0 -148
  444. package/dist/warp/indexer-git.js.map +0 -1
  445. package/dist/warp/indexer-graph.d.ts +0 -17
  446. package/dist/warp/indexer-graph.d.ts.map +0 -1
  447. package/dist/warp/indexer-graph.js +0 -179
  448. package/dist/warp/indexer-graph.js.map +0 -1
  449. package/dist/warp/indexer-model.d.ts +0 -51
  450. package/dist/warp/indexer-model.d.ts.map +0 -1
  451. package/dist/warp/indexer-model.js +0 -21
  452. package/dist/warp/indexer-model.js.map +0 -1
  453. package/dist/warp/indexer.d.ts +0 -9
  454. package/dist/warp/indexer.d.ts.map +0 -1
  455. package/dist/warp/indexer.js +0 -112
  456. package/dist/warp/indexer.js.map +0 -1
  457. package/dist/warp/symbol-identity.d.ts +0 -11
  458. package/dist/warp/symbol-identity.d.ts.map +0 -1
  459. package/dist/warp/symbol-identity.js +0 -67
  460. package/dist/warp/symbol-identity.js.map +0 -1
  461. package/src/adapters/canonical-json.ts +0 -56
  462. package/src/adapters/node-fs.ts +0 -43
  463. package/src/adapters/node-git.ts +0 -47
  464. package/src/adapters/node-process-runner.ts +0 -27
  465. package/src/adapters/repo-paths.ts +0 -22
  466. package/src/adapters/rotating-ndjson-log.ts +0 -66
  467. package/src/api/index.ts +0 -107
  468. package/src/api/repo-local-graft.ts +0 -21
  469. package/src/api/repo-workspace.ts +0 -34
  470. package/src/api/tool-bridge.ts +0 -21
  471. package/src/cli/activity-render.ts +0 -112
  472. package/src/cli/cli-error.ts +0 -153
  473. package/src/cli/command-parser.ts +0 -302
  474. package/src/cli/entrypoint.ts +0 -18
  475. package/src/cli/index-cmd.ts +0 -94
  476. package/src/cli/index-model.ts +0 -76
  477. package/src/cli/init-bootstrap.ts +0 -47
  478. package/src/cli/init-client-config.ts +0 -299
  479. package/src/cli/init-model.ts +0 -229
  480. package/src/cli/init-render.ts +0 -54
  481. package/src/cli/init-target-hooks.ts +0 -93
  482. package/src/cli/init.ts +0 -122
  483. package/src/cli/json-document.ts +0 -144
  484. package/src/cli/local-history-dag-model.ts +0 -437
  485. package/src/cli/local-history-dag-render.ts +0 -133
  486. package/src/cli/local-history-dag.ts +0 -103
  487. package/src/cli/main.ts +0 -150
  488. package/src/cli/migrate-local-history.ts +0 -118
  489. package/src/cli/peer-command.ts +0 -59
  490. package/src/contracts/capabilities.ts +0 -450
  491. package/src/contracts/causal-ontology.ts +0 -627
  492. package/src/contracts/causal-surface-next-action.ts +0 -18
  493. package/src/contracts/json-object.ts +0 -28
  494. package/src/contracts/mcp-runtime.ts +0 -16
  495. package/src/contracts/output-schema-cli.ts +0 -70
  496. package/src/contracts/output-schema-fragments.ts +0 -831
  497. package/src/contracts/output-schema-mcp.ts +0 -282
  498. package/src/contracts/output-schema-meta.ts +0 -119
  499. package/src/contracts/output-schemas.ts +0 -1230
  500. package/src/git/diff.ts +0 -100
  501. package/src/git/target-git-hook-bootstrap.ts +0 -56
  502. package/src/guards/stream-boundary.ts +0 -110
  503. package/src/hooks/posttooluse-read.ts +0 -54
  504. package/src/hooks/pretooluse-read.ts +0 -52
  505. package/src/hooks/read-governor.ts +0 -95
  506. package/src/hooks/read-messages.ts +0 -53
  507. package/src/hooks/shared.ts +0 -168
  508. package/src/index.ts +0 -1
  509. package/src/mcp/burden.ts +0 -123
  510. package/src/mcp/cache.ts +0 -7
  511. package/src/mcp/cached-file.ts +0 -1
  512. package/src/mcp/context.ts +0 -187
  513. package/src/mcp/control-plane/authz-storage.ts +0 -129
  514. package/src/mcp/control-plane/session-registry.ts +0 -115
  515. package/src/mcp/control-plane/status-projection.ts +0 -76
  516. package/src/mcp/control-plane/types.ts +0 -144
  517. package/src/mcp/daemon-bootstrap.ts +0 -100
  518. package/src/mcp/daemon-control-plane.ts +0 -310
  519. package/src/mcp/daemon-job-scheduler.ts +0 -279
  520. package/src/mcp/daemon-repos.ts +0 -99
  521. package/src/mcp/daemon-server.ts +0 -165
  522. package/src/mcp/daemon-session-host.ts +0 -230
  523. package/src/mcp/daemon-stdio-bridge.ts +0 -260
  524. package/src/mcp/daemon-worker-child-pool.ts +0 -213
  525. package/src/mcp/daemon-worker-inline-pool.ts +0 -46
  526. package/src/mcp/daemon-worker-pool.ts +0 -7
  527. package/src/mcp/daemon-worker-process.ts +0 -52
  528. package/src/mcp/daemon-worker-types.ts +0 -66
  529. package/src/mcp/metrics.ts +0 -176
  530. package/src/mcp/monitor-health.ts +0 -83
  531. package/src/mcp/monitor-persistence.ts +0 -54
  532. package/src/mcp/monitor-tick-job.ts +0 -102
  533. package/src/mcp/monitor-types.ts +0 -103
  534. package/src/mcp/persisted-local-history-graph.ts +0 -591
  535. package/src/mcp/persisted-local-history-policy.ts +0 -501
  536. package/src/mcp/persisted-local-history-views.ts +0 -250
  537. package/src/mcp/persisted-local-history.ts +0 -1621
  538. package/src/mcp/persistent-monitor-runtime.ts +0 -445
  539. package/src/mcp/policy.ts +0 -75
  540. package/src/mcp/receipt.ts +0 -201
  541. package/src/mcp/repo-concurrency.ts +0 -392
  542. package/src/mcp/repo-overview/filter.ts +0 -44
  543. package/src/mcp/repo-overview/types.ts +0 -63
  544. package/src/mcp/repo-overview/view-projection.ts +0 -90
  545. package/src/mcp/repo-state-git.ts +0 -247
  546. package/src/mcp/repo-state-observation.ts +0 -203
  547. package/src/mcp/repo-state-transition.ts +0 -151
  548. package/src/mcp/repo-state-types.ts +0 -107
  549. package/src/mcp/repo-state.ts +0 -146
  550. package/src/mcp/repo-tool-job.ts +0 -102
  551. package/src/mcp/repo-tool-worker-context.ts +0 -212
  552. package/src/mcp/repo-workspace.ts +0 -21
  553. package/src/mcp/run-capture-config.ts +0 -33
  554. package/src/mcp/runtime-causal-context.ts +0 -72
  555. package/src/mcp/runtime-observability.ts +0 -217
  556. package/src/mcp/runtime-staged-target.ts +0 -161
  557. package/src/mcp/runtime-workspace-overlay.ts +0 -255
  558. package/src/mcp/secret-scrub.ts +0 -89
  559. package/src/mcp/semantic-transition-guidance.ts +0 -60
  560. package/src/mcp/semantic-transition-summary.ts +0 -130
  561. package/src/mcp/server-context.ts +0 -223
  562. package/src/mcp/server-invocation.ts +0 -388
  563. package/src/mcp/server-tool-access.ts +0 -145
  564. package/src/mcp/server.ts +0 -265
  565. package/src/mcp/stdio-server.ts +0 -26
  566. package/src/mcp/stdio.ts +0 -3
  567. package/src/mcp/tool-registry.ts +0 -80
  568. package/src/mcp/tools/activity-view.ts +0 -325
  569. package/src/mcp/tools/budget.ts +0 -23
  570. package/src/mcp/tools/causal-attach.ts +0 -67
  571. package/src/mcp/tools/causal-status.ts +0 -58
  572. package/src/mcp/tools/changed-since.ts +0 -71
  573. package/src/mcp/tools/code-find.ts +0 -169
  574. package/src/mcp/tools/code-refs.ts +0 -470
  575. package/src/mcp/tools/code-show.ts +0 -262
  576. package/src/mcp/tools/daemon-monitors.ts +0 -14
  577. package/src/mcp/tools/daemon-repos.ts +0 -22
  578. package/src/mcp/tools/daemon-sessions.ts +0 -14
  579. package/src/mcp/tools/daemon-status.ts +0 -12
  580. package/src/mcp/tools/diagnostic-models.ts +0 -95
  581. package/src/mcp/tools/doctor.ts +0 -66
  582. package/src/mcp/tools/explain.ts +0 -84
  583. package/src/mcp/tools/file-outline.ts +0 -67
  584. package/src/mcp/tools/git-files.ts +0 -73
  585. package/src/mcp/tools/graft-diff.ts +0 -35
  586. package/src/mcp/tools/map-collector.ts +0 -338
  587. package/src/mcp/tools/map.ts +0 -185
  588. package/src/mcp/tools/monitor-pause.ts +0 -18
  589. package/src/mcp/tools/monitor-resume.ts +0 -18
  590. package/src/mcp/tools/monitor-start.ts +0 -20
  591. package/src/mcp/tools/monitor-stop.ts +0 -18
  592. package/src/mcp/tools/precision-live.ts +0 -158
  593. package/src/mcp/tools/precision-match.ts +0 -54
  594. package/src/mcp/tools/precision-paths.ts +0 -59
  595. package/src/mcp/tools/precision-query.ts +0 -127
  596. package/src/mcp/tools/precision-show.ts +0 -86
  597. package/src/mcp/tools/precision-visibility.ts +0 -44
  598. package/src/mcp/tools/precision-warp.ts +0 -90
  599. package/src/mcp/tools/precision.ts +0 -21
  600. package/src/mcp/tools/read-range.ts +0 -28
  601. package/src/mcp/tools/run-capture.ts +0 -149
  602. package/src/mcp/tools/safe-read.ts +0 -148
  603. package/src/mcp/tools/since.ts +0 -53
  604. package/src/mcp/tools/state.ts +0 -39
  605. package/src/mcp/tools/stats.ts +0 -24
  606. package/src/mcp/tools/workspace-authorizations.ts +0 -14
  607. package/src/mcp/tools/workspace-authorize.ts +0 -20
  608. package/src/mcp/tools/workspace-bind.ts +0 -25
  609. package/src/mcp/tools/workspace-rebind.ts +0 -25
  610. package/src/mcp/tools/workspace-revoke.ts +0 -18
  611. package/src/mcp/tools/workspace-status.ts +0 -12
  612. package/src/mcp/warp-pool.ts +0 -36
  613. package/src/mcp/workspace-read-observation-model.ts +0 -48
  614. package/src/mcp/workspace-read-observation.ts +0 -103
  615. package/src/mcp/workspace-router-capability.ts +0 -32
  616. package/src/mcp/workspace-router-history.ts +0 -233
  617. package/src/mcp/workspace-router-model.ts +0 -131
  618. package/src/mcp/workspace-router-resolution.ts +0 -71
  619. package/src/mcp/workspace-router-runtime.ts +0 -243
  620. package/src/mcp/workspace-router.ts +0 -681
  621. package/src/metrics/logger.ts +0 -40
  622. package/src/metrics/types.ts +0 -40
  623. package/src/operations/cached-file.ts +0 -40
  624. package/src/operations/diff-identity.ts +0 -127
  625. package/src/operations/file-outline.ts +0 -48
  626. package/src/operations/graft-diff.ts +0 -162
  627. package/src/operations/observation-cache.ts +0 -149
  628. package/src/operations/read-range.ts +0 -64
  629. package/src/operations/repo-workspace.ts +0 -339
  630. package/src/operations/result-dto.ts +0 -23
  631. package/src/operations/safe-read.ts +0 -118
  632. package/src/operations/state.ts +0 -66
  633. package/src/operations/structured-buffer-compare.ts +0 -429
  634. package/src/operations/structured-buffer-model.ts +0 -456
  635. package/src/operations/structured-buffer-query.ts +0 -794
  636. package/src/operations/structured-buffer.ts +0 -181
  637. package/src/parser/diff.ts +0 -313
  638. package/src/parser/lang.ts +0 -71
  639. package/src/parser/markdown.ts +0 -197
  640. package/src/parser/outline.ts +0 -316
  641. package/src/parser/runtime.ts +0 -71
  642. package/src/parser/types.ts +0 -75
  643. package/src/policy/evaluate.ts +0 -178
  644. package/src/policy/graftignore.ts +0 -6
  645. package/src/policy/types.ts +0 -87
  646. package/src/ports/codec.ts +0 -13
  647. package/src/ports/filesystem.ts +0 -18
  648. package/src/ports/git.ts +0 -16
  649. package/src/ports/guards.ts +0 -68
  650. package/src/ports/process-runner.ts +0 -22
  651. package/src/ports/warp.ts +0 -55
  652. package/src/release/security-gate.ts +0 -102
  653. package/src/session/tracker.ts +0 -145
  654. package/src/session/types.ts +0 -23
  655. package/src/version.ts +0 -3
  656. package/src/warp/identity-resolver.ts +0 -35
  657. package/src/warp/indexer-git.ts +0 -182
  658. package/src/warp/indexer-graph.ts +0 -276
  659. package/src/warp/indexer-model.ts +0 -69
  660. package/src/warp/indexer.ts +0 -186
  661. package/src/warp/observers.ts +0 -100
  662. package/src/warp/open.ts +0 -93
  663. package/src/warp/plumbing.d.ts +0 -15
  664. package/src/warp/symbol-identity.ts +0 -100
  665. package/src/warp/writer-id.ts +0 -30
package/src/git/diff.ts DELETED
@@ -1,100 +0,0 @@
1
- import type { GitClient } from "../ports/git.js";
2
-
3
- export interface ChangedFilesOptions {
4
- cwd: string;
5
- git: GitClient;
6
- base?: string | undefined;
7
- head?: string | undefined;
8
- }
9
-
10
- export class GitError extends Error {
11
- constructor(message: string) {
12
- super(message);
13
- this.name = "GitError";
14
- }
15
- }
16
-
17
- async function git(gitClient: GitClient, args: readonly string[], cwd: string): Promise<string> {
18
- const result = await gitClient.run({ args, cwd });
19
- if (result.error !== undefined || result.status !== 0) {
20
- throw result.error ?? new Error(result.stderr.trim() || `git exited with status ${String(result.status)}`);
21
- }
22
- return result.stdout;
23
- }
24
-
25
- async function refExists(ref: string, cwd: string, gitClient: GitClient): Promise<boolean> {
26
- try {
27
- await git(gitClient, ["rev-parse", "--verify", ref], cwd);
28
- return true;
29
- } catch {
30
- return false;
31
- }
32
- }
33
-
34
- async function objectExists(ref: string, filePath: string, cwd: string, gitClient: GitClient): Promise<boolean> {
35
- try {
36
- await git(gitClient, ["cat-file", "-e", `${ref}:${filePath}`], cwd);
37
- return true;
38
- } catch {
39
- return false;
40
- }
41
- }
42
-
43
- /**
44
- * List files changed between two refs, or between a ref and the working tree.
45
- * If head is omitted, diffs against the working tree.
46
- * If both base and head are omitted, diffs HEAD against the working tree.
47
- *
48
- * Throws GitError for invalid refs or non-git directories.
49
- * Returns empty array only when there are genuinely no changes.
50
- */
51
- export async function getChangedFiles(opts: ChangedFilesOptions): Promise<string[]> {
52
- const base = opts.base ?? "HEAD";
53
- const args = opts.head !== undefined
54
- ? ["diff-tree", "--no-commit-id", "--name-only", "-r", base, opts.head]
55
- : ["diff-index", "--name-only", base, "--"];
56
-
57
- try {
58
- const output = (await git(opts.git, args, opts.cwd)).trim();
59
- if (output === "") return [];
60
- return output.split("\n");
61
- } catch (err: unknown) {
62
- const msg = err instanceof Error ? err.message : String(err);
63
- throw new GitError(`git diff failed: ${msg}`);
64
- }
65
- }
66
-
67
- /**
68
- * Get the content of a file at a specific git ref.
69
- * Returns null if the file doesn't exist at that ref (clean absence).
70
- * Throws GitError for invalid refs or git failures.
71
- *
72
- * Uses `git rev-parse --verify` and `git cat-file -e` for stable
73
- * detection — no error message parsing.
74
- */
75
- export async function getFileAtRef(
76
- ref: string,
77
- filePath: string,
78
- opts: {
79
- cwd: string;
80
- git: GitClient;
81
- },
82
- ): Promise<string | null> {
83
- // Validate the ref exists (stable probe, no message parsing)
84
- if (!(await refExists(ref, opts.cwd, opts.git))) {
85
- throw new GitError(`ref does not exist: ${ref}`);
86
- }
87
-
88
- // Check if the object exists at this ref (stable probe)
89
- if (!(await objectExists(ref, filePath, opts.cwd, opts.git))) {
90
- return null; // Clean absence — file not in this ref
91
- }
92
-
93
- // Object exists — read it
94
- try {
95
- return await git(opts.git, ["show", `${ref}:${filePath}`], opts.cwd);
96
- } catch (err: unknown) {
97
- const msg = err instanceof Error ? err.message : String(err);
98
- throw new GitError(`git show ${ref}:${filePath} failed: ${msg}`);
99
- }
100
- }
@@ -1,56 +0,0 @@
1
- import * as path from "node:path";
2
-
3
- export const TARGET_GIT_TRANSITION_HOOKS = [
4
- "post-checkout",
5
- "post-merge",
6
- "post-rewrite",
7
- ] as const;
8
-
9
- export const TARGET_GIT_HOOK_MARKER = "graft-target-repo-git-hook";
10
-
11
- export function resolveGitHooksPath(
12
- worktreeRoot: string,
13
- gitCommonDir: string,
14
- configuredCoreHooksPath: string | null,
15
- ): string {
16
- if (configuredCoreHooksPath === null) {
17
- return path.join(gitCommonDir, "hooks");
18
- }
19
- return path.isAbsolute(configuredCoreHooksPath)
20
- ? configuredCoreHooksPath
21
- : path.resolve(worktreeRoot, configuredCoreHooksPath);
22
- }
23
-
24
- export function isRecognizedTargetGitHook(
25
- content: string,
26
- hookName: (typeof TARGET_GIT_TRANSITION_HOOKS)[number],
27
- ): boolean {
28
- return content.includes(`# ${TARGET_GIT_HOOK_MARKER}:${hookName}`);
29
- }
30
-
31
- export function isTargetGitTransitionHookName(
32
- value: string,
33
- ): value is (typeof TARGET_GIT_TRANSITION_HOOKS)[number] {
34
- return TARGET_GIT_TRANSITION_HOOKS.includes(value as (typeof TARGET_GIT_TRANSITION_HOOKS)[number]);
35
- }
36
-
37
- export function buildTargetGitHookScript(
38
- hookName: (typeof TARGET_GIT_TRANSITION_HOOKS)[number],
39
- ): string {
40
- return [
41
- "#!/bin/sh",
42
- `# ${TARGET_GIT_HOOK_MARKER}:${hookName}`,
43
- "set -eu",
44
- "GRAFT_WORKTREE_ROOT=\"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\"",
45
- "node -e '",
46
- "const fs = require(\"node:fs\");",
47
- "const path = require(\"node:path\");",
48
- "const [hookName, worktreeRoot, ...hookArgs] = process.argv.slice(1);",
49
- "const runtimeDir = path.join(worktreeRoot, \".graft\", \"runtime\");",
50
- "fs.mkdirSync(runtimeDir, { recursive: true });",
51
- "const event = { hookName, hookArgs, worktreeRoot, observedAt: new Date().toISOString() };",
52
- "fs.appendFileSync(path.join(runtimeDir, \"git-transitions.ndjson\"), JSON.stringify(event) + \"\\n\");",
53
- `' "${hookName}" "$GRAFT_WORKTREE_ROOT" "$@"`,
54
- "",
55
- ].join("\n");
56
- }
@@ -1,110 +0,0 @@
1
- // ---------------------------------------------------------------------------
2
- // Stream/Port boundary guards — enforce the Two-Case Rule at runtime
3
- // ---------------------------------------------------------------------------
4
- //
5
- // Law: Streams explore. Ports decide.
6
- //
7
- // Ports return bounded artifacts (Promise<T>). Streams return
8
- // unbounded traversals (AsyncIterable<T>). These two shapes MUST
9
- // NOT cross. A port that returns a stream is a lie. A stream that
10
- // returns a single value is a waste.
11
- //
12
- // These guards make violations throw, not silently misbehave.
13
- // ---------------------------------------------------------------------------
14
-
15
- /**
16
- * Returns true if the value implements the async iterable protocol.
17
- */
18
- export function isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {
19
- return (
20
- value !== null &&
21
- typeof value === "object" &&
22
- typeof (value as Record<symbol, unknown>)[Symbol.asyncIterator] === "function"
23
- );
24
- }
25
-
26
- /**
27
- * Throws if the value is an AsyncIterable. Use at port return boundaries
28
- * to prevent streams from leaking into persistence layers.
29
- *
30
- * @param value - The value to check
31
- * @param context - Description of where the check is (e.g. "FileSystem.readFile()")
32
- */
33
- export function assertNotStream(value: unknown, context: string): void {
34
- if (isAsyncIterable(value)) {
35
- throw new TypeError(
36
- `${context} produced a stream where a bounded value was required. ` +
37
- `Ports return artifacts, not traversals.`,
38
- );
39
- }
40
- }
41
-
42
- /**
43
- * Throws if the value is NOT an AsyncIterable. Use at stream transform
44
- * entry points to prevent bounded values from entering traversal pipelines.
45
- *
46
- * @param value - The value to check
47
- * @param context - Description of where the check is (e.g. "BlobWriteTransform.apply()")
48
- */
49
- export function assertStream(value: unknown, context: string): asserts value is AsyncIterable<unknown> {
50
- if (!isAsyncIterable(value)) {
51
- const actual = value === null ? "null"
52
- : Array.isArray(value) ? "Array"
53
- : typeof value;
54
- throw new TypeError(
55
- `${context} expected AsyncIterable but received ${actual}. ` +
56
- `Streams traverse, they do not materialize.`,
57
- );
58
- }
59
- }
60
-
61
- /**
62
- * Wraps a port method to guard its return value against accidental streams.
63
- * Use this to retrofit existing ports without modifying their interfaces.
64
- *
65
- * @param portName - Name of the port class (for error messages)
66
- * @param methodName - Name of the method being guarded
67
- * @param fn - The original method
68
- */
69
- export function guardPortReturn<TArgs extends unknown[], TReturn>(
70
- portName: string,
71
- methodName: string,
72
- fn: (...args: TArgs) => Promise<TReturn>,
73
- ): (...args: TArgs) => Promise<TReturn> {
74
- return async (...args: TArgs): Promise<TReturn> => {
75
- const result = await fn(...args);
76
- assertNotStream(result, `${portName}.${methodName}()`);
77
- return result;
78
- };
79
- }
80
-
81
- /**
82
- * Wraps an entire port interface via Proxy. Every method call is
83
- * intercepted: if the return is a Promise, it's awaited and checked
84
- * with assertNotStream. Synchronous returns are checked directly.
85
- *
86
- * One line to guard a whole port instead of per-method wiring.
87
- *
88
- * @param portName - Name of the port (for error messages)
89
- * @param port - The port instance to guard
90
- */
91
- export function guardedPort<T extends object>(portName: string, port: T): T {
92
- return new Proxy(port, {
93
- get(target: T, prop: string | symbol, receiver: unknown): unknown {
94
- const value = Reflect.get(target, prop, receiver) as unknown;
95
- if (typeof value !== "function") return value;
96
- const methodName = typeof prop === "symbol" ? prop.toString() : prop;
97
- return function (this: unknown, ...args: unknown[]): unknown {
98
- const result = (value as (...a: unknown[]) => unknown).apply(target, args);
99
- if (result instanceof Promise) {
100
- return result.then((resolved: unknown) => {
101
- assertNotStream(resolved, `${portName}.${methodName}()`);
102
- return resolved;
103
- });
104
- }
105
- assertNotStream(result, `${portName}.${methodName}()`);
106
- return result;
107
- };
108
- },
109
- });
110
- }
@@ -1,54 +0,0 @@
1
- // ---------------------------------------------------------------------------
2
- // PostToolUse hook for Read — educates the agent on context cost
3
- // ---------------------------------------------------------------------------
4
- //
5
- // After a Read completes, evaluates whether a large JS/TS file bypassed
6
- // graft's governed path and tells the agent the cost difference.
7
- // Does not block — just feedback.
8
- //
9
- // The agent sees messages like:
10
- // "[graft] This large code read bypassed graft's governed path ...
11
- // safe_read would have returned a 2KB outline, saving 16KB."
12
- //
13
- // This teaches the agent to prefer graft's MCP tools voluntarily.
14
- //
15
- // Invoked as: node --import tsx src/hooks/posttooluse-read.ts
16
- // Receives JSON on stdin from Claude Code hooks system.
17
- // ---------------------------------------------------------------------------
18
- import { HookInput, HookOutput, runHook } from "./shared.js";
19
- import { renderOversizedReadEducation } from "./read-messages.js";
20
- import {
21
- inspectHookRead,
22
- } from "./read-governor.js";
23
-
24
- export { HookInput, HookOutput };
25
-
26
- export async function handlePostReadHook(input: HookInput): Promise<HookOutput> {
27
- const inspection = inspectHookRead(input);
28
- if (!inspection?.isGovernedCodeRead()) {
29
- return new HookOutput(0, "");
30
- }
31
-
32
- const { extractOutlineForFile } = await import("../parser/outline.js");
33
- const outline = extractOutlineForFile(
34
- inspection.absolutePath,
35
- inspection.rawContent,
36
- );
37
- if (outline === null) {
38
- return new HookOutput(0, "");
39
- }
40
-
41
- const { CanonicalJsonCodec } = await import("../adapters/canonical-json.js");
42
- const codec = new CanonicalJsonCodec();
43
- const outlineBytes = Buffer.byteLength(codec.encode(outline), "utf-8");
44
- return new HookOutput(
45
- 0,
46
- renderOversizedReadEducation(inspection, outlineBytes),
47
- );
48
- }
49
-
50
- // ---------------------------------------------------------------------------
51
- // Script entry point — exit 0 on failure, never block on post-hook errors
52
- // ---------------------------------------------------------------------------
53
-
54
- runHook(handlePostReadHook, 0);
@@ -1,52 +0,0 @@
1
- // ---------------------------------------------------------------------------
2
- // PreToolUse hook for Read — blocks banned files and redirects large code reads
3
- // ---------------------------------------------------------------------------
4
- //
5
- // Intercepts Claude Code's Read tool and evaluates graft policy:
6
- // - Refused (banned file): exit 2 — hard block with refusal reason
7
- // - Oversized JS/TS file: exit 2 — redirect to graft's bounded-read path
8
- // - Everything else: exit 0 — let native Read proceed
9
- //
10
- // Banned files (.env, binaries, lockfiles, minified, build output,
11
- // .graftignore matches) stay hard blocks. Large JS/TS files now route
12
- // through graft's governed path before native Read can dump them into
13
- // context. PostToolUse remains a backstop if an oversized code read
14
- // still slips through.
15
- //
16
- // Invoked as: node --import tsx src/hooks/pretooluse-read.ts
17
- // Receives JSON on stdin from Claude Code hooks system.
18
- // ---------------------------------------------------------------------------
19
- import { RefusedResult } from "../policy/types.js";
20
- import {
21
- renderGovernedReadRedirect,
22
- renderRefusedReadMessage,
23
- } from "./read-messages.js";
24
- import {
25
- inspectHookRead,
26
- } from "./read-governor.js";
27
- import { HookInput, HookOutput, runHook } from "./shared.js";
28
-
29
- export { HookInput, HookOutput };
30
-
31
- export function handleReadHook(input: HookInput): HookOutput {
32
- const inspection = inspectHookRead(input);
33
- if (inspection === null) {
34
- return new HookOutput(0, "");
35
- }
36
-
37
- if (inspection.policy instanceof RefusedResult) {
38
- return new HookOutput(2, renderRefusedReadMessage(inspection.policy));
39
- }
40
-
41
- if (inspection.isGovernedCodeRead()) {
42
- return new HookOutput(2, renderGovernedReadRedirect(inspection));
43
- }
44
-
45
- return new HookOutput(0, "");
46
- }
47
-
48
- // ---------------------------------------------------------------------------
49
- // Script entry point — exit 2 on failure to block unsafe reads
50
- // ---------------------------------------------------------------------------
51
-
52
- runHook(handleReadHook, 2);
@@ -1,95 +0,0 @@
1
- import * as fs from "node:fs";
2
- import * as path from "node:path";
3
- import type { SupportedLang } from "../parser/lang.js";
4
- import { detectLang } from "../parser/lang.js";
5
- import { evaluatePolicy } from "../policy/evaluate.js";
6
- import type { PolicyResult } from "../policy/types.js";
7
- import { loadGraftignore } from "../policy/graftignore.js";
8
- import { HookInput, safeRelativePath } from "./shared.js";
9
-
10
- export class HookReadInspection {
11
- readonly absolutePath: string;
12
- readonly relativePath: string;
13
- readonly rawContent: string;
14
- readonly lines: number;
15
- readonly bytes: number;
16
- readonly lang: SupportedLang | null;
17
- readonly policy: PolicyResult;
18
-
19
- constructor(opts: {
20
- absolutePath: string;
21
- relativePath: string;
22
- rawContent: string;
23
- lines: number;
24
- bytes: number;
25
- lang: SupportedLang | null;
26
- policy: PolicyResult;
27
- }) {
28
- if (opts.absolutePath.length === 0) {
29
- throw new Error("HookReadInspection: absolutePath must be non-empty");
30
- }
31
- if (opts.relativePath.length === 0) {
32
- throw new Error("HookReadInspection: relativePath must be non-empty");
33
- }
34
- if (opts.lines < 0) {
35
- throw new Error("HookReadInspection: lines must be non-negative");
36
- }
37
- if (opts.bytes < 0) {
38
- throw new Error("HookReadInspection: bytes must be non-negative");
39
- }
40
-
41
- this.absolutePath = opts.absolutePath;
42
- this.relativePath = opts.relativePath;
43
- this.rawContent = opts.rawContent;
44
- this.lines = opts.lines;
45
- this.bytes = opts.bytes;
46
- this.lang = opts.lang;
47
- this.policy = opts.policy;
48
- Object.freeze(this);
49
- }
50
-
51
- isGovernedCodeRead(): boolean {
52
- return this.lang !== null && this.policy.projection === "outline";
53
- }
54
- }
55
-
56
- function loadGraftignorePatterns(cwd: string): string[] | undefined {
57
- try {
58
- const ignoreFile = fs.readFileSync(path.join(cwd, ".graftignore"), "utf-8");
59
- return loadGraftignore(ignoreFile);
60
- } catch {
61
- return undefined;
62
- }
63
- }
64
-
65
- export function inspectHookRead(input: HookInput): HookReadInspection | null {
66
- const absolutePath = input.tool_input.file_path;
67
- const relativePath = safeRelativePath(input.cwd, absolutePath);
68
- if (relativePath === null) {
69
- return null;
70
- }
71
-
72
- let rawContent: string;
73
- try {
74
- rawContent = fs.readFileSync(absolutePath, "utf-8");
75
- } catch {
76
- return null;
77
- }
78
-
79
- const lines = rawContent.split("\n").length;
80
- const bytes = Buffer.byteLength(rawContent, "utf-8");
81
- const policy = evaluatePolicy(
82
- { path: relativePath, lines, bytes },
83
- { graftignorePatterns: loadGraftignorePatterns(input.cwd) },
84
- );
85
-
86
- return new HookReadInspection({
87
- absolutePath,
88
- relativePath,
89
- rawContent,
90
- lines,
91
- bytes,
92
- lang: detectLang(absolutePath),
93
- policy,
94
- });
95
- }
@@ -1,53 +0,0 @@
1
- import { STATIC_THRESHOLDS } from "../policy/evaluate.js";
2
- import { RefusedResult } from "../policy/types.js";
3
- import { HookReadInspection } from "./read-governor.js";
4
-
5
- function formatKilobytes(bytes: number): string {
6
- return (bytes / 1024).toFixed(1);
7
- }
8
-
9
- export function renderRefusedReadMessage(policy: RefusedResult): string {
10
- const nextSteps = policy.next.map((step) => ` - ${step}`).join("\n");
11
- return [
12
- `[graft] Refused: ${policy.reason}`,
13
- policy.reasonDetail,
14
- "",
15
- "Next steps:",
16
- nextSteps,
17
- "",
18
- "Graft tools: use file_outline to see the file's structure,",
19
- "or safe_read for a policy-aware read with caching.",
20
- ].join("\n");
21
- }
22
-
23
- export function renderGovernedReadRedirect(
24
- inspection: HookReadInspection,
25
- ): string {
26
- return [
27
- `[graft] Governed read: ${inspection.relativePath}`,
28
- `Native Read would dump ${String(inspection.lines)} lines (${formatKilobytes(inspection.bytes)}KB) into context.`,
29
- "This large JS/TS file should go through graft's bounded-read path instead.",
30
- "",
31
- "Next steps:",
32
- ` - Call safe_read on ${inspection.relativePath}`,
33
- " - Use read_range with jump table entries for the exact region you need",
34
- " - Use file_outline if you only need symbol structure",
35
- "",
36
- `Threshold: ${String(STATIC_THRESHOLDS.lines)} lines / ${String(STATIC_THRESHOLDS.bytes / 1024)}KB.`,
37
- ].join("\n");
38
- }
39
-
40
- export function renderOversizedReadEducation(
41
- inspection: HookReadInspection,
42
- outlineBytes: number,
43
- ): string {
44
- const savedBytes = inspection.bytes - outlineBytes;
45
- return [
46
- `[graft] This large code read bypassed graft's governed path for ${inspection.relativePath}.`,
47
- `safe_read would have returned a structural outline (${String(outlineBytes)} bytes) instead of ${String(inspection.lines)} lines (${formatKilobytes(inspection.bytes)}KB),`,
48
- `saving ${formatKilobytes(savedBytes)}KB of context. Threshold: ${String(STATIC_THRESHOLDS.lines)} lines / ${String(STATIC_THRESHOLDS.bytes / 1024)}KB.`,
49
- "",
50
- "If this was unexpected, verify the Claude PreToolUse hook is installed and active.",
51
- "Use read_range with jump table entries after safe_read for targeted follow-up.",
52
- ].join("\n");
53
- }
@@ -1,168 +0,0 @@
1
- // ---------------------------------------------------------------------------
2
- // Shared utilities for Claude Code hooks
3
- // ---------------------------------------------------------------------------
4
-
5
- import * as path from "node:path";
6
-
7
- /** Maximum stdin bytes before rejecting (1 MB — generous for JSON). */
8
- const MAX_STDIN_BYTES = 1_048_576;
9
-
10
- export class HookInput {
11
- readonly session_id: string;
12
- readonly cwd: string;
13
- readonly hook_event_name: string;
14
- readonly tool_name: string;
15
- readonly tool_input: {
16
- readonly file_path: string;
17
- readonly offset?: number;
18
- readonly limit?: number;
19
- };
20
- readonly tool_result?: string;
21
-
22
- constructor(opts: {
23
- session_id: string;
24
- cwd: string;
25
- hook_event_name: string;
26
- tool_name: string;
27
- tool_input: { file_path: string; offset?: number; limit?: number };
28
- tool_result?: string;
29
- }) {
30
- if (opts.session_id.length === 0) {
31
- throw new Error("HookInput: session_id must be non-empty");
32
- }
33
- if (opts.cwd.length === 0) {
34
- throw new Error("HookInput: cwd must be non-empty");
35
- }
36
- if (opts.tool_input.file_path.length === 0) {
37
- throw new Error("HookInput: tool_input.file_path must be non-empty");
38
- }
39
- this.session_id = opts.session_id;
40
- this.cwd = opts.cwd;
41
- this.hook_event_name = opts.hook_event_name;
42
- this.tool_name = opts.tool_name;
43
- this.tool_input = Object.freeze({ ...opts.tool_input });
44
- if (opts.tool_result !== undefined) this.tool_result = opts.tool_result;
45
- Object.freeze(this);
46
- }
47
- }
48
-
49
- export class HookOutput {
50
- readonly exitCode: number;
51
- readonly stderr: string;
52
-
53
- constructor(exitCode: number, stderr: string) {
54
- this.exitCode = exitCode;
55
- this.stderr = stderr;
56
- Object.freeze(this);
57
- }
58
- }
59
-
60
- /**
61
- * Reads stdin with a size guard. Throws if input exceeds MAX_STDIN_BYTES.
62
- * Accumulates raw buffers to avoid corrupting multi-byte UTF-8 characters
63
- * that may be split across chunk boundaries.
64
- */
65
- export async function readStdin(): Promise<string> {
66
- const chunks: Buffer[] = [];
67
- let totalBytes = 0;
68
- for await (const chunk of process.stdin) {
69
- const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk), "utf-8");
70
- totalBytes += buf.length;
71
- if (totalBytes > MAX_STDIN_BYTES) {
72
- throw new Error(
73
- `stdin exceeded ${String(MAX_STDIN_BYTES)} bytes — aborting`,
74
- );
75
- }
76
- chunks.push(buf);
77
- }
78
- return Buffer.concat(chunks).toString("utf-8");
79
- }
80
-
81
- /**
82
- * Parses and validates hook input from a raw JSON string.
83
- * Returns a frozen HookInput instance.
84
- */
85
- export function parseHookInput(raw: string): HookInput {
86
- const parsed: unknown = JSON.parse(raw);
87
- if (typeof parsed !== "object" || parsed === null) {
88
- throw new Error("Hook input must be a JSON object");
89
- }
90
-
91
- const obj = parsed as Record<string, unknown>;
92
-
93
- const sessionId = obj["session_id"];
94
- if (typeof sessionId !== "string") {
95
- throw new Error("Hook input missing session_id");
96
- }
97
-
98
- const cwd = obj["cwd"];
99
- if (typeof cwd !== "string") {
100
- throw new Error("Hook input missing cwd");
101
- }
102
-
103
- const rawToolInput = obj["tool_input"];
104
- if (typeof rawToolInput !== "object" || rawToolInput === null) {
105
- throw new Error("Hook input missing tool_input");
106
- }
107
- const toolInput = rawToolInput as Record<string, unknown>;
108
-
109
- const filePath = toolInput["file_path"];
110
- if (typeof filePath !== "string") {
111
- throw new Error("Hook input missing tool_input.file_path");
112
- }
113
-
114
- const hookEventName = obj["hook_event_name"];
115
- const toolName = obj["tool_name"];
116
- const toolResult = obj["tool_result"];
117
- const offset = toolInput["offset"];
118
- const limit = toolInput["limit"];
119
-
120
- return new HookInput({
121
- session_id: sessionId,
122
- cwd,
123
- hook_event_name: typeof hookEventName === "string" ? hookEventName : "",
124
- tool_name: typeof toolName === "string" ? toolName : "",
125
- tool_input: {
126
- file_path: filePath,
127
- ...(typeof offset === "number" ? { offset } : {}),
128
- ...(typeof limit === "number" ? { limit } : {}),
129
- },
130
- ...(typeof toolResult === "string" ? { tool_result: toolResult } : {}),
131
- });
132
- }
133
-
134
- /**
135
- * Returns a cwd-relative path, or null if the path is outside the cwd.
136
- * Prevents path traversal attacks and handles the path.relative() edge case
137
- * where paths outside cwd produce absolute or '../' prefixed results.
138
- */
139
- export function safeRelativePath(cwd: string, filePath: string): string | null {
140
- const rel = path.relative(cwd, filePath);
141
- if (rel.startsWith("..") || path.isAbsolute(rel)) {
142
- return null;
143
- }
144
- return rel;
145
- }
146
-
147
- /**
148
- * Wraps a hook's main function with stdin reading, input parsing,
149
- * and error handling. Logs full stack traces on failure.
150
- */
151
- export function runHook(
152
- handler: (input: HookInput) => HookOutput | Promise<HookOutput>,
153
- failExitCode: number,
154
- ): void {
155
- const run = async (): Promise<void> => {
156
- const raw = await readStdin();
157
- const input = parseHookInput(raw);
158
- const output = await handler(input);
159
- if (output.stderr.length > 0) process.stderr.write(output.stderr);
160
- process.exit(output.exitCode);
161
- };
162
-
163
- run().catch((err: unknown) => {
164
- const detail = err instanceof Error ? (err.stack ?? err.message) : String(err);
165
- process.stderr.write(`[graft] Hook error: ${detail}`);
166
- process.exit(failExitCode);
167
- });
168
- }
package/src/index.ts DELETED
@@ -1 +0,0 @@
1
- export * from "./api/index.js";