@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.
- package/.build-project/providers/catalog.json +13951 -0
- package/.build-project/providers/pricing.json +1978 -0
- package/.build-project/providers/registry.json +4103 -0
- package/.github/SECURITY.md +75 -0
- package/.nvmrc +1 -0
- package/CHANGELOG.md +661 -0
- package/CODE_OF_CONDUCT.md +44 -0
- package/CONTRIBUTING.md +24 -0
- package/INSTALL.md +623 -0
- package/LICENSE +21 -0
- package/README.md +118 -2
- package/THIRD_PARTY_NOTICES.txt +26 -0
- package/dist/ai-judge-UE5UOYOO.js +191 -0
- package/dist/allowlist-grounding-KPLN6NC5.js +16 -0
- package/dist/allowlist-utils-MZZKKXRD.js +31 -0
- package/dist/apply-completion-mode-EM37UZHB.js +110 -0
- package/dist/artifact-migrator-WPACNSEP.js +276 -0
- package/dist/ask-2OZ4JFQR.js +176 -0
- package/dist/auth-6UKBTJUQ.js +185 -0
- package/dist/auth-H5KJL6HL.js +165 -0
- package/dist/auth-LVJRJDMU.js +12 -0
- package/dist/auth-NHZOCNRR.js +94 -0
- package/dist/auth-PBXHWXGW.js +95 -0
- package/dist/auth-T7Y5DCAH.js +91 -0
- package/dist/auth-TVVKCHQW.js +13 -0
- package/dist/auth-UHB2UCSS.js +97 -0
- package/dist/auth-VACA3VUL.js +98 -0
- package/dist/auth-VVLC77S3.js +44 -0
- package/dist/auth-liveness-XO4AGDDD.js +53 -0
- package/dist/autoloop-cleanup-SI3VGAAR.js +106 -0
- package/dist/autoloop-evidence-gates-J5GG5YQB.js +39 -0
- package/dist/autoloop-gate-policy-SUNAEP6Q.js +169 -0
- package/dist/autoloop-helpers-VQGQNTT6.js +52 -0
- package/dist/autoloop-ledger-P6TIDP7C.js +96 -0
- package/dist/autoloop-ledger-subscriber-HFAGOZXH.js +161 -0
- package/dist/autoloop-run-defaults-GWGZBNT7.js +27 -0
- package/dist/autoloop-run-lock-GBWRM5A2.js +197 -0
- package/dist/autoloop-success-C32QVWOP.js +93 -0
- package/dist/autoloop-termination-summary-GI6IBQWD.js +58 -0
- package/dist/autoloop-trajectory-AMKSQISD.js +70 -0
- package/dist/autoloop-wall-clock-T7ZVIQOC.js +12 -0
- package/dist/automatic-branch-cleanup-R62X2C5O.js +49 -0
- package/dist/autonomous-loop-controller-2WL363LW.js +4386 -0
- package/dist/backend-YUTFDZXZ.js +30 -0
- package/dist/background-executor-Z3ODTMD7.js +260 -0
- package/dist/backlog-75QPEAMW.js +403 -0
- package/dist/backlog-execution-intent-GWUV5TUK.js +19 -0
- package/dist/backup-active-store-XHWLN34M.js +16 -0
- package/dist/backup-machine-stores-UI4LTJOY.js +251 -0
- package/dist/backup-telemetry-db-Z4ICYCNW.js +26 -0
- package/dist/branch-archive-manager-FMSQ7YJF.js +18 -0
- package/dist/branch-cleanup-manager-ST6FJGND.js +35 -0
- package/dist/build-gate-7NKWPY62.js +68 -0
- package/dist/build-root-S7DINODY.js +18 -0
- package/dist/change-summary-R6CB6VXJ.js +50 -0
- package/dist/chunk-24MNKKOM.js +173 -0
- package/dist/chunk-2H6VZFIO.js +235 -0
- package/dist/chunk-2JIX3EKV.js +39 -0
- package/dist/chunk-2KO7HVZM.js +106 -0
- package/dist/chunk-2L36U25O.js +100 -0
- package/dist/chunk-2NMNFUQA.js +475 -0
- package/dist/chunk-2OUAEH67.js +83 -0
- package/dist/chunk-2VLJUXJU.js +115 -0
- package/dist/chunk-2VUEDIUM.js +77 -0
- package/dist/chunk-2Y2IIHPI.js +430 -0
- package/dist/chunk-2YRG3LHZ.js +220 -0
- package/dist/chunk-2Z5Q3SUY.js +65 -0
- package/dist/chunk-32IYXIE5.js +873 -0
- package/dist/chunk-33IGPPUI.js +292 -0
- package/dist/chunk-352PCJLK.js +283 -0
- package/dist/chunk-35J4NE6S.js +226 -0
- package/dist/chunk-3C7WBIVK.js +1016 -0
- package/dist/chunk-3H3EY6U7.js +1225 -0
- package/dist/chunk-3H4MWYIC.js +198 -0
- package/dist/chunk-3HHWQR3N.js +2479 -0
- package/dist/chunk-3JKNRYEE.js +14 -0
- package/dist/chunk-3LECCYZY.js +128 -0
- package/dist/chunk-3LOY6YZI.js +852 -0
- package/dist/chunk-3M57DADF.js +44 -0
- package/dist/chunk-3NOTLVLG.js +3803 -0
- package/dist/chunk-3OPP2OZB.js +1480 -0
- package/dist/chunk-3P5IN5E7.js +9 -0
- package/dist/chunk-3PL22IYZ.js +20 -0
- package/dist/chunk-3REDAJUJ.js +14 -0
- package/dist/chunk-3S2R4XJI.js +203 -0
- package/dist/chunk-3UBZI5DW.js +61 -0
- package/dist/chunk-3VV5OBGG.js +308 -0
- package/dist/chunk-3WY5TU2O.js +823 -0
- package/dist/chunk-43OKHTW4.js +82 -0
- package/dist/chunk-45KUJBDI.js +112 -0
- package/dist/chunk-47X5LM7B.js +224 -0
- package/dist/chunk-4B6FQJ77.js +268 -0
- package/dist/chunk-4BTDUT2S.js +42 -0
- package/dist/chunk-4DJL2VXA.js +24 -0
- package/dist/chunk-4EBSXZ73.js +48 -0
- package/dist/chunk-4QKP6I4C.js +294 -0
- package/dist/chunk-4U6XK2DG.js +300 -0
- package/dist/chunk-4UMRUFBD.js +132 -0
- package/dist/chunk-4US4SYJ4.js +569 -0
- package/dist/chunk-4ZPLWEZO.js +154 -0
- package/dist/chunk-56WPYDJH.js +624 -0
- package/dist/chunk-57WRCJJW.js +50 -0
- package/dist/chunk-5AW4RMNG.js +24 -0
- package/dist/chunk-5EQN56OZ.js +155 -0
- package/dist/chunk-5F43TUIN.js +38 -0
- package/dist/chunk-5FKHIKTS.js +115 -0
- package/dist/chunk-5HDP7XZG.js +91 -0
- package/dist/chunk-5KQETTNS.js +152 -0
- package/dist/chunk-5PDVN2KO.js +498 -0
- package/dist/chunk-5UBIFVRD.js +509 -0
- package/dist/chunk-5YDE3Q62.js +46 -0
- package/dist/chunk-626AJVMU.js +302 -0
- package/dist/chunk-633XZ7UF.js +3583 -0
- package/dist/chunk-63DHNHGA.js +236 -0
- package/dist/chunk-666656AR.js +568 -0
- package/dist/chunk-67YRJPJO.js +19 -0
- package/dist/chunk-6CAU7VBA.js +20 -0
- package/dist/chunk-6CB3KJRY.js +21 -0
- package/dist/chunk-6DBMALXL.js +29 -0
- package/dist/chunk-6E25C4IA.js +269 -0
- package/dist/chunk-6FIBNIQU.js +73 -0
- package/dist/chunk-6G57FYBV.js +189 -0
- package/dist/chunk-6KZKRTG3.js +4885 -0
- package/dist/chunk-6LAH2UV2.js +525 -0
- package/dist/chunk-6PZY2TTU.js +921 -0
- package/dist/chunk-6T6NHXK4.js +230 -0
- package/dist/chunk-6TBEX4R4.js +432 -0
- package/dist/chunk-6TRD7TEE.js +911 -0
- package/dist/chunk-6XCP2RAI.js +47 -0
- package/dist/chunk-726G6WDL.js +351 -0
- package/dist/chunk-75EMT7BF.js +616 -0
- package/dist/chunk-762ACDZJ.js +4696 -0
- package/dist/chunk-77I6G4CO.js +1 -0
- package/dist/chunk-7DJ6SQH3.js +510 -0
- package/dist/chunk-7HPCIOMA.js +1383 -0
- package/dist/chunk-7HYBSRPZ.js +17503 -0
- package/dist/chunk-7KBEOPVB.js +73 -0
- package/dist/chunk-7LHJDJB3.js +2222 -0
- package/dist/chunk-7NVJMH52.js +306 -0
- package/dist/chunk-7RMARDVH.js +33 -0
- package/dist/chunk-7SEWU4QG.js +36 -0
- package/dist/chunk-7TUTZTI2.js +911 -0
- package/dist/chunk-7VBDFPUM.js +340 -0
- package/dist/chunk-7VRJHTGZ.js +6406 -0
- package/dist/chunk-7YAOUUKK.js +493 -0
- package/dist/chunk-AAAODV76.js +860 -0
- package/dist/chunk-AB4HUJVQ.js +339 -0
- package/dist/chunk-AEQWV746.js +611 -0
- package/dist/chunk-AHU3FKPA.js +11639 -0
- package/dist/chunk-AISTV5XU.js +226 -0
- package/dist/chunk-AJBTKGJZ.js +48 -0
- package/dist/chunk-AJJNW7XT.js +248 -0
- package/dist/chunk-AJN5Y5YZ.js +160 -0
- package/dist/chunk-ALDTFNZ3.js +150 -0
- package/dist/chunk-ARARVIZK.js +281 -0
- package/dist/chunk-ATBM6AW5.js +53 -0
- package/dist/chunk-ATKEKM3E.js +206 -0
- package/dist/chunk-AUJLW6JZ.js +92 -0
- package/dist/chunk-AY3MHEFM.js +24 -0
- package/dist/chunk-B7PYTV72.js +236 -0
- package/dist/chunk-B7YRSULE.js +1423 -0
- package/dist/chunk-BAWJNMWF.js +339 -0
- package/dist/chunk-BBPIILO2.js +88 -0
- package/dist/chunk-BD3PGW6A.js +957 -0
- package/dist/chunk-BDPYFAB4.js +44 -0
- package/dist/chunk-BIUV23HH.js +729 -0
- package/dist/chunk-BQ3VAGXH.js +243 -0
- package/dist/chunk-BQJOGAWT.js +31 -0
- package/dist/chunk-BT7EG7CO.js +68 -0
- package/dist/chunk-BV3XQQLU.js +27 -0
- package/dist/chunk-BY6ODHNZ.js +78 -0
- package/dist/chunk-BZRLSZNV.js +79 -0
- package/dist/chunk-C3DH3NCY.js +2773 -0
- package/dist/chunk-C3KCMAJP.js +756 -0
- package/dist/chunk-C7AGUJ5K.js +267 -0
- package/dist/chunk-CBSWKQCX.js +342 -0
- package/dist/chunk-CE5OZBYY.js +21 -0
- package/dist/chunk-CFCVYHSW.js +373 -0
- package/dist/chunk-CHA2HDE5.js +126 -0
- package/dist/chunk-CIHWPGS5.js +146 -0
- package/dist/chunk-CJBSZX3F.js +127 -0
- package/dist/chunk-CLA6QIJM.js +43 -0
- package/dist/chunk-CPSVQR2I.js +365 -0
- package/dist/chunk-CRPRVNQ4.js +254 -0
- package/dist/chunk-CSIE4Y7C.js +1093 -0
- package/dist/chunk-CSOPSYDY.js +142 -0
- package/dist/chunk-CSXLLEGB.js +205 -0
- package/dist/chunk-CTDLERWU.js +293 -0
- package/dist/chunk-CULBXMSK.js +110 -0
- package/dist/chunk-D2M2Y5ID.js +21 -0
- package/dist/chunk-D37WY7SH.js +1060 -0
- package/dist/chunk-D4VJFCGZ.js +89 -0
- package/dist/chunk-D6WTZMZB.js +48 -0
- package/dist/chunk-DBHOWDUH.js +976 -0
- package/dist/chunk-DCACX7BV.js +19364 -0
- package/dist/chunk-DFHX4XYA.js +128 -0
- package/dist/chunk-DIKBRRKE.js +176 -0
- package/dist/chunk-DJG5RIOR.js +9 -0
- package/dist/chunk-DNIOIISW.js +616 -0
- package/dist/chunk-DOA5G7IA.js +315 -0
- package/dist/chunk-DP7FKP6W.js +855 -0
- package/dist/chunk-DS2JZ677.js +79 -0
- package/dist/chunk-DSRLVYBS.js +82 -0
- package/dist/chunk-EAEVKNJA.js +209 -0
- package/dist/chunk-EEUESN3T.js +575 -0
- package/dist/chunk-EJ4LUU5Y.js +73 -0
- package/dist/chunk-EJIWTPSZ.js +1063 -0
- package/dist/chunk-EJVCDTAN.js +116 -0
- package/dist/chunk-EKLUBDBQ.js +627 -0
- package/dist/chunk-EN62WLFD.js +849 -0
- package/dist/chunk-ENYRCL43.js +26 -0
- package/dist/chunk-EP22ZMFO.js +273 -0
- package/dist/chunk-EP4SVAVI.js +87 -0
- package/dist/chunk-EPAMVGI3.js +1562 -0
- package/dist/chunk-EPRMH6HO.js +24 -0
- package/dist/chunk-ES6NWJ36.js +4057 -0
- package/dist/chunk-ETA2K4KI.js +30 -0
- package/dist/chunk-ETAD4NKD.js +31 -0
- package/dist/chunk-EUWIIDQ7.js +93 -0
- package/dist/chunk-EVE3OD2W.js +141 -0
- package/dist/chunk-EXA26FFC.js +459 -0
- package/dist/chunk-EXSPAA35.js +244 -0
- package/dist/chunk-F55YABKV.js +258 -0
- package/dist/chunk-F5DNGU5W.js +27 -0
- package/dist/chunk-F622MJYV.js +103 -0
- package/dist/chunk-F6NIQD74.js +5111 -0
- package/dist/chunk-FAWJTC34.js +43 -0
- package/dist/chunk-FAZBRHGG.js +47 -0
- package/dist/chunk-FIEUSGNJ.js +39 -0
- package/dist/chunk-FKCG7K6H.js +1146 -0
- package/dist/chunk-FOVVXV45.js +229 -0
- package/dist/chunk-FRBPKBFE.js +30 -0
- package/dist/chunk-FSA5BPFI.js +268 -0
- package/dist/chunk-FSJ5TTZ3.js +29 -0
- package/dist/chunk-FT7SGLXT.js +193 -0
- package/dist/chunk-FUUVZZUB.js +62 -0
- package/dist/chunk-FYMRVUNZ.js +1697 -0
- package/dist/chunk-FYTAA5FG.js +162 -0
- package/dist/chunk-G3VB2UCZ.js +3892 -0
- package/dist/chunk-G6OIMVXH.js +405 -0
- package/dist/chunk-G7PQCXVH.js +228 -0
- package/dist/chunk-GAB6UW52.js +1087 -0
- package/dist/chunk-GAFJEYLK.js +29 -0
- package/dist/chunk-GC4CRMTS.js +642 -0
- package/dist/chunk-GFHSIWHL.js +5297 -0
- package/dist/chunk-GI5M67YA.js +735 -0
- package/dist/chunk-GIJWHUWF.js +191 -0
- package/dist/chunk-GO6DRECI.js +1 -0
- package/dist/chunk-GOFVBTMN.js +314 -0
- package/dist/chunk-GQIP72ZJ.js +13 -0
- package/dist/chunk-GQXLXRFA.js +28 -0
- package/dist/chunk-GT6HFKJB.js +48 -0
- package/dist/chunk-GVJGSSKM.js +174 -0
- package/dist/chunk-GWHGTG37.js +36 -0
- package/dist/chunk-GZAJHLKO.js +18 -0
- package/dist/chunk-GZK62I3N.js +314 -0
- package/dist/chunk-H3HGMISG.js +483 -0
- package/dist/chunk-H3ISZJMJ.js +403 -0
- package/dist/chunk-H4HXVWEC.js +9 -0
- package/dist/chunk-H6MJGKAW.js +120 -0
- package/dist/chunk-HBTTGVR5.js +353 -0
- package/dist/chunk-HBZ322WZ.js +35 -0
- package/dist/chunk-HEP3ILP4.js +34 -0
- package/dist/chunk-HGFXODKO.js +106 -0
- package/dist/chunk-HHWDTB6S.js +59 -0
- package/dist/chunk-HKO45NLZ.js +286 -0
- package/dist/chunk-HLVTEA6A.js +89 -0
- package/dist/chunk-HS3SY6HN.js +160 -0
- package/dist/chunk-HT5OCGKN.js +899 -0
- package/dist/chunk-HXIIEMGF.js +78 -0
- package/dist/chunk-I56TH7VM.js +46 -0
- package/dist/chunk-I6FN3R5D.js +352 -0
- package/dist/chunk-I7SCBHJN.js +655 -0
- package/dist/chunk-IJM4GKAT.js +529 -0
- package/dist/chunk-IMEYU36R.js +344 -0
- package/dist/chunk-INJ3SS6A.js +936 -0
- package/dist/chunk-IUKOPCCE.js +441 -0
- package/dist/chunk-IVEPZQJO.js +33 -0
- package/dist/chunk-IVZEONFC.js +43 -0
- package/dist/chunk-IWBHRSG7.js +936 -0
- package/dist/chunk-IYY3HQAD.js +484 -0
- package/dist/chunk-J2ICMYDA.js +48 -0
- package/dist/chunk-J2QCFLUN.js +505 -0
- package/dist/chunk-J5HM6V5P.js +1039 -0
- package/dist/chunk-J6NZX6QH.js +398 -0
- package/dist/chunk-JBBB2Y47.js +432 -0
- package/dist/chunk-JDCZQZU7.js +42 -0
- package/dist/chunk-JEDNXGSS.js +169 -0
- package/dist/chunk-JHP7OT6K.js +89 -0
- package/dist/chunk-JLS65NUQ.js +14 -0
- package/dist/chunk-JNMWYMC6.js +38 -0
- package/dist/chunk-JNSTWNNW.js +25 -0
- package/dist/chunk-JOSK6GEU.js +9564 -0
- package/dist/chunk-JQUMSIGC.js +100 -0
- package/dist/chunk-JVHGMURQ.js +1106 -0
- package/dist/chunk-JYXS47FQ.js +951 -0
- package/dist/chunk-K2ZMW2Z5.js +2147 -0
- package/dist/chunk-K7FAFORM.js +14 -0
- package/dist/chunk-KBJXX3ON.js +333 -0
- package/dist/chunk-KHFKVQWY.js +486 -0
- package/dist/chunk-KHMEI3DQ.js +173 -0
- package/dist/chunk-KHW3UD7B.js +69 -0
- package/dist/chunk-KKQKWAMF.js +365 -0
- package/dist/chunk-KOKXJV2U.js +455 -0
- package/dist/chunk-KQ4NGOJI.js +14 -0
- package/dist/chunk-KQYQOXMS.js +342 -0
- package/dist/chunk-KTMW65UX.js +14 -0
- package/dist/chunk-KUEWV2JH.js +593 -0
- package/dist/chunk-KXYDV3HP.js +1523 -0
- package/dist/chunk-KZ4JMGZ5.js +96 -0
- package/dist/chunk-KZWGBUIO.js +2659 -0
- package/dist/chunk-L2CBG5IX.js +1892 -0
- package/dist/chunk-L2S235CU.js +314 -0
- package/dist/chunk-L32WD57F.js +98 -0
- package/dist/chunk-LDJCKAJP.js +123 -0
- package/dist/chunk-LDWNBEN7.js +541 -0
- package/dist/chunk-LJVH57G2.js +241 -0
- package/dist/chunk-LPQ7NZEN.js +209 -0
- package/dist/chunk-LRGH3CCV.js +148 -0
- package/dist/chunk-LULOGMMM.js +1133 -0
- package/dist/chunk-LWGKN2GY.js +8284 -0
- package/dist/chunk-LX4F24ZH.js +157 -0
- package/dist/chunk-M4BUEXXF.js +839 -0
- package/dist/chunk-M6UHOC4I.js +553 -0
- package/dist/chunk-MCBNWZNO.js +657 -0
- package/dist/chunk-MEMSY6VY.js +223 -0
- package/dist/chunk-MHLEZQQI.js +145 -0
- package/dist/chunk-MJ6WNSIX.js +192 -0
- package/dist/chunk-MKASIKWZ.js +442 -0
- package/dist/chunk-MNOVBYFU.js +60 -0
- package/dist/chunk-MO2BYAAF.js +2896 -0
- package/dist/chunk-MP6P7Y2A.js +180 -0
- package/dist/chunk-MQ4TFJAG.js +3365 -0
- package/dist/chunk-MT2WAIR3.js +131 -0
- package/dist/chunk-MTU7VTNN.js +1122 -0
- package/dist/chunk-MULMXX4V.js +150 -0
- package/dist/chunk-MW2DWWVA.js +147 -0
- package/dist/chunk-MY3ZPUN4.js +151 -0
- package/dist/chunk-MYLH2S4G.js +64 -0
- package/dist/chunk-MZ5WYKNA.js +28 -0
- package/dist/chunk-N3Q2JNPV.js +249 -0
- package/dist/chunk-N5DX4JAK.js +12 -0
- package/dist/chunk-NAINGKHF.js +35 -0
- package/dist/chunk-NEQUQHOX.js +223 -0
- package/dist/chunk-NHNPEZS4.js +1408 -0
- package/dist/chunk-NHTIXJCR.js +17 -0
- package/dist/chunk-NKLPMBNV.js +1154 -0
- package/dist/chunk-NMVZ5YES.js +199 -0
- package/dist/chunk-NRFRY3GE.js +256 -0
- package/dist/chunk-NTD6CSI6.js +1266 -0
- package/dist/chunk-NUO7B3SH.js +318 -0
- package/dist/chunk-NVOHIJKG.js +1319 -0
- package/dist/chunk-NXH3RX7O.js +523 -0
- package/dist/chunk-NXZ3DURF.js +257 -0
- package/dist/chunk-O26L6F7F.js +209 -0
- package/dist/chunk-O5RRIUEP.js +124 -0
- package/dist/chunk-O5X6BKAO.js +10 -0
- package/dist/chunk-O6ZQUVTR.js +31 -0
- package/dist/chunk-O7FE75QZ.js +306 -0
- package/dist/chunk-OC7Z6AJQ.js +81 -0
- package/dist/chunk-OH7IEZ63.js +307 -0
- package/dist/chunk-OI734GRS.js +115 -0
- package/dist/chunk-OJBH62DK.js +684 -0
- package/dist/chunk-OKJLVSTJ.js +247 -0
- package/dist/chunk-OMX5VL43.js +79 -0
- package/dist/chunk-ONHAMBN6.js +12 -0
- package/dist/chunk-ONYPLIVE.js +753 -0
- package/dist/chunk-OSK7QWPD.js +637 -0
- package/dist/chunk-OTXLMJKP.js +438 -0
- package/dist/chunk-OV5PKQMA.js +213 -0
- package/dist/chunk-OXK5HA4B.js +31 -0
- package/dist/chunk-OYDWFQA4.js +272 -0
- package/dist/chunk-OZAUKWHB.js +22 -0
- package/dist/chunk-P5P2EKGH.js +94 -0
- package/dist/chunk-P6SSWAKY.js +29 -0
- package/dist/chunk-P7CQGPLS.js +30 -0
- package/dist/chunk-P7RVCHQV.js +197 -0
- package/dist/chunk-PEBWDYIW.js +726 -0
- package/dist/chunk-PFCXFO7A.js +9193 -0
- package/dist/chunk-PFLDWMX6.js +168 -0
- package/dist/chunk-PHZGLQSK.js +15883 -0
- package/dist/chunk-PNFTPNSR.js +20 -0
- package/dist/chunk-PPHXX4W7.js +175 -0
- package/dist/chunk-PPZESPJT.js +262 -0
- package/dist/chunk-PRDHI2L5.js +296 -0
- package/dist/chunk-PSTKWHHN.js +32 -0
- package/dist/chunk-PV53ODOT.js +555 -0
- package/dist/chunk-PVJBTI7P.js +24 -0
- package/dist/chunk-PXKERBKX.js +100 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-Q3DHEZA5.js +85 -0
- package/dist/chunk-Q5RZDVQK.js +204 -0
- package/dist/chunk-Q64IR2Z2.js +4933 -0
- package/dist/chunk-Q6Z5UGPL.js +398 -0
- package/dist/chunk-QAMAV4DT.js +627 -0
- package/dist/chunk-QBWF4444.js +112 -0
- package/dist/chunk-QDKYT4CI.js +22805 -0
- package/dist/chunk-QFLBRWCJ.js +126 -0
- package/dist/chunk-QILAQACE.js +107 -0
- package/dist/chunk-QJ6OEH4K.js +3683 -0
- package/dist/chunk-QK3NLYTV.js +320 -0
- package/dist/chunk-QOFLUS24.js +535 -0
- package/dist/chunk-QOIASNEJ.js +98 -0
- package/dist/chunk-QP4UTSOV.js +3587 -0
- package/dist/chunk-QP5ST7RI.js +904 -0
- package/dist/chunk-QS5AGRZN.js +167 -0
- package/dist/chunk-QTAOU53N.js +107 -0
- package/dist/chunk-QTCLJHLZ.js +351 -0
- package/dist/chunk-QTOLTG4L.js +119 -0
- package/dist/chunk-QWDV4OSL.js +142 -0
- package/dist/chunk-QWMQ74KD.js +508 -0
- package/dist/chunk-QX6LOMMH.js +158 -0
- package/dist/chunk-QXBKIHY7.js +238 -0
- package/dist/chunk-QXBKTJT6.js +270 -0
- package/dist/chunk-QYQOVOLR.js +196 -0
- package/dist/chunk-R2CKS6WT.js +73 -0
- package/dist/chunk-R2TIYG7U.js +68 -0
- package/dist/chunk-R2W3LESH.js +465 -0
- package/dist/chunk-R5EXHMUN.js +100 -0
- package/dist/chunk-RBBTBCHX.js +289 -0
- package/dist/chunk-RBKLOUXA.js +121 -0
- package/dist/chunk-RCP2Y6DQ.js +86 -0
- package/dist/chunk-RCYEJSD5.js +260 -0
- package/dist/chunk-RFDVSI4N.js +134 -0
- package/dist/chunk-RGJU63FV.js +1717 -0
- package/dist/chunk-RI4EX2QE.js +18 -0
- package/dist/chunk-RIMARPCF.js +152 -0
- package/dist/chunk-RJ6RSNT6.js +42 -0
- package/dist/chunk-RNI2GUIF.js +131 -0
- package/dist/chunk-RPHUWJ3K.js +264 -0
- package/dist/chunk-RPIMAMV7.js +361 -0
- package/dist/chunk-RQFX6YRN.js +49 -0
- package/dist/chunk-RRC5BL7B.js +285 -0
- package/dist/chunk-RSYTSBOO.js +79 -0
- package/dist/chunk-RWQQIKIC.js +35 -0
- package/dist/chunk-RZUBOZH2.js +373 -0
- package/dist/chunk-S2E632FQ.js +380 -0
- package/dist/chunk-S2VQCZO4.js +22 -0
- package/dist/chunk-S2XIMQJQ.js +681 -0
- package/dist/chunk-S47ISY27.js +183 -0
- package/dist/chunk-S6I4KISU.js +142 -0
- package/dist/chunk-S6TAFQI5.js +2403 -0
- package/dist/chunk-SBBNT5ZJ.js +27 -0
- package/dist/chunk-SDJV2DTQ.js +491 -0
- package/dist/chunk-SDPIFNLD.js +33 -0
- package/dist/chunk-SF6YK3JI.js +835 -0
- package/dist/chunk-SK3ZFONO.js +976 -0
- package/dist/chunk-SKTFRFQ7.js +1775 -0
- package/dist/chunk-SNGM452K.js +2002 -0
- package/dist/chunk-STW7OFOA.js +581 -0
- package/dist/chunk-SU6UFUQY.js +1351 -0
- package/dist/chunk-SVJM3LJA.js +27 -0
- package/dist/chunk-SVUNZOPG.js +129 -0
- package/dist/chunk-T5XLUYV3.js +34 -0
- package/dist/chunk-T7E5JS6N.js +57 -0
- package/dist/chunk-TA3N5MMO.js +450 -0
- package/dist/chunk-TAJPCXSB.js +13 -0
- package/dist/chunk-TDEMDRN2.js +1639 -0
- package/dist/chunk-TDSEX5CF.js +24 -0
- package/dist/chunk-TGCVL74Y.js +28 -0
- package/dist/chunk-TGXXYDL4.js +1012 -0
- package/dist/chunk-TIKTYUJO.js +296 -0
- package/dist/chunk-TIZAJD4M.js +6029 -0
- package/dist/chunk-TLSEZZCG.js +5549 -0
- package/dist/chunk-TMBDRHAX.js +19 -0
- package/dist/chunk-TRURQUBP.js +1217 -0
- package/dist/chunk-TSQ256N5.js +152 -0
- package/dist/chunk-TUQMMFEQ.js +2244 -0
- package/dist/chunk-U424MJLC.js +81 -0
- package/dist/chunk-U4DRS6ZW.js +11 -0
- package/dist/chunk-U5KS22IN.js +204 -0
- package/dist/chunk-UAPHFJPN.js +673 -0
- package/dist/chunk-UB7LQITD.js +1040 -0
- package/dist/chunk-UBVRHGAZ.js +237 -0
- package/dist/chunk-UDNNAQN5.js +98 -0
- package/dist/chunk-UJP3XM54.js +342 -0
- package/dist/chunk-UJYDH2MW.js +305 -0
- package/dist/chunk-UKMPASIC.js +399 -0
- package/dist/chunk-UKUL3EHK.js +763 -0
- package/dist/chunk-UPHU64NB.js +1327 -0
- package/dist/chunk-URMSZXAD.js +43 -0
- package/dist/chunk-US3RT6CY.js +525 -0
- package/dist/chunk-UTDEOPKV.js +30 -0
- package/dist/chunk-UUUDKV7N.js +13 -0
- package/dist/chunk-UVKWU3SM.js +39 -0
- package/dist/chunk-V2TVPO3X.js +521 -0
- package/dist/chunk-V3KLVK7B.js +398 -0
- package/dist/chunk-V3YFFHDR.js +17 -0
- package/dist/chunk-VAG6GUBR.js +1162 -0
- package/dist/chunk-VBENAHDA.js +1814 -0
- package/dist/chunk-VBNCKCCI.js +16 -0
- package/dist/chunk-VCGSWN5M.js +1300 -0
- package/dist/chunk-VE2O2I7M.js +115 -0
- package/dist/chunk-VIFHYTI5.js +31 -0
- package/dist/chunk-VJER3FUS.js +5080 -0
- package/dist/chunk-VLMDM56Q.js +268 -0
- package/dist/chunk-VMFZEVVX.js +99 -0
- package/dist/chunk-VNDPQVUZ.js +1853 -0
- package/dist/chunk-VSPJRLGA.js +4783 -0
- package/dist/chunk-VSWC5ZXI.js +103 -0
- package/dist/chunk-VYI4DSZP.js +2017 -0
- package/dist/chunk-W4BAIQ6L.js +1212 -0
- package/dist/chunk-W7VQAL2K.js +2203 -0
- package/dist/chunk-WEI3ZDZH.js +33 -0
- package/dist/chunk-WEIUS5NT.js +26 -0
- package/dist/chunk-WEW7UFWE.js +546 -0
- package/dist/chunk-WGQAXLNA.js +384 -0
- package/dist/chunk-WJAL4JL3.js +206 -0
- package/dist/chunk-WKFOJ5ZG.js +141 -0
- package/dist/chunk-WMWQEFLN.js +2177 -0
- package/dist/chunk-WNECKKO2.js +154 -0
- package/dist/chunk-WPKLYOAM.js +195 -0
- package/dist/chunk-WSH37YQN.js +243 -0
- package/dist/chunk-WV3KQDPE.js +84 -0
- package/dist/chunk-WZFC4V4U.js +389 -0
- package/dist/chunk-XCOIBNET.js +13 -0
- package/dist/chunk-XDM65LBX.js +53 -0
- package/dist/chunk-XGU6PBO5.js +645 -0
- package/dist/chunk-XHOI4V62.js +43 -0
- package/dist/chunk-XIBVFMLQ.js +6858 -0
- package/dist/chunk-XJ2E7YEJ.js +117 -0
- package/dist/chunk-XON4ZCYX.js +69 -0
- package/dist/chunk-XQPEWJPI.js +127 -0
- package/dist/chunk-XSJTIFUY.js +31 -0
- package/dist/chunk-XT7OVWM3.js +64 -0
- package/dist/chunk-XTXYIISX.js +1104 -0
- package/dist/chunk-XV7NZL4B.js +57 -0
- package/dist/chunk-XWIZ6B5S.js +109 -0
- package/dist/chunk-XWLIKOBX.js +240 -0
- package/dist/chunk-XZOXEIN4.js +156 -0
- package/dist/chunk-XZRS7I7W.js +3673 -0
- package/dist/chunk-Y4ZDDHB6.js +44 -0
- package/dist/chunk-Y733RB7T.js +194 -0
- package/dist/chunk-YBHUB4XR.js +14931 -0
- package/dist/chunk-YKC75XK4.js +147 -0
- package/dist/chunk-YKMXFVK7.js +27 -0
- package/dist/chunk-YO5BAJ55.js +225 -0
- package/dist/chunk-YPDCLXNZ.js +568 -0
- package/dist/chunk-YSQPGVFK.js +116 -0
- package/dist/chunk-YTVVTIWJ.js +716 -0
- package/dist/chunk-YVCMDVBB.js +698 -0
- package/dist/chunk-YYTOA6DP.js +114 -0
- package/dist/chunk-Z5WGNULV.js +88 -0
- package/dist/chunk-Z6NGVVXG.js +66 -0
- package/dist/chunk-Z7CDQNH3.js +20 -0
- package/dist/chunk-ZH4G3FU5.js +187 -0
- package/dist/chunk-ZJB6SQPA.js +257 -0
- package/dist/chunk-ZL6E4HMY.js +42 -0
- package/dist/chunk-ZMLOC3DW.js +62 -0
- package/dist/chunk-ZORW64QH.js +101 -0
- package/dist/chunk-ZVVD2XGV.js +1369 -0
- package/dist/cli-utils-ER33ODC5.js +31 -0
- package/dist/cli-validation-6CHPTANV.js +146 -0
- package/dist/commit-utils-3STAY7C7.js +49 -0
- package/dist/compatibility-notice-IHNXR2JR.js +21 -0
- package/dist/compete-config-resolver-V3GDNJMM.js +125 -0
- package/dist/compete-results-XUM3PJHS.js +318 -0
- package/dist/competition-outcome-tracker-NWSMVUPG.js +62 -0
- package/dist/config-4HHE4OIK.js +238 -0
- package/dist/config-D6YAZASH.js +10 -0
- package/dist/config-MIPRDYYV.js +46 -0
- package/dist/config-audit-GA5DCUAI.js +371 -0
- package/dist/config-explain-4LMO556H.js +71 -0
- package/dist/config-loader-RGP634PC.js +51 -0
- package/dist/config-manager-J2UTO635.js +114 -0
- package/dist/config-merger-TVUJBZTS.js +14 -0
- package/dist/config-validator-H4ZVIE56.js +122 -0
- package/dist/cost-HSIV5U2Y.js +85 -0
- package/dist/data-migration-state-OAUL2WPQ.js +35 -0
- package/dist/db-migrator-NUOW5NKR.js +34 -0
- package/dist/default-paths-UILB62BN.js +49 -0
- package/dist/discovery-V6GYUJUC.js +53 -0
- package/dist/doctor-BBSMCDWE.js +271 -0
- package/dist/doctor-context-blocks-LPY75VZA.js +231 -0
- package/dist/doctor-instructions-import-JXHDDOE5.js +70 -0
- package/dist/doctor-purpose-6YJOXPBE.js +30 -0
- package/dist/domain-analyzer-S35ABUNA.js +48 -0
- package/dist/ensure-initialized-Q6PEU55O.js +78 -0
- package/dist/entry.js +922 -0
- package/dist/error-parser-core-MZFMFANN.js +70 -0
- package/dist/evaluation-context-GQBYDAEV.js +63 -0
- package/dist/evidence-plan-resolver-5FUAP3SA.js +111 -0
- package/dist/execution-data-writer-YCG5UH37.js +72 -0
- package/dist/execution-policy-applier-PWZM5LNA.js +63 -0
- package/dist/execution-preflight-DASJWWQF.js +223 -0
- package/dist/execution-roles-KNSNNB2D.js +112 -0
- package/dist/exit-code-error-QIY5DOKF.js +18 -0
- package/dist/external-temp-cleanup-CAW7LQ6R.js +360 -0
- package/dist/factory-YCYCB7AE.js +209 -0
- package/dist/file-utils-ZQYNBQBW.js +45 -0
- package/dist/flywheel-allowlist-revert-H22HA6JE.js +21 -0
- package/dist/flywheel-autoloop-executor-PDOASJEZ.js +316 -0
- package/dist/flywheel-autoloop-unverified-TOKYFCDC.js +36 -0
- package/dist/flywheel-competition-executor-YJUMMEJO.js +320 -0
- package/dist/flywheel-executor-JWU43KAY.js +437 -0
- package/dist/flywheel-git-isolation-FQ2TRWMB.js +56 -0
- package/dist/flywheel-manifest-HDPNMWWF.js +114 -0
- package/dist/flywheel-model-defaults-UHAKTZT3.js +110 -0
- package/dist/flywheel-preflight-III2C7TH.js +163 -0
- package/dist/flywheel-resume-2O45MS7Y.js +31 -0
- package/dist/flywheel-resume-execution-lease-P2BK257J.js +59 -0
- package/dist/flywheel-safety-AVAVFXIJ.js +19 -0
- package/dist/flywheel-scope-decision-ALJUUNGG.js +14 -0
- package/dist/get-telemetry-logger-MPDVO2JA.js +155 -0
- package/dist/git-message-style-KCXGMTDT.js +104 -0
- package/dist/guidance-profile-config-G3K5YQOO.js +113 -0
- package/dist/guidance-profile-renderer-TX4TNDFL.js +23 -0
- package/dist/identity-XLQJ4YJF.js +25 -0
- package/dist/index-query-6NUY4FKX.js +37 -0
- package/dist/index.js +85588 -0
- package/dist/indexer-DL54CM3K.js +44 -0
- package/dist/init-OUZ72344.js +245 -0
- package/dist/instructions-import-offer-NSYXSITC.js +363 -0
- package/dist/instructions-run-NBII7W36.js +114 -0
- package/dist/interrupted-work-E4TLKJLE.js +43 -0
- package/dist/invoke-provider-auth-NEWEIHCI.js +38 -0
- package/dist/judge-scoring.json +64 -0
- package/dist/lab-mode-YXQ2Y3NG.js +44 -0
- package/dist/lab-utils-5QAMDJR5.js +29 -0
- package/dist/linux-host-class-YDWQX65O.js +31 -0
- package/dist/llm-judge-executor-OJSNCTFJ.js +179 -0
- package/dist/local-ci-config-VZ4WWDT5.js +48 -0
- package/dist/local-executor-DCMDDRX2.js +280 -0
- package/dist/logger-5KNKS3O4.js +154 -0
- package/dist/matrix-prompt-builder-4ZBOGZSB.js +527 -0
- package/dist/matrix-result-parser-EZJM4YXP.js +14 -0
- package/dist/merge-batch-RTEEMVDB.js +313 -0
- package/dist/merge-batch-members-VIWGVRHP.js +24 -0
- package/dist/merge-queue-TIIUSOY6.js +126 -0
- package/dist/merge-queue-trust-DUNZ4J65.js +21 -0
- package/dist/metadata-UKSMWM6J.js +29 -0
- package/dist/model-catalog-readiness-R5KJBP5M.js +202 -0
- package/dist/model-invocations-db-XTUPPQ34.js +70 -0
- package/dist/model-resolver-JFZ2MHOJ.js +39 -0
- package/dist/model-resolver-SCQ57KAQ.js +217 -0
- package/dist/model-roles-D3OR4NAH.js +110 -0
- package/dist/monitor-F4SIU5G2.js +96 -0
- package/dist/nested-worktrees-2WUWQ75N.js +23 -0
- package/dist/next-S3IRLVER.js +96 -0
- package/dist/next-UKPFRXOO.js +148 -0
- package/dist/opportunistic-TL4S26VX.js +86 -0
- package/dist/optimization-config-resolver-NAEIYU6A.js +148 -0
- package/dist/package-HJR4QJT4.js +10 -0
- package/dist/parse-git-status-7PIYFPS2.js +21 -0
- package/dist/path-security-5WJSY56G.js +41 -0
- package/dist/paths-JUI7C4KU.js +45 -0
- package/dist/plan-backlog-list-fast-SSTQL5XP.js +89 -0
- package/dist/plan-backlog-show-fast-PFRAQ3JB.js +114 -0
- package/dist/plan-sprint-list-fast-HD2KBZSY.js +110 -0
- package/dist/plan-sprint-status-fast-YFYH7WQF.js +116 -0
- package/dist/plan-task-status-fast-JU5PNLUU.js +114 -0
- package/dist/plan-to-flywheel-PY5MSY2H.js +529 -0
- package/dist/preflight-PJHGTJNZ.js +12 -0
- package/dist/process-registry-B4ZUCN7T.js +28 -0
- package/dist/process-scanner-TU3QHWVB.js +23 -0
- package/dist/processes-6FHVGT72.js +28 -0
- package/dist/processes-json-fast-YWTMUWXB.js +72 -0
- package/dist/profile-HWTC56SG.js +209 -0
- package/dist/project-runtime-paths-2UQNG5Y4.js +41 -0
- package/dist/protected-branches-N36LDBFY.js +71 -0
- package/dist/provider-aware-resource-manager-YTFAHNGJ.js +40 -0
- package/dist/provider-matrix-2KO2V5OM.js +214 -0
- package/dist/provider-matrix-renderer-MEC3PER7.js +139 -0
- package/dist/provider-output-forwarding-2AHL7YMA.js +26 -0
- package/dist/provider-registry-WCZ65QHC.js +136 -0
- package/dist/provider-temp-cleanup-IUNPJCZF.js +14 -0
- package/dist/prune-engine-EOQVWEP6.js +448 -0
- package/dist/publication-turn-S42RZTQF.js +44 -0
- package/dist/quality-gate-JQMVCKOO.js +72 -0
- package/dist/quickstart-3O6FRCFB.js +105 -0
- package/dist/readiness-GW6ABRHB.js +139 -0
- package/dist/readiness-KFZCXDTT.js +215 -0
- package/dist/registry-7XG376SY.js +217 -0
- package/dist/repair-helpers-TTV5FEF4.js +117 -0
- package/dist/repo-root-YG6MQZDW.js +28 -0
- package/dist/resolution-engine-FFEK7HQ2.js +187 -0
- package/dist/resolve-provider-cli-ZEXVZKET.js +44 -0
- package/dist/restore-telemetry-db-E7BR5PO7.js +459 -0
- package/dist/routing-events-AW6SRZ6G.js +13 -0
- package/dist/routing-history-store-FMDDQL6W.js +39 -0
- package/dist/routing-planner-C6OHO3EY.js +221 -0
- package/dist/runner-KHDNQ5KU.js +1194 -0
- package/dist/runner-PIS2BW7Y.js +1801 -0
- package/dist/safety-E3JJVSFL.js +67 -0
- package/dist/safety-stanza-HE6GXP4G.js +49 -0
- package/dist/sandbox-7LBZC5PE.js +72 -0
- package/dist/sandbox-ASWCDYZL.js +80 -0
- package/dist/schema-extensions.sql +234 -0
- package/dist/security-JI22TBEB.js +17 -0
- package/dist/setup-bb-plugin-FQXLA76Y.js +531 -0
- package/dist/setup-claude-code-NF4ZSHVE.js +197 -0
- package/dist/setup-temp-cleanup-2APZ4HMA.js +29 -0
- package/dist/shared-utils-34HJZ6JX.js +40 -0
- package/dist/simple-artifact-goal-MQLDDMMX.js +29 -0
- package/dist/sprint-N7JFTEGL.js +403 -0
- package/dist/sprint-bridge-KJXIBNRJ.js +117 -0
- package/dist/sprint-completion-dependents-34SR7JVL.js +43 -0
- package/dist/sprint-execution-service-A6JPUBWY.js +376 -0
- package/dist/sprint-manager-MU2ZUWN2.js +140 -0
- package/dist/sqlite-timeout-config-U2CT4LKU.js +13 -0
- package/dist/sqlite-wrapper-FSGJ2QEW.js +19 -0
- package/dist/stale-cleanup-orchestrator-4X6324VF.js +71 -0
- package/dist/storage-access-I3V5LER7.js +31 -0
- package/dist/store-XVG64ZR2.js +25 -0
- package/dist/task-classifier-MN2DYE5R.js +558 -0
- package/dist/task-list-fast-7AT6LTTA.js +112 -0
- package/dist/task-manager-LHPBBRRE.js +136 -0
- package/dist/task-report-OLPAWBTK.js +64 -0
- package/dist/task-type-detector-6RG3YNZF.js +27 -0
- package/dist/task-type-resolver-EQHOUIHT.js +64 -0
- package/dist/telemetry-5VYSK772.js +212 -0
- package/dist/telemetry-health-tracker-4GFW2EMP.js +12 -0
- package/dist/telemetry-path-resolver-H3NFHHQY.js +34 -0
- package/dist/telemetry-reliability-URJDTNPZ.js +76 -0
- package/dist/transports-NREZQTJK.js +106 -0
- package/dist/unified-cost-tracker-5MTBJ2CL.js +59 -0
- package/dist/unified-state-cleanup-GGAXLHXF.js +292 -0
- package/dist/universal-cost-calculator-JTFEJVWK.js +70 -0
- package/dist/user-agents-QLIGPLP2.js +30 -0
- package/dist/variant-execution-I4ZZUAWY.js +319 -0
- package/dist/variant-opt-parser-JHCXKY2K.js +251 -0
- package/dist/variant-request-input-PL37N3AN.js +11 -0
- package/dist/variant-state-cleanup-KHMXRBZN.js +287 -0
- package/dist/variant-worker-COB5YTJX.js +4517 -0
- package/dist/variant-worker.js +26 -0
- package/dist/variants-XGDSXYG3.js +267 -0
- package/dist/verification-command-YSPU4VBH.js +66 -0
- package/dist/verify-command-timeout-DQUYH33Z.js +11 -0
- package/dist/verify-commands-LOHMOFKC.js +65 -0
- package/dist/warning-JSKSFKBT.js +13 -0
- package/dist/work-edge-K65NHVWY.js +50 -0
- package/dist/work-item-writer-KY5ZWZWW.js +30 -0
- package/dist/worker-JNXXEIT6.js +1504 -0
- package/dist/worker.js +21 -0
- package/dist/workspace-tree-identity-JO5PSKTW.js +52 -0
- package/dist/worktree-environment-WTVABAQW.js +64 -0
- package/dist/worktree-metrics-VZRQI26T.js +66 -0
- package/dist/writeback-TQFQBJNU.js +50 -0
- package/docs/CLI_REFERENCE.md +8287 -0
- package/docs/PROVIDER_SETUP.md +1737 -0
- package/docs/README.md +96 -0
- package/docs/TROUBLESHOOTING.md +2209 -0
- package/docs/getting-started/QUICK_START.md +260 -0
- package/docs/getting-started/README.md +198 -0
- package/docs/getting-started/SETUP.md +25 -0
- package/docs/reference/AGENT_CONTEXT.md +84 -0
- package/docs/reference/DELIVERY_ONBOARDING.md +198 -0
- package/docs/reference/PROVIDER_RELEASE_TIERS.md +34 -0
- package/docs/reference/SECURITY.md +291 -0
- package/docs/reference/TELEMETRY_PRIVACY.md +259 -0
- package/integrations/bb-plugin-build/README.md +391 -0
- package/integrations/bb-plugin-build/app.css +431 -0
- package/integrations/bb-plugin-build/app.tsx +6210 -0
- package/integrations/bb-plugin-build/package.json +45 -0
- package/integrations/bb-plugin-build/server.ts +488 -0
- package/integrations/bb-plugin-build/src/adapter.ts +3672 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-model.ts +150 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-schema.ts +458 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-service.ts +467 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-view.ts +1025 -0
- package/integrations/bb-plugin-build/src/command-evidence-schema.ts +13 -0
- package/integrations/bb-plugin-build/src/competition-defaults-schema.ts +122 -0
- package/integrations/bb-plugin-build/src/competition-defaults-service.ts +105 -0
- package/integrations/bb-plugin-build/src/competition-defaults-view.ts +138 -0
- package/integrations/bb-plugin-build/src/contract.ts +718 -0
- package/integrations/bb-plugin-build/src/execution-activity-view.ts +98 -0
- package/integrations/bb-plugin-build/src/finalize-model.ts +205 -0
- package/integrations/bb-plugin-build/src/finalize-schema.ts +150 -0
- package/integrations/bb-plugin-build/src/finalize-service.ts +330 -0
- package/integrations/bb-plugin-build/src/finalize-view.ts +159 -0
- package/integrations/bb-plugin-build/src/judge-operations-readback.ts +303 -0
- package/integrations/bb-plugin-build/src/judge-operations-schema.ts +33 -0
- package/integrations/bb-plugin-build/src/judge-operations-view.ts +459 -0
- package/integrations/bb-plugin-build/src/model.ts +1318 -0
- package/integrations/bb-plugin-build/src/monitor-service.ts +233 -0
- package/integrations/bb-plugin-build/src/panel-read-ux.ts +97 -0
- package/integrations/bb-plugin-build/src/patch-preview-schema.ts +166 -0
- package/integrations/bb-plugin-build/src/patch-preview-service.ts +480 -0
- package/integrations/bb-plugin-build/src/patch-preview-view.ts +109 -0
- package/integrations/bb-plugin-build/src/planning-readback.ts +228 -0
- package/integrations/bb-plugin-build/src/planning-service.ts +647 -0
- package/integrations/bb-plugin-build/src/planning-sync-evidence.ts +37 -0
- package/integrations/bb-plugin-build/src/planning-workspace-readback.ts +33 -0
- package/integrations/bb-plugin-build/src/planning-workspace-schema.ts +131 -0
- package/integrations/bb-plugin-build/src/planning-workspace.ts +333 -0
- package/integrations/bb-plugin-build/src/poll-handoff.ts +136 -0
- package/integrations/bb-plugin-build/src/project-target-server.ts +21 -0
- package/integrations/bb-plugin-build/src/project-target.ts +45 -0
- package/integrations/bb-plugin-build/src/reference-index.ts +218 -0
- package/integrations/bb-plugin-build/src/repository-identity.ts +17 -0
- package/integrations/bb-plugin-build/src/repository-schema.ts +30 -0
- package/integrations/bb-plugin-build/src/result-explorer-view.ts +597 -0
- package/integrations/bb-plugin-build/src/result-readback-model.ts +163 -0
- package/integrations/bb-plugin-build/src/result-readback-schema.ts +319 -0
- package/integrations/bb-plugin-build/src/result-readback-service.ts +333 -0
- package/integrations/bb-plugin-build/src/run-page-view.ts +332 -0
- package/integrations/bb-plugin-build/src/setup-config-schema.ts +293 -0
- package/integrations/bb-plugin-build/src/setup-config-service.ts +620 -0
- package/integrations/bb-plugin-build/src/setup-config-view.ts +388 -0
- package/integrations/bb-plugin-build/src/sprint-close-model.ts +150 -0
- package/integrations/bb-plugin-build/src/sprint-close-schema.ts +128 -0
- package/integrations/bb-plugin-build/src/sprint-close-service.ts +293 -0
- package/integrations/bb-plugin-build/src/sprint-close-view.ts +116 -0
- package/integrations/bb-plugin-build/src/sprint-composition-model.ts +709 -0
- package/integrations/bb-plugin-build/src/sprint-composition-readback.ts +231 -0
- package/integrations/bb-plugin-build/src/sprint-composition-schema.ts +597 -0
- package/integrations/bb-plugin-build/src/sprint-composition-service.ts +773 -0
- package/integrations/bb-plugin-build/src/sprint-composition-view.ts +1221 -0
- package/integrations/bb-plugin-build/src/sprint-execution-schema.ts +188 -0
- package/integrations/bb-plugin-build/src/sprint-execution-service.ts +289 -0
- package/integrations/bb-plugin-build/src/sprint-execution-view.ts +54 -0
- package/integrations/bb-plugin-build/src/task-authoring-model.ts +563 -0
- package/integrations/bb-plugin-build/src/task-authoring-schema.ts +629 -0
- package/integrations/bb-plugin-build/src/task-authoring-service.ts +842 -0
- package/integrations/bb-plugin-build/src/task-authoring-view.ts +1227 -0
- package/integrations/bb-plugin-build/src/task-catalog-schema.ts +46 -0
- package/integrations/bb-plugin-build/src/task-catalog-service.ts +44 -0
- package/integrations/bb-plugin-build/src/task-detail-readback.ts +56 -0
- package/integrations/bb-plugin-build/src/task-detail-schema.ts +171 -0
- package/integrations/bb-plugin-build/src/task-navigation.ts +446 -0
- package/integrations/bb-plugin-build/src/workbench-route.ts +74 -0
- package/package.json +306 -4
- package/schemas/README.md +80 -0
- package/schemas/build.config.schema.json +2110 -0
- package/schemas/config-v1.schema.json +136 -0
- package/schemas/execution-config.schema.json +47 -0
- package/schemas/judge-scoring.schema.json +257 -0
- package/schemas/provider-config.schema.json +179 -0
- package/schemas/telemetry-config.schema.json +79 -0
- package/schemas/user-preferences.schema.json +141 -0
- package/scripts/assert-node-runtime.mjs +146 -0
- package/scripts/preflight-native.mjs +49 -0
- package/scripts/setup-git-hooks.mjs +39 -0
- package/scripts/sync.sh +2871 -0
- package/scripts/write-node-launcher.sh +138 -0
- package/src/resources/gemini/slash-packs/default/plan.toml +15 -0
- package/src/resources/gemini/slash-packs/default/summary.toml +16 -0
- package/src/resources/gemini/slash-packs/default/tests.toml +16 -0
- package/templates/.build-project/README.md +41 -0
- package/templates/.build-project/agents/README.md +50 -0
- package/templates/.build-project/agents/architect.md +10 -0
- package/templates/.build-project/agents/code-reviewer.md +10 -0
- package/templates/.build-project/agents/debugger.md +10 -0
- package/templates/.build-project/agents/documenter.md +10 -0
- package/templates/.build-project/agents/test-automator.md +10 -0
- package/templates/.build-project/config/build.config.jsonc +64 -0
- package/templates/.build-project/config/project-context.template.json +6 -0
- package/templates/.build-project/config/task-type-aliases.presets/kanban.yaml +14 -0
- package/templates/.build-project/config/task-type-aliases.presets/scrum.yaml +17 -0
- package/templates/.build-project/config/task-type-aliases.presets/xp.yaml +12 -0
- package/templates/.build-project/config/task-type-aliases.yaml +29 -0
- package/templates/.build-project/gitignore.template +70 -0
- package/templates/.build-project/task-types/analysis.yaml +38 -0
- package/templates/.build-project/task-types/architecture.yaml +35 -0
- package/templates/.build-project/task-types/doc.yaml +34 -0
- package/templates/.build-project/task-types/feature.yaml +22 -0
- package/templates/.build-project/task-types/general.yaml +4 -0
- package/templates/.build-project/task-types/security.yaml +38 -0
- package/templates/AGENTS.template.md +85 -0
- package/templates/CLAUDE.template.md +1 -0
- package/templates/GEMINI.template.md +1 -0
- package/templates/builtin-workflows/code-review.yaml +73 -0
- package/templates/builtin-workflows/skills/code-review/SKILL.md +61 -0
- package/templates/builtin-workflows/skills/execution-contract-analysis/SKILL.md +24 -0
- package/templates/builtin-workflows/skills/execution-contract-code/SKILL.md +19 -0
- package/templates/builtin-workflows/skills/execution-contract-structured/SKILL.md +17 -0
- package/templates/ci/incident-intake.mjs +787 -0
- package/templates/ci/incidents.yml.template +103 -0
- package/templates/ci/node.yml.template +17 -0
- package/templates/ci/python.yml.template +17 -0
- package/templates/guard-kit/GUARD_SETUP.md.template +258 -0
- package/templates/guard-kit/build-guard.yml.template +189 -0
- package/templates/guard-kit/check.mjs.template +932 -0
- package/templates/guard-kit/config.json.template +7 -0
- package/templates/guard-kit/policy.json.template +1 -0
- package/templates/profiles/README.md +57 -0
- package/templates/profiles/frontier-claude.json +23 -0
- package/templates/profiles/frontier-codex.json +23 -0
|
@@ -0,0 +1,1225 @@
|
|
|
1
|
+
import {
|
|
2
|
+
resolveTaskStatusForStageOutcome
|
|
3
|
+
} from "./chunk-FSJ5TTZ3.js";
|
|
4
|
+
import {
|
|
5
|
+
mapGateStagesToExecutionStages
|
|
6
|
+
} from "./chunk-YTVVTIWJ.js";
|
|
7
|
+
import {
|
|
8
|
+
resolvePlanArtifactPath
|
|
9
|
+
} from "./chunk-V3YFFHDR.js";
|
|
10
|
+
import {
|
|
11
|
+
addTaskToSprint,
|
|
12
|
+
calculateCapacity,
|
|
13
|
+
checkCapacityWarning,
|
|
14
|
+
createSprint,
|
|
15
|
+
listSprints,
|
|
16
|
+
listTasksInSprint,
|
|
17
|
+
refreshSprintLock,
|
|
18
|
+
removeTaskFromSprint
|
|
19
|
+
} from "./chunk-L2CBG5IX.js";
|
|
20
|
+
import {
|
|
21
|
+
clearArchivedTaskIndex,
|
|
22
|
+
createTask,
|
|
23
|
+
getAllTasks,
|
|
24
|
+
getTask,
|
|
25
|
+
updateTaskStatusWithTransitionValidation
|
|
26
|
+
} from "./chunk-7LHJDJB3.js";
|
|
27
|
+
import {
|
|
28
|
+
getPlanningRoot,
|
|
29
|
+
withIndexRegeneration,
|
|
30
|
+
withPlanningLock
|
|
31
|
+
} from "./chunk-CSXLLEGB.js";
|
|
32
|
+
import {
|
|
33
|
+
getBucketArchivePathByKind,
|
|
34
|
+
getBucketPathByKind
|
|
35
|
+
} from "./chunk-V3KLVK7B.js";
|
|
36
|
+
import {
|
|
37
|
+
getProjectRoot
|
|
38
|
+
} from "./chunk-6TRD7TEE.js";
|
|
39
|
+
import {
|
|
40
|
+
signalCoordinator
|
|
41
|
+
} from "./chunk-GC4CRMTS.js";
|
|
42
|
+
import {
|
|
43
|
+
evaluateStaleReclaim
|
|
44
|
+
} from "./chunk-P7CQGPLS.js";
|
|
45
|
+
import {
|
|
46
|
+
redactBlockerContext
|
|
47
|
+
} from "./chunk-XV7NZL4B.js";
|
|
48
|
+
import {
|
|
49
|
+
listMarkdownFilesRecursiveStrict,
|
|
50
|
+
readMarkdownFile,
|
|
51
|
+
writeMarkdownFile
|
|
52
|
+
} from "./chunk-352PCJLK.js";
|
|
53
|
+
import {
|
|
54
|
+
processIsAlive
|
|
55
|
+
} from "./chunk-MT2WAIR3.js";
|
|
56
|
+
import {
|
|
57
|
+
isQuietOutputRequested,
|
|
58
|
+
shouldShowLifecycleDiagnostics
|
|
59
|
+
} from "./chunk-XWIZ6B5S.js";
|
|
60
|
+
import {
|
|
61
|
+
emitCustomWarning,
|
|
62
|
+
findRepoRoot
|
|
63
|
+
} from "./chunk-7VRJHTGZ.js";
|
|
64
|
+
|
|
65
|
+
// src/planning/sprint-bridge.ts
|
|
66
|
+
import * as fs4 from "fs";
|
|
67
|
+
import * as fsp2 from "fs/promises";
|
|
68
|
+
import * as path4 from "path";
|
|
69
|
+
|
|
70
|
+
// src/planning/blocker-telemetry.ts
|
|
71
|
+
import * as fs from "fs/promises";
|
|
72
|
+
import * as path from "path";
|
|
73
|
+
async function appendJsonLine(filePath, line) {
|
|
74
|
+
const handle = await fs.open(filePath, "a");
|
|
75
|
+
try {
|
|
76
|
+
await handle.writeFile(line, "utf-8");
|
|
77
|
+
await handle.sync();
|
|
78
|
+
} finally {
|
|
79
|
+
await handle.close();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function getTelemetryDir() {
|
|
83
|
+
const buildDir = process.env.BUILD_TELEMETRY_DIR || path.join(getProjectRoot(), ".build-project");
|
|
84
|
+
return path.join(buildDir, "telemetry");
|
|
85
|
+
}
|
|
86
|
+
async function emitBlockerTelemetryEvent(event) {
|
|
87
|
+
try {
|
|
88
|
+
const dir = getTelemetryDir();
|
|
89
|
+
await fs.mkdir(dir, { recursive: true });
|
|
90
|
+
const filePath = path.join(dir, "blocker-events.jsonl");
|
|
91
|
+
const line = redactBlockerContext(JSON.stringify(event));
|
|
92
|
+
await appendJsonLine(filePath, `${line}
|
|
93
|
+
`);
|
|
94
|
+
} catch {
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function emitBlockerDetected(runId, blockerId, category, severity, stageIds) {
|
|
98
|
+
return emitBlockerTelemetryEvent({
|
|
99
|
+
event: "blocker_detected",
|
|
100
|
+
runId,
|
|
101
|
+
blockerId,
|
|
102
|
+
category,
|
|
103
|
+
severity,
|
|
104
|
+
stageIds,
|
|
105
|
+
timestamp: Date.now()
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
function emitBlockerRuntimeFailure(runId, stageId, options = {}) {
|
|
109
|
+
return emitBlockerTelemetryEvent({
|
|
110
|
+
event: "blocker_runtime_failure",
|
|
111
|
+
runId,
|
|
112
|
+
blockerId: options.blockerId ?? `runtime:${stageId}`,
|
|
113
|
+
category: options.category ?? "credentials",
|
|
114
|
+
severity: options.severity ?? "nice_to_have",
|
|
115
|
+
stageIds: [stageId],
|
|
116
|
+
runtimeFailureStageId: stageId,
|
|
117
|
+
timestamp: Date.now()
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
function emitSprintBridgeCreated(runId, sprintId, taskCount, planArtifactPath) {
|
|
121
|
+
return emitBlockerTelemetryEvent({
|
|
122
|
+
event: "sprint_bridge_created",
|
|
123
|
+
runId,
|
|
124
|
+
sprintId,
|
|
125
|
+
taskCount,
|
|
126
|
+
planArtifactPath,
|
|
127
|
+
timestamp: Date.now()
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
function emitPlanProvenanceMissing(runId, sprintId, taskCount) {
|
|
131
|
+
return emitBlockerTelemetryEvent({
|
|
132
|
+
event: "plan_provenance_missing",
|
|
133
|
+
runId,
|
|
134
|
+
sprintId,
|
|
135
|
+
taskCount,
|
|
136
|
+
timestamp: Date.now()
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
function emitSprintBridgeTaskStatusUpdated(runId, sprintId, taskId, fromStatus, toStatus) {
|
|
140
|
+
return emitBlockerTelemetryEvent({
|
|
141
|
+
event: "sprint_bridge_task_status_updated",
|
|
142
|
+
runId,
|
|
143
|
+
sprintId,
|
|
144
|
+
taskId,
|
|
145
|
+
fromStatus,
|
|
146
|
+
toStatus,
|
|
147
|
+
timestamp: Date.now()
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
function emitSprintBridgeRolledBack(runId, sprintId, taskCount) {
|
|
151
|
+
return emitBlockerTelemetryEvent({
|
|
152
|
+
event: "sprint_bridge_rolled_back",
|
|
153
|
+
runId,
|
|
154
|
+
sprintId,
|
|
155
|
+
taskCount,
|
|
156
|
+
rollbackStatus: "success",
|
|
157
|
+
timestamp: Date.now()
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
function emitSprintBridgeRollbackFailed(runId, sprintId, taskCount, errorMessage) {
|
|
161
|
+
return emitBlockerTelemetryEvent({
|
|
162
|
+
event: "sprint_bridge_rollback_failed",
|
|
163
|
+
runId,
|
|
164
|
+
sprintId,
|
|
165
|
+
taskCount,
|
|
166
|
+
rollbackStatus: "failed",
|
|
167
|
+
errorMessage,
|
|
168
|
+
timestamp: Date.now()
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
function emitDecompositionCost(runId, provider, model, durationMs, tokenUsage, timing) {
|
|
172
|
+
return emitBlockerTelemetryEvent({
|
|
173
|
+
event: "decomposition_cost",
|
|
174
|
+
runId,
|
|
175
|
+
provider,
|
|
176
|
+
model,
|
|
177
|
+
durationMs,
|
|
178
|
+
firstOutputMs: timing?.firstOutputMs,
|
|
179
|
+
longestSilentSpanMs: timing?.longestSilentSpanMs,
|
|
180
|
+
tokenUsage,
|
|
181
|
+
timestamp: Date.now()
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
function emitTaskTypeOverride(options) {
|
|
185
|
+
return emitBlockerTelemetryEvent({
|
|
186
|
+
event: "task_type_override",
|
|
187
|
+
...options,
|
|
188
|
+
timestamp: Date.now()
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
function emitSplitShadowComparison(options) {
|
|
192
|
+
return emitBlockerTelemetryEvent({
|
|
193
|
+
event: "split_shadow_comparison",
|
|
194
|
+
...options,
|
|
195
|
+
timestamp: Date.now()
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// src/planning/ingest-lock.ts
|
|
200
|
+
import { randomUUID } from "crypto";
|
|
201
|
+
import * as fs2 from "fs/promises";
|
|
202
|
+
import * as os from "os";
|
|
203
|
+
import * as path2 from "path";
|
|
204
|
+
var DEFAULTS = {
|
|
205
|
+
timeoutMs: 6e4,
|
|
206
|
+
staleThresholdMs: 3e5,
|
|
207
|
+
initialRetryMs: 50,
|
|
208
|
+
maxRetryMs: 2e3,
|
|
209
|
+
backoffFactor: 2
|
|
210
|
+
};
|
|
211
|
+
var CROSS_HOST_STALE_MULTIPLIER = 3;
|
|
212
|
+
function sleep(ms) {
|
|
213
|
+
return new Promise((resolve2) => setTimeout(resolve2, ms));
|
|
214
|
+
}
|
|
215
|
+
function getHostIdentity() {
|
|
216
|
+
const envHostname = process.env.HOSTNAME?.trim();
|
|
217
|
+
return envHostname || os.hostname() || "unknown";
|
|
218
|
+
}
|
|
219
|
+
async function readLockPayload(lockFile) {
|
|
220
|
+
const read = await readLockPayloadWithRaw(lockFile);
|
|
221
|
+
return read?.payload ?? null;
|
|
222
|
+
}
|
|
223
|
+
async function readLockPayloadWithRaw(lockFile) {
|
|
224
|
+
try {
|
|
225
|
+
const content = await fs2.readFile(lockFile, "utf-8");
|
|
226
|
+
let payload = null;
|
|
227
|
+
try {
|
|
228
|
+
payload = JSON.parse(content);
|
|
229
|
+
} catch {
|
|
230
|
+
payload = null;
|
|
231
|
+
}
|
|
232
|
+
return { payload, rawContent: content };
|
|
233
|
+
} catch {
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
async function isLockStaleAndAbandoned(lockFile, staleThresholdMs) {
|
|
238
|
+
try {
|
|
239
|
+
const stat2 = await fs2.stat(lockFile);
|
|
240
|
+
const ageMs = Date.now() - stat2.mtimeMs;
|
|
241
|
+
const read = await readLockPayloadWithRaw(lockFile);
|
|
242
|
+
if (!read) {
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
const payload = read.payload;
|
|
246
|
+
let holder = null;
|
|
247
|
+
if (payload && typeof payload.pid === "number") {
|
|
248
|
+
const currentHostname = getHostIdentity();
|
|
249
|
+
const hasUnknownHost = payload.hostname === "unknown" || currentHostname === "unknown";
|
|
250
|
+
const sameHost = !hasUnknownHost && payload.hostname === currentHostname;
|
|
251
|
+
holder = { sameHost, pidAlive: sameHost ? processIsAlive(payload.pid) : false };
|
|
252
|
+
}
|
|
253
|
+
const decision = evaluateStaleReclaim(
|
|
254
|
+
{ ageMs, holder },
|
|
255
|
+
{
|
|
256
|
+
staleMs: staleThresholdMs,
|
|
257
|
+
corruptPayload: "reclaim",
|
|
258
|
+
foreignHost: { kind: "after-multiplier", multiplier: CROSS_HOST_STALE_MULTIPLIER },
|
|
259
|
+
// Preserve the original strict-greater-than age boundary (age <= stale
|
|
260
|
+
// holds; reclaim only strictly past stale / past 3x for foreign hosts).
|
|
261
|
+
ageBoundary: "gt"
|
|
262
|
+
}
|
|
263
|
+
);
|
|
264
|
+
return decision === "reclaim" ? { dev: stat2.dev, ino: stat2.ino, rawContent: read.rawContent } : null;
|
|
265
|
+
} catch {
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
async function releaseOwnLock(lockFile, snapshot) {
|
|
270
|
+
try {
|
|
271
|
+
if (!await lockSnapshotStillMatches(lockFile, snapshot)) {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
try {
|
|
275
|
+
await fs2.unlink(lockFile);
|
|
276
|
+
} catch (error) {
|
|
277
|
+
if (error.code !== "ENOENT") {
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
} finally {
|
|
281
|
+
await snapshot.fileHandle?.close().catch(() => {
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
async function lockSnapshotStillMatches(lockFile, snapshot) {
|
|
286
|
+
try {
|
|
287
|
+
const [openFileStat, stat2, rawContent] = await Promise.all([
|
|
288
|
+
snapshot.fileHandle?.stat(),
|
|
289
|
+
fs2.stat(lockFile),
|
|
290
|
+
fs2.readFile(lockFile, "utf-8")
|
|
291
|
+
]);
|
|
292
|
+
const acquiredDev = openFileStat?.dev ?? snapshot.dev;
|
|
293
|
+
const acquiredIno = openFileStat?.ino ?? snapshot.ino;
|
|
294
|
+
return stat2.dev === acquiredDev && stat2.ino === acquiredIno && rawContent === snapshot.rawContent;
|
|
295
|
+
} catch {
|
|
296
|
+
return false;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
async function forceRelease(lockFile, snapshot) {
|
|
300
|
+
if (!await lockSnapshotStillMatches(lockFile, snapshot)) {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
try {
|
|
304
|
+
await fs2.unlink(lockFile);
|
|
305
|
+
} catch (error) {
|
|
306
|
+
if (error.code !== "ENOENT") {
|
|
307
|
+
throw error;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
async function withIngestLock(planningRoot, fn, options) {
|
|
312
|
+
const timeoutMs = options?.timeoutMs ?? DEFAULTS.timeoutMs;
|
|
313
|
+
const staleThresholdMs = options?.staleThresholdMs ?? DEFAULTS.staleThresholdMs;
|
|
314
|
+
const initialRetryMs = options?.initialRetryMs ?? DEFAULTS.initialRetryMs;
|
|
315
|
+
const maxRetryMs = options?.maxRetryMs ?? DEFAULTS.maxRetryMs;
|
|
316
|
+
const backoffFactor = options?.backoffFactor ?? DEFAULTS.backoffFactor;
|
|
317
|
+
const operation = options?.operation ?? "ingest";
|
|
318
|
+
const lockDir = options?.lockDir ?? path2.join(planningRoot, ".build-project", "planning", "locks");
|
|
319
|
+
const lockFile = path2.join(lockDir, "ingest.lock");
|
|
320
|
+
await fs2.mkdir(lockDir, { recursive: true });
|
|
321
|
+
const startTime = Date.now();
|
|
322
|
+
let retryMs = initialRetryMs;
|
|
323
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
324
|
+
const staleSnapshot = await isLockStaleAndAbandoned(lockFile, staleThresholdMs);
|
|
325
|
+
if (staleSnapshot) {
|
|
326
|
+
await forceRelease(lockFile, staleSnapshot);
|
|
327
|
+
}
|
|
328
|
+
try {
|
|
329
|
+
const ownerId = randomUUID();
|
|
330
|
+
const payload = {
|
|
331
|
+
pid: process.pid,
|
|
332
|
+
hostname: getHostIdentity(),
|
|
333
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
334
|
+
operation,
|
|
335
|
+
ownerId
|
|
336
|
+
};
|
|
337
|
+
const rawContent = JSON.stringify(payload, null, 2);
|
|
338
|
+
const fileHandle = await fs2.open(lockFile, "wx");
|
|
339
|
+
let lockSnapshot;
|
|
340
|
+
try {
|
|
341
|
+
await fileHandle.writeFile(rawContent, "utf-8");
|
|
342
|
+
const lockStat = await fileHandle.stat();
|
|
343
|
+
lockSnapshot = { dev: lockStat.dev, ino: lockStat.ino, rawContent, fileHandle };
|
|
344
|
+
} catch (writeError) {
|
|
345
|
+
await fileHandle.close().catch(() => {
|
|
346
|
+
});
|
|
347
|
+
await fs2.unlink(lockFile).catch(() => {
|
|
348
|
+
});
|
|
349
|
+
throw writeError;
|
|
350
|
+
}
|
|
351
|
+
const cleanupName = `planning-ingest-lock:${process.pid}:${operation}`;
|
|
352
|
+
const release = async () => {
|
|
353
|
+
try {
|
|
354
|
+
await releaseOwnLock(lockFile, lockSnapshot);
|
|
355
|
+
} finally {
|
|
356
|
+
signalCoordinator.unregister(cleanupName);
|
|
357
|
+
}
|
|
358
|
+
};
|
|
359
|
+
signalCoordinator.register(cleanupName, release, {
|
|
360
|
+
priority: "critical",
|
|
361
|
+
phase: "artifact-cleanup"
|
|
362
|
+
});
|
|
363
|
+
try {
|
|
364
|
+
return await fn();
|
|
365
|
+
} finally {
|
|
366
|
+
await release();
|
|
367
|
+
}
|
|
368
|
+
} catch (error) {
|
|
369
|
+
if (error.code === "EEXIST") {
|
|
370
|
+
await sleep(retryMs);
|
|
371
|
+
retryMs = Math.min(retryMs * backoffFactor, maxRetryMs);
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
throw error;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
const lockInfo = await readLockPayload(lockFile);
|
|
378
|
+
throw new Error(
|
|
379
|
+
`Ingest lock acquisition timed out after ${timeoutMs}ms. Lock held by PID ${lockInfo?.pid ?? "unknown"} since ${lockInfo?.createdAt ?? "unknown"} (operation: ${lockInfo?.operation ?? "unknown"})`
|
|
380
|
+
);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// src/planning/sprint-bridge-rollback.ts
|
|
384
|
+
import * as fs3 from "fs";
|
|
385
|
+
import * as fsp from "fs/promises";
|
|
386
|
+
import * as path3 from "path";
|
|
387
|
+
async function rollbackSprintBridge(result) {
|
|
388
|
+
const repoRoot = findRepoRoot();
|
|
389
|
+
const totalTaskCount = result.createdTaskIds.length + result.reattachedTaskIds.length;
|
|
390
|
+
try {
|
|
391
|
+
await withIngestLock(
|
|
392
|
+
repoRoot,
|
|
393
|
+
async () => {
|
|
394
|
+
await rollbackSprintBridgeArtifacts(result);
|
|
395
|
+
},
|
|
396
|
+
{ operation: "sprint-bridge-rollback" }
|
|
397
|
+
);
|
|
398
|
+
if (result.runId) {
|
|
399
|
+
await emitSprintBridgeRolledBack(result.runId, result.sprintId, totalTaskCount);
|
|
400
|
+
}
|
|
401
|
+
} catch (error) {
|
|
402
|
+
if (result.runId) {
|
|
403
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
404
|
+
await emitSprintBridgeRollbackFailed(result.runId, result.sprintId, totalTaskCount, message);
|
|
405
|
+
}
|
|
406
|
+
throw error;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
async function rollbackSprintBridgeArtifacts(result) {
|
|
410
|
+
const planningRoot = getPlanningRoot();
|
|
411
|
+
const tasksDir = getBucketPathByKind("task", planningRoot);
|
|
412
|
+
const sprintsDir = getBucketPathByKind("sprint", planningRoot);
|
|
413
|
+
const sprintPath = path3.join(sprintsDir, `${result.sprintId}.md`);
|
|
414
|
+
const rollbackErrors = [];
|
|
415
|
+
const recordRollbackError = (operation, error) => {
|
|
416
|
+
const nodeError = error;
|
|
417
|
+
if (nodeError?.code === "ENOENT") {
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
421
|
+
rollbackErrors.push(`${operation}: ${message}`);
|
|
422
|
+
};
|
|
423
|
+
await withIndexRegeneration(planningRoot, async () => {
|
|
424
|
+
const detachedCreatedTaskIds = /* @__PURE__ */ new Set();
|
|
425
|
+
if (!result.createdSprint) {
|
|
426
|
+
for (const taskId of result.createdTaskIds) {
|
|
427
|
+
await removeTaskFromSprint(result.sprintId, taskId).then(() => {
|
|
428
|
+
detachedCreatedTaskIds.add(taskId);
|
|
429
|
+
}).catch((error) => recordRollbackError(`detach created task ${taskId}`, error));
|
|
430
|
+
}
|
|
431
|
+
for (const taskId of result.reattachedTaskIds) {
|
|
432
|
+
await removeTaskFromSprint(result.sprintId, taskId).catch(
|
|
433
|
+
(error) => recordRollbackError(`detach reattached task ${taskId}`, error)
|
|
434
|
+
);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
for (const [taskId, snapshot] of result.reusedTaskSnapshots ?? []) {
|
|
438
|
+
await fsp.writeFile(snapshot.filePath, snapshot.contents).catch((error) => recordRollbackError(`restore reused task ${taskId}`, error));
|
|
439
|
+
}
|
|
440
|
+
const deletableTaskIds = result.createdTaskIds.filter(
|
|
441
|
+
(taskId) => result.createdSprint || Boolean(result.reusedSprintSnapshot) || detachedCreatedTaskIds.has(taskId)
|
|
442
|
+
);
|
|
443
|
+
for (const taskId of deletableTaskIds) {
|
|
444
|
+
await fsp.unlink(path3.join(tasksDir, `${taskId}.md`)).catch((error) => recordRollbackError(`delete task ${taskId}`, error));
|
|
445
|
+
}
|
|
446
|
+
await deleteArchivedTaskCopies(planningRoot, deletableTaskIds, recordRollbackError);
|
|
447
|
+
if (result.createdSprint) {
|
|
448
|
+
await fsp.unlink(sprintPath).catch((error) => recordRollbackError(`delete sprint ${result.sprintId}`, error));
|
|
449
|
+
} else if (result.reusedSprintSnapshot) {
|
|
450
|
+
await fsp.writeFile(sprintPath, result.reusedSprintSnapshot);
|
|
451
|
+
}
|
|
452
|
+
await pruneCreatedPlanningDirs(result.createdPlanningDirs ?? []);
|
|
453
|
+
if (rollbackErrors.length > 0) {
|
|
454
|
+
throw new Error(`Rollback incomplete: ${rollbackErrors.join("; ")}`);
|
|
455
|
+
}
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
function listMissingBucketDirs(planningRoot) {
|
|
459
|
+
const roots = [path3.resolve(planningRoot)];
|
|
460
|
+
try {
|
|
461
|
+
roots.push(fs3.realpathSync(planningRoot));
|
|
462
|
+
} catch {
|
|
463
|
+
}
|
|
464
|
+
const missing = /* @__PURE__ */ new Set();
|
|
465
|
+
for (const kind of ["sprint", "task"]) {
|
|
466
|
+
let dir = path3.resolve(getBucketPathByKind(kind, planningRoot));
|
|
467
|
+
while (roots.some((root) => isStrictlyInside(root, dir)) && !fs3.existsSync(dir)) {
|
|
468
|
+
missing.add(dir);
|
|
469
|
+
dir = path3.dirname(dir);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
return [...missing];
|
|
473
|
+
}
|
|
474
|
+
function isStrictlyInside(root, dir) {
|
|
475
|
+
const relative2 = path3.relative(root, dir);
|
|
476
|
+
return relative2 !== "" && !relative2.startsWith("..") && !path3.isAbsolute(relative2);
|
|
477
|
+
}
|
|
478
|
+
async function pruneCreatedPlanningDirs(dirs) {
|
|
479
|
+
const deepestFirst = [...dirs].sort((a, b) => b.length - a.length);
|
|
480
|
+
for (const dir of deepestFirst) {
|
|
481
|
+
await removeEmptyDirTree(dir);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
async function removeEmptyDirTree(dir) {
|
|
485
|
+
const entries = await fsp.readdir(dir, { withFileTypes: true }).catch(() => []);
|
|
486
|
+
for (const entry of entries) {
|
|
487
|
+
if (entry.isDirectory()) await removeEmptyDirTree(path3.join(dir, entry.name));
|
|
488
|
+
}
|
|
489
|
+
await fsp.rmdir(dir).catch(() => void 0);
|
|
490
|
+
}
|
|
491
|
+
async function deleteArchivedTaskCopies(planningRoot, taskIds, recordRollbackError) {
|
|
492
|
+
if (taskIds.length === 0) return;
|
|
493
|
+
const wanted = new Set(taskIds.map((taskId) => `${taskId}.md`));
|
|
494
|
+
let archivedFiles;
|
|
495
|
+
try {
|
|
496
|
+
archivedFiles = await listMarkdownFilesRecursiveStrict(
|
|
497
|
+
getBucketArchivePathByKind("task", planningRoot)
|
|
498
|
+
);
|
|
499
|
+
} catch (error) {
|
|
500
|
+
recordRollbackError("list archived tasks", error);
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
let deleted = false;
|
|
504
|
+
for (const filePath of archivedFiles) {
|
|
505
|
+
const fileName = path3.basename(filePath);
|
|
506
|
+
if (!wanted.has(fileName)) continue;
|
|
507
|
+
await fsp.unlink(filePath).then(() => {
|
|
508
|
+
deleted = true;
|
|
509
|
+
}).catch(
|
|
510
|
+
(error) => recordRollbackError(`delete archived task ${fileName.slice(0, -3)}`, error)
|
|
511
|
+
);
|
|
512
|
+
}
|
|
513
|
+
if (deleted) clearArchivedTaskIndex();
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
// src/planning/stage-skip-dependencies.ts
|
|
517
|
+
function buildStageTaskOwnership(stageToTaskMap, gateToExecution, workflow) {
|
|
518
|
+
const owners = new Map(stageToTaskMap);
|
|
519
|
+
for (const [gateStageId, executionStageId] of gateToExecution) {
|
|
520
|
+
const taskId = stageToTaskMap.get(executionStageId);
|
|
521
|
+
if (!taskId) continue;
|
|
522
|
+
owners.set(gateStageId, taskId);
|
|
523
|
+
const reviewerStageId = workflow?.stages.find((stage) => stage.id === gateStageId)?.deps?.[0];
|
|
524
|
+
if (reviewerStageId) owners.set(reviewerStageId, taskId);
|
|
525
|
+
}
|
|
526
|
+
return owners;
|
|
527
|
+
}
|
|
528
|
+
function createDeclaredDependencyReader(readTaskDependencies) {
|
|
529
|
+
const cache = /* @__PURE__ */ new Map();
|
|
530
|
+
return async (taskId) => {
|
|
531
|
+
const cached = cache.get(taskId);
|
|
532
|
+
if (cached) return cached;
|
|
533
|
+
let declared = [];
|
|
534
|
+
try {
|
|
535
|
+
declared = await readTaskDependencies(taskId) ?? [];
|
|
536
|
+
} catch {
|
|
537
|
+
}
|
|
538
|
+
cache.set(taskId, declared);
|
|
539
|
+
return declared;
|
|
540
|
+
};
|
|
541
|
+
}
|
|
542
|
+
async function skipHasUnmetDeclaredDependency(event, taskId, stageOwners, readDeclaredDependencies) {
|
|
543
|
+
const unmetDependencyStageIds = event.metadata?.unmetDependencyStageIds;
|
|
544
|
+
if (event.eventType !== "skipped" || !unmetDependencyStageIds) return void 0;
|
|
545
|
+
const unmetOwners = new Set(
|
|
546
|
+
unmetDependencyStageIds.map((stageId) => stageOwners.get(stageId)).filter((owner) => owner !== void 0 && owner !== taskId)
|
|
547
|
+
);
|
|
548
|
+
if (unmetOwners.size === 0) return false;
|
|
549
|
+
const declared = await readDeclaredDependencies(taskId);
|
|
550
|
+
return declared.some((dependencyTaskId) => unmetOwners.has(dependencyTaskId));
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
// src/planning/sprint-bridge.ts
|
|
554
|
+
function isDuplicateSprintDateError(error) {
|
|
555
|
+
if (!error || typeof error !== "object") return false;
|
|
556
|
+
const candidate = error;
|
|
557
|
+
if (candidate.code === "SPRINT_ALREADY_EXISTS_FOR_DATE") return true;
|
|
558
|
+
if (candidate.name === "SprintAlreadyExistsError") return true;
|
|
559
|
+
return typeof candidate.message === "string" && candidate.message.includes("Sprint already exists for date");
|
|
560
|
+
}
|
|
561
|
+
function isSprintDateRangeOverlapError(error) {
|
|
562
|
+
if (!error || typeof error !== "object") return false;
|
|
563
|
+
const message = error.message;
|
|
564
|
+
return typeof message === "string" && message.includes("Sprint date range overlaps existing sprint");
|
|
565
|
+
}
|
|
566
|
+
function isSprintCollisionError(error) {
|
|
567
|
+
return isDuplicateSprintDateError(error) || isSprintDateRangeOverlapError(error);
|
|
568
|
+
}
|
|
569
|
+
function parseDateOnly(value) {
|
|
570
|
+
const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value.trim());
|
|
571
|
+
if (!match) return null;
|
|
572
|
+
const year = Number(match[1]);
|
|
573
|
+
const month = Number(match[2]);
|
|
574
|
+
const day = Number(match[3]);
|
|
575
|
+
const date = new Date(Date.UTC(year, month - 1, day));
|
|
576
|
+
if (date.getUTCFullYear() !== year || date.getUTCMonth() !== month - 1 || date.getUTCDate() !== day) {
|
|
577
|
+
return null;
|
|
578
|
+
}
|
|
579
|
+
return date;
|
|
580
|
+
}
|
|
581
|
+
function dateRangesOverlap(startA, endA, startB, endB) {
|
|
582
|
+
const aStart = parseDateOnly(startA);
|
|
583
|
+
const aEnd = parseDateOnly(endA);
|
|
584
|
+
const bStart = parseDateOnly(startB);
|
|
585
|
+
const bEnd = parseDateOnly(endB);
|
|
586
|
+
if (!aStart || !aEnd || !bStart || !bEnd) return false;
|
|
587
|
+
return aStart.getTime() < bEnd.getTime() && aEnd.getTime() > bStart.getTime();
|
|
588
|
+
}
|
|
589
|
+
function findReusableSprint(sprints, startDate, endDate) {
|
|
590
|
+
const active = sprints.filter(
|
|
591
|
+
(candidate) => candidate.status === "planning" || candidate.status === "active"
|
|
592
|
+
);
|
|
593
|
+
const sameStart = active.find((candidate) => candidate.startDate === startDate);
|
|
594
|
+
if (sameStart) return sameStart;
|
|
595
|
+
return active.find(
|
|
596
|
+
(candidate) => dateRangesOverlap(startDate, endDate, candidate.startDate, candidate.endDate)
|
|
597
|
+
);
|
|
598
|
+
}
|
|
599
|
+
function emitLifecycleDiagnostic(message, error) {
|
|
600
|
+
if (isQuietOutputRequested() || !shouldShowLifecycleDiagnostics()) {
|
|
601
|
+
return;
|
|
602
|
+
}
|
|
603
|
+
process.stderr.write(`${message} ${error instanceof Error ? error.message : String(error)}
|
|
604
|
+
`);
|
|
605
|
+
}
|
|
606
|
+
function emitSprintBridgeDiagnostic(message, metadata) {
|
|
607
|
+
emitCustomWarning(
|
|
608
|
+
"WARN" /* WARN */,
|
|
609
|
+
"configuration" /* CONFIGURATION */,
|
|
610
|
+
message,
|
|
611
|
+
{
|
|
612
|
+
subsystem: "planning/sprint-bridge",
|
|
613
|
+
executionPhase: "execution"
|
|
614
|
+
},
|
|
615
|
+
{
|
|
616
|
+
metadata,
|
|
617
|
+
skipConsole: isQuietOutputRequested() || !shouldShowLifecycleDiagnostics()
|
|
618
|
+
}
|
|
619
|
+
);
|
|
620
|
+
}
|
|
621
|
+
function topologicalSort(stages) {
|
|
622
|
+
const stageMap = new Map(stages.map((s) => [s.id, s]));
|
|
623
|
+
const visited = /* @__PURE__ */ new Set();
|
|
624
|
+
const visiting = /* @__PURE__ */ new Set();
|
|
625
|
+
const sorted = [];
|
|
626
|
+
function visit(id) {
|
|
627
|
+
if (visited.has(id)) return;
|
|
628
|
+
if (visiting.has(id)) {
|
|
629
|
+
throw new Error(`Cyclic stage dependency detected at ${id}`);
|
|
630
|
+
}
|
|
631
|
+
visiting.add(id);
|
|
632
|
+
const stage = stageMap.get(id);
|
|
633
|
+
if (!stage) {
|
|
634
|
+
visiting.delete(id);
|
|
635
|
+
return;
|
|
636
|
+
}
|
|
637
|
+
for (const dep of stage.deps ?? []) {
|
|
638
|
+
visit(dep);
|
|
639
|
+
}
|
|
640
|
+
visiting.delete(id);
|
|
641
|
+
visited.add(id);
|
|
642
|
+
sorted.push(stage);
|
|
643
|
+
}
|
|
644
|
+
for (const stage of stages) {
|
|
645
|
+
visit(stage.id);
|
|
646
|
+
}
|
|
647
|
+
return sorted;
|
|
648
|
+
}
|
|
649
|
+
function toStageType(value) {
|
|
650
|
+
if (value === "standard" || value === "competition" || value === "verify" || value === "refinement" || value === "autoloop" || value === "orchestrator") {
|
|
651
|
+
return value;
|
|
652
|
+
}
|
|
653
|
+
return void 0;
|
|
654
|
+
}
|
|
655
|
+
function deriveStageRuntimeOptions(stage, plan) {
|
|
656
|
+
let durationMs = stage.estimatedDurationMs;
|
|
657
|
+
if (!(typeof durationMs === "number" && Number.isFinite(durationMs) && durationMs > 0) && typeof plan?.estimatedDurationMs === "number" && Number.isFinite(plan.estimatedDurationMs) && plan.estimatedDurationMs > 0) {
|
|
658
|
+
durationMs = plan.estimatedDurationMs / Math.max(1, plan.stageCount ?? 1);
|
|
659
|
+
}
|
|
660
|
+
if (typeof durationMs === "number" && Number.isFinite(durationMs) && durationMs > 0) {
|
|
661
|
+
return {
|
|
662
|
+
expectedRuntimeMinutes: Math.max(1, Math.round(durationMs / 6e4)),
|
|
663
|
+
runtimeEstimateProvenance: "explicit"
|
|
664
|
+
};
|
|
665
|
+
}
|
|
666
|
+
return {};
|
|
667
|
+
}
|
|
668
|
+
function normalizePlanArtifactPath(planArtifactPath) {
|
|
669
|
+
if (typeof planArtifactPath !== "string") return void 0;
|
|
670
|
+
const normalized = path4.posix.normalize(planArtifactPath.replace(/\\/g, "/").trim());
|
|
671
|
+
return normalized.length > 0 && normalized !== "." ? normalized : void 0;
|
|
672
|
+
}
|
|
673
|
+
function normalizeStageDescription(description) {
|
|
674
|
+
if (typeof description !== "string") return void 0;
|
|
675
|
+
const normalized = description.trim().replace(/\s+/g, " ");
|
|
676
|
+
return normalized.length > 0 ? normalized : void 0;
|
|
677
|
+
}
|
|
678
|
+
var MAX_TASK_TITLE_LENGTH = 120;
|
|
679
|
+
function truncateTaskTitle(title) {
|
|
680
|
+
if (title.length <= MAX_TASK_TITLE_LENGTH) return title;
|
|
681
|
+
return `${title.slice(0, MAX_TASK_TITLE_LENGTH - 1).trimEnd()}\u2026`;
|
|
682
|
+
}
|
|
683
|
+
function deriveTaskTitleFromStage(stage) {
|
|
684
|
+
const name = stage.name?.trim();
|
|
685
|
+
if (name) return truncateTaskTitle(name);
|
|
686
|
+
const desc = (stage.description ?? "").trim();
|
|
687
|
+
if (desc.length === 0) return stage.id;
|
|
688
|
+
const firstSentence = desc.split(/(?<=[.!?])\s+|\n+/, 1)[0]?.trim() ?? desc;
|
|
689
|
+
const candidate = firstSentence.length > 0 ? firstSentence : desc;
|
|
690
|
+
return truncateTaskTitle(candidate);
|
|
691
|
+
}
|
|
692
|
+
function buildStageDedupKey(planArtifactPath, stageId, intentHash) {
|
|
693
|
+
if (intentHash) {
|
|
694
|
+
return `intent:${intentHash}::${stageId}`;
|
|
695
|
+
}
|
|
696
|
+
const normalizedPlanArtifactPath = normalizePlanArtifactPath(planArtifactPath);
|
|
697
|
+
if (!normalizedPlanArtifactPath) {
|
|
698
|
+
return void 0;
|
|
699
|
+
}
|
|
700
|
+
return `${normalizedPlanArtifactPath}::${stageId}`;
|
|
701
|
+
}
|
|
702
|
+
function validatePlanStages(stages) {
|
|
703
|
+
const stageIds = stages.map((stage) => stage.id);
|
|
704
|
+
const duplicateIds = stageIds.filter((id, index) => stageIds.indexOf(id) !== index);
|
|
705
|
+
if (duplicateIds.length > 0) {
|
|
706
|
+
throw new Error(`Duplicate stage IDs in plan: ${[...new Set(duplicateIds)].join(", ")}`);
|
|
707
|
+
}
|
|
708
|
+
const knownStageIds = new Set(stageIds);
|
|
709
|
+
for (const stage of stages) {
|
|
710
|
+
const unknownDeps = (stage.deps ?? []).filter((dep) => !knownStageIds.has(dep));
|
|
711
|
+
if (unknownDeps.length > 0) {
|
|
712
|
+
throw new Error(
|
|
713
|
+
`Plan stage ${stage.id} references unknown dependency stage(s): ${unknownDeps.join(", ")}`
|
|
714
|
+
);
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
return topologicalSort(stages);
|
|
718
|
+
}
|
|
719
|
+
async function snapshotTaskFile(taskId, tasksDir) {
|
|
720
|
+
const filePath = path4.join(tasksDir, `${taskId}.md`);
|
|
721
|
+
try {
|
|
722
|
+
return { filePath, contents: await fsp2.readFile(filePath) };
|
|
723
|
+
} catch {
|
|
724
|
+
return void 0;
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
async function setTaskSprintId(taskPath, sprintId) {
|
|
728
|
+
const { frontMatter, body } = await readMarkdownFile(taskPath);
|
|
729
|
+
const current = frontMatter;
|
|
730
|
+
const rawTask = {
|
|
731
|
+
...current,
|
|
732
|
+
sprintId,
|
|
733
|
+
updated_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
734
|
+
// Managed task writes retain the monotonic version under the planning lock.
|
|
735
|
+
version: (typeof current.version === "number" ? current.version : 0) + 1
|
|
736
|
+
};
|
|
737
|
+
delete rawTask.sprint_id;
|
|
738
|
+
await writeMarkdownFile(taskPath, rawTask, body);
|
|
739
|
+
}
|
|
740
|
+
async function createSprintFromPlan(plan, options) {
|
|
741
|
+
const repoRoot = findRepoRoot();
|
|
742
|
+
return withIngestLock(
|
|
743
|
+
repoRoot,
|
|
744
|
+
() => withPlanningLock(getPlanningRoot(), async () => {
|
|
745
|
+
const now = /* @__PURE__ */ new Date();
|
|
746
|
+
const startDate = now.toISOString().split("T")[0];
|
|
747
|
+
const endDate = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1e3).toISOString().split("T")[0];
|
|
748
|
+
const sprintName = options.sprintName ?? `auto-${plan.goal.slice(0, 40).replace(/\s+/g, "-").toLowerCase()}`;
|
|
749
|
+
if (options.planArtifactPath) {
|
|
750
|
+
const resolvedPath = resolvePlanArtifactPath(options.planArtifactPath, repoRoot);
|
|
751
|
+
if (!fs4.existsSync(resolvedPath)) {
|
|
752
|
+
throw new Error(`Plan artifact not found: ${options.planArtifactPath}`);
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
const sortedStages = validatePlanStages(plan.subStages);
|
|
756
|
+
const shouldReuseExistingSprint = options.reuseExistingSprint !== false;
|
|
757
|
+
let reusingExistingSprint = false;
|
|
758
|
+
let reusedSprintSnapshot;
|
|
759
|
+
const planningRoot = getPlanningRoot();
|
|
760
|
+
const createdPlanningDirs = listMissingBucketDirs(planningRoot);
|
|
761
|
+
const sprint = await createSprint(sprintName, startDate, endDate, {
|
|
762
|
+
allowDuplicateStartDate: !shouldReuseExistingSprint
|
|
763
|
+
}).catch(async (error) => {
|
|
764
|
+
if (!isSprintCollisionError(error)) {
|
|
765
|
+
throw error;
|
|
766
|
+
}
|
|
767
|
+
if (!shouldReuseExistingSprint) {
|
|
768
|
+
throw error;
|
|
769
|
+
}
|
|
770
|
+
const existing = await listSprints(false);
|
|
771
|
+
const matching = findReusableSprint(existing, startDate, endDate);
|
|
772
|
+
if (!matching) {
|
|
773
|
+
throw error;
|
|
774
|
+
}
|
|
775
|
+
reusingExistingSprint = true;
|
|
776
|
+
const sprintsDir = getBucketPathByKind("sprint", planningRoot);
|
|
777
|
+
reusedSprintSnapshot = await fsp2.readFile(path4.join(sprintsDir, `${matching.id}.md`));
|
|
778
|
+
const reuseReason = matching.startDate === startDate ? `started ${startDate}` : `overlaps ${matching.startDate} to ${matching.endDate}`;
|
|
779
|
+
emitSprintBridgeDiagnostic(`Reusing existing sprint ${matching.id} (${reuseReason})`);
|
|
780
|
+
return matching;
|
|
781
|
+
});
|
|
782
|
+
const sprintId = sprint.id;
|
|
783
|
+
const tasksDir = getBucketPathByKind("task", planningRoot);
|
|
784
|
+
const existingStageTaskIds = /* @__PURE__ */ new Map();
|
|
785
|
+
if (reusingExistingSprint) {
|
|
786
|
+
const sprintMemberTaskIds = new Set(
|
|
787
|
+
(await listTasksInSprint(sprintId)).map((task) => task.id)
|
|
788
|
+
);
|
|
789
|
+
const allTaskRecords = await getAllTasks({ includeArchive: true });
|
|
790
|
+
for (const taskRecord of allTaskRecords) {
|
|
791
|
+
const t = taskRecord.yaml;
|
|
792
|
+
if (!t.planStageId) continue;
|
|
793
|
+
const dedupKey = buildStageDedupKey(
|
|
794
|
+
t.planArtifactPath,
|
|
795
|
+
t.planStageId,
|
|
796
|
+
t.planIntentHash
|
|
797
|
+
);
|
|
798
|
+
if (!dedupKey) continue;
|
|
799
|
+
const inSprint = t.sprintId === sprintId && sprintMemberTaskIds.has(t.id);
|
|
800
|
+
const current = existingStageTaskIds.get(dedupKey);
|
|
801
|
+
if (!current || !current.inSprint && inSprint) {
|
|
802
|
+
existingStageTaskIds.set(dedupKey, {
|
|
803
|
+
taskId: t.id,
|
|
804
|
+
inSprint,
|
|
805
|
+
title: t.title,
|
|
806
|
+
filePath: taskRecord.filePath
|
|
807
|
+
});
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
const matchingExistingStageCount = sortedStages.filter((stage) => {
|
|
811
|
+
const stageDedupKey = buildStageDedupKey(
|
|
812
|
+
options.planArtifactPath,
|
|
813
|
+
stage.id,
|
|
814
|
+
options.intentHash
|
|
815
|
+
);
|
|
816
|
+
if (!stageDedupKey) return false;
|
|
817
|
+
const candidate = existingStageTaskIds.get(stageDedupKey);
|
|
818
|
+
if (!candidate) return false;
|
|
819
|
+
return !(options.intentHash && normalizeStageDescription(candidate.title) !== normalizeStageDescription(deriveTaskTitleFromStage(stage)));
|
|
820
|
+
}).length;
|
|
821
|
+
if (matchingExistingStageCount > 0) {
|
|
822
|
+
emitSprintBridgeDiagnostic(
|
|
823
|
+
`Reusing sprint ${sprintId} \u2014 found ${matchingExistingStageCount} matching existing plan stage(s); duplicates will be skipped`
|
|
824
|
+
);
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
const stageToTaskMap = /* @__PURE__ */ new Map();
|
|
828
|
+
const taskIds = [];
|
|
829
|
+
const createdTaskIds = [];
|
|
830
|
+
const reattachedTaskIds = [];
|
|
831
|
+
const reusedTaskSnapshots = /* @__PURE__ */ new Map();
|
|
832
|
+
try {
|
|
833
|
+
for (const stage of sortedStages) {
|
|
834
|
+
const stageDedupKey = buildStageDedupKey(
|
|
835
|
+
options.planArtifactPath,
|
|
836
|
+
stage.id,
|
|
837
|
+
options.intentHash
|
|
838
|
+
);
|
|
839
|
+
const existingStageTask = stageDedupKey && (() => {
|
|
840
|
+
const candidate = existingStageTaskIds.get(stageDedupKey);
|
|
841
|
+
if (!candidate) return void 0;
|
|
842
|
+
if (options.intentHash && normalizeStageDescription(candidate.title) !== normalizeStageDescription(deriveTaskTitleFromStage(stage))) {
|
|
843
|
+
return void 0;
|
|
844
|
+
}
|
|
845
|
+
return candidate;
|
|
846
|
+
})();
|
|
847
|
+
if (existingStageTask) {
|
|
848
|
+
if (!existingStageTask.inSprint) {
|
|
849
|
+
const snapshot = existingStageTask.filePath ? {
|
|
850
|
+
filePath: existingStageTask.filePath,
|
|
851
|
+
contents: await fsp2.readFile(existingStageTask.filePath)
|
|
852
|
+
} : await snapshotTaskFile(existingStageTask.taskId, tasksDir);
|
|
853
|
+
if (snapshot) {
|
|
854
|
+
reusedTaskSnapshots.set(existingStageTask.taskId, snapshot);
|
|
855
|
+
}
|
|
856
|
+
await addTaskToSprint(sprintId, existingStageTask.taskId, 0);
|
|
857
|
+
await setTaskSprintId(
|
|
858
|
+
existingStageTask.filePath ?? path4.join(tasksDir, `${existingStageTask.taskId}.md`),
|
|
859
|
+
sprintId
|
|
860
|
+
);
|
|
861
|
+
existingStageTask.inSprint = true;
|
|
862
|
+
taskIds.push(existingStageTask.taskId);
|
|
863
|
+
reattachedTaskIds.push(existingStageTask.taskId);
|
|
864
|
+
emitSprintBridgeDiagnostic(
|
|
865
|
+
`Reattached orphaned task ${existingStageTask.taskId} for stage ${stage.id} to sprint ${sprintId}`
|
|
866
|
+
);
|
|
867
|
+
} else {
|
|
868
|
+
emitSprintBridgeDiagnostic(
|
|
869
|
+
`Skipping duplicate task for stage ${stage.id} (already exists in sprint)`
|
|
870
|
+
);
|
|
871
|
+
}
|
|
872
|
+
stageToTaskMap.set(stage.id, existingStageTask.taskId);
|
|
873
|
+
continue;
|
|
874
|
+
}
|
|
875
|
+
const taskDeps = (stage.deps ?? []).map((depStageId) => stageToTaskMap.get(depStageId)).filter((id) => id !== void 0);
|
|
876
|
+
const mappedStageType = toStageType(stage.type);
|
|
877
|
+
const { modelReasoningEffort } = stage;
|
|
878
|
+
const hasVerify = mappedStageType === "verify" && stage.verify?.commands && Array.isArray(stage.verify.commands) && stage.verify.commands.length > 0;
|
|
879
|
+
const task = await createTask(deriveTaskTitleFromStage(stage), sprintId, {
|
|
880
|
+
description: stage.description,
|
|
881
|
+
dependencies: taskDeps,
|
|
882
|
+
// Persist advisory AI wall-clock runtime ([B5]) as expectedRuntimeMinutes;
|
|
883
|
+
// never derive human-hour Scrum estimates from runtime or USD cost.
|
|
884
|
+
...deriveStageRuntimeOptions(stage, {
|
|
885
|
+
estimatedDurationMs: plan.estimatedDurationMs,
|
|
886
|
+
stageCount: plan.subStages.length
|
|
887
|
+
}),
|
|
888
|
+
planArtifactPath: options.planArtifactPath,
|
|
889
|
+
planIntentHash: options.intentHash,
|
|
890
|
+
planStageId: stage.id,
|
|
891
|
+
routing: stage.provider || stage.model ? {
|
|
892
|
+
...stage.provider ? { provider: stage.provider } : {},
|
|
893
|
+
...stage.model ? { model: stage.model } : {}
|
|
894
|
+
} : void 0,
|
|
895
|
+
flywheel: stage.type || stage.allowlist && stage.allowlist.length > 0 || hasVerify || stage.competition || stage.autoloop || modelReasoningEffort || stage.validation ? {
|
|
896
|
+
...mappedStageType ? { type: mappedStageType } : {},
|
|
897
|
+
...stage.allowlist && stage.allowlist.length > 0 ? { allowlist: stage.allowlist } : {},
|
|
898
|
+
...hasVerify ? { verify: stage.verify } : {},
|
|
899
|
+
...stage.competition ? { competition: stage.competition } : {},
|
|
900
|
+
...stage.autoloop ? { autoloop: stage.autoloop } : {},
|
|
901
|
+
...modelReasoningEffort ? { modelReasoningEffort } : {},
|
|
902
|
+
...stage.validation ? { validation: stage.validation } : {}
|
|
903
|
+
} : void 0
|
|
904
|
+
});
|
|
905
|
+
const missingProvenance = [];
|
|
906
|
+
if (!task.planArtifactPath) missingProvenance.push("planArtifactPath");
|
|
907
|
+
if (!task.planStageId) missingProvenance.push("planStageId");
|
|
908
|
+
if (missingProvenance.length > 0) {
|
|
909
|
+
emitSprintBridgeDiagnostic(
|
|
910
|
+
`Task ${task.id} (stage ${stage.id}) created without provenance field(s): ${missingProvenance.join(", ")}`
|
|
911
|
+
);
|
|
912
|
+
await emitPlanProvenanceMissing(options.runId, sprintId, 1);
|
|
913
|
+
}
|
|
914
|
+
stageToTaskMap.set(stage.id, task.id);
|
|
915
|
+
taskIds.push(task.id);
|
|
916
|
+
createdTaskIds.push(task.id);
|
|
917
|
+
try {
|
|
918
|
+
await addTaskToSprint(sprintId, task.id, 0);
|
|
919
|
+
} catch (error) {
|
|
920
|
+
throw new Error(
|
|
921
|
+
`Created task ${task.id} for stage ${stage.id} but failed to attach it to sprint ${sprintId}: ${error instanceof Error ? error.message : String(error)}`
|
|
922
|
+
);
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
} catch (error) {
|
|
926
|
+
await rollbackSprintBridgeArtifacts({
|
|
927
|
+
runId: options.runId,
|
|
928
|
+
sprintId,
|
|
929
|
+
stageToTaskMap,
|
|
930
|
+
taskIds,
|
|
931
|
+
createdSprint: !reusingExistingSprint,
|
|
932
|
+
createdTaskIds,
|
|
933
|
+
reattachedTaskIds,
|
|
934
|
+
reusedSprintSnapshot,
|
|
935
|
+
reusedTaskSnapshots,
|
|
936
|
+
createdPlanningDirs
|
|
937
|
+
});
|
|
938
|
+
throw error;
|
|
939
|
+
}
|
|
940
|
+
try {
|
|
941
|
+
const capacity = await calculateCapacity(sprintId);
|
|
942
|
+
const warning = checkCapacityWarning(capacity);
|
|
943
|
+
if (warning) {
|
|
944
|
+
emitSprintBridgeDiagnostic(`[capacity] ${warning.message}`);
|
|
945
|
+
}
|
|
946
|
+
} catch {
|
|
947
|
+
}
|
|
948
|
+
await emitSprintBridgeCreated(
|
|
949
|
+
options.runId,
|
|
950
|
+
sprintId,
|
|
951
|
+
taskIds.length,
|
|
952
|
+
options.planArtifactPath
|
|
953
|
+
);
|
|
954
|
+
return {
|
|
955
|
+
runId: options.runId,
|
|
956
|
+
sprintId,
|
|
957
|
+
stageToTaskMap,
|
|
958
|
+
taskIds,
|
|
959
|
+
createdSprint: !reusingExistingSprint,
|
|
960
|
+
createdTaskIds,
|
|
961
|
+
reattachedTaskIds,
|
|
962
|
+
reusedSprintSnapshot,
|
|
963
|
+
reusedTaskSnapshots,
|
|
964
|
+
createdPlanningDirs
|
|
965
|
+
};
|
|
966
|
+
}),
|
|
967
|
+
{ operation: "sprint-bridge" }
|
|
968
|
+
);
|
|
969
|
+
}
|
|
970
|
+
function isTransientIOError(err) {
|
|
971
|
+
if (!(err instanceof Error)) return false;
|
|
972
|
+
const code = err.code;
|
|
973
|
+
return code === "ENOENT" || code === "EACCES" || code === "EAGAIN" || code === "EBUSY";
|
|
974
|
+
}
|
|
975
|
+
async function applyStageEventToTask(event, taskId, apply, normalizeBlockedReason, telemetry, recordedTransitions, writeTaskStatus, binding = {}) {
|
|
976
|
+
await refreshSprintLock(telemetry.sprintId);
|
|
977
|
+
const targetStatus = resolveTaskStatusForStageOutcome({
|
|
978
|
+
kind: "lifecycle-event",
|
|
979
|
+
event,
|
|
980
|
+
apply,
|
|
981
|
+
stageRole: binding.stageRole,
|
|
982
|
+
gatePending: binding.gatePending
|
|
983
|
+
});
|
|
984
|
+
const isGate = binding.stageRole === "gate";
|
|
985
|
+
switch (event.eventType) {
|
|
986
|
+
case "started": {
|
|
987
|
+
if (targetStatus === "in_progress") {
|
|
988
|
+
if (!writeTaskStatus) {
|
|
989
|
+
recordedTransitions.set(taskId, { taskId, targetStatus });
|
|
990
|
+
break;
|
|
991
|
+
}
|
|
992
|
+
await updateTaskStatusWithTransitionValidation(taskId, targetStatus);
|
|
993
|
+
recordedTransitions.set(taskId, { taskId, targetStatus });
|
|
994
|
+
await emitSprintBridgeTaskStatusUpdated(
|
|
995
|
+
telemetry.runId,
|
|
996
|
+
telemetry.sprintId,
|
|
997
|
+
taskId,
|
|
998
|
+
"todo",
|
|
999
|
+
"in_progress"
|
|
1000
|
+
);
|
|
1001
|
+
}
|
|
1002
|
+
break;
|
|
1003
|
+
}
|
|
1004
|
+
case "succeeded": {
|
|
1005
|
+
if (targetStatus === "review" || targetStatus === "done") {
|
|
1006
|
+
if (!writeTaskStatus) {
|
|
1007
|
+
recordedTransitions.set(taskId, { taskId, targetStatus });
|
|
1008
|
+
break;
|
|
1009
|
+
}
|
|
1010
|
+
await updateTaskStatusWithTransitionValidation(taskId, "review");
|
|
1011
|
+
recordedTransitions.set(taskId, { taskId, targetStatus });
|
|
1012
|
+
if (!isGate) {
|
|
1013
|
+
await emitSprintBridgeTaskStatusUpdated(
|
|
1014
|
+
telemetry.runId,
|
|
1015
|
+
telemetry.sprintId,
|
|
1016
|
+
taskId,
|
|
1017
|
+
"in_progress",
|
|
1018
|
+
"review"
|
|
1019
|
+
);
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
break;
|
|
1023
|
+
}
|
|
1024
|
+
case "failed": {
|
|
1025
|
+
if (targetStatus === "blocked" || targetStatus === "in_progress") {
|
|
1026
|
+
const reason = normalizeBlockedReason(
|
|
1027
|
+
event.metadata?.errorSummary,
|
|
1028
|
+
isGate ? "Review gate failed" : "Stage execution failed"
|
|
1029
|
+
);
|
|
1030
|
+
if (!writeTaskStatus) {
|
|
1031
|
+
recordedTransitions.set(taskId, { taskId, targetStatus, reason });
|
|
1032
|
+
break;
|
|
1033
|
+
}
|
|
1034
|
+
const blocker = targetStatus === "blocked" ? { blockedReason: reason } : void 0;
|
|
1035
|
+
await updateTaskStatusWithTransitionValidation(taskId, targetStatus, blocker);
|
|
1036
|
+
recordedTransitions.set(taskId, { taskId, targetStatus, reason });
|
|
1037
|
+
await emitBlockerRuntimeFailure(telemetry.runId, event.stageId);
|
|
1038
|
+
await emitSprintBridgeTaskStatusUpdated(
|
|
1039
|
+
telemetry.runId,
|
|
1040
|
+
telemetry.sprintId,
|
|
1041
|
+
taskId,
|
|
1042
|
+
"in_progress",
|
|
1043
|
+
targetStatus
|
|
1044
|
+
);
|
|
1045
|
+
}
|
|
1046
|
+
break;
|
|
1047
|
+
}
|
|
1048
|
+
case "skipped": {
|
|
1049
|
+
if (await binding.resolveUnmetDeclaredDependency?.() === false) {
|
|
1050
|
+
break;
|
|
1051
|
+
}
|
|
1052
|
+
if (targetStatus === "blocked") {
|
|
1053
|
+
const reason = normalizeBlockedReason(
|
|
1054
|
+
event.metadata?.skipReason,
|
|
1055
|
+
isGate ? "Review gate skipped" : "Stage skipped"
|
|
1056
|
+
);
|
|
1057
|
+
if (!writeTaskStatus) {
|
|
1058
|
+
recordedTransitions.set(taskId, { taskId, targetStatus: "blocked", reason });
|
|
1059
|
+
break;
|
|
1060
|
+
}
|
|
1061
|
+
await updateTaskStatusWithTransitionValidation(taskId, "blocked", {
|
|
1062
|
+
blockedReason: reason
|
|
1063
|
+
});
|
|
1064
|
+
recordedTransitions.set(taskId, { taskId, targetStatus: "blocked", reason });
|
|
1065
|
+
await emitBlockerRuntimeFailure(telemetry.runId, event.stageId);
|
|
1066
|
+
await emitSprintBridgeTaskStatusUpdated(
|
|
1067
|
+
telemetry.runId,
|
|
1068
|
+
telemetry.sprintId,
|
|
1069
|
+
taskId,
|
|
1070
|
+
"todo",
|
|
1071
|
+
"blocked"
|
|
1072
|
+
);
|
|
1073
|
+
}
|
|
1074
|
+
break;
|
|
1075
|
+
}
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
async function replayStageEvent(event, taskId, apply, normalizeBlockedReason, telemetry, recordedTransitions, writeTaskStatus, shouldSkipUpdates, binding = {}) {
|
|
1079
|
+
if (shouldSkipUpdates?.()) {
|
|
1080
|
+
return;
|
|
1081
|
+
}
|
|
1082
|
+
await applyStageEventToTask(
|
|
1083
|
+
event,
|
|
1084
|
+
taskId,
|
|
1085
|
+
apply,
|
|
1086
|
+
normalizeBlockedReason,
|
|
1087
|
+
telemetry,
|
|
1088
|
+
recordedTransitions,
|
|
1089
|
+
writeTaskStatus,
|
|
1090
|
+
binding
|
|
1091
|
+
);
|
|
1092
|
+
}
|
|
1093
|
+
function buildLifecycleCallbacks(stageToTaskMap, options) {
|
|
1094
|
+
const apply = options.apply ?? false;
|
|
1095
|
+
const writeTaskStatus = options.writeTaskStatus ?? true;
|
|
1096
|
+
const gateToExecution = options.workflow ? mapGateStagesToExecutionStages(options.workflow) : /* @__PURE__ */ new Map();
|
|
1097
|
+
const gatedExecutionIds = new Set(gateToExecution.values());
|
|
1098
|
+
const stageOwners = buildStageTaskOwnership(stageToTaskMap, gateToExecution, options.workflow);
|
|
1099
|
+
const readDeclaredDependencies = createDeclaredDependencyReader(
|
|
1100
|
+
async (id) => (await getTask(id)).yaml.dependencies
|
|
1101
|
+
);
|
|
1102
|
+
const gateDecidedTasks = /* @__PURE__ */ new Set();
|
|
1103
|
+
const taskEventChains = /* @__PURE__ */ new Map();
|
|
1104
|
+
const resolveBinding = (stageId) => {
|
|
1105
|
+
const direct = stageToTaskMap.get(stageId);
|
|
1106
|
+
if (direct) {
|
|
1107
|
+
return {
|
|
1108
|
+
taskId: direct,
|
|
1109
|
+
binding: gatedExecutionIds.has(stageId) ? { stageRole: "implement", gatePending: true } : {}
|
|
1110
|
+
};
|
|
1111
|
+
}
|
|
1112
|
+
const executionId = gateToExecution.get(stageId);
|
|
1113
|
+
const gatedTaskId = executionId ? stageToTaskMap.get(executionId) : void 0;
|
|
1114
|
+
if (gatedTaskId) {
|
|
1115
|
+
return { taskId: gatedTaskId, binding: { stageRole: "gate" } };
|
|
1116
|
+
}
|
|
1117
|
+
return void 0;
|
|
1118
|
+
};
|
|
1119
|
+
const normalizeBlockedReason = (reason, fallback) => {
|
|
1120
|
+
const trimmed = reason?.trim();
|
|
1121
|
+
return trimmed && trimmed.length > 0 ? trimmed : fallback;
|
|
1122
|
+
};
|
|
1123
|
+
const recordedTransitions = /* @__PURE__ */ new Map();
|
|
1124
|
+
const pendingEvents = /* @__PURE__ */ new Set();
|
|
1125
|
+
const shouldSkipUpdates = () => Boolean(options.signal?.aborted) || signalCoordinator.isShuttingDown;
|
|
1126
|
+
const callbacks = {
|
|
1127
|
+
onStageEvent: async (event) => {
|
|
1128
|
+
const resolved = resolveBinding(event.stageId);
|
|
1129
|
+
if (!resolved) return;
|
|
1130
|
+
const { taskId } = resolved;
|
|
1131
|
+
const binding = {
|
|
1132
|
+
...resolved.binding,
|
|
1133
|
+
resolveUnmetDeclaredDependency: () => skipHasUnmetDeclaredDependency(event, taskId, stageOwners, readDeclaredDependencies)
|
|
1134
|
+
};
|
|
1135
|
+
const previous = taskEventChains.get(taskId) ?? Promise.resolve();
|
|
1136
|
+
const next = previous.catch(() => void 0).then(() => processStageEvent(event, taskId, binding));
|
|
1137
|
+
taskEventChains.set(taskId, next);
|
|
1138
|
+
await next;
|
|
1139
|
+
}
|
|
1140
|
+
};
|
|
1141
|
+
const processStageEvent = async (event, taskId, binding) => {
|
|
1142
|
+
if (binding.stageRole === "implement" && event.terminal && gateDecidedTasks.has(taskId)) {
|
|
1143
|
+
return;
|
|
1144
|
+
}
|
|
1145
|
+
if (shouldSkipUpdates()) return;
|
|
1146
|
+
try {
|
|
1147
|
+
await applyStageEventToTask(
|
|
1148
|
+
event,
|
|
1149
|
+
taskId,
|
|
1150
|
+
apply,
|
|
1151
|
+
normalizeBlockedReason,
|
|
1152
|
+
{
|
|
1153
|
+
runId: options.runId,
|
|
1154
|
+
sprintId: options.sprintId
|
|
1155
|
+
},
|
|
1156
|
+
recordedTransitions,
|
|
1157
|
+
writeTaskStatus,
|
|
1158
|
+
binding
|
|
1159
|
+
);
|
|
1160
|
+
if (binding.stageRole === "gate" && event.terminal) gateDecidedTasks.add(taskId);
|
|
1161
|
+
} catch (err) {
|
|
1162
|
+
if (isTransientIOError(err)) {
|
|
1163
|
+
try {
|
|
1164
|
+
if (shouldSkipUpdates()) return;
|
|
1165
|
+
await new Promise((resolve2) => setTimeout(resolve2, 100));
|
|
1166
|
+
if (shouldSkipUpdates()) return;
|
|
1167
|
+
await replayStageEvent(
|
|
1168
|
+
event,
|
|
1169
|
+
taskId,
|
|
1170
|
+
apply,
|
|
1171
|
+
normalizeBlockedReason,
|
|
1172
|
+
{
|
|
1173
|
+
runId: options.runId,
|
|
1174
|
+
sprintId: options.sprintId
|
|
1175
|
+
},
|
|
1176
|
+
recordedTransitions,
|
|
1177
|
+
writeTaskStatus,
|
|
1178
|
+
shouldSkipUpdates,
|
|
1179
|
+
binding
|
|
1180
|
+
);
|
|
1181
|
+
if (binding.stageRole === "gate" && event.terminal) gateDecidedTasks.add(taskId);
|
|
1182
|
+
return;
|
|
1183
|
+
} catch (retryErr) {
|
|
1184
|
+
emitLifecycleDiagnostic(
|
|
1185
|
+
`[sprint-bridge] retry also failed for task ${taskId} stage ${event.stageId}:`,
|
|
1186
|
+
retryErr
|
|
1187
|
+
);
|
|
1188
|
+
return;
|
|
1189
|
+
}
|
|
1190
|
+
}
|
|
1191
|
+
emitLifecycleDiagnostic(
|
|
1192
|
+
`[sprint-bridge] failed to update task ${taskId} for stage ${event.stageId}:`,
|
|
1193
|
+
err
|
|
1194
|
+
);
|
|
1195
|
+
}
|
|
1196
|
+
};
|
|
1197
|
+
const trackedCallbacks = {
|
|
1198
|
+
onStageEvent: (event) => {
|
|
1199
|
+
const pending = Promise.resolve(callbacks.onStageEvent(event));
|
|
1200
|
+
pendingEvents.add(pending);
|
|
1201
|
+
void pending.finally(() => pendingEvents.delete(pending));
|
|
1202
|
+
return pending;
|
|
1203
|
+
}
|
|
1204
|
+
};
|
|
1205
|
+
const awaitDrain = async () => {
|
|
1206
|
+
while (pendingEvents.size > 0) {
|
|
1207
|
+
await Promise.allSettled(Array.from(pendingEvents));
|
|
1208
|
+
}
|
|
1209
|
+
};
|
|
1210
|
+
trackedCallbacks.awaitDrain = awaitDrain;
|
|
1211
|
+
return { callbacks: trackedCallbacks, recordedTransitions, awaitDrain };
|
|
1212
|
+
}
|
|
1213
|
+
|
|
1214
|
+
export {
|
|
1215
|
+
emitBlockerTelemetryEvent,
|
|
1216
|
+
emitBlockerDetected,
|
|
1217
|
+
emitDecompositionCost,
|
|
1218
|
+
emitTaskTypeOverride,
|
|
1219
|
+
emitSplitShadowComparison,
|
|
1220
|
+
withIngestLock,
|
|
1221
|
+
rollbackSprintBridge,
|
|
1222
|
+
createSprintFromPlan,
|
|
1223
|
+
buildLifecycleCallbacks
|
|
1224
|
+
};
|
|
1225
|
+
//# sourceMappingURL=chunk-3H3EY6U7.js.map
|