agent-bober 0.12.0 → 0.15.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 (518) hide show
  1. package/CHANGELOG.md +213 -0
  2. package/README.md +112 -3
  3. package/agents/bober-architect.md +38 -0
  4. package/agents/bober-code-reviewer.md +236 -0
  5. package/agents/bober-curator.md +37 -0
  6. package/agents/bober-deployer.md +267 -0
  7. package/agents/bober-diagnoser.md +289 -0
  8. package/agents/bober-evaluator.md +89 -1
  9. package/agents/bober-generator.md +68 -3
  10. package/agents/bober-planner.md +39 -0
  11. package/agents/bober-postmortemer.md +185 -0
  12. package/agents/bober-researcher.md +38 -0
  13. package/dist/cli/commands/approve.d.ts +17 -0
  14. package/dist/cli/commands/approve.d.ts.map +1 -0
  15. package/dist/cli/commands/approve.js +64 -0
  16. package/dist/cli/commands/approve.js.map +1 -0
  17. package/dist/cli/commands/audit-show.d.ts +14 -0
  18. package/dist/cli/commands/audit-show.d.ts.map +1 -0
  19. package/dist/cli/commands/audit-show.js +85 -0
  20. package/dist/cli/commands/audit-show.js.map +1 -0
  21. package/dist/cli/commands/config.d.ts +10 -0
  22. package/dist/cli/commands/config.d.ts.map +1 -0
  23. package/dist/cli/commands/config.js +73 -0
  24. package/dist/cli/commands/config.js.map +1 -0
  25. package/dist/cli/commands/graph.d.ts +8 -0
  26. package/dist/cli/commands/graph.d.ts.map +1 -0
  27. package/dist/cli/commands/graph.js +219 -0
  28. package/dist/cli/commands/graph.js.map +1 -0
  29. package/dist/cli/commands/impact.d.ts +19 -0
  30. package/dist/cli/commands/impact.d.ts.map +1 -0
  31. package/dist/cli/commands/impact.js +191 -0
  32. package/dist/cli/commands/impact.js.map +1 -0
  33. package/dist/cli/commands/incident.d.ts +19 -0
  34. package/dist/cli/commands/incident.d.ts.map +1 -0
  35. package/dist/cli/commands/incident.js +324 -0
  36. package/dist/cli/commands/incident.js.map +1 -0
  37. package/dist/cli/commands/init.js +36 -1
  38. package/dist/cli/commands/init.js.map +1 -1
  39. package/dist/cli/commands/list-approvals.d.ts +16 -0
  40. package/dist/cli/commands/list-approvals.d.ts.map +1 -0
  41. package/dist/cli/commands/list-approvals.js +57 -0
  42. package/dist/cli/commands/list-approvals.js.map +1 -0
  43. package/dist/cli/commands/onboard.d.ts +3 -0
  44. package/dist/cli/commands/onboard.d.ts.map +1 -0
  45. package/dist/cli/commands/onboard.js +190 -0
  46. package/dist/cli/commands/onboard.js.map +1 -0
  47. package/dist/cli/commands/playbook.d.ts +17 -0
  48. package/dist/cli/commands/playbook.d.ts.map +1 -0
  49. package/dist/cli/commands/playbook.js +123 -0
  50. package/dist/cli/commands/playbook.js.map +1 -0
  51. package/dist/cli/commands/postmortem.d.ts +12 -0
  52. package/dist/cli/commands/postmortem.d.ts.map +1 -0
  53. package/dist/cli/commands/postmortem.js +67 -0
  54. package/dist/cli/commands/postmortem.js.map +1 -0
  55. package/dist/cli/commands/reject.d.ts +17 -0
  56. package/dist/cli/commands/reject.d.ts.map +1 -0
  57. package/dist/cli/commands/reject.js +52 -0
  58. package/dist/cli/commands/reject.js.map +1 -0
  59. package/dist/cli/commands/rollback.d.ts +21 -0
  60. package/dist/cli/commands/rollback.d.ts.map +1 -0
  61. package/dist/cli/commands/rollback.js +90 -0
  62. package/dist/cli/commands/rollback.js.map +1 -0
  63. package/dist/cli/commands/run.d.ts +9 -0
  64. package/dist/cli/commands/run.d.ts.map +1 -1
  65. package/dist/cli/commands/run.js +29 -0
  66. package/dist/cli/commands/run.js.map +1 -1
  67. package/dist/cli/commands/telemetry.d.ts +16 -0
  68. package/dist/cli/commands/telemetry.d.ts.map +1 -0
  69. package/dist/cli/commands/telemetry.js +152 -0
  70. package/dist/cli/commands/telemetry.js.map +1 -0
  71. package/dist/cli/commands/worktree.d.ts +12 -0
  72. package/dist/cli/commands/worktree.d.ts.map +1 -0
  73. package/dist/cli/commands/worktree.js +57 -0
  74. package/dist/cli/commands/worktree.js.map +1 -0
  75. package/dist/cli/index.js +50 -0
  76. package/dist/cli/index.js.map +1 -1
  77. package/dist/config/defaults.d.ts.map +1 -1
  78. package/dist/config/defaults.js +27 -0
  79. package/dist/config/defaults.js.map +1 -1
  80. package/dist/config/index.d.ts +1 -1
  81. package/dist/config/index.d.ts.map +1 -1
  82. package/dist/config/index.js +4 -0
  83. package/dist/config/index.js.map +1 -1
  84. package/dist/config/loader.d.ts.map +1 -1
  85. package/dist/config/loader.js +18 -1
  86. package/dist/config/loader.js.map +1 -1
  87. package/dist/config/schema.d.ts +976 -56
  88. package/dist/config/schema.d.ts.map +1 -1
  89. package/dist/config/schema.js +147 -0
  90. package/dist/config/schema.js.map +1 -1
  91. package/dist/graph/artifact-store.d.ts +14 -0
  92. package/dist/graph/artifact-store.d.ts.map +1 -0
  93. package/dist/graph/artifact-store.js +100 -0
  94. package/dist/graph/artifact-store.js.map +1 -0
  95. package/dist/graph/cli.d.ts +49 -0
  96. package/dist/graph/cli.d.ts.map +1 -0
  97. package/dist/graph/cli.js +140 -0
  98. package/dist/graph/cli.js.map +1 -0
  99. package/dist/graph/client.d.ts +64 -0
  100. package/dist/graph/client.d.ts.map +1 -0
  101. package/dist/graph/client.js +216 -0
  102. package/dist/graph/client.js.map +1 -0
  103. package/dist/graph/fallback.d.ts +13 -0
  104. package/dist/graph/fallback.d.ts.map +1 -0
  105. package/dist/graph/fallback.js +57 -0
  106. package/dist/graph/fallback.js.map +1 -0
  107. package/dist/graph/hook-handler.d.ts +50 -0
  108. package/dist/graph/hook-handler.d.ts.map +1 -0
  109. package/dist/graph/hook-handler.js +217 -0
  110. package/dist/graph/hook-handler.js.map +1 -0
  111. package/dist/graph/incidents.d.ts +59 -0
  112. package/dist/graph/incidents.d.ts.map +1 -0
  113. package/dist/graph/incidents.js +22 -0
  114. package/dist/graph/incidents.js.map +1 -0
  115. package/dist/graph/mcp-client.d.ts +51 -0
  116. package/dist/graph/mcp-client.d.ts.map +1 -0
  117. package/dist/graph/mcp-client.js +285 -0
  118. package/dist/graph/mcp-client.js.map +1 -0
  119. package/dist/graph/onboarding-composer.d.ts +30 -0
  120. package/dist/graph/onboarding-composer.d.ts.map +1 -0
  121. package/dist/graph/onboarding-composer.js +275 -0
  122. package/dist/graph/onboarding-composer.js.map +1 -0
  123. package/dist/graph/pipeline-lifecycle.d.ts +86 -0
  124. package/dist/graph/pipeline-lifecycle.d.ts.map +1 -0
  125. package/dist/graph/pipeline-lifecycle.js +329 -0
  126. package/dist/graph/pipeline-lifecycle.js.map +1 -0
  127. package/dist/graph/preflight-budgets.d.ts +52 -0
  128. package/dist/graph/preflight-budgets.d.ts.map +1 -0
  129. package/dist/graph/preflight-budgets.js +78 -0
  130. package/dist/graph/preflight-budgets.js.map +1 -0
  131. package/dist/graph/preflight-injector.d.ts +116 -0
  132. package/dist/graph/preflight-injector.d.ts.map +1 -0
  133. package/dist/graph/preflight-injector.js +538 -0
  134. package/dist/graph/preflight-injector.js.map +1 -0
  135. package/dist/graph/prereq.d.ts +12 -0
  136. package/dist/graph/prereq.d.ts.map +1 -0
  137. package/dist/graph/prereq.js +61 -0
  138. package/dist/graph/prereq.js.map +1 -0
  139. package/dist/graph/prompts.d.ts +42 -0
  140. package/dist/graph/prompts.d.ts.map +1 -0
  141. package/dist/graph/prompts.js +80 -0
  142. package/dist/graph/prompts.js.map +1 -0
  143. package/dist/graph/sandbox.d.ts +19 -0
  144. package/dist/graph/sandbox.d.ts.map +1 -0
  145. package/dist/graph/sandbox.js +25 -0
  146. package/dist/graph/sandbox.js.map +1 -0
  147. package/dist/graph/token-usage.d.ts +21 -0
  148. package/dist/graph/token-usage.d.ts.map +1 -0
  149. package/dist/graph/token-usage.js +22 -0
  150. package/dist/graph/token-usage.js.map +1 -0
  151. package/dist/graph/types.d.ts +129 -0
  152. package/dist/graph/types.d.ts.map +1 -0
  153. package/dist/graph/types.js +12 -0
  154. package/dist/graph/types.js.map +1 -0
  155. package/dist/incident/orchestrator.d.ts +168 -0
  156. package/dist/incident/orchestrator.d.ts.map +1 -0
  157. package/dist/incident/orchestrator.js +279 -0
  158. package/dist/incident/orchestrator.js.map +1 -0
  159. package/dist/incident/playbook-search.d.ts +67 -0
  160. package/dist/incident/playbook-search.d.ts.map +1 -0
  161. package/dist/incident/playbook-search.js +288 -0
  162. package/dist/incident/playbook-search.js.map +1 -0
  163. package/dist/incident/postmortem.d.ts +44 -0
  164. package/dist/incident/postmortem.d.ts.map +1 -0
  165. package/dist/incident/postmortem.js +486 -0
  166. package/dist/incident/postmortem.js.map +1 -0
  167. package/dist/incident/resolution-verify.d.ts +186 -0
  168. package/dist/incident/resolution-verify.d.ts.map +1 -0
  169. package/dist/incident/resolution-verify.js +210 -0
  170. package/dist/incident/resolution-verify.js.map +1 -0
  171. package/dist/incident/rollback.d.ts +137 -0
  172. package/dist/incident/rollback.d.ts.map +1 -0
  173. package/dist/incident/rollback.js +328 -0
  174. package/dist/incident/rollback.js.map +1 -0
  175. package/dist/incident/timeline.d.ts +147 -0
  176. package/dist/incident/timeline.d.ts.map +1 -0
  177. package/dist/incident/timeline.js +452 -0
  178. package/dist/incident/timeline.js.map +1 -0
  179. package/dist/incident/types.d.ts +335 -0
  180. package/dist/incident/types.d.ts.map +1 -0
  181. package/dist/incident/types.js +158 -0
  182. package/dist/incident/types.js.map +1 -0
  183. package/dist/index.d.ts +1 -1
  184. package/dist/index.d.ts.map +1 -1
  185. package/dist/index.js +1 -1
  186. package/dist/index.js.map +1 -1
  187. package/dist/mcp/event-stream.d.ts +46 -0
  188. package/dist/mcp/event-stream.d.ts.map +1 -0
  189. package/dist/mcp/event-stream.js +421 -0
  190. package/dist/mcp/event-stream.js.map +1 -0
  191. package/dist/mcp/external-client.d.ts +38 -0
  192. package/dist/mcp/external-client.d.ts.map +1 -0
  193. package/dist/mcp/external-client.js +121 -0
  194. package/dist/mcp/external-client.js.map +1 -0
  195. package/dist/mcp/run-manager.d.ts +74 -9
  196. package/dist/mcp/run-manager.d.ts.map +1 -1
  197. package/dist/mcp/run-manager.js +127 -31
  198. package/dist/mcp/run-manager.js.map +1 -1
  199. package/dist/mcp/server.d.ts.map +1 -1
  200. package/dist/mcp/server.js +56 -0
  201. package/dist/mcp/server.js.map +1 -1
  202. package/dist/mcp/tools/abort-run.d.ts +2 -0
  203. package/dist/mcp/tools/abort-run.d.ts.map +1 -0
  204. package/dist/mcp/tools/abort-run.js +62 -0
  205. package/dist/mcp/tools/abort-run.js.map +1 -0
  206. package/dist/mcp/tools/anchor.js +1 -1
  207. package/dist/mcp/tools/anchor.js.map +1 -1
  208. package/dist/mcp/tools/approve-checkpoint.d.ts +2 -0
  209. package/dist/mcp/tools/approve-checkpoint.d.ts.map +1 -0
  210. package/dist/mcp/tools/approve-checkpoint.js +70 -0
  211. package/dist/mcp/tools/approve-checkpoint.js.map +1 -0
  212. package/dist/mcp/tools/brownfield.js +1 -1
  213. package/dist/mcp/tools/brownfield.js.map +1 -1
  214. package/dist/mcp/tools/get-project-state.d.ts +2 -0
  215. package/dist/mcp/tools/get-project-state.d.ts.map +1 -0
  216. package/dist/mcp/tools/get-project-state.js +107 -0
  217. package/dist/mcp/tools/get-project-state.js.map +1 -0
  218. package/dist/mcp/tools/get-run-status.d.ts +2 -0
  219. package/dist/mcp/tools/get-run-status.d.ts.map +1 -0
  220. package/dist/mcp/tools/get-run-status.js +40 -0
  221. package/dist/mcp/tools/get-run-status.js.map +1 -0
  222. package/dist/mcp/tools/graph-schemas.d.ts +100 -0
  223. package/dist/mcp/tools/graph-schemas.d.ts.map +1 -0
  224. package/dist/mcp/tools/graph-schemas.js +39 -0
  225. package/dist/mcp/tools/graph-schemas.js.map +1 -0
  226. package/dist/mcp/tools/graph.d.ts +19 -0
  227. package/dist/mcp/tools/graph.d.ts.map +1 -0
  228. package/dist/mcp/tools/graph.js +263 -0
  229. package/dist/mcp/tools/graph.js.map +1 -0
  230. package/dist/mcp/tools/incident.d.ts +2 -0
  231. package/dist/mcp/tools/incident.d.ts.map +1 -0
  232. package/dist/mcp/tools/incident.js +246 -0
  233. package/dist/mcp/tools/incident.js.map +1 -0
  234. package/dist/mcp/tools/index.d.ts +38 -18
  235. package/dist/mcp/tools/index.d.ts.map +1 -1
  236. package/dist/mcp/tools/index.js +74 -18
  237. package/dist/mcp/tools/index.js.map +1 -1
  238. package/dist/mcp/tools/list-active-runs.d.ts +2 -0
  239. package/dist/mcp/tools/list-active-runs.d.ts.map +1 -0
  240. package/dist/mcp/tools/list-active-runs.js +35 -0
  241. package/dist/mcp/tools/list-active-runs.js.map +1 -0
  242. package/dist/mcp/tools/list-pending-approvals.d.ts +2 -0
  243. package/dist/mcp/tools/list-pending-approvals.d.ts.map +1 -0
  244. package/dist/mcp/tools/list-pending-approvals.js +40 -0
  245. package/dist/mcp/tools/list-pending-approvals.js.map +1 -0
  246. package/dist/mcp/tools/list-projects.d.ts +2 -0
  247. package/dist/mcp/tools/list-projects.d.ts.map +1 -0
  248. package/dist/mcp/tools/list-projects.js +101 -0
  249. package/dist/mcp/tools/list-projects.js.map +1 -0
  250. package/dist/mcp/tools/list-specs.d.ts +2 -0
  251. package/dist/mcp/tools/list-specs.d.ts.map +1 -0
  252. package/dist/mcp/tools/list-specs.js +48 -0
  253. package/dist/mcp/tools/list-specs.js.map +1 -0
  254. package/dist/mcp/tools/playbook.d.ts +2 -0
  255. package/dist/mcp/tools/playbook.d.ts.map +1 -0
  256. package/dist/mcp/tools/playbook.js +104 -0
  257. package/dist/mcp/tools/playbook.js.map +1 -0
  258. package/dist/mcp/tools/postmortem.d.ts +2 -0
  259. package/dist/mcp/tools/postmortem.d.ts.map +1 -0
  260. package/dist/mcp/tools/postmortem.js +75 -0
  261. package/dist/mcp/tools/postmortem.js.map +1 -0
  262. package/dist/mcp/tools/react.js +1 -1
  263. package/dist/mcp/tools/react.js.map +1 -1
  264. package/dist/mcp/tools/reject-checkpoint.d.ts +2 -0
  265. package/dist/mcp/tools/reject-checkpoint.d.ts.map +1 -0
  266. package/dist/mcp/tools/reject-checkpoint.js +79 -0
  267. package/dist/mcp/tools/reject-checkpoint.js.map +1 -0
  268. package/dist/mcp/tools/rollback.d.ts +2 -0
  269. package/dist/mcp/tools/rollback.d.ts.map +1 -0
  270. package/dist/mcp/tools/rollback.js +78 -0
  271. package/dist/mcp/tools/rollback.js.map +1 -0
  272. package/dist/mcp/tools/run-in-worktree.d.ts +2 -0
  273. package/dist/mcp/tools/run-in-worktree.d.ts.map +1 -0
  274. package/dist/mcp/tools/run-in-worktree.js +90 -0
  275. package/dist/mcp/tools/run-in-worktree.js.map +1 -0
  276. package/dist/mcp/tools/run.js +1 -1
  277. package/dist/mcp/tools/run.js.map +1 -1
  278. package/dist/mcp/tools/solidity.js +1 -1
  279. package/dist/mcp/tools/solidity.js.map +1 -1
  280. package/dist/mcp/tools/status.d.ts.map +1 -1
  281. package/dist/mcp/tools/status.js +11 -0
  282. package/dist/mcp/tools/status.js.map +1 -1
  283. package/dist/mcp/tools/subscribe-events.d.ts +2 -0
  284. package/dist/mcp/tools/subscribe-events.d.ts.map +1 -0
  285. package/dist/mcp/tools/subscribe-events.js +48 -0
  286. package/dist/mcp/tools/subscribe-events.js.map +1 -0
  287. package/dist/mcp/tools/unsubscribe-events.d.ts +2 -0
  288. package/dist/mcp/tools/unsubscribe-events.d.ts.map +1 -0
  289. package/dist/mcp/tools/unsubscribe-events.js +45 -0
  290. package/dist/mcp/tools/unsubscribe-events.js.map +1 -0
  291. package/dist/orchestrator/agent-loader.d.ts +16 -0
  292. package/dist/orchestrator/agent-loader.d.ts.map +1 -1
  293. package/dist/orchestrator/agent-loader.js +16 -0
  294. package/dist/orchestrator/agent-loader.js.map +1 -1
  295. package/dist/orchestrator/architect-agent.d.ts.map +1 -1
  296. package/dist/orchestrator/architect-agent.js +37 -8
  297. package/dist/orchestrator/architect-agent.js.map +1 -1
  298. package/dist/orchestrator/checkpoints/audit.d.ts +128 -0
  299. package/dist/orchestrator/checkpoints/audit.d.ts.map +1 -0
  300. package/dist/orchestrator/checkpoints/audit.js +272 -0
  301. package/dist/orchestrator/checkpoints/audit.js.map +1 -0
  302. package/dist/orchestrator/checkpoints/feedback-router.d.ts +213 -0
  303. package/dist/orchestrator/checkpoints/feedback-router.d.ts.map +1 -0
  304. package/dist/orchestrator/checkpoints/feedback-router.js +438 -0
  305. package/dist/orchestrator/checkpoints/feedback-router.js.map +1 -0
  306. package/dist/orchestrator/checkpoints/index.d.ts +11 -0
  307. package/dist/orchestrator/checkpoints/index.d.ts.map +1 -0
  308. package/dist/orchestrator/checkpoints/index.js +12 -0
  309. package/dist/orchestrator/checkpoints/index.js.map +1 -0
  310. package/dist/orchestrator/checkpoints/mechanisms/cli.d.ts +35 -0
  311. package/dist/orchestrator/checkpoints/mechanisms/cli.d.ts.map +1 -0
  312. package/dist/orchestrator/checkpoints/mechanisms/cli.js +153 -0
  313. package/dist/orchestrator/checkpoints/mechanisms/cli.js.map +1 -0
  314. package/dist/orchestrator/checkpoints/mechanisms/disk.d.ts +34 -0
  315. package/dist/orchestrator/checkpoints/mechanisms/disk.d.ts.map +1 -0
  316. package/dist/orchestrator/checkpoints/mechanisms/disk.js +139 -0
  317. package/dist/orchestrator/checkpoints/mechanisms/disk.js.map +1 -0
  318. package/dist/orchestrator/checkpoints/mechanisms/pr.d.ts +141 -0
  319. package/dist/orchestrator/checkpoints/mechanisms/pr.d.ts.map +1 -0
  320. package/dist/orchestrator/checkpoints/mechanisms/pr.js +445 -0
  321. package/dist/orchestrator/checkpoints/mechanisms/pr.js.map +1 -0
  322. package/dist/orchestrator/checkpoints/noop.d.ts +12 -0
  323. package/dist/orchestrator/checkpoints/noop.d.ts.map +1 -0
  324. package/dist/orchestrator/checkpoints/noop.js +13 -0
  325. package/dist/orchestrator/checkpoints/noop.js.map +1 -0
  326. package/dist/orchestrator/checkpoints/registry.d.ts +48 -0
  327. package/dist/orchestrator/checkpoints/registry.d.ts.map +1 -0
  328. package/dist/orchestrator/checkpoints/registry.js +89 -0
  329. package/dist/orchestrator/checkpoints/registry.js.map +1 -0
  330. package/dist/orchestrator/checkpoints/renderers/_util.d.ts +50 -0
  331. package/dist/orchestrator/checkpoints/renderers/_util.d.ts.map +1 -0
  332. package/dist/orchestrator/checkpoints/renderers/_util.js +137 -0
  333. package/dist/orchestrator/checkpoints/renderers/_util.js.map +1 -0
  334. package/dist/orchestrator/checkpoints/renderers/code-review.d.ts +15 -0
  335. package/dist/orchestrator/checkpoints/renderers/code-review.d.ts.map +1 -0
  336. package/dist/orchestrator/checkpoints/renderers/code-review.js +66 -0
  337. package/dist/orchestrator/checkpoints/renderers/code-review.js.map +1 -0
  338. package/dist/orchestrator/checkpoints/renderers/curator-briefing.d.ts +15 -0
  339. package/dist/orchestrator/checkpoints/renderers/curator-briefing.d.ts.map +1 -0
  340. package/dist/orchestrator/checkpoints/renderers/curator-briefing.js +40 -0
  341. package/dist/orchestrator/checkpoints/renderers/curator-briefing.js.map +1 -0
  342. package/dist/orchestrator/checkpoints/renderers/eval-result.d.ts +15 -0
  343. package/dist/orchestrator/checkpoints/renderers/eval-result.d.ts.map +1 -0
  344. package/dist/orchestrator/checkpoints/renderers/eval-result.js +54 -0
  345. package/dist/orchestrator/checkpoints/renderers/eval-result.js.map +1 -0
  346. package/dist/orchestrator/checkpoints/renderers/generator-diff.d.ts +49 -0
  347. package/dist/orchestrator/checkpoints/renderers/generator-diff.d.ts.map +1 -0
  348. package/dist/orchestrator/checkpoints/renderers/generator-diff.js +154 -0
  349. package/dist/orchestrator/checkpoints/renderers/generator-diff.js.map +1 -0
  350. package/dist/orchestrator/checkpoints/renderers/pipeline-summary.d.ts +15 -0
  351. package/dist/orchestrator/checkpoints/renderers/pipeline-summary.d.ts.map +1 -0
  352. package/dist/orchestrator/checkpoints/renderers/pipeline-summary.js +59 -0
  353. package/dist/orchestrator/checkpoints/renderers/pipeline-summary.js.map +1 -0
  354. package/dist/orchestrator/checkpoints/renderers/plan.d.ts +15 -0
  355. package/dist/orchestrator/checkpoints/renderers/plan.d.ts.map +1 -0
  356. package/dist/orchestrator/checkpoints/renderers/plan.js +34 -0
  357. package/dist/orchestrator/checkpoints/renderers/plan.js.map +1 -0
  358. package/dist/orchestrator/checkpoints/renderers/registry.d.ts +43 -0
  359. package/dist/orchestrator/checkpoints/renderers/registry.d.ts.map +1 -0
  360. package/dist/orchestrator/checkpoints/renderers/registry.js +83 -0
  361. package/dist/orchestrator/checkpoints/renderers/registry.js.map +1 -0
  362. package/dist/orchestrator/checkpoints/renderers/research.d.ts +15 -0
  363. package/dist/orchestrator/checkpoints/renderers/research.d.ts.map +1 -0
  364. package/dist/orchestrator/checkpoints/renderers/research.js +39 -0
  365. package/dist/orchestrator/checkpoints/renderers/research.js.map +1 -0
  366. package/dist/orchestrator/checkpoints/renderers/sprint-contract.d.ts +20 -0
  367. package/dist/orchestrator/checkpoints/renderers/sprint-contract.d.ts.map +1 -0
  368. package/dist/orchestrator/checkpoints/renderers/sprint-contract.js +57 -0
  369. package/dist/orchestrator/checkpoints/renderers/sprint-contract.js.map +1 -0
  370. package/dist/orchestrator/checkpoints/renderers/sprint-summary.d.ts +15 -0
  371. package/dist/orchestrator/checkpoints/renderers/sprint-summary.d.ts.map +1 -0
  372. package/dist/orchestrator/checkpoints/renderers/sprint-summary.js +38 -0
  373. package/dist/orchestrator/checkpoints/renderers/sprint-summary.js.map +1 -0
  374. package/dist/orchestrator/checkpoints/sites.d.ts +22 -0
  375. package/dist/orchestrator/checkpoints/sites.d.ts.map +1 -0
  376. package/dist/orchestrator/checkpoints/sites.js +57 -0
  377. package/dist/orchestrator/checkpoints/sites.js.map +1 -0
  378. package/dist/orchestrator/checkpoints/types.d.ts +51 -0
  379. package/dist/orchestrator/checkpoints/types.d.ts.map +1 -0
  380. package/dist/orchestrator/checkpoints/types.js +9 -0
  381. package/dist/orchestrator/checkpoints/types.js.map +1 -0
  382. package/dist/orchestrator/code-reviewer-agent.d.ts +50 -0
  383. package/dist/orchestrator/code-reviewer-agent.d.ts.map +1 -0
  384. package/dist/orchestrator/code-reviewer-agent.js +283 -0
  385. package/dist/orchestrator/code-reviewer-agent.js.map +1 -0
  386. package/dist/orchestrator/curator-agent.d.ts.map +1 -1
  387. package/dist/orchestrator/curator-agent.js +59 -8
  388. package/dist/orchestrator/curator-agent.js.map +1 -1
  389. package/dist/orchestrator/deploy/classify.d.ts +31 -0
  390. package/dist/orchestrator/deploy/classify.d.ts.map +1 -0
  391. package/dist/orchestrator/deploy/classify.js +109 -0
  392. package/dist/orchestrator/deploy/classify.js.map +1 -0
  393. package/dist/orchestrator/deploy/execute.d.ts +45 -0
  394. package/dist/orchestrator/deploy/execute.d.ts.map +1 -0
  395. package/dist/orchestrator/deploy/execute.js +146 -0
  396. package/dist/orchestrator/deploy/execute.js.map +1 -0
  397. package/dist/orchestrator/deploy/executor.d.ts +22 -0
  398. package/dist/orchestrator/deploy/executor.d.ts.map +1 -0
  399. package/dist/orchestrator/deploy/executor.js +31 -0
  400. package/dist/orchestrator/deploy/executor.js.map +1 -0
  401. package/dist/orchestrator/deploy/index.d.ts +21 -0
  402. package/dist/orchestrator/deploy/index.d.ts.map +1 -0
  403. package/dist/orchestrator/deploy/index.js +21 -0
  404. package/dist/orchestrator/deploy/index.js.map +1 -0
  405. package/dist/orchestrator/deploy/resolve.d.ts +51 -0
  406. package/dist/orchestrator/deploy/resolve.d.ts.map +1 -0
  407. package/dist/orchestrator/deploy/resolve.js +53 -0
  408. package/dist/orchestrator/deploy/resolve.js.map +1 -0
  409. package/dist/orchestrator/deploy/spawn.d.ts +60 -0
  410. package/dist/orchestrator/deploy/spawn.d.ts.map +1 -0
  411. package/dist/orchestrator/deploy/spawn.js +62 -0
  412. package/dist/orchestrator/deploy/spawn.js.map +1 -0
  413. package/dist/orchestrator/deploy/types.d.ts +98 -0
  414. package/dist/orchestrator/deploy/types.d.ts.map +1 -0
  415. package/dist/orchestrator/deploy/types.js +39 -0
  416. package/dist/orchestrator/deploy/types.js.map +1 -0
  417. package/dist/orchestrator/evaluator-agent.d.ts.map +1 -1
  418. package/dist/orchestrator/evaluator-agent.js +21 -8
  419. package/dist/orchestrator/evaluator-agent.js.map +1 -1
  420. package/dist/orchestrator/generator-agent.d.ts.map +1 -1
  421. package/dist/orchestrator/generator-agent.js +21 -8
  422. package/dist/orchestrator/generator-agent.js.map +1 -1
  423. package/dist/orchestrator/model-resolver.d.ts.map +1 -1
  424. package/dist/orchestrator/model-resolver.js +3 -1
  425. package/dist/orchestrator/model-resolver.js.map +1 -1
  426. package/dist/orchestrator/observability/index.d.ts +12 -0
  427. package/dist/orchestrator/observability/index.d.ts.map +1 -0
  428. package/dist/orchestrator/observability/index.js +12 -0
  429. package/dist/orchestrator/observability/index.js.map +1 -0
  430. package/dist/orchestrator/observability/merge.d.ts +73 -0
  431. package/dist/orchestrator/observability/merge.d.ts.map +1 -0
  432. package/dist/orchestrator/observability/merge.js +110 -0
  433. package/dist/orchestrator/observability/merge.js.map +1 -0
  434. package/dist/orchestrator/pipeline.d.ts +21 -0
  435. package/dist/orchestrator/pipeline.d.ts.map +1 -1
  436. package/dist/orchestrator/pipeline.js +156 -2
  437. package/dist/orchestrator/pipeline.js.map +1 -1
  438. package/dist/orchestrator/planner-agent.d.ts.map +1 -1
  439. package/dist/orchestrator/planner-agent.js +5 -4
  440. package/dist/orchestrator/planner-agent.js.map +1 -1
  441. package/dist/orchestrator/research-agent.d.ts.map +1 -1
  442. package/dist/orchestrator/research-agent.js +46 -9
  443. package/dist/orchestrator/research-agent.js.map +1 -1
  444. package/dist/orchestrator/tools/handlers.d.ts +2 -0
  445. package/dist/orchestrator/tools/handlers.d.ts.map +1 -1
  446. package/dist/orchestrator/tools/handlers.js +1 -1
  447. package/dist/orchestrator/tools/handlers.js.map +1 -1
  448. package/dist/orchestrator/tools/index.d.ts +84 -1
  449. package/dist/orchestrator/tools/index.d.ts.map +1 -1
  450. package/dist/orchestrator/tools/index.js +164 -1
  451. package/dist/orchestrator/tools/index.js.map +1 -1
  452. package/dist/orchestrator/worktree.d.ts +18 -0
  453. package/dist/orchestrator/worktree.d.ts.map +1 -0
  454. package/dist/orchestrator/worktree.js +129 -0
  455. package/dist/orchestrator/worktree.js.map +1 -0
  456. package/dist/providers/anthropic.d.ts +8 -1
  457. package/dist/providers/anthropic.d.ts.map +1 -1
  458. package/dist/providers/anthropic.js +86 -5
  459. package/dist/providers/anthropic.js.map +1 -1
  460. package/dist/providers/factory.d.ts.map +1 -1
  461. package/dist/providers/factory.js +35 -2
  462. package/dist/providers/factory.js.map +1 -1
  463. package/dist/providers/google.d.ts.map +1 -1
  464. package/dist/providers/google.js +5 -0
  465. package/dist/providers/google.js.map +1 -1
  466. package/dist/providers/index.d.ts +1 -1
  467. package/dist/providers/index.d.ts.map +1 -1
  468. package/dist/providers/index.js.map +1 -1
  469. package/dist/providers/openai.d.ts.map +1 -1
  470. package/dist/providers/openai.js +4 -0
  471. package/dist/providers/openai.js.map +1 -1
  472. package/dist/providers/types.d.ts +25 -2
  473. package/dist/providers/types.d.ts.map +1 -1
  474. package/dist/state/approval-state.d.ts +74 -0
  475. package/dist/state/approval-state.d.ts.map +1 -0
  476. package/dist/state/approval-state.js +127 -0
  477. package/dist/state/approval-state.js.map +1 -0
  478. package/dist/state/index.d.ts +3 -0
  479. package/dist/state/index.d.ts.map +1 -1
  480. package/dist/state/index.js +4 -1
  481. package/dist/state/index.js.map +1 -1
  482. package/dist/state/review-state.d.ts +15 -0
  483. package/dist/state/review-state.d.ts.map +1 -0
  484. package/dist/state/review-state.js +51 -0
  485. package/dist/state/review-state.js.map +1 -0
  486. package/dist/state/run-state.d.ts +39 -0
  487. package/dist/state/run-state.d.ts.map +1 -0
  488. package/dist/state/run-state.js +101 -0
  489. package/dist/state/run-state.js.map +1 -0
  490. package/dist/telemetry/emit.d.ts +41 -0
  491. package/dist/telemetry/emit.d.ts.map +1 -0
  492. package/dist/telemetry/emit.js +65 -0
  493. package/dist/telemetry/emit.js.map +1 -0
  494. package/dist/utils/git.d.ts +27 -0
  495. package/dist/utils/git.d.ts.map +1 -1
  496. package/dist/utils/git.js +50 -0
  497. package/dist/utils/git.js.map +1 -1
  498. package/hooks/hooks.json +17 -1
  499. package/hooks/session-start +42 -0
  500. package/package.json +5 -2
  501. package/scripts/check-prereqs.sh +12 -0
  502. package/scripts/e2e-graph-smoke.sh +167 -0
  503. package/scripts/graph-hook.mjs +151 -0
  504. package/scripts/run-kpi-gate.mjs +245 -0
  505. package/scripts/sync-skills.mjs +4 -1
  506. package/skills/bober.code-review/SKILL.md +186 -0
  507. package/skills/bober.debug/SKILL.md +300 -0
  508. package/skills/bober.deploy/SKILL.md +262 -0
  509. package/skills/bober.diagnose/SKILL.md +254 -0
  510. package/skills/bober.graph/SKILL.md +85 -0
  511. package/skills/bober.impact/SKILL.md +101 -0
  512. package/skills/bober.incident/SKILL.md +245 -0
  513. package/skills/bober.onboard/SKILL.md +84 -0
  514. package/skills/bober.plan/SKILL.md +10 -0
  515. package/skills/bober.postmortem/SKILL.md +231 -0
  516. package/skills/bober.runbook/SKILL.md +335 -0
  517. package/skills/bober.using-bober/SKILL.md +133 -0
  518. package/skills/bober.verify/SKILL.md +143 -0
@@ -0,0 +1,452 @@
1
+ /**
2
+ * Incident timeline append helpers (Sprint 19).
3
+ *
4
+ * Every helper that writes a domain artifact (observations.jsonl,
5
+ * actions.jsonl, changelog.jsonl, runbook-execution.jsonl) ALSO appends
6
+ * a corresponding event to timeline.jsonl in the same mutex tick. This
7
+ * makes "show me what happened in chronological order" a single file read.
8
+ *
9
+ * Append atomicity: fs.open with O_WRONLY|O_APPEND|O_CREAT plus explicit
10
+ * fh.chmod(0o600) after open — mirrors the audit.ts pattern from Sprint 13.
11
+ * fs.appendFile is NOT used because it does not reliably honor the mode
12
+ * argument across all Node versions (see audit.ts header comment).
13
+ *
14
+ * POSIX O_APPEND atomicity: single-line records are well under PIPE_BUF
15
+ * (4096 bytes), so cross-process appends are safe in practice.
16
+ *
17
+ * Concurrent appends to the same incident are serialized via a per-incidentId
18
+ * Promise-chain mutex. Unrelated incidents proceed in parallel.
19
+ *
20
+ * setIncidentStatus uses atomic temp-file + rename to avoid a torn write
21
+ * if the process crashes mid-update.
22
+ *
23
+ * Sprint 19 — src/incident/timeline.ts
24
+ */
25
+ import { open, mkdir, writeFile, readdir, readFile, rename } from "node:fs/promises";
26
+ import { constants } from "node:fs";
27
+ import { join } from "node:path";
28
+ import { emit } from "../telemetry/emit.js";
29
+ import { IncidentMetadataSchema, TimelineEventSchema, ObservationEntrySchema, ActionEntrySchema, ChangeEntrySchema, RunbookExecutionEntrySchema, } from "./types.js";
30
+ import { logger } from "../utils/logger.js";
31
+ // ── Per-incidentId mutex (Promise-chain pattern) ──────────────────────────────
32
+ // One chain per incidentId so unrelated incidents proceed in parallel.
33
+ // Mirrors the per-runId mutex in src/orchestrator/checkpoints/audit.ts.
34
+ const writeChains = new Map();
35
+ // ── Internal: append one JSON line ────────────────────────────────────────────
36
+ /**
37
+ * Append a single newline-terminated JSON line to `filePath`.
38
+ *
39
+ * The directory is created if absent. Mode 0600 is guaranteed via an
40
+ * explicit fh.chmod() call after open — the umask may reduce the mode
41
+ * set by the open() call itself.
42
+ */
43
+ async function appendOneLine(filePath, record) {
44
+ const dir = join(filePath, "..");
45
+ await mkdir(dir, { recursive: true });
46
+ const line = JSON.stringify(record) + "\n";
47
+ const flags = constants.O_WRONLY | constants.O_APPEND | constants.O_CREAT;
48
+ const fh = await open(filePath, flags, 0o600);
49
+ try {
50
+ // Guarantee mode 0600 even if umask would have reduced it.
51
+ await fh.chmod(0o600);
52
+ await fh.write(line);
53
+ }
54
+ finally {
55
+ await fh.close();
56
+ }
57
+ }
58
+ // ── Internal: atomic JSON rewrite via temp + rename ───────────────────────────
59
+ async function atomicWriteJson(filePath, data) {
60
+ const tmp = `${filePath}.${process.pid}.${Date.now()}.tmp`;
61
+ await writeFile(tmp, JSON.stringify(data, null, 2) + "\n", {
62
+ encoding: "utf-8",
63
+ mode: 0o600,
64
+ });
65
+ await rename(tmp, filePath);
66
+ }
67
+ // ── Internal: incident directory path ─────────────────────────────────────────
68
+ function incidentDir(projectRoot, incidentId) {
69
+ return join(projectRoot, ".bober", "incidents", incidentId);
70
+ }
71
+ // ── deriveSlug ─────────────────────────────────────────────────────────────────
72
+ /**
73
+ * Derive a short kebab-case slug from a symptom string.
74
+ *
75
+ * Rules:
76
+ * 1. Lowercase the input.
77
+ * 2. Split on whitespace; take the first 3 non-empty tokens.
78
+ * 3. For each token, strip all characters outside [a-z0-9] (unicode is stripped).
79
+ * 4. Join surviving tokens with '-'.
80
+ * 5. Strip leading/trailing hyphens.
81
+ * 6. Truncate to 30 characters (hard limit).
82
+ * 7. If the result is empty (empty input / all-punctuation / unicode-only), return 'untitled'.
83
+ *
84
+ * Exported for unit testing.
85
+ */
86
+ export function deriveSlug(symptom) {
87
+ const tokens = symptom
88
+ .toLowerCase()
89
+ .split(/\s+/)
90
+ .filter((t) => t.length > 0)
91
+ .slice(0, 3)
92
+ .map((t) => t.replace(/[^a-z0-9]/g, ""))
93
+ .filter((t) => t.length > 0);
94
+ const slug = tokens.join("-").replace(/^-+|-+$/g, "").slice(0, 30);
95
+ return slug.length > 0 ? slug : "untitled";
96
+ }
97
+ // ── createIncident ─────────────────────────────────────────────────────────────
98
+ /**
99
+ * Create a new incident artifact directory with all required files.
100
+ *
101
+ * Layout created:
102
+ * ```
103
+ * .bober/incidents/<incidentId>/
104
+ * incident.json — metadata (JSON)
105
+ * timeline.jsonl — chronological master event log (JSONL, empty)
106
+ * observations.jsonl — verified facts (JSONL, empty)
107
+ * actions.jsonl — actions taken/proposed (JSONL, empty)
108
+ * changelog.jsonl — deploys/config changes (JSONL, empty)
109
+ * runbook-execution.jsonl — runbook step results (JSONL, empty)
110
+ * hypotheses.md — current hypotheses (Markdown, empty)
111
+ * diagnoses/ — diagnosis JSON files from bober-diagnoser
112
+ * ```
113
+ *
114
+ * @param symptom Human-readable description of the incident trigger.
115
+ * @param projectRoot Absolute path to the project root (caller resolves this).
116
+ * @returns The new incident ID, e.g. 'inc-20260524-500-errors-on'.
117
+ */
118
+ export async function createIncident(symptom, projectRoot) {
119
+ const date = new Date().toISOString().slice(0, 10).replace(/-/g, "");
120
+ const slug = deriveSlug(symptom);
121
+ const incidentId = `inc-${date}-${slug}`;
122
+ const dir = incidentDir(projectRoot, incidentId);
123
+ await mkdir(dir, { recursive: true });
124
+ await mkdir(join(dir, "diagnoses"), { recursive: true });
125
+ // Initialize empty JSONL files with mode 0600.
126
+ const jsonlFiles = [
127
+ "timeline.jsonl",
128
+ "observations.jsonl",
129
+ "actions.jsonl",
130
+ "changelog.jsonl",
131
+ "runbook-execution.jsonl",
132
+ ];
133
+ for (const fname of jsonlFiles) {
134
+ const fpath = join(dir, fname);
135
+ const flags = constants.O_WRONLY | constants.O_CREAT;
136
+ const fh = await open(fpath, flags, 0o600);
137
+ await fh.chmod(0o600);
138
+ await fh.close();
139
+ }
140
+ // Initialize empty hypotheses.md with mode 0600.
141
+ await writeFile(join(dir, "hypotheses.md"), "", { encoding: "utf-8", mode: 0o600 });
142
+ // Write incident.json atomically.
143
+ const now = new Date().toISOString();
144
+ const metadata = {
145
+ incidentId,
146
+ symptom,
147
+ createdAt: now,
148
+ status: "investigating",
149
+ };
150
+ await atomicWriteJson(join(dir, "incident.json"), metadata);
151
+ // Emit initial timeline event.
152
+ const event = {
153
+ timestamp: now,
154
+ eventKind: "incident_created",
155
+ source: "system",
156
+ summary: `Incident created: ${symptom}`,
157
+ refPath: `.bober/incidents/${incidentId}/incident.json`,
158
+ };
159
+ await appendTimeline(projectRoot, incidentId, event);
160
+ return incidentId;
161
+ }
162
+ // ── appendTimeline ─────────────────────────────────────────────────────────────
163
+ /**
164
+ * Append a TimelineEvent to timeline.jsonl.
165
+ *
166
+ * This is the only append helper that writes ONLY to timeline.jsonl.
167
+ * All other append helpers call this implicitly via the double-write pattern.
168
+ */
169
+ export async function appendTimeline(projectRoot, incidentId, event) {
170
+ TimelineEventSchema.parse(event);
171
+ const dir = incidentDir(projectRoot, incidentId);
172
+ const timelinePath = join(dir, "timeline.jsonl");
173
+ const prev = writeChains.get(incidentId) ?? Promise.resolve();
174
+ const next = prev.then(() => appendOneLine(timelinePath, event));
175
+ writeChains.set(incidentId, next.catch(() => { }));
176
+ return next;
177
+ }
178
+ // ── appendObservation ──────────────────────────────────────────────────────────
179
+ /**
180
+ * Append an ObservationEntry to observations.jsonl AND emit a timeline event.
181
+ *
182
+ * Both writes happen inside the same mutex tick so they are ordered
183
+ * deterministically relative to other concurrent appends on this incident.
184
+ */
185
+ export async function appendObservation(projectRoot, incidentId, entry) {
186
+ ObservationEntrySchema.parse(entry);
187
+ const dir = incidentDir(projectRoot, incidentId);
188
+ const obsPath = join(dir, "observations.jsonl");
189
+ const timelinePath = join(dir, "timeline.jsonl");
190
+ const timelineEvent = {
191
+ timestamp: entry.timestamp,
192
+ eventKind: "observation_recorded",
193
+ source: "diagnoser",
194
+ summary: entry.observation.slice(0, 200),
195
+ refPath: `.bober/incidents/${incidentId}/observations.jsonl`,
196
+ };
197
+ const prev = writeChains.get(incidentId) ?? Promise.resolve();
198
+ const next = prev.then(async () => {
199
+ await appendOneLine(obsPath, entry);
200
+ await appendOneLine(timelinePath, timelineEvent);
201
+ });
202
+ writeChains.set(incidentId, next.catch(() => { }));
203
+ return next;
204
+ }
205
+ // ── appendAction ───────────────────────────────────────────────────────────────
206
+ /**
207
+ * Append an ActionEntry to actions.jsonl AND emit a timeline event.
208
+ */
209
+ export async function appendAction(projectRoot, incidentId, entry) {
210
+ ActionEntrySchema.parse(entry);
211
+ const dir = incidentDir(projectRoot, incidentId);
212
+ const actionsPath = join(dir, "actions.jsonl");
213
+ const timelinePath = join(dir, "timeline.jsonl");
214
+ const timelineEvent = {
215
+ timestamp: entry.timestamp,
216
+ eventKind: "action_taken",
217
+ source: "human",
218
+ summary: entry.action.slice(0, 200),
219
+ refPath: `.bober/incidents/${incidentId}/actions.jsonl`,
220
+ };
221
+ const prev = writeChains.get(incidentId) ?? Promise.resolve();
222
+ const next = prev.then(async () => {
223
+ await appendOneLine(actionsPath, entry);
224
+ await appendOneLine(timelinePath, timelineEvent);
225
+ });
226
+ writeChains.set(incidentId, next.catch(() => { }));
227
+ return next;
228
+ }
229
+ // ── appendChange ───────────────────────────────────────────────────────────────
230
+ /**
231
+ * Append a ChangeEntry to changelog.jsonl AND emit a timeline event.
232
+ *
233
+ * Throws a ZodError if `entry.inverse` is missing — the field is REQUIRED
234
+ * at the schema level so Sprint 21 rollback awareness can always find an
235
+ * inverse for every executed change.
236
+ *
237
+ * The zod validation runs BEFORE the mutex is entered so no file is
238
+ * touched if validation fails.
239
+ */
240
+ export async function appendChange(projectRoot, incidentId, entry) {
241
+ // Validate BEFORE entering the mutex — throws ZodError if inverse is missing.
242
+ ChangeEntrySchema.parse(entry);
243
+ const dir = incidentDir(projectRoot, incidentId);
244
+ const changelogPath = join(dir, "changelog.jsonl");
245
+ const timelinePath = join(dir, "timeline.jsonl");
246
+ const timelineEvent = {
247
+ timestamp: entry.executedAt,
248
+ eventKind: "change_recorded",
249
+ source: "deployer",
250
+ summary: entry.description.slice(0, 200),
251
+ refPath: `.bober/incidents/${incidentId}/changelog.jsonl`,
252
+ };
253
+ const prev = writeChains.get(incidentId) ?? Promise.resolve();
254
+ const next = prev.then(async () => {
255
+ await appendOneLine(changelogPath, entry);
256
+ await appendOneLine(timelinePath, timelineEvent);
257
+ });
258
+ writeChains.set(incidentId, next.catch(() => { }));
259
+ return next;
260
+ }
261
+ // ── appendRunbookExecution ─────────────────────────────────────────────────────
262
+ /**
263
+ * Append a RunbookExecutionEntry to runbook-execution.jsonl AND emit a
264
+ * timeline event.
265
+ */
266
+ export async function appendRunbookExecution(projectRoot, incidentId, entry) {
267
+ RunbookExecutionEntrySchema.parse(entry);
268
+ const dir = incidentDir(projectRoot, incidentId);
269
+ const runbookPath = join(dir, "runbook-execution.jsonl");
270
+ const timelinePath = join(dir, "timeline.jsonl");
271
+ const timelineEvent = {
272
+ timestamp: entry.timestamp,
273
+ eventKind: "runbook_step_executed",
274
+ source: "system",
275
+ summary: `${entry.runbookName} step ${entry.stepNumber}: ${entry.status}`,
276
+ refPath: `.bober/incidents/${incidentId}/runbook-execution.jsonl`,
277
+ };
278
+ const prev = writeChains.get(incidentId) ?? Promise.resolve();
279
+ const next = prev.then(async () => {
280
+ await appendOneLine(runbookPath, entry);
281
+ await appendOneLine(timelinePath, timelineEvent);
282
+ });
283
+ writeChains.set(incidentId, next.catch(() => { }));
284
+ return next;
285
+ }
286
+ // ── setIncidentStatus ──────────────────────────────────────────────────────────
287
+ /** Override token regex: prefix 'SKIP_METRIC_VERIFY:' with at least one non-whitespace char after optional spaces. */
288
+ const OVERRIDE_TOKEN_RE = /^SKIP_METRIC_VERIFY:\s*(.+)$/;
289
+ /**
290
+ * Update the status field in incident.json atomically.
291
+ *
292
+ * If status is 'resolved', sets resolvedAt to now (ISO-8601) automatically.
293
+ * Any additional fields in `extras` are merged in.
294
+ *
295
+ * Sprint 22 resolution gate: when transitioning to 'resolved', one of the
296
+ * following MUST be provided via opts:
297
+ * 1. opts.verifyResult with verified=true — metric verification passed.
298
+ * 2. opts.overrideToken matching 'SKIP_METRIC_VERIFY: <reason>' with a
299
+ * non-empty, non-whitespace reason — operator override with audit trail.
300
+ * Any other call to setIncidentStatus(id, 'resolved') will THROW.
301
+ *
302
+ * Uses temp-file + POSIX rename for crash safety.
303
+ */
304
+ export async function setIncidentStatus(projectRoot, incidentId, status, extras, opts) {
305
+ const dir = incidentDir(projectRoot, incidentId);
306
+ const metaPath = join(dir, "incident.json");
307
+ const raw = await readFile(metaPath, "utf-8");
308
+ const existing = IncidentMetadataSchema.parse(JSON.parse(raw));
309
+ // ── Resolution gate (s22-c3, s22-c4) ──────────────────────────────────────
310
+ let resolutionEvidence;
311
+ let timelineEvent;
312
+ const now = new Date().toISOString();
313
+ if (status === "resolved") {
314
+ const verified = opts?.verifyResult?.verified === true;
315
+ const overrideMatch = opts?.overrideToken
316
+ ? OVERRIDE_TOKEN_RE.exec(opts.overrideToken)
317
+ : null;
318
+ // Trim the override reason and require non-empty after trim.
319
+ const overrideReason = overrideMatch?.[1]?.trim();
320
+ if (verified && opts?.verifyResult) {
321
+ resolutionEvidence = {
322
+ verified: true,
323
+ observedValue: opts.verifyResult.observedValue,
324
+ sampledAt: opts.verifyResult.sampledAt,
325
+ evidencePath: opts.verifyResult.evidencePath,
326
+ reason: opts.verifyResult.reason,
327
+ hint: opts.verifyResult.hint,
328
+ };
329
+ timelineEvent = {
330
+ timestamp: now,
331
+ eventKind: "incident_resolved",
332
+ source: "system",
333
+ summary: `Resolved: metric verified (observedValue=${opts.verifyResult.observedValue ?? "n/a"})`,
334
+ refPath: opts.verifyResult.evidencePath,
335
+ };
336
+ }
337
+ else if (overrideReason && overrideReason.length > 0) {
338
+ resolutionEvidence = {
339
+ verified: false,
340
+ override: { reason: overrideReason, at: now },
341
+ };
342
+ timelineEvent = {
343
+ timestamp: now,
344
+ eventKind: "incident_resolved_override",
345
+ source: "human",
346
+ summary: `Resolved via override: ${overrideReason}`,
347
+ };
348
+ }
349
+ else {
350
+ throw new Error(`setIncidentStatus to 'resolved' requires opts.verifyResult.verified=true ` +
351
+ `OR opts.overrideToken='SKIP_METRIC_VERIFY: <reason>' with a non-empty reason. ` +
352
+ `Got: verifyResult.verified=${opts?.verifyResult?.verified ?? "<missing>"}, ` +
353
+ `overrideToken=${opts?.overrideToken !== undefined ? `'${opts.overrideToken}'` : "<missing>"}.`);
354
+ }
355
+ }
356
+ const updated = {
357
+ ...existing,
358
+ ...extras,
359
+ status,
360
+ ...(status === "resolved" && !existing.resolvedAt ? { resolvedAt: now } : {}),
361
+ ...(resolutionEvidence !== undefined ? { resolutionEvidence } : {}),
362
+ };
363
+ await atomicWriteJson(metaPath, updated);
364
+ if (timelineEvent !== undefined) {
365
+ await appendTimeline(projectRoot, incidentId, timelineEvent);
366
+ }
367
+ // ── Sprint 28: telemetry emit for incident-resolved (fire-and-forget) ────────
368
+ // Only when opts.config is provided (callers without config skip telemetry).
369
+ if (status === "resolved" && opts?.config && opts.telemetryProjectRoot) {
370
+ const durationMs = existing.createdAt
371
+ ? Date.now() - new Date(existing.createdAt).getTime()
372
+ : undefined;
373
+ void emit(opts.telemetryProjectRoot, opts.config, "incident-resolved", {
374
+ incidentId,
375
+ durationMs,
376
+ });
377
+ }
378
+ // ── Sprint 23: async postmortem trigger (fire-and-forget) ─────────────────
379
+ // Default ON when status='resolved' — explicit autoPostmortem=false disables.
380
+ // Do NOT await: status transition returns immediately. Postmortem completion
381
+ // updates incident.json.postmortemPath in a follow-up atomic write.
382
+ if (status === "resolved" && opts?.autoPostmortem !== false) {
383
+ // Dynamic import avoids a static load-order coupling between timeline.ts
384
+ // and postmortem.ts — postmortem.ts is a leaf module with no deps on
385
+ // timeline.ts, but the dynamic import keeps the boundary clean.
386
+ const p = (async () => {
387
+ try {
388
+ const { generatePostmortem } = await import("./postmortem.js");
389
+ const result = await generatePostmortem(projectRoot, incidentId);
390
+ // After synthesis: update incident.json.postmortemPath in a NEW
391
+ // atomic write. Re-read fresh to avoid stomping concurrent changes.
392
+ const freshRaw = await readFile(metaPath, "utf-8");
393
+ const fresh = IncidentMetadataSchema.parse(JSON.parse(freshRaw));
394
+ await atomicWriteJson(metaPath, { ...fresh, postmortemPath: result.path });
395
+ }
396
+ catch (err) {
397
+ logger.warn(`[setIncidentStatus] Auto-postmortem failed for ${incidentId}: ${err instanceof Error ? err.message : String(err)}`);
398
+ }
399
+ })();
400
+ if (opts?.onPostmortemPromise)
401
+ opts.onPostmortemPromise(p);
402
+ void p;
403
+ }
404
+ }
405
+ // ── listIncidents ──────────────────────────────────────────────────────────────
406
+ /**
407
+ * List all incidents in .bober/incidents/, sorted by createdAt descending.
408
+ *
409
+ * Gracefully handles:
410
+ * - Missing .bober/incidents/ directory → returns [].
411
+ * - Malformed incident.json → logged via logger.warn, skipped.
412
+ *
413
+ * ENOENT on readdir is caught and returns []. Any other readdir error is
414
+ * re-thrown (do NOT silence unexpected failures).
415
+ */
416
+ export async function listIncidents(projectRoot) {
417
+ const incidentsDir = join(projectRoot, ".bober", "incidents");
418
+ let entries;
419
+ try {
420
+ entries = await readdir(incidentsDir);
421
+ }
422
+ catch (err) {
423
+ if (typeof err === "object" &&
424
+ err !== null &&
425
+ err.code === "ENOENT") {
426
+ return [];
427
+ }
428
+ throw err;
429
+ }
430
+ const summaries = [];
431
+ for (const entry of entries) {
432
+ const metaPath = join(incidentsDir, entry, "incident.json");
433
+ try {
434
+ const raw = await readFile(metaPath, "utf-8");
435
+ const meta = IncidentMetadataSchema.parse(JSON.parse(raw));
436
+ summaries.push({
437
+ incidentId: meta.incidentId,
438
+ symptom: meta.symptom,
439
+ createdAt: meta.createdAt,
440
+ status: meta.status,
441
+ ...(meta.resolvedAt !== undefined ? { resolvedAt: meta.resolvedAt } : {}),
442
+ });
443
+ }
444
+ catch (err) {
445
+ logger.warn(`[listIncidents] Skipping malformed incident.json at ${metaPath}: ${err instanceof Error ? err.message : String(err)}`);
446
+ }
447
+ }
448
+ // Sort descending by createdAt (ISO strings compare lexicographically).
449
+ summaries.sort((a, b) => (a.createdAt < b.createdAt ? 1 : a.createdAt > b.createdAt ? -1 : 0));
450
+ return summaries;
451
+ }
452
+ //# sourceMappingURL=timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.js","sourceRoot":"","sources":["../../src/incident/timeline.ts"],"names":[],"mappings":"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"}