@ebrindley/build 0.0.0-stage → 1.42.1-rc28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (878) hide show
  1. package/.build-project/providers/catalog.json +13951 -0
  2. package/.build-project/providers/pricing.json +1978 -0
  3. package/.build-project/providers/registry.json +4103 -0
  4. package/.github/SECURITY.md +75 -0
  5. package/.nvmrc +1 -0
  6. package/CHANGELOG.md +661 -0
  7. package/CODE_OF_CONDUCT.md +44 -0
  8. package/CONTRIBUTING.md +24 -0
  9. package/INSTALL.md +623 -0
  10. package/LICENSE +21 -0
  11. package/README.md +118 -2
  12. package/THIRD_PARTY_NOTICES.txt +26 -0
  13. package/dist/ai-judge-UE5UOYOO.js +191 -0
  14. package/dist/allowlist-grounding-KPLN6NC5.js +16 -0
  15. package/dist/allowlist-utils-MZZKKXRD.js +31 -0
  16. package/dist/apply-completion-mode-EM37UZHB.js +110 -0
  17. package/dist/artifact-migrator-WPACNSEP.js +276 -0
  18. package/dist/ask-2OZ4JFQR.js +176 -0
  19. package/dist/auth-6UKBTJUQ.js +185 -0
  20. package/dist/auth-H5KJL6HL.js +165 -0
  21. package/dist/auth-LVJRJDMU.js +12 -0
  22. package/dist/auth-NHZOCNRR.js +94 -0
  23. package/dist/auth-PBXHWXGW.js +95 -0
  24. package/dist/auth-T7Y5DCAH.js +91 -0
  25. package/dist/auth-TVVKCHQW.js +13 -0
  26. package/dist/auth-UHB2UCSS.js +97 -0
  27. package/dist/auth-VACA3VUL.js +98 -0
  28. package/dist/auth-VVLC77S3.js +44 -0
  29. package/dist/auth-liveness-XO4AGDDD.js +53 -0
  30. package/dist/autoloop-cleanup-SI3VGAAR.js +106 -0
  31. package/dist/autoloop-evidence-gates-J5GG5YQB.js +39 -0
  32. package/dist/autoloop-gate-policy-SUNAEP6Q.js +169 -0
  33. package/dist/autoloop-helpers-VQGQNTT6.js +52 -0
  34. package/dist/autoloop-ledger-P6TIDP7C.js +96 -0
  35. package/dist/autoloop-ledger-subscriber-HFAGOZXH.js +161 -0
  36. package/dist/autoloop-run-defaults-GWGZBNT7.js +27 -0
  37. package/dist/autoloop-run-lock-GBWRM5A2.js +197 -0
  38. package/dist/autoloop-success-C32QVWOP.js +93 -0
  39. package/dist/autoloop-termination-summary-GI6IBQWD.js +58 -0
  40. package/dist/autoloop-trajectory-AMKSQISD.js +70 -0
  41. package/dist/autoloop-wall-clock-T7ZVIQOC.js +12 -0
  42. package/dist/automatic-branch-cleanup-R62X2C5O.js +49 -0
  43. package/dist/autonomous-loop-controller-2WL363LW.js +4386 -0
  44. package/dist/backend-YUTFDZXZ.js +30 -0
  45. package/dist/background-executor-Z3ODTMD7.js +260 -0
  46. package/dist/backlog-75QPEAMW.js +403 -0
  47. package/dist/backlog-execution-intent-GWUV5TUK.js +19 -0
  48. package/dist/backup-active-store-XHWLN34M.js +16 -0
  49. package/dist/backup-machine-stores-UI4LTJOY.js +251 -0
  50. package/dist/backup-telemetry-db-Z4ICYCNW.js +26 -0
  51. package/dist/branch-archive-manager-FMSQ7YJF.js +18 -0
  52. package/dist/branch-cleanup-manager-ST6FJGND.js +35 -0
  53. package/dist/build-gate-7NKWPY62.js +68 -0
  54. package/dist/build-root-S7DINODY.js +18 -0
  55. package/dist/change-summary-R6CB6VXJ.js +50 -0
  56. package/dist/chunk-24MNKKOM.js +173 -0
  57. package/dist/chunk-2H6VZFIO.js +235 -0
  58. package/dist/chunk-2JIX3EKV.js +39 -0
  59. package/dist/chunk-2KO7HVZM.js +106 -0
  60. package/dist/chunk-2L36U25O.js +100 -0
  61. package/dist/chunk-2NMNFUQA.js +475 -0
  62. package/dist/chunk-2OUAEH67.js +83 -0
  63. package/dist/chunk-2VLJUXJU.js +115 -0
  64. package/dist/chunk-2VUEDIUM.js +77 -0
  65. package/dist/chunk-2Y2IIHPI.js +430 -0
  66. package/dist/chunk-2YRG3LHZ.js +220 -0
  67. package/dist/chunk-2Z5Q3SUY.js +65 -0
  68. package/dist/chunk-32IYXIE5.js +873 -0
  69. package/dist/chunk-33IGPPUI.js +292 -0
  70. package/dist/chunk-352PCJLK.js +283 -0
  71. package/dist/chunk-35J4NE6S.js +226 -0
  72. package/dist/chunk-3C7WBIVK.js +1016 -0
  73. package/dist/chunk-3H3EY6U7.js +1225 -0
  74. package/dist/chunk-3H4MWYIC.js +198 -0
  75. package/dist/chunk-3HHWQR3N.js +2479 -0
  76. package/dist/chunk-3JKNRYEE.js +14 -0
  77. package/dist/chunk-3LECCYZY.js +128 -0
  78. package/dist/chunk-3LOY6YZI.js +852 -0
  79. package/dist/chunk-3M57DADF.js +44 -0
  80. package/dist/chunk-3NOTLVLG.js +3803 -0
  81. package/dist/chunk-3OPP2OZB.js +1480 -0
  82. package/dist/chunk-3P5IN5E7.js +9 -0
  83. package/dist/chunk-3PL22IYZ.js +20 -0
  84. package/dist/chunk-3REDAJUJ.js +14 -0
  85. package/dist/chunk-3S2R4XJI.js +203 -0
  86. package/dist/chunk-3UBZI5DW.js +61 -0
  87. package/dist/chunk-3VV5OBGG.js +308 -0
  88. package/dist/chunk-3WY5TU2O.js +823 -0
  89. package/dist/chunk-43OKHTW4.js +82 -0
  90. package/dist/chunk-45KUJBDI.js +112 -0
  91. package/dist/chunk-47X5LM7B.js +224 -0
  92. package/dist/chunk-4B6FQJ77.js +268 -0
  93. package/dist/chunk-4BTDUT2S.js +42 -0
  94. package/dist/chunk-4DJL2VXA.js +24 -0
  95. package/dist/chunk-4EBSXZ73.js +48 -0
  96. package/dist/chunk-4QKP6I4C.js +294 -0
  97. package/dist/chunk-4U6XK2DG.js +300 -0
  98. package/dist/chunk-4UMRUFBD.js +132 -0
  99. package/dist/chunk-4US4SYJ4.js +569 -0
  100. package/dist/chunk-4ZPLWEZO.js +154 -0
  101. package/dist/chunk-56WPYDJH.js +624 -0
  102. package/dist/chunk-57WRCJJW.js +50 -0
  103. package/dist/chunk-5AW4RMNG.js +24 -0
  104. package/dist/chunk-5EQN56OZ.js +155 -0
  105. package/dist/chunk-5F43TUIN.js +38 -0
  106. package/dist/chunk-5FKHIKTS.js +115 -0
  107. package/dist/chunk-5HDP7XZG.js +91 -0
  108. package/dist/chunk-5KQETTNS.js +152 -0
  109. package/dist/chunk-5PDVN2KO.js +498 -0
  110. package/dist/chunk-5UBIFVRD.js +509 -0
  111. package/dist/chunk-5YDE3Q62.js +46 -0
  112. package/dist/chunk-626AJVMU.js +302 -0
  113. package/dist/chunk-633XZ7UF.js +3583 -0
  114. package/dist/chunk-63DHNHGA.js +236 -0
  115. package/dist/chunk-666656AR.js +568 -0
  116. package/dist/chunk-67YRJPJO.js +19 -0
  117. package/dist/chunk-6CAU7VBA.js +20 -0
  118. package/dist/chunk-6CB3KJRY.js +21 -0
  119. package/dist/chunk-6DBMALXL.js +29 -0
  120. package/dist/chunk-6E25C4IA.js +269 -0
  121. package/dist/chunk-6FIBNIQU.js +73 -0
  122. package/dist/chunk-6G57FYBV.js +189 -0
  123. package/dist/chunk-6KZKRTG3.js +4885 -0
  124. package/dist/chunk-6LAH2UV2.js +525 -0
  125. package/dist/chunk-6PZY2TTU.js +921 -0
  126. package/dist/chunk-6T6NHXK4.js +230 -0
  127. package/dist/chunk-6TBEX4R4.js +432 -0
  128. package/dist/chunk-6TRD7TEE.js +911 -0
  129. package/dist/chunk-6XCP2RAI.js +47 -0
  130. package/dist/chunk-726G6WDL.js +351 -0
  131. package/dist/chunk-75EMT7BF.js +616 -0
  132. package/dist/chunk-762ACDZJ.js +4696 -0
  133. package/dist/chunk-77I6G4CO.js +1 -0
  134. package/dist/chunk-7DJ6SQH3.js +510 -0
  135. package/dist/chunk-7HPCIOMA.js +1383 -0
  136. package/dist/chunk-7HYBSRPZ.js +17503 -0
  137. package/dist/chunk-7KBEOPVB.js +73 -0
  138. package/dist/chunk-7LHJDJB3.js +2222 -0
  139. package/dist/chunk-7NVJMH52.js +306 -0
  140. package/dist/chunk-7RMARDVH.js +33 -0
  141. package/dist/chunk-7SEWU4QG.js +36 -0
  142. package/dist/chunk-7TUTZTI2.js +911 -0
  143. package/dist/chunk-7VBDFPUM.js +340 -0
  144. package/dist/chunk-7VRJHTGZ.js +6406 -0
  145. package/dist/chunk-7YAOUUKK.js +493 -0
  146. package/dist/chunk-AAAODV76.js +860 -0
  147. package/dist/chunk-AB4HUJVQ.js +339 -0
  148. package/dist/chunk-AEQWV746.js +611 -0
  149. package/dist/chunk-AHU3FKPA.js +11639 -0
  150. package/dist/chunk-AISTV5XU.js +226 -0
  151. package/dist/chunk-AJBTKGJZ.js +48 -0
  152. package/dist/chunk-AJJNW7XT.js +248 -0
  153. package/dist/chunk-AJN5Y5YZ.js +160 -0
  154. package/dist/chunk-ALDTFNZ3.js +150 -0
  155. package/dist/chunk-ARARVIZK.js +281 -0
  156. package/dist/chunk-ATBM6AW5.js +53 -0
  157. package/dist/chunk-ATKEKM3E.js +206 -0
  158. package/dist/chunk-AUJLW6JZ.js +92 -0
  159. package/dist/chunk-AY3MHEFM.js +24 -0
  160. package/dist/chunk-B7PYTV72.js +236 -0
  161. package/dist/chunk-B7YRSULE.js +1423 -0
  162. package/dist/chunk-BAWJNMWF.js +339 -0
  163. package/dist/chunk-BBPIILO2.js +88 -0
  164. package/dist/chunk-BD3PGW6A.js +957 -0
  165. package/dist/chunk-BDPYFAB4.js +44 -0
  166. package/dist/chunk-BIUV23HH.js +729 -0
  167. package/dist/chunk-BQ3VAGXH.js +243 -0
  168. package/dist/chunk-BQJOGAWT.js +31 -0
  169. package/dist/chunk-BT7EG7CO.js +68 -0
  170. package/dist/chunk-BV3XQQLU.js +27 -0
  171. package/dist/chunk-BY6ODHNZ.js +78 -0
  172. package/dist/chunk-BZRLSZNV.js +79 -0
  173. package/dist/chunk-C3DH3NCY.js +2773 -0
  174. package/dist/chunk-C3KCMAJP.js +756 -0
  175. package/dist/chunk-C7AGUJ5K.js +267 -0
  176. package/dist/chunk-CBSWKQCX.js +342 -0
  177. package/dist/chunk-CE5OZBYY.js +21 -0
  178. package/dist/chunk-CFCVYHSW.js +373 -0
  179. package/dist/chunk-CHA2HDE5.js +126 -0
  180. package/dist/chunk-CIHWPGS5.js +146 -0
  181. package/dist/chunk-CJBSZX3F.js +127 -0
  182. package/dist/chunk-CLA6QIJM.js +43 -0
  183. package/dist/chunk-CPSVQR2I.js +365 -0
  184. package/dist/chunk-CRPRVNQ4.js +254 -0
  185. package/dist/chunk-CSIE4Y7C.js +1093 -0
  186. package/dist/chunk-CSOPSYDY.js +142 -0
  187. package/dist/chunk-CSXLLEGB.js +205 -0
  188. package/dist/chunk-CTDLERWU.js +293 -0
  189. package/dist/chunk-CULBXMSK.js +110 -0
  190. package/dist/chunk-D2M2Y5ID.js +21 -0
  191. package/dist/chunk-D37WY7SH.js +1060 -0
  192. package/dist/chunk-D4VJFCGZ.js +89 -0
  193. package/dist/chunk-D6WTZMZB.js +48 -0
  194. package/dist/chunk-DBHOWDUH.js +976 -0
  195. package/dist/chunk-DCACX7BV.js +19364 -0
  196. package/dist/chunk-DFHX4XYA.js +128 -0
  197. package/dist/chunk-DIKBRRKE.js +176 -0
  198. package/dist/chunk-DJG5RIOR.js +9 -0
  199. package/dist/chunk-DNIOIISW.js +616 -0
  200. package/dist/chunk-DOA5G7IA.js +315 -0
  201. package/dist/chunk-DP7FKP6W.js +855 -0
  202. package/dist/chunk-DS2JZ677.js +79 -0
  203. package/dist/chunk-DSRLVYBS.js +82 -0
  204. package/dist/chunk-EAEVKNJA.js +209 -0
  205. package/dist/chunk-EEUESN3T.js +575 -0
  206. package/dist/chunk-EJ4LUU5Y.js +73 -0
  207. package/dist/chunk-EJIWTPSZ.js +1063 -0
  208. package/dist/chunk-EJVCDTAN.js +116 -0
  209. package/dist/chunk-EKLUBDBQ.js +627 -0
  210. package/dist/chunk-EN62WLFD.js +849 -0
  211. package/dist/chunk-ENYRCL43.js +26 -0
  212. package/dist/chunk-EP22ZMFO.js +273 -0
  213. package/dist/chunk-EP4SVAVI.js +87 -0
  214. package/dist/chunk-EPAMVGI3.js +1562 -0
  215. package/dist/chunk-EPRMH6HO.js +24 -0
  216. package/dist/chunk-ES6NWJ36.js +4057 -0
  217. package/dist/chunk-ETA2K4KI.js +30 -0
  218. package/dist/chunk-ETAD4NKD.js +31 -0
  219. package/dist/chunk-EUWIIDQ7.js +93 -0
  220. package/dist/chunk-EVE3OD2W.js +141 -0
  221. package/dist/chunk-EXA26FFC.js +459 -0
  222. package/dist/chunk-EXSPAA35.js +244 -0
  223. package/dist/chunk-F55YABKV.js +258 -0
  224. package/dist/chunk-F5DNGU5W.js +27 -0
  225. package/dist/chunk-F622MJYV.js +103 -0
  226. package/dist/chunk-F6NIQD74.js +5111 -0
  227. package/dist/chunk-FAWJTC34.js +43 -0
  228. package/dist/chunk-FAZBRHGG.js +47 -0
  229. package/dist/chunk-FIEUSGNJ.js +39 -0
  230. package/dist/chunk-FKCG7K6H.js +1146 -0
  231. package/dist/chunk-FOVVXV45.js +229 -0
  232. package/dist/chunk-FRBPKBFE.js +30 -0
  233. package/dist/chunk-FSA5BPFI.js +268 -0
  234. package/dist/chunk-FSJ5TTZ3.js +29 -0
  235. package/dist/chunk-FT7SGLXT.js +193 -0
  236. package/dist/chunk-FUUVZZUB.js +62 -0
  237. package/dist/chunk-FYMRVUNZ.js +1697 -0
  238. package/dist/chunk-FYTAA5FG.js +162 -0
  239. package/dist/chunk-G3VB2UCZ.js +3892 -0
  240. package/dist/chunk-G6OIMVXH.js +405 -0
  241. package/dist/chunk-G7PQCXVH.js +228 -0
  242. package/dist/chunk-GAB6UW52.js +1087 -0
  243. package/dist/chunk-GAFJEYLK.js +29 -0
  244. package/dist/chunk-GC4CRMTS.js +642 -0
  245. package/dist/chunk-GFHSIWHL.js +5297 -0
  246. package/dist/chunk-GI5M67YA.js +735 -0
  247. package/dist/chunk-GIJWHUWF.js +191 -0
  248. package/dist/chunk-GO6DRECI.js +1 -0
  249. package/dist/chunk-GOFVBTMN.js +314 -0
  250. package/dist/chunk-GQIP72ZJ.js +13 -0
  251. package/dist/chunk-GQXLXRFA.js +28 -0
  252. package/dist/chunk-GT6HFKJB.js +48 -0
  253. package/dist/chunk-GVJGSSKM.js +174 -0
  254. package/dist/chunk-GWHGTG37.js +36 -0
  255. package/dist/chunk-GZAJHLKO.js +18 -0
  256. package/dist/chunk-GZK62I3N.js +314 -0
  257. package/dist/chunk-H3HGMISG.js +483 -0
  258. package/dist/chunk-H3ISZJMJ.js +403 -0
  259. package/dist/chunk-H4HXVWEC.js +9 -0
  260. package/dist/chunk-H6MJGKAW.js +120 -0
  261. package/dist/chunk-HBTTGVR5.js +353 -0
  262. package/dist/chunk-HBZ322WZ.js +35 -0
  263. package/dist/chunk-HEP3ILP4.js +34 -0
  264. package/dist/chunk-HGFXODKO.js +106 -0
  265. package/dist/chunk-HHWDTB6S.js +59 -0
  266. package/dist/chunk-HKO45NLZ.js +286 -0
  267. package/dist/chunk-HLVTEA6A.js +89 -0
  268. package/dist/chunk-HS3SY6HN.js +160 -0
  269. package/dist/chunk-HT5OCGKN.js +899 -0
  270. package/dist/chunk-HXIIEMGF.js +78 -0
  271. package/dist/chunk-I56TH7VM.js +46 -0
  272. package/dist/chunk-I6FN3R5D.js +352 -0
  273. package/dist/chunk-I7SCBHJN.js +655 -0
  274. package/dist/chunk-IJM4GKAT.js +529 -0
  275. package/dist/chunk-IMEYU36R.js +344 -0
  276. package/dist/chunk-INJ3SS6A.js +936 -0
  277. package/dist/chunk-IUKOPCCE.js +441 -0
  278. package/dist/chunk-IVEPZQJO.js +33 -0
  279. package/dist/chunk-IVZEONFC.js +43 -0
  280. package/dist/chunk-IWBHRSG7.js +936 -0
  281. package/dist/chunk-IYY3HQAD.js +484 -0
  282. package/dist/chunk-J2ICMYDA.js +48 -0
  283. package/dist/chunk-J2QCFLUN.js +505 -0
  284. package/dist/chunk-J5HM6V5P.js +1039 -0
  285. package/dist/chunk-J6NZX6QH.js +398 -0
  286. package/dist/chunk-JBBB2Y47.js +432 -0
  287. package/dist/chunk-JDCZQZU7.js +42 -0
  288. package/dist/chunk-JEDNXGSS.js +169 -0
  289. package/dist/chunk-JHP7OT6K.js +89 -0
  290. package/dist/chunk-JLS65NUQ.js +14 -0
  291. package/dist/chunk-JNMWYMC6.js +38 -0
  292. package/dist/chunk-JNSTWNNW.js +25 -0
  293. package/dist/chunk-JOSK6GEU.js +9564 -0
  294. package/dist/chunk-JQUMSIGC.js +100 -0
  295. package/dist/chunk-JVHGMURQ.js +1106 -0
  296. package/dist/chunk-JYXS47FQ.js +951 -0
  297. package/dist/chunk-K2ZMW2Z5.js +2147 -0
  298. package/dist/chunk-K7FAFORM.js +14 -0
  299. package/dist/chunk-KBJXX3ON.js +333 -0
  300. package/dist/chunk-KHFKVQWY.js +486 -0
  301. package/dist/chunk-KHMEI3DQ.js +173 -0
  302. package/dist/chunk-KHW3UD7B.js +69 -0
  303. package/dist/chunk-KKQKWAMF.js +365 -0
  304. package/dist/chunk-KOKXJV2U.js +455 -0
  305. package/dist/chunk-KQ4NGOJI.js +14 -0
  306. package/dist/chunk-KQYQOXMS.js +342 -0
  307. package/dist/chunk-KTMW65UX.js +14 -0
  308. package/dist/chunk-KUEWV2JH.js +593 -0
  309. package/dist/chunk-KXYDV3HP.js +1523 -0
  310. package/dist/chunk-KZ4JMGZ5.js +96 -0
  311. package/dist/chunk-KZWGBUIO.js +2659 -0
  312. package/dist/chunk-L2CBG5IX.js +1892 -0
  313. package/dist/chunk-L2S235CU.js +314 -0
  314. package/dist/chunk-L32WD57F.js +98 -0
  315. package/dist/chunk-LDJCKAJP.js +123 -0
  316. package/dist/chunk-LDWNBEN7.js +541 -0
  317. package/dist/chunk-LJVH57G2.js +241 -0
  318. package/dist/chunk-LPQ7NZEN.js +209 -0
  319. package/dist/chunk-LRGH3CCV.js +148 -0
  320. package/dist/chunk-LULOGMMM.js +1133 -0
  321. package/dist/chunk-LWGKN2GY.js +8284 -0
  322. package/dist/chunk-LX4F24ZH.js +157 -0
  323. package/dist/chunk-M4BUEXXF.js +839 -0
  324. package/dist/chunk-M6UHOC4I.js +553 -0
  325. package/dist/chunk-MCBNWZNO.js +657 -0
  326. package/dist/chunk-MEMSY6VY.js +223 -0
  327. package/dist/chunk-MHLEZQQI.js +145 -0
  328. package/dist/chunk-MJ6WNSIX.js +192 -0
  329. package/dist/chunk-MKASIKWZ.js +442 -0
  330. package/dist/chunk-MNOVBYFU.js +60 -0
  331. package/dist/chunk-MO2BYAAF.js +2896 -0
  332. package/dist/chunk-MP6P7Y2A.js +180 -0
  333. package/dist/chunk-MQ4TFJAG.js +3365 -0
  334. package/dist/chunk-MT2WAIR3.js +131 -0
  335. package/dist/chunk-MTU7VTNN.js +1122 -0
  336. package/dist/chunk-MULMXX4V.js +150 -0
  337. package/dist/chunk-MW2DWWVA.js +147 -0
  338. package/dist/chunk-MY3ZPUN4.js +151 -0
  339. package/dist/chunk-MYLH2S4G.js +64 -0
  340. package/dist/chunk-MZ5WYKNA.js +28 -0
  341. package/dist/chunk-N3Q2JNPV.js +249 -0
  342. package/dist/chunk-N5DX4JAK.js +12 -0
  343. package/dist/chunk-NAINGKHF.js +35 -0
  344. package/dist/chunk-NEQUQHOX.js +223 -0
  345. package/dist/chunk-NHNPEZS4.js +1408 -0
  346. package/dist/chunk-NHTIXJCR.js +17 -0
  347. package/dist/chunk-NKLPMBNV.js +1154 -0
  348. package/dist/chunk-NMVZ5YES.js +199 -0
  349. package/dist/chunk-NRFRY3GE.js +256 -0
  350. package/dist/chunk-NTD6CSI6.js +1266 -0
  351. package/dist/chunk-NUO7B3SH.js +318 -0
  352. package/dist/chunk-NVOHIJKG.js +1319 -0
  353. package/dist/chunk-NXH3RX7O.js +523 -0
  354. package/dist/chunk-NXZ3DURF.js +257 -0
  355. package/dist/chunk-O26L6F7F.js +209 -0
  356. package/dist/chunk-O5RRIUEP.js +124 -0
  357. package/dist/chunk-O5X6BKAO.js +10 -0
  358. package/dist/chunk-O6ZQUVTR.js +31 -0
  359. package/dist/chunk-O7FE75QZ.js +306 -0
  360. package/dist/chunk-OC7Z6AJQ.js +81 -0
  361. package/dist/chunk-OH7IEZ63.js +307 -0
  362. package/dist/chunk-OI734GRS.js +115 -0
  363. package/dist/chunk-OJBH62DK.js +684 -0
  364. package/dist/chunk-OKJLVSTJ.js +247 -0
  365. package/dist/chunk-OMX5VL43.js +79 -0
  366. package/dist/chunk-ONHAMBN6.js +12 -0
  367. package/dist/chunk-ONYPLIVE.js +753 -0
  368. package/dist/chunk-OSK7QWPD.js +637 -0
  369. package/dist/chunk-OTXLMJKP.js +438 -0
  370. package/dist/chunk-OV5PKQMA.js +213 -0
  371. package/dist/chunk-OXK5HA4B.js +31 -0
  372. package/dist/chunk-OYDWFQA4.js +272 -0
  373. package/dist/chunk-OZAUKWHB.js +22 -0
  374. package/dist/chunk-P5P2EKGH.js +94 -0
  375. package/dist/chunk-P6SSWAKY.js +29 -0
  376. package/dist/chunk-P7CQGPLS.js +30 -0
  377. package/dist/chunk-P7RVCHQV.js +197 -0
  378. package/dist/chunk-PEBWDYIW.js +726 -0
  379. package/dist/chunk-PFCXFO7A.js +9193 -0
  380. package/dist/chunk-PFLDWMX6.js +168 -0
  381. package/dist/chunk-PHZGLQSK.js +15883 -0
  382. package/dist/chunk-PNFTPNSR.js +20 -0
  383. package/dist/chunk-PPHXX4W7.js +175 -0
  384. package/dist/chunk-PPZESPJT.js +262 -0
  385. package/dist/chunk-PRDHI2L5.js +296 -0
  386. package/dist/chunk-PSTKWHHN.js +32 -0
  387. package/dist/chunk-PV53ODOT.js +555 -0
  388. package/dist/chunk-PVJBTI7P.js +24 -0
  389. package/dist/chunk-PXKERBKX.js +100 -0
  390. package/dist/chunk-PZ5AY32C.js +10 -0
  391. package/dist/chunk-Q3DHEZA5.js +85 -0
  392. package/dist/chunk-Q5RZDVQK.js +204 -0
  393. package/dist/chunk-Q64IR2Z2.js +4933 -0
  394. package/dist/chunk-Q6Z5UGPL.js +398 -0
  395. package/dist/chunk-QAMAV4DT.js +627 -0
  396. package/dist/chunk-QBWF4444.js +112 -0
  397. package/dist/chunk-QDKYT4CI.js +22805 -0
  398. package/dist/chunk-QFLBRWCJ.js +126 -0
  399. package/dist/chunk-QILAQACE.js +107 -0
  400. package/dist/chunk-QJ6OEH4K.js +3683 -0
  401. package/dist/chunk-QK3NLYTV.js +320 -0
  402. package/dist/chunk-QOFLUS24.js +535 -0
  403. package/dist/chunk-QOIASNEJ.js +98 -0
  404. package/dist/chunk-QP4UTSOV.js +3587 -0
  405. package/dist/chunk-QP5ST7RI.js +904 -0
  406. package/dist/chunk-QS5AGRZN.js +167 -0
  407. package/dist/chunk-QTAOU53N.js +107 -0
  408. package/dist/chunk-QTCLJHLZ.js +351 -0
  409. package/dist/chunk-QTOLTG4L.js +119 -0
  410. package/dist/chunk-QWDV4OSL.js +142 -0
  411. package/dist/chunk-QWMQ74KD.js +508 -0
  412. package/dist/chunk-QX6LOMMH.js +158 -0
  413. package/dist/chunk-QXBKIHY7.js +238 -0
  414. package/dist/chunk-QXBKTJT6.js +270 -0
  415. package/dist/chunk-QYQOVOLR.js +196 -0
  416. package/dist/chunk-R2CKS6WT.js +73 -0
  417. package/dist/chunk-R2TIYG7U.js +68 -0
  418. package/dist/chunk-R2W3LESH.js +465 -0
  419. package/dist/chunk-R5EXHMUN.js +100 -0
  420. package/dist/chunk-RBBTBCHX.js +289 -0
  421. package/dist/chunk-RBKLOUXA.js +121 -0
  422. package/dist/chunk-RCP2Y6DQ.js +86 -0
  423. package/dist/chunk-RCYEJSD5.js +260 -0
  424. package/dist/chunk-RFDVSI4N.js +134 -0
  425. package/dist/chunk-RGJU63FV.js +1717 -0
  426. package/dist/chunk-RI4EX2QE.js +18 -0
  427. package/dist/chunk-RIMARPCF.js +152 -0
  428. package/dist/chunk-RJ6RSNT6.js +42 -0
  429. package/dist/chunk-RNI2GUIF.js +131 -0
  430. package/dist/chunk-RPHUWJ3K.js +264 -0
  431. package/dist/chunk-RPIMAMV7.js +361 -0
  432. package/dist/chunk-RQFX6YRN.js +49 -0
  433. package/dist/chunk-RRC5BL7B.js +285 -0
  434. package/dist/chunk-RSYTSBOO.js +79 -0
  435. package/dist/chunk-RWQQIKIC.js +35 -0
  436. package/dist/chunk-RZUBOZH2.js +373 -0
  437. package/dist/chunk-S2E632FQ.js +380 -0
  438. package/dist/chunk-S2VQCZO4.js +22 -0
  439. package/dist/chunk-S2XIMQJQ.js +681 -0
  440. package/dist/chunk-S47ISY27.js +183 -0
  441. package/dist/chunk-S6I4KISU.js +142 -0
  442. package/dist/chunk-S6TAFQI5.js +2403 -0
  443. package/dist/chunk-SBBNT5ZJ.js +27 -0
  444. package/dist/chunk-SDJV2DTQ.js +491 -0
  445. package/dist/chunk-SDPIFNLD.js +33 -0
  446. package/dist/chunk-SF6YK3JI.js +835 -0
  447. package/dist/chunk-SK3ZFONO.js +976 -0
  448. package/dist/chunk-SKTFRFQ7.js +1775 -0
  449. package/dist/chunk-SNGM452K.js +2002 -0
  450. package/dist/chunk-STW7OFOA.js +581 -0
  451. package/dist/chunk-SU6UFUQY.js +1351 -0
  452. package/dist/chunk-SVJM3LJA.js +27 -0
  453. package/dist/chunk-SVUNZOPG.js +129 -0
  454. package/dist/chunk-T5XLUYV3.js +34 -0
  455. package/dist/chunk-T7E5JS6N.js +57 -0
  456. package/dist/chunk-TA3N5MMO.js +450 -0
  457. package/dist/chunk-TAJPCXSB.js +13 -0
  458. package/dist/chunk-TDEMDRN2.js +1639 -0
  459. package/dist/chunk-TDSEX5CF.js +24 -0
  460. package/dist/chunk-TGCVL74Y.js +28 -0
  461. package/dist/chunk-TGXXYDL4.js +1012 -0
  462. package/dist/chunk-TIKTYUJO.js +296 -0
  463. package/dist/chunk-TIZAJD4M.js +6029 -0
  464. package/dist/chunk-TLSEZZCG.js +5549 -0
  465. package/dist/chunk-TMBDRHAX.js +19 -0
  466. package/dist/chunk-TRURQUBP.js +1217 -0
  467. package/dist/chunk-TSQ256N5.js +152 -0
  468. package/dist/chunk-TUQMMFEQ.js +2244 -0
  469. package/dist/chunk-U424MJLC.js +81 -0
  470. package/dist/chunk-U4DRS6ZW.js +11 -0
  471. package/dist/chunk-U5KS22IN.js +204 -0
  472. package/dist/chunk-UAPHFJPN.js +673 -0
  473. package/dist/chunk-UB7LQITD.js +1040 -0
  474. package/dist/chunk-UBVRHGAZ.js +237 -0
  475. package/dist/chunk-UDNNAQN5.js +98 -0
  476. package/dist/chunk-UJP3XM54.js +342 -0
  477. package/dist/chunk-UJYDH2MW.js +305 -0
  478. package/dist/chunk-UKMPASIC.js +399 -0
  479. package/dist/chunk-UKUL3EHK.js +763 -0
  480. package/dist/chunk-UPHU64NB.js +1327 -0
  481. package/dist/chunk-URMSZXAD.js +43 -0
  482. package/dist/chunk-US3RT6CY.js +525 -0
  483. package/dist/chunk-UTDEOPKV.js +30 -0
  484. package/dist/chunk-UUUDKV7N.js +13 -0
  485. package/dist/chunk-UVKWU3SM.js +39 -0
  486. package/dist/chunk-V2TVPO3X.js +521 -0
  487. package/dist/chunk-V3KLVK7B.js +398 -0
  488. package/dist/chunk-V3YFFHDR.js +17 -0
  489. package/dist/chunk-VAG6GUBR.js +1162 -0
  490. package/dist/chunk-VBENAHDA.js +1814 -0
  491. package/dist/chunk-VBNCKCCI.js +16 -0
  492. package/dist/chunk-VCGSWN5M.js +1300 -0
  493. package/dist/chunk-VE2O2I7M.js +115 -0
  494. package/dist/chunk-VIFHYTI5.js +31 -0
  495. package/dist/chunk-VJER3FUS.js +5080 -0
  496. package/dist/chunk-VLMDM56Q.js +268 -0
  497. package/dist/chunk-VMFZEVVX.js +99 -0
  498. package/dist/chunk-VNDPQVUZ.js +1853 -0
  499. package/dist/chunk-VSPJRLGA.js +4783 -0
  500. package/dist/chunk-VSWC5ZXI.js +103 -0
  501. package/dist/chunk-VYI4DSZP.js +2017 -0
  502. package/dist/chunk-W4BAIQ6L.js +1212 -0
  503. package/dist/chunk-W7VQAL2K.js +2203 -0
  504. package/dist/chunk-WEI3ZDZH.js +33 -0
  505. package/dist/chunk-WEIUS5NT.js +26 -0
  506. package/dist/chunk-WEW7UFWE.js +546 -0
  507. package/dist/chunk-WGQAXLNA.js +384 -0
  508. package/dist/chunk-WJAL4JL3.js +206 -0
  509. package/dist/chunk-WKFOJ5ZG.js +141 -0
  510. package/dist/chunk-WMWQEFLN.js +2177 -0
  511. package/dist/chunk-WNECKKO2.js +154 -0
  512. package/dist/chunk-WPKLYOAM.js +195 -0
  513. package/dist/chunk-WSH37YQN.js +243 -0
  514. package/dist/chunk-WV3KQDPE.js +84 -0
  515. package/dist/chunk-WZFC4V4U.js +389 -0
  516. package/dist/chunk-XCOIBNET.js +13 -0
  517. package/dist/chunk-XDM65LBX.js +53 -0
  518. package/dist/chunk-XGU6PBO5.js +645 -0
  519. package/dist/chunk-XHOI4V62.js +43 -0
  520. package/dist/chunk-XIBVFMLQ.js +6858 -0
  521. package/dist/chunk-XJ2E7YEJ.js +117 -0
  522. package/dist/chunk-XON4ZCYX.js +69 -0
  523. package/dist/chunk-XQPEWJPI.js +127 -0
  524. package/dist/chunk-XSJTIFUY.js +31 -0
  525. package/dist/chunk-XT7OVWM3.js +64 -0
  526. package/dist/chunk-XTXYIISX.js +1104 -0
  527. package/dist/chunk-XV7NZL4B.js +57 -0
  528. package/dist/chunk-XWIZ6B5S.js +109 -0
  529. package/dist/chunk-XWLIKOBX.js +240 -0
  530. package/dist/chunk-XZOXEIN4.js +156 -0
  531. package/dist/chunk-XZRS7I7W.js +3673 -0
  532. package/dist/chunk-Y4ZDDHB6.js +44 -0
  533. package/dist/chunk-Y733RB7T.js +194 -0
  534. package/dist/chunk-YBHUB4XR.js +14931 -0
  535. package/dist/chunk-YKC75XK4.js +147 -0
  536. package/dist/chunk-YKMXFVK7.js +27 -0
  537. package/dist/chunk-YO5BAJ55.js +225 -0
  538. package/dist/chunk-YPDCLXNZ.js +568 -0
  539. package/dist/chunk-YSQPGVFK.js +116 -0
  540. package/dist/chunk-YTVVTIWJ.js +716 -0
  541. package/dist/chunk-YVCMDVBB.js +698 -0
  542. package/dist/chunk-YYTOA6DP.js +114 -0
  543. package/dist/chunk-Z5WGNULV.js +88 -0
  544. package/dist/chunk-Z6NGVVXG.js +66 -0
  545. package/dist/chunk-Z7CDQNH3.js +20 -0
  546. package/dist/chunk-ZH4G3FU5.js +187 -0
  547. package/dist/chunk-ZJB6SQPA.js +257 -0
  548. package/dist/chunk-ZL6E4HMY.js +42 -0
  549. package/dist/chunk-ZMLOC3DW.js +62 -0
  550. package/dist/chunk-ZORW64QH.js +101 -0
  551. package/dist/chunk-ZVVD2XGV.js +1369 -0
  552. package/dist/cli-utils-ER33ODC5.js +31 -0
  553. package/dist/cli-validation-6CHPTANV.js +146 -0
  554. package/dist/commit-utils-3STAY7C7.js +49 -0
  555. package/dist/compatibility-notice-IHNXR2JR.js +21 -0
  556. package/dist/compete-config-resolver-V3GDNJMM.js +125 -0
  557. package/dist/compete-results-XUM3PJHS.js +318 -0
  558. package/dist/competition-outcome-tracker-NWSMVUPG.js +62 -0
  559. package/dist/config-4HHE4OIK.js +238 -0
  560. package/dist/config-D6YAZASH.js +10 -0
  561. package/dist/config-MIPRDYYV.js +46 -0
  562. package/dist/config-audit-GA5DCUAI.js +371 -0
  563. package/dist/config-explain-4LMO556H.js +71 -0
  564. package/dist/config-loader-RGP634PC.js +51 -0
  565. package/dist/config-manager-J2UTO635.js +114 -0
  566. package/dist/config-merger-TVUJBZTS.js +14 -0
  567. package/dist/config-validator-H4ZVIE56.js +122 -0
  568. package/dist/cost-HSIV5U2Y.js +85 -0
  569. package/dist/data-migration-state-OAUL2WPQ.js +35 -0
  570. package/dist/db-migrator-NUOW5NKR.js +34 -0
  571. package/dist/default-paths-UILB62BN.js +49 -0
  572. package/dist/discovery-V6GYUJUC.js +53 -0
  573. package/dist/doctor-BBSMCDWE.js +271 -0
  574. package/dist/doctor-context-blocks-LPY75VZA.js +231 -0
  575. package/dist/doctor-instructions-import-JXHDDOE5.js +70 -0
  576. package/dist/doctor-purpose-6YJOXPBE.js +30 -0
  577. package/dist/domain-analyzer-S35ABUNA.js +48 -0
  578. package/dist/ensure-initialized-Q6PEU55O.js +78 -0
  579. package/dist/entry.js +922 -0
  580. package/dist/error-parser-core-MZFMFANN.js +70 -0
  581. package/dist/evaluation-context-GQBYDAEV.js +63 -0
  582. package/dist/evidence-plan-resolver-5FUAP3SA.js +111 -0
  583. package/dist/execution-data-writer-YCG5UH37.js +72 -0
  584. package/dist/execution-policy-applier-PWZM5LNA.js +63 -0
  585. package/dist/execution-preflight-DASJWWQF.js +223 -0
  586. package/dist/execution-roles-KNSNNB2D.js +112 -0
  587. package/dist/exit-code-error-QIY5DOKF.js +18 -0
  588. package/dist/external-temp-cleanup-CAW7LQ6R.js +360 -0
  589. package/dist/factory-YCYCB7AE.js +209 -0
  590. package/dist/file-utils-ZQYNBQBW.js +45 -0
  591. package/dist/flywheel-allowlist-revert-H22HA6JE.js +21 -0
  592. package/dist/flywheel-autoloop-executor-PDOASJEZ.js +316 -0
  593. package/dist/flywheel-autoloop-unverified-TOKYFCDC.js +36 -0
  594. package/dist/flywheel-competition-executor-YJUMMEJO.js +320 -0
  595. package/dist/flywheel-executor-JWU43KAY.js +437 -0
  596. package/dist/flywheel-git-isolation-FQ2TRWMB.js +56 -0
  597. package/dist/flywheel-manifest-HDPNMWWF.js +114 -0
  598. package/dist/flywheel-model-defaults-UHAKTZT3.js +110 -0
  599. package/dist/flywheel-preflight-III2C7TH.js +163 -0
  600. package/dist/flywheel-resume-2O45MS7Y.js +31 -0
  601. package/dist/flywheel-resume-execution-lease-P2BK257J.js +59 -0
  602. package/dist/flywheel-safety-AVAVFXIJ.js +19 -0
  603. package/dist/flywheel-scope-decision-ALJUUNGG.js +14 -0
  604. package/dist/get-telemetry-logger-MPDVO2JA.js +155 -0
  605. package/dist/git-message-style-KCXGMTDT.js +104 -0
  606. package/dist/guidance-profile-config-G3K5YQOO.js +113 -0
  607. package/dist/guidance-profile-renderer-TX4TNDFL.js +23 -0
  608. package/dist/identity-XLQJ4YJF.js +25 -0
  609. package/dist/index-query-6NUY4FKX.js +37 -0
  610. package/dist/index.js +85588 -0
  611. package/dist/indexer-DL54CM3K.js +44 -0
  612. package/dist/init-OUZ72344.js +245 -0
  613. package/dist/instructions-import-offer-NSYXSITC.js +363 -0
  614. package/dist/instructions-run-NBII7W36.js +114 -0
  615. package/dist/interrupted-work-E4TLKJLE.js +43 -0
  616. package/dist/invoke-provider-auth-NEWEIHCI.js +38 -0
  617. package/dist/judge-scoring.json +64 -0
  618. package/dist/lab-mode-YXQ2Y3NG.js +44 -0
  619. package/dist/lab-utils-5QAMDJR5.js +29 -0
  620. package/dist/linux-host-class-YDWQX65O.js +31 -0
  621. package/dist/llm-judge-executor-OJSNCTFJ.js +179 -0
  622. package/dist/local-ci-config-VZ4WWDT5.js +48 -0
  623. package/dist/local-executor-DCMDDRX2.js +280 -0
  624. package/dist/logger-5KNKS3O4.js +154 -0
  625. package/dist/matrix-prompt-builder-4ZBOGZSB.js +527 -0
  626. package/dist/matrix-result-parser-EZJM4YXP.js +14 -0
  627. package/dist/merge-batch-RTEEMVDB.js +313 -0
  628. package/dist/merge-batch-members-VIWGVRHP.js +24 -0
  629. package/dist/merge-queue-TIIUSOY6.js +126 -0
  630. package/dist/merge-queue-trust-DUNZ4J65.js +21 -0
  631. package/dist/metadata-UKSMWM6J.js +29 -0
  632. package/dist/model-catalog-readiness-R5KJBP5M.js +202 -0
  633. package/dist/model-invocations-db-XTUPPQ34.js +70 -0
  634. package/dist/model-resolver-JFZ2MHOJ.js +39 -0
  635. package/dist/model-resolver-SCQ57KAQ.js +217 -0
  636. package/dist/model-roles-D3OR4NAH.js +110 -0
  637. package/dist/monitor-F4SIU5G2.js +96 -0
  638. package/dist/nested-worktrees-2WUWQ75N.js +23 -0
  639. package/dist/next-S3IRLVER.js +96 -0
  640. package/dist/next-UKPFRXOO.js +148 -0
  641. package/dist/opportunistic-TL4S26VX.js +86 -0
  642. package/dist/optimization-config-resolver-NAEIYU6A.js +148 -0
  643. package/dist/package-HJR4QJT4.js +10 -0
  644. package/dist/parse-git-status-7PIYFPS2.js +21 -0
  645. package/dist/path-security-5WJSY56G.js +41 -0
  646. package/dist/paths-JUI7C4KU.js +45 -0
  647. package/dist/plan-backlog-list-fast-SSTQL5XP.js +89 -0
  648. package/dist/plan-backlog-show-fast-PFRAQ3JB.js +114 -0
  649. package/dist/plan-sprint-list-fast-HD2KBZSY.js +110 -0
  650. package/dist/plan-sprint-status-fast-YFYH7WQF.js +116 -0
  651. package/dist/plan-task-status-fast-JU5PNLUU.js +114 -0
  652. package/dist/plan-to-flywheel-PY5MSY2H.js +529 -0
  653. package/dist/preflight-PJHGTJNZ.js +12 -0
  654. package/dist/process-registry-B4ZUCN7T.js +28 -0
  655. package/dist/process-scanner-TU3QHWVB.js +23 -0
  656. package/dist/processes-6FHVGT72.js +28 -0
  657. package/dist/processes-json-fast-YWTMUWXB.js +72 -0
  658. package/dist/profile-HWTC56SG.js +209 -0
  659. package/dist/project-runtime-paths-2UQNG5Y4.js +41 -0
  660. package/dist/protected-branches-N36LDBFY.js +71 -0
  661. package/dist/provider-aware-resource-manager-YTFAHNGJ.js +40 -0
  662. package/dist/provider-matrix-2KO2V5OM.js +214 -0
  663. package/dist/provider-matrix-renderer-MEC3PER7.js +139 -0
  664. package/dist/provider-output-forwarding-2AHL7YMA.js +26 -0
  665. package/dist/provider-registry-WCZ65QHC.js +136 -0
  666. package/dist/provider-temp-cleanup-IUNPJCZF.js +14 -0
  667. package/dist/prune-engine-EOQVWEP6.js +448 -0
  668. package/dist/publication-turn-S42RZTQF.js +44 -0
  669. package/dist/quality-gate-JQMVCKOO.js +72 -0
  670. package/dist/quickstart-3O6FRCFB.js +105 -0
  671. package/dist/readiness-GW6ABRHB.js +139 -0
  672. package/dist/readiness-KFZCXDTT.js +215 -0
  673. package/dist/registry-7XG376SY.js +217 -0
  674. package/dist/repair-helpers-TTV5FEF4.js +117 -0
  675. package/dist/repo-root-YG6MQZDW.js +28 -0
  676. package/dist/resolution-engine-FFEK7HQ2.js +187 -0
  677. package/dist/resolve-provider-cli-ZEXVZKET.js +44 -0
  678. package/dist/restore-telemetry-db-E7BR5PO7.js +459 -0
  679. package/dist/routing-events-AW6SRZ6G.js +13 -0
  680. package/dist/routing-history-store-FMDDQL6W.js +39 -0
  681. package/dist/routing-planner-C6OHO3EY.js +221 -0
  682. package/dist/runner-KHDNQ5KU.js +1194 -0
  683. package/dist/runner-PIS2BW7Y.js +1801 -0
  684. package/dist/safety-E3JJVSFL.js +67 -0
  685. package/dist/safety-stanza-HE6GXP4G.js +49 -0
  686. package/dist/sandbox-7LBZC5PE.js +72 -0
  687. package/dist/sandbox-ASWCDYZL.js +80 -0
  688. package/dist/schema-extensions.sql +234 -0
  689. package/dist/security-JI22TBEB.js +17 -0
  690. package/dist/setup-bb-plugin-FQXLA76Y.js +531 -0
  691. package/dist/setup-claude-code-NF4ZSHVE.js +197 -0
  692. package/dist/setup-temp-cleanup-2APZ4HMA.js +29 -0
  693. package/dist/shared-utils-34HJZ6JX.js +40 -0
  694. package/dist/simple-artifact-goal-MQLDDMMX.js +29 -0
  695. package/dist/sprint-N7JFTEGL.js +403 -0
  696. package/dist/sprint-bridge-KJXIBNRJ.js +117 -0
  697. package/dist/sprint-completion-dependents-34SR7JVL.js +43 -0
  698. package/dist/sprint-execution-service-A6JPUBWY.js +376 -0
  699. package/dist/sprint-manager-MU2ZUWN2.js +140 -0
  700. package/dist/sqlite-timeout-config-U2CT4LKU.js +13 -0
  701. package/dist/sqlite-wrapper-FSGJ2QEW.js +19 -0
  702. package/dist/stale-cleanup-orchestrator-4X6324VF.js +71 -0
  703. package/dist/storage-access-I3V5LER7.js +31 -0
  704. package/dist/store-XVG64ZR2.js +25 -0
  705. package/dist/task-classifier-MN2DYE5R.js +558 -0
  706. package/dist/task-list-fast-7AT6LTTA.js +112 -0
  707. package/dist/task-manager-LHPBBRRE.js +136 -0
  708. package/dist/task-report-OLPAWBTK.js +64 -0
  709. package/dist/task-type-detector-6RG3YNZF.js +27 -0
  710. package/dist/task-type-resolver-EQHOUIHT.js +64 -0
  711. package/dist/telemetry-5VYSK772.js +212 -0
  712. package/dist/telemetry-health-tracker-4GFW2EMP.js +12 -0
  713. package/dist/telemetry-path-resolver-H3NFHHQY.js +34 -0
  714. package/dist/telemetry-reliability-URJDTNPZ.js +76 -0
  715. package/dist/transports-NREZQTJK.js +106 -0
  716. package/dist/unified-cost-tracker-5MTBJ2CL.js +59 -0
  717. package/dist/unified-state-cleanup-GGAXLHXF.js +292 -0
  718. package/dist/universal-cost-calculator-JTFEJVWK.js +70 -0
  719. package/dist/user-agents-QLIGPLP2.js +30 -0
  720. package/dist/variant-execution-I4ZZUAWY.js +319 -0
  721. package/dist/variant-opt-parser-JHCXKY2K.js +251 -0
  722. package/dist/variant-request-input-PL37N3AN.js +11 -0
  723. package/dist/variant-state-cleanup-KHMXRBZN.js +287 -0
  724. package/dist/variant-worker-COB5YTJX.js +4517 -0
  725. package/dist/variant-worker.js +26 -0
  726. package/dist/variants-XGDSXYG3.js +267 -0
  727. package/dist/verification-command-YSPU4VBH.js +66 -0
  728. package/dist/verify-command-timeout-DQUYH33Z.js +11 -0
  729. package/dist/verify-commands-LOHMOFKC.js +65 -0
  730. package/dist/warning-JSKSFKBT.js +13 -0
  731. package/dist/work-edge-K65NHVWY.js +50 -0
  732. package/dist/work-item-writer-KY5ZWZWW.js +30 -0
  733. package/dist/worker-JNXXEIT6.js +1504 -0
  734. package/dist/worker.js +21 -0
  735. package/dist/workspace-tree-identity-JO5PSKTW.js +52 -0
  736. package/dist/worktree-environment-WTVABAQW.js +64 -0
  737. package/dist/worktree-metrics-VZRQI26T.js +66 -0
  738. package/dist/writeback-TQFQBJNU.js +50 -0
  739. package/docs/CLI_REFERENCE.md +8287 -0
  740. package/docs/PROVIDER_SETUP.md +1737 -0
  741. package/docs/README.md +96 -0
  742. package/docs/TROUBLESHOOTING.md +2209 -0
  743. package/docs/getting-started/QUICK_START.md +260 -0
  744. package/docs/getting-started/README.md +198 -0
  745. package/docs/getting-started/SETUP.md +25 -0
  746. package/docs/reference/AGENT_CONTEXT.md +84 -0
  747. package/docs/reference/DELIVERY_ONBOARDING.md +198 -0
  748. package/docs/reference/PROVIDER_RELEASE_TIERS.md +34 -0
  749. package/docs/reference/SECURITY.md +291 -0
  750. package/docs/reference/TELEMETRY_PRIVACY.md +259 -0
  751. package/integrations/bb-plugin-build/README.md +391 -0
  752. package/integrations/bb-plugin-build/app.css +431 -0
  753. package/integrations/bb-plugin-build/app.tsx +6210 -0
  754. package/integrations/bb-plugin-build/package.json +45 -0
  755. package/integrations/bb-plugin-build/server.ts +488 -0
  756. package/integrations/bb-plugin-build/src/adapter.ts +3672 -0
  757. package/integrations/bb-plugin-build/src/backlog-authoring-model.ts +150 -0
  758. package/integrations/bb-plugin-build/src/backlog-authoring-schema.ts +458 -0
  759. package/integrations/bb-plugin-build/src/backlog-authoring-service.ts +467 -0
  760. package/integrations/bb-plugin-build/src/backlog-authoring-view.ts +1025 -0
  761. package/integrations/bb-plugin-build/src/command-evidence-schema.ts +13 -0
  762. package/integrations/bb-plugin-build/src/competition-defaults-schema.ts +122 -0
  763. package/integrations/bb-plugin-build/src/competition-defaults-service.ts +105 -0
  764. package/integrations/bb-plugin-build/src/competition-defaults-view.ts +138 -0
  765. package/integrations/bb-plugin-build/src/contract.ts +718 -0
  766. package/integrations/bb-plugin-build/src/execution-activity-view.ts +98 -0
  767. package/integrations/bb-plugin-build/src/finalize-model.ts +205 -0
  768. package/integrations/bb-plugin-build/src/finalize-schema.ts +150 -0
  769. package/integrations/bb-plugin-build/src/finalize-service.ts +330 -0
  770. package/integrations/bb-plugin-build/src/finalize-view.ts +159 -0
  771. package/integrations/bb-plugin-build/src/judge-operations-readback.ts +303 -0
  772. package/integrations/bb-plugin-build/src/judge-operations-schema.ts +33 -0
  773. package/integrations/bb-plugin-build/src/judge-operations-view.ts +459 -0
  774. package/integrations/bb-plugin-build/src/model.ts +1318 -0
  775. package/integrations/bb-plugin-build/src/monitor-service.ts +233 -0
  776. package/integrations/bb-plugin-build/src/panel-read-ux.ts +97 -0
  777. package/integrations/bb-plugin-build/src/patch-preview-schema.ts +166 -0
  778. package/integrations/bb-plugin-build/src/patch-preview-service.ts +480 -0
  779. package/integrations/bb-plugin-build/src/patch-preview-view.ts +109 -0
  780. package/integrations/bb-plugin-build/src/planning-readback.ts +228 -0
  781. package/integrations/bb-plugin-build/src/planning-service.ts +647 -0
  782. package/integrations/bb-plugin-build/src/planning-sync-evidence.ts +37 -0
  783. package/integrations/bb-plugin-build/src/planning-workspace-readback.ts +33 -0
  784. package/integrations/bb-plugin-build/src/planning-workspace-schema.ts +131 -0
  785. package/integrations/bb-plugin-build/src/planning-workspace.ts +333 -0
  786. package/integrations/bb-plugin-build/src/poll-handoff.ts +136 -0
  787. package/integrations/bb-plugin-build/src/project-target-server.ts +21 -0
  788. package/integrations/bb-plugin-build/src/project-target.ts +45 -0
  789. package/integrations/bb-plugin-build/src/reference-index.ts +218 -0
  790. package/integrations/bb-plugin-build/src/repository-identity.ts +17 -0
  791. package/integrations/bb-plugin-build/src/repository-schema.ts +30 -0
  792. package/integrations/bb-plugin-build/src/result-explorer-view.ts +597 -0
  793. package/integrations/bb-plugin-build/src/result-readback-model.ts +163 -0
  794. package/integrations/bb-plugin-build/src/result-readback-schema.ts +319 -0
  795. package/integrations/bb-plugin-build/src/result-readback-service.ts +333 -0
  796. package/integrations/bb-plugin-build/src/run-page-view.ts +332 -0
  797. package/integrations/bb-plugin-build/src/setup-config-schema.ts +293 -0
  798. package/integrations/bb-plugin-build/src/setup-config-service.ts +620 -0
  799. package/integrations/bb-plugin-build/src/setup-config-view.ts +388 -0
  800. package/integrations/bb-plugin-build/src/sprint-close-model.ts +150 -0
  801. package/integrations/bb-plugin-build/src/sprint-close-schema.ts +128 -0
  802. package/integrations/bb-plugin-build/src/sprint-close-service.ts +293 -0
  803. package/integrations/bb-plugin-build/src/sprint-close-view.ts +116 -0
  804. package/integrations/bb-plugin-build/src/sprint-composition-model.ts +709 -0
  805. package/integrations/bb-plugin-build/src/sprint-composition-readback.ts +231 -0
  806. package/integrations/bb-plugin-build/src/sprint-composition-schema.ts +597 -0
  807. package/integrations/bb-plugin-build/src/sprint-composition-service.ts +773 -0
  808. package/integrations/bb-plugin-build/src/sprint-composition-view.ts +1221 -0
  809. package/integrations/bb-plugin-build/src/sprint-execution-schema.ts +188 -0
  810. package/integrations/bb-plugin-build/src/sprint-execution-service.ts +289 -0
  811. package/integrations/bb-plugin-build/src/sprint-execution-view.ts +54 -0
  812. package/integrations/bb-plugin-build/src/task-authoring-model.ts +563 -0
  813. package/integrations/bb-plugin-build/src/task-authoring-schema.ts +629 -0
  814. package/integrations/bb-plugin-build/src/task-authoring-service.ts +842 -0
  815. package/integrations/bb-plugin-build/src/task-authoring-view.ts +1227 -0
  816. package/integrations/bb-plugin-build/src/task-catalog-schema.ts +46 -0
  817. package/integrations/bb-plugin-build/src/task-catalog-service.ts +44 -0
  818. package/integrations/bb-plugin-build/src/task-detail-readback.ts +56 -0
  819. package/integrations/bb-plugin-build/src/task-detail-schema.ts +171 -0
  820. package/integrations/bb-plugin-build/src/task-navigation.ts +446 -0
  821. package/integrations/bb-plugin-build/src/workbench-route.ts +74 -0
  822. package/package.json +306 -4
  823. package/schemas/README.md +80 -0
  824. package/schemas/build.config.schema.json +2110 -0
  825. package/schemas/config-v1.schema.json +136 -0
  826. package/schemas/execution-config.schema.json +47 -0
  827. package/schemas/judge-scoring.schema.json +257 -0
  828. package/schemas/provider-config.schema.json +179 -0
  829. package/schemas/telemetry-config.schema.json +79 -0
  830. package/schemas/user-preferences.schema.json +141 -0
  831. package/scripts/assert-node-runtime.mjs +146 -0
  832. package/scripts/preflight-native.mjs +49 -0
  833. package/scripts/setup-git-hooks.mjs +39 -0
  834. package/scripts/sync.sh +2871 -0
  835. package/scripts/write-node-launcher.sh +138 -0
  836. package/src/resources/gemini/slash-packs/default/plan.toml +15 -0
  837. package/src/resources/gemini/slash-packs/default/summary.toml +16 -0
  838. package/src/resources/gemini/slash-packs/default/tests.toml +16 -0
  839. package/templates/.build-project/README.md +41 -0
  840. package/templates/.build-project/agents/README.md +50 -0
  841. package/templates/.build-project/agents/architect.md +10 -0
  842. package/templates/.build-project/agents/code-reviewer.md +10 -0
  843. package/templates/.build-project/agents/debugger.md +10 -0
  844. package/templates/.build-project/agents/documenter.md +10 -0
  845. package/templates/.build-project/agents/test-automator.md +10 -0
  846. package/templates/.build-project/config/build.config.jsonc +64 -0
  847. package/templates/.build-project/config/project-context.template.json +6 -0
  848. package/templates/.build-project/config/task-type-aliases.presets/kanban.yaml +14 -0
  849. package/templates/.build-project/config/task-type-aliases.presets/scrum.yaml +17 -0
  850. package/templates/.build-project/config/task-type-aliases.presets/xp.yaml +12 -0
  851. package/templates/.build-project/config/task-type-aliases.yaml +29 -0
  852. package/templates/.build-project/gitignore.template +70 -0
  853. package/templates/.build-project/task-types/analysis.yaml +38 -0
  854. package/templates/.build-project/task-types/architecture.yaml +35 -0
  855. package/templates/.build-project/task-types/doc.yaml +34 -0
  856. package/templates/.build-project/task-types/feature.yaml +22 -0
  857. package/templates/.build-project/task-types/general.yaml +4 -0
  858. package/templates/.build-project/task-types/security.yaml +38 -0
  859. package/templates/AGENTS.template.md +85 -0
  860. package/templates/CLAUDE.template.md +1 -0
  861. package/templates/GEMINI.template.md +1 -0
  862. package/templates/builtin-workflows/code-review.yaml +73 -0
  863. package/templates/builtin-workflows/skills/code-review/SKILL.md +61 -0
  864. package/templates/builtin-workflows/skills/execution-contract-analysis/SKILL.md +24 -0
  865. package/templates/builtin-workflows/skills/execution-contract-code/SKILL.md +19 -0
  866. package/templates/builtin-workflows/skills/execution-contract-structured/SKILL.md +17 -0
  867. package/templates/ci/incident-intake.mjs +787 -0
  868. package/templates/ci/incidents.yml.template +103 -0
  869. package/templates/ci/node.yml.template +17 -0
  870. package/templates/ci/python.yml.template +17 -0
  871. package/templates/guard-kit/GUARD_SETUP.md.template +258 -0
  872. package/templates/guard-kit/build-guard.yml.template +189 -0
  873. package/templates/guard-kit/check.mjs.template +932 -0
  874. package/templates/guard-kit/config.json.template +7 -0
  875. package/templates/guard-kit/policy.json.template +1 -0
  876. package/templates/profiles/README.md +57 -0
  877. package/templates/profiles/frontier-claude.json +23 -0
  878. package/templates/profiles/frontier-codex.json +23 -0
@@ -0,0 +1,1327 @@
1
+ import {
2
+ formatBytes
3
+ } from "./chunk-JLS65NUQ.js";
4
+ import {
5
+ isAncestor,
6
+ isStorageLockBusyError,
7
+ resolveRevision,
8
+ trackingRef,
9
+ withStorageLock
10
+ } from "./chunk-BAWJNMWF.js";
11
+ import {
12
+ contentAlreadyInDefault,
13
+ isSessionOwnedPath,
14
+ listSessionWorktrees,
15
+ sessionActivityMs
16
+ } from "./chunk-LX4F24ZH.js";
17
+ import {
18
+ resolvePlanningContextForRoot
19
+ } from "./chunk-BBPIILO2.js";
20
+ import {
21
+ CLEANUP_LOCK_FILENAME,
22
+ describeCleanupLockState,
23
+ formatCleanupLockContentionMessage,
24
+ isActiveRun,
25
+ isCleanupLockContentionError,
26
+ peekActiveRun,
27
+ tryWithCleanupLock,
28
+ withCleanupLock
29
+ } from "./chunk-2NMNFUQA.js";
30
+ import {
31
+ enqueueBranchCleanup,
32
+ getBranchCleanupQueuePath
33
+ } from "./chunk-MULMXX4V.js";
34
+ import {
35
+ parseGitWorktreePorcelain
36
+ } from "./chunk-UTDEOPKV.js";
37
+ import {
38
+ isProtectedPipelineBranch,
39
+ resolveDefaultBranch
40
+ } from "./chunk-XGU6PBO5.js";
41
+ import {
42
+ canonicalizePath,
43
+ safeRmDir
44
+ } from "./chunk-ALDTFNZ3.js";
45
+ import {
46
+ LabPathResolver
47
+ } from "./chunk-C3KCMAJP.js";
48
+ import {
49
+ execGit
50
+ } from "./chunk-MHLEZQQI.js";
51
+ import {
52
+ findProjectRoot
53
+ } from "./chunk-35J4NE6S.js";
54
+ import {
55
+ isQuietOutputRequested
56
+ } from "./chunk-XWIZ6B5S.js";
57
+ import {
58
+ listPreviousWorktreePools,
59
+ resolveSessionBase,
60
+ resolveWorktreeBase
61
+ } from "./chunk-56WPYDJH.js";
62
+ import {
63
+ BUILD_DEBUG,
64
+ BUILD_WORKTREE_TTL_DAYS,
65
+ emitWarning,
66
+ readEnv,
67
+ readRawEnv
68
+ } from "./chunk-7VRJHTGZ.js";
69
+
70
+ // src/core/cleanup/session-cleanup.ts
71
+ import { promises as fs } from "fs";
72
+ import path from "path";
73
+ var ACTIVE_WINDOW_MS = 30 * 60 * 1e3;
74
+ var READ_ONLY_GIT_ENV = { GIT_OPTIONAL_LOCKS: "0" };
75
+ async function runGit(cwd, args) {
76
+ try {
77
+ const result = await execGit(args, { cwd, timeoutMs: 2e4, env: READ_ONLY_GIT_ENV });
78
+ return { ok: result.exitCode === 0, stdout: result.stdout };
79
+ } catch {
80
+ return { ok: false, stdout: "" };
81
+ }
82
+ }
83
+ async function canonical(p) {
84
+ return fs.realpath(p).catch(() => path.resolve(p));
85
+ }
86
+ function isWithin(child, parent) {
87
+ const rel = path.relative(parent, child);
88
+ return rel === "" || !rel.startsWith("..") && !path.isAbsolute(rel);
89
+ }
90
+ async function listRegistered(repoRoot) {
91
+ const result = await execGit(["worktree", "list", "--porcelain"], { cwd: repoRoot });
92
+ if (result.exitCode !== 0) {
93
+ throw new Error(`git worktree list exited ${result.exitCode}: ${result.stderr.trim()}`);
94
+ }
95
+ const entries = [];
96
+ for (const line of result.stdout.split("\n")) {
97
+ if (line.startsWith("worktree ")) {
98
+ entries.push({ path: await canonical(line.slice("worktree ".length)), locked: false });
99
+ } else if (line === "locked" || line.startsWith("locked ")) {
100
+ const last = entries[entries.length - 1];
101
+ if (last) last.locked = true;
102
+ }
103
+ }
104
+ return entries;
105
+ }
106
+ async function statusEntries(cwd, ignored, pathspecs = []) {
107
+ const result = await runGit(cwd, [
108
+ "status",
109
+ "--porcelain=v1",
110
+ "-z",
111
+ "--untracked-files=all",
112
+ `--ignored=${ignored}`,
113
+ ...pathspecs.length > 0 ? ["--", ...pathspecs] : []
114
+ ]);
115
+ if (!result.ok) return void 0;
116
+ return result.stdout.split("\0").filter(Boolean).map((entry) => [entry.slice(0, 2), entry.slice(3)]);
117
+ }
118
+ var REGENERABLE_BUILD_OUTPUTS = ["dist", "coverage", ".tsbuildinfo"];
119
+ var WORKING_DOC_DIRS = [".build-project/planning", ".build-project/security"];
120
+ async function ignoredWorkingDocs(cwd) {
121
+ const docs = await statusEntries(cwd, "traditional", WORKING_DOC_DIRS);
122
+ return docs?.filter(([code]) => code === "!!").map(([, file]) => file);
123
+ }
124
+ async function regenerableIgnored(lane) {
125
+ const recorded = (await fs.readFile(path.join(lane, ".build-project", "session", "ignored-untracked"), "utf8").catch(() => "")).split("\n").map((line) => line.trim().replace(/\/+$/, "")).filter(Boolean);
126
+ const fixed = ["node_modules", ...REGENERABLE_BUILD_OUTPUTS, ...recorded];
127
+ return (file) => {
128
+ const bare = file.replace(/\/+$/, "");
129
+ if (bare === ".build-project" || bare.startsWith(".build-project/")) return true;
130
+ if (!bare.includes("/") && bare.endsWith(".tsbuildinfo")) return true;
131
+ return fixed.some((entry) => bare === entry || bare.startsWith(`${entry}/`));
132
+ };
133
+ }
134
+ async function branchStartCommit(lane, branch) {
135
+ const result = await runGit(lane, ["reflog", "show", "--format=%H", `refs/heads/${branch}`]);
136
+ if (!result.ok) return void 0;
137
+ const oldest = result.stdout.split("\n").filter(Boolean).pop()?.trim();
138
+ return oldest && /^[0-9a-f]{40,64}$/.test(oldest) ? oldest : void 0;
139
+ }
140
+ async function inspectStorageChild(childPath, ctx, reasons) {
141
+ if (await peekActiveRun(childPath).catch(() => true)) {
142
+ reasons.push("planning worktree has an active run");
143
+ }
144
+ const status = await statusEntries(childPath, "matching");
145
+ if (!status) {
146
+ reasons.push("planning worktree could not be inspected");
147
+ return void 0;
148
+ }
149
+ if (status.length > 0) {
150
+ reasons.push("planning worktree has uncommitted or ignored files");
151
+ }
152
+ const head = await resolveRevision(childPath, "HEAD");
153
+ const tip = await resolveRevision(childPath, trackingRef(ctx));
154
+ if (!head || !tip) {
155
+ reasons.push("planning worktree remote ref is unavailable");
156
+ } else if (!await isAncestor(childPath, head, tip)) {
157
+ reasons.push("planning worktree has unpublished commits");
158
+ }
159
+ return head;
160
+ }
161
+ async function inspectLane(repoRoot, session, registered, defaultBranch, options) {
162
+ const reasons = [...session.problems];
163
+ const snapshot = {};
164
+ const lane = session.path;
165
+ const callers = [await canonical(options.callerCwd), await canonical(repoRoot)];
166
+ if (callers.some((caller) => isWithin(caller, lane))) {
167
+ reasons.push("current directory is inside this session");
168
+ }
169
+ if (!session.branch) {
170
+ reasons.push("no branch checked out");
171
+ } else if (isProtectedPipelineBranch(session.branch, void 0, repoRoot)) {
172
+ reasons.push("protected branch");
173
+ }
174
+ if (session.locked) reasons.push("locked by git");
175
+ const nested = registered.filter((entry) => entry.path !== lane && isWithin(entry.path, lane));
176
+ let childPath;
177
+ let ctx;
178
+ try {
179
+ ctx = resolvePlanningContextForRoot(lane);
180
+ if (ctx.backend === "git-branch") childPath = await canonical(ctx.storageRoot);
181
+ } catch {
182
+ reasons.push("planning storage configuration could not be read");
183
+ }
184
+ const childRegistered = childPath ? nested.find((entry) => entry.path === childPath) : void 0;
185
+ for (const entry of nested) {
186
+ if (entry !== childRegistered) {
187
+ reasons.push(`nested worktree ${path.relative(lane, entry.path)}`);
188
+ }
189
+ }
190
+ const childExists = childPath ? await fs.stat(childPath).then(
191
+ () => true,
192
+ () => false
193
+ ) : false;
194
+ if (childPath && childExists && !childRegistered) {
195
+ reasons.push("planning storage directory is not a registered worktree");
196
+ }
197
+ for (const target of [lane, ...nested.map((entry) => entry.path)]) {
198
+ if (await peekActiveRun(target).catch(() => true)) {
199
+ reasons.push("active run");
200
+ break;
201
+ }
202
+ }
203
+ const head = await resolveRevision(lane, "HEAD");
204
+ snapshot.head = head;
205
+ const commitSeconds = Number((await runGit(lane, ["log", "-1", "--format=%ct"])).stdout.trim());
206
+ const lastActive = Math.max(
207
+ Number.isFinite(commitSeconds) ? commitSeconds * 1e3 : 0,
208
+ await sessionActivityMs(lane)
209
+ );
210
+ if (!head) reasons.push("HEAD could not be resolved");
211
+ else if (options.now - lastActive < ACTIVE_WINDOW_MS)
212
+ reasons.push("active in the last 30 minutes");
213
+ const status = await statusEntries(lane, "matching");
214
+ if (!status) {
215
+ reasons.push("status could not be inspected");
216
+ } else {
217
+ const childRel = childPath ? `${path.relative(lane, childPath).split(path.sep).join("/")}/` : void 0;
218
+ const isRegenerable = await regenerableIgnored(lane);
219
+ const exempt = ([code, file]) => childRegistered !== void 0 && file === childRel && (code === "??" || code === "!!") || code === "!!" && isRegenerable(file);
220
+ const dirty = status.filter((entry) => !exempt(entry));
221
+ if (dirty.some(([code]) => code !== "??" && code !== "!!")) reasons.push("uncommitted changes");
222
+ if (dirty.some(([code]) => code === "??")) reasons.push("untracked files");
223
+ const docs = await ignoredWorkingDocs(lane);
224
+ const ignoredPaths = [
225
+ ...dirty.filter(([code]) => code === "!!").map(([, file]) => file),
226
+ ...docs ?? []
227
+ ];
228
+ if (!docs) reasons.push("status could not be inspected");
229
+ if (ignoredPaths.length > 0) {
230
+ const shown = ignoredPaths.slice(0, 3).join(", ");
231
+ const more = ignoredPaths.length > 3 ? ` (+${ignoredPaths.length - 3} more)` : "";
232
+ reasons.push(`ignored files: ${shown}${more}`);
233
+ }
234
+ }
235
+ if (head && session.branch) {
236
+ const start = await branchStartCommit(lane, session.branch);
237
+ if (!start) reasons.push("session start commit could not be determined");
238
+ else if (start === head) reasons.push("no commits since the session started");
239
+ }
240
+ const defaultRef = `refs/remotes/origin/${defaultBranch}`;
241
+ const defaultSha = await resolveRevision(lane, defaultRef);
242
+ snapshot.defaultSha = defaultSha;
243
+ if (!defaultSha) {
244
+ reasons.push(`origin/${defaultBranch} is not available`);
245
+ } else if (!await contentAlreadyInDefault(lane, defaultRef)) {
246
+ reasons.push(`not in origin/${defaultBranch}`);
247
+ }
248
+ if (childPath && childRegistered && ctx) {
249
+ if (childRegistered.locked) reasons.push("planning worktree is locked");
250
+ snapshot.childPath = childPath;
251
+ snapshot.childHead = await inspectStorageChild(childPath, ctx, reasons);
252
+ }
253
+ const kept = reasons.length > 0;
254
+ return {
255
+ entry: {
256
+ path: lane,
257
+ branch: session.branch,
258
+ state: kept ? "kept" : "eligible",
259
+ reasons: [...new Set(reasons)]
260
+ },
261
+ snapshot
262
+ };
263
+ }
264
+ async function inspectAll(repoRoot, options) {
265
+ const resolved = {
266
+ now: options.now ?? Date.now(),
267
+ callerCwd: options.callerCwd ?? process.cwd()
268
+ };
269
+ const report = { sessions: [], eligible: [], kept: [], errors: [] };
270
+ const snapshots = /* @__PURE__ */ new Map();
271
+ let sessions;
272
+ let registered;
273
+ try {
274
+ sessions = await listSessionWorktrees(repoRoot);
275
+ registered = await listRegistered(repoRoot);
276
+ } catch (error) {
277
+ report.errors.push(error instanceof Error ? error.message : String(error));
278
+ return { report, snapshots };
279
+ }
280
+ const defaultBranch = await resolveDefaultBranch(repoRoot);
281
+ for (const session of sessions) {
282
+ try {
283
+ const { entry, snapshot } = await inspectLane(
284
+ repoRoot,
285
+ session,
286
+ registered,
287
+ defaultBranch,
288
+ resolved
289
+ );
290
+ report.sessions.push(entry);
291
+ (entry.state === "eligible" ? report.eligible : report.kept).push(entry);
292
+ snapshots.set(entry.path, snapshot);
293
+ } catch (error) {
294
+ const entry = {
295
+ path: session.path,
296
+ branch: session.branch,
297
+ state: "kept",
298
+ reasons: ["could not be inspected"]
299
+ };
300
+ report.sessions.push(entry);
301
+ report.kept.push(entry);
302
+ report.errors.push(
303
+ `${session.path}: ${error instanceof Error ? error.message : String(error)}`
304
+ );
305
+ }
306
+ }
307
+ return { report, snapshots };
308
+ }
309
+ async function inspectOne(repoRoot, lanePath, options) {
310
+ const session = (await listSessionWorktrees(repoRoot)).find((s) => s.path === lanePath);
311
+ if (!session) return void 0;
312
+ return inspectLane(
313
+ repoRoot,
314
+ session,
315
+ await listRegistered(repoRoot),
316
+ await resolveDefaultBranch(repoRoot),
317
+ {
318
+ now: options.now ?? Date.now(),
319
+ callerCwd: options.callerCwd ?? process.cwd()
320
+ }
321
+ );
322
+ }
323
+ async function inspectSessionCleanup(repoRoot, options = {}) {
324
+ return (await inspectAll(repoRoot, options)).report;
325
+ }
326
+ async function removeWorktree(repoRoot, target) {
327
+ const result = await execGit(["worktree", "remove", target], { cwd: repoRoot }).catch(
328
+ (error) => error
329
+ );
330
+ if (result instanceof Error) return result.message;
331
+ return result.exitCode === 0 ? void 0 : result.stderr.trim() || `exit ${result.exitCode}`;
332
+ }
333
+ async function removeLane(repoRoot, lanePath, before, options, result) {
334
+ const recheckAndRemove = async () => {
335
+ const { entry, snapshot: after } = await inspectOne(repoRoot, lanePath, options) ?? {};
336
+ const unchanged = after !== void 0 && after.head === before.head && after.defaultSha === before.defaultSha && after.childPath === before.childPath && after.childHead === before.childHead;
337
+ if (!entry || entry.state !== "eligible" || !unchanged) {
338
+ markKept(
339
+ result,
340
+ lanePath,
341
+ entry?.reasons.length ? entry.reasons : ["changed during cleanup"]
342
+ );
343
+ return;
344
+ }
345
+ if (before.childPath) {
346
+ const childError = await removeWorktree(repoRoot, before.childPath);
347
+ if (childError) {
348
+ markKept(result, lanePath, ["planning worktree could not be removed"]);
349
+ result.errors.push(`${before.childPath}: ${childError}`);
350
+ return;
351
+ }
352
+ }
353
+ const laneError = await removeWorktree(repoRoot, lanePath);
354
+ if (laneError) {
355
+ markKept(result, lanePath, ["could not be removed"]);
356
+ result.errors.push(`${lanePath}: ${laneError}`);
357
+ return;
358
+ }
359
+ result.removed.push(lanePath);
360
+ };
361
+ if (!before.childPath) return recheckAndRemove();
362
+ try {
363
+ await withStorageLock(before.childPath, recheckAndRemove, { wait: false });
364
+ } catch (error) {
365
+ if (!isStorageLockBusyError(error)) {
366
+ markKept(result, lanePath, ["planning storage could not be locked"]);
367
+ result.errors.push(`${lanePath}: ${error instanceof Error ? error.message : String(error)}`);
368
+ return;
369
+ }
370
+ markKept(result, lanePath, ["planning storage is busy"]);
371
+ }
372
+ }
373
+ function markKept(result, lanePath, reasons) {
374
+ const entry = result.sessions.find((candidate) => candidate.path === lanePath);
375
+ if (!entry) return;
376
+ entry.state = "kept";
377
+ entry.reasons = reasons;
378
+ }
379
+ async function cleanupSessions(repoRoot, options) {
380
+ const { report, snapshots } = await inspectAll(repoRoot, options);
381
+ const result = { ...report, removed: [] };
382
+ if (!options.execute || report.eligible.length === 0) return result;
383
+ const planned = report.eligible.map((entry) => entry.path);
384
+ let lockErrored = false;
385
+ const ran = await tryWithCleanupLock(resolveSessionBase(repoRoot), async () => {
386
+ for (const lanePath of planned) {
387
+ try {
388
+ await removeLane(repoRoot, lanePath, snapshots.get(lanePath) ?? {}, options, result);
389
+ } catch (error) {
390
+ markKept(result, lanePath, ["could not be removed"]);
391
+ result.errors.push(
392
+ `${lanePath}: ${error instanceof Error ? error.message : String(error)}`
393
+ );
394
+ }
395
+ }
396
+ return true;
397
+ }).catch((error) => {
398
+ result.errors.push(error instanceof Error ? error.message : String(error));
399
+ lockErrored = true;
400
+ return null;
401
+ });
402
+ if (ran === null && !lockErrored) {
403
+ result.errors.push("session cleanup lock is held by another process");
404
+ }
405
+ result.eligible = result.sessions.filter((entry) => entry.state === "eligible");
406
+ result.kept = result.sessions.filter((entry) => entry.state === "kept");
407
+ return result;
408
+ }
409
+ async function cleanupSessionsCategory(repoRoot, options) {
410
+ const result = await cleanupSessions(repoRoot, { execute: !options.dryRun, now: options.now });
411
+ if (result.sessions.length === 0 && result.errors.length > 0) {
412
+ return {
413
+ name: "sessions",
414
+ enabled: true,
415
+ skipped: { reason: result.errors[0] ?? "session inspection failed" },
416
+ summary: { found: 0, cleaned: 0, freedBytes: 0 },
417
+ details: result
418
+ };
419
+ }
420
+ return {
421
+ name: "sessions",
422
+ enabled: true,
423
+ summary: {
424
+ found: result.sessions.length,
425
+ cleaned: options.dryRun ? result.eligible.length : result.removed.length,
426
+ freedBytes: 0
427
+ },
428
+ details: result
429
+ };
430
+ }
431
+
432
+ // src/utils/worktree-cleanup.ts
433
+ import { execFileSync } from "child_process";
434
+ import { existsSync, readFileSync } from "fs";
435
+ import { readdir, stat } from "fs/promises";
436
+ import { basename, isAbsolute, join, relative, resolve, sep } from "path";
437
+ import { execa } from "execa";
438
+ var DEFAULT_WORKTREE_TTL_DAYS = 1;
439
+ var MIN_WORKTREE_CLEANUP_AGE_MS = 60 * 60 * 1e3;
440
+ var LABS_RELATIVE_PATH = ".build-project/labs";
441
+ function isCleanupLockArtifactName(name) {
442
+ return name === CLEANUP_LOCK_FILENAME || name === `${CLEANUP_LOCK_FILENAME}.lock`;
443
+ }
444
+ function logCleanupMessage(message) {
445
+ if (isQuietOutputRequested()) {
446
+ return;
447
+ }
448
+ console.log(message);
449
+ }
450
+ var worktreeCleanupMutexTail = Promise.resolve();
451
+ function runWorktreeCleanupSerialized(fn) {
452
+ const run = worktreeCleanupMutexTail.then(fn);
453
+ worktreeCleanupMutexTail = run.then(
454
+ () => void 0,
455
+ () => void 0
456
+ );
457
+ return run;
458
+ }
459
+ function pathDepth(pathValue) {
460
+ return pathValue.split(sep).filter(Boolean).length;
461
+ }
462
+ function isNestedPath(parentPath, maybeChildPath) {
463
+ const parent = canonicalizePath(parentPath);
464
+ const child = canonicalizePath(maybeChildPath);
465
+ return child !== parent && child.startsWith(`${parent}${sep}`);
466
+ }
467
+ function isPathWithinDir(candidatePath, dirPath) {
468
+ const rel = relative(canonicalizePath(dirPath), canonicalizePath(candidatePath));
469
+ return rel === "" || !rel.startsWith("..") && !isAbsolute(rel);
470
+ }
471
+ function isCanonicalLabWorktreePath(candidatePath) {
472
+ const segments = resolve(candidatePath).split(sep);
473
+ const tail = segments.slice(-7);
474
+ return tail.length === 7 && tail[0] === ".build-project" && tail[1] === "labs" && tail[3] === "runs" && tail[5] === "worktrees";
475
+ }
476
+ function getMaxWorktreeAge() {
477
+ const raw = readRawEnv(BUILD_WORKTREE_TTL_DAYS);
478
+ if (raw === void 0) {
479
+ return DEFAULT_WORKTREE_TTL_DAYS * 24 * 60 * 60 * 1e3;
480
+ }
481
+ const parsed = Number.parseInt(raw, 10);
482
+ if (!Number.isFinite(parsed) || parsed <= 0) {
483
+ emitWarning(
484
+ "CFG-002",
485
+ {
486
+ subsystem: "utils",
487
+ executionPhase: "setup"
488
+ },
489
+ {
490
+ severity: "WARN" /* WARN */,
491
+ metadata: {
492
+ configKey: "BUILD_WORKTREE_TTL_DAYS",
493
+ invalidValue: raw,
494
+ fallbackValue: DEFAULT_WORKTREE_TTL_DAYS
495
+ }
496
+ }
497
+ );
498
+ return DEFAULT_WORKTREE_TTL_DAYS * 24 * 60 * 60 * 1e3;
499
+ }
500
+ return parsed * 24 * 60 * 60 * 1e3;
501
+ }
502
+ var WorktreeCleanupManager = class {
503
+ baseDir;
504
+ constructor(baseDir) {
505
+ this.baseDir = baseDir;
506
+ }
507
+ /**
508
+ * Get worktree base directory
509
+ *
510
+ * @returns Absolute path to worktree base directory
511
+ */
512
+ getWorktreeBase() {
513
+ if (this.baseDir) {
514
+ return this.baseDir;
515
+ }
516
+ return resolveWorktreeBase();
517
+ }
518
+ /**
519
+ * Read directories under the given path and add them to the candidate map
520
+ */
521
+ async populateCandidatesFromDir(dirPath, source, map, labPaths) {
522
+ if (!existsSync(dirPath)) return;
523
+ try {
524
+ const entries = await readdir(dirPath, { withFileTypes: true });
525
+ for (const entry of entries) {
526
+ if (isCleanupLockArtifactName(entry.name)) continue;
527
+ if (!entry.isDirectory()) continue;
528
+ const entryPath = resolve(dirPath, entry.name);
529
+ if (map.has(entryPath)) continue;
530
+ map.set(entryPath, {
531
+ path: entryPath,
532
+ name: entry.name,
533
+ source,
534
+ registeredGitWorktree: false
535
+ });
536
+ if (source === "lab") {
537
+ labPaths.add(entryPath);
538
+ }
539
+ }
540
+ } catch (error) {
541
+ this.logDebug(`Failed to read worktree directory ${dirPath}`, error);
542
+ }
543
+ }
544
+ /**
545
+ * Discover lab worktrees under .build-project/labs
546
+ */
547
+ async discoverLabWorktrees(repoRoot, map, labPaths) {
548
+ const labsRoot = resolve(repoRoot, LABS_RELATIVE_PATH);
549
+ if (!existsSync(labsRoot)) return;
550
+ try {
551
+ const labs = await readdir(labsRoot, { withFileTypes: true });
552
+ for (const labEntry of labs) {
553
+ if (!labEntry.isDirectory()) continue;
554
+ const runsPath = join(labsRoot, labEntry.name, "runs");
555
+ if (!existsSync(runsPath)) continue;
556
+ const runs = await readdir(runsPath, { withFileTypes: true });
557
+ for (const runEntry of runs) {
558
+ if (!runEntry.isDirectory()) continue;
559
+ const worktreesPath = join(runsPath, runEntry.name, "worktrees");
560
+ await this.populateCandidatesFromDir(worktreesPath, "lab", map, labPaths);
561
+ }
562
+ }
563
+ } catch (error) {
564
+ this.logDebug("Failed to discover lab worktrees", error);
565
+ }
566
+ }
567
+ /**
568
+ * Discover worktrees created by older Build versions under the target repo.
569
+ * New default worktree pools live outside the checkout, but cleanup must still
570
+ * drain this legacy location so old crash debris does not keep tainting host
571
+ * verification or test discovery.
572
+ */
573
+ async discoverLegacyRepoLocalWorktrees(repoRoot, map, labPaths) {
574
+ if (this.baseDir) return;
575
+ const legacyWorktreeBase = resolve(repoRoot, ".build-project/tmp/worktrees");
576
+ if (resolve(this.getWorktreeBase()) !== legacyWorktreeBase) {
577
+ await this.populateCandidatesFromDir(legacyWorktreeBase, "standard", map, labPaths);
578
+ }
579
+ for (const previousPool of this.getPreviousWorktreePools(repoRoot)) {
580
+ await this.populateCandidatesFromDir(previousPool, "standard", map, labPaths);
581
+ }
582
+ }
583
+ getPreviousWorktreePools(repoRoot) {
584
+ if (this.baseDir) return [];
585
+ try {
586
+ return listPreviousWorktreePools(repoRoot);
587
+ } catch (error) {
588
+ this.logDebug("Failed to resolve previous worktree pools", error);
589
+ return [];
590
+ }
591
+ }
592
+ /**
593
+ * Discover stale worktree-shaped directories that escaped the standard
594
+ * .build-project/tmp/worktrees bucket. These are limited to directories with a .git
595
+ * file whose gitdir target no longer exists, so regular tmp directories are
596
+ * not promoted into worktree cleanup candidates.
597
+ */
598
+ async discoverBrokenMetadataTmpWorktrees(repoRoot, map) {
599
+ if (this.baseDir) return;
600
+ const tmpRoot = resolve(repoRoot, ".build-project/tmp");
601
+ if (!existsSync(tmpRoot)) return;
602
+ const visit = async (dirPath, depth) => {
603
+ if (depth > 3) return;
604
+ if (existsSync(join(dirPath, ".git")) && this.hasBrokenGitdirPointer(dirPath)) {
605
+ if (!map.has(dirPath)) {
606
+ map.set(dirPath, {
607
+ path: dirPath,
608
+ name: basename(dirPath),
609
+ source: "standard",
610
+ registeredGitWorktree: false
611
+ });
612
+ }
613
+ return;
614
+ }
615
+ let entries;
616
+ try {
617
+ entries = await readdir(dirPath, { withFileTypes: true });
618
+ } catch (error) {
619
+ this.logDebug(`Failed to scan tmp directory ${dirPath}`, error);
620
+ return;
621
+ }
622
+ for (const entry of entries) {
623
+ if (!entry.isDirectory()) continue;
624
+ await visit(join(dirPath, entry.name), depth + 1);
625
+ }
626
+ };
627
+ await visit(tmpRoot, 0);
628
+ }
629
+ /**
630
+ * True when a git-discovered worktree lives under a Build-managed cleanup root.
631
+ * External manual worktrees registered in Git but outside these roots are preserved.
632
+ */
633
+ isUnderBuildManagedCleanupRoot(candidatePath, repoRoot, worktreeBase) {
634
+ const resolved = resolve(candidatePath);
635
+ if (isPathWithinDir(resolved, resolve(worktreeBase))) {
636
+ return true;
637
+ }
638
+ if (this.getPreviousWorktreePools(repoRoot).some((pool) => isPathWithinDir(resolved, pool))) {
639
+ return true;
640
+ }
641
+ if (isPathWithinDir(resolved, resolve(repoRoot, LABS_RELATIVE_PATH)) || isCanonicalLabWorktreePath(resolved)) {
642
+ return true;
643
+ }
644
+ return isPathWithinDir(resolved, resolve(repoRoot, ".build-project/tmp"));
645
+ }
646
+ /**
647
+ * Parse git worktree metadata for both branch-backed and detached worktrees.
648
+ */
649
+ async discoverGitWorktreeEntries(repoRoot) {
650
+ const entries = [];
651
+ try {
652
+ const { stdout } = await execa("git", ["worktree", "list", "--porcelain"], {
653
+ cwd: repoRoot,
654
+ stdio: "pipe"
655
+ });
656
+ for (const record of parseGitWorktreePorcelain(stdout)) {
657
+ const entry = {
658
+ path: resolve(repoRoot, record.path.trim()),
659
+ detached: false
660
+ };
661
+ for (const field of record.fields) {
662
+ if (field.name === "branch" && field.value !== void 0) {
663
+ entry.branchName = field.value.trim().replace(/^refs\/heads\//, "");
664
+ } else if (field.rawLine === "detached") {
665
+ entry.detached = true;
666
+ } else if (field.rawLine.trim() === "") {
667
+ break;
668
+ }
669
+ }
670
+ entries.push(entry);
671
+ }
672
+ } catch (error) {
673
+ this.logDebug("Failed to list git worktrees", error);
674
+ }
675
+ return entries;
676
+ }
677
+ /**
678
+ * Build a map of all known worktree candidates
679
+ */
680
+ async gatherWorktreeCandidates(includeBrokenMetadata) {
681
+ const repoRoot = findProjectRoot(process.cwd()) ?? process.cwd();
682
+ const candidateMap = /* @__PURE__ */ new Map();
683
+ const labPaths = /* @__PURE__ */ new Set();
684
+ await this.populateCandidatesFromDir(
685
+ this.getWorktreeBase(),
686
+ "standard",
687
+ candidateMap,
688
+ labPaths
689
+ );
690
+ await this.discoverLegacyRepoLocalWorktrees(repoRoot, candidateMap, labPaths);
691
+ await this.discoverLabWorktrees(repoRoot, candidateMap, labPaths);
692
+ if (includeBrokenMetadata) {
693
+ await this.discoverBrokenMetadataTmpWorktrees(repoRoot, candidateMap);
694
+ }
695
+ const inGitRepo = isInsideGitWorkTree(repoRoot);
696
+ const gitEntries = inGitRepo ? await this.discoverGitWorktreeEntries(repoRoot) : [];
697
+ const registeredWorktreePaths = new Set(
698
+ gitEntries.map((entry) => canonicalizePath(entry.path))
699
+ );
700
+ const candidateKeyByCanonical = /* @__PURE__ */ new Map();
701
+ for (const key of candidateMap.keys()) {
702
+ candidateKeyByCanonical.set(canonicalizePath(key), key);
703
+ }
704
+ for (const entry of gitEntries) {
705
+ entry.path = candidateKeyByCanonical.get(canonicalizePath(entry.path)) ?? entry.path;
706
+ const existing = candidateMap.get(entry.path);
707
+ if (existing) {
708
+ existing.branchName ??= entry.branchName;
709
+ existing.detached = entry.detached;
710
+ existing.registeredGitWorktree = true;
711
+ existing.missingOnDisk = !existsSync(entry.path);
712
+ if (isCanonicalLabWorktreePath(entry.path)) {
713
+ existing.source = "lab";
714
+ labPaths.add(entry.path);
715
+ }
716
+ continue;
717
+ }
718
+ const source = labPaths.has(entry.path) || isCanonicalLabWorktreePath(entry.path) ? "lab" : "git";
719
+ candidateMap.set(entry.path, {
720
+ path: entry.path,
721
+ name: basename(entry.path),
722
+ branchName: entry.branchName,
723
+ detached: entry.detached,
724
+ missingOnDisk: !existsSync(entry.path),
725
+ source,
726
+ registeredGitWorktree: true
727
+ });
728
+ if (source === "lab") {
729
+ labPaths.add(entry.path);
730
+ }
731
+ }
732
+ const canonicalRoot = canonicalizePath(repoRoot);
733
+ for (const [path2, _candidate] of candidateMap) {
734
+ if (canonicalizePath(path2) === canonicalRoot || isSessionOwnedPath(path2)) {
735
+ candidateMap.delete(path2);
736
+ }
737
+ }
738
+ return {
739
+ repoRoot,
740
+ candidates: Array.from(candidateMap.values()),
741
+ registeredWorktreePaths
742
+ };
743
+ }
744
+ /**
745
+ * Get size of a directory recursively
746
+ *
747
+ * Applies conservative traversal limits to avoid runaway recursion on
748
+ * pathological directory structures or mocked filesystems in tests.
749
+ *
750
+ * @param dirPath Directory path
751
+ * @param maxDepth Maximum recursion depth to prevent stack overflow (default: 50)
752
+ * @param currentDepth Current recursion depth (internal use)
753
+ * @param traversal Tracker for total entries visited (internal use)
754
+ * @returns Size in bytes
755
+ * @private
756
+ */
757
+ async getDirSize(dirPath, maxDepth = 50, currentDepth = 0, traversal = { count: 0 }) {
758
+ let size = 0;
759
+ const MAX_TRAVERSAL_ENTRIES = 5e3;
760
+ if (currentDepth >= maxDepth) {
761
+ this.logDebug(
762
+ `Max depth ${maxDepth} reached for ${dirPath}`,
763
+ new Error("Max depth exceeded")
764
+ );
765
+ return size;
766
+ }
767
+ traversal.count++;
768
+ if (traversal.count > MAX_TRAVERSAL_ENTRIES) {
769
+ this.logDebug(
770
+ `Traversal limit ${MAX_TRAVERSAL_ENTRIES} reached for ${dirPath}`,
771
+ new Error("Traversal limit exceeded")
772
+ );
773
+ return size;
774
+ }
775
+ try {
776
+ const entries = await readdir(dirPath, { withFileTypes: true });
777
+ for (const entry of entries) {
778
+ const entryPath = join(dirPath, entry.name);
779
+ if (entry.isDirectory()) {
780
+ size += await this.getDirSize(entryPath, maxDepth, currentDepth + 1, traversal);
781
+ } else if (entry.isFile()) {
782
+ const stats = await stat(entryPath);
783
+ size += stats.size;
784
+ }
785
+ }
786
+ } catch (error) {
787
+ this.logDebug(`Failed to calculate size for ${dirPath}`, error);
788
+ }
789
+ return size;
790
+ }
791
+ /**
792
+ * Format age in human-readable form
793
+ *
794
+ * @param ms Age in milliseconds
795
+ * @returns Formatted age string
796
+ * @private
797
+ */
798
+ formatAge(ms) {
799
+ const hours = Math.floor(ms / (60 * 60 * 1e3));
800
+ const days = Math.floor(hours / 24);
801
+ if (days > 0) {
802
+ return `${days}d ${hours % 24}h`;
803
+ }
804
+ return `${hours}h`;
805
+ }
806
+ hasBrokenGitdirPointer(worktreePath) {
807
+ const gitFilePath = join(worktreePath, ".git");
808
+ if (!existsSync(gitFilePath)) {
809
+ return false;
810
+ }
811
+ try {
812
+ const gitFile = readFileSync(gitFilePath, "utf8");
813
+ const match = gitFile.match(/^gitdir:\s*(.+)$/m);
814
+ if (!match) {
815
+ return false;
816
+ }
817
+ const gitdirTarget = match[1]?.trim();
818
+ if (!gitdirTarget) {
819
+ return false;
820
+ }
821
+ const gitdirPath = resolve(worktreePath, gitdirTarget);
822
+ return !existsSync(gitdirPath);
823
+ } catch {
824
+ return false;
825
+ }
826
+ }
827
+ async inspectWorktreeChangeState(worktreePath) {
828
+ if (this.hasBrokenGitdirPointer(worktreePath)) {
829
+ return "broken-gitdir";
830
+ }
831
+ try {
832
+ const result = await execa(
833
+ "git",
834
+ ["-C", worktreePath, "status", "--porcelain=v1", "--untracked-files=all"],
835
+ {
836
+ stdio: "pipe",
837
+ reject: false,
838
+ timeout: 1e4
839
+ }
840
+ );
841
+ if (result.exitCode === 0 && !result.timedOut && !result.isTerminated) {
842
+ if ((result?.stdout ?? "").trim().length > 0) return "dirty";
843
+ const docs = await ignoredWorkingDocs(worktreePath);
844
+ if (docs) return docs.length > 0 ? "dirty" : "clean";
845
+ }
846
+ } catch {
847
+ }
848
+ return existsSync(join(worktreePath, ".git")) ? "uninspectable" : "clean";
849
+ }
850
+ async resolveBranchHeadSha(repoRoot, branchName) {
851
+ try {
852
+ const { stdout } = await execa(
853
+ "git",
854
+ ["rev-parse", "--verify", `refs/heads/${branchName}^{commit}`],
855
+ {
856
+ cwd: repoRoot,
857
+ stdio: "pipe"
858
+ }
859
+ );
860
+ return stdout.trim() || void 0;
861
+ } catch {
862
+ return void 0;
863
+ }
864
+ }
865
+ async resolveCurrentBranchName(repoRoot) {
866
+ try {
867
+ const { stdout } = await execa("git", ["branch", "--show-current"], {
868
+ cwd: repoRoot,
869
+ stdio: "pipe"
870
+ });
871
+ return stdout.trim() || void 0;
872
+ } catch {
873
+ return void 0;
874
+ }
875
+ }
876
+ shouldFailClosedForMissingGitMetadata(candidate) {
877
+ return !this.baseDir && candidate.source === "standard" && !candidate.registeredGitWorktree && !existsSync(join(candidate.path, ".git"));
878
+ }
879
+ canCleanBrokenMetadataCandidate(candidate) {
880
+ return candidate.source === "standard" && !candidate.registeredGitWorktree;
881
+ }
882
+ /** Remove only an approved, absent worktree; Git still refuses locked registrations. */
883
+ async deregisterMissingWorktree(worktreePath, repoRoot) {
884
+ if (existsSync(worktreePath)) return false;
885
+ try {
886
+ const removed = await execGit(["worktree", "remove", "--force", "--", worktreePath], {
887
+ cwd: repoRoot
888
+ });
889
+ return removed.exitCode === 0;
890
+ } catch (error) {
891
+ this.logDebug(`Could not deregister missing worktree ${worktreePath}`, error);
892
+ return false;
893
+ }
894
+ }
895
+ /**
896
+ * Clean up old worktrees
897
+ *
898
+ * Deletes worktrees older than TTL (default 1 day) to prevent disk bloat.
899
+ * Worktrees are temporary build artifacts and should not accumulate.
900
+ *
901
+ * @param options Optional cleanup options (dry-run, age override)
902
+ * @returns Cleanup report with statistics
903
+ */
904
+ async cleanup(options) {
905
+ const dryRun = options?.dryRun ?? false;
906
+ const baseDir = this.getWorktreeBase();
907
+ return runWorktreeCleanupSerialized(async () => {
908
+ const body = () => this.cleanupSerializedBody(options);
909
+ if (dryRun) {
910
+ if (!existsSync(baseDir)) {
911
+ return await body();
912
+ }
913
+ const lockedResult = await tryWithCleanupLock(baseDir, body);
914
+ if (lockedResult !== null) {
915
+ return lockedResult;
916
+ }
917
+ const diagnostics = await describeCleanupLockState(baseDir);
918
+ const report = await body();
919
+ report.lockPreviewDegraded = true;
920
+ report.lockDiagnostics = diagnostics;
921
+ return report;
922
+ }
923
+ try {
924
+ return await withCleanupLock(baseDir, body);
925
+ } catch (error) {
926
+ if (isCleanupLockContentionError(error)) {
927
+ const diagnostics = await describeCleanupLockState(baseDir);
928
+ throw Object.assign(
929
+ new Error(formatCleanupLockContentionMessage(diagnostics, "execute")),
930
+ { code: "ELOCKED", file: diagnostics.lockPath }
931
+ );
932
+ }
933
+ throw error;
934
+ }
935
+ });
936
+ }
937
+ async cleanupSerializedBody(options) {
938
+ const maxAge = options?.maxAgeMs ?? getMaxWorktreeAge();
939
+ const dryRun = options?.dryRun ?? false;
940
+ const includeLabs = options?.includeLabs ?? false;
941
+ const verbose = options?.verbose ?? true;
942
+ const verbosePreserved = options?.verbosePreserved ?? false;
943
+ const limit = Math.max(0, Math.floor(options?.limit ?? 0));
944
+ const estimateSize = options?.estimateSize ?? true;
945
+ const includeBrokenMetadata = options?.includeBrokenMetadata ?? false;
946
+ if (maxAge === 0) {
947
+ emitWarning(
948
+ "CFG-006",
949
+ {
950
+ subsystem: "utils",
951
+ executionPhase: "cleanup"
952
+ },
953
+ {
954
+ severity: "WARN" /* WARN */,
955
+ metadata: {
956
+ configKey: "maxAge",
957
+ invalidValue: 0,
958
+ message: "maxAge=0 matches age-eligible worktrees, but fresh worktrees are still protected by the minimum age gate."
959
+ }
960
+ }
961
+ );
962
+ }
963
+ const report = {
964
+ deleted: 0,
965
+ freedBytes: 0,
966
+ deletedWorktrees: [],
967
+ dryRun,
968
+ deletedLabWorktrees: [],
969
+ skippedLabWorktrees: [],
970
+ // Effective threshold: the configured max age floored at the fixed one-hour
971
+ // minimum, so a `--max-age 0` sweep explains its skips with the value that
972
+ // actually blocked them.
973
+ retentionMaxAgeMs: Math.max(maxAge, MIN_WORKTREE_CLEANUP_AGE_MS)
974
+ };
975
+ const recordPreserved = (candidate, reason) => {
976
+ report.preservedWorktrees ??= [];
977
+ if (report.preservedWorktrees.some(
978
+ (entry) => entry.path === candidate.path && entry.reason === reason
979
+ )) {
980
+ return;
981
+ }
982
+ report.preservedWorktrees.push({
983
+ name: candidate.name,
984
+ path: candidate.path,
985
+ source: candidate.source,
986
+ reason
987
+ });
988
+ };
989
+ try {
990
+ const { repoRoot, candidates, registeredWorktreePaths } = await this.gatherWorktreeCandidates(includeBrokenMetadata);
991
+ if (candidates.length === 0) {
992
+ return report;
993
+ }
994
+ const labResolver = LabPathResolver.getInstance();
995
+ const labModeActive = labResolver.isLabMode();
996
+ const skipLabCleanup = !includeLabs;
997
+ const labCandidates = candidates.filter((c) => c.source === "lab");
998
+ const actionableCandidatesAll = skipLabCleanup ? candidates.filter((c) => c.source !== "lab") : candidates;
999
+ const actionableCandidates = actionableCandidatesAll.map((candidate, index) => ({ candidate, index })).sort((a, b) => {
1000
+ if (a.candidate.missingOnDisk !== b.candidate.missingOnDisk) {
1001
+ return a.candidate.missingOnDisk ? -1 : 1;
1002
+ }
1003
+ const depthDelta = pathDepth(canonicalizePath(b.candidate.path)) - pathDepth(canonicalizePath(a.candidate.path));
1004
+ if (depthDelta !== 0) {
1005
+ return depthDelta;
1006
+ }
1007
+ return a.index - b.index;
1008
+ }).map(({ candidate }) => candidate).slice(0, limit > 0 ? limit : void 0);
1009
+ if (limit > 0 && actionableCandidatesAll.length > limit) {
1010
+ logCleanupMessage(
1011
+ `Worktree cleanup limited to first ${limit} of ${actionableCandidatesAll.length} eligible candidate(s). Re-run to continue.`
1012
+ );
1013
+ }
1014
+ if (skipLabCleanup && labCandidates.length > 0) {
1015
+ report.skippedLabWorktrees = labCandidates.map((c) => c.name);
1016
+ for (const candidate of labCandidates) {
1017
+ recordPreserved(candidate, "lab");
1018
+ }
1019
+ const message = labModeActive ? `Lab mode active - preserving ${labCandidates.length} lab worktree(s). Use '--include-labs' to override.` : `Skipped ${labCandidates.length} lab worktree(s). Use '--include-labs' to override.`;
1020
+ if (verbose && verbosePreserved) {
1021
+ logCleanupMessage(message);
1022
+ }
1023
+ }
1024
+ for (const candidate of actionableCandidates) {
1025
+ try {
1026
+ const descriptor = candidate.source === "lab" ? `[lab] ${candidate.name}` : candidate.name;
1027
+ if (candidate.source === "git" && !this.isUnderBuildManagedCleanupRoot(candidate.path, repoRoot, this.getWorktreeBase())) {
1028
+ recordPreserved(candidate, "external-git-worktree");
1029
+ if (verbose && verbosePreserved) {
1030
+ logCleanupMessage(`Preserving external git worktree: ${descriptor}`);
1031
+ }
1032
+ continue;
1033
+ }
1034
+ if (candidate.branchName && (isProtectedPipelineBranch(candidate.branchName, void 0, repoRoot) || candidate.branchName === await this.resolveCurrentBranchName(repoRoot))) {
1035
+ recordPreserved(candidate, "branch-attached-protected-current");
1036
+ if (verbose) {
1037
+ logCleanupMessage(
1038
+ `Preserving protected/current branch-attached worktree: ${descriptor}`
1039
+ );
1040
+ }
1041
+ continue;
1042
+ }
1043
+ if (candidate.missingOnDisk) {
1044
+ if (!dryRun && await this.deregisterMissingWorktree(candidate.path, repoRoot)) {
1045
+ registeredWorktreePaths.delete(canonicalizePath(candidate.path));
1046
+ report.prunedGitWorktreeEntries = (report.prunedGitWorktreeEntries ?? 0) + 1;
1047
+ report.deleted++;
1048
+ report.deletedWorktrees.push(candidate.name);
1049
+ report.deletedWorktreePaths ??= [];
1050
+ report.deletedWorktreePaths.push(candidate.path);
1051
+ if (candidate.source === "lab") report.deletedLabWorktrees.push(candidate.name);
1052
+ continue;
1053
+ }
1054
+ report.skippedUninspectableWorktrees ??= [];
1055
+ report.skippedUninspectableWorktrees.push(candidate.name);
1056
+ recordPreserved(candidate, "missing-registered-path");
1057
+ if (dryRun && verbose) {
1058
+ logCleanupMessage(
1059
+ `[DRY RUN] Preserving missing registration; execute checks this worktree individually: ${candidate.name}`
1060
+ );
1061
+ }
1062
+ continue;
1063
+ }
1064
+ const stats = await stat(candidate.path);
1065
+ const age = Date.now() - stats.mtimeMs;
1066
+ if (age < MIN_WORKTREE_CLEANUP_AGE_MS) {
1067
+ recordPreserved(candidate, "too-recent");
1068
+ continue;
1069
+ }
1070
+ if (age <= maxAge) {
1071
+ recordPreserved(candidate, "too-recent");
1072
+ continue;
1073
+ }
1074
+ if (await isActiveRun(candidate.path)) {
1075
+ recordPreserved(candidate, "active-run");
1076
+ if (verbose) {
1077
+ logCleanupMessage(`Skipping active worktree (live run): ${candidate.name}`);
1078
+ }
1079
+ continue;
1080
+ }
1081
+ const missingGitMetadata = this.shouldFailClosedForMissingGitMetadata(candidate) || includeBrokenMetadata && candidate.source === "standard" && !candidate.registeredGitWorktree && !existsSync(join(candidate.path, ".git"));
1082
+ if (missingGitMetadata && (!includeBrokenMetadata || !this.canCleanBrokenMetadataCandidate(candidate))) {
1083
+ report.skippedUninspectableWorktrees ??= [];
1084
+ report.skippedUninspectableWorktrees.push(candidate.name);
1085
+ recordPreserved(candidate, "uninspectable");
1086
+ if (verbose) {
1087
+ logCleanupMessage(`Skipping uninspectable worktree: ${descriptor}`);
1088
+ }
1089
+ continue;
1090
+ }
1091
+ const changeState = missingGitMetadata ? "broken-gitdir" : await this.inspectWorktreeChangeState(candidate.path);
1092
+ if (changeState === "dirty") {
1093
+ report.skippedDirtyWorktrees ??= [];
1094
+ report.skippedDirtyWorktrees.push(candidate.name);
1095
+ recordPreserved(candidate, "dirty");
1096
+ if (verbose && verbosePreserved) {
1097
+ logCleanupMessage(`Skipping dirty worktree: ${descriptor}`);
1098
+ }
1099
+ continue;
1100
+ }
1101
+ if (changeState === "broken-gitdir" && (!includeBrokenMetadata || !this.canCleanBrokenMetadataCandidate(candidate))) {
1102
+ report.skippedUninspectableWorktrees ??= [];
1103
+ report.skippedUninspectableWorktrees.push(candidate.name);
1104
+ recordPreserved(candidate, "uninspectable");
1105
+ if (verbose) {
1106
+ logCleanupMessage(`Skipping uninspectable worktree: ${descriptor}`);
1107
+ }
1108
+ continue;
1109
+ }
1110
+ if (changeState === "uninspectable") {
1111
+ report.skippedUninspectableWorktrees ??= [];
1112
+ report.skippedUninspectableWorktrees.push(candidate.name);
1113
+ recordPreserved(candidate, "uninspectable");
1114
+ if (verbose) {
1115
+ logCleanupMessage(`Skipping uninspectable worktree: ${descriptor}`);
1116
+ }
1117
+ continue;
1118
+ }
1119
+ if ([...registeredWorktreePaths].some(
1120
+ (registeredPath) => isNestedPath(candidate.path, registeredPath) && existsSync(registeredPath)
1121
+ )) {
1122
+ report.skippedUninspectableWorktrees ??= [];
1123
+ report.skippedUninspectableWorktrees.push(candidate.name);
1124
+ recordPreserved(candidate, "nested-child");
1125
+ if (verbose) {
1126
+ logCleanupMessage(
1127
+ `Skipping parent worktree with registered nested child: ${descriptor}`
1128
+ );
1129
+ }
1130
+ continue;
1131
+ }
1132
+ const size = estimateSize ? await this.getDirSize(candidate.path) : 0;
1133
+ if (dryRun) {
1134
+ if (verbose) {
1135
+ const sizeLabel = estimateSize ? `, ${formatBytes(size)}` : "";
1136
+ const metadataLabel = changeState === "broken-gitdir" ? ", broken Git metadata" : "";
1137
+ logCleanupMessage(
1138
+ `[DRY RUN] Would clean up old worktree: ${descriptor} (${this.formatAge(age)} old${sizeLabel}${metadataLabel})`
1139
+ );
1140
+ }
1141
+ report.deleted++;
1142
+ report.freedBytes += size;
1143
+ report.deletedWorktrees.push(candidate.name);
1144
+ report.deletedWorktreePaths ??= [];
1145
+ report.deletedWorktreePaths.push(candidate.path);
1146
+ if (changeState === "broken-gitdir") {
1147
+ report.deletedBrokenMetadataWorktrees ??= [];
1148
+ report.deletedBrokenMetadataWorktrees.push(candidate.name);
1149
+ }
1150
+ if (candidate.source === "lab") {
1151
+ report.deletedLabWorktrees.push(candidate.name);
1152
+ }
1153
+ continue;
1154
+ }
1155
+ if (verbose) {
1156
+ logCleanupMessage(
1157
+ `Cleaning up old worktree: ${descriptor} (${this.formatAge(age)} old, ${formatBytes(size)})`
1158
+ );
1159
+ }
1160
+ let removed = false;
1161
+ const canFastRemoveRegisteredWorktree = candidate.registeredGitWorktree && candidate.detached && !candidate.branchName;
1162
+ if (candidate.registeredGitWorktree && !canFastRemoveRegisteredWorktree) {
1163
+ const removal = await execa("git", ["worktree", "remove", candidate.path, "--force"], {
1164
+ cwd: repoRoot,
1165
+ stdio: "pipe",
1166
+ reject: false
1167
+ });
1168
+ removed = removal.exitCode === 0;
1169
+ }
1170
+ if (!removed) {
1171
+ const rmResult = await safeRmDir(candidate.path, {
1172
+ protectedPaths: [repoRoot],
1173
+ managedRoots: [
1174
+ this.getWorktreeBase(),
1175
+ resolve(repoRoot, ".build-project/tmp"),
1176
+ resolve(repoRoot, LABS_RELATIVE_PATH),
1177
+ // Previous pools are discovered above, so their worktrees must be deletable.
1178
+ ...this.getPreviousWorktreePools(repoRoot)
1179
+ ],
1180
+ dryRun
1181
+ });
1182
+ if (!rmResult.deleted) {
1183
+ this.logDebug(`SAFETY: ${rmResult.reason}`, new Error("safeRmDir refused"));
1184
+ continue;
1185
+ }
1186
+ }
1187
+ if (!existsSync(candidate.path)) {
1188
+ if (candidate.registeredGitWorktree && !removed && await this.deregisterMissingWorktree(candidate.path, repoRoot)) {
1189
+ registeredWorktreePaths.delete(canonicalizePath(candidate.path));
1190
+ report.prunedGitWorktreeEntries = (report.prunedGitWorktreeEntries ?? 0) + 1;
1191
+ }
1192
+ report.deleted++;
1193
+ report.freedBytes += size;
1194
+ report.deletedWorktrees.push(candidate.name);
1195
+ report.deletedWorktreePaths ??= [];
1196
+ report.deletedWorktreePaths.push(candidate.path);
1197
+ if (changeState === "broken-gitdir") {
1198
+ report.deletedBrokenMetadataWorktrees ??= [];
1199
+ report.deletedBrokenMetadataWorktrees.push(candidate.name);
1200
+ }
1201
+ if (candidate.source === "lab") {
1202
+ report.deletedLabWorktrees.push(candidate.name);
1203
+ }
1204
+ if (candidate.branchName) {
1205
+ try {
1206
+ await enqueueBranchCleanup(candidate.branchName, {
1207
+ reason: "worktree-cleanup",
1208
+ queuePath: getBranchCleanupQueuePath(repoRoot),
1209
+ cwd: repoRoot,
1210
+ expectedHeadSha: await this.resolveBranchHeadSha(repoRoot, candidate.branchName)
1211
+ });
1212
+ } catch (error) {
1213
+ this.logDebug(
1214
+ `Failed to queue branch cleanup for ${candidate.branchName}`,
1215
+ error ?? "unknown error"
1216
+ );
1217
+ }
1218
+ }
1219
+ }
1220
+ } catch (error) {
1221
+ const message = error instanceof Error ? error.message : String(error);
1222
+ if (/ENOENT: no such file or directory, stat /.test(message)) {
1223
+ this.logDebug(
1224
+ `Skipping disappearing worktree candidate during cleanup: ${candidate.name}`,
1225
+ error
1226
+ );
1227
+ continue;
1228
+ }
1229
+ emitWarning(
1230
+ "WS-003",
1231
+ {
1232
+ subsystem: "utils",
1233
+ executionPhase: "cleanup"
1234
+ },
1235
+ {
1236
+ severity: "WARN" /* WARN */,
1237
+ metadata: {
1238
+ worktreeName: candidate.name,
1239
+ error: message,
1240
+ operation: "cleanupWorktree"
1241
+ }
1242
+ }
1243
+ );
1244
+ }
1245
+ }
1246
+ if (report.deleted > 0) {
1247
+ const prefix = dryRun ? "[DRY RUN] Would clean" : "Cleaned";
1248
+ const sizeLabel = estimateSize ? `${dryRun ? "would free" : "freed"} ${formatBytes(report.freedBytes)}` : "size not estimated";
1249
+ logCleanupMessage(`${prefix} ${report.deleted} worktree(s), ${sizeLabel}
1250
+ `);
1251
+ }
1252
+ if (verbose && verbosePreserved && report.skippedDirtyWorktrees && report.skippedDirtyWorktrees.length > 0) {
1253
+ logCleanupMessage(
1254
+ `Skipped ${report.skippedDirtyWorktrees.length} dirty worktree(s) with local changes.`
1255
+ );
1256
+ }
1257
+ if (!dryRun && report.deletedBrokenMetadataWorktrees && report.deletedBrokenMetadataWorktrees.length > 0) {
1258
+ logCleanupMessage(
1259
+ `Cleaned ${report.deletedBrokenMetadataWorktrees.length} worktree(s) with broken Git metadata after explicit opt-in.`
1260
+ );
1261
+ }
1262
+ if (!dryRun && (report.prunedGitWorktreeEntries ?? 0) > 0) {
1263
+ logCleanupMessage(`Pruned ${report.prunedGitWorktreeEntries} stale Git worktree entries.`);
1264
+ }
1265
+ if (report.skippedUninspectableWorktrees && report.skippedUninspectableWorktrees.length > 0) {
1266
+ logCleanupMessage(
1267
+ `Skipped ${report.skippedUninspectableWorktrees.length} uninspectable worktree(s) with broken or unreadable Git metadata.`
1268
+ );
1269
+ }
1270
+ } catch (error) {
1271
+ console.error("Worktree cleanup failed:", error);
1272
+ }
1273
+ return report;
1274
+ }
1275
+ /**
1276
+ * Format bytes for human-readable output
1277
+ *
1278
+ * @param bytes Size in bytes
1279
+ * @returns Formatted size string
1280
+ * @private
1281
+ */
1282
+ logDebug(message, error) {
1283
+ if (!readEnv(BUILD_DEBUG).value) return;
1284
+ const errMessage = error instanceof Error ? error.message : String(error);
1285
+ console.debug(`[worktree-cleanup] ${message}: ${errMessage}`);
1286
+ }
1287
+ };
1288
+ function isInsideGitWorkTree(cwd) {
1289
+ try {
1290
+ const opts = {
1291
+ cwd,
1292
+ timeout: 3e3,
1293
+ stdio: ["pipe", "pipe", "pipe"]
1294
+ };
1295
+ const out = execFileSync("git", ["rev-parse", "--is-inside-work-tree"], opts).toString().trim();
1296
+ return out === "true";
1297
+ } catch {
1298
+ return false;
1299
+ }
1300
+ }
1301
+ function runWorktreeCleanup() {
1302
+ setImmediate(async () => {
1303
+ try {
1304
+ const manager = new WorktreeCleanupManager();
1305
+ await manager.cleanup();
1306
+ const repoRoot = findProjectRoot(process.cwd());
1307
+ if (repoRoot) {
1308
+ const { runAutomaticBranchCleanup } = await import("./automatic-branch-cleanup-R62X2C5O.js");
1309
+ await runAutomaticBranchCleanup({ repoRoot, lockDir: manager.getWorktreeBase() });
1310
+ }
1311
+ } catch (error) {
1312
+ if (isCleanupLockContentionError(error)) {
1313
+ return;
1314
+ }
1315
+ console.error("Worktree cleanup failed:", error);
1316
+ }
1317
+ });
1318
+ }
1319
+
1320
+ export {
1321
+ inspectSessionCleanup,
1322
+ cleanupSessionsCategory,
1323
+ getMaxWorktreeAge,
1324
+ WorktreeCleanupManager,
1325
+ runWorktreeCleanup
1326
+ };
1327
+ //# sourceMappingURL=chunk-UPHU64NB.js.map