@ebrindley/build 0.0.0-stage → 1.42.1-rc28

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 (878) hide show
  1. package/.build-project/providers/catalog.json +13951 -0
  2. package/.build-project/providers/pricing.json +1978 -0
  3. package/.build-project/providers/registry.json +4103 -0
  4. package/.github/SECURITY.md +75 -0
  5. package/.nvmrc +1 -0
  6. package/CHANGELOG.md +661 -0
  7. package/CODE_OF_CONDUCT.md +44 -0
  8. package/CONTRIBUTING.md +24 -0
  9. package/INSTALL.md +623 -0
  10. package/LICENSE +21 -0
  11. package/README.md +118 -2
  12. package/THIRD_PARTY_NOTICES.txt +26 -0
  13. package/dist/ai-judge-UE5UOYOO.js +191 -0
  14. package/dist/allowlist-grounding-KPLN6NC5.js +16 -0
  15. package/dist/allowlist-utils-MZZKKXRD.js +31 -0
  16. package/dist/apply-completion-mode-EM37UZHB.js +110 -0
  17. package/dist/artifact-migrator-WPACNSEP.js +276 -0
  18. package/dist/ask-2OZ4JFQR.js +176 -0
  19. package/dist/auth-6UKBTJUQ.js +185 -0
  20. package/dist/auth-H5KJL6HL.js +165 -0
  21. package/dist/auth-LVJRJDMU.js +12 -0
  22. package/dist/auth-NHZOCNRR.js +94 -0
  23. package/dist/auth-PBXHWXGW.js +95 -0
  24. package/dist/auth-T7Y5DCAH.js +91 -0
  25. package/dist/auth-TVVKCHQW.js +13 -0
  26. package/dist/auth-UHB2UCSS.js +97 -0
  27. package/dist/auth-VACA3VUL.js +98 -0
  28. package/dist/auth-VVLC77S3.js +44 -0
  29. package/dist/auth-liveness-XO4AGDDD.js +53 -0
  30. package/dist/autoloop-cleanup-SI3VGAAR.js +106 -0
  31. package/dist/autoloop-evidence-gates-J5GG5YQB.js +39 -0
  32. package/dist/autoloop-gate-policy-SUNAEP6Q.js +169 -0
  33. package/dist/autoloop-helpers-VQGQNTT6.js +52 -0
  34. package/dist/autoloop-ledger-P6TIDP7C.js +96 -0
  35. package/dist/autoloop-ledger-subscriber-HFAGOZXH.js +161 -0
  36. package/dist/autoloop-run-defaults-GWGZBNT7.js +27 -0
  37. package/dist/autoloop-run-lock-GBWRM5A2.js +197 -0
  38. package/dist/autoloop-success-C32QVWOP.js +93 -0
  39. package/dist/autoloop-termination-summary-GI6IBQWD.js +58 -0
  40. package/dist/autoloop-trajectory-AMKSQISD.js +70 -0
  41. package/dist/autoloop-wall-clock-T7ZVIQOC.js +12 -0
  42. package/dist/automatic-branch-cleanup-R62X2C5O.js +49 -0
  43. package/dist/autonomous-loop-controller-2WL363LW.js +4386 -0
  44. package/dist/backend-YUTFDZXZ.js +30 -0
  45. package/dist/background-executor-Z3ODTMD7.js +260 -0
  46. package/dist/backlog-75QPEAMW.js +403 -0
  47. package/dist/backlog-execution-intent-GWUV5TUK.js +19 -0
  48. package/dist/backup-active-store-XHWLN34M.js +16 -0
  49. package/dist/backup-machine-stores-UI4LTJOY.js +251 -0
  50. package/dist/backup-telemetry-db-Z4ICYCNW.js +26 -0
  51. package/dist/branch-archive-manager-FMSQ7YJF.js +18 -0
  52. package/dist/branch-cleanup-manager-ST6FJGND.js +35 -0
  53. package/dist/build-gate-7NKWPY62.js +68 -0
  54. package/dist/build-root-S7DINODY.js +18 -0
  55. package/dist/change-summary-R6CB6VXJ.js +50 -0
  56. package/dist/chunk-24MNKKOM.js +173 -0
  57. package/dist/chunk-2H6VZFIO.js +235 -0
  58. package/dist/chunk-2JIX3EKV.js +39 -0
  59. package/dist/chunk-2KO7HVZM.js +106 -0
  60. package/dist/chunk-2L36U25O.js +100 -0
  61. package/dist/chunk-2NMNFUQA.js +475 -0
  62. package/dist/chunk-2OUAEH67.js +83 -0
  63. package/dist/chunk-2VLJUXJU.js +115 -0
  64. package/dist/chunk-2VUEDIUM.js +77 -0
  65. package/dist/chunk-2Y2IIHPI.js +430 -0
  66. package/dist/chunk-2YRG3LHZ.js +220 -0
  67. package/dist/chunk-2Z5Q3SUY.js +65 -0
  68. package/dist/chunk-32IYXIE5.js +873 -0
  69. package/dist/chunk-33IGPPUI.js +292 -0
  70. package/dist/chunk-352PCJLK.js +283 -0
  71. package/dist/chunk-35J4NE6S.js +226 -0
  72. package/dist/chunk-3C7WBIVK.js +1016 -0
  73. package/dist/chunk-3H3EY6U7.js +1225 -0
  74. package/dist/chunk-3H4MWYIC.js +198 -0
  75. package/dist/chunk-3HHWQR3N.js +2479 -0
  76. package/dist/chunk-3JKNRYEE.js +14 -0
  77. package/dist/chunk-3LECCYZY.js +128 -0
  78. package/dist/chunk-3LOY6YZI.js +852 -0
  79. package/dist/chunk-3M57DADF.js +44 -0
  80. package/dist/chunk-3NOTLVLG.js +3803 -0
  81. package/dist/chunk-3OPP2OZB.js +1480 -0
  82. package/dist/chunk-3P5IN5E7.js +9 -0
  83. package/dist/chunk-3PL22IYZ.js +20 -0
  84. package/dist/chunk-3REDAJUJ.js +14 -0
  85. package/dist/chunk-3S2R4XJI.js +203 -0
  86. package/dist/chunk-3UBZI5DW.js +61 -0
  87. package/dist/chunk-3VV5OBGG.js +308 -0
  88. package/dist/chunk-3WY5TU2O.js +823 -0
  89. package/dist/chunk-43OKHTW4.js +82 -0
  90. package/dist/chunk-45KUJBDI.js +112 -0
  91. package/dist/chunk-47X5LM7B.js +224 -0
  92. package/dist/chunk-4B6FQJ77.js +268 -0
  93. package/dist/chunk-4BTDUT2S.js +42 -0
  94. package/dist/chunk-4DJL2VXA.js +24 -0
  95. package/dist/chunk-4EBSXZ73.js +48 -0
  96. package/dist/chunk-4QKP6I4C.js +294 -0
  97. package/dist/chunk-4U6XK2DG.js +300 -0
  98. package/dist/chunk-4UMRUFBD.js +132 -0
  99. package/dist/chunk-4US4SYJ4.js +569 -0
  100. package/dist/chunk-4ZPLWEZO.js +154 -0
  101. package/dist/chunk-56WPYDJH.js +624 -0
  102. package/dist/chunk-57WRCJJW.js +50 -0
  103. package/dist/chunk-5AW4RMNG.js +24 -0
  104. package/dist/chunk-5EQN56OZ.js +155 -0
  105. package/dist/chunk-5F43TUIN.js +38 -0
  106. package/dist/chunk-5FKHIKTS.js +115 -0
  107. package/dist/chunk-5HDP7XZG.js +91 -0
  108. package/dist/chunk-5KQETTNS.js +152 -0
  109. package/dist/chunk-5PDVN2KO.js +498 -0
  110. package/dist/chunk-5UBIFVRD.js +509 -0
  111. package/dist/chunk-5YDE3Q62.js +46 -0
  112. package/dist/chunk-626AJVMU.js +302 -0
  113. package/dist/chunk-633XZ7UF.js +3583 -0
  114. package/dist/chunk-63DHNHGA.js +236 -0
  115. package/dist/chunk-666656AR.js +568 -0
  116. package/dist/chunk-67YRJPJO.js +19 -0
  117. package/dist/chunk-6CAU7VBA.js +20 -0
  118. package/dist/chunk-6CB3KJRY.js +21 -0
  119. package/dist/chunk-6DBMALXL.js +29 -0
  120. package/dist/chunk-6E25C4IA.js +269 -0
  121. package/dist/chunk-6FIBNIQU.js +73 -0
  122. package/dist/chunk-6G57FYBV.js +189 -0
  123. package/dist/chunk-6KZKRTG3.js +4885 -0
  124. package/dist/chunk-6LAH2UV2.js +525 -0
  125. package/dist/chunk-6PZY2TTU.js +921 -0
  126. package/dist/chunk-6T6NHXK4.js +230 -0
  127. package/dist/chunk-6TBEX4R4.js +432 -0
  128. package/dist/chunk-6TRD7TEE.js +911 -0
  129. package/dist/chunk-6XCP2RAI.js +47 -0
  130. package/dist/chunk-726G6WDL.js +351 -0
  131. package/dist/chunk-75EMT7BF.js +616 -0
  132. package/dist/chunk-762ACDZJ.js +4696 -0
  133. package/dist/chunk-77I6G4CO.js +1 -0
  134. package/dist/chunk-7DJ6SQH3.js +510 -0
  135. package/dist/chunk-7HPCIOMA.js +1383 -0
  136. package/dist/chunk-7HYBSRPZ.js +17503 -0
  137. package/dist/chunk-7KBEOPVB.js +73 -0
  138. package/dist/chunk-7LHJDJB3.js +2222 -0
  139. package/dist/chunk-7NVJMH52.js +306 -0
  140. package/dist/chunk-7RMARDVH.js +33 -0
  141. package/dist/chunk-7SEWU4QG.js +36 -0
  142. package/dist/chunk-7TUTZTI2.js +911 -0
  143. package/dist/chunk-7VBDFPUM.js +340 -0
  144. package/dist/chunk-7VRJHTGZ.js +6406 -0
  145. package/dist/chunk-7YAOUUKK.js +493 -0
  146. package/dist/chunk-AAAODV76.js +860 -0
  147. package/dist/chunk-AB4HUJVQ.js +339 -0
  148. package/dist/chunk-AEQWV746.js +611 -0
  149. package/dist/chunk-AHU3FKPA.js +11639 -0
  150. package/dist/chunk-AISTV5XU.js +226 -0
  151. package/dist/chunk-AJBTKGJZ.js +48 -0
  152. package/dist/chunk-AJJNW7XT.js +248 -0
  153. package/dist/chunk-AJN5Y5YZ.js +160 -0
  154. package/dist/chunk-ALDTFNZ3.js +150 -0
  155. package/dist/chunk-ARARVIZK.js +281 -0
  156. package/dist/chunk-ATBM6AW5.js +53 -0
  157. package/dist/chunk-ATKEKM3E.js +206 -0
  158. package/dist/chunk-AUJLW6JZ.js +92 -0
  159. package/dist/chunk-AY3MHEFM.js +24 -0
  160. package/dist/chunk-B7PYTV72.js +236 -0
  161. package/dist/chunk-B7YRSULE.js +1423 -0
  162. package/dist/chunk-BAWJNMWF.js +339 -0
  163. package/dist/chunk-BBPIILO2.js +88 -0
  164. package/dist/chunk-BD3PGW6A.js +957 -0
  165. package/dist/chunk-BDPYFAB4.js +44 -0
  166. package/dist/chunk-BIUV23HH.js +729 -0
  167. package/dist/chunk-BQ3VAGXH.js +243 -0
  168. package/dist/chunk-BQJOGAWT.js +31 -0
  169. package/dist/chunk-BT7EG7CO.js +68 -0
  170. package/dist/chunk-BV3XQQLU.js +27 -0
  171. package/dist/chunk-BY6ODHNZ.js +78 -0
  172. package/dist/chunk-BZRLSZNV.js +79 -0
  173. package/dist/chunk-C3DH3NCY.js +2773 -0
  174. package/dist/chunk-C3KCMAJP.js +756 -0
  175. package/dist/chunk-C7AGUJ5K.js +267 -0
  176. package/dist/chunk-CBSWKQCX.js +342 -0
  177. package/dist/chunk-CE5OZBYY.js +21 -0
  178. package/dist/chunk-CFCVYHSW.js +373 -0
  179. package/dist/chunk-CHA2HDE5.js +126 -0
  180. package/dist/chunk-CIHWPGS5.js +146 -0
  181. package/dist/chunk-CJBSZX3F.js +127 -0
  182. package/dist/chunk-CLA6QIJM.js +43 -0
  183. package/dist/chunk-CPSVQR2I.js +365 -0
  184. package/dist/chunk-CRPRVNQ4.js +254 -0
  185. package/dist/chunk-CSIE4Y7C.js +1093 -0
  186. package/dist/chunk-CSOPSYDY.js +142 -0
  187. package/dist/chunk-CSXLLEGB.js +205 -0
  188. package/dist/chunk-CTDLERWU.js +293 -0
  189. package/dist/chunk-CULBXMSK.js +110 -0
  190. package/dist/chunk-D2M2Y5ID.js +21 -0
  191. package/dist/chunk-D37WY7SH.js +1060 -0
  192. package/dist/chunk-D4VJFCGZ.js +89 -0
  193. package/dist/chunk-D6WTZMZB.js +48 -0
  194. package/dist/chunk-DBHOWDUH.js +976 -0
  195. package/dist/chunk-DCACX7BV.js +19364 -0
  196. package/dist/chunk-DFHX4XYA.js +128 -0
  197. package/dist/chunk-DIKBRRKE.js +176 -0
  198. package/dist/chunk-DJG5RIOR.js +9 -0
  199. package/dist/chunk-DNIOIISW.js +616 -0
  200. package/dist/chunk-DOA5G7IA.js +315 -0
  201. package/dist/chunk-DP7FKP6W.js +855 -0
  202. package/dist/chunk-DS2JZ677.js +79 -0
  203. package/dist/chunk-DSRLVYBS.js +82 -0
  204. package/dist/chunk-EAEVKNJA.js +209 -0
  205. package/dist/chunk-EEUESN3T.js +575 -0
  206. package/dist/chunk-EJ4LUU5Y.js +73 -0
  207. package/dist/chunk-EJIWTPSZ.js +1063 -0
  208. package/dist/chunk-EJVCDTAN.js +116 -0
  209. package/dist/chunk-EKLUBDBQ.js +627 -0
  210. package/dist/chunk-EN62WLFD.js +849 -0
  211. package/dist/chunk-ENYRCL43.js +26 -0
  212. package/dist/chunk-EP22ZMFO.js +273 -0
  213. package/dist/chunk-EP4SVAVI.js +87 -0
  214. package/dist/chunk-EPAMVGI3.js +1562 -0
  215. package/dist/chunk-EPRMH6HO.js +24 -0
  216. package/dist/chunk-ES6NWJ36.js +4057 -0
  217. package/dist/chunk-ETA2K4KI.js +30 -0
  218. package/dist/chunk-ETAD4NKD.js +31 -0
  219. package/dist/chunk-EUWIIDQ7.js +93 -0
  220. package/dist/chunk-EVE3OD2W.js +141 -0
  221. package/dist/chunk-EXA26FFC.js +459 -0
  222. package/dist/chunk-EXSPAA35.js +244 -0
  223. package/dist/chunk-F55YABKV.js +258 -0
  224. package/dist/chunk-F5DNGU5W.js +27 -0
  225. package/dist/chunk-F622MJYV.js +103 -0
  226. package/dist/chunk-F6NIQD74.js +5111 -0
  227. package/dist/chunk-FAWJTC34.js +43 -0
  228. package/dist/chunk-FAZBRHGG.js +47 -0
  229. package/dist/chunk-FIEUSGNJ.js +39 -0
  230. package/dist/chunk-FKCG7K6H.js +1146 -0
  231. package/dist/chunk-FOVVXV45.js +229 -0
  232. package/dist/chunk-FRBPKBFE.js +30 -0
  233. package/dist/chunk-FSA5BPFI.js +268 -0
  234. package/dist/chunk-FSJ5TTZ3.js +29 -0
  235. package/dist/chunk-FT7SGLXT.js +193 -0
  236. package/dist/chunk-FUUVZZUB.js +62 -0
  237. package/dist/chunk-FYMRVUNZ.js +1697 -0
  238. package/dist/chunk-FYTAA5FG.js +162 -0
  239. package/dist/chunk-G3VB2UCZ.js +3892 -0
  240. package/dist/chunk-G6OIMVXH.js +405 -0
  241. package/dist/chunk-G7PQCXVH.js +228 -0
  242. package/dist/chunk-GAB6UW52.js +1087 -0
  243. package/dist/chunk-GAFJEYLK.js +29 -0
  244. package/dist/chunk-GC4CRMTS.js +642 -0
  245. package/dist/chunk-GFHSIWHL.js +5297 -0
  246. package/dist/chunk-GI5M67YA.js +735 -0
  247. package/dist/chunk-GIJWHUWF.js +191 -0
  248. package/dist/chunk-GO6DRECI.js +1 -0
  249. package/dist/chunk-GOFVBTMN.js +314 -0
  250. package/dist/chunk-GQIP72ZJ.js +13 -0
  251. package/dist/chunk-GQXLXRFA.js +28 -0
  252. package/dist/chunk-GT6HFKJB.js +48 -0
  253. package/dist/chunk-GVJGSSKM.js +174 -0
  254. package/dist/chunk-GWHGTG37.js +36 -0
  255. package/dist/chunk-GZAJHLKO.js +18 -0
  256. package/dist/chunk-GZK62I3N.js +314 -0
  257. package/dist/chunk-H3HGMISG.js +483 -0
  258. package/dist/chunk-H3ISZJMJ.js +403 -0
  259. package/dist/chunk-H4HXVWEC.js +9 -0
  260. package/dist/chunk-H6MJGKAW.js +120 -0
  261. package/dist/chunk-HBTTGVR5.js +353 -0
  262. package/dist/chunk-HBZ322WZ.js +35 -0
  263. package/dist/chunk-HEP3ILP4.js +34 -0
  264. package/dist/chunk-HGFXODKO.js +106 -0
  265. package/dist/chunk-HHWDTB6S.js +59 -0
  266. package/dist/chunk-HKO45NLZ.js +286 -0
  267. package/dist/chunk-HLVTEA6A.js +89 -0
  268. package/dist/chunk-HS3SY6HN.js +160 -0
  269. package/dist/chunk-HT5OCGKN.js +899 -0
  270. package/dist/chunk-HXIIEMGF.js +78 -0
  271. package/dist/chunk-I56TH7VM.js +46 -0
  272. package/dist/chunk-I6FN3R5D.js +352 -0
  273. package/dist/chunk-I7SCBHJN.js +655 -0
  274. package/dist/chunk-IJM4GKAT.js +529 -0
  275. package/dist/chunk-IMEYU36R.js +344 -0
  276. package/dist/chunk-INJ3SS6A.js +936 -0
  277. package/dist/chunk-IUKOPCCE.js +441 -0
  278. package/dist/chunk-IVEPZQJO.js +33 -0
  279. package/dist/chunk-IVZEONFC.js +43 -0
  280. package/dist/chunk-IWBHRSG7.js +936 -0
  281. package/dist/chunk-IYY3HQAD.js +484 -0
  282. package/dist/chunk-J2ICMYDA.js +48 -0
  283. package/dist/chunk-J2QCFLUN.js +505 -0
  284. package/dist/chunk-J5HM6V5P.js +1039 -0
  285. package/dist/chunk-J6NZX6QH.js +398 -0
  286. package/dist/chunk-JBBB2Y47.js +432 -0
  287. package/dist/chunk-JDCZQZU7.js +42 -0
  288. package/dist/chunk-JEDNXGSS.js +169 -0
  289. package/dist/chunk-JHP7OT6K.js +89 -0
  290. package/dist/chunk-JLS65NUQ.js +14 -0
  291. package/dist/chunk-JNMWYMC6.js +38 -0
  292. package/dist/chunk-JNSTWNNW.js +25 -0
  293. package/dist/chunk-JOSK6GEU.js +9564 -0
  294. package/dist/chunk-JQUMSIGC.js +100 -0
  295. package/dist/chunk-JVHGMURQ.js +1106 -0
  296. package/dist/chunk-JYXS47FQ.js +951 -0
  297. package/dist/chunk-K2ZMW2Z5.js +2147 -0
  298. package/dist/chunk-K7FAFORM.js +14 -0
  299. package/dist/chunk-KBJXX3ON.js +333 -0
  300. package/dist/chunk-KHFKVQWY.js +486 -0
  301. package/dist/chunk-KHMEI3DQ.js +173 -0
  302. package/dist/chunk-KHW3UD7B.js +69 -0
  303. package/dist/chunk-KKQKWAMF.js +365 -0
  304. package/dist/chunk-KOKXJV2U.js +455 -0
  305. package/dist/chunk-KQ4NGOJI.js +14 -0
  306. package/dist/chunk-KQYQOXMS.js +342 -0
  307. package/dist/chunk-KTMW65UX.js +14 -0
  308. package/dist/chunk-KUEWV2JH.js +593 -0
  309. package/dist/chunk-KXYDV3HP.js +1523 -0
  310. package/dist/chunk-KZ4JMGZ5.js +96 -0
  311. package/dist/chunk-KZWGBUIO.js +2659 -0
  312. package/dist/chunk-L2CBG5IX.js +1892 -0
  313. package/dist/chunk-L2S235CU.js +314 -0
  314. package/dist/chunk-L32WD57F.js +98 -0
  315. package/dist/chunk-LDJCKAJP.js +123 -0
  316. package/dist/chunk-LDWNBEN7.js +541 -0
  317. package/dist/chunk-LJVH57G2.js +241 -0
  318. package/dist/chunk-LPQ7NZEN.js +209 -0
  319. package/dist/chunk-LRGH3CCV.js +148 -0
  320. package/dist/chunk-LULOGMMM.js +1133 -0
  321. package/dist/chunk-LWGKN2GY.js +8284 -0
  322. package/dist/chunk-LX4F24ZH.js +157 -0
  323. package/dist/chunk-M4BUEXXF.js +839 -0
  324. package/dist/chunk-M6UHOC4I.js +553 -0
  325. package/dist/chunk-MCBNWZNO.js +657 -0
  326. package/dist/chunk-MEMSY6VY.js +223 -0
  327. package/dist/chunk-MHLEZQQI.js +145 -0
  328. package/dist/chunk-MJ6WNSIX.js +192 -0
  329. package/dist/chunk-MKASIKWZ.js +442 -0
  330. package/dist/chunk-MNOVBYFU.js +60 -0
  331. package/dist/chunk-MO2BYAAF.js +2896 -0
  332. package/dist/chunk-MP6P7Y2A.js +180 -0
  333. package/dist/chunk-MQ4TFJAG.js +3365 -0
  334. package/dist/chunk-MT2WAIR3.js +131 -0
  335. package/dist/chunk-MTU7VTNN.js +1122 -0
  336. package/dist/chunk-MULMXX4V.js +150 -0
  337. package/dist/chunk-MW2DWWVA.js +147 -0
  338. package/dist/chunk-MY3ZPUN4.js +151 -0
  339. package/dist/chunk-MYLH2S4G.js +64 -0
  340. package/dist/chunk-MZ5WYKNA.js +28 -0
  341. package/dist/chunk-N3Q2JNPV.js +249 -0
  342. package/dist/chunk-N5DX4JAK.js +12 -0
  343. package/dist/chunk-NAINGKHF.js +35 -0
  344. package/dist/chunk-NEQUQHOX.js +223 -0
  345. package/dist/chunk-NHNPEZS4.js +1408 -0
  346. package/dist/chunk-NHTIXJCR.js +17 -0
  347. package/dist/chunk-NKLPMBNV.js +1154 -0
  348. package/dist/chunk-NMVZ5YES.js +199 -0
  349. package/dist/chunk-NRFRY3GE.js +256 -0
  350. package/dist/chunk-NTD6CSI6.js +1266 -0
  351. package/dist/chunk-NUO7B3SH.js +318 -0
  352. package/dist/chunk-NVOHIJKG.js +1319 -0
  353. package/dist/chunk-NXH3RX7O.js +523 -0
  354. package/dist/chunk-NXZ3DURF.js +257 -0
  355. package/dist/chunk-O26L6F7F.js +209 -0
  356. package/dist/chunk-O5RRIUEP.js +124 -0
  357. package/dist/chunk-O5X6BKAO.js +10 -0
  358. package/dist/chunk-O6ZQUVTR.js +31 -0
  359. package/dist/chunk-O7FE75QZ.js +306 -0
  360. package/dist/chunk-OC7Z6AJQ.js +81 -0
  361. package/dist/chunk-OH7IEZ63.js +307 -0
  362. package/dist/chunk-OI734GRS.js +115 -0
  363. package/dist/chunk-OJBH62DK.js +684 -0
  364. package/dist/chunk-OKJLVSTJ.js +247 -0
  365. package/dist/chunk-OMX5VL43.js +79 -0
  366. package/dist/chunk-ONHAMBN6.js +12 -0
  367. package/dist/chunk-ONYPLIVE.js +753 -0
  368. package/dist/chunk-OSK7QWPD.js +637 -0
  369. package/dist/chunk-OTXLMJKP.js +438 -0
  370. package/dist/chunk-OV5PKQMA.js +213 -0
  371. package/dist/chunk-OXK5HA4B.js +31 -0
  372. package/dist/chunk-OYDWFQA4.js +272 -0
  373. package/dist/chunk-OZAUKWHB.js +22 -0
  374. package/dist/chunk-P5P2EKGH.js +94 -0
  375. package/dist/chunk-P6SSWAKY.js +29 -0
  376. package/dist/chunk-P7CQGPLS.js +30 -0
  377. package/dist/chunk-P7RVCHQV.js +197 -0
  378. package/dist/chunk-PEBWDYIW.js +726 -0
  379. package/dist/chunk-PFCXFO7A.js +9193 -0
  380. package/dist/chunk-PFLDWMX6.js +168 -0
  381. package/dist/chunk-PHZGLQSK.js +15883 -0
  382. package/dist/chunk-PNFTPNSR.js +20 -0
  383. package/dist/chunk-PPHXX4W7.js +175 -0
  384. package/dist/chunk-PPZESPJT.js +262 -0
  385. package/dist/chunk-PRDHI2L5.js +296 -0
  386. package/dist/chunk-PSTKWHHN.js +32 -0
  387. package/dist/chunk-PV53ODOT.js +555 -0
  388. package/dist/chunk-PVJBTI7P.js +24 -0
  389. package/dist/chunk-PXKERBKX.js +100 -0
  390. package/dist/chunk-PZ5AY32C.js +10 -0
  391. package/dist/chunk-Q3DHEZA5.js +85 -0
  392. package/dist/chunk-Q5RZDVQK.js +204 -0
  393. package/dist/chunk-Q64IR2Z2.js +4933 -0
  394. package/dist/chunk-Q6Z5UGPL.js +398 -0
  395. package/dist/chunk-QAMAV4DT.js +627 -0
  396. package/dist/chunk-QBWF4444.js +112 -0
  397. package/dist/chunk-QDKYT4CI.js +22805 -0
  398. package/dist/chunk-QFLBRWCJ.js +126 -0
  399. package/dist/chunk-QILAQACE.js +107 -0
  400. package/dist/chunk-QJ6OEH4K.js +3683 -0
  401. package/dist/chunk-QK3NLYTV.js +320 -0
  402. package/dist/chunk-QOFLUS24.js +535 -0
  403. package/dist/chunk-QOIASNEJ.js +98 -0
  404. package/dist/chunk-QP4UTSOV.js +3587 -0
  405. package/dist/chunk-QP5ST7RI.js +904 -0
  406. package/dist/chunk-QS5AGRZN.js +167 -0
  407. package/dist/chunk-QTAOU53N.js +107 -0
  408. package/dist/chunk-QTCLJHLZ.js +351 -0
  409. package/dist/chunk-QTOLTG4L.js +119 -0
  410. package/dist/chunk-QWDV4OSL.js +142 -0
  411. package/dist/chunk-QWMQ74KD.js +508 -0
  412. package/dist/chunk-QX6LOMMH.js +158 -0
  413. package/dist/chunk-QXBKIHY7.js +238 -0
  414. package/dist/chunk-QXBKTJT6.js +270 -0
  415. package/dist/chunk-QYQOVOLR.js +196 -0
  416. package/dist/chunk-R2CKS6WT.js +73 -0
  417. package/dist/chunk-R2TIYG7U.js +68 -0
  418. package/dist/chunk-R2W3LESH.js +465 -0
  419. package/dist/chunk-R5EXHMUN.js +100 -0
  420. package/dist/chunk-RBBTBCHX.js +289 -0
  421. package/dist/chunk-RBKLOUXA.js +121 -0
  422. package/dist/chunk-RCP2Y6DQ.js +86 -0
  423. package/dist/chunk-RCYEJSD5.js +260 -0
  424. package/dist/chunk-RFDVSI4N.js +134 -0
  425. package/dist/chunk-RGJU63FV.js +1717 -0
  426. package/dist/chunk-RI4EX2QE.js +18 -0
  427. package/dist/chunk-RIMARPCF.js +152 -0
  428. package/dist/chunk-RJ6RSNT6.js +42 -0
  429. package/dist/chunk-RNI2GUIF.js +131 -0
  430. package/dist/chunk-RPHUWJ3K.js +264 -0
  431. package/dist/chunk-RPIMAMV7.js +361 -0
  432. package/dist/chunk-RQFX6YRN.js +49 -0
  433. package/dist/chunk-RRC5BL7B.js +285 -0
  434. package/dist/chunk-RSYTSBOO.js +79 -0
  435. package/dist/chunk-RWQQIKIC.js +35 -0
  436. package/dist/chunk-RZUBOZH2.js +373 -0
  437. package/dist/chunk-S2E632FQ.js +380 -0
  438. package/dist/chunk-S2VQCZO4.js +22 -0
  439. package/dist/chunk-S2XIMQJQ.js +681 -0
  440. package/dist/chunk-S47ISY27.js +183 -0
  441. package/dist/chunk-S6I4KISU.js +142 -0
  442. package/dist/chunk-S6TAFQI5.js +2403 -0
  443. package/dist/chunk-SBBNT5ZJ.js +27 -0
  444. package/dist/chunk-SDJV2DTQ.js +491 -0
  445. package/dist/chunk-SDPIFNLD.js +33 -0
  446. package/dist/chunk-SF6YK3JI.js +835 -0
  447. package/dist/chunk-SK3ZFONO.js +976 -0
  448. package/dist/chunk-SKTFRFQ7.js +1775 -0
  449. package/dist/chunk-SNGM452K.js +2002 -0
  450. package/dist/chunk-STW7OFOA.js +581 -0
  451. package/dist/chunk-SU6UFUQY.js +1351 -0
  452. package/dist/chunk-SVJM3LJA.js +27 -0
  453. package/dist/chunk-SVUNZOPG.js +129 -0
  454. package/dist/chunk-T5XLUYV3.js +34 -0
  455. package/dist/chunk-T7E5JS6N.js +57 -0
  456. package/dist/chunk-TA3N5MMO.js +450 -0
  457. package/dist/chunk-TAJPCXSB.js +13 -0
  458. package/dist/chunk-TDEMDRN2.js +1639 -0
  459. package/dist/chunk-TDSEX5CF.js +24 -0
  460. package/dist/chunk-TGCVL74Y.js +28 -0
  461. package/dist/chunk-TGXXYDL4.js +1012 -0
  462. package/dist/chunk-TIKTYUJO.js +296 -0
  463. package/dist/chunk-TIZAJD4M.js +6029 -0
  464. package/dist/chunk-TLSEZZCG.js +5549 -0
  465. package/dist/chunk-TMBDRHAX.js +19 -0
  466. package/dist/chunk-TRURQUBP.js +1217 -0
  467. package/dist/chunk-TSQ256N5.js +152 -0
  468. package/dist/chunk-TUQMMFEQ.js +2244 -0
  469. package/dist/chunk-U424MJLC.js +81 -0
  470. package/dist/chunk-U4DRS6ZW.js +11 -0
  471. package/dist/chunk-U5KS22IN.js +204 -0
  472. package/dist/chunk-UAPHFJPN.js +673 -0
  473. package/dist/chunk-UB7LQITD.js +1040 -0
  474. package/dist/chunk-UBVRHGAZ.js +237 -0
  475. package/dist/chunk-UDNNAQN5.js +98 -0
  476. package/dist/chunk-UJP3XM54.js +342 -0
  477. package/dist/chunk-UJYDH2MW.js +305 -0
  478. package/dist/chunk-UKMPASIC.js +399 -0
  479. package/dist/chunk-UKUL3EHK.js +763 -0
  480. package/dist/chunk-UPHU64NB.js +1327 -0
  481. package/dist/chunk-URMSZXAD.js +43 -0
  482. package/dist/chunk-US3RT6CY.js +525 -0
  483. package/dist/chunk-UTDEOPKV.js +30 -0
  484. package/dist/chunk-UUUDKV7N.js +13 -0
  485. package/dist/chunk-UVKWU3SM.js +39 -0
  486. package/dist/chunk-V2TVPO3X.js +521 -0
  487. package/dist/chunk-V3KLVK7B.js +398 -0
  488. package/dist/chunk-V3YFFHDR.js +17 -0
  489. package/dist/chunk-VAG6GUBR.js +1162 -0
  490. package/dist/chunk-VBENAHDA.js +1814 -0
  491. package/dist/chunk-VBNCKCCI.js +16 -0
  492. package/dist/chunk-VCGSWN5M.js +1300 -0
  493. package/dist/chunk-VE2O2I7M.js +115 -0
  494. package/dist/chunk-VIFHYTI5.js +31 -0
  495. package/dist/chunk-VJER3FUS.js +5080 -0
  496. package/dist/chunk-VLMDM56Q.js +268 -0
  497. package/dist/chunk-VMFZEVVX.js +99 -0
  498. package/dist/chunk-VNDPQVUZ.js +1853 -0
  499. package/dist/chunk-VSPJRLGA.js +4783 -0
  500. package/dist/chunk-VSWC5ZXI.js +103 -0
  501. package/dist/chunk-VYI4DSZP.js +2017 -0
  502. package/dist/chunk-W4BAIQ6L.js +1212 -0
  503. package/dist/chunk-W7VQAL2K.js +2203 -0
  504. package/dist/chunk-WEI3ZDZH.js +33 -0
  505. package/dist/chunk-WEIUS5NT.js +26 -0
  506. package/dist/chunk-WEW7UFWE.js +546 -0
  507. package/dist/chunk-WGQAXLNA.js +384 -0
  508. package/dist/chunk-WJAL4JL3.js +206 -0
  509. package/dist/chunk-WKFOJ5ZG.js +141 -0
  510. package/dist/chunk-WMWQEFLN.js +2177 -0
  511. package/dist/chunk-WNECKKO2.js +154 -0
  512. package/dist/chunk-WPKLYOAM.js +195 -0
  513. package/dist/chunk-WSH37YQN.js +243 -0
  514. package/dist/chunk-WV3KQDPE.js +84 -0
  515. package/dist/chunk-WZFC4V4U.js +389 -0
  516. package/dist/chunk-XCOIBNET.js +13 -0
  517. package/dist/chunk-XDM65LBX.js +53 -0
  518. package/dist/chunk-XGU6PBO5.js +645 -0
  519. package/dist/chunk-XHOI4V62.js +43 -0
  520. package/dist/chunk-XIBVFMLQ.js +6858 -0
  521. package/dist/chunk-XJ2E7YEJ.js +117 -0
  522. package/dist/chunk-XON4ZCYX.js +69 -0
  523. package/dist/chunk-XQPEWJPI.js +127 -0
  524. package/dist/chunk-XSJTIFUY.js +31 -0
  525. package/dist/chunk-XT7OVWM3.js +64 -0
  526. package/dist/chunk-XTXYIISX.js +1104 -0
  527. package/dist/chunk-XV7NZL4B.js +57 -0
  528. package/dist/chunk-XWIZ6B5S.js +109 -0
  529. package/dist/chunk-XWLIKOBX.js +240 -0
  530. package/dist/chunk-XZOXEIN4.js +156 -0
  531. package/dist/chunk-XZRS7I7W.js +3673 -0
  532. package/dist/chunk-Y4ZDDHB6.js +44 -0
  533. package/dist/chunk-Y733RB7T.js +194 -0
  534. package/dist/chunk-YBHUB4XR.js +14931 -0
  535. package/dist/chunk-YKC75XK4.js +147 -0
  536. package/dist/chunk-YKMXFVK7.js +27 -0
  537. package/dist/chunk-YO5BAJ55.js +225 -0
  538. package/dist/chunk-YPDCLXNZ.js +568 -0
  539. package/dist/chunk-YSQPGVFK.js +116 -0
  540. package/dist/chunk-YTVVTIWJ.js +716 -0
  541. package/dist/chunk-YVCMDVBB.js +698 -0
  542. package/dist/chunk-YYTOA6DP.js +114 -0
  543. package/dist/chunk-Z5WGNULV.js +88 -0
  544. package/dist/chunk-Z6NGVVXG.js +66 -0
  545. package/dist/chunk-Z7CDQNH3.js +20 -0
  546. package/dist/chunk-ZH4G3FU5.js +187 -0
  547. package/dist/chunk-ZJB6SQPA.js +257 -0
  548. package/dist/chunk-ZL6E4HMY.js +42 -0
  549. package/dist/chunk-ZMLOC3DW.js +62 -0
  550. package/dist/chunk-ZORW64QH.js +101 -0
  551. package/dist/chunk-ZVVD2XGV.js +1369 -0
  552. package/dist/cli-utils-ER33ODC5.js +31 -0
  553. package/dist/cli-validation-6CHPTANV.js +146 -0
  554. package/dist/commit-utils-3STAY7C7.js +49 -0
  555. package/dist/compatibility-notice-IHNXR2JR.js +21 -0
  556. package/dist/compete-config-resolver-V3GDNJMM.js +125 -0
  557. package/dist/compete-results-XUM3PJHS.js +318 -0
  558. package/dist/competition-outcome-tracker-NWSMVUPG.js +62 -0
  559. package/dist/config-4HHE4OIK.js +238 -0
  560. package/dist/config-D6YAZASH.js +10 -0
  561. package/dist/config-MIPRDYYV.js +46 -0
  562. package/dist/config-audit-GA5DCUAI.js +371 -0
  563. package/dist/config-explain-4LMO556H.js +71 -0
  564. package/dist/config-loader-RGP634PC.js +51 -0
  565. package/dist/config-manager-J2UTO635.js +114 -0
  566. package/dist/config-merger-TVUJBZTS.js +14 -0
  567. package/dist/config-validator-H4ZVIE56.js +122 -0
  568. package/dist/cost-HSIV5U2Y.js +85 -0
  569. package/dist/data-migration-state-OAUL2WPQ.js +35 -0
  570. package/dist/db-migrator-NUOW5NKR.js +34 -0
  571. package/dist/default-paths-UILB62BN.js +49 -0
  572. package/dist/discovery-V6GYUJUC.js +53 -0
  573. package/dist/doctor-BBSMCDWE.js +271 -0
  574. package/dist/doctor-context-blocks-LPY75VZA.js +231 -0
  575. package/dist/doctor-instructions-import-JXHDDOE5.js +70 -0
  576. package/dist/doctor-purpose-6YJOXPBE.js +30 -0
  577. package/dist/domain-analyzer-S35ABUNA.js +48 -0
  578. package/dist/ensure-initialized-Q6PEU55O.js +78 -0
  579. package/dist/entry.js +922 -0
  580. package/dist/error-parser-core-MZFMFANN.js +70 -0
  581. package/dist/evaluation-context-GQBYDAEV.js +63 -0
  582. package/dist/evidence-plan-resolver-5FUAP3SA.js +111 -0
  583. package/dist/execution-data-writer-YCG5UH37.js +72 -0
  584. package/dist/execution-policy-applier-PWZM5LNA.js +63 -0
  585. package/dist/execution-preflight-DASJWWQF.js +223 -0
  586. package/dist/execution-roles-KNSNNB2D.js +112 -0
  587. package/dist/exit-code-error-QIY5DOKF.js +18 -0
  588. package/dist/external-temp-cleanup-CAW7LQ6R.js +360 -0
  589. package/dist/factory-YCYCB7AE.js +209 -0
  590. package/dist/file-utils-ZQYNBQBW.js +45 -0
  591. package/dist/flywheel-allowlist-revert-H22HA6JE.js +21 -0
  592. package/dist/flywheel-autoloop-executor-PDOASJEZ.js +316 -0
  593. package/dist/flywheel-autoloop-unverified-TOKYFCDC.js +36 -0
  594. package/dist/flywheel-competition-executor-YJUMMEJO.js +320 -0
  595. package/dist/flywheel-executor-JWU43KAY.js +437 -0
  596. package/dist/flywheel-git-isolation-FQ2TRWMB.js +56 -0
  597. package/dist/flywheel-manifest-HDPNMWWF.js +114 -0
  598. package/dist/flywheel-model-defaults-UHAKTZT3.js +110 -0
  599. package/dist/flywheel-preflight-III2C7TH.js +163 -0
  600. package/dist/flywheel-resume-2O45MS7Y.js +31 -0
  601. package/dist/flywheel-resume-execution-lease-P2BK257J.js +59 -0
  602. package/dist/flywheel-safety-AVAVFXIJ.js +19 -0
  603. package/dist/flywheel-scope-decision-ALJUUNGG.js +14 -0
  604. package/dist/get-telemetry-logger-MPDVO2JA.js +155 -0
  605. package/dist/git-message-style-KCXGMTDT.js +104 -0
  606. package/dist/guidance-profile-config-G3K5YQOO.js +113 -0
  607. package/dist/guidance-profile-renderer-TX4TNDFL.js +23 -0
  608. package/dist/identity-XLQJ4YJF.js +25 -0
  609. package/dist/index-query-6NUY4FKX.js +37 -0
  610. package/dist/index.js +85588 -0
  611. package/dist/indexer-DL54CM3K.js +44 -0
  612. package/dist/init-OUZ72344.js +245 -0
  613. package/dist/instructions-import-offer-NSYXSITC.js +363 -0
  614. package/dist/instructions-run-NBII7W36.js +114 -0
  615. package/dist/interrupted-work-E4TLKJLE.js +43 -0
  616. package/dist/invoke-provider-auth-NEWEIHCI.js +38 -0
  617. package/dist/judge-scoring.json +64 -0
  618. package/dist/lab-mode-YXQ2Y3NG.js +44 -0
  619. package/dist/lab-utils-5QAMDJR5.js +29 -0
  620. package/dist/linux-host-class-YDWQX65O.js +31 -0
  621. package/dist/llm-judge-executor-OJSNCTFJ.js +179 -0
  622. package/dist/local-ci-config-VZ4WWDT5.js +48 -0
  623. package/dist/local-executor-DCMDDRX2.js +280 -0
  624. package/dist/logger-5KNKS3O4.js +154 -0
  625. package/dist/matrix-prompt-builder-4ZBOGZSB.js +527 -0
  626. package/dist/matrix-result-parser-EZJM4YXP.js +14 -0
  627. package/dist/merge-batch-RTEEMVDB.js +313 -0
  628. package/dist/merge-batch-members-VIWGVRHP.js +24 -0
  629. package/dist/merge-queue-TIIUSOY6.js +126 -0
  630. package/dist/merge-queue-trust-DUNZ4J65.js +21 -0
  631. package/dist/metadata-UKSMWM6J.js +29 -0
  632. package/dist/model-catalog-readiness-R5KJBP5M.js +202 -0
  633. package/dist/model-invocations-db-XTUPPQ34.js +70 -0
  634. package/dist/model-resolver-JFZ2MHOJ.js +39 -0
  635. package/dist/model-resolver-SCQ57KAQ.js +217 -0
  636. package/dist/model-roles-D3OR4NAH.js +110 -0
  637. package/dist/monitor-F4SIU5G2.js +96 -0
  638. package/dist/nested-worktrees-2WUWQ75N.js +23 -0
  639. package/dist/next-S3IRLVER.js +96 -0
  640. package/dist/next-UKPFRXOO.js +148 -0
  641. package/dist/opportunistic-TL4S26VX.js +86 -0
  642. package/dist/optimization-config-resolver-NAEIYU6A.js +148 -0
  643. package/dist/package-HJR4QJT4.js +10 -0
  644. package/dist/parse-git-status-7PIYFPS2.js +21 -0
  645. package/dist/path-security-5WJSY56G.js +41 -0
  646. package/dist/paths-JUI7C4KU.js +45 -0
  647. package/dist/plan-backlog-list-fast-SSTQL5XP.js +89 -0
  648. package/dist/plan-backlog-show-fast-PFRAQ3JB.js +114 -0
  649. package/dist/plan-sprint-list-fast-HD2KBZSY.js +110 -0
  650. package/dist/plan-sprint-status-fast-YFYH7WQF.js +116 -0
  651. package/dist/plan-task-status-fast-JU5PNLUU.js +114 -0
  652. package/dist/plan-to-flywheel-PY5MSY2H.js +529 -0
  653. package/dist/preflight-PJHGTJNZ.js +12 -0
  654. package/dist/process-registry-B4ZUCN7T.js +28 -0
  655. package/dist/process-scanner-TU3QHWVB.js +23 -0
  656. package/dist/processes-6FHVGT72.js +28 -0
  657. package/dist/processes-json-fast-YWTMUWXB.js +72 -0
  658. package/dist/profile-HWTC56SG.js +209 -0
  659. package/dist/project-runtime-paths-2UQNG5Y4.js +41 -0
  660. package/dist/protected-branches-N36LDBFY.js +71 -0
  661. package/dist/provider-aware-resource-manager-YTFAHNGJ.js +40 -0
  662. package/dist/provider-matrix-2KO2V5OM.js +214 -0
  663. package/dist/provider-matrix-renderer-MEC3PER7.js +139 -0
  664. package/dist/provider-output-forwarding-2AHL7YMA.js +26 -0
  665. package/dist/provider-registry-WCZ65QHC.js +136 -0
  666. package/dist/provider-temp-cleanup-IUNPJCZF.js +14 -0
  667. package/dist/prune-engine-EOQVWEP6.js +448 -0
  668. package/dist/publication-turn-S42RZTQF.js +44 -0
  669. package/dist/quality-gate-JQMVCKOO.js +72 -0
  670. package/dist/quickstart-3O6FRCFB.js +105 -0
  671. package/dist/readiness-GW6ABRHB.js +139 -0
  672. package/dist/readiness-KFZCXDTT.js +215 -0
  673. package/dist/registry-7XG376SY.js +217 -0
  674. package/dist/repair-helpers-TTV5FEF4.js +117 -0
  675. package/dist/repo-root-YG6MQZDW.js +28 -0
  676. package/dist/resolution-engine-FFEK7HQ2.js +187 -0
  677. package/dist/resolve-provider-cli-ZEXVZKET.js +44 -0
  678. package/dist/restore-telemetry-db-E7BR5PO7.js +459 -0
  679. package/dist/routing-events-AW6SRZ6G.js +13 -0
  680. package/dist/routing-history-store-FMDDQL6W.js +39 -0
  681. package/dist/routing-planner-C6OHO3EY.js +221 -0
  682. package/dist/runner-KHDNQ5KU.js +1194 -0
  683. package/dist/runner-PIS2BW7Y.js +1801 -0
  684. package/dist/safety-E3JJVSFL.js +67 -0
  685. package/dist/safety-stanza-HE6GXP4G.js +49 -0
  686. package/dist/sandbox-7LBZC5PE.js +72 -0
  687. package/dist/sandbox-ASWCDYZL.js +80 -0
  688. package/dist/schema-extensions.sql +234 -0
  689. package/dist/security-JI22TBEB.js +17 -0
  690. package/dist/setup-bb-plugin-FQXLA76Y.js +531 -0
  691. package/dist/setup-claude-code-NF4ZSHVE.js +197 -0
  692. package/dist/setup-temp-cleanup-2APZ4HMA.js +29 -0
  693. package/dist/shared-utils-34HJZ6JX.js +40 -0
  694. package/dist/simple-artifact-goal-MQLDDMMX.js +29 -0
  695. package/dist/sprint-N7JFTEGL.js +403 -0
  696. package/dist/sprint-bridge-KJXIBNRJ.js +117 -0
  697. package/dist/sprint-completion-dependents-34SR7JVL.js +43 -0
  698. package/dist/sprint-execution-service-A6JPUBWY.js +376 -0
  699. package/dist/sprint-manager-MU2ZUWN2.js +140 -0
  700. package/dist/sqlite-timeout-config-U2CT4LKU.js +13 -0
  701. package/dist/sqlite-wrapper-FSGJ2QEW.js +19 -0
  702. package/dist/stale-cleanup-orchestrator-4X6324VF.js +71 -0
  703. package/dist/storage-access-I3V5LER7.js +31 -0
  704. package/dist/store-XVG64ZR2.js +25 -0
  705. package/dist/task-classifier-MN2DYE5R.js +558 -0
  706. package/dist/task-list-fast-7AT6LTTA.js +112 -0
  707. package/dist/task-manager-LHPBBRRE.js +136 -0
  708. package/dist/task-report-OLPAWBTK.js +64 -0
  709. package/dist/task-type-detector-6RG3YNZF.js +27 -0
  710. package/dist/task-type-resolver-EQHOUIHT.js +64 -0
  711. package/dist/telemetry-5VYSK772.js +212 -0
  712. package/dist/telemetry-health-tracker-4GFW2EMP.js +12 -0
  713. package/dist/telemetry-path-resolver-H3NFHHQY.js +34 -0
  714. package/dist/telemetry-reliability-URJDTNPZ.js +76 -0
  715. package/dist/transports-NREZQTJK.js +106 -0
  716. package/dist/unified-cost-tracker-5MTBJ2CL.js +59 -0
  717. package/dist/unified-state-cleanup-GGAXLHXF.js +292 -0
  718. package/dist/universal-cost-calculator-JTFEJVWK.js +70 -0
  719. package/dist/user-agents-QLIGPLP2.js +30 -0
  720. package/dist/variant-execution-I4ZZUAWY.js +319 -0
  721. package/dist/variant-opt-parser-JHCXKY2K.js +251 -0
  722. package/dist/variant-request-input-PL37N3AN.js +11 -0
  723. package/dist/variant-state-cleanup-KHMXRBZN.js +287 -0
  724. package/dist/variant-worker-COB5YTJX.js +4517 -0
  725. package/dist/variant-worker.js +26 -0
  726. package/dist/variants-XGDSXYG3.js +267 -0
  727. package/dist/verification-command-YSPU4VBH.js +66 -0
  728. package/dist/verify-command-timeout-DQUYH33Z.js +11 -0
  729. package/dist/verify-commands-LOHMOFKC.js +65 -0
  730. package/dist/warning-JSKSFKBT.js +13 -0
  731. package/dist/work-edge-K65NHVWY.js +50 -0
  732. package/dist/work-item-writer-KY5ZWZWW.js +30 -0
  733. package/dist/worker-JNXXEIT6.js +1504 -0
  734. package/dist/worker.js +21 -0
  735. package/dist/workspace-tree-identity-JO5PSKTW.js +52 -0
  736. package/dist/worktree-environment-WTVABAQW.js +64 -0
  737. package/dist/worktree-metrics-VZRQI26T.js +66 -0
  738. package/dist/writeback-TQFQBJNU.js +50 -0
  739. package/docs/CLI_REFERENCE.md +8287 -0
  740. package/docs/PROVIDER_SETUP.md +1737 -0
  741. package/docs/README.md +96 -0
  742. package/docs/TROUBLESHOOTING.md +2209 -0
  743. package/docs/getting-started/QUICK_START.md +260 -0
  744. package/docs/getting-started/README.md +198 -0
  745. package/docs/getting-started/SETUP.md +25 -0
  746. package/docs/reference/AGENT_CONTEXT.md +84 -0
  747. package/docs/reference/DELIVERY_ONBOARDING.md +198 -0
  748. package/docs/reference/PROVIDER_RELEASE_TIERS.md +34 -0
  749. package/docs/reference/SECURITY.md +291 -0
  750. package/docs/reference/TELEMETRY_PRIVACY.md +259 -0
  751. package/integrations/bb-plugin-build/README.md +391 -0
  752. package/integrations/bb-plugin-build/app.css +431 -0
  753. package/integrations/bb-plugin-build/app.tsx +6210 -0
  754. package/integrations/bb-plugin-build/package.json +45 -0
  755. package/integrations/bb-plugin-build/server.ts +488 -0
  756. package/integrations/bb-plugin-build/src/adapter.ts +3672 -0
  757. package/integrations/bb-plugin-build/src/backlog-authoring-model.ts +150 -0
  758. package/integrations/bb-plugin-build/src/backlog-authoring-schema.ts +458 -0
  759. package/integrations/bb-plugin-build/src/backlog-authoring-service.ts +467 -0
  760. package/integrations/bb-plugin-build/src/backlog-authoring-view.ts +1025 -0
  761. package/integrations/bb-plugin-build/src/command-evidence-schema.ts +13 -0
  762. package/integrations/bb-plugin-build/src/competition-defaults-schema.ts +122 -0
  763. package/integrations/bb-plugin-build/src/competition-defaults-service.ts +105 -0
  764. package/integrations/bb-plugin-build/src/competition-defaults-view.ts +138 -0
  765. package/integrations/bb-plugin-build/src/contract.ts +718 -0
  766. package/integrations/bb-plugin-build/src/execution-activity-view.ts +98 -0
  767. package/integrations/bb-plugin-build/src/finalize-model.ts +205 -0
  768. package/integrations/bb-plugin-build/src/finalize-schema.ts +150 -0
  769. package/integrations/bb-plugin-build/src/finalize-service.ts +330 -0
  770. package/integrations/bb-plugin-build/src/finalize-view.ts +159 -0
  771. package/integrations/bb-plugin-build/src/judge-operations-readback.ts +303 -0
  772. package/integrations/bb-plugin-build/src/judge-operations-schema.ts +33 -0
  773. package/integrations/bb-plugin-build/src/judge-operations-view.ts +459 -0
  774. package/integrations/bb-plugin-build/src/model.ts +1318 -0
  775. package/integrations/bb-plugin-build/src/monitor-service.ts +233 -0
  776. package/integrations/bb-plugin-build/src/panel-read-ux.ts +97 -0
  777. package/integrations/bb-plugin-build/src/patch-preview-schema.ts +166 -0
  778. package/integrations/bb-plugin-build/src/patch-preview-service.ts +480 -0
  779. package/integrations/bb-plugin-build/src/patch-preview-view.ts +109 -0
  780. package/integrations/bb-plugin-build/src/planning-readback.ts +228 -0
  781. package/integrations/bb-plugin-build/src/planning-service.ts +647 -0
  782. package/integrations/bb-plugin-build/src/planning-sync-evidence.ts +37 -0
  783. package/integrations/bb-plugin-build/src/planning-workspace-readback.ts +33 -0
  784. package/integrations/bb-plugin-build/src/planning-workspace-schema.ts +131 -0
  785. package/integrations/bb-plugin-build/src/planning-workspace.ts +333 -0
  786. package/integrations/bb-plugin-build/src/poll-handoff.ts +136 -0
  787. package/integrations/bb-plugin-build/src/project-target-server.ts +21 -0
  788. package/integrations/bb-plugin-build/src/project-target.ts +45 -0
  789. package/integrations/bb-plugin-build/src/reference-index.ts +218 -0
  790. package/integrations/bb-plugin-build/src/repository-identity.ts +17 -0
  791. package/integrations/bb-plugin-build/src/repository-schema.ts +30 -0
  792. package/integrations/bb-plugin-build/src/result-explorer-view.ts +597 -0
  793. package/integrations/bb-plugin-build/src/result-readback-model.ts +163 -0
  794. package/integrations/bb-plugin-build/src/result-readback-schema.ts +319 -0
  795. package/integrations/bb-plugin-build/src/result-readback-service.ts +333 -0
  796. package/integrations/bb-plugin-build/src/run-page-view.ts +332 -0
  797. package/integrations/bb-plugin-build/src/setup-config-schema.ts +293 -0
  798. package/integrations/bb-plugin-build/src/setup-config-service.ts +620 -0
  799. package/integrations/bb-plugin-build/src/setup-config-view.ts +388 -0
  800. package/integrations/bb-plugin-build/src/sprint-close-model.ts +150 -0
  801. package/integrations/bb-plugin-build/src/sprint-close-schema.ts +128 -0
  802. package/integrations/bb-plugin-build/src/sprint-close-service.ts +293 -0
  803. package/integrations/bb-plugin-build/src/sprint-close-view.ts +116 -0
  804. package/integrations/bb-plugin-build/src/sprint-composition-model.ts +709 -0
  805. package/integrations/bb-plugin-build/src/sprint-composition-readback.ts +231 -0
  806. package/integrations/bb-plugin-build/src/sprint-composition-schema.ts +597 -0
  807. package/integrations/bb-plugin-build/src/sprint-composition-service.ts +773 -0
  808. package/integrations/bb-plugin-build/src/sprint-composition-view.ts +1221 -0
  809. package/integrations/bb-plugin-build/src/sprint-execution-schema.ts +188 -0
  810. package/integrations/bb-plugin-build/src/sprint-execution-service.ts +289 -0
  811. package/integrations/bb-plugin-build/src/sprint-execution-view.ts +54 -0
  812. package/integrations/bb-plugin-build/src/task-authoring-model.ts +563 -0
  813. package/integrations/bb-plugin-build/src/task-authoring-schema.ts +629 -0
  814. package/integrations/bb-plugin-build/src/task-authoring-service.ts +842 -0
  815. package/integrations/bb-plugin-build/src/task-authoring-view.ts +1227 -0
  816. package/integrations/bb-plugin-build/src/task-catalog-schema.ts +46 -0
  817. package/integrations/bb-plugin-build/src/task-catalog-service.ts +44 -0
  818. package/integrations/bb-plugin-build/src/task-detail-readback.ts +56 -0
  819. package/integrations/bb-plugin-build/src/task-detail-schema.ts +171 -0
  820. package/integrations/bb-plugin-build/src/task-navigation.ts +446 -0
  821. package/integrations/bb-plugin-build/src/workbench-route.ts +74 -0
  822. package/package.json +306 -4
  823. package/schemas/README.md +80 -0
  824. package/schemas/build.config.schema.json +2110 -0
  825. package/schemas/config-v1.schema.json +136 -0
  826. package/schemas/execution-config.schema.json +47 -0
  827. package/schemas/judge-scoring.schema.json +257 -0
  828. package/schemas/provider-config.schema.json +179 -0
  829. package/schemas/telemetry-config.schema.json +79 -0
  830. package/schemas/user-preferences.schema.json +141 -0
  831. package/scripts/assert-node-runtime.mjs +146 -0
  832. package/scripts/preflight-native.mjs +49 -0
  833. package/scripts/setup-git-hooks.mjs +39 -0
  834. package/scripts/sync.sh +2871 -0
  835. package/scripts/write-node-launcher.sh +138 -0
  836. package/src/resources/gemini/slash-packs/default/plan.toml +15 -0
  837. package/src/resources/gemini/slash-packs/default/summary.toml +16 -0
  838. package/src/resources/gemini/slash-packs/default/tests.toml +16 -0
  839. package/templates/.build-project/README.md +41 -0
  840. package/templates/.build-project/agents/README.md +50 -0
  841. package/templates/.build-project/agents/architect.md +10 -0
  842. package/templates/.build-project/agents/code-reviewer.md +10 -0
  843. package/templates/.build-project/agents/debugger.md +10 -0
  844. package/templates/.build-project/agents/documenter.md +10 -0
  845. package/templates/.build-project/agents/test-automator.md +10 -0
  846. package/templates/.build-project/config/build.config.jsonc +64 -0
  847. package/templates/.build-project/config/project-context.template.json +6 -0
  848. package/templates/.build-project/config/task-type-aliases.presets/kanban.yaml +14 -0
  849. package/templates/.build-project/config/task-type-aliases.presets/scrum.yaml +17 -0
  850. package/templates/.build-project/config/task-type-aliases.presets/xp.yaml +12 -0
  851. package/templates/.build-project/config/task-type-aliases.yaml +29 -0
  852. package/templates/.build-project/gitignore.template +70 -0
  853. package/templates/.build-project/task-types/analysis.yaml +38 -0
  854. package/templates/.build-project/task-types/architecture.yaml +35 -0
  855. package/templates/.build-project/task-types/doc.yaml +34 -0
  856. package/templates/.build-project/task-types/feature.yaml +22 -0
  857. package/templates/.build-project/task-types/general.yaml +4 -0
  858. package/templates/.build-project/task-types/security.yaml +38 -0
  859. package/templates/AGENTS.template.md +85 -0
  860. package/templates/CLAUDE.template.md +1 -0
  861. package/templates/GEMINI.template.md +1 -0
  862. package/templates/builtin-workflows/code-review.yaml +73 -0
  863. package/templates/builtin-workflows/skills/code-review/SKILL.md +61 -0
  864. package/templates/builtin-workflows/skills/execution-contract-analysis/SKILL.md +24 -0
  865. package/templates/builtin-workflows/skills/execution-contract-code/SKILL.md +19 -0
  866. package/templates/builtin-workflows/skills/execution-contract-structured/SKILL.md +17 -0
  867. package/templates/ci/incident-intake.mjs +787 -0
  868. package/templates/ci/incidents.yml.template +103 -0
  869. package/templates/ci/node.yml.template +17 -0
  870. package/templates/ci/python.yml.template +17 -0
  871. package/templates/guard-kit/GUARD_SETUP.md.template +258 -0
  872. package/templates/guard-kit/build-guard.yml.template +189 -0
  873. package/templates/guard-kit/check.mjs.template +932 -0
  874. package/templates/guard-kit/config.json.template +7 -0
  875. package/templates/guard-kit/policy.json.template +1 -0
  876. package/templates/profiles/README.md +57 -0
  877. package/templates/profiles/frontier-claude.json +23 -0
  878. package/templates/profiles/frontier-codex.json +23 -0
@@ -0,0 +1,1025 @@
1
+ /**
2
+ * Pure BB presentation and interaction for backlog authoring over BPAU-01.
3
+ *
4
+ * This module is presentation only. It composes forms, proportionate
5
+ * confirmations, and one typed BPAU-01 request per confirmed submission, and it
6
+ * renders the outcome BPAU-01 returned. It holds the same authority boundary the
7
+ * rest of this plugin holds:
8
+ *
9
+ * - Build is authoritative. Nothing here predicts a resulting status,
10
+ * completeness score, identity, priority, or sync state, and nothing here
11
+ * re-labels one Build published.
12
+ * - Changed facts are displayed only from Build's own authoritative reread.
13
+ * While that reread is unavailable the view reports `awaiting-reread`
14
+ * instead of echoing the values BB submitted.
15
+ * - Absent evidence renders as an explicit `unavailable`. A missing field is
16
+ * never replaced by a default, a guess, or an empty success state.
17
+ * - Nothing here runs a command, touches the filesystem, reads Git, or
18
+ * mutates managed planning state. Every function is deterministic in its
19
+ * inputs; the BPAU-01 service owns execution.
20
+ *
21
+ * Scope is create, whitelisted update, review, and prioritize only. There is no
22
+ * defer/parking, archive, execution, finalization, optimistic state, or retry
23
+ * here, and this module wires no application shell.
24
+ */
25
+
26
+ import type {
27
+ BacklogAuthoringOutcome,
28
+ BacklogAuthoringResult,
29
+ BacklogDetailEvidence,
30
+ BacklogEvidence,
31
+ } from './backlog-authoring-model.js';
32
+ import {
33
+ type BacklogAuthoringRequest,
34
+ backlogAuthoringRequestSchema,
35
+ } from './backlog-authoring-schema.js';
36
+
37
+ export const BACKLOG_AUTHORING_VIEW_VERSION = '1.0.0' as const;
38
+
39
+ /**
40
+ * Bound on any single emitted row value, mirroring the sibling view modules.
41
+ *
42
+ * Disclosures, notes, sync warnings, and Build's own diagnostics are never
43
+ * truncated: shortening a consent disclosure or a warning Build published would
44
+ * hide part of what the operator is being told.
45
+ */
46
+ export const BACKLOG_AUTHORING_MAX_LINE_CHARS = 200;
47
+
48
+ /** Plain label for evidence Build did not publish. */
49
+ const UNAVAILABLE = 'unavailable';
50
+
51
+ export type BacklogAuthoringAction = BacklogAuthoringRequest['action'];
52
+ type BacklogAuthoringConsentPayload = BacklogAuthoringRequest['consent'];
53
+ /** One request per action with its consent removed, distributed over the union. */
54
+ type BacklogRequestDraft = BacklogAuthoringRequest extends infer Request
55
+ ? Request extends { consent: unknown }
56
+ ? Omit<Request, 'consent'>
57
+ : never
58
+ : never;
59
+ type BacklogPriority = Extract<
60
+ BacklogAuthoringRequest,
61
+ { action: 'prioritizeBacklogItem' }
62
+ >['input']['priority'];
63
+
64
+ export interface BacklogAuthoringRow {
65
+ /** Stable row id, usable as a render key. */
66
+ id: string;
67
+ label: string;
68
+ value: string;
69
+ }
70
+
71
+ /** The repository and branch one form is bound to, as BB selected them. */
72
+ export interface BacklogAuthoringTarget {
73
+ projectId: string;
74
+ sourceId: string;
75
+ repositoryPath: string;
76
+ /** Null when Build reports no named branch; authoring is then unavailable. */
77
+ branch: string | null;
78
+ }
79
+
80
+ function truncateLine(text: string): string {
81
+ const normalized = text.replace(/\s+/g, ' ').trim();
82
+ if (normalized.length <= BACKLOG_AUTHORING_MAX_LINE_CHARS) return normalized;
83
+ return `${normalized.slice(0, BACKLOG_AUTHORING_MAX_LINE_CHARS - 3)}...`;
84
+ }
85
+
86
+ function row(id: string, label: string, value: string): BacklogAuthoringRow {
87
+ return { id, label, value: truncateLine(value) };
88
+ }
89
+
90
+ function normalizeTags(tags: readonly string[] | undefined): string[] {
91
+ if (tags === undefined) return [];
92
+ const present = tags.map((tag) => tag.trim()).filter((tag) => tag.length > 0);
93
+ return [...new Set(present)];
94
+ }
95
+
96
+ /** Control labels. Each names the one product it submits. */
97
+ export const BACKLOG_AUTHORING_LABELS: Readonly<Record<BacklogAuthoringAction, string>> = {
98
+ createBacklogItem: 'Capture backlog item',
99
+ updateBacklogItem: 'Edit backlog item',
100
+ reviewBacklogItem: 'Mark backlog item reviewed',
101
+ prioritizeBacklogItem: 'Set backlog item priority',
102
+ };
103
+
104
+ /**
105
+ * What each command is asked to do. These describe the request, never a
106
+ * predicted result, and each one names what it does not do so an authoring
107
+ * control can never read as execution or archival.
108
+ */
109
+ export const BACKLOG_AUTHORING_EFFECTS: Readonly<Record<BacklogAuthoringAction, string>> = {
110
+ createBacklogItem:
111
+ 'Asks Build to create a new backlog item from the sections you entered. Build mints the id and scores completeness. Nothing is executed, deferred, or archived.',
112
+ updateBacklogItem:
113
+ 'Asks Build to update only the backlog fields you changed. It sets no status, and it never defers, archives, or executes the item.',
114
+ reviewBacklogItem:
115
+ 'Asks Build to mark this backlog item reviewed. It changes no priority and executes nothing.',
116
+ prioritizeBacklogItem:
117
+ 'Asks Build to set this backlog item priority. Build decides the resulting status; nothing is executed.',
118
+ };
119
+
120
+ /**
121
+ * Whole-body replacement disclosure, stated once. A backlog update sends
122
+ * `--body`, which replaces the entire item body rather than one section, so this
123
+ * copy must never read as a partial edit.
124
+ */
125
+ export const BACKLOG_FULL_BODY_REPLACEMENT_NOTICE =
126
+ 'Saving replaces the entire body of this backlog item with the text above, including any section Build itself added. The editor was prepopulated from the current canonical body; BB will not submit a replacement it could not prepopulate.';
127
+
128
+ /**
129
+ * Prioritize can promote an inbox item, which is a launch-eligibility change and
130
+ * is disclosed as one before submission.
131
+ */
132
+ export const BACKLOG_PRIORITIZE_LAUNCH_ELIGIBILITY_NOTICE =
133
+ 'Setting a priority may also move an inbox item to reviewed. Build decides the resulting status; BB reports only what Build rereads afterwards.';
134
+
135
+ export const BACKLOG_REVIEW_LAUNCH_ELIGIBILITY_NOTICE =
136
+ 'Marking this item reviewed changes its canonical planning status. Build decides the resulting status; BB reports only what Build rereads afterwards.';
137
+
138
+ export const BACKLOG_CAPTURE_COMPLETENESS_NOTICE =
139
+ 'Build scores completeness after creation. An incomplete item is still created; Build then reports what is missing and the refine command that finishes it.';
140
+
141
+ /** Consent checkboxes exactly as the operator left them; plain booleans. */
142
+ export interface BacklogAuthoringConsentState {
143
+ hostExecution: boolean;
144
+ managedPlanningMutation: boolean;
145
+ automaticCommitAndPush: boolean;
146
+ selectedRepositoryAndBranch: boolean;
147
+ /** Required for capture only. */
148
+ newIdentityCreation: boolean;
149
+ /** Required for review and prioritize only. */
150
+ launchEligibilityChange: boolean;
151
+ /** Required when an update replaces the whole body. */
152
+ fullSectionReplacement: boolean;
153
+ }
154
+
155
+ export const EMPTY_BACKLOG_AUTHORING_CONSENT: Readonly<BacklogAuthoringConsentState> = {
156
+ hostExecution: false,
157
+ managedPlanningMutation: false,
158
+ automaticCommitAndPush: false,
159
+ selectedRepositoryAndBranch: false,
160
+ newIdentityCreation: false,
161
+ launchEligibilityChange: false,
162
+ fullSectionReplacement: false,
163
+ };
164
+
165
+ export const BACKLOG_AUTHORING_CONSENT_LABELS: Readonly<
166
+ Record<keyof BacklogAuthoringConsentState, string>
167
+ > = {
168
+ hostExecution: 'Build runs as my host user in the repository shown above.',
169
+ managedPlanningMutation: 'This mutates managed planning state that Build owns.',
170
+ automaticCommitAndPush:
171
+ "Build's built-in managed sync commits and pushes these planning changes.",
172
+ selectedRepositoryAndBranch: 'I mean this repository path and this branch.',
173
+ newIdentityCreation: 'A new Build-minted backlog id will exist after this action.',
174
+ launchEligibilityChange: 'This may change the item status to reviewed in Build planning.',
175
+ fullSectionReplacement: 'This replaces the entire body of the backlog item.',
176
+ };
177
+
178
+ /**
179
+ * Which acknowledgement lines one action requires, given the fields being sent.
180
+ * Confirmation is proportionate: an action never collects an acknowledgement for
181
+ * an effect that is not happening.
182
+ */
183
+ export function backlogAuthoringRequiredConsentKeys(
184
+ action: BacklogAuthoringAction,
185
+ replacesBody = false
186
+ ): Array<keyof BacklogAuthoringConsentState> {
187
+ const base: Array<keyof BacklogAuthoringConsentState> = [
188
+ 'hostExecution',
189
+ 'managedPlanningMutation',
190
+ 'automaticCommitAndPush',
191
+ 'selectedRepositoryAndBranch',
192
+ ];
193
+ switch (action) {
194
+ case 'createBacklogItem':
195
+ return [...base, 'newIdentityCreation'];
196
+ case 'updateBacklogItem':
197
+ return replacesBody ? [...base, 'fullSectionReplacement'] : base;
198
+ default:
199
+ return [...base, 'launchEligibilityChange'];
200
+ }
201
+ }
202
+
203
+ /**
204
+ * Convert collected consent into the exact shape the BPAU-01 schema requires, or
205
+ * null when the acknowledgement is incomplete. Returning null is the enforcement
206
+ * point: no request is emitted without proportionate consent, and no literal is
207
+ * added for an effect that is not happening.
208
+ */
209
+ function backlogAuthoringConsentPayload(
210
+ action: BacklogAuthoringAction,
211
+ replacesBody: boolean,
212
+ consent: BacklogAuthoringConsentState
213
+ ): BacklogAuthoringConsentPayload | null {
214
+ if (backlogAuthoringRequiredConsentKeys(action, replacesBody).some((key) => !consent[key])) {
215
+ return null;
216
+ }
217
+ const base = {
218
+ hostExecution: true,
219
+ managedPlanningMutation: true,
220
+ automaticCommitAndPush: true,
221
+ selectedRepositoryAndBranch: true,
222
+ } as const;
223
+ switch (action) {
224
+ case 'createBacklogItem':
225
+ return { ...base, newIdentityCreation: true };
226
+ case 'updateBacklogItem':
227
+ return replacesBody ? { ...base, fullSectionReplacement: true } : base;
228
+ default:
229
+ return { ...base, launchEligibilityChange: true };
230
+ }
231
+ }
232
+
233
+ function outstandingConsentLabels(
234
+ action: BacklogAuthoringAction,
235
+ replacesBody: boolean,
236
+ consent: BacklogAuthoringConsentState
237
+ ): string[] {
238
+ return backlogAuthoringRequiredConsentKeys(action, replacesBody)
239
+ .filter((key) => !consent[key])
240
+ .map((key) => BACKLOG_AUTHORING_CONSENT_LABELS[key]);
241
+ }
242
+
243
+ /** The required inline sections of a complete backlog body. */
244
+ export interface BacklogCaptureSectionSpec {
245
+ id: 'scope' | 'acceptance-criteria' | 'how-to-verify';
246
+ /** Heading Build's completeness check looks for, on its own line. */
247
+ heading: string;
248
+ label: string;
249
+ field: 'scope' | 'acceptanceCriteria' | 'howToVerify';
250
+ }
251
+
252
+ export const BACKLOG_CAPTURE_SECTIONS: readonly BacklogCaptureSectionSpec[] = [
253
+ {
254
+ id: 'scope',
255
+ heading: '## Scope / Surfaces Affected',
256
+ label: 'Scope / surfaces affected',
257
+ field: 'scope',
258
+ },
259
+ {
260
+ id: 'acceptance-criteria',
261
+ heading: '## Acceptance Criteria',
262
+ label: 'Acceptance criteria',
263
+ field: 'acceptanceCriteria',
264
+ },
265
+ {
266
+ id: 'how-to-verify',
267
+ heading: '## How to Verify',
268
+ label: 'How to verify',
269
+ field: 'howToVerify',
270
+ },
271
+ ];
272
+
273
+ /** Capture form state exactly as the operator left it. */
274
+ export interface BacklogCaptureDraft {
275
+ title: string;
276
+ summary: string;
277
+ scope: string;
278
+ acceptanceCriteria: string;
279
+ howToVerify: string;
280
+ priority?: BacklogPriority;
281
+ declaredType?: string;
282
+ tags?: readonly string[];
283
+ complexity?: number;
284
+ domain?: string;
285
+ expectedRuntimeMinutes?: number;
286
+ }
287
+
288
+ export const EMPTY_BACKLOG_CAPTURE_DRAFT: Readonly<BacklogCaptureDraft> = {
289
+ title: '',
290
+ summary: '',
291
+ scope: '',
292
+ acceptanceCriteria: '',
293
+ howToVerify: '',
294
+ };
295
+
296
+ /**
297
+ * Compose the complete inline markdown body from the collected sections. Every
298
+ * required heading is emitted on its own line so Build's own completeness check
299
+ * reads the body BB submitted; BB never scores completeness itself.
300
+ */
301
+ export function composeBacklogCaptureBody(draft: BacklogCaptureDraft): string {
302
+ const blocks: string[] = [];
303
+ const summary = draft.summary.trim();
304
+ if (summary.length > 0) blocks.push(summary);
305
+ for (const section of BACKLOG_CAPTURE_SECTIONS) {
306
+ blocks.push(`${section.heading}\n\n${draft[section.field].trim()}`);
307
+ }
308
+ return blocks.join('\n\n');
309
+ }
310
+
311
+ function numberProblems(
312
+ complexity: number | undefined,
313
+ expectedRuntimeMinutes: number | undefined
314
+ ): string[] {
315
+ const problems: string[] = [];
316
+ if (
317
+ complexity !== undefined &&
318
+ (!Number.isFinite(complexity) || complexity < 0 || complexity > 1)
319
+ ) {
320
+ problems.push('Complexity must be a number between 0 and 1.');
321
+ }
322
+ if (
323
+ expectedRuntimeMinutes !== undefined &&
324
+ (!Number.isInteger(expectedRuntimeMinutes) || expectedRuntimeMinutes <= 0)
325
+ ) {
326
+ problems.push('Expected runtime must be a whole number of minutes above zero.');
327
+ }
328
+ return problems;
329
+ }
330
+
331
+ /**
332
+ * What the operator must still supply or correct before capture can be
333
+ * submitted. This is input validation only: it never scores completeness, which
334
+ * is Build's own result reported after creation.
335
+ */
336
+ export function backlogCaptureMissingFields(draft: BacklogCaptureDraft): string[] {
337
+ const missing: string[] = [];
338
+ const title = draft.title.trim();
339
+ if (title.length === 0) missing.push('Title');
340
+ else if (title === '-' || title.startsWith('-')) {
341
+ missing.push('Title must not begin with a dash.');
342
+ }
343
+ for (const section of BACKLOG_CAPTURE_SECTIONS) {
344
+ if (draft[section.field].trim().length === 0) missing.push(section.label);
345
+ }
346
+ missing.push(...numberProblems(draft.complexity, draft.expectedRuntimeMinutes));
347
+ return missing;
348
+ }
349
+
350
+ /** Whitelisted update fields. Body replacement has its own prepopulated form. */
351
+ export interface BacklogFieldUpdateDraft {
352
+ title?: string;
353
+ complexity?: number;
354
+ expectedRuntimeMinutes?: number;
355
+ domain?: string;
356
+ rationale?: string;
357
+ addTags?: readonly string[];
358
+ removeTags?: readonly string[];
359
+ }
360
+
361
+ /**
362
+ * Why a form cannot emit a request yet. `duplicate-submission` and
363
+ * `invalid-request` mirror BPAU-01 refusal reasons so the operator sees the same
364
+ * distinction before and after launch.
365
+ */
366
+ export type BacklogAuthoringSubmissionBlock =
367
+ | 'target-not-ready'
368
+ | 'incomplete-input'
369
+ | 'acknowledgement-incomplete'
370
+ | 'prepopulation-unavailable'
371
+ | 'duplicate-submission'
372
+ | 'invalid-request';
373
+
374
+ /** Proportionate confirmation shown before one mutation is submitted. */
375
+ export interface BacklogAuthoringConfirmation {
376
+ /** Repository path and branch always appear in a mutation confirmation. */
377
+ repositoryPath: string;
378
+ branch: string;
379
+ /** What the command is asked to do, never a predicted result. */
380
+ effect: string;
381
+ /** Only the acknowledgements this effect actually requires. */
382
+ acknowledgements: readonly string[];
383
+ /** Required acknowledgements the operator has not given yet. */
384
+ outstanding: readonly string[];
385
+ disclosures: readonly string[];
386
+ }
387
+
388
+ export interface BacklogAuthoringFormView {
389
+ viewVersion: typeof BACKLOG_AUTHORING_VIEW_VERSION;
390
+ action: BacklogAuthoringAction;
391
+ state: 'blocked' | 'incomplete' | 'ready';
392
+ headline: string;
393
+ /** Plain `label: value` rows describing what will be sent. */
394
+ fields: readonly BacklogAuthoringRow[];
395
+ /** What the operator must still supply or correct. */
396
+ missing: readonly string[];
397
+ confirmation: BacklogAuthoringConfirmation | null;
398
+ notes: readonly string[];
399
+ /** Why this form cannot submit; null when it is ready. */
400
+ blockReason: BacklogAuthoringSubmissionBlock | null;
401
+ /** The typed BPAU-01 request this form would submit; null until ready. */
402
+ request: BacklogAuthoringRequest | null;
403
+ }
404
+
405
+ function blockedForm(
406
+ action: BacklogAuthoringAction,
407
+ blockReason: BacklogAuthoringSubmissionBlock,
408
+ headline: string,
409
+ notes: readonly string[]
410
+ ): BacklogAuthoringFormView {
411
+ return {
412
+ viewVersion: BACKLOG_AUTHORING_VIEW_VERSION,
413
+ action,
414
+ state: 'blocked',
415
+ headline,
416
+ fields: [],
417
+ missing: [],
418
+ confirmation: null,
419
+ notes,
420
+ blockReason,
421
+ request: null,
422
+ };
423
+ }
424
+
425
+ interface FormBuild {
426
+ action: BacklogAuthoringAction;
427
+ target: BacklogAuthoringTarget;
428
+ consent: BacklogAuthoringConsentState;
429
+ replacesBody: boolean;
430
+ fields: readonly BacklogAuthoringRow[];
431
+ missing: readonly string[];
432
+ disclosures: readonly string[];
433
+ notes: readonly string[];
434
+ /** Request body without consent; consent is attached only when complete. */
435
+ requestWithoutConsent: (branch: string) => BacklogRequestDraft;
436
+ }
437
+
438
+ /**
439
+ * Assemble one form view. The request is emitted only when the input is usable,
440
+ * the acknowledgements are proportionate and complete, and the resulting payload
441
+ * still validates against the BPAU-01 request schema, so an invalid request is
442
+ * never handed to the service.
443
+ */
444
+ function buildForm(build: FormBuild): BacklogAuthoringFormView {
445
+ const branch = build.target.branch;
446
+ if (branch === null || branch.trim().length === 0 || build.target.repositoryPath.length === 0) {
447
+ return blockedForm(build.action, 'target-not-ready', 'Backlog authoring unavailable', [
448
+ 'Build reports no selected repository on a named branch, so no backlog mutation can be confirmed.',
449
+ ]);
450
+ }
451
+
452
+ const outstanding = outstandingConsentLabels(build.action, build.replacesBody, build.consent);
453
+ const confirmation: BacklogAuthoringConfirmation = {
454
+ repositoryPath: build.target.repositoryPath,
455
+ branch,
456
+ effect: BACKLOG_AUTHORING_EFFECTS[build.action],
457
+ acknowledgements: backlogAuthoringRequiredConsentKeys(build.action, build.replacesBody).map(
458
+ (key) => BACKLOG_AUTHORING_CONSENT_LABELS[key]
459
+ ),
460
+ outstanding,
461
+ disclosures: build.disclosures,
462
+ };
463
+
464
+ const consentPayload = backlogAuthoringConsentPayload(
465
+ build.action,
466
+ build.replacesBody,
467
+ build.consent
468
+ );
469
+ let request: BacklogAuthoringRequest | null = null;
470
+ let blockReason: BacklogAuthoringSubmissionBlock | null = null;
471
+ if (build.missing.length > 0) blockReason = 'incomplete-input';
472
+ else if (consentPayload === null) blockReason = 'acknowledgement-incomplete';
473
+ else {
474
+ const parsed = backlogAuthoringRequestSchema.safeParse({
475
+ ...build.requestWithoutConsent(branch),
476
+ consent: consentPayload,
477
+ });
478
+ if (parsed.success) request = parsed.data;
479
+ else blockReason = 'invalid-request';
480
+ }
481
+
482
+ return {
483
+ viewVersion: BACKLOG_AUTHORING_VIEW_VERSION,
484
+ action: build.action,
485
+ state: request === null ? 'incomplete' : 'ready',
486
+ headline: BACKLOG_AUTHORING_LABELS[build.action],
487
+ fields: build.fields,
488
+ missing: build.missing,
489
+ confirmation,
490
+ notes: build.notes,
491
+ blockReason,
492
+ request,
493
+ };
494
+ }
495
+
496
+ /** Build the capture form for a new backlog item. */
497
+ export function buildBacklogCaptureForm(
498
+ target: BacklogAuthoringTarget,
499
+ draft: BacklogCaptureDraft,
500
+ consent: BacklogAuthoringConsentState
501
+ ): BacklogAuthoringFormView {
502
+ const body = composeBacklogCaptureBody(draft);
503
+ const tags = normalizeTags(draft.tags);
504
+ const fields: BacklogAuthoringRow[] = [
505
+ row('title', 'Title', draft.title.trim().length === 0 ? UNAVAILABLE : draft.title.trim()),
506
+ row('priority', 'Priority', draft.priority ?? UNAVAILABLE),
507
+ row('declared-type', 'Type', draft.declaredType?.trim() || UNAVAILABLE),
508
+ row('tags', 'Tags', tags.length === 0 ? 'none' : tags.join(', ')),
509
+ row(
510
+ 'complexity',
511
+ 'Complexity',
512
+ draft.complexity === undefined ? UNAVAILABLE : String(draft.complexity)
513
+ ),
514
+ row('domain', 'Domain', draft.domain?.trim() || UNAVAILABLE),
515
+ row(
516
+ 'expected-runtime',
517
+ 'Expected runtime (minutes)',
518
+ draft.expectedRuntimeMinutes === undefined
519
+ ? UNAVAILABLE
520
+ : String(draft.expectedRuntimeMinutes)
521
+ ),
522
+ ];
523
+ for (const section of BACKLOG_CAPTURE_SECTIONS) {
524
+ const content = draft[section.field].trim();
525
+ fields.push(
526
+ row(`section-${section.id}`, section.label, content.length === 0 ? 'empty' : content)
527
+ );
528
+ }
529
+
530
+ return buildForm({
531
+ action: 'createBacklogItem',
532
+ target,
533
+ consent,
534
+ replacesBody: false,
535
+ fields,
536
+ missing: backlogCaptureMissingFields(draft),
537
+ disclosures: [BACKLOG_CAPTURE_COMPLETENESS_NOTICE],
538
+ notes: [BACKLOG_CAPTURE_COMPLETENESS_NOTICE],
539
+ requestWithoutConsent: (branch) => ({
540
+ projectId: target.projectId,
541
+ sourceId: target.sourceId,
542
+ action: 'createBacklogItem',
543
+ input: {
544
+ title: draft.title.trim(),
545
+ body,
546
+ ...(draft.priority === undefined ? {} : { priority: draft.priority }),
547
+ ...(draft.declaredType?.trim() ? { declaredType: draft.declaredType.trim() } : {}),
548
+ ...(tags.length === 0 ? {} : { tags }),
549
+ ...(draft.complexity === undefined ? {} : { complexity: draft.complexity }),
550
+ ...(draft.domain?.trim() ? { domain: draft.domain.trim() } : {}),
551
+ ...(draft.expectedRuntimeMinutes === undefined
552
+ ? {}
553
+ : { expectedRuntimeMinutes: draft.expectedRuntimeMinutes }),
554
+ },
555
+ expected: { repository: target.repositoryPath, branch },
556
+ }),
557
+ });
558
+ }
559
+
560
+ /**
561
+ * The body editor, prepopulated from Build's canonical detail.
562
+ *
563
+ * BB refuses a replacement it could not prepopulate: submitting an
564
+ * unprepopulated editor would silently discard whatever Build currently holds.
565
+ */
566
+ export type BacklogBodyEditor =
567
+ | { state: 'prepopulated'; backlogItemId: string; canonicalBody: string; body: string }
568
+ | { state: 'unavailable'; backlogItemId: string; reason: string };
569
+
570
+ export function buildBacklogBodyEditor(
571
+ backlogItemId: string,
572
+ detail: BacklogEvidence<BacklogDetailEvidence>
573
+ ): BacklogBodyEditor {
574
+ if (detail.state === 'unavailable') {
575
+ return {
576
+ state: 'unavailable',
577
+ backlogItemId,
578
+ reason: `Build did not publish the canonical body for backlog item ${backlogItemId} (${detail.reason}), so BB will not replace it.`,
579
+ };
580
+ }
581
+ if (detail.value.id !== backlogItemId) {
582
+ return {
583
+ state: 'unavailable',
584
+ backlogItemId,
585
+ reason: `Build published a body for ${detail.value.id} while BB asked for ${backlogItemId}, so BB will not replace it.`,
586
+ };
587
+ }
588
+ return {
589
+ state: 'prepopulated',
590
+ backlogItemId,
591
+ canonicalBody: detail.value.body,
592
+ body: detail.value.body,
593
+ };
594
+ }
595
+
596
+ /**
597
+ * Build the whole-body replacement form. `replacementBody` is the edited text;
598
+ * the canonical body the editor was prepopulated from is carried through as
599
+ * `expected.canonicalBody` so BPAU-01 can refuse a stale replacement.
600
+ */
601
+ export function buildBacklogBodyReplacementForm(
602
+ target: BacklogAuthoringTarget,
603
+ editor: BacklogBodyEditor,
604
+ replacementBody: string,
605
+ consent: BacklogAuthoringConsentState
606
+ ): BacklogAuthoringFormView {
607
+ if (editor.state === 'unavailable') {
608
+ return blockedForm(
609
+ 'updateBacklogItem',
610
+ 'prepopulation-unavailable',
611
+ 'Body replacement unavailable',
612
+ [editor.reason]
613
+ );
614
+ }
615
+ const missing = replacementBody.trim().length === 0 ? ['Body'] : [];
616
+ return buildForm({
617
+ action: 'updateBacklogItem',
618
+ target,
619
+ consent,
620
+ replacesBody: true,
621
+ fields: [
622
+ row('backlog-item', 'Backlog item', editor.backlogItemId),
623
+ row('body-length', 'Replacement length (characters)', String(replacementBody.length)),
624
+ row(
625
+ 'body-changed',
626
+ 'Differs from canonical body',
627
+ replacementBody === editor.canonicalBody ? 'no' : 'yes'
628
+ ),
629
+ ],
630
+ missing,
631
+ disclosures: [BACKLOG_FULL_BODY_REPLACEMENT_NOTICE],
632
+ notes: [BACKLOG_FULL_BODY_REPLACEMENT_NOTICE],
633
+ requestWithoutConsent: (branch) => ({
634
+ projectId: target.projectId,
635
+ sourceId: target.sourceId,
636
+ action: 'updateBacklogItem',
637
+ input: { backlogItemId: editor.backlogItemId, body: replacementBody },
638
+ expected: {
639
+ repository: target.repositoryPath,
640
+ branch,
641
+ canonicalBody: editor.canonicalBody,
642
+ },
643
+ }),
644
+ });
645
+ }
646
+
647
+ /** Build the whitelisted field-update form. No body, so no replacement consent. */
648
+ export function buildBacklogFieldUpdateForm(
649
+ target: BacklogAuthoringTarget,
650
+ backlogItemId: string,
651
+ draft: BacklogFieldUpdateDraft,
652
+ consent: BacklogAuthoringConsentState
653
+ ): BacklogAuthoringFormView {
654
+ const title = draft.title?.trim();
655
+ const domain = draft.domain?.trim();
656
+ const rationale = draft.rationale?.trim();
657
+ const addTags = normalizeTags(draft.addTags);
658
+ const removeTags = normalizeTags(draft.removeTags);
659
+ const input = {
660
+ backlogItemId,
661
+ ...(title ? { title } : {}),
662
+ ...(draft.complexity === undefined ? {} : { complexity: draft.complexity }),
663
+ ...(draft.expectedRuntimeMinutes === undefined
664
+ ? {}
665
+ : { expectedRuntimeMinutes: draft.expectedRuntimeMinutes }),
666
+ ...(domain ? { domain } : {}),
667
+ ...(rationale ? { rationale } : {}),
668
+ ...(addTags.length === 0 ? {} : { addTags }),
669
+ ...(removeTags.length === 0 ? {} : { removeTags }),
670
+ };
671
+ const missing =
672
+ Object.keys(input).length === 1 ? ['At least one field to change'] : ([] as string[]);
673
+ missing.push(...numberProblems(draft.complexity, draft.expectedRuntimeMinutes));
674
+
675
+ return buildForm({
676
+ action: 'updateBacklogItem',
677
+ target,
678
+ consent,
679
+ replacesBody: false,
680
+ fields: [
681
+ row('backlog-item', 'Backlog item', backlogItemId),
682
+ row('title', 'Title', title || 'unchanged'),
683
+ row(
684
+ 'complexity',
685
+ 'Complexity',
686
+ draft.complexity === undefined ? 'unchanged' : String(draft.complexity)
687
+ ),
688
+ row(
689
+ 'expected-runtime',
690
+ 'Expected runtime (minutes)',
691
+ draft.expectedRuntimeMinutes === undefined
692
+ ? 'unchanged'
693
+ : String(draft.expectedRuntimeMinutes)
694
+ ),
695
+ row('domain', 'Domain', domain || 'unchanged'),
696
+ row('rationale', 'Rationale', rationale || 'unchanged'),
697
+ row('add-tags', 'Tags added', addTags.length === 0 ? 'none' : addTags.join(', ')),
698
+ row('remove-tags', 'Tags removed', removeTags.length === 0 ? 'none' : removeTags.join(', ')),
699
+ ],
700
+ missing,
701
+ disclosures: [
702
+ 'This edit changes only the fields listed above. The item body is left as Build has it.',
703
+ ],
704
+ notes: [],
705
+ requestWithoutConsent: (branch) => ({
706
+ projectId: target.projectId,
707
+ sourceId: target.sourceId,
708
+ action: 'updateBacklogItem',
709
+ input,
710
+ expected: { repository: target.repositoryPath, branch },
711
+ }),
712
+ });
713
+ }
714
+
715
+ /** Build the review confirmation, disclosing the launch-eligibility change. */
716
+ export function buildBacklogReviewForm(
717
+ target: BacklogAuthoringTarget,
718
+ backlogItemId: string,
719
+ consent: BacklogAuthoringConsentState
720
+ ): BacklogAuthoringFormView {
721
+ return buildForm({
722
+ action: 'reviewBacklogItem',
723
+ target,
724
+ consent,
725
+ replacesBody: false,
726
+ fields: [row('backlog-item', 'Backlog item', backlogItemId)],
727
+ missing: backlogItemId.trim().length === 0 ? ['Backlog item'] : [],
728
+ disclosures: [BACKLOG_REVIEW_LAUNCH_ELIGIBILITY_NOTICE],
729
+ notes: [BACKLOG_REVIEW_LAUNCH_ELIGIBILITY_NOTICE],
730
+ requestWithoutConsent: (branch) => ({
731
+ projectId: target.projectId,
732
+ sourceId: target.sourceId,
733
+ action: 'reviewBacklogItem',
734
+ input: { backlogItemId },
735
+ expected: { repository: target.repositoryPath, branch },
736
+ }),
737
+ });
738
+ }
739
+
740
+ /**
741
+ * Build the prioritize confirmation. It discloses that an inbox item may become
742
+ * reviewed and launch-eligible, without predicting the resulting status.
743
+ */
744
+ export function buildBacklogPrioritizeForm(
745
+ target: BacklogAuthoringTarget,
746
+ backlogItemId: string,
747
+ priority: BacklogPriority,
748
+ consent: BacklogAuthoringConsentState,
749
+ currentStatus: string | null = null
750
+ ): BacklogAuthoringFormView {
751
+ return buildForm({
752
+ action: 'prioritizeBacklogItem',
753
+ target,
754
+ consent,
755
+ replacesBody: false,
756
+ fields: [
757
+ row('backlog-item', 'Backlog item', backlogItemId),
758
+ row('current-status', 'Current status', currentStatus?.trim() || UNAVAILABLE),
759
+ row('priority', 'Requested priority', priority),
760
+ ],
761
+ missing: backlogItemId.trim().length === 0 ? ['Backlog item'] : [],
762
+ disclosures: [BACKLOG_PRIORITIZE_LAUNCH_ELIGIBILITY_NOTICE],
763
+ notes: [BACKLOG_PRIORITIZE_LAUNCH_ELIGIBILITY_NOTICE],
764
+ requestWithoutConsent: (branch) => ({
765
+ projectId: target.projectId,
766
+ sourceId: target.sourceId,
767
+ action: 'prioritizeBacklogItem',
768
+ input: { backlogItemId, priority },
769
+ expected: { repository: target.repositoryPath, branch },
770
+ }),
771
+ });
772
+ }
773
+
774
+ export type BacklogAuthoringSubmission =
775
+ | { state: 'submitted'; request: BacklogAuthoringRequest }
776
+ | { state: 'blocked'; reason: BacklogAuthoringSubmissionBlock; problems: readonly string[] };
777
+
778
+ /**
779
+ * Emit exactly one typed BPAU-01 request from a confirmed form.
780
+ *
781
+ * A submission already in flight is refused as a duplicate before anything else
782
+ * is considered, so a second confirmation never produces a second request. There
783
+ * is no retry here: a blocked submission reports why and stops.
784
+ */
785
+ export function submitBacklogAuthoringForm(
786
+ form: BacklogAuthoringFormView,
787
+ options: { pending: boolean }
788
+ ): BacklogAuthoringSubmission {
789
+ if (options.pending) {
790
+ return {
791
+ state: 'blocked',
792
+ reason: 'duplicate-submission',
793
+ problems: [
794
+ 'A backlog authoring submission is already in progress. BB waits for Build rather than sending it twice.',
795
+ ],
796
+ };
797
+ }
798
+ if (form.request !== null) return { state: 'submitted', request: form.request };
799
+ const reason: BacklogAuthoringSubmissionBlock = form.blockReason ?? 'incomplete-input';
800
+ const problems =
801
+ reason === 'acknowledgement-incomplete'
802
+ ? (form.confirmation?.outstanding ?? [])
803
+ : form.missing.length > 0
804
+ ? form.missing
805
+ : form.notes;
806
+ return { state: 'blocked', reason, problems };
807
+ }
808
+
809
+ /** Build's own completeness result for a created item, carried through as-is. */
810
+ export interface BacklogCompletenessView {
811
+ complete: boolean;
812
+ missing: readonly string[];
813
+ /** Build's refine follow-up; null when Build published none. */
814
+ refineCommand: string | null;
815
+ }
816
+
817
+ /**
818
+ * Outcome states. They stay distinct so refusal before launch, a refused command,
819
+ * a partial effect, and an unknown result after a timeout never read alike.
820
+ */
821
+ export type BacklogAuthoringOutcomeState =
822
+ | 'refused'
823
+ | 'applied'
824
+ | 'applied-incomplete'
825
+ | 'refused-before-effect'
826
+ | 'partial-effect'
827
+ | 'unknown-after-timeout';
828
+
829
+ export interface BacklogAuthoringOutcomeView {
830
+ viewVersion: typeof BACKLOG_AUTHORING_VIEW_VERSION;
831
+ state: BacklogAuthoringOutcomeState;
832
+ /** One bounded plain-language summary line. */
833
+ headline: string;
834
+ /**
835
+ * `fresh` only when Build's authoritative reread is available. Until then no
836
+ * changed fact is displayed, and nothing BB submitted is echoed as a result.
837
+ */
838
+ facts: 'fresh' | 'awaiting-reread';
839
+ rows: readonly BacklogAuthoringRow[];
840
+ /** Build's completeness result for a creation; null for other actions. */
841
+ completeness: BacklogCompletenessView | null;
842
+ syncWarnings: readonly string[];
843
+ /** Build's own command diagnostics, kept separate from sync evidence. */
844
+ diagnostics: string | null;
845
+ notes: readonly string[];
846
+ degraded: boolean;
847
+ }
848
+
849
+ const REFUSAL_HEADLINES: Readonly<
850
+ Record<Extract<BacklogAuthoringResult, { state: 'refused' }>['reason'], string>
851
+ > = {
852
+ 'invalid-request': 'Refused before launch: the request was invalid',
853
+ 'repository-mismatch': 'Refused before launch: the request named another repository',
854
+ 'repository-not-ready': 'Refused before launch: the repository is not ready',
855
+ 'stale-repository': 'Refused before launch: the repository or branch changed',
856
+ 'missing-identity': 'Refused before launch: Build could not confirm the backlog item',
857
+ 'canonical-prepopulation-mismatch':
858
+ 'Refused before launch: the canonical body changed after prepopulation',
859
+ 'duplicate-submission': 'Refused before launch: a submission is already in progress',
860
+ };
861
+
862
+ function outcomeState(outcome: BacklogAuthoringOutcome): BacklogAuthoringOutcomeState {
863
+ switch (outcome.effect.phase) {
864
+ case 'applied':
865
+ return 'applied';
866
+ case 'applied-incomplete':
867
+ return 'applied-incomplete';
868
+ case 'refused-before-launch':
869
+ case 'refused-before-effect':
870
+ return 'refused-before-effect';
871
+ case 'failed-after-partial-effect':
872
+ return 'partial-effect';
873
+ case 'unknown-after-timeout':
874
+ return 'unknown-after-timeout';
875
+ }
876
+ }
877
+
878
+ function outcomeHeadline(
879
+ outcome: BacklogAuthoringOutcome,
880
+ state: BacklogAuthoringOutcomeState
881
+ ): string {
882
+ const label = BACKLOG_AUTHORING_LABELS[outcome.action];
883
+ switch (state) {
884
+ case 'applied':
885
+ return `${label}: Build applied the change`;
886
+ case 'applied-incomplete':
887
+ return `${label}: Build created the item and reported it incomplete`;
888
+ case 'refused-before-effect':
889
+ return `${label}: Build refused the command; nothing was changed`;
890
+ case 'partial-effect':
891
+ return `${label}: Build failed after a partial effect`;
892
+ default:
893
+ return `${label}: the command timed out, so its effect is unknown`;
894
+ }
895
+ }
896
+
897
+ function changedFactRows(detail: BacklogEvidence<BacklogDetailEvidence>): BacklogAuthoringRow[] {
898
+ if (detail.state === 'unavailable') return [];
899
+ const value = detail.value;
900
+ return [
901
+ row('reread-id', 'Backlog id (reread)', value.id),
902
+ row('reread-title', 'Title (reread)', value.title),
903
+ row('reread-status', 'Status (reread)', value.status),
904
+ row('reread-priority', 'Priority (reread)', value.priority ?? UNAVAILABLE),
905
+ row(
906
+ 'reread-complexity',
907
+ 'Complexity (reread)',
908
+ value.complexity === null ? UNAVAILABLE : String(value.complexity)
909
+ ),
910
+ row('reread-path', 'File (reread)', value.filePath),
911
+ ];
912
+ }
913
+
914
+ function formatList(values: readonly string[]): string {
915
+ return values.length === 0 ? 'none' : values.join(', ');
916
+ }
917
+
918
+ /**
919
+ * Render one BPAU-01 result. Pure and deterministic: every field comes from the
920
+ * result itself, and no state, identity, or sync fact is re-derived here.
921
+ */
922
+ export function buildBacklogAuthoringOutcomeView(
923
+ result: BacklogAuthoringResult
924
+ ): BacklogAuthoringOutcomeView {
925
+ if ('state' in result) {
926
+ return {
927
+ viewVersion: BACKLOG_AUTHORING_VIEW_VERSION,
928
+ state: 'refused',
929
+ headline: truncateLine(REFUSAL_HEADLINES[result.reason]),
930
+ facts: 'awaiting-reread',
931
+ rows: [row('refusal-reason', 'Refusal reason', result.reason)],
932
+ completeness: null,
933
+ syncWarnings: [],
934
+ diagnostics: null,
935
+ notes: [result.message, 'No command was launched, so nothing was changed.'],
936
+ degraded: false,
937
+ };
938
+ }
939
+
940
+ const state = outcomeState(result);
941
+ const detail = result.canonicalRereads.detail;
942
+ const facts = detail.state === 'available' ? 'fresh' : 'awaiting-reread';
943
+ const rows: BacklogAuthoringRow[] = [
944
+ row('repository', 'Repository', result.repository.path),
945
+ row('branch', 'Branch', result.repository.branch ?? UNAVAILABLE),
946
+ row('action', 'Action', BACKLOG_AUTHORING_LABELS[result.action]),
947
+ row(
948
+ 'requested-item',
949
+ 'Requested backlog item',
950
+ result.requestedIdentities.backlogItemId ?? 'new item'
951
+ ),
952
+ row('created-items', 'Created', formatList(result.effect.createdIdentities)),
953
+ row('affected-items', 'Affected', formatList(result.effect.affectedIdentities)),
954
+ row('command-state', 'Command', result.command.state),
955
+ row(
956
+ 'command-exit',
957
+ 'Exit code',
958
+ result.command.exitCode === null ? UNAVAILABLE : String(result.command.exitCode)
959
+ ),
960
+ row('sync-state', 'Planning sync', result.sync.state),
961
+ row('sync-detail', 'Sync detail', result.sync.detail ?? UNAVAILABLE),
962
+ ...changedFactRows(detail),
963
+ ];
964
+
965
+ const identity = result.identityOutcome;
966
+ const completeness: BacklogCompletenessView | null =
967
+ identity === null
968
+ ? null
969
+ : {
970
+ complete: identity.complete,
971
+ missing: identity.missing,
972
+ refineCommand: identity.refineCommand,
973
+ };
974
+
975
+ const notes: string[] = [];
976
+ if (detail.state === 'unavailable') {
977
+ notes.push(
978
+ `Build's authoritative reread is unavailable (${detail.reason}), so no changed backlog fact is shown here.`
979
+ );
980
+ }
981
+ if (state === 'unknown-after-timeout') {
982
+ notes.push(
983
+ 'The command timed out and was not retried. Build may or may not have applied it; reread before acting.'
984
+ );
985
+ }
986
+ if (state === 'partial-effect') {
987
+ notes.push(
988
+ 'Build reports a partial effect: part of this change may exist. Inspect the item in Build before resubmitting.'
989
+ );
990
+ }
991
+ if (completeness !== null && !completeness.complete) {
992
+ notes.push(
993
+ completeness.refineCommand === null
994
+ ? `Build reports the item incomplete (missing: ${formatList(completeness.missing)}) and published no refine command.`
995
+ : `Build reports the item incomplete (missing: ${formatList(completeness.missing)}). Finish it with: ${completeness.refineCommand}`
996
+ );
997
+ }
998
+ if (result.fullBodyReplacement) {
999
+ notes.push('This update replaced the entire body of the backlog item.');
1000
+ }
1001
+ if (result.prioritizeMayReviewAndBecomeLaunchEligible) {
1002
+ notes.push(BACKLOG_PRIORITIZE_LAUNCH_ELIGIBILITY_NOTICE);
1003
+ }
1004
+ notes.push(...result.integrityNotes);
1005
+ notes.push(
1006
+ 'A zero exit code is not remote sync confirmation; the planning sync state above comes from Build.'
1007
+ );
1008
+
1009
+ return {
1010
+ viewVersion: BACKLOG_AUTHORING_VIEW_VERSION,
1011
+ state,
1012
+ headline: truncateLine(outcomeHeadline(result, state)),
1013
+ facts,
1014
+ rows,
1015
+ completeness,
1016
+ syncWarnings: result.syncWarnings,
1017
+ diagnostics: result.command.diagnostics,
1018
+ notes,
1019
+ degraded:
1020
+ facts === 'awaiting-reread' ||
1021
+ state !== 'applied' ||
1022
+ result.syncWarnings.length > 0 ||
1023
+ result.integrityNotes.length > 0,
1024
+ };
1025
+ }