agent-bober 0.12.0 → 0.17.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 (726) hide show
  1. package/.claude-plugin/marketplace.json +20 -0
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/CHANGELOG.md +243 -0
  4. package/README.md +238 -5
  5. package/agents/bober-architect.md +72 -0
  6. package/agents/bober-code-reviewer.md +238 -0
  7. package/agents/bober-curator.md +49 -0
  8. package/agents/bober-deployer.md +267 -0
  9. package/agents/bober-diagnoser.md +289 -0
  10. package/agents/bober-documenter.md +129 -0
  11. package/agents/bober-evaluator.md +135 -1
  12. package/agents/bober-generator.md +80 -3
  13. package/agents/bober-planner.md +47 -1
  14. package/agents/bober-postmortemer.md +185 -0
  15. package/agents/bober-researcher.md +38 -0
  16. package/dist/cli/commands/approve.d.ts +17 -0
  17. package/dist/cli/commands/approve.d.ts.map +1 -0
  18. package/dist/cli/commands/approve.js +64 -0
  19. package/dist/cli/commands/approve.js.map +1 -0
  20. package/dist/cli/commands/audit-show.d.ts +14 -0
  21. package/dist/cli/commands/audit-show.d.ts.map +1 -0
  22. package/dist/cli/commands/audit-show.js +85 -0
  23. package/dist/cli/commands/audit-show.js.map +1 -0
  24. package/dist/cli/commands/config.d.ts +10 -0
  25. package/dist/cli/commands/config.d.ts.map +1 -0
  26. package/dist/cli/commands/config.js +73 -0
  27. package/dist/cli/commands/config.js.map +1 -0
  28. package/dist/cli/commands/graph.d.ts +8 -0
  29. package/dist/cli/commands/graph.d.ts.map +1 -0
  30. package/dist/cli/commands/graph.js +219 -0
  31. package/dist/cli/commands/graph.js.map +1 -0
  32. package/dist/cli/commands/impact.d.ts +19 -0
  33. package/dist/cli/commands/impact.d.ts.map +1 -0
  34. package/dist/cli/commands/impact.js +191 -0
  35. package/dist/cli/commands/impact.js.map +1 -0
  36. package/dist/cli/commands/incident.d.ts +19 -0
  37. package/dist/cli/commands/incident.d.ts.map +1 -0
  38. package/dist/cli/commands/incident.js +324 -0
  39. package/dist/cli/commands/incident.js.map +1 -0
  40. package/dist/cli/commands/init.js +40 -1
  41. package/dist/cli/commands/init.js.map +1 -1
  42. package/dist/cli/commands/list-approvals.d.ts +16 -0
  43. package/dist/cli/commands/list-approvals.d.ts.map +1 -0
  44. package/dist/cli/commands/list-approvals.js +57 -0
  45. package/dist/cli/commands/list-approvals.js.map +1 -0
  46. package/dist/cli/commands/memory.d.ts +14 -0
  47. package/dist/cli/commands/memory.d.ts.map +1 -0
  48. package/dist/cli/commands/memory.js +132 -0
  49. package/dist/cli/commands/memory.js.map +1 -0
  50. package/dist/cli/commands/onboard.d.ts +3 -0
  51. package/dist/cli/commands/onboard.d.ts.map +1 -0
  52. package/dist/cli/commands/onboard.js +190 -0
  53. package/dist/cli/commands/onboard.js.map +1 -0
  54. package/dist/cli/commands/playbook.d.ts +17 -0
  55. package/dist/cli/commands/playbook.d.ts.map +1 -0
  56. package/dist/cli/commands/playbook.js +123 -0
  57. package/dist/cli/commands/playbook.js.map +1 -0
  58. package/dist/cli/commands/postmortem.d.ts +12 -0
  59. package/dist/cli/commands/postmortem.d.ts.map +1 -0
  60. package/dist/cli/commands/postmortem.js +67 -0
  61. package/dist/cli/commands/postmortem.js.map +1 -0
  62. package/dist/cli/commands/reject.d.ts +17 -0
  63. package/dist/cli/commands/reject.d.ts.map +1 -0
  64. package/dist/cli/commands/reject.js +52 -0
  65. package/dist/cli/commands/reject.js.map +1 -0
  66. package/dist/cli/commands/rollback.d.ts +21 -0
  67. package/dist/cli/commands/rollback.d.ts.map +1 -0
  68. package/dist/cli/commands/rollback.js +90 -0
  69. package/dist/cli/commands/rollback.js.map +1 -0
  70. package/dist/cli/commands/run.d.ts +9 -0
  71. package/dist/cli/commands/run.d.ts.map +1 -1
  72. package/dist/cli/commands/run.js +29 -0
  73. package/dist/cli/commands/run.js.map +1 -1
  74. package/dist/cli/commands/telemetry.d.ts +16 -0
  75. package/dist/cli/commands/telemetry.d.ts.map +1 -0
  76. package/dist/cli/commands/telemetry.js +152 -0
  77. package/dist/cli/commands/telemetry.js.map +1 -0
  78. package/dist/cli/commands/worktree.d.ts +12 -0
  79. package/dist/cli/commands/worktree.d.ts.map +1 -0
  80. package/dist/cli/commands/worktree.js +57 -0
  81. package/dist/cli/commands/worktree.js.map +1 -0
  82. package/dist/cli/index.js +56 -0
  83. package/dist/cli/index.js.map +1 -1
  84. package/dist/config/defaults.d.ts.map +1 -1
  85. package/dist/config/defaults.js +41 -3
  86. package/dist/config/defaults.js.map +1 -1
  87. package/dist/config/index.d.ts +1 -1
  88. package/dist/config/index.d.ts.map +1 -1
  89. package/dist/config/index.js +4 -0
  90. package/dist/config/index.js.map +1 -1
  91. package/dist/config/loader.d.ts.map +1 -1
  92. package/dist/config/loader.js +25 -1
  93. package/dist/config/loader.js.map +1 -1
  94. package/dist/config/role-providers.d.ts +29 -0
  95. package/dist/config/role-providers.d.ts.map +1 -0
  96. package/dist/config/role-providers.js +115 -0
  97. package/dist/config/role-providers.js.map +1 -0
  98. package/dist/config/schema.d.ts +1350 -61
  99. package/dist/config/schema.d.ts.map +1 -1
  100. package/dist/config/schema.js +189 -0
  101. package/dist/config/schema.js.map +1 -1
  102. package/dist/contracts/eval-result.d.ts +112 -56
  103. package/dist/contracts/eval-result.d.ts.map +1 -1
  104. package/dist/contracts/eval-result.js +3 -0
  105. package/dist/contracts/eval-result.js.map +1 -1
  106. package/dist/contracts/sprint-contract.d.ts +30 -30
  107. package/dist/fleet/aggregator.d.ts +5 -0
  108. package/dist/fleet/aggregator.d.ts.map +1 -0
  109. package/dist/fleet/aggregator.js +39 -0
  110. package/dist/fleet/aggregator.js.map +1 -0
  111. package/dist/fleet/child-config.d.ts +12 -0
  112. package/dist/fleet/child-config.d.ts.map +1 -0
  113. package/dist/fleet/child-config.js +38 -0
  114. package/dist/fleet/child-config.js.map +1 -0
  115. package/dist/fleet/coordinator.d.ts +25 -0
  116. package/dist/fleet/coordinator.d.ts.map +1 -0
  117. package/dist/fleet/coordinator.js +40 -0
  118. package/dist/fleet/coordinator.js.map +1 -0
  119. package/dist/fleet/index.d.ts +40 -0
  120. package/dist/fleet/index.d.ts.map +1 -0
  121. package/dist/fleet/index.js +117 -0
  122. package/dist/fleet/index.js.map +1 -0
  123. package/dist/fleet/manifest.d.ts +51 -0
  124. package/dist/fleet/manifest.d.ts.map +1 -0
  125. package/dist/fleet/manifest.js +32 -0
  126. package/dist/fleet/manifest.js.map +1 -0
  127. package/dist/fleet/reporter.d.ts +32 -0
  128. package/dist/fleet/reporter.d.ts.map +1 -0
  129. package/dist/fleet/reporter.js +71 -0
  130. package/dist/fleet/reporter.js.map +1 -0
  131. package/dist/fleet/runner.d.ts +48 -0
  132. package/dist/fleet/runner.d.ts.map +1 -0
  133. package/dist/fleet/runner.js +104 -0
  134. package/dist/fleet/runner.js.map +1 -0
  135. package/dist/fleet/scaffolder.d.ts +12 -0
  136. package/dist/fleet/scaffolder.d.ts.map +1 -0
  137. package/dist/fleet/scaffolder.js +82 -0
  138. package/dist/fleet/scaffolder.js.map +1 -0
  139. package/dist/fleet/types.d.ts +21 -0
  140. package/dist/fleet/types.d.ts.map +1 -0
  141. package/dist/fleet/types.js +2 -0
  142. package/dist/fleet/types.js.map +1 -0
  143. package/dist/graph/artifact-store.d.ts +14 -0
  144. package/dist/graph/artifact-store.d.ts.map +1 -0
  145. package/dist/graph/artifact-store.js +100 -0
  146. package/dist/graph/artifact-store.js.map +1 -0
  147. package/dist/graph/cli.d.ts +53 -0
  148. package/dist/graph/cli.d.ts.map +1 -0
  149. package/dist/graph/cli.js +181 -0
  150. package/dist/graph/cli.js.map +1 -0
  151. package/dist/graph/client.d.ts +64 -0
  152. package/dist/graph/client.d.ts.map +1 -0
  153. package/dist/graph/client.js +216 -0
  154. package/dist/graph/client.js.map +1 -0
  155. package/dist/graph/fallback.d.ts +13 -0
  156. package/dist/graph/fallback.d.ts.map +1 -0
  157. package/dist/graph/fallback.js +57 -0
  158. package/dist/graph/fallback.js.map +1 -0
  159. package/dist/graph/hook-handler.d.ts +50 -0
  160. package/dist/graph/hook-handler.d.ts.map +1 -0
  161. package/dist/graph/hook-handler.js +217 -0
  162. package/dist/graph/hook-handler.js.map +1 -0
  163. package/dist/graph/incidents.d.ts +59 -0
  164. package/dist/graph/incidents.d.ts.map +1 -0
  165. package/dist/graph/incidents.js +22 -0
  166. package/dist/graph/incidents.js.map +1 -0
  167. package/dist/graph/mcp-client.d.ts +51 -0
  168. package/dist/graph/mcp-client.d.ts.map +1 -0
  169. package/dist/graph/mcp-client.js +285 -0
  170. package/dist/graph/mcp-client.js.map +1 -0
  171. package/dist/graph/onboarding-composer.d.ts +30 -0
  172. package/dist/graph/onboarding-composer.d.ts.map +1 -0
  173. package/dist/graph/onboarding-composer.js +275 -0
  174. package/dist/graph/onboarding-composer.js.map +1 -0
  175. package/dist/graph/pipeline-lifecycle.d.ts +95 -0
  176. package/dist/graph/pipeline-lifecycle.d.ts.map +1 -0
  177. package/dist/graph/pipeline-lifecycle.js +341 -0
  178. package/dist/graph/pipeline-lifecycle.js.map +1 -0
  179. package/dist/graph/preflight-budgets.d.ts +52 -0
  180. package/dist/graph/preflight-budgets.d.ts.map +1 -0
  181. package/dist/graph/preflight-budgets.js +78 -0
  182. package/dist/graph/preflight-budgets.js.map +1 -0
  183. package/dist/graph/preflight-injector.d.ts +130 -0
  184. package/dist/graph/preflight-injector.d.ts.map +1 -0
  185. package/dist/graph/preflight-injector.js +618 -0
  186. package/dist/graph/preflight-injector.js.map +1 -0
  187. package/dist/graph/prereq.d.ts +12 -0
  188. package/dist/graph/prereq.d.ts.map +1 -0
  189. package/dist/graph/prereq.js +61 -0
  190. package/dist/graph/prereq.js.map +1 -0
  191. package/dist/graph/prompts.d.ts +42 -0
  192. package/dist/graph/prompts.d.ts.map +1 -0
  193. package/dist/graph/prompts.js +80 -0
  194. package/dist/graph/prompts.js.map +1 -0
  195. package/dist/graph/sandbox.d.ts +19 -0
  196. package/dist/graph/sandbox.d.ts.map +1 -0
  197. package/dist/graph/sandbox.js +25 -0
  198. package/dist/graph/sandbox.js.map +1 -0
  199. package/dist/graph/token-usage.d.ts +21 -0
  200. package/dist/graph/token-usage.d.ts.map +1 -0
  201. package/dist/graph/token-usage.js +22 -0
  202. package/dist/graph/token-usage.js.map +1 -0
  203. package/dist/graph/types.d.ts +129 -0
  204. package/dist/graph/types.d.ts.map +1 -0
  205. package/dist/graph/types.js +12 -0
  206. package/dist/graph/types.js.map +1 -0
  207. package/dist/incident/orchestrator.d.ts +168 -0
  208. package/dist/incident/orchestrator.d.ts.map +1 -0
  209. package/dist/incident/orchestrator.js +279 -0
  210. package/dist/incident/orchestrator.js.map +1 -0
  211. package/dist/incident/playbook-search.d.ts +67 -0
  212. package/dist/incident/playbook-search.d.ts.map +1 -0
  213. package/dist/incident/playbook-search.js +288 -0
  214. package/dist/incident/playbook-search.js.map +1 -0
  215. package/dist/incident/postmortem.d.ts +44 -0
  216. package/dist/incident/postmortem.d.ts.map +1 -0
  217. package/dist/incident/postmortem.js +486 -0
  218. package/dist/incident/postmortem.js.map +1 -0
  219. package/dist/incident/resolution-verify.d.ts +186 -0
  220. package/dist/incident/resolution-verify.d.ts.map +1 -0
  221. package/dist/incident/resolution-verify.js +210 -0
  222. package/dist/incident/resolution-verify.js.map +1 -0
  223. package/dist/incident/rollback.d.ts +137 -0
  224. package/dist/incident/rollback.d.ts.map +1 -0
  225. package/dist/incident/rollback.js +328 -0
  226. package/dist/incident/rollback.js.map +1 -0
  227. package/dist/incident/timeline.d.ts +147 -0
  228. package/dist/incident/timeline.d.ts.map +1 -0
  229. package/dist/incident/timeline.js +452 -0
  230. package/dist/incident/timeline.js.map +1 -0
  231. package/dist/incident/types.d.ts +335 -0
  232. package/dist/incident/types.d.ts.map +1 -0
  233. package/dist/incident/types.js +158 -0
  234. package/dist/incident/types.js.map +1 -0
  235. package/dist/index.d.ts +1 -1
  236. package/dist/index.d.ts.map +1 -1
  237. package/dist/index.js +1 -1
  238. package/dist/index.js.map +1 -1
  239. package/dist/mcp/event-stream.d.ts +46 -0
  240. package/dist/mcp/event-stream.d.ts.map +1 -0
  241. package/dist/mcp/event-stream.js +421 -0
  242. package/dist/mcp/event-stream.js.map +1 -0
  243. package/dist/mcp/external-client.d.ts +38 -0
  244. package/dist/mcp/external-client.d.ts.map +1 -0
  245. package/dist/mcp/external-client.js +121 -0
  246. package/dist/mcp/external-client.js.map +1 -0
  247. package/dist/mcp/run-manager.d.ts +74 -9
  248. package/dist/mcp/run-manager.d.ts.map +1 -1
  249. package/dist/mcp/run-manager.js +127 -31
  250. package/dist/mcp/run-manager.js.map +1 -1
  251. package/dist/mcp/server.d.ts.map +1 -1
  252. package/dist/mcp/server.js +56 -0
  253. package/dist/mcp/server.js.map +1 -1
  254. package/dist/mcp/tools/abort-run.d.ts +2 -0
  255. package/dist/mcp/tools/abort-run.d.ts.map +1 -0
  256. package/dist/mcp/tools/abort-run.js +62 -0
  257. package/dist/mcp/tools/abort-run.js.map +1 -0
  258. package/dist/mcp/tools/anchor.js +1 -1
  259. package/dist/mcp/tools/anchor.js.map +1 -1
  260. package/dist/mcp/tools/approve-checkpoint.d.ts +2 -0
  261. package/dist/mcp/tools/approve-checkpoint.d.ts.map +1 -0
  262. package/dist/mcp/tools/approve-checkpoint.js +70 -0
  263. package/dist/mcp/tools/approve-checkpoint.js.map +1 -0
  264. package/dist/mcp/tools/brownfield.js +1 -1
  265. package/dist/mcp/tools/brownfield.js.map +1 -1
  266. package/dist/mcp/tools/get-project-state.d.ts +2 -0
  267. package/dist/mcp/tools/get-project-state.d.ts.map +1 -0
  268. package/dist/mcp/tools/get-project-state.js +107 -0
  269. package/dist/mcp/tools/get-project-state.js.map +1 -0
  270. package/dist/mcp/tools/get-run-status.d.ts +2 -0
  271. package/dist/mcp/tools/get-run-status.d.ts.map +1 -0
  272. package/dist/mcp/tools/get-run-status.js +40 -0
  273. package/dist/mcp/tools/get-run-status.js.map +1 -0
  274. package/dist/mcp/tools/graph-schemas.d.ts +100 -0
  275. package/dist/mcp/tools/graph-schemas.d.ts.map +1 -0
  276. package/dist/mcp/tools/graph-schemas.js +39 -0
  277. package/dist/mcp/tools/graph-schemas.js.map +1 -0
  278. package/dist/mcp/tools/graph.d.ts +19 -0
  279. package/dist/mcp/tools/graph.d.ts.map +1 -0
  280. package/dist/mcp/tools/graph.js +263 -0
  281. package/dist/mcp/tools/graph.js.map +1 -0
  282. package/dist/mcp/tools/incident.d.ts +2 -0
  283. package/dist/mcp/tools/incident.d.ts.map +1 -0
  284. package/dist/mcp/tools/incident.js +246 -0
  285. package/dist/mcp/tools/incident.js.map +1 -0
  286. package/dist/mcp/tools/index.d.ts +38 -18
  287. package/dist/mcp/tools/index.d.ts.map +1 -1
  288. package/dist/mcp/tools/index.js +74 -18
  289. package/dist/mcp/tools/index.js.map +1 -1
  290. package/dist/mcp/tools/init.d.ts.map +1 -1
  291. package/dist/mcp/tools/init.js +2 -0
  292. package/dist/mcp/tools/init.js.map +1 -1
  293. package/dist/mcp/tools/list-active-runs.d.ts +2 -0
  294. package/dist/mcp/tools/list-active-runs.d.ts.map +1 -0
  295. package/dist/mcp/tools/list-active-runs.js +35 -0
  296. package/dist/mcp/tools/list-active-runs.js.map +1 -0
  297. package/dist/mcp/tools/list-pending-approvals.d.ts +2 -0
  298. package/dist/mcp/tools/list-pending-approvals.d.ts.map +1 -0
  299. package/dist/mcp/tools/list-pending-approvals.js +40 -0
  300. package/dist/mcp/tools/list-pending-approvals.js.map +1 -0
  301. package/dist/mcp/tools/list-projects.d.ts +2 -0
  302. package/dist/mcp/tools/list-projects.d.ts.map +1 -0
  303. package/dist/mcp/tools/list-projects.js +101 -0
  304. package/dist/mcp/tools/list-projects.js.map +1 -0
  305. package/dist/mcp/tools/list-specs.d.ts +2 -0
  306. package/dist/mcp/tools/list-specs.d.ts.map +1 -0
  307. package/dist/mcp/tools/list-specs.js +48 -0
  308. package/dist/mcp/tools/list-specs.js.map +1 -0
  309. package/dist/mcp/tools/playbook.d.ts +2 -0
  310. package/dist/mcp/tools/playbook.d.ts.map +1 -0
  311. package/dist/mcp/tools/playbook.js +104 -0
  312. package/dist/mcp/tools/playbook.js.map +1 -0
  313. package/dist/mcp/tools/postmortem.d.ts +2 -0
  314. package/dist/mcp/tools/postmortem.d.ts.map +1 -0
  315. package/dist/mcp/tools/postmortem.js +75 -0
  316. package/dist/mcp/tools/postmortem.js.map +1 -0
  317. package/dist/mcp/tools/react.js +1 -1
  318. package/dist/mcp/tools/react.js.map +1 -1
  319. package/dist/mcp/tools/reject-checkpoint.d.ts +2 -0
  320. package/dist/mcp/tools/reject-checkpoint.d.ts.map +1 -0
  321. package/dist/mcp/tools/reject-checkpoint.js +79 -0
  322. package/dist/mcp/tools/reject-checkpoint.js.map +1 -0
  323. package/dist/mcp/tools/rollback.d.ts +2 -0
  324. package/dist/mcp/tools/rollback.d.ts.map +1 -0
  325. package/dist/mcp/tools/rollback.js +78 -0
  326. package/dist/mcp/tools/rollback.js.map +1 -0
  327. package/dist/mcp/tools/run-in-worktree.d.ts +2 -0
  328. package/dist/mcp/tools/run-in-worktree.d.ts.map +1 -0
  329. package/dist/mcp/tools/run-in-worktree.js +90 -0
  330. package/dist/mcp/tools/run-in-worktree.js.map +1 -0
  331. package/dist/mcp/tools/run.js +1 -1
  332. package/dist/mcp/tools/run.js.map +1 -1
  333. package/dist/mcp/tools/solidity.js +1 -1
  334. package/dist/mcp/tools/solidity.js.map +1 -1
  335. package/dist/mcp/tools/status.d.ts.map +1 -1
  336. package/dist/mcp/tools/status.js +11 -0
  337. package/dist/mcp/tools/status.js.map +1 -1
  338. package/dist/mcp/tools/subscribe-events.d.ts +2 -0
  339. package/dist/mcp/tools/subscribe-events.d.ts.map +1 -0
  340. package/dist/mcp/tools/subscribe-events.js +48 -0
  341. package/dist/mcp/tools/subscribe-events.js.map +1 -0
  342. package/dist/mcp/tools/unsubscribe-events.d.ts +2 -0
  343. package/dist/mcp/tools/unsubscribe-events.d.ts.map +1 -0
  344. package/dist/mcp/tools/unsubscribe-events.js +45 -0
  345. package/dist/mcp/tools/unsubscribe-events.js.map +1 -0
  346. package/dist/orchestrator/agent-loader.d.ts +16 -0
  347. package/dist/orchestrator/agent-loader.d.ts.map +1 -1
  348. package/dist/orchestrator/agent-loader.js +30 -0
  349. package/dist/orchestrator/agent-loader.js.map +1 -1
  350. package/dist/orchestrator/agentic-loop.d.ts +51 -0
  351. package/dist/orchestrator/agentic-loop.d.ts.map +1 -1
  352. package/dist/orchestrator/agentic-loop.js +123 -4
  353. package/dist/orchestrator/agentic-loop.js.map +1 -1
  354. package/dist/orchestrator/arch-lenses.d.ts +7 -0
  355. package/dist/orchestrator/arch-lenses.d.ts.map +1 -0
  356. package/dist/orchestrator/arch-lenses.js +22 -0
  357. package/dist/orchestrator/arch-lenses.js.map +1 -0
  358. package/dist/orchestrator/architect-agent.d.ts +16 -0
  359. package/dist/orchestrator/architect-agent.d.ts.map +1 -1
  360. package/dist/orchestrator/architect-agent.js +546 -9
  361. package/dist/orchestrator/architect-agent.js.map +1 -1
  362. package/dist/orchestrator/checkpoints/audit.d.ts +128 -0
  363. package/dist/orchestrator/checkpoints/audit.d.ts.map +1 -0
  364. package/dist/orchestrator/checkpoints/audit.js +272 -0
  365. package/dist/orchestrator/checkpoints/audit.js.map +1 -0
  366. package/dist/orchestrator/checkpoints/feedback-router.d.ts +213 -0
  367. package/dist/orchestrator/checkpoints/feedback-router.d.ts.map +1 -0
  368. package/dist/orchestrator/checkpoints/feedback-router.js +438 -0
  369. package/dist/orchestrator/checkpoints/feedback-router.js.map +1 -0
  370. package/dist/orchestrator/checkpoints/index.d.ts +11 -0
  371. package/dist/orchestrator/checkpoints/index.d.ts.map +1 -0
  372. package/dist/orchestrator/checkpoints/index.js +12 -0
  373. package/dist/orchestrator/checkpoints/index.js.map +1 -0
  374. package/dist/orchestrator/checkpoints/mechanisms/cli.d.ts +35 -0
  375. package/dist/orchestrator/checkpoints/mechanisms/cli.d.ts.map +1 -0
  376. package/dist/orchestrator/checkpoints/mechanisms/cli.js +153 -0
  377. package/dist/orchestrator/checkpoints/mechanisms/cli.js.map +1 -0
  378. package/dist/orchestrator/checkpoints/mechanisms/disk.d.ts +34 -0
  379. package/dist/orchestrator/checkpoints/mechanisms/disk.d.ts.map +1 -0
  380. package/dist/orchestrator/checkpoints/mechanisms/disk.js +139 -0
  381. package/dist/orchestrator/checkpoints/mechanisms/disk.js.map +1 -0
  382. package/dist/orchestrator/checkpoints/mechanisms/pr.d.ts +141 -0
  383. package/dist/orchestrator/checkpoints/mechanisms/pr.d.ts.map +1 -0
  384. package/dist/orchestrator/checkpoints/mechanisms/pr.js +445 -0
  385. package/dist/orchestrator/checkpoints/mechanisms/pr.js.map +1 -0
  386. package/dist/orchestrator/checkpoints/noop.d.ts +12 -0
  387. package/dist/orchestrator/checkpoints/noop.d.ts.map +1 -0
  388. package/dist/orchestrator/checkpoints/noop.js +13 -0
  389. package/dist/orchestrator/checkpoints/noop.js.map +1 -0
  390. package/dist/orchestrator/checkpoints/registry.d.ts +48 -0
  391. package/dist/orchestrator/checkpoints/registry.d.ts.map +1 -0
  392. package/dist/orchestrator/checkpoints/registry.js +89 -0
  393. package/dist/orchestrator/checkpoints/registry.js.map +1 -0
  394. package/dist/orchestrator/checkpoints/renderers/_util.d.ts +50 -0
  395. package/dist/orchestrator/checkpoints/renderers/_util.d.ts.map +1 -0
  396. package/dist/orchestrator/checkpoints/renderers/_util.js +137 -0
  397. package/dist/orchestrator/checkpoints/renderers/_util.js.map +1 -0
  398. package/dist/orchestrator/checkpoints/renderers/code-review.d.ts +15 -0
  399. package/dist/orchestrator/checkpoints/renderers/code-review.d.ts.map +1 -0
  400. package/dist/orchestrator/checkpoints/renderers/code-review.js +66 -0
  401. package/dist/orchestrator/checkpoints/renderers/code-review.js.map +1 -0
  402. package/dist/orchestrator/checkpoints/renderers/curator-briefing.d.ts +15 -0
  403. package/dist/orchestrator/checkpoints/renderers/curator-briefing.d.ts.map +1 -0
  404. package/dist/orchestrator/checkpoints/renderers/curator-briefing.js +40 -0
  405. package/dist/orchestrator/checkpoints/renderers/curator-briefing.js.map +1 -0
  406. package/dist/orchestrator/checkpoints/renderers/eval-result.d.ts +15 -0
  407. package/dist/orchestrator/checkpoints/renderers/eval-result.d.ts.map +1 -0
  408. package/dist/orchestrator/checkpoints/renderers/eval-result.js +54 -0
  409. package/dist/orchestrator/checkpoints/renderers/eval-result.js.map +1 -0
  410. package/dist/orchestrator/checkpoints/renderers/generator-diff.d.ts +49 -0
  411. package/dist/orchestrator/checkpoints/renderers/generator-diff.d.ts.map +1 -0
  412. package/dist/orchestrator/checkpoints/renderers/generator-diff.js +154 -0
  413. package/dist/orchestrator/checkpoints/renderers/generator-diff.js.map +1 -0
  414. package/dist/orchestrator/checkpoints/renderers/pipeline-summary.d.ts +15 -0
  415. package/dist/orchestrator/checkpoints/renderers/pipeline-summary.d.ts.map +1 -0
  416. package/dist/orchestrator/checkpoints/renderers/pipeline-summary.js +59 -0
  417. package/dist/orchestrator/checkpoints/renderers/pipeline-summary.js.map +1 -0
  418. package/dist/orchestrator/checkpoints/renderers/plan.d.ts +15 -0
  419. package/dist/orchestrator/checkpoints/renderers/plan.d.ts.map +1 -0
  420. package/dist/orchestrator/checkpoints/renderers/plan.js +34 -0
  421. package/dist/orchestrator/checkpoints/renderers/plan.js.map +1 -0
  422. package/dist/orchestrator/checkpoints/renderers/registry.d.ts +43 -0
  423. package/dist/orchestrator/checkpoints/renderers/registry.d.ts.map +1 -0
  424. package/dist/orchestrator/checkpoints/renderers/registry.js +83 -0
  425. package/dist/orchestrator/checkpoints/renderers/registry.js.map +1 -0
  426. package/dist/orchestrator/checkpoints/renderers/research.d.ts +15 -0
  427. package/dist/orchestrator/checkpoints/renderers/research.d.ts.map +1 -0
  428. package/dist/orchestrator/checkpoints/renderers/research.js +39 -0
  429. package/dist/orchestrator/checkpoints/renderers/research.js.map +1 -0
  430. package/dist/orchestrator/checkpoints/renderers/sprint-contract.d.ts +20 -0
  431. package/dist/orchestrator/checkpoints/renderers/sprint-contract.d.ts.map +1 -0
  432. package/dist/orchestrator/checkpoints/renderers/sprint-contract.js +57 -0
  433. package/dist/orchestrator/checkpoints/renderers/sprint-contract.js.map +1 -0
  434. package/dist/orchestrator/checkpoints/renderers/sprint-summary.d.ts +15 -0
  435. package/dist/orchestrator/checkpoints/renderers/sprint-summary.d.ts.map +1 -0
  436. package/dist/orchestrator/checkpoints/renderers/sprint-summary.js +38 -0
  437. package/dist/orchestrator/checkpoints/renderers/sprint-summary.js.map +1 -0
  438. package/dist/orchestrator/checkpoints/sites.d.ts +22 -0
  439. package/dist/orchestrator/checkpoints/sites.d.ts.map +1 -0
  440. package/dist/orchestrator/checkpoints/sites.js +57 -0
  441. package/dist/orchestrator/checkpoints/sites.js.map +1 -0
  442. package/dist/orchestrator/checkpoints/types.d.ts +51 -0
  443. package/dist/orchestrator/checkpoints/types.d.ts.map +1 -0
  444. package/dist/orchestrator/checkpoints/types.js +9 -0
  445. package/dist/orchestrator/checkpoints/types.js.map +1 -0
  446. package/dist/orchestrator/code-reviewer-agent.d.ts +50 -0
  447. package/dist/orchestrator/code-reviewer-agent.d.ts.map +1 -0
  448. package/dist/orchestrator/code-reviewer-agent.js +283 -0
  449. package/dist/orchestrator/code-reviewer-agent.js.map +1 -0
  450. package/dist/orchestrator/curator-agent.d.ts.map +1 -1
  451. package/dist/orchestrator/curator-agent.js +60 -9
  452. package/dist/orchestrator/curator-agent.js.map +1 -1
  453. package/dist/orchestrator/deploy/classify.d.ts +31 -0
  454. package/dist/orchestrator/deploy/classify.d.ts.map +1 -0
  455. package/dist/orchestrator/deploy/classify.js +109 -0
  456. package/dist/orchestrator/deploy/classify.js.map +1 -0
  457. package/dist/orchestrator/deploy/execute.d.ts +45 -0
  458. package/dist/orchestrator/deploy/execute.d.ts.map +1 -0
  459. package/dist/orchestrator/deploy/execute.js +146 -0
  460. package/dist/orchestrator/deploy/execute.js.map +1 -0
  461. package/dist/orchestrator/deploy/executor.d.ts +22 -0
  462. package/dist/orchestrator/deploy/executor.d.ts.map +1 -0
  463. package/dist/orchestrator/deploy/executor.js +31 -0
  464. package/dist/orchestrator/deploy/executor.js.map +1 -0
  465. package/dist/orchestrator/deploy/index.d.ts +21 -0
  466. package/dist/orchestrator/deploy/index.d.ts.map +1 -0
  467. package/dist/orchestrator/deploy/index.js +21 -0
  468. package/dist/orchestrator/deploy/index.js.map +1 -0
  469. package/dist/orchestrator/deploy/resolve.d.ts +51 -0
  470. package/dist/orchestrator/deploy/resolve.d.ts.map +1 -0
  471. package/dist/orchestrator/deploy/resolve.js +53 -0
  472. package/dist/orchestrator/deploy/resolve.js.map +1 -0
  473. package/dist/orchestrator/deploy/spawn.d.ts +60 -0
  474. package/dist/orchestrator/deploy/spawn.d.ts.map +1 -0
  475. package/dist/orchestrator/deploy/spawn.js +62 -0
  476. package/dist/orchestrator/deploy/spawn.js.map +1 -0
  477. package/dist/orchestrator/deploy/types.d.ts +98 -0
  478. package/dist/orchestrator/deploy/types.d.ts.map +1 -0
  479. package/dist/orchestrator/deploy/types.js +39 -0
  480. package/dist/orchestrator/deploy/types.js.map +1 -0
  481. package/dist/orchestrator/documenter-agent.d.ts +57 -0
  482. package/dist/orchestrator/documenter-agent.d.ts.map +1 -0
  483. package/dist/orchestrator/documenter-agent.js +195 -0
  484. package/dist/orchestrator/documenter-agent.js.map +1 -0
  485. package/dist/orchestrator/environment.d.ts +45 -0
  486. package/dist/orchestrator/environment.d.ts.map +1 -0
  487. package/dist/orchestrator/environment.js +151 -0
  488. package/dist/orchestrator/environment.js.map +1 -0
  489. package/dist/orchestrator/eval-lenses.d.ts +7 -0
  490. package/dist/orchestrator/eval-lenses.d.ts.map +1 -0
  491. package/dist/orchestrator/eval-lenses.js +19 -0
  492. package/dist/orchestrator/eval-lenses.js.map +1 -0
  493. package/dist/orchestrator/eval-persist.d.ts +25 -0
  494. package/dist/orchestrator/eval-persist.d.ts.map +1 -0
  495. package/dist/orchestrator/eval-persist.js +74 -0
  496. package/dist/orchestrator/eval-persist.js.map +1 -0
  497. package/dist/orchestrator/evaluator-agent.d.ts +23 -0
  498. package/dist/orchestrator/evaluator-agent.d.ts.map +1 -1
  499. package/dist/orchestrator/evaluator-agent.js +80 -10
  500. package/dist/orchestrator/evaluator-agent.js.map +1 -1
  501. package/dist/orchestrator/generator-agent.d.ts.map +1 -1
  502. package/dist/orchestrator/generator-agent.js +53 -8
  503. package/dist/orchestrator/generator-agent.js.map +1 -1
  504. package/dist/orchestrator/memory/distill.d.ts +60 -0
  505. package/dist/orchestrator/memory/distill.d.ts.map +1 -0
  506. package/dist/orchestrator/memory/distill.js +177 -0
  507. package/dist/orchestrator/memory/distill.js.map +1 -0
  508. package/dist/orchestrator/memory/eval-source.d.ts +20 -0
  509. package/dist/orchestrator/memory/eval-source.d.ts.map +1 -0
  510. package/dist/orchestrator/memory/eval-source.js +88 -0
  511. package/dist/orchestrator/memory/eval-source.js.map +1 -0
  512. package/dist/orchestrator/memory/retrieve.d.ts +45 -0
  513. package/dist/orchestrator/memory/retrieve.d.ts.map +1 -0
  514. package/dist/orchestrator/memory/retrieve.js +102 -0
  515. package/dist/orchestrator/memory/retrieve.js.map +1 -0
  516. package/dist/orchestrator/model-resolver.d.ts.map +1 -1
  517. package/dist/orchestrator/model-resolver.js +15 -1
  518. package/dist/orchestrator/model-resolver.js.map +1 -1
  519. package/dist/orchestrator/observability/index.d.ts +12 -0
  520. package/dist/orchestrator/observability/index.d.ts.map +1 -0
  521. package/dist/orchestrator/observability/index.js +12 -0
  522. package/dist/orchestrator/observability/index.js.map +1 -0
  523. package/dist/orchestrator/observability/merge.d.ts +73 -0
  524. package/dist/orchestrator/observability/merge.d.ts.map +1 -0
  525. package/dist/orchestrator/observability/merge.js +110 -0
  526. package/dist/orchestrator/observability/merge.js.map +1 -0
  527. package/dist/orchestrator/pipeline.d.ts +31 -0
  528. package/dist/orchestrator/pipeline.d.ts.map +1 -1
  529. package/dist/orchestrator/pipeline.js +267 -5
  530. package/dist/orchestrator/pipeline.js.map +1 -1
  531. package/dist/orchestrator/planner-agent.d.ts +22 -1
  532. package/dist/orchestrator/planner-agent.d.ts.map +1 -1
  533. package/dist/orchestrator/planner-agent.js +165 -8
  534. package/dist/orchestrator/planner-agent.js.map +1 -1
  535. package/dist/orchestrator/research-agent.d.ts.map +1 -1
  536. package/dist/orchestrator/research-agent.js +48 -11
  537. package/dist/orchestrator/research-agent.js.map +1 -1
  538. package/dist/orchestrator/tools/handlers.d.ts +16 -0
  539. package/dist/orchestrator/tools/handlers.d.ts.map +1 -1
  540. package/dist/orchestrator/tools/handlers.js +30 -5
  541. package/dist/orchestrator/tools/handlers.js.map +1 -1
  542. package/dist/orchestrator/tools/index.d.ts +84 -1
  543. package/dist/orchestrator/tools/index.d.ts.map +1 -1
  544. package/dist/orchestrator/tools/index.js +164 -1
  545. package/dist/orchestrator/tools/index.js.map +1 -1
  546. package/dist/orchestrator/tools/schemas.js +5 -5
  547. package/dist/orchestrator/tools/schemas.js.map +1 -1
  548. package/dist/orchestrator/workflow/args-builder.d.ts +35 -0
  549. package/dist/orchestrator/workflow/args-builder.d.ts.map +1 -0
  550. package/dist/orchestrator/workflow/args-builder.js +142 -0
  551. package/dist/orchestrator/workflow/args-builder.js.map +1 -0
  552. package/dist/orchestrator/workflow/budget.d.ts +57 -0
  553. package/dist/orchestrator/workflow/budget.d.ts.map +1 -0
  554. package/dist/orchestrator/workflow/budget.js +80 -0
  555. package/dist/orchestrator/workflow/budget.js.map +1 -0
  556. package/dist/orchestrator/workflow/conformance.d.ts +27 -0
  557. package/dist/orchestrator/workflow/conformance.d.ts.map +1 -0
  558. package/dist/orchestrator/workflow/conformance.js +111 -0
  559. package/dist/orchestrator/workflow/conformance.js.map +1 -0
  560. package/dist/orchestrator/workflow/eligibility.d.ts +8 -0
  561. package/dist/orchestrator/workflow/eligibility.d.ts.map +1 -0
  562. package/dist/orchestrator/workflow/eligibility.js +10 -0
  563. package/dist/orchestrator/workflow/eligibility.js.map +1 -0
  564. package/dist/orchestrator/workflow/engine.d.ts +10 -0
  565. package/dist/orchestrator/workflow/engine.d.ts.map +1 -0
  566. package/dist/orchestrator/workflow/engine.js +2 -0
  567. package/dist/orchestrator/workflow/engine.js.map +1 -0
  568. package/dist/orchestrator/workflow/errors.d.ts +13 -0
  569. package/dist/orchestrator/workflow/errors.d.ts.map +1 -0
  570. package/dist/orchestrator/workflow/errors.js +26 -0
  571. package/dist/orchestrator/workflow/errors.js.map +1 -0
  572. package/dist/orchestrator/workflow/flusher.d.ts +19 -0
  573. package/dist/orchestrator/workflow/flusher.d.ts.map +1 -0
  574. package/dist/orchestrator/workflow/flusher.js +81 -0
  575. package/dist/orchestrator/workflow/flusher.js.map +1 -0
  576. package/dist/orchestrator/workflow/interpreter.d.ts +48 -0
  577. package/dist/orchestrator/workflow/interpreter.d.ts.map +1 -0
  578. package/dist/orchestrator/workflow/interpreter.js +92 -0
  579. package/dist/orchestrator/workflow/interpreter.js.map +1 -0
  580. package/dist/orchestrator/workflow/pure-sprint.d.ts +65 -0
  581. package/dist/orchestrator/workflow/pure-sprint.d.ts.map +1 -0
  582. package/dist/orchestrator/workflow/pure-sprint.js +82 -0
  583. package/dist/orchestrator/workflow/pure-sprint.js.map +1 -0
  584. package/dist/orchestrator/workflow/reconciler.d.ts +15 -0
  585. package/dist/orchestrator/workflow/reconciler.d.ts.map +1 -0
  586. package/dist/orchestrator/workflow/reconciler.js +65 -0
  587. package/dist/orchestrator/workflow/reconciler.js.map +1 -0
  588. package/dist/orchestrator/workflow/resume-cursor.d.ts +10 -0
  589. package/dist/orchestrator/workflow/resume-cursor.d.ts.map +1 -0
  590. package/dist/orchestrator/workflow/resume-cursor.js +25 -0
  591. package/dist/orchestrator/workflow/resume-cursor.js.map +1 -0
  592. package/dist/orchestrator/workflow/retry.d.ts +50 -0
  593. package/dist/orchestrator/workflow/retry.d.ts.map +1 -0
  594. package/dist/orchestrator/workflow/retry.js +100 -0
  595. package/dist/orchestrator/workflow/retry.js.map +1 -0
  596. package/dist/orchestrator/workflow/scheduler.d.ts +87 -0
  597. package/dist/orchestrator/workflow/scheduler.d.ts.map +1 -0
  598. package/dist/orchestrator/workflow/scheduler.js +158 -0
  599. package/dist/orchestrator/workflow/scheduler.js.map +1 -0
  600. package/dist/orchestrator/workflow/selector.d.ts +26 -0
  601. package/dist/orchestrator/workflow/selector.d.ts.map +1 -0
  602. package/dist/orchestrator/workflow/selector.js +54 -0
  603. package/dist/orchestrator/workflow/selector.js.map +1 -0
  604. package/dist/orchestrator/workflow/synthesizer.d.ts +52 -0
  605. package/dist/orchestrator/workflow/synthesizer.d.ts.map +1 -0
  606. package/dist/orchestrator/workflow/synthesizer.js +75 -0
  607. package/dist/orchestrator/workflow/synthesizer.js.map +1 -0
  608. package/dist/orchestrator/workflow/ts-engine.d.ts +13 -0
  609. package/dist/orchestrator/workflow/ts-engine.d.ts.map +1 -0
  610. package/dist/orchestrator/workflow/ts-engine.js +14 -0
  611. package/dist/orchestrator/workflow/ts-engine.js.map +1 -0
  612. package/dist/orchestrator/workflow/types.d.ts +55 -0
  613. package/dist/orchestrator/workflow/types.d.ts.map +1 -0
  614. package/dist/orchestrator/workflow/types.js +3 -0
  615. package/dist/orchestrator/workflow/types.js.map +1 -0
  616. package/dist/orchestrator/workflow/workflow-engine.d.ts +31 -0
  617. package/dist/orchestrator/workflow/workflow-engine.d.ts.map +1 -0
  618. package/dist/orchestrator/workflow/workflow-engine.js +70 -0
  619. package/dist/orchestrator/workflow/workflow-engine.js.map +1 -0
  620. package/dist/orchestrator/worktree.d.ts +18 -0
  621. package/dist/orchestrator/worktree.d.ts.map +1 -0
  622. package/dist/orchestrator/worktree.js +129 -0
  623. package/dist/orchestrator/worktree.js.map +1 -0
  624. package/dist/providers/anthropic.d.ts +8 -1
  625. package/dist/providers/anthropic.d.ts.map +1 -1
  626. package/dist/providers/anthropic.js +135 -11
  627. package/dist/providers/anthropic.js.map +1 -1
  628. package/dist/providers/claude-code.d.ts +44 -0
  629. package/dist/providers/claude-code.d.ts.map +1 -0
  630. package/dist/providers/claude-code.js +143 -0
  631. package/dist/providers/claude-code.js.map +1 -0
  632. package/dist/providers/factory.d.ts +16 -2
  633. package/dist/providers/factory.d.ts.map +1 -1
  634. package/dist/providers/factory.js +101 -14
  635. package/dist/providers/factory.js.map +1 -1
  636. package/dist/providers/google.d.ts.map +1 -1
  637. package/dist/providers/google.js +32 -3
  638. package/dist/providers/google.js.map +1 -1
  639. package/dist/providers/index.d.ts +4 -2
  640. package/dist/providers/index.d.ts.map +1 -1
  641. package/dist/providers/index.js +3 -1
  642. package/dist/providers/index.js.map +1 -1
  643. package/dist/providers/openai.d.ts.map +1 -1
  644. package/dist/providers/openai.js +28 -3
  645. package/dist/providers/openai.js.map +1 -1
  646. package/dist/providers/preflight.d.ts +22 -0
  647. package/dist/providers/preflight.d.ts.map +1 -0
  648. package/dist/providers/preflight.js +54 -0
  649. package/dist/providers/preflight.js.map +1 -0
  650. package/dist/providers/structured.d.ts +130 -0
  651. package/dist/providers/structured.d.ts.map +1 -0
  652. package/dist/providers/structured.js +205 -0
  653. package/dist/providers/structured.js.map +1 -0
  654. package/dist/providers/types.d.ts +53 -2
  655. package/dist/providers/types.d.ts.map +1 -1
  656. package/dist/state/approval-state.d.ts +74 -0
  657. package/dist/state/approval-state.d.ts.map +1 -0
  658. package/dist/state/approval-state.js +127 -0
  659. package/dist/state/approval-state.js.map +1 -0
  660. package/dist/state/history-rotation.d.ts +17 -0
  661. package/dist/state/history-rotation.d.ts.map +1 -0
  662. package/dist/state/history-rotation.js +84 -0
  663. package/dist/state/history-rotation.js.map +1 -0
  664. package/dist/state/history.d.ts +16 -4
  665. package/dist/state/history.d.ts.map +1 -1
  666. package/dist/state/history.js +62 -20
  667. package/dist/state/history.js.map +1 -1
  668. package/dist/state/index.d.ts +4 -1
  669. package/dist/state/index.d.ts.map +1 -1
  670. package/dist/state/index.js +5 -2
  671. package/dist/state/index.js.map +1 -1
  672. package/dist/state/memory.d.ts +60 -0
  673. package/dist/state/memory.d.ts.map +1 -0
  674. package/dist/state/memory.js +242 -0
  675. package/dist/state/memory.js.map +1 -0
  676. package/dist/state/review-state.d.ts +15 -0
  677. package/dist/state/review-state.d.ts.map +1 -0
  678. package/dist/state/review-state.js +51 -0
  679. package/dist/state/review-state.js.map +1 -0
  680. package/dist/state/run-state.d.ts +39 -0
  681. package/dist/state/run-state.d.ts.map +1 -0
  682. package/dist/state/run-state.js +101 -0
  683. package/dist/state/run-state.js.map +1 -0
  684. package/dist/telemetry/emit.d.ts +41 -0
  685. package/dist/telemetry/emit.d.ts.map +1 -0
  686. package/dist/telemetry/emit.js +65 -0
  687. package/dist/telemetry/emit.js.map +1 -0
  688. package/dist/utils/git.d.ts +27 -0
  689. package/dist/utils/git.d.ts.map +1 -1
  690. package/dist/utils/git.js +50 -0
  691. package/dist/utils/git.js.map +1 -1
  692. package/hooks/hooks.json +27 -1
  693. package/hooks/session-start +42 -0
  694. package/package.json +13 -6
  695. package/scripts/check-prereqs.sh +12 -0
  696. package/scripts/e2e-graph-smoke.sh +167 -0
  697. package/scripts/graph-hook.mjs +151 -0
  698. package/scripts/run-kpi-gate.mjs +245 -0
  699. package/scripts/spike-claude-code-provider.mjs +66 -0
  700. package/scripts/spike-deepseek.mjs +63 -0
  701. package/scripts/sync-skills.mjs +4 -1
  702. package/scripts/sync-targets.json +12 -0
  703. package/scripts/update-all.mjs +255 -0
  704. package/skills/bober.architect/SKILL.md +13 -0
  705. package/skills/bober.architect/references/arch-lens-panel.md +126 -0
  706. package/skills/bober.code-review/SKILL.md +186 -0
  707. package/skills/bober.debug/SKILL.md +300 -0
  708. package/skills/bober.deploy/SKILL.md +262 -0
  709. package/skills/bober.diagnose/SKILL.md +254 -0
  710. package/skills/bober.eval/SKILL.md +9 -0
  711. package/skills/bober.eval/references/lens-panel.md +115 -0
  712. package/skills/bober.graph/SKILL.md +85 -0
  713. package/skills/bober.impact/SKILL.md +101 -0
  714. package/skills/bober.incident/SKILL.md +245 -0
  715. package/skills/bober.onboard/SKILL.md +84 -0
  716. package/skills/bober.plan/SKILL.md +16 -0
  717. package/skills/bober.postmortem/SKILL.md +231 -0
  718. package/skills/bober.run/SKILL.md +23 -4
  719. package/skills/bober.run/references/lens-panel.md +115 -0
  720. package/skills/bober.runbook/SKILL.md +335 -0
  721. package/skills/bober.sprint/SKILL.md +44 -2
  722. package/skills/bober.sprint/references/lens-panel.md +115 -0
  723. package/skills/bober.using-bober/SKILL.md +133 -0
  724. package/skills/bober.verify/SKILL.md +143 -0
  725. package/skills/shared/arch-lens-panel.md +126 -0
  726. package/skills/shared/lens-panel.md +115 -0
@@ -0,0 +1,64 @@
1
+ /**
2
+ * GraphClient — the single typed facade the rest of the harness imports.
3
+ *
4
+ * All methods return Promise<GraphResult<T>> and NEVER throw for expected
5
+ * failure modes. Callers branch on `.ok`. (ADR-3)
6
+ *
7
+ * Sandbox post-filter is a single chokepoint here — every NodeRef.file
8
+ * is validated via sandboxNodePath before returning to callers.
9
+ */
10
+ import type { TokensaveMcpClient } from "./mcp-client.js";
11
+ import type { GraphArtifactStore } from "./artifact-store.js";
12
+ import { type GraphFallback } from "./fallback.js";
13
+ import type { IncidentLog } from "./incidents.js";
14
+ import type { FallbackHint, GraphFailureReason, GraphResult, GraphSection, ImpactReport, NodeRef, PrefetchSpec, SearchHit } from "./types.js";
15
+ type QueryPattern = "callers_of" | "callees_of" | "imports_of" | "tests_for";
16
+ export interface SearchOpts {
17
+ limit?: number;
18
+ kind?: NodeRef["kind"];
19
+ }
20
+ export declare class GraphClient {
21
+ private readonly projectRoot;
22
+ private readonly mcpClient;
23
+ private readonly artifactStore;
24
+ private readonly fallback;
25
+ private readonly incidents;
26
+ private readonly config;
27
+ /** Session-level cached staleness verdict. Read once on first method call;
28
+ * may be invalidated by markFresh() when GraphHookHandler (sprint 8)
29
+ * signals a sync just completed. */
30
+ private staleCache;
31
+ constructor(projectRoot: string, mcpClient: TokensaveMcpClient, artifactStore: GraphArtifactStore, fallback: GraphFallback, incidents: IncidentLog, config: GraphSection);
32
+ /** Invalidate the session staleness cache. Called by GraphHookHandler (sprint 8). */
33
+ markFresh(): void;
34
+ /**
35
+ * Return a user-facing FallbackHint for a given failure reason.
36
+ * Consumed by GraphMcpTools (sprint 4) to generate fallback guidance.
37
+ */
38
+ hintFor(reason: GraphFailureReason, detail?: string): FallbackHint;
39
+ search(q: string, opts?: SearchOpts): Promise<GraphResult<SearchHit[]>>;
40
+ query(pattern: QueryPattern, target: NodeRef): Promise<GraphResult<NodeRef[]>>;
41
+ impact(target: NodeRef | string): Promise<GraphResult<ImpactReport>>;
42
+ reviewContext(nodes: NodeRef[]): Promise<GraphResult<string>>;
43
+ overview(): Promise<GraphResult<string>>;
44
+ changes(since?: string): Promise<GraphResult<NodeRef[]>>;
45
+ prefetch(queries: PrefetchSpec[]): Promise<Record<string, GraphResult<unknown>>>;
46
+ private dispatch;
47
+ /**
48
+ * Common path for methods that need NodeRef sandbox filtering.
49
+ * Runs the MCP call, times it, narrows result, sandboxes nodes, returns GraphResult.
50
+ */
51
+ private runWithSandbox;
52
+ /** Same as runWithSandbox but the result type is T with no NodeRef post-filter. */
53
+ private runRaw;
54
+ /** Convert a makeGraphError-tagged Error from TokensaveMcpClient.call into a
55
+ * GraphResult.ok=false. mcp-client.ts:58-63 sets .reason on the Error. */
56
+ private toFailureResult;
57
+ /** One-time staleness probe, cached for the session. */
58
+ private checkStaleness;
59
+ /** Returns true if the node should be kept; false → silently dropped + incident logged. */
60
+ private keepNode;
61
+ private logSandboxDrop;
62
+ }
63
+ export {};
64
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/graph/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,SAAS,EAEV,MAAM,YAAY,CAAC;AAepB,KAAK,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,WAAW,CAAC;AAE7E,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CACxB;AAED,qBAAa,WAAW;IAOpB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAXzB;;yCAEqC;IACrC,OAAO,CAAC,UAAU,CAAiC;gBAGhC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,kBAAkB,EAC7B,aAAa,EAAE,kBAAkB,EACjC,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,WAAW,EACtB,MAAM,EAAE,YAAY;IAGvC,qFAAqF;IACrF,SAAS,IAAI,IAAI;IAIjB;;;OAGG;IACH,OAAO,CAAC,MAAM,EAAE,kBAAkB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY;IAM5D,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;IAOvE,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IAM9E,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAapE,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAI7D,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAIxC,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IAMxD,QAAQ,CACZ,OAAO,EAAE,YAAY,EAAE,GACtB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IA2BhD,OAAO,CAAC,QAAQ;IAqChB;;;OAGG;YACW,cAAc;IAqC5B,mFAAmF;YACrE,MAAM;IAIpB;+EAC2E;IAC3E,OAAO,CAAC,eAAe;IASvB,wDAAwD;YAC1C,cAAc;IAO5B,2FAA2F;IAC3F,OAAO,CAAC,QAAQ;YAaF,cAAc;CAY7B"}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * GraphClient — the single typed facade the rest of the harness imports.
3
+ *
4
+ * All methods return Promise<GraphResult<T>> and NEVER throw for expected
5
+ * failure modes. Callers branch on `.ok`. (ADR-3)
6
+ *
7
+ * Sandbox post-filter is a single chokepoint here — every NodeRef.file
8
+ * is validated via sandboxNodePath before returning to callers.
9
+ */
10
+ import { sandboxNodePath } from "./sandbox.js";
11
+ // Tokensave MCP tool catalog → GraphClient method mapping.
12
+ // Names match the canonical tool catalog (per the project CLAUDE.md);
13
+ // no `tokensave_` prefix.
14
+ const TOOL = {
15
+ search: "semantic_search_nodes",
16
+ query: "query_graph",
17
+ impact: "get_impact_radius",
18
+ reviewContext: "get_review_context",
19
+ overview: "get_architecture_overview",
20
+ changes: "detect_changes",
21
+ };
22
+ export class GraphClient {
23
+ projectRoot;
24
+ mcpClient;
25
+ artifactStore;
26
+ fallback;
27
+ incidents;
28
+ config;
29
+ /** Session-level cached staleness verdict. Read once on first method call;
30
+ * may be invalidated by markFresh() when GraphHookHandler (sprint 8)
31
+ * signals a sync just completed. */
32
+ staleCache = null;
33
+ constructor(projectRoot, mcpClient, artifactStore, fallback, incidents, config) {
34
+ this.projectRoot = projectRoot;
35
+ this.mcpClient = mcpClient;
36
+ this.artifactStore = artifactStore;
37
+ this.fallback = fallback;
38
+ this.incidents = incidents;
39
+ this.config = config;
40
+ }
41
+ /** Invalidate the session staleness cache. Called by GraphHookHandler (sprint 8). */
42
+ markFresh() {
43
+ this.staleCache = { stale: false };
44
+ }
45
+ /**
46
+ * Return a user-facing FallbackHint for a given failure reason.
47
+ * Consumed by GraphMcpTools (sprint 4) to generate fallback guidance.
48
+ */
49
+ hintFor(reason, detail) {
50
+ return this.fallback.hint(reason, detail);
51
+ }
52
+ // ── Public API ──────────────────────────────────────────────────
53
+ async search(q, opts) {
54
+ return this.runWithSandbox(TOOL.search, { query: q, ...opts }, (raw) => {
55
+ const hits = raw.filter((h) => this.keepNode(h.node, "search"));
56
+ return hits;
57
+ });
58
+ }
59
+ async query(pattern, target) {
60
+ return this.runWithSandbox(TOOL.query, { pattern, target }, (raw) => {
61
+ return raw.filter((n) => this.keepNode(n, "query"));
62
+ });
63
+ }
64
+ async impact(target) {
65
+ return this.runWithSandbox(TOOL.impact, { target }, (raw) => {
66
+ const report = raw;
67
+ return {
68
+ root: report.root, // root may be out-of-sandbox but is informational only
69
+ affected: report.affected.filter((n) => this.keepNode(n, "impact")),
70
+ testsAffected: report.testsAffected.filter((n) => this.keepNode(n, "impact")),
71
+ };
72
+ });
73
+ }
74
+ async reviewContext(nodes) {
75
+ return this.runRaw(TOOL.reviewContext, { nodes });
76
+ }
77
+ async overview() {
78
+ return this.runRaw(TOOL.overview, {});
79
+ }
80
+ async changes(since) {
81
+ return this.runWithSandbox(TOOL.changes, { since }, (raw) => {
82
+ return raw.filter((n) => this.keepNode(n, "changes"));
83
+ });
84
+ }
85
+ async prefetch(queries) {
86
+ if (queries.length === 0)
87
+ return {};
88
+ const dispatched = queries.map((q) => this.dispatch(q));
89
+ const settled = await Promise.allSettled(dispatched);
90
+ const out = {};
91
+ for (let i = 0; i < queries.length; i++) {
92
+ const q = queries[i];
93
+ const s = settled[i];
94
+ if (s.status === "fulfilled") {
95
+ out[q.key] = s.value;
96
+ }
97
+ else {
98
+ // Should never happen because dispatch returns GraphResult,
99
+ // never throws — but defend just in case.
100
+ out[q.key] = {
101
+ ok: false,
102
+ reason: "GRAPH_ERROR",
103
+ detail: s.reason instanceof Error ? s.reason.message : String(s.reason),
104
+ };
105
+ }
106
+ }
107
+ return out;
108
+ }
109
+ // ── Internals ──────────────────────────────────────────────────
110
+ dispatch(q) {
111
+ switch (q.op) {
112
+ case "search":
113
+ return this.search(q.args.q, q.args);
114
+ case "query":
115
+ return this.query(q.args.pattern, q.args.target);
116
+ case "impact":
117
+ return this.impact(q.args.target);
118
+ case "reviewContext":
119
+ return this.reviewContext(q.args.nodes);
120
+ case "overview":
121
+ return this.overview();
122
+ case "changes":
123
+ return this.changes(q.args.since);
124
+ default:
125
+ // exhaustiveness — TypeScript will complain if a PrefetchOp is added
126
+ // without a case here.
127
+ return Promise.resolve({
128
+ ok: false,
129
+ reason: "GRAPH_ERROR",
130
+ detail: `unknown prefetch op: ${String(q.op)}`,
131
+ });
132
+ }
133
+ }
134
+ /**
135
+ * Common path for methods that need NodeRef sandbox filtering.
136
+ * Runs the MCP call, times it, narrows result, sandboxes nodes, returns GraphResult.
137
+ */
138
+ async runWithSandbox(tool, params, narrow) {
139
+ if (!this.config.enabled) {
140
+ return { ok: false, reason: "GRAPH_DISABLED", detail: "graph.enabled=false" };
141
+ }
142
+ const health = this.mcpClient.health();
143
+ if (health === "broken" || health === "restarting") {
144
+ return {
145
+ ok: false,
146
+ reason: "GRAPH_UNAVAILABLE",
147
+ detail: health === "broken" ? "engine breaker tripped" : "engine is restarting",
148
+ };
149
+ }
150
+ const stale = await this.checkStaleness();
151
+ const t0 = Date.now();
152
+ try {
153
+ const raw = await this.mcpClient.call(tool, params);
154
+ const data = narrow(raw);
155
+ // TODO(phase-2): map backend to 'binding' when EngineBinding ships.
156
+ const result = {
157
+ ok: true,
158
+ data,
159
+ backend: "mcp",
160
+ durationMs: Date.now() - t0,
161
+ };
162
+ if (stale)
163
+ result.stale = true;
164
+ return result;
165
+ }
166
+ catch (err) {
167
+ return this.toFailureResult(err);
168
+ }
169
+ }
170
+ /** Same as runWithSandbox but the result type is T with no NodeRef post-filter. */
171
+ async runRaw(tool, params) {
172
+ return this.runWithSandbox(tool, params, (raw) => raw);
173
+ }
174
+ /** Convert a makeGraphError-tagged Error from TokensaveMcpClient.call into a
175
+ * GraphResult.ok=false. mcp-client.ts:58-63 sets .reason on the Error. */
176
+ toFailureResult(err) {
177
+ const reason = err?.reason ?? "GRAPH_ERROR";
178
+ const detail = err?.detail ??
179
+ (err instanceof Error ? err.message : String(err));
180
+ return { ok: false, reason, detail };
181
+ }
182
+ /** One-time staleness probe, cached for the session. */
183
+ async checkStaleness() {
184
+ if (this.staleCache === null) {
185
+ this.staleCache = await this.artifactStore.staleness();
186
+ }
187
+ return this.staleCache.stale;
188
+ }
189
+ /** Returns true if the node should be kept; false → silently dropped + incident logged. */
190
+ keepNode(node, source) {
191
+ if (!node || !node.file) {
192
+ void this.logSandboxDrop(node?.file ?? null, source);
193
+ return false;
194
+ }
195
+ const sb = sandboxNodePath(this.projectRoot, node.file);
196
+ if (!sb.ok) {
197
+ void this.logSandboxDrop(node.file, source);
198
+ return false;
199
+ }
200
+ return true;
201
+ }
202
+ async logSandboxDrop(file, source) {
203
+ try {
204
+ await this.incidents.append({
205
+ ts: new Date().toISOString(),
206
+ event: "sandbox-drop",
207
+ file: file ?? "<null>",
208
+ source,
209
+ });
210
+ }
211
+ catch {
212
+ // Incident-write failures must not break agent flow.
213
+ }
214
+ }
215
+ }
216
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/graph/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { FallbackHint, GraphFailureReason } from "./types.js";
2
+ export type FallbackMode = "gated" | "dual";
3
+ /**
4
+ * Maps a GraphFailureReason to a user-facing FallbackHint.
5
+ * The hint tells the agent which non-graph tools to fall back to and
6
+ * whether retrying is worthwhile.
7
+ */
8
+ export declare class GraphFallback {
9
+ private readonly mode;
10
+ constructor(mode?: FallbackMode);
11
+ hint(reason: GraphFailureReason, detail?: string): FallbackHint;
12
+ }
13
+ //# sourceMappingURL=fallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../../src/graph/fallback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGnE,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,CAAC;AAE5C;;;;GAIG;AACH,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,GAAE,YAAqB;IAExD,IAAI,CAAC,MAAM,EAAE,kBAAkB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY;CAqDhE"}
@@ -0,0 +1,57 @@
1
+ import { assertNever } from "./types.js";
2
+ /**
3
+ * Maps a GraphFailureReason to a user-facing FallbackHint.
4
+ * The hint tells the agent which non-graph tools to fall back to and
5
+ * whether retrying is worthwhile.
6
+ */
7
+ export class GraphFallback {
8
+ mode;
9
+ constructor(mode = "dual") {
10
+ this.mode = mode;
11
+ }
12
+ hint(reason, detail) {
13
+ switch (reason) {
14
+ case "GRAPH_DISABLED":
15
+ return {
16
+ message: "Graph integration is disabled. Use filesystem tools instead." +
17
+ (detail ? ` (${detail})` : ""),
18
+ suggestedTools: ["grep", "glob", "read_file"],
19
+ retryable: false,
20
+ };
21
+ case "GRAPH_UNAVAILABLE":
22
+ // In gated mode, grep/glob have been removed — only read_file remains.
23
+ // In dual mode, all filesystem tools are still on the role's tool surface.
24
+ return {
25
+ message: "Graph engine is unavailable (subprocess down or breaker tripped)." +
26
+ (detail ? ` (${detail})` : ""),
27
+ suggestedTools: this.mode === "gated" ? ["read_file"] : ["grep", "glob", "read_file"],
28
+ retryable: false,
29
+ };
30
+ case "GRAPH_STALE":
31
+ return {
32
+ message: "Graph index is stale. Results may be missing recent edits. " +
33
+ "Run `agent-bober graph sync` to refresh." +
34
+ (detail ? ` (${detail})` : ""),
35
+ suggestedTools: this.mode === "gated" ? ["graph_search"] : ["graph_search", "grep"],
36
+ retryable: true,
37
+ };
38
+ case "GRAPH_TIMEOUT":
39
+ return {
40
+ message: "Graph query timed out. Retry with a narrower query or fall back to filesystem search." +
41
+ (detail ? ` (${detail})` : ""),
42
+ suggestedTools: this.mode === "gated" ? ["read_file"] : ["grep", "read_file"],
43
+ retryable: true,
44
+ };
45
+ case "GRAPH_ERROR":
46
+ return {
47
+ message: "Graph engine returned an error." +
48
+ (detail ? ` (${detail})` : ""),
49
+ suggestedTools: this.mode === "gated" ? ["read_file"] : ["grep", "glob", "read_file"],
50
+ retryable: false,
51
+ };
52
+ default:
53
+ return assertNever(reason);
54
+ }
55
+ }
56
+ }
57
+ //# sourceMappingURL=fallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback.js","sourceRoot":"","sources":["../../src/graph/fallback.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAIzC;;;;GAIG;AACH,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,OAAqB,MAAM;QAA3B,SAAI,GAAJ,IAAI,CAAuB;IAAG,CAAC;IAE5D,IAAI,CAAC,MAA0B,EAAE,MAAe;QAC9C,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,gBAAgB;gBACnB,OAAO;oBACL,OAAO,EACL,8DAA8D;wBAC9D,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC;oBAC7C,SAAS,EAAE,KAAK;iBACjB,CAAC;YACJ,KAAK,mBAAmB;gBACtB,uEAAuE;gBACvE,2EAA2E;gBAC3E,OAAO;oBACL,OAAO,EACL,mEAAmE;wBACnE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChC,cAAc,EACZ,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC;oBACvE,SAAS,EAAE,KAAK;iBACjB,CAAC;YACJ,KAAK,aAAa;gBAChB,OAAO;oBACL,OAAO,EACL,6DAA6D;wBAC7D,0CAA0C;wBAC1C,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChC,cAAc,EACZ,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC;oBACrE,SAAS,EAAE,IAAI;iBAChB,CAAC;YACJ,KAAK,eAAe;gBAClB,OAAO;oBACL,OAAO,EACL,uFAAuF;wBACvF,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChC,cAAc,EACZ,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC;oBAC/D,SAAS,EAAE,IAAI;iBAChB,CAAC;YACJ,KAAK,aAAa;gBAChB,OAAO;oBACL,OAAO,EACL,iCAAiC;wBACjC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChC,cAAc,EACZ,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC;oBACvE,SAAS,EAAE,KAAK;iBACjB,CAAC;YACJ;gBACE,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,50 @@
1
+ import type { TokensaveCli } from "./cli.js";
2
+ import type { GraphArtifactStore } from "./artifact-store.js";
3
+ import type { IncidentLog } from "./incidents.js";
4
+ import type { GraphSection } from "../config/schema.js";
5
+ /**
6
+ * Debounces PostToolUse Edit|Write events and forwards path batches to
7
+ * TokensaveCli.sync. Owns:
8
+ * - In-memory Set<string> of pending paths (cap = config.hookQueueMax).
9
+ * - A single debounce Timer (window = config.debounceMs).
10
+ * - A 100ms poll loop reading .bober/graph/.hook-queue.jsonl.
11
+ *
12
+ * onPostToolUse is synchronous (fire-and-forget). flush() drains the queue
13
+ * with a 5000ms total budget — called from GraphPipelineLifecycle.stop()
14
+ * before the engine is killed.
15
+ */
16
+ export declare class GraphHookHandler {
17
+ private readonly cli;
18
+ private readonly store;
19
+ private readonly incidents;
20
+ private readonly config;
21
+ private readonly queue;
22
+ private debounceTimer;
23
+ private pollTimer;
24
+ private overflowBatch;
25
+ private syncing;
26
+ private stopped;
27
+ private readonly queueFilePath;
28
+ private static readonly FLUSH_BUDGET_MS;
29
+ private static readonly POLL_INTERVAL_MS;
30
+ private static readonly OVERFLOW_EVICT;
31
+ private static readonly OVERFLOW_WARN_EVERY;
32
+ constructor(cli: TokensaveCli, store: GraphArtifactStore, incidents: IncidentLog, config: GraphSection, projectRoot: string);
33
+ /** Begin polling the IPC queue file. Called once at lifecycle start(). */
34
+ start(): void;
35
+ /**
36
+ * Synchronous fire-and-forget entry point.
37
+ * Adds paths to queue; resets debounce timer; on cap-overflow drops oldest.
38
+ * Returns immediately — NO awaits.
39
+ */
40
+ onPostToolUse(payload: {
41
+ paths: string[];
42
+ }): void;
43
+ /** Drain queue with FLUSH_BUDGET_MS total budget. Called from lifecycle.stop(). */
44
+ flush(): Promise<void>;
45
+ private evictOldest;
46
+ private runSync;
47
+ private markPending;
48
+ private drainIpcFile;
49
+ }
50
+ //# sourceMappingURL=hook-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-handler.d.ts","sourceRoot":"","sources":["../../src/graph/hook-handler.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAYxD;;;;;;;;;;GAUG;AACH,qBAAa,gBAAgB;IAczB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAhBzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAQ;IAC/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAO;IAC/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAM;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAM;gBAG9B,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,kBAAkB,EACzB,SAAS,EAAE,WAAW,EACtB,MAAM,EAAE,YAAY,EACrC,WAAW,EAAE,MAAM;IAKrB,0EAA0E;IAC1E,KAAK,IAAI,IAAI;IASb;;;;OAIG;IACH,aAAa,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI;IAwCjD,mFAAmF;IAC7E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B5B,OAAO,CAAC,WAAW;YASL,OAAO;YA4BP,WAAW;YAWX,YAAY;CAgC3B"}
@@ -0,0 +1,217 @@
1
+ import { resolve } from "node:path";
2
+ import { readFile, truncate } from "node:fs/promises";
3
+ import { fileExists } from "../utils/fs.js";
4
+ import { logger } from "../utils/logger.js";
5
+ // ── GraphHookHandler ───────────────────────────────────────────────
6
+ /**
7
+ * Debounces PostToolUse Edit|Write events and forwards path batches to
8
+ * TokensaveCli.sync. Owns:
9
+ * - In-memory Set<string> of pending paths (cap = config.hookQueueMax).
10
+ * - A single debounce Timer (window = config.debounceMs).
11
+ * - A 100ms poll loop reading .bober/graph/.hook-queue.jsonl.
12
+ *
13
+ * onPostToolUse is synchronous (fire-and-forget). flush() drains the queue
14
+ * with a 5000ms total budget — called from GraphPipelineLifecycle.stop()
15
+ * before the engine is killed.
16
+ */
17
+ export class GraphHookHandler {
18
+ cli;
19
+ store;
20
+ incidents;
21
+ config;
22
+ queue = new Set();
23
+ debounceTimer = null;
24
+ pollTimer = null;
25
+ overflowBatch = 0;
26
+ syncing = false;
27
+ stopped = false;
28
+ queueFilePath;
29
+ static FLUSH_BUDGET_MS = 5000;
30
+ static POLL_INTERVAL_MS = 100;
31
+ static OVERFLOW_EVICT = 10;
32
+ static OVERFLOW_WARN_EVERY = 10;
33
+ constructor(cli, store, incidents, config, projectRoot) {
34
+ this.cli = cli;
35
+ this.store = store;
36
+ this.incidents = incidents;
37
+ this.config = config;
38
+ this.queueFilePath = resolve(projectRoot, ".bober/graph/.hook-queue.jsonl");
39
+ }
40
+ /** Begin polling the IPC queue file. Called once at lifecycle start(). */
41
+ start() {
42
+ if (this.pollTimer)
43
+ return;
44
+ this.pollTimer = setInterval(() => {
45
+ this.drainIpcFile().catch(() => { });
46
+ }, GraphHookHandler.POLL_INTERVAL_MS);
47
+ // Unref so the interval does not prevent the process from exiting naturally.
48
+ this.pollTimer.unref?.();
49
+ }
50
+ /**
51
+ * Synchronous fire-and-forget entry point.
52
+ * Adds paths to queue; resets debounce timer; on cap-overflow drops oldest.
53
+ * Returns immediately — NO awaits.
54
+ */
55
+ onPostToolUse(payload) {
56
+ if (this.stopped)
57
+ return;
58
+ if (this.config.autoSync === false)
59
+ return;
60
+ if (!payload.paths?.length)
61
+ return;
62
+ for (const p of payload.paths)
63
+ this.queue.add(p);
64
+ // Overflow: queue.size > hookQueueMax → drop the oldest entries.
65
+ if (this.queue.size > this.config.hookQueueMax) {
66
+ const overflow = this.queue.size - this.config.hookQueueMax;
67
+ const dropCount = Math.max(overflow, GraphHookHandler.OVERFLOW_EVICT);
68
+ this.evictOldest(dropCount);
69
+ this.overflowBatch++;
70
+ // Fire-and-forget incident write — do NOT await
71
+ this.incidents
72
+ .append({
73
+ ts: new Date().toISOString(),
74
+ event: "debounce-overflow",
75
+ droppedCount: dropCount,
76
+ queueSize: this.queue.size,
77
+ currentPaths: Array.from(this.queue).slice(-10),
78
+ })
79
+ .catch(() => { });
80
+ if (this.overflowBatch % GraphHookHandler.OVERFLOW_WARN_EVERY === 0) {
81
+ logger.warn(`[graph] Hook queue overflow: dropped ${dropCount} oldest paths (batch ${this.overflowBatch})`);
82
+ }
83
+ }
84
+ // Reset / arm debounce timer.
85
+ if (this.debounceTimer)
86
+ clearTimeout(this.debounceTimer);
87
+ this.debounceTimer = setTimeout(() => {
88
+ this.debounceTimer = null;
89
+ this.runSync().catch(() => { });
90
+ }, this.config.debounceMs);
91
+ // Unref so the timer does not prevent the process from exiting naturally.
92
+ this.debounceTimer.unref?.();
93
+ }
94
+ /** Drain queue with FLUSH_BUDGET_MS total budget. Called from lifecycle.stop(). */
95
+ async flush() {
96
+ if (this.debounceTimer) {
97
+ clearTimeout(this.debounceTimer);
98
+ this.debounceTimer = null;
99
+ }
100
+ if (this.pollTimer) {
101
+ clearInterval(this.pollTimer);
102
+ this.pollTimer = null;
103
+ }
104
+ this.stopped = true;
105
+ // Drain IPC file one last time before draining queue.
106
+ await this.drainIpcFile().catch(() => { });
107
+ if (this.queue.size === 0)
108
+ return;
109
+ const start = Date.now();
110
+ try {
111
+ await Promise.race([this.runSync(), delay(GraphHookHandler.FLUSH_BUDGET_MS)]);
112
+ }
113
+ finally {
114
+ // Anything still in the queue → write to manifest.pendingFiles
115
+ if (this.queue.size > 0) {
116
+ await this.markPending(Array.from(this.queue));
117
+ }
118
+ logger.info(`[graph] HookHandler.flush completed in ${Date.now() - start}ms`);
119
+ }
120
+ }
121
+ // ── Internals ────────────────────────────────────────────────────
122
+ evictOldest(n) {
123
+ let count = 0;
124
+ for (const p of this.queue) {
125
+ if (count >= n)
126
+ break;
127
+ this.queue.delete(p);
128
+ count++;
129
+ }
130
+ }
131
+ async runSync() {
132
+ if (this.syncing)
133
+ return;
134
+ if (this.queue.size === 0)
135
+ return;
136
+ this.syncing = true;
137
+ const paths = Array.from(this.queue);
138
+ this.queue.clear();
139
+ try {
140
+ await this.cli.sync(paths, this.config.syncTimeoutMs);
141
+ }
142
+ catch (err) {
143
+ const msg = err instanceof Error ? err.message : String(err);
144
+ if (/timed out/i.test(msg)) {
145
+ await this.incidents
146
+ .append({
147
+ ts: new Date().toISOString(),
148
+ event: "hook-timeout",
149
+ paths,
150
+ timeoutMs: this.config.syncTimeoutMs,
151
+ })
152
+ .catch(() => { });
153
+ await this.markPending(paths);
154
+ }
155
+ else {
156
+ logger.warn(`[graph] Hook sync failed (non-timeout): ${msg}`);
157
+ }
158
+ }
159
+ finally {
160
+ this.syncing = false;
161
+ }
162
+ }
163
+ async markPending(paths) {
164
+ try {
165
+ const existing = await this.store.readManifest();
166
+ if (!existing)
167
+ return;
168
+ const merged = Array.from(new Set([...(existing.pendingFiles ?? []), ...paths]));
169
+ await this.store.writeManifest({ ...existing, pendingFiles: merged });
170
+ }
171
+ catch {
172
+ // Manifest update is best-effort
173
+ }
174
+ }
175
+ async drainIpcFile() {
176
+ if (!(await fileExists(this.queueFilePath)))
177
+ return;
178
+ let raw;
179
+ try {
180
+ raw = await readFile(this.queueFilePath, "utf-8");
181
+ }
182
+ catch {
183
+ return;
184
+ }
185
+ if (!raw)
186
+ return;
187
+ // Truncate first so a concurrent hook-script append is not permanently lost.
188
+ // We accept one line of loss on truly simultaneous writes — this is fine
189
+ // because the hook script and this reader are on different processes.
190
+ try {
191
+ await truncate(this.queueFilePath, 0);
192
+ }
193
+ catch {
194
+ // ignore
195
+ }
196
+ for (const line of raw.split("\n")) {
197
+ const t = line.trim();
198
+ if (!t)
199
+ continue;
200
+ let rec;
201
+ try {
202
+ rec = JSON.parse(t);
203
+ }
204
+ catch {
205
+ continue;
206
+ }
207
+ if (!Array.isArray(rec.paths) || rec.paths.length === 0)
208
+ continue;
209
+ this.onPostToolUse({ paths: rec.paths });
210
+ }
211
+ }
212
+ }
213
+ // ── Helpers ────────────────────────────────────────────────────────
214
+ function delay(ms) {
215
+ return new Promise((r) => setTimeout(r, ms));
216
+ }
217
+ //# sourceMappingURL=hook-handler.js.map