@repo-os/repoos 0.5.67 → 0.5.68

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 (287) hide show
  1. package/dist/.build-info.json +2 -2
  2. package/dist/.build-stamp.json +1 -1
  3. package/dist/cli/api-route-parity.js +4 -0
  4. package/dist/cli/help.js +30 -5
  5. package/dist/cli/index.js +27 -1
  6. package/dist/cli/repoos-api.d.ts +4 -0
  7. package/dist/cli/repoos-api.js +15 -0
  8. package/dist/cli/sse-client.d.ts +5 -0
  9. package/dist/cli/sse-client.js +42 -0
  10. package/dist/cli/task-flags.d.ts +23 -0
  11. package/dist/cli/task-flags.js +79 -0
  12. package/dist/commands/check.d.ts +12 -9
  13. package/dist/commands/check.js +44 -21
  14. package/dist/commands/control-api.d.ts +1 -0
  15. package/dist/commands/control-api.js +41 -1
  16. package/dist/commands/driver.d.ts +1 -0
  17. package/dist/commands/driver.js +178 -0
  18. package/dist/commands/init.js +15 -1
  19. package/dist/commands/shot.js +17 -11
  20. package/dist/commands/status.d.ts +46 -0
  21. package/dist/commands/status.js +109 -10
  22. package/dist/commands/stories.d.ts +14 -0
  23. package/dist/commands/stories.js +294 -0
  24. package/dist/commands/tasks.d.ts +20 -6
  25. package/dist/commands/tasks.js +51 -46
  26. package/dist/commands/watch.d.ts +16 -0
  27. package/dist/commands/watch.js +109 -0
  28. package/dist/core/attention.d.ts +17 -1
  29. package/dist/core/attention.js +100 -0
  30. package/dist/core/build.d.ts +2 -0
  31. package/dist/core/build.js +7 -3
  32. package/dist/core/check-failure-summary.d.ts +15 -1
  33. package/dist/core/check-failure-summary.js +88 -1
  34. package/dist/core/check-results.js +4 -1
  35. package/dist/core/check-slowness.d.ts +160 -0
  36. package/dist/core/check-slowness.js +203 -0
  37. package/dist/core/check-store.d.ts +1 -1
  38. package/dist/core/close-out-gate.d.ts +97 -0
  39. package/dist/core/close-out-gate.js +132 -0
  40. package/dist/core/config.d.ts +25 -0
  41. package/dist/core/config.js +128 -15
  42. package/dist/core/decision-digest.d.ts +102 -0
  43. package/dist/core/decision-digest.js +416 -0
  44. package/dist/core/doctor.js +48 -1
  45. package/dist/core/driver-brief.d.ts +203 -0
  46. package/dist/core/driver-brief.js +294 -0
  47. package/dist/core/git.d.ts +2 -4
  48. package/dist/core/git.js +30 -28
  49. package/dist/core/page-browser-gate.d.ts +1 -1
  50. package/dist/core/project-docs-agents-paths.test.d.ts +1 -0
  51. package/dist/core/project-docs-agents-paths.test.js +22 -0
  52. package/dist/core/project-docs.d.ts +5 -0
  53. package/dist/core/project-docs.js +37 -0
  54. package/dist/core/record-creator.d.ts +13 -0
  55. package/dist/core/record-creator.js +45 -0
  56. package/dist/core/record-creator.test.d.ts +1 -0
  57. package/dist/core/record-creator.test.js +74 -0
  58. package/dist/core/remote-pool-queue.js +10 -4
  59. package/dist/core/repoos.d.ts +4 -0
  60. package/dist/core/repoos.js +5 -0
  61. package/dist/core/review-verdict.d.ts +5 -0
  62. package/dist/core/review-verdict.js +28 -0
  63. package/dist/core/review-verdict.test.js +8 -1
  64. package/dist/core/review-verification.d.ts +107 -0
  65. package/dist/core/review-verification.js +281 -0
  66. package/dist/core/review-verification.test.d.ts +1 -0
  67. package/dist/core/review-verification.test.js +148 -0
  68. package/dist/core/service-manager.d.ts +9 -0
  69. package/dist/core/service-manager.js +11 -0
  70. package/dist/core/shot-assertions.d.ts +50 -0
  71. package/dist/core/shot-assertions.js +109 -0
  72. package/dist/core/shot-fixtures.d.ts +14 -0
  73. package/dist/core/shot-fixtures.js +24 -0
  74. package/dist/core/shot-page.d.ts +7 -1
  75. package/dist/core/shot-page.js +21 -9
  76. package/dist/core/shot-plan.d.ts +61 -0
  77. package/dist/core/shot-plan.js +126 -3
  78. package/dist/core/story-definition-files.js +1 -1
  79. package/dist/core/task-activity-strip.test.d.ts +1 -0
  80. package/dist/core/task-activity-strip.test.js +25 -0
  81. package/dist/core/task-body-normalize.test.d.ts +1 -0
  82. package/dist/core/task-body-normalize.test.js +72 -0
  83. package/dist/core/task.d.ts +13 -0
  84. package/dist/core/task.js +106 -1
  85. package/dist/core/types.d.ts +29 -0
  86. package/dist/core/types.js +2 -0
  87. package/dist/server/agents.d.ts +15 -0
  88. package/dist/server/agents.js +37 -2
  89. package/dist/server/approval-policy.js +4 -0
  90. package/dist/server/attention-feed.d.ts +52 -1
  91. package/dist/server/attention-feed.js +121 -1
  92. package/dist/server/board-events.d.ts +26 -0
  93. package/dist/server/board-events.js +146 -0
  94. package/dist/server/conflict-resolution.d.ts +344 -0
  95. package/dist/server/conflict-resolution.js +501 -0
  96. package/dist/server/cto-actions.d.ts +1 -0
  97. package/dist/server/cto-actions.js +1 -1
  98. package/dist/server/cto-heartbeat.d.ts +14 -0
  99. package/dist/server/cto-heartbeat.js +24 -0
  100. package/dist/server/cto-monitor.d.ts +3 -0
  101. package/dist/server/cto-monitor.js +6 -0
  102. package/dist/server/cto.d.ts +7 -2
  103. package/dist/server/cto.js +27 -37
  104. package/dist/server/debug-tldr.d.ts +1 -1
  105. package/dist/server/debug-tldr.js +2 -1
  106. package/dist/server/decision-digest.d.ts +16 -0
  107. package/dist/server/decision-digest.js +94 -0
  108. package/dist/server/done.d.ts +7 -1
  109. package/dist/server/driver-brief.d.ts +18 -0
  110. package/dist/server/driver-brief.js +292 -0
  111. package/dist/server/handoff.d.ts +4 -12
  112. package/dist/server/handoff.js +43 -9
  113. package/dist/server/integration-job.d.ts +41 -6
  114. package/dist/server/integration-job.js +78 -3
  115. package/dist/server/integration-orchestrator.d.ts +146 -2
  116. package/dist/server/integration-orchestrator.js +893 -150
  117. package/dist/server/integration-status.d.ts +7 -2
  118. package/dist/server/integration-status.js +18 -4
  119. package/dist/server/live-index.d.ts +20 -0
  120. package/dist/server/live-index.js +22 -1
  121. package/dist/server/pre-review-remote-gate.d.ts +6 -0
  122. package/dist/server/pre-review-remote-gate.js +6 -0
  123. package/dist/server/preview-verification-slot.d.ts +11 -0
  124. package/dist/server/preview-verification-slot.js +34 -0
  125. package/dist/server/release.d.ts +7 -0
  126. package/dist/server/release.js +16 -0
  127. package/dist/server/remote-validation.d.ts +148 -7
  128. package/dist/server/remote-validation.js +602 -107
  129. package/dist/server/request-close-out.js +8 -0
  130. package/dist/server/review-verification-gather.d.ts +6 -0
  131. package/dist/server/review-verification-gather.js +89 -0
  132. package/dist/server/review.js +42 -5
  133. package/dist/server/routes/attention.js +9 -0
  134. package/dist/server/routes/decisions.d.ts +3 -0
  135. package/dist/server/routes/decisions.js +14 -0
  136. package/dist/server/routes/driver.d.ts +3 -0
  137. package/dist/server/routes/driver.js +15 -0
  138. package/dist/server/routes/helpers.d.ts +1 -0
  139. package/dist/server/routes/index.d.ts +2 -0
  140. package/dist/server/routes/index.js +2 -0
  141. package/dist/server/routes/info.js +7 -0
  142. package/dist/server/routes/stories.d.ts +30 -1
  143. package/dist/server/routes/stories.js +112 -9
  144. package/dist/server/routes/tasks.d.ts +2 -0
  145. package/dist/server/routes/tasks.js +55 -8
  146. package/dist/server/routes/types.d.ts +20 -0
  147. package/dist/server/server.js +159 -15
  148. package/dist/server/shot-capture.d.ts +8 -21
  149. package/dist/server/shot-capture.js +62 -9
  150. package/dist/server/shots.d.ts +16 -0
  151. package/dist/server/shots.js +6 -0
  152. package/dist/server/task-body-migration.d.ts +18 -0
  153. package/dist/server/task-body-migration.js +152 -0
  154. package/dist/server/task-check.d.ts +6 -0
  155. package/dist/server/task-check.js +14 -0
  156. package/dist/server/task-watchdog.d.ts +9 -0
  157. package/dist/server/task-watchdog.js +8 -0
  158. package/dist/server/ui-handoff-gate.d.ts +73 -2
  159. package/dist/server/ui-handoff-gate.js +335 -91
  160. package/dist/server/write.d.ts +7 -0
  161. package/dist/server/write.js +6 -2
  162. package/dist/ui/assets/{AgentModelModal-DhY5NOZ1.js → AgentModelModal-BU_T-d03.js} +1 -1
  163. package/dist/ui/assets/AgentsView-0r3QjL0C.css +1 -0
  164. package/dist/ui/assets/AgentsView-B2AXFnUJ.js +1 -0
  165. package/dist/ui/assets/ChecksView-CVnvMKM-.css +1 -0
  166. package/dist/ui/assets/ChecksView-RAHI2BB3.js +0 -0
  167. package/dist/ui/assets/ContextView-DAxjJdK4.js +4 -0
  168. package/dist/ui/assets/DashboardView-DtXleA5o.css +1 -0
  169. package/dist/ui/assets/DashboardView-hZr-QF_E.js +1 -0
  170. package/dist/ui/assets/{DiffView-qdIZFGbS.js → DiffView-DLFmq-vx.js} +1 -1
  171. package/dist/ui/assets/{FailedTestsList-92u0pppH.js → FailedTestsList-3_oexlME.js} +1 -1
  172. package/dist/ui/assets/{InputsView-DtPR9kyl.js → InputsView-CE9ZOYMD.js} +1 -1
  173. package/dist/ui/assets/{LoginView-DWEf0kRL.js → LoginView-dfYNibLg.js} +1 -1
  174. package/dist/ui/assets/ReleasesView-BCE0uCPM.css +1 -0
  175. package/dist/ui/assets/ReleasesView-Cq8kGWZq.js +5 -0
  176. package/dist/ui/assets/SettingsView-BzZQH1hi.js +4 -0
  177. package/dist/ui/assets/StoriesView-3P5nmoFU.js +1 -0
  178. package/dist/ui/assets/{VoiceDictate-sbY2kf3g.js → VoiceDictate-CMtXjAXc.js} +1 -1
  179. package/dist/ui/assets/WorkView-BhDux3s_.css +1 -0
  180. package/dist/ui/assets/WorkView-P_JFoClW.js +2 -0
  181. package/dist/ui/assets/{abnfDiagram-VCTEODGH-DbjEiPQk.js → abnfDiagram-VCTEODGH-DB7IT3Oz.js} +1 -1
  182. package/dist/ui/assets/architecture-7GRP2DOG-D0IdEE2Q.js +1 -0
  183. package/dist/ui/assets/{architectureDiagram-5GKGNRK7-iuYOljXl.js → architectureDiagram-5GKGNRK7-BKe4O-fa.js} +1 -1
  184. package/dist/ui/assets/{blockDiagram-I7D4REHJ-BMQZCcl4.js → blockDiagram-I7D4REHJ-CSam08UZ.js} +1 -1
  185. package/dist/ui/assets/{c4Diagram-7LVT6UL2-CYARlZF5.js → c4Diagram-7LVT6UL2-D6YRpohJ.js} +1 -1
  186. package/dist/ui/assets/channel-C0fJQ3Uq.js +1 -0
  187. package/dist/ui/assets/{chunk-4HAMMTFA-C-0fE7Hb.js → chunk-4HAMMTFA-BnbHtCpa.js} +1 -1
  188. package/dist/ui/assets/{chunk-75Z2AOVW-9h5YgMdt.js → chunk-75Z2AOVW-CYy9Me4H.js} +1 -1
  189. package/dist/ui/assets/{chunk-DU6HZSFF-9BISDKkf.js → chunk-DU6HZSFF-JVoEkt2i.js} +1 -1
  190. package/dist/ui/assets/{chunk-F27PBJKO-VJth4ETL.js → chunk-F27PBJKO-g4ruqsFu.js} +1 -1
  191. package/dist/ui/assets/{chunk-GMAD6QVW-CMTnCPtC.js → chunk-GMAD6QVW-BfX4kTq8.js} +1 -1
  192. package/dist/ui/assets/{chunk-GVQU2GXP-bjPEFMMp.js → chunk-GVQU2GXP-C9yJ2E9t.js} +1 -1
  193. package/dist/ui/assets/{chunk-IMKFNOWR-C1BByNVf.js → chunk-IMKFNOWR-CbzZAPQV.js} +1 -1
  194. package/dist/ui/assets/{chunk-L3NEJ4N5-whMpUmjS.js → chunk-L3NEJ4N5-Cjbclivl.js} +1 -1
  195. package/dist/ui/assets/{chunk-OSK3NFVY-B6Ch9_w3.js → chunk-OSK3NFVY-YA4gtld_.js} +1 -1
  196. package/dist/ui/assets/{chunk-P2QGCYS3-CWRV4Ah9.js → chunk-P2QGCYS3-Cj7e9ARN.js} +1 -1
  197. package/dist/ui/assets/{chunk-POPQ4Y6H-CcHY8rtu.js → chunk-POPQ4Y6H-fwh_frIf.js} +1 -1
  198. package/dist/ui/assets/{chunk-PWAF6VOD-BC0VBnZU.js → chunk-PWAF6VOD-BUHsDYf7.js} +1 -1
  199. package/dist/ui/assets/{chunk-SHT3W25Y-DfFIsip4.js → chunk-SHT3W25Y-BsPOUuAn.js} +1 -1
  200. package/dist/ui/assets/{chunk-SVP7TREG-C3xL4bvJ.js → chunk-SVP7TREG-CwMeLZi5.js} +1 -1
  201. package/dist/ui/assets/{chunk-TICWLB2K-Bt1FxNVL.js → chunk-TICWLB2K-B9QsE3VX.js} +1 -1
  202. package/dist/ui/assets/classDiagram-ZZMXUADV-DdZ1tR-T.js +1 -0
  203. package/dist/ui/assets/classDiagram-v2-VYDZK3BY-DdZ1tR-T.js +1 -0
  204. package/dist/ui/assets/{cynefin-OW5HDTMX-BPQzV4Oh.js → cynefin-OW5HDTMX-DaO-Ofss.js} +1 -1
  205. package/dist/ui/assets/{cynefinDiagram-5FMLGOSQ-BTmi3fdq.js → cynefinDiagram-5FMLGOSQ-DbkXxB0L.js} +1 -1
  206. package/dist/ui/assets/{dagre-GXQ25YYZ-EBMMAtpz.js → dagre-GXQ25YYZ-CJefo5Cd.js} +1 -1
  207. package/dist/ui/assets/{diagram-S7CK7UJ4-BaEfBV0o.js → diagram-S7CK7UJ4-BshX_cqp.js} +1 -1
  208. package/dist/ui/assets/{diagram-UQ7AKVKN-BRL9YWBF.js → diagram-UQ7AKVKN-xP1_CqiO.js} +1 -1
  209. package/dist/ui/assets/{diagram-VSXAHHWV-CI_jmzDG.js → diagram-VSXAHHWV-BygVWS22.js} +1 -1
  210. package/dist/ui/assets/{diagram-VX7I27RA-DoZgqatt.js → diagram-VX7I27RA-CH--xipF.js} +1 -1
  211. package/dist/ui/assets/{diagram-Z3DM3KII-CEZOwotu.js → diagram-Z3DM3KII-DJrYKohr.js} +1 -1
  212. package/dist/ui/assets/{ebnfDiagram-PWID7BFC-DoHUC2pF.js → ebnfDiagram-PWID7BFC-BkQ5ACZ8.js} +1 -1
  213. package/dist/ui/assets/{erDiagram-RLTQ6QDP-Bpj96FeR.js → erDiagram-RLTQ6QDP-DKrnpHSN.js} +1 -1
  214. package/dist/ui/assets/eventmodeling-NTZA5JFV-DHsluImP.js +1 -0
  215. package/dist/ui/assets/flowDiagram-HODETNUW-CpTJSjiU.js +1 -0
  216. package/dist/ui/assets/{ganttDiagram-EL5Y4UJY-BXWL7ow_.js → ganttDiagram-EL5Y4UJY-DzU13pix.js} +1 -1
  217. package/dist/ui/assets/{gitGraph-4MIJSDKK-CygEn6Pm.js → gitGraph-4MIJSDKK-C2NqgafQ.js} +1 -1
  218. package/dist/ui/assets/{gitGraphDiagram-WWUBYQGX-BEN8kG8Y.js → gitGraphDiagram-WWUBYQGX-CD7Lar3K.js} +1 -1
  219. package/dist/ui/assets/index-C3vwYKvY.js +55 -0
  220. package/dist/ui/assets/index-CjZQAL44.css +1 -0
  221. package/dist/ui/assets/{info-A6RAGUB7-CG18k5Tc.js → info-A6RAGUB7-Cl6FFCuQ.js} +1 -1
  222. package/dist/ui/assets/{infoDiagram-27XIBGKW-BVEnM-o1.js → infoDiagram-27XIBGKW-Co-YjPmk.js} +1 -1
  223. package/dist/ui/assets/{ishikawaDiagram-5VMMS53U-Bz24j_3Q.js → ishikawaDiagram-5VMMS53U-Cdigo_vG.js} +1 -1
  224. package/dist/ui/assets/{journeyDiagram-3NMN7TZE-Cw49nq1P.js → journeyDiagram-3NMN7TZE-DmZ4MIYL.js} +1 -1
  225. package/dist/ui/assets/{kanban-definition-UXKFOSKX-Ck2BMOZW.js → kanban-definition-UXKFOSKX-2sVFLArm.js} +1 -1
  226. package/dist/ui/assets/{line-3ywrXSvS.js → line-C77c3pt1.js} +1 -1
  227. package/dist/ui/assets/{mermaid-parser.core-pTkacvis.js → mermaid-parser.core-xjtJ3pXb.js} +3 -3
  228. package/dist/ui/assets/{mermaid.core-KI_Ug6Sr.js → mermaid.core-CMyeUwV9.js} +4 -4
  229. package/dist/ui/assets/{mindmap-definition-YA3MSWOX-CK7Qs2O6.js → mindmap-definition-YA3MSWOX-BsOAbuQD.js} +1 -1
  230. package/dist/ui/assets/{packet-AYTQ26CC-CB1LAlf8.js → packet-AYTQ26CC-BDcVOEez.js} +1 -1
  231. package/dist/ui/assets/{pegDiagram-XKGWAZYB-C7wyvhpZ.js → pegDiagram-XKGWAZYB-C1hq_Ygi.js} +1 -1
  232. package/dist/ui/assets/{pie-WAS4IAKB-CtkGbS6o.js → pie-WAS4IAKB-CXk97zCx.js} +1 -1
  233. package/dist/ui/assets/{pieDiagram-E7YTZNPT-DqYUbDdy.js → pieDiagram-E7YTZNPT-CG9wAg_-.js} +1 -1
  234. package/dist/ui/assets/{quadrantDiagram-AXDQQJYC-BVzreR-s.js → quadrantDiagram-AXDQQJYC-BFIIZWqg.js} +1 -1
  235. package/dist/ui/assets/{radar-RG4KPBEZ-ElYRqk-4.js → radar-RG4KPBEZ-D9HuDG1X.js} +1 -1
  236. package/dist/ui/assets/{railroad-74A4TZTK-XUiiGOGw.js → railroad-74A4TZTK-kCOU5-RT.js} +1 -1
  237. package/dist/ui/assets/railroad-abnf-HS5TGJTU-CtNhQpzv.js +1 -0
  238. package/dist/ui/assets/railroad-ebnf-LZEXJU2U-5rUlNGX_.js +1 -0
  239. package/dist/ui/assets/railroad-peg-WCYAUIDC-DOPhbUMW.js +1 -0
  240. package/dist/ui/assets/{railroadDiagram-O6MQD6OU-C-um7ttl.js → railroadDiagram-O6MQD6OU-RK45rPYx.js} +1 -1
  241. package/dist/ui/assets/repo-Rgx38OJH.js +2 -0
  242. package/dist/ui/assets/{requirementDiagram-BXWQKSXE-CB77SNNB.js → requirementDiagram-BXWQKSXE-DzN62GBp.js} +1 -1
  243. package/dist/ui/assets/{sankeyDiagram-P5KCCOFB-D_qnpDIk.js → sankeyDiagram-P5KCCOFB-Twa9FjBx.js} +1 -1
  244. package/dist/ui/assets/{sequenceDiagram-WJ2MYXX4-DrR-O2gR.js → sequenceDiagram-WJ2MYXX4-DGUe1AcR.js} +1 -1
  245. package/dist/ui/assets/{stateDiagram-D77RDMKH-Mz-Cjby1.js → stateDiagram-D77RDMKH-ByryPTRm.js} +1 -1
  246. package/dist/ui/assets/stateDiagram-v2-MP3YSRHH-xS7RBCS4.js +1 -0
  247. package/dist/ui/assets/{swimlanes-42K2YHIH-BwFAfw2O.js → swimlanes-42K2YHIH-CnU3MB_t.js} +1 -1
  248. package/dist/ui/assets/swimlanesDiagram-VR7AAH4N-Dd7VwNJ9.js +8 -0
  249. package/dist/ui/assets/{time-CwKjNEcq.js → time-CD85vGC0.js} +1 -1
  250. package/dist/ui/assets/{timeline-definition-24CTP7MA-DS_U9LBk.js → timeline-definition-24CTP7MA-D5A6I-WY.js} +1 -1
  251. package/dist/ui/assets/{treeView-Q6P3EWNA-D0Ds2Pnh.js → treeView-Q6P3EWNA-BzAgp6hO.js} +1 -1
  252. package/dist/ui/assets/{treemap-WGGIJYW6-Dr6ADVsx.js → treemap-WGGIJYW6-BOnPgUXz.js} +1 -1
  253. package/dist/ui/assets/types-D6qo-egS.js +1 -0
  254. package/dist/ui/assets/{vennDiagram-4TSXK5OY-CcEibS-z.js → vennDiagram-4TSXK5OY-CbrfLPNL.js} +1 -1
  255. package/dist/ui/assets/{wardley-WFR3VGLG-D19UeE7v.js → wardley-WFR3VGLG-BzZdYjpA.js} +1 -1
  256. package/dist/ui/assets/{wardleyDiagram-VM6X3IG4-m2YJGsr8.js → wardleyDiagram-VM6X3IG4-cG-Vx9Gs.js} +1 -1
  257. package/dist/ui/assets/{xychartDiagram-S5SC5T6Z-D-ENA4CQ.js → xychartDiagram-S5SC5T6Z-DXzo3wNb.js} +1 -1
  258. package/dist/ui/index.html +6 -6
  259. package/dist/ui/sw.js +2 -2
  260. package/package.json +1 -1
  261. package/dist/ui/assets/AgentsView-B_yMHKiT.css +0 -1
  262. package/dist/ui/assets/AgentsView-Dxv4s_ff.js +0 -1
  263. package/dist/ui/assets/ChecksView-BGUWmHHI.js +0 -0
  264. package/dist/ui/assets/ChecksView-DAZIbg5B.css +0 -1
  265. package/dist/ui/assets/ContextView-BxlQCnkt.js +0 -4
  266. package/dist/ui/assets/DashboardView-2xJiQLBz.js +0 -1
  267. package/dist/ui/assets/DashboardView-Ca3kwSow.css +0 -1
  268. package/dist/ui/assets/ReleasesView-JG7zXQPU.js +0 -5
  269. package/dist/ui/assets/ReleasesView-mGdLAyHK.css +0 -1
  270. package/dist/ui/assets/SettingsView-C8blwbyh.js +0 -4
  271. package/dist/ui/assets/StoriesView-1FeSeEMD.js +0 -1
  272. package/dist/ui/assets/WorkView-Y9JCMf7I.js +0 -2
  273. package/dist/ui/assets/WorkView-vT6nLFuM.css +0 -1
  274. package/dist/ui/assets/architecture-7GRP2DOG-D3Zr7GMJ.js +0 -1
  275. package/dist/ui/assets/channel-CsOxGNSt.js +0 -1
  276. package/dist/ui/assets/classDiagram-ZZMXUADV-DXz5ZBJc.js +0 -1
  277. package/dist/ui/assets/classDiagram-v2-VYDZK3BY-DXz5ZBJc.js +0 -1
  278. package/dist/ui/assets/eventmodeling-NTZA5JFV-BP096yAZ.js +0 -1
  279. package/dist/ui/assets/flowDiagram-HODETNUW-CGQzpVgi.js +0 -1
  280. package/dist/ui/assets/index-CNf-gQPU.js +0 -54
  281. package/dist/ui/assets/index-Dp0zyDhg.css +0 -1
  282. package/dist/ui/assets/railroad-abnf-HS5TGJTU-ebjcwFgX.js +0 -1
  283. package/dist/ui/assets/railroad-ebnf-LZEXJU2U-Z5mPRjaM.js +0 -1
  284. package/dist/ui/assets/railroad-peg-WCYAUIDC-Ds7v_hnS.js +0 -1
  285. package/dist/ui/assets/repo-XLbfa7u-.js +0 -2
  286. package/dist/ui/assets/stateDiagram-v2-MP3YSRHH-cIIjufMH.js +0 -1
  287. package/dist/ui/assets/swimlanesDiagram-VR7AAH4N-BT2MlBys.js +0 -8
@@ -1,5 +1,5 @@
1
1
  {
2
- "hash": "93934ce20f177f2d06114caa9df33fcc13b17c9f8b1694247b2cb6282628fab8",
3
- "version": "0.5.67",
2
+ "hash": "a50a11bbcdcbcbedd23ed2410aa902333da0a7c6a5f48a204f67758d061c71d1",
3
+ "version": "0.5.68",
4
4
  "devUi": false
5
5
  }
@@ -1,3 +1,3 @@
1
1
  {
2
- "generatedAt": "2026-10-07T10:18:27.380Z"
2
+ "generatedAt": "2026-10-09T03:35:17.984Z"
3
3
  }
@@ -18,6 +18,9 @@ const CONTROL_API_MATCHERS = [
18
18
  exact("POST", "/api/remote-validation/test"),
19
19
  exact("GET", "/api/agents/running"),
20
20
  exact("GET", "/api/stats/board"),
21
+ exact("GET", "/api/driver/brief"),
22
+ exact("GET", "/api/events"),
23
+ exact("POST", "/api/cto/heartbeat"),
21
24
  // `repoos review` → PATCH status=review; `repoos override` → PATCH overrides
22
25
  re("PATCH", /^\/api\/tasks\/([^/]+)$/.source),
23
26
  ];
@@ -65,6 +68,7 @@ const UI_ONLY_MATCHERS = [
65
68
  exact("GET", "/api/system/run-tests"),
66
69
  exact("POST", "/api/system/run-tests"),
67
70
  exact("GET", "/api/attention"),
71
+ exact("GET", "/api/decisions"),
68
72
  exact("GET", "/api/check-runs"),
69
73
  (r) => r.pattern.startsWith("/api/integration"),
70
74
  exact("GET", "/api/close-out/outcomes"),
package/dist/cli/help.js CHANGED
@@ -8,9 +8,9 @@
8
8
  * usage line lives in per-command help rather than inline.
9
9
  */
10
10
  import { readVersion } from "../core/version.js";
11
- import { PRIORITIES, TASK_TYPES } from "../core/types.js";
12
11
  import { c } from "./colors.js";
13
12
  import { table, termWidth, visibleWidth, wrap } from "./layout.js";
13
+ import { NEW_FLAG_HELP, UPDATE_FLAG_HELP, flagSummary, flagUsageTokens } from "./task-flags.js";
14
14
  /** Commands whose own argument parser already handles `--help`. */
15
15
  export const SELF_HELP_COMMANDS = new Set(["support", "tunnel", "shot", "uninstall"]);
16
16
  const GROUPS = [
@@ -48,9 +48,9 @@ const GROUPS = [
48
48
  { name: "show", usage: "show <id>", desc: "Show a task's full spec" },
49
49
  {
50
50
  name: "new",
51
- usage: `new "<title>" [--ai --type ${TASK_TYPES.join("|")} --area <a> --priority ${PRIORITIES.join("|")} --body <b>]`,
51
+ usage: 'new "<title>" ' + flagUsageTokens(NEW_FLAG_HELP).join(" "),
52
52
  desc: "Create a task",
53
- flags: `--ai · --type · --area · --priority · --body`,
53
+ flags: flagSummary(NEW_FLAG_HELP),
54
54
  },
55
55
  {
56
56
  name: "new-doc",
@@ -140,6 +140,18 @@ const GROUPS = [
140
140
  desc: "Board spend summary (GET /api/stats/board)",
141
141
  flags: "--json · --port",
142
142
  },
143
+ {
144
+ name: "watch",
145
+ usage: "watch [--json] [--task <id>] [--port N]",
146
+ desc: "Stream board SSE events for external driver sessions (GET /api/events)",
147
+ flags: "--json · --task · --port",
148
+ },
149
+ {
150
+ name: "driver",
151
+ usage: "driver brief [--json] [--port N]",
152
+ desc: "Print the CTO's board brief from live state (GET /api/driver/brief)",
153
+ flags: "--json · --port",
154
+ },
143
155
  {
144
156
  name: "rm",
145
157
  usage: "rm <id> --yes",
@@ -148,9 +160,15 @@ const GROUPS = [
148
160
  },
149
161
  {
150
162
  name: "update",
151
- usage: "update <id> [flags]",
163
+ usage: "update <id> " + flagUsageTokens(UPDATE_FLAG_HELP).join(" "),
152
164
  desc: "Edit a task's metadata or body",
153
- flags: `--title · --area · --priority ${PRIORITIES.join("|")} · --type ${TASK_TYPES.join("|")} · --body · --branch · --assigned-to`,
165
+ flags: flagSummary(UPDATE_FLAG_HELP),
166
+ },
167
+ {
168
+ name: "story",
169
+ usage: 'story new "<name>" --body <text|-> | story list | story show <number|name> | story update <number|name> [--name …] [--body <text|->]',
170
+ desc: "Create, list, show or update story definitions verbatim (no PM agent)",
171
+ flags: "new/show/update: --body - · list/show: --json",
154
172
  },
155
173
  {
156
174
  name: "index",
@@ -263,6 +281,12 @@ const EXAMPLES = [
263
281
  { cmd: 'repoos mv 0012 active --note "Fix the regression in checkout; see review"' },
264
282
  { cmd: 'repoos note 0012 "Handle the reviewer\'s suggestions before the next review"' },
265
283
  { cmd: 'repoos update 0012 --title "New title" --area web,core' },
284
+ {
285
+ cmd: 'repoos story new "Project updates email" --body "Why this slice exists, scope and non-goals"',
286
+ comment: "verbatim story, no PM",
287
+ },
288
+ { cmd: "repoos story list", comment: "registered stories, with numbers" },
289
+ { cmd: "repoos story show 0007", comment: "definition + member tasks and their statuses" },
266
290
  { cmd: "repoos list ready" },
267
291
  { cmd: "repoos outline src/server/agents.ts", comment: "then read only the range you need" },
268
292
  { cmd: "repoos doctor", comment: "passing checks are hidden; --verbose shows all" },
@@ -282,6 +306,7 @@ const ALIASES = {
282
306
  add: "new",
283
307
  reindex: "index",
284
308
  server: "serve",
309
+ stories: "story",
285
310
  };
286
311
  /** Resolve an alias to its canonical command name (identity when not an alias). */
287
312
  export function canonicalCommand(name) {
package/dist/cli/index.js CHANGED
@@ -6,6 +6,7 @@
6
6
  import { cmdInit } from "../commands/init.js";
7
7
  import { cmdList, cmdShow, cmdMv, cmdRm, cmdUpdate, cmdNew, cmdIndex, cmdNote, } from "../commands/tasks.js";
8
8
  import { cmdDocs, cmdNewDoc } from "../commands/docs.js";
9
+ import { cmdStory } from "../commands/stories.js";
9
10
  import { cmdGc } from "../commands/gc.js";
10
11
  import { cmdOutline } from "../commands/outline.js";
11
12
  import { cmdCheck } from "../commands/check.js";
@@ -20,7 +21,9 @@ import { cmdDoctor } from "../commands/doctor.js";
20
21
  import { cmdCertify } from "../commands/certify.js";
21
22
  import { cmdSupport } from "../commands/support.js";
22
23
  import { cmdService } from "../commands/service.js";
23
- import { cmdAgentsRunning, cmdConfig, cmdDone, cmdMessage, cmdOverride, cmdPause, cmdPreview, cmdReview, cmdRunners, cmdStart, cmdStats, } from "../commands/control-api.js";
24
+ import { cmdAgentsRunning, cmdConfig, cmdDone, cmdMessage, cmdOverride, cmdPause, cmdPreview, cmdReview, cmdRunners, cmdStart, cmdStats, cmdDecisions, } from "../commands/control-api.js";
25
+ import { cmdWatch } from "../commands/watch.js";
26
+ import { cmdDriver } from "../commands/driver.js";
24
27
  import { checkBuild } from "../core/build.js";
25
28
  import { loadConfig } from "../core/config.js";
26
29
  import { reexecAfterStaleBuild, reexecUnderBunIfRequested } from "../core/runtime.js";
@@ -170,6 +173,10 @@ function main() {
170
173
  case "docs":
171
174
  void cmdDocs(rest);
172
175
  break;
176
+ case "story":
177
+ case "stories":
178
+ cmdStory(rest);
179
+ break;
173
180
  case "index":
174
181
  case "reindex":
175
182
  cmdIndex(rest);
@@ -259,6 +266,25 @@ function main() {
259
266
  process.exitCode = code;
260
267
  });
261
268
  break;
269
+ case "decisions":
270
+ case "attention":
271
+ void cmdDecisions(rest).then((code) => {
272
+ if (code !== 0)
273
+ process.exitCode = code;
274
+ });
275
+ break;
276
+ case "watch":
277
+ void cmdWatch(rest).then((code) => {
278
+ if (code !== 0)
279
+ process.exitCode = code;
280
+ });
281
+ break;
282
+ case "driver":
283
+ void cmdDriver(rest).then((code) => {
284
+ if (code !== 0)
285
+ process.exitCode = code;
286
+ });
287
+ break;
262
288
  case "shot":
263
289
  void cmdShot(rest)
264
290
  .then((code) => {
@@ -37,6 +37,10 @@ export declare class RepoOsApi {
37
37
  private buildHeaders;
38
38
  private devBackdoorLogin;
39
39
  health(): Promise<boolean>;
40
+ /** Re-run dev backdoor login after a 401 (e.g. server reload). */
41
+ reauthenticate(): Promise<boolean>;
42
+ /** Open `GET /api/events` with the same auth as other CLI calls. */
43
+ fetchEventStream(): Promise<Response>;
40
44
  request(method: string, path: string, body?: unknown, opts?: {
41
45
  retryAuth?: boolean;
42
46
  }): Promise<{
@@ -104,6 +104,21 @@ export class RepoOsApi {
104
104
  return false;
105
105
  }
106
106
  }
107
+ /** Re-run dev backdoor login after a 401 (e.g. server reload). */
108
+ async reauthenticate() {
109
+ return this.devBackdoorLogin();
110
+ }
111
+ /** Open `GET /api/events` with the same auth as other CLI calls. */
112
+ async fetchEventStream() {
113
+ try {
114
+ return await fetch(`${this.baseUrl}/api/events`, {
115
+ headers: { ...this.buildHeaders(false), accept: "text/event-stream" },
116
+ });
117
+ }
118
+ catch (err) {
119
+ throw new RepoOsApiError(`Can't reach the RepoOS server at ${this.baseUrl}. Is \`repoos serve\` running? ${err.message}`, 0);
120
+ }
121
+ }
107
122
  async request(method, path, body, opts = {}) {
108
123
  const jsonBody = body !== undefined;
109
124
  const doFetch = async () => {
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Minimal SSE frame parser for CLI consumers (#0728).
3
+ */
4
+ export declare function parseSseChunk(buffer: string, onData: (jsonText: string) => void): string;
5
+ export declare function consumeSseResponse(res: Response, onJson: (data: unknown) => void, shouldContinue: () => boolean): Promise<void>;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Minimal SSE frame parser for CLI consumers (#0728).
3
+ */
4
+ export function parseSseChunk(buffer, onData) {
5
+ let rest = buffer;
6
+ let split = rest.indexOf("\n\n");
7
+ while (split !== -1) {
8
+ const frame = rest.slice(0, split);
9
+ rest = rest.slice(split + 2);
10
+ const dataLine = frame.split("\n").find((line) => line.startsWith("data: "));
11
+ if (dataLine)
12
+ onData(dataLine.slice(6));
13
+ split = rest.indexOf("\n\n");
14
+ }
15
+ return rest;
16
+ }
17
+ export async function consumeSseResponse(res, onJson, shouldContinue) {
18
+ if (!res.body)
19
+ return;
20
+ const reader = res.body.getReader();
21
+ const decoder = new TextDecoder();
22
+ let buffer = "";
23
+ try {
24
+ while (shouldContinue()) {
25
+ const { done, value } = await reader.read();
26
+ if (done)
27
+ break;
28
+ buffer += decoder.decode(value, { stream: true });
29
+ buffer = parseSseChunk(buffer, (text) => {
30
+ try {
31
+ onJson(JSON.parse(text));
32
+ }
33
+ catch {
34
+ /* ignore partial frames */
35
+ }
36
+ });
37
+ }
38
+ }
39
+ finally {
40
+ await reader.cancel().catch(() => { });
41
+ }
42
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * The full valid value sets for `--priority` / `--type`, rendered into the
3
+ * usage/help text so accepted values are obvious at the point of use (#0656).
4
+ */
5
+ export declare const PRIORITY_USAGE: string;
6
+ export declare const TYPE_USAGE: string;
7
+ /** One flag's help metadata. */
8
+ export interface TaskFlagHelp {
9
+ /** Placeholder rendered after the flag (e.g. `true|false`); omit for a boolean flag. */
10
+ value?: string;
11
+ /** One-line description, shown by `repoos <cmd> --help`. */
12
+ desc: string;
13
+ }
14
+ /** Every flag `repoos new` accepts, in help order. */
15
+ export declare const NEW_FLAG_HELP: Record<string, TaskFlagHelp>;
16
+ /** Every flag `repoos update` accepts, in help order. */
17
+ export declare const UPDATE_FLAG_HELP: Record<string, TaskFlagHelp>;
18
+ /** One `--flag` / `--flag value` token, as used in a usage line. */
19
+ export declare function flagToken(name: string, help: TaskFlagHelp): string;
20
+ /** Ordered `--flag [value]` tokens for every entry in a help map. */
21
+ export declare function flagUsageTokens(help: Record<string, TaskFlagHelp>): string[];
22
+ /** The dim `flags:` summary line: `--flag value · --other`, in declaration order. */
23
+ export declare function flagSummary(help: Record<string, TaskFlagHelp>): string;
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Flag help metadata for `repoos new` / `repoos update` (#0699).
3
+ *
4
+ * The parse tables live in `src/commands/tasks.ts` (`NEW_FLAGS`, derived from
5
+ * `NEW_FLAG_HELP`, and `UPDATE_FLAGS`). These ordered maps are the single
6
+ * source of truth for help text: `renderHelp` (the top-level Tasks group) and
7
+ * `printCommandHelp` both render from them, so a flag can no longer be accepted
8
+ * without a one-line description. A test asserts every key of `UPDATE_FLAGS`
9
+ * has an entry here, which makes "added a flag, forgot the help" fail the gate.
10
+ *
11
+ * `UPDATE_FLAG_HELP` intentionally covers the flags `cmdUpdate` handles
12
+ * specially (`shots`, `section`, `section-body`, `clear-questions`, `force`),
13
+ * not just the `UPDATE_FLAGS` parse map.
14
+ */
15
+ import { PRIORITIES, TASK_TYPES } from "../core/types.js";
16
+ /**
17
+ * The full valid value sets for `--priority` / `--type`, rendered into the
18
+ * usage/help text so accepted values are obvious at the point of use (#0656).
19
+ */
20
+ export const PRIORITY_USAGE = PRIORITIES.join("|");
21
+ export const TYPE_USAGE = TASK_TYPES.join("|");
22
+ /** Every flag `repoos new` accepts, in help order. */
23
+ export const NEW_FLAG_HELP = {
24
+ ai: { desc: "Assign the task to an AI engineer" },
25
+ type: { value: TYPE_USAGE, desc: "Task type" },
26
+ area: { value: "web,core", desc: "Area(s), comma-separated" },
27
+ story: { value: '"name"', desc: "Tag the task as part of a story (delivery slice)" },
28
+ "depends-on": { value: "ids", desc: "Comma-separated task ids that must land first" },
29
+ priority: { value: PRIORITY_USAGE, desc: "Priority" },
30
+ "needs-input": { value: "true|false", desc: "Flag the task as needing human input" },
31
+ questions: { value: '"Q1\\nQ2"', desc: "Open questions for the human (newline or JSON list)" },
32
+ hold: { value: "true|false", desc: "Hold the task out of auto-dispatch" },
33
+ paths: { value: "a,b", desc: "Files the task touches, e.g. src/a.ts,src/b.ts" },
34
+ body: { value: '"..."|-', desc: "Task body; `-` reads it from stdin" },
35
+ shots: { value: '"<JSON list>"|-', desc: "Declare the ## Shots section (validated JSON)" },
36
+ };
37
+ /** Every flag `repoos update` accepts, in help order. */
38
+ export const UPDATE_FLAG_HELP = {
39
+ title: { value: '"..."', desc: "Task title" },
40
+ area: { value: "web,core", desc: "Area(s), comma-separated" },
41
+ story: { value: '"name"', desc: "Tag the task as part of a story (delivery slice)" },
42
+ "depends-on": { value: "ids", desc: "Comma-separated task ids that must land first" },
43
+ priority: { value: PRIORITY_USAGE, desc: "Priority" },
44
+ type: { value: TYPE_USAGE, desc: "Task type" },
45
+ body: { value: '"..."|-', desc: "Replace the body; `-` reads it from stdin" },
46
+ branch: { value: "b", desc: "Branch name" },
47
+ "assigned-to": { value: "ai|human", desc: "Assignee" },
48
+ "needs-input": { value: "true|false", desc: "Flag the task as needing human input" },
49
+ "needs-merge": { value: "true|false", desc: "Flag the task as needing a merge" },
50
+ hold: { value: "true|false", desc: "Hold the task out of auto-dispatch" },
51
+ paths: { value: "a,b", desc: "Files the task touches, e.g. src/a.ts,src/b.ts" },
52
+ questions: { value: '"Q1\\nQ2"', desc: "Open questions for the human (newline or JSON list)" },
53
+ "clear-questions": { desc: "Clear the recorded questions" },
54
+ shots: { value: '"<JSON list>"|-', desc: "Declare the ## Shots section (validated JSON)" },
55
+ section: { value: '"heading"', desc: "Replace/create one ## section (pair with --section-body)" },
56
+ "section-body": { value: '"..."|-', desc: "Body for --section; `-` reads it from stdin" },
57
+ force: { desc: "Allow a --body replace that drops spec headings" },
58
+ agent: { value: "name", desc: "Engineer agent override (empty clears)" },
59
+ cli: { value: "name", desc: "Engineer CLI override (empty clears)" },
60
+ model: { value: "name", desc: "Engineer model override (empty clears)" },
61
+ "pm-agent": { value: "name", desc: "PM agent override (empty clears)" },
62
+ "pm-cli": { value: "name", desc: "PM CLI override (empty clears)" },
63
+ "pm-model": { value: "name", desc: "PM model override (empty clears)" },
64
+ "review-agent": { value: "name", desc: "Reviewer agent override (empty clears)" },
65
+ "review-cli": { value: "name", desc: "Reviewer CLI override (empty clears)" },
66
+ "review-model": { value: "name", desc: "Reviewer model override (empty clears)" },
67
+ };
68
+ /** One `--flag` / `--flag value` token, as used in a usage line. */
69
+ export function flagToken(name, help) {
70
+ return help.value ? `--${name} ${help.value}` : `--${name}`;
71
+ }
72
+ /** Ordered `--flag [value]` tokens for every entry in a help map. */
73
+ export function flagUsageTokens(help) {
74
+ return Object.entries(help).map(([name, h]) => flagToken(name, h));
75
+ }
76
+ /** The dim `flags:` summary line: `--flag value · --other`, in declaration order. */
77
+ export function flagSummary(help) {
78
+ return flagUsageTokens(help).join(" · ");
79
+ }
@@ -69,25 +69,28 @@ export declare function resolveBareRequireRoots(configured: string[] | undefined
69
69
  * stale screenshot churn). Product image assets — UI, icons, logos, docs —
70
70
  * live outside those folders and stay tracked.
71
71
  *
72
- * The folder names come from `repoos.toml` (`workDir`/`inputsDir`) so a managed
73
- * repo that renames them still gets the guard; they default to `work`/`inputs`.
72
+ * The folder names come from `repoos.toml` (`workDir`/`inputsDir`/`storiesDir`)
73
+ * so a managed repo that renames them still gets the guard; they default to
74
+ * `work`/`inputs`/`stories`.
74
75
  *
75
76
  * Pure (takes the tracked-file list) so it is unit-testable; the check block
76
77
  * feeds it `git ls-files`.
77
78
  */
78
79
  /**
79
- * Normalize a configured guard directory (`workDir`/`inputsDir`) for prefix
80
- * matching against `git ls-files` output, which is always repo-root-relative:
81
- * strip any leading `./` and trailing slashes. Returns empty for anything that
82
- * can't be a repo-relative directory — an explicit `""`, `"."`/`"./"`, an
83
- * absolute path, a home-relative `~/…`, or a path containing a `..` segment.
84
- * Those would all silently match nothing (or, for `""`, fatal git's pathspec),
85
- * so callers must treat empty as unusable rather than as "match everything".
80
+ * Normalize a configured guard directory (`workDir`/`inputsDir`/`storiesDir`)
81
+ * for prefix matching against `git ls-files` output, which is always
82
+ * repo-root-relative: strip any leading `./` and trailing slashes. Returns
83
+ * empty for anything that can't be a repo-relative directory — an explicit
84
+ * `""`, `"."`/`"./"`, an absolute path, a home-relative `~/…`, or a path
85
+ * containing a `..` segment. Those would all silently match nothing (or, for
86
+ * `""`, fatal git's pathspec), so callers must treat empty as unusable rather
87
+ * than as "match everything".
86
88
  */
87
89
  export declare function normalizeGuardDir(d: string): string;
88
90
  export declare function taskAssetOffenders(trackedPaths: string[], dirs?: {
89
91
  workDir?: string;
90
92
  inputsDir?: string;
93
+ storiesDir?: string;
91
94
  }): string[];
92
95
  /** Marker that allowlists a hard-coded color; must carry a reason. */
93
96
  export declare const HARDCODED_COLOR_MARKER = "hardcode-ok";
@@ -45,7 +45,7 @@ import { mainCheckoutRoot } from "../core/git.js";
45
45
  import { Logger } from "../core/logger.js";
46
46
  import { boardRootForEngineerRemote, boardTaskAbsPath, commitWipCheckpointForRemoteGate, isManagedEngineerCheck, runEngineerRemoteSelfCheckGate, } from "../server/engineer-remote-self-check.js";
47
47
  import { createRemoteValidator } from "../server/remote-validation.js";
48
- import { runRemotePreReviewGate, standaloneCliCanUseRemote, remoteValidationAlreadyAttempted, uncommittedFilesBlockingRemoteGate, shouldRunCliRemotePreReviewGate, summarizeRemoteFallbackDetail, REPOOS_REMOTE_FALLBACK_DETAIL, } from "../server/pre-review-remote-gate.js";
48
+ import { runRemotePreReviewGate, standaloneCliCanUseRemote, remoteValidationAlreadyAttempted, uncommittedFilesBlockingRemoteGate, shouldRunCliRemotePreReviewGate, summarizeRemoteFallbackDetail, REPOOS_REMOTE_FALLBACK_DETAIL, REPOOS_CHECK_GATE_NOTE, } from "../server/pre-review-remote-gate.js";
49
49
  /**
50
50
  * Split a CSS selector list on top-level commas (respecting parentheses,
51
51
  * so `:not(.a,.b)` stays one group).
@@ -402,20 +402,22 @@ function dedupeRoots(roots) {
402
402
  * stale screenshot churn). Product image assets — UI, icons, logos, docs —
403
403
  * live outside those folders and stay tracked.
404
404
  *
405
- * The folder names come from `repoos.toml` (`workDir`/`inputsDir`) so a managed
406
- * repo that renames them still gets the guard; they default to `work`/`inputs`.
405
+ * The folder names come from `repoos.toml` (`workDir`/`inputsDir`/`storiesDir`)
406
+ * so a managed repo that renames them still gets the guard; they default to
407
+ * `work`/`inputs`/`stories`.
407
408
  *
408
409
  * Pure (takes the tracked-file list) so it is unit-testable; the check block
409
410
  * feeds it `git ls-files`.
410
411
  */
411
412
  /**
412
- * Normalize a configured guard directory (`workDir`/`inputsDir`) for prefix
413
- * matching against `git ls-files` output, which is always repo-root-relative:
414
- * strip any leading `./` and trailing slashes. Returns empty for anything that
415
- * can't be a repo-relative directory — an explicit `""`, `"."`/`"./"`, an
416
- * absolute path, a home-relative `~/…`, or a path containing a `..` segment.
417
- * Those would all silently match nothing (or, for `""`, fatal git's pathspec),
418
- * so callers must treat empty as unusable rather than as "match everything".
413
+ * Normalize a configured guard directory (`workDir`/`inputsDir`/`storiesDir`)
414
+ * for prefix matching against `git ls-files` output, which is always
415
+ * repo-root-relative: strip any leading `./` and trailing slashes. Returns
416
+ * empty for anything that can't be a repo-relative directory — an explicit
417
+ * `""`, `"."`/`"./"`, an absolute path, a home-relative `~/…`, or a path
418
+ * containing a `..` segment. Those would all silently match nothing (or, for
419
+ * `""`, fatal git's pathspec), so callers must treat empty as unusable rather
420
+ * than as "match everything".
419
421
  */
420
422
  export function normalizeGuardDir(d) {
421
423
  let trimmed = d;
@@ -431,7 +433,11 @@ export function normalizeGuardDir(d) {
431
433
  }
432
434
  export function taskAssetOffenders(trackedPaths, dirs = {}) {
433
435
  const IMG = /\.(png|jpe?g|gif|webp|avif|bmp|svg|ico|pdf)$/i;
434
- const prefixes = [dirs.workDir ?? "work", dirs.inputsDir ?? "inputs"]
436
+ const prefixes = [
437
+ dirs.workDir ?? "work",
438
+ dirs.inputsDir ?? "inputs",
439
+ dirs.storiesDir ?? "stories",
440
+ ]
435
441
  .map(normalizeGuardDir)
436
442
  .filter(Boolean)
437
443
  .map((d) => `${d}/`);
@@ -1189,12 +1195,13 @@ async function stepBareRequire(ctx) {
1189
1195
  };
1190
1196
  }
1191
1197
  async function stepTaskAssets(ctx) {
1192
- // Folder names are configurable (`workDir`/`inputsDir`), so a repo that
1193
- // renames them is still guarded.
1198
+ // Folder names are configurable (`workDir`/`inputsDir`/`storiesDir`), so a
1199
+ // repo that renames them is still guarded.
1194
1200
  const config = ctx.cfg;
1195
1201
  const dirs = [
1196
1202
  { label: "workDir", raw: config.workDir ?? "work" },
1197
1203
  { label: "inputsDir", raw: config.inputsDir ?? "inputs" },
1204
+ { label: "storiesDir", raw: config.storiesDir ?? "stories" },
1198
1205
  ];
1199
1206
  const usable = [];
1200
1207
  const broken = [];
@@ -1231,6 +1238,7 @@ async function stepTaskAssets(ctx) {
1231
1238
  const offenders = taskAssetOffenders(tracked, {
1232
1239
  workDir: config.workDir,
1233
1240
  inputsDir: config.inputsDir,
1241
+ storiesDir: config.storiesDir,
1234
1242
  });
1235
1243
  const labels = usable.map((d) => `${d}/`).join(" or ");
1236
1244
  if (offenders.length === 0)
@@ -1335,9 +1343,15 @@ async function triageIsolatedFailures(ctx, base, testScript, output, env) {
1335
1343
  }
1336
1344
  async function stepTests(ctx) {
1337
1345
  // The close-out pipeline can hand the suite to the Remote Validation Runner
1338
- // and then run only the cheap local guards (REPOOS_SKIP_TESTS=1).
1346
+ // and then run only the cheap local guards (REPOOS_SKIP_TESTS=1), or reuse a
1347
+ // handoff-proven result entirely (#0724). Either way the step is skipped —
1348
+ // say which, so the Checks tab is not misleading.
1339
1349
  if (process.env.REPOOS_SKIP_TESTS === "1") {
1340
- return skipped("skipped — test suite ran on the remote validation runner (REPOOS_SKIP_TESTS=1)");
1350
+ const reuseNote = process.env[REPOOS_CHECK_GATE_NOTE]?.trim();
1351
+ const viaReuse = reuseNote ? /reus|identical|bookkeeping/i.test(reuseNote) : false;
1352
+ return skipped(viaReuse
1353
+ ? `skipped — full suite reused from the handoff gate (${reuseNote})`
1354
+ : "skipped — test suite ran on the remote validation runner (REPOOS_SKIP_TESTS=1)");
1341
1355
  }
1342
1356
  const hasTestScript = Boolean(ctx.scriptPkg.scripts?.test);
1343
1357
  const hasTestFiles = ["test", "__tests__", "tests"].some((d) => existsSync(join(ctx.cwd, d)));
@@ -2123,12 +2137,21 @@ export async function cmdCheck(argv = []) {
2123
2137
  detail: (() => {
2124
2138
  const fallback = process.env[REPOOS_REMOTE_FALLBACK_DETAIL]?.trim();
2125
2139
  const stepDetail = gatingFailures[0]?.detail ?? null;
2126
- if (!fallback)
2127
- return stepDetail;
2128
- const summary = summarizeRemoteFallbackDetail(fallback);
2129
- if (!stepDetail)
2130
- return summary;
2131
- return `${summary} — ${stepDetail}`;
2140
+ // #0724: which close-out gate mode ran and why, so the Checks tab is
2141
+ // auditable ("reused from handoff check <sha>" / "scoped N files").
2142
+ const gateNote = process.env[REPOOS_CHECK_GATE_NOTE]?.trim();
2143
+ const fallbackPart = (() => {
2144
+ if (!fallback)
2145
+ return null;
2146
+ const summary = summarizeRemoteFallbackDetail(fallback);
2147
+ if (!stepDetail)
2148
+ return summary;
2149
+ return `${summary} — ${stepDetail}`;
2150
+ })();
2151
+ const base = fallbackPart ?? stepDetail;
2152
+ if (!gateNote)
2153
+ return base;
2154
+ return base ? `${gateNote} — ${base}` : gateNote;
2132
2155
  })(),
2133
2156
  // The stored detail is a short log tail that routinely loses the failing
2134
2157
  // test's name; keep the names themselves so "which test?" is a query.
@@ -8,6 +8,7 @@ export declare function cmdPreview(args: string[]): Promise<number>;
8
8
  export declare function cmdConfig(args: string[]): Promise<number>;
9
9
  export declare function cmdRunners(args: string[]): Promise<number>;
10
10
  export declare function cmdAgentsRunning(args: string[]): Promise<number>;
11
+ export declare function cmdDecisions(args: string[]): Promise<number>;
11
12
  export declare function cmdStats(args: string[]): Promise<number>;
12
13
  /** Shared server-down check for tests. */
13
14
  export declare function controlApiServerDownMessage(port: number): Promise<string>;
@@ -4,6 +4,7 @@
4
4
  import { c } from "../cli/colors.js";
5
5
  import { pollUntil, RepoOsApi, RepoOsApiError, resolveControlPlaneBase, } from "../cli/repoos-api.js";
6
6
  import { effectiveEngineerFromApi } from "../cli/effective-from-api.js";
7
+ import { HANDOFF_DEADLINE_MS } from "../server/handoff.js";
7
8
  function parseCommonFlags(args) {
8
9
  const opts = { json: false, wait: false };
9
10
  const rest = [];
@@ -192,7 +193,7 @@ export async function cmdReview(args) {
192
193
  throw new RepoOsApiError(reason, 400, t);
193
194
  }
194
195
  return null;
195
- }, { label: `handoff for #${id}`, timeoutMs: 600_000 });
196
+ }, { label: `handoff for #${id}`, timeoutMs: HANDOFF_DEADLINE_MS });
196
197
  if (opts.json)
197
198
  printJson({ ok: true, task: result });
198
199
  else
@@ -487,6 +488,45 @@ export async function cmdAgentsRunning(args) {
487
488
  return 1;
488
489
  }
489
490
  }
491
+ export async function cmdDecisions(args) {
492
+ const { opts, error } = parseCommonFlags(args);
493
+ if (error) {
494
+ printErr(error);
495
+ return 1;
496
+ }
497
+ const api = new RepoOsApi({ port: opts.port });
498
+ try {
499
+ await ensureServer(api);
500
+ const data = await api.requestOk("GET", "/api/decisions");
501
+ if (opts.json) {
502
+ printJson(data);
503
+ return 0;
504
+ }
505
+ const digest = data;
506
+ const items = digest.items ?? [];
507
+ if (!items.length) {
508
+ console.log(c.green(" ✓ ") + c.dim("No decisions waiting — policy and CTO have the board."));
509
+ return 0;
510
+ }
511
+ const paused = digest.automationPaused ? " (automation paused)" : "";
512
+ console.log(c.yellow(` ${items.length} item(s) need a decision${paused}:`));
513
+ for (const item of items) {
514
+ const id = item.taskId ? `#${item.taskId}` : item.kind;
515
+ console.log(` · ${id} — ${item.cause.headline}`);
516
+ const auto = item.actions.filter((a) => a.policyAutomatic).map((a) => a.label);
517
+ const human = item.actions.filter((a) => !a.policyAutomatic).map((a) => a.label);
518
+ if (auto.length)
519
+ console.log(c.dim(` CTO/policy: ${auto.join("; ")}`));
520
+ if (human.length)
521
+ console.log(c.dim(` You: ${human.join("; ")}`));
522
+ }
523
+ return 0;
524
+ }
525
+ catch (e) {
526
+ printErr(e.message);
527
+ return 1;
528
+ }
529
+ }
490
530
  export async function cmdStats(args) {
491
531
  const { opts, error } = parseCommonFlags(args);
492
532
  if (error) {
@@ -0,0 +1 @@
1
+ export declare function cmdDriver(args: string[]): Promise<number>;