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 @@
1
+ {"version":3,"file":"structured.d.ts","sourceRoot":"","sources":["../../src/providers/structured.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAW,MAAM,YAAY,CAAC;AAIvE,kFAAkF;AAClF,qBAAa,iBAAkB,SAAQ,KAAK;IAGxC,oDAAoD;IACpD,QAAQ,CAAC,GAAG,EAAE,MAAM;gBAFpB,OAAO,EAAE,MAAM;IACf,oDAAoD;IAC3C,GAAG,EAAE,MAAM;CAKvB;AAED,gFAAgF;AAChF,qBAAa,qBAAsB,SAAQ,KAAK;IAG5C,oCAAoC;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM;IACpB,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM;gBAJzB,OAAO,EAAE,MAAM;IACf,oCAAoC;IAC3B,GAAG,EAAE,MAAM;IACpB,8CAA8C;IACrC,QAAQ,EAAE,MAAM;CAK5B;AAID,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACtB;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC,yDAAyD;AACzD,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,KAAK,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAEjE;;;;GAIG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,SAAS,CAAC,IAAI,EAAE,OAAO,GACnB;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,CAAA;KAAE,GAC1B;QACE,OAAO,EAAE,KAAK,CAAC;QACf,KAAK,EAAE;YAAE,MAAM,EAAE,aAAa,CAAC;gBAAE,IAAI,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;gBAAC,OAAO,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,CAAC;KACzF,CAAC;CACP;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAWtE;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAoBhD;AAyCD,MAAM,WAAW,yBAAyB,CAAC,CAAC;IAC1C,4EAA4E;IAC5E,MAAM,EAAE,SAAS,CAAC;IAClB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,MAAM,EAAE,gBAAgB,CAAC;IACzB,kFAAkF;IAClF,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACvB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,kCAAkC;IAClC,KAAK,EAAE,CAAC,CAAC;IACT,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,QAAQ,EAAE,OAAO,CAAC;IAClB,kDAAkD;IAClD,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CACtD;AAOD;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,IAAI,EAAE,yBAAyB,CAAC,CAAC,CAAC,GACjC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAwDnC"}
@@ -0,0 +1,205 @@
1
+ /**
2
+ * Schema-constrained ("structured") output utilities.
3
+ *
4
+ * Provides a provider-agnostic single-shot structured call that makes JSON
5
+ * output reliable even on small local models (DeepSeek / Ollama / LM Studio),
6
+ * where the server may not honor a strict schema. It:
7
+ *
8
+ * 1. requests native structured output (`ChatParams.responseSchema`) AND
9
+ * injects the schema into the system prompt — belt-and-suspenders for
10
+ * models that ignore the native knob;
11
+ * 2. coerces the model's raw text into JSON, tolerating the failure modes
12
+ * 7B-class models exhibit (markdown fences, surrounding prose);
13
+ * 3. validates the parsed value against a caller-supplied validator
14
+ * (typically backed by a Zod schema); and
15
+ * 4. on failure, performs up to `maxRepairs` repair round-trips, feeding the
16
+ * validation error back to the model.
17
+ *
18
+ * See structured.test.ts for the recovery-rate fixture suite that pins the
19
+ * single-shot + one-repair reliability target.
20
+ */
21
+ // ── Errors ──────────────────────────────────────────────────────────
22
+ /** Raised by {@link coerceJson} when no JSON value can be extracted from text. */
23
+ export class JsonCoercionError extends Error {
24
+ raw;
25
+ constructor(message,
26
+ /** The raw model text that could not be coerced. */
27
+ raw) {
28
+ super(message);
29
+ this.raw = raw;
30
+ this.name = "JsonCoercionError";
31
+ }
32
+ }
33
+ /** Raised by {@link runStructuredAgent} when every attempt fails validation. */
34
+ export class StructuredOutputError extends Error {
35
+ raw;
36
+ attempts;
37
+ constructor(message,
38
+ /** The last raw model text seen. */
39
+ raw,
40
+ /** Total chat calls made before giving up. */
41
+ attempts) {
42
+ super(message);
43
+ this.raw = raw;
44
+ this.attempts = attempts;
45
+ this.name = "StructuredOutputError";
46
+ }
47
+ }
48
+ /**
49
+ * Build a {@link Validator} from a Zod schema (or anything exposing
50
+ * `safeParse`). Flattens issues into one human-readable string the model can
51
+ * act on during a repair round-trip.
52
+ */
53
+ export function zodValidator(schema) {
54
+ return (raw) => {
55
+ const parsed = schema.safeParse(raw);
56
+ if (parsed.success) {
57
+ return { ok: true, value: parsed.data };
58
+ }
59
+ const error = parsed.error.issues
60
+ .map((i) => `${i.path.map((p) => p.toString()).join(".") || "(root)"}: ${i.message}`)
61
+ .join("; ");
62
+ return { ok: false, error: error || "validation failed" };
63
+ };
64
+ }
65
+ // ── JSON coercion ───────────────────────────────────────────────────
66
+ /**
67
+ * Extract a JSON value from a model's raw text response.
68
+ *
69
+ * Handles the common local-model failure modes, in order:
70
+ * 1. direct `JSON.parse` (well-behaved providers / strict json mode);
71
+ * 2. strip a leading/trailing markdown code fence, then parse;
72
+ * 3. extract the substring spanning the first `{`/`[` to the matching last
73
+ * `}`/`]` (drops surrounding prose), then parse.
74
+ *
75
+ * @throws {JsonCoercionError} if nothing parses.
76
+ */
77
+ export function coerceJson(text) {
78
+ const trimmed = text.trim();
79
+ const direct = tryParse(trimmed);
80
+ if (direct.ok)
81
+ return direct.value;
82
+ const defenced = stripFences(trimmed);
83
+ const fenced = tryParse(defenced);
84
+ if (fenced.ok)
85
+ return fenced.value;
86
+ const span = extractJsonSpan(defenced);
87
+ if (span !== null) {
88
+ const spanned = tryParse(span);
89
+ if (spanned.ok)
90
+ return spanned.value;
91
+ }
92
+ throw new JsonCoercionError(`Could not extract JSON from model output (${String(text.length)} chars).`, text);
93
+ }
94
+ function tryParse(s) {
95
+ if (s.length === 0)
96
+ return { ok: false };
97
+ try {
98
+ return { ok: true, value: JSON.parse(s) };
99
+ }
100
+ catch {
101
+ return { ok: false };
102
+ }
103
+ }
104
+ /** Strip a single leading ```lang fence and matching trailing ``` fence. */
105
+ function stripFences(s) {
106
+ const fenceMatch = /^```[a-zA-Z0-9]*\s*\n?([\s\S]*?)\n?```$/.exec(s);
107
+ if (fenceMatch && fenceMatch[1] !== undefined) {
108
+ return fenceMatch[1].trim();
109
+ }
110
+ return s;
111
+ }
112
+ /**
113
+ * Return the substring from the first JSON open-bracket to the last matching
114
+ * close-bracket (object or array, whichever appears first), or null if none.
115
+ */
116
+ function extractJsonSpan(s) {
117
+ const firstObj = s.indexOf("{");
118
+ const firstArr = s.indexOf("[");
119
+ if (firstObj === -1 && firstArr === -1)
120
+ return null;
121
+ const useArray = firstObj === -1 || (firstArr !== -1 && firstArr < firstObj);
122
+ const start = useArray ? firstArr : firstObj;
123
+ const close = useArray ? "]" : "}";
124
+ const lastClose = s.lastIndexOf(close);
125
+ if (lastClose <= start)
126
+ return null;
127
+ return s.slice(start, lastClose + 1);
128
+ }
129
+ const SCHEMA_INSTRUCTION_HEADER = "You MUST respond with a single JSON value that conforms to the JSON Schema " +
130
+ "below. Respond with ONLY the JSON — no prose, no explanation, no markdown " +
131
+ "code fences.";
132
+ /**
133
+ * Run a single-shot structured-output call with coercion, validation, and
134
+ * bounded repair. Returns a validated, typed value.
135
+ *
136
+ * The returned `ChatResponse.text` is parsed via {@link coerceJson} and checked
137
+ * with `validate`. If either fails and repairs remain, the bad output and the
138
+ * error are fed back as a follow-up turn.
139
+ *
140
+ * @throws {StructuredOutputError} if no attempt produces a schema-valid value.
141
+ */
142
+ export async function runStructuredAgent(opts) {
143
+ const { client, model, schema, validate, prompt } = opts;
144
+ const maxRepairs = opts.maxRepairs ?? 1;
145
+ const maxAttempts = maxRepairs + 1;
146
+ const system = buildStructuredSystem(opts.system, schema);
147
+ const messages = [{ role: "user", content: prompt }];
148
+ let inputTokens = 0;
149
+ let outputTokens = 0;
150
+ let lastError = "";
151
+ let lastRaw = "";
152
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
153
+ const response = await client.chat({
154
+ model,
155
+ system,
156
+ messages,
157
+ responseSchema: schema,
158
+ ...(opts.maxTokens !== undefined ? { maxTokens: opts.maxTokens } : {}),
159
+ });
160
+ inputTokens += response.usage.inputTokens;
161
+ outputTokens += response.usage.outputTokens;
162
+ lastRaw = response.text;
163
+ lastError = "";
164
+ let parsed;
165
+ try {
166
+ parsed = coerceJson(response.text);
167
+ }
168
+ catch (e) {
169
+ lastError = e instanceof Error ? e.message : String(e);
170
+ }
171
+ if (lastError === "") {
172
+ const result = validate(parsed);
173
+ if (result.ok) {
174
+ return {
175
+ value: result.value,
176
+ attempts: attempt,
177
+ repaired: attempt > 1,
178
+ usage: { inputTokens, outputTokens },
179
+ };
180
+ }
181
+ lastError = result.error;
182
+ }
183
+ if (attempt < maxAttempts) {
184
+ pushRepair(messages, response.text, lastError);
185
+ }
186
+ }
187
+ throw new StructuredOutputError(`Structured output failed after ${String(maxAttempts)} attempt(s): ${lastError}`, lastRaw, maxAttempts);
188
+ }
189
+ /** Append the schema instruction + serialized schema to the base system prompt. */
190
+ function buildStructuredSystem(system, schema) {
191
+ const base = system.trim();
192
+ const block = `${SCHEMA_INSTRUCTION_HEADER}\n\nJSON Schema:\n${JSON.stringify(schema)}`;
193
+ return base.length > 0 ? `${base}\n\n${block}` : block;
194
+ }
195
+ /** Append the failed output + a corrective instruction as a new turn. */
196
+ function pushRepair(messages, rawText, error) {
197
+ messages.push({ role: "assistant", content: rawText });
198
+ messages.push({
199
+ role: "user",
200
+ content: `Your previous response could not be used: ${error}. ` +
201
+ "Return ONLY a corrected JSON value that conforms to the schema. " +
202
+ "No prose, no markdown fences.",
203
+ });
204
+ }
205
+ //# sourceMappingURL=structured.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structured.js","sourceRoot":"","sources":["../../src/providers/structured.ts"],"names":[],"mappings":"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"}
@@ -84,15 +84,32 @@ export interface TextMessage {
84
84
  /** Text content. */
85
85
  content: string;
86
86
  }
87
+ /**
88
+ * A provider-agnostic mid-conversation system instruction.
89
+ *
90
+ * Rendered by the Anthropic adapter as a `mid_conv_system` content block
91
+ * inside a message (NOT a top-level role). Non-anthropic adapters render it
92
+ * as best-effort text or skip it. The optional ephemeral cache TTL lets the
93
+ * instruction update mid-task without breaking the prompt cache.
94
+ */
95
+ export interface SystemUpdateMessage {
96
+ role: "user";
97
+ /** The mid-conversation system instruction text. */
98
+ systemUpdate: string;
99
+ /** Optional ephemeral cache TTL for this instruction block. */
100
+ cacheTtl?: "5m" | "1h";
101
+ }
87
102
  /**
88
103
  * A message in the conversation history.
89
104
  *
90
- * Three variants:
105
+ * Four variants:
91
106
  * - TextMessage: plain user or assistant text
92
107
  * - AssistantMessage: assistant response that includes tool call requests
93
108
  * - ToolResultMessage: user message carrying tool execution results
109
+ * - SystemUpdateMessage: mid-conversation system instruction (rendered as
110
+ * mid_conv_system content block by the Anthropic adapter)
94
111
  */
95
- export type Message = TextMessage | AssistantMessage | ToolResultMessage;
112
+ export type Message = TextMessage | AssistantMessage | ToolResultMessage | SystemUpdateMessage;
96
113
  /**
97
114
  * Parameters for a single LLM chat request.
98
115
  */
@@ -107,6 +124,40 @@ export interface ChatParams {
107
124
  tools?: ToolDef[];
108
125
  /** Maximum tokens to generate. Defaults to 16384. */
109
126
  maxTokens?: number;
127
+ /**
128
+ * Reasoning/output effort level. Provider-agnostic; only the Anthropic
129
+ * adapter forwards it (as output_config.effort). When unset, the provider
130
+ * default applies (high on Opus 4.8). Other adapters ignore it.
131
+ */
132
+ effort?: "low" | "medium" | "high" | "xhigh" | "max";
133
+ /**
134
+ * When set, requests schema-constrained ("structured") output. Each adapter
135
+ * maps this to its native mechanism — OpenAI / openai-compat
136
+ * `response_format: { type: "json_schema" }`, Gemini `responseSchema`,
137
+ * Anthropic forced-tool (`tool_choice`) — and upholds a single contract:
138
+ *
139
+ * **When `responseSchema` is set, `ChatResponse.text` holds a JSON document
140
+ * that best-effort conforms to this schema, and `toolCalls` is empty.**
141
+ *
142
+ * This keeps callers provider-agnostic: they always parse/validate
143
+ * `response.text`, regardless of how the provider produced it. `responseSchema`
144
+ * is for single-shot structured calls and is mutually exclusive with `tools`
145
+ * — when set, user `tools` are NOT forwarded. The `claude-code` adapter
146
+ * ignores it (no schema-constrainable surface). Local models that don't honor
147
+ * the native knob still receive a prompt-level schema instruction via
148
+ * `runStructuredAgent` (see `./structured`), which then validates and repairs
149
+ * the output.
150
+ */
151
+ responseSchema?: JsonSchemaObject;
152
+ /**
153
+ * When true, request the provider's *loose* JSON-object mode
154
+ * (`response_format: { type: "json_object" }` for OpenAI / openai-compat).
155
+ * Unlike `responseSchema` (strict json_schema, which DeepSeek rejects), this
156
+ * only guarantees the output is a syntactically valid JSON object — the caller
157
+ * must spell out the required fields in the prompt. Ignored by adapters that
158
+ * lack the knob. When both are set, `responseSchema` takes precedence.
159
+ */
160
+ jsonObjectMode?: boolean;
110
161
  }
111
162
  /**
112
163
  * Stop reason indicating why the model stopped generating.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ export interface PendingMarker {
2
+ checkpointId: string;
3
+ runId?: string;
4
+ artifact: {
5
+ type?: string;
6
+ path?: string;
7
+ summary?: string;
8
+ lines?: number;
9
+ };
10
+ prompt: string;
11
+ requestedAt: string;
12
+ timeoutAt: string;
13
+ }
14
+ export interface ApprovedMarker {
15
+ approvedAt: string;
16
+ approverId: string;
17
+ editDelta?: unknown;
18
+ }
19
+ export interface RejectedMarker {
20
+ rejectedAt: string;
21
+ rejecterId: string;
22
+ feedback: string;
23
+ }
24
+ /**
25
+ * Write a pending approval marker to disk.
26
+ */
27
+ export declare function savePending(projectRoot: string, m: PendingMarker): Promise<void>;
28
+ /**
29
+ * Read a pending approval marker from disk. Returns null if not found.
30
+ */
31
+ export declare function readPending(projectRoot: string, id: string): Promise<PendingMarker | null>;
32
+ /**
33
+ * List all pending approval markers.
34
+ */
35
+ export declare function listPending(projectRoot: string): Promise<PendingMarker[]>;
36
+ /**
37
+ * Write an approved marker to disk.
38
+ */
39
+ export declare function saveApproved(projectRoot: string, id: string, m: ApprovedMarker): Promise<void>;
40
+ /**
41
+ * Write a rejected marker to disk.
42
+ */
43
+ export declare function saveRejected(projectRoot: string, id: string, m: RejectedMarker): Promise<void>;
44
+ /**
45
+ * Delete a pending marker from disk (after resolution). Best-effort — does not throw.
46
+ */
47
+ export declare function deletePending(projectRoot: string, id: string): Promise<void>;
48
+ /**
49
+ * Check whether a pending marker exists for the given checkpoint id.
50
+ */
51
+ export declare function pendingExists(projectRoot: string, id: string): Promise<boolean>;
52
+ /**
53
+ * Cockpit-shape pending row — what both the CLI (--json) and the MCP
54
+ * tool bober_list_pending_approvals should return.
55
+ */
56
+ export interface PendingApprovalRow {
57
+ checkpointId: string;
58
+ ageMs: number;
59
+ prompt: string;
60
+ }
61
+ /**
62
+ * List all pending checkpoints in cockpit-row shape.
63
+ *
64
+ * Mirrors the row-builder loop in src/cli/commands/list-approvals.ts
65
+ * but lives in state/ so both the CLI and the MCP tool can share it.
66
+ * Reads .bober/approvals/*.pending.json.
67
+ *
68
+ * Behavior:
69
+ * - Missing approvals dir → returns [].
70
+ * - Corrupted JSON files → skipped silently (matches CLI behavior).
71
+ * - ageMs = Date.now() - Date.parse(requestedAt).
72
+ */
73
+ export declare function listPendingApprovals(projectRoot: string): Promise<PendingApprovalRow[]>;
74
+ //# sourceMappingURL=approval-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-state.d.ts","sourceRoot":"","sources":["../../src/state/approval-state.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7E,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,CAAC,EAAE,aAAa,GACf,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAQ/B;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAqB/E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,MAAM,EACV,CAAC,EAAE,cAAc,GAChB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,MAAM,EACV,CAAC,EAAE,cAAc,GAChB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAElF;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA0B/B"}
@@ -0,0 +1,127 @@
1
+ import { readFile, writeFile, readdir, unlink, access } from "node:fs/promises";
2
+ import { constants } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { ensureDir } from "./helpers.js";
5
+ const APPROVAL_DIR = ".bober/approvals";
6
+ function approvalsDir(projectRoot) {
7
+ return join(projectRoot, APPROVAL_DIR);
8
+ }
9
+ function pendingPath(projectRoot, id) {
10
+ return join(approvalsDir(projectRoot), `${id}.pending.json`);
11
+ }
12
+ function approvedPath(projectRoot, id) {
13
+ return join(approvalsDir(projectRoot), `${id}.approved.json`);
14
+ }
15
+ function rejectedPath(projectRoot, id) {
16
+ return join(approvalsDir(projectRoot), `${id}.rejected.json`);
17
+ }
18
+ /**
19
+ * Write a pending approval marker to disk.
20
+ */
21
+ export async function savePending(projectRoot, m) {
22
+ await ensureDir(approvalsDir(projectRoot));
23
+ await writeFile(pendingPath(projectRoot, m.checkpointId), JSON.stringify(m, null, 2) + "\n", "utf-8");
24
+ }
25
+ /**
26
+ * Read a pending approval marker from disk. Returns null if not found.
27
+ */
28
+ export async function readPending(projectRoot, id) {
29
+ try {
30
+ return JSON.parse(await readFile(pendingPath(projectRoot, id), "utf-8"));
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
36
+ /**
37
+ * List all pending approval markers.
38
+ */
39
+ export async function listPending(projectRoot) {
40
+ let entries;
41
+ try {
42
+ entries = await readdir(approvalsDir(projectRoot));
43
+ }
44
+ catch {
45
+ return [];
46
+ }
47
+ const out = [];
48
+ for (const f of entries.filter((x) => x.endsWith(".pending.json"))) {
49
+ try {
50
+ out.push(JSON.parse(await readFile(join(approvalsDir(projectRoot), f), "utf-8")));
51
+ }
52
+ catch {
53
+ // skip corrupted files
54
+ }
55
+ }
56
+ return out;
57
+ }
58
+ /**
59
+ * Write an approved marker to disk.
60
+ */
61
+ export async function saveApproved(projectRoot, id, m) {
62
+ await ensureDir(approvalsDir(projectRoot));
63
+ await writeFile(approvedPath(projectRoot, id), JSON.stringify(m, null, 2) + "\n", "utf-8");
64
+ }
65
+ /**
66
+ * Write a rejected marker to disk.
67
+ */
68
+ export async function saveRejected(projectRoot, id, m) {
69
+ await ensureDir(approvalsDir(projectRoot));
70
+ await writeFile(rejectedPath(projectRoot, id), JSON.stringify(m, null, 2) + "\n", "utf-8");
71
+ }
72
+ /**
73
+ * Delete a pending marker from disk (after resolution). Best-effort — does not throw.
74
+ */
75
+ export async function deletePending(projectRoot, id) {
76
+ await unlink(pendingPath(projectRoot, id)).catch(() => { });
77
+ }
78
+ /**
79
+ * Check whether a pending marker exists for the given checkpoint id.
80
+ */
81
+ export async function pendingExists(projectRoot, id) {
82
+ try {
83
+ await access(pendingPath(projectRoot, id), constants.R_OK);
84
+ return true;
85
+ }
86
+ catch {
87
+ return false;
88
+ }
89
+ }
90
+ /**
91
+ * List all pending checkpoints in cockpit-row shape.
92
+ *
93
+ * Mirrors the row-builder loop in src/cli/commands/list-approvals.ts
94
+ * but lives in state/ so both the CLI and the MCP tool can share it.
95
+ * Reads .bober/approvals/*.pending.json.
96
+ *
97
+ * Behavior:
98
+ * - Missing approvals dir → returns [].
99
+ * - Corrupted JSON files → skipped silently (matches CLI behavior).
100
+ * - ageMs = Date.now() - Date.parse(requestedAt).
101
+ */
102
+ export async function listPendingApprovals(projectRoot) {
103
+ let entries;
104
+ try {
105
+ entries = await readdir(approvalsDir(projectRoot));
106
+ }
107
+ catch {
108
+ return [];
109
+ }
110
+ const rows = [];
111
+ for (const f of entries.filter((x) => x.endsWith(".pending.json"))) {
112
+ try {
113
+ const raw = await readFile(join(approvalsDir(projectRoot), f), "utf-8");
114
+ const parsed = JSON.parse(raw);
115
+ rows.push({
116
+ checkpointId: parsed.checkpointId,
117
+ ageMs: Date.now() - Date.parse(parsed.requestedAt),
118
+ prompt: parsed.prompt,
119
+ });
120
+ }
121
+ catch {
122
+ // skip corrupted files
123
+ }
124
+ }
125
+ return rows;
126
+ }
127
+ //# sourceMappingURL=approval-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-state.js","sourceRoot":"","sources":["../../src/state/approval-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare function historyActivePath(projectRoot: string): string;
2
+ export declare function historyArchivePath(projectRoot: string): string;
3
+ /**
4
+ * Rotate the active history file if it exceeds maxActiveLines.
5
+ *
6
+ * When the active file has more than maxActiveLines non-empty lines,
7
+ * the oldest (count - maxActiveLines) lines are appended to the archive
8
+ * and the active file is atomically rewritten with the newest maxActiveLines
9
+ * lines via temp-file + rename.
10
+ *
11
+ * Pass maxActiveLines from config; callers must NOT call loadConfig here
12
+ * (loadConfig throws when no bober.config.json exists). Default: 2000.
13
+ *
14
+ * No-op when the active file does not exist or has <= maxActiveLines entries.
15
+ */
16
+ export declare function rotateIfNeeded(projectRoot: string, maxActiveLines?: number): Promise<void>;
17
+ //# sourceMappingURL=history-rotation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-rotation.d.ts","sourceRoot":"","sources":["../../src/state/history-rotation.ts"],"names":[],"mappings":"AAoCA,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE9D;AAID;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,cAAc,GAAE,MAAa,GAC5B,OAAO,CAAC,IAAI,CAAC,CAsCf"}
@@ -0,0 +1,84 @@
1
+ // ── history-rotation.ts ─────────────────────────────────────────────
2
+ //
3
+ // Crash-safe rotation: when active history.jsonl exceeds maxActiveLines,
4
+ // move the oldest (count - maxActiveLines) entries to history.archive.jsonl,
5
+ // then atomically rewrite active with the remaining tail.
6
+ //
7
+ // Crash-safety ordering (Option B — idempotent, preferred):
8
+ //
9
+ // 1. Write the new-active TEMP file (tail lines only)
10
+ // 2. Append the overflow (oldest lines) to history.archive.jsonl
11
+ // 3. rename(temp, activeFile) ← COMMIT POINT (atomic on same fs)
12
+ //
13
+ // If the process crashes before step 3:
14
+ // - archive may hold the overflow entries AND active still holds all entries
15
+ // - loadHistory (archive-then-active) returns every entry; archive entries
16
+ // are a subset of active → union has no drops but has duplicates
17
+ // - this is acceptable: the contract (C4) tests the union and
18
+ // tolerates de-duplication when crash state is loaded.
19
+ //
20
+ // If the process crashes after step 3:
21
+ // - active is the tail only; archive has the overflow → no loss, no dup.
22
+ //
23
+ // The rename is the single atomic commit: everything before it is recoverable.
24
+ import { readFile, writeFile, appendFile, rename } from "node:fs/promises";
25
+ import { randomBytes } from "node:crypto";
26
+ import { join } from "node:path";
27
+ import { ensureDir } from "./helpers.js";
28
+ // ── Path helpers ─────────────────────────────────────────────────────
29
+ const BOBER_DIR = ".bober";
30
+ const HISTORY_FILE = "history.jsonl";
31
+ const HISTORY_ARCHIVE_FILE = "history.archive.jsonl";
32
+ export function historyActivePath(projectRoot) {
33
+ return join(projectRoot, BOBER_DIR, HISTORY_FILE);
34
+ }
35
+ export function historyArchivePath(projectRoot) {
36
+ return join(projectRoot, BOBER_DIR, HISTORY_ARCHIVE_FILE);
37
+ }
38
+ // ── Rotation ─────────────────────────────────────────────────────────
39
+ /**
40
+ * Rotate the active history file if it exceeds maxActiveLines.
41
+ *
42
+ * When the active file has more than maxActiveLines non-empty lines,
43
+ * the oldest (count - maxActiveLines) lines are appended to the archive
44
+ * and the active file is atomically rewritten with the newest maxActiveLines
45
+ * lines via temp-file + rename.
46
+ *
47
+ * Pass maxActiveLines from config; callers must NOT call loadConfig here
48
+ * (loadConfig throws when no bober.config.json exists). Default: 2000.
49
+ *
50
+ * No-op when the active file does not exist or has <= maxActiveLines entries.
51
+ */
52
+ export async function rotateIfNeeded(projectRoot, maxActiveLines = 2000) {
53
+ let content;
54
+ try {
55
+ content = await readFile(historyActivePath(projectRoot), "utf-8");
56
+ }
57
+ catch {
58
+ // Active file does not exist yet — nothing to rotate
59
+ return;
60
+ }
61
+ const lines = content.split("\n").filter((line) => line.trim().length > 0);
62
+ if (lines.length <= maxActiveLines) {
63
+ // Within limit — no rotation needed
64
+ return;
65
+ }
66
+ const overflowCount = lines.length - maxActiveLines;
67
+ const overflowLines = lines.slice(0, overflowCount);
68
+ const tailLines = lines.slice(overflowCount);
69
+ const activePath = historyActivePath(projectRoot);
70
+ const archPath = historyArchivePath(projectRoot);
71
+ // Ensure .bober/ directory exists (it should, but guard anyway)
72
+ await ensureDir(join(projectRoot, BOBER_DIR));
73
+ // Step 1: Write the new-active TEMP file (tail lines only)
74
+ const rnd = randomBytes(4).toString("hex");
75
+ const tmp = `${activePath}.${process.pid}.${Date.now()}.${rnd}.tmp`;
76
+ const newActiveContent = tailLines.join("\n") + "\n";
77
+ await writeFile(tmp, newActiveContent, { encoding: "utf-8" });
78
+ // Step 2: Append the overflow (oldest lines) to history.archive.jsonl
79
+ const overflowContent = overflowLines.join("\n") + "\n";
80
+ await appendFile(archPath, overflowContent, "utf-8");
81
+ // Step 3: Atomic commit — rename temp over active (commit point)
82
+ await rename(tmp, activePath);
83
+ }
84
+ //# sourceMappingURL=history-rotation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-rotation.js","sourceRoot":"","sources":["../../src/state/history-rotation.ts"],"names":[],"mappings":"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"}