@maycombhq/atticus 2.0.0-beta.21 → 2.0.0-beta.22

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 (280) hide show
  1. package/dist/bin.js +3 -3
  2. package/dist/{chunk-TJH2EUAZ.js → chunk-23XVSEV5.js} +20 -18
  3. package/dist/{chunk-BXBCMGIQ.js → chunk-24OXGB3P.js} +1 -1
  4. package/dist/{chunk-DCWN3HFV.js → chunk-24XLDU72.js} +4 -3
  5. package/dist/{chunk-Q46QDDMF.js → chunk-2F4CYZKJ.js} +14 -9
  6. package/dist/{chunk-75ASLHBT.js → chunk-2GF7OLF3.js} +17 -15
  7. package/dist/chunk-2IIMFOPM.js +41 -0
  8. package/dist/{chunk-JRVNXLZP.js → chunk-2LGRMVCA.js} +14 -12
  9. package/dist/{chunk-62DLJSLV.js → chunk-2MMCFP5C.js} +10 -8
  10. package/dist/{chunk-UF4UHCIG.js → chunk-2Q56PQPS.js} +6 -4
  11. package/dist/{chunk-5TDRBOAV.js → chunk-2Q5EDGEO.js} +7 -5
  12. package/dist/{chunk-NYOABJNK.js → chunk-2RLKFUUL.js} +26 -24
  13. package/dist/chunk-2SKB4O2E.js +59 -0
  14. package/dist/{chunk-GCS3FZOB.js → chunk-34S2WGOB.js} +13 -4
  15. package/dist/{chunk-7AB6OWTV.js → chunk-3NFFJL5D.js} +31 -25
  16. package/dist/{chunk-GC2VK3JT.js → chunk-3NWDLGG6.js} +28 -25
  17. package/dist/{chunk-FLVZFTLQ.js → chunk-3RM4UK6W.js} +20 -18
  18. package/dist/{chunk-CNU5Q2D5.js → chunk-42SIDKEU.js} +37 -29
  19. package/dist/{chunk-K6JB6XTX.js → chunk-4EURQWQD.js} +20 -15
  20. package/dist/{chunk-OMPENNWY.js → chunk-4U276ICE.js} +1 -1
  21. package/dist/{chunk-JAABT3DA.js → chunk-53T4O55J.js} +4 -3
  22. package/dist/{chunk-YTTNTQOX.js → chunk-57TDNMI3.js} +17 -15
  23. package/dist/chunk-5BD2KYLE.js +57 -0
  24. package/dist/{chunk-7EFILTCI.js → chunk-5F7GFN2F.js} +28 -0
  25. package/dist/{chunk-KYZMRSPS.js → chunk-5NMKONLP.js} +5 -3
  26. package/dist/{chunk-5CMPVC3N.js → chunk-5SJZW52K.js} +25 -23
  27. package/dist/{chunk-YAH5IQAL.js → chunk-63YRMR6J.js} +6 -5
  28. package/dist/{chunk-GUYL7RMK.js → chunk-66PPNOON.js} +27 -25
  29. package/dist/chunk-6H3Z5JHH.js +64 -0
  30. package/dist/{chunk-Y6K3CJBU.js → chunk-6MUGR4LS.js} +75 -27
  31. package/dist/{chunk-DDJPM5YX.js → chunk-6OJQOPUN.js} +5 -3
  32. package/dist/{chunk-2V2ZPQQU.js → chunk-6PPOWY5E.js} +9 -7
  33. package/dist/{chunk-YO2PKTXT.js → chunk-6ZGLAACW.js} +5 -3
  34. package/dist/{chunk-LIJJCBQI.js → chunk-6ZJ5A7AF.js} +15 -16
  35. package/dist/{chunk-64AADMTW.js → chunk-745DAZ4L.js} +50 -12
  36. package/dist/{chunk-VYOCPTUB.js → chunk-7ASNL4Q4.js} +17 -15
  37. package/dist/{chunk-XEQCQO66.js → chunk-7BR7IPOH.js} +10 -8
  38. package/dist/{chunk-X2CUXTWU.js → chunk-7DOR27HL.js} +6 -6
  39. package/dist/{chunk-G6IQYM25.js → chunk-7FTTA3HD.js} +8 -6
  40. package/dist/{chunk-FAJDKNSD.js → chunk-7GJS6DNX.js} +8 -3
  41. package/dist/{chunk-4KNOJC6J.js → chunk-7IGKHZ4Z.js} +55 -13
  42. package/dist/{chunk-3WON4G3M.js → chunk-7IOWA5D5.js} +11 -6
  43. package/dist/{chunk-PNQLCRSS.js → chunk-7JITZFJC.js} +7 -5
  44. package/dist/{chunk-2D7PWSOK.js → chunk-7MJSQTL5.js} +22 -20
  45. package/dist/{chunk-AE4P57KK.js → chunk-7UOMVMFG.js} +17 -15
  46. package/dist/{chunk-GK4PYVEC.js → chunk-AFWUDXEM.js} +10 -8
  47. package/dist/chunk-AFZ3QA6W.js +47 -0
  48. package/dist/{chunk-7FUIVIBG.js → chunk-AJQ72EBM.js} +13 -8
  49. package/dist/{chunk-QOOEYDNJ.js → chunk-AJYXNTNZ.js} +6 -6
  50. package/dist/chunk-AVTBS4OW.js +49 -0
  51. package/dist/{chunk-WFU77T3A.js → chunk-BDKC6H5P.js} +5 -5
  52. package/dist/{chunk-3AQ2R5NL.js → chunk-BEVTIBRH.js} +9 -7
  53. package/dist/{chunk-J5AAZ6OJ.js → chunk-BHT7QK4G.js} +5 -4
  54. package/dist/{chunk-UFE36WJH.js → chunk-BIGDQDHD.js} +6 -4
  55. package/dist/{chunk-WNTIOBOG.js → chunk-BO4KX37X.js} +20 -18
  56. package/dist/{chunk-455SYIIE.js → chunk-BPK5P77O.js} +5 -3
  57. package/dist/{chunk-OZJ3JLYI.js → chunk-BQ4SQQC6.js} +10 -9
  58. package/dist/chunk-BQGDB6ZL.js +7342 -0
  59. package/dist/{chunk-EZIN5E5B.js → chunk-BTGPE6CR.js} +11 -9
  60. package/dist/{chunk-265LWMOA.js → chunk-BTY3HZBO.js} +18 -16
  61. package/dist/{chunk-TW3KOSQK.js → chunk-BXYMYEJ4.js} +7 -6
  62. package/dist/{chunk-HK3VOHIE.js → chunk-C3RY6KU6.js} +119 -18
  63. package/dist/chunk-C4R4JLHE.js +40 -0
  64. package/dist/{chunk-Z3QFH7YG.js → chunk-CADWLE2T.js} +5 -4
  65. package/dist/{chunk-J2O4LFVI.js → chunk-CBGGOQWU.js} +6 -4
  66. package/dist/chunk-CMDXGQTS.js +47 -0
  67. package/dist/{chunk-TWQRPM76.js → chunk-CQDGOPGH.js} +23 -16
  68. package/dist/{chunk-5PV7S2ZP.js → chunk-CX4RZ2KS.js} +4 -3
  69. package/dist/{chunk-JYMIB5XY.js → chunk-CXJ6FUKN.js} +164 -44
  70. package/dist/{chunk-D57MFJPP.js → chunk-D73UEXYW.js} +3 -3
  71. package/dist/{chunk-UYLBRRFK.js → chunk-DCZWQLYT.js} +125 -26
  72. package/dist/chunk-DLOBCJL6.js +48 -0
  73. package/dist/{chunk-IFHDV6KQ.js → chunk-DOBQKHIF.js} +23 -23
  74. package/dist/{chunk-QJCJOMW3.js → chunk-E3ISYXO3.js} +19 -21
  75. package/dist/{chunk-VAMHOHUU.js → chunk-E6ZIEVOI.js} +16 -13
  76. package/dist/{chunk-EFCQSMXB.js → chunk-EBL2R3YG.js} +10 -4
  77. package/dist/{chunk-HGHRSF3E.js → chunk-EGQRREQH.js} +25 -17
  78. package/dist/{chunk-3J5I7ZOU.js → chunk-EHA7RMZ3.js} +4 -4
  79. package/dist/{chunk-7CZHUZBL.js → chunk-EIPTLPFC.js} +38 -27
  80. package/dist/{chunk-UZACEG2C.js → chunk-EMRIQUND.js} +17 -15
  81. package/dist/{chunk-RALY3E5U.js → chunk-EPCJQQWD.js} +6 -4
  82. package/dist/{chunk-VUVGX5L2.js → chunk-F3P7N7SF.js} +1 -1
  83. package/dist/{chunk-RA33EYS4.js → chunk-FFLNS6VP.js} +19 -17
  84. package/dist/{chunk-OPQZISG3.js → chunk-FFTRTL6R.js} +5 -4
  85. package/dist/{chunk-DUPZPDCJ.js → chunk-FPJPLKDW.js} +18 -14
  86. package/dist/{chunk-2HH3UCZM.js → chunk-FSMSFDLD.js} +5 -4
  87. package/dist/{chunk-AHW3RY3X.js → chunk-FUJM6RTF.js} +8 -7
  88. package/dist/{chunk-2UCRFXFZ.js → chunk-FZOJFH7Q.js} +13 -11
  89. package/dist/{chunk-BVWWPBKD.js → chunk-G6X77UJZ.js} +20 -18
  90. package/dist/{chunk-BPPU3PW7.js → chunk-GCWRWSU7.js} +10 -4
  91. package/dist/chunk-GIW4ZVDB.js +39 -0
  92. package/dist/{chunk-FY3QIRTL.js → chunk-GUX3PTYM.js} +3 -3
  93. package/dist/{chunk-BA2HUMDN.js → chunk-GZY6RUZ6.js} +2 -2
  94. package/dist/chunk-H4VO6WG3.js +10 -0
  95. package/dist/{chunk-UEVZZZU2.js → chunk-H5HBGNXU.js} +5 -4
  96. package/dist/{chunk-GS76RXQE.js → chunk-H7KM7LZE.js} +15 -12
  97. package/dist/{chunk-I2A3Z5AK.js → chunk-HNM2YQT2.js} +4 -4
  98. package/dist/{chunk-3UTYPHN3.js → chunk-HYU5VLGA.js} +1 -1
  99. package/dist/{chunk-HSZMPH5T.js → chunk-IDKCWSM5.js} +225 -50
  100. package/dist/{chunk-BXZ4PKIT.js → chunk-IFKEI4SA.js} +15 -11
  101. package/dist/{chunk-XG4WJHLQ.js → chunk-IGOE6KPG.js} +49 -20
  102. package/dist/{chunk-GNWAOVFQ.js → chunk-IH2XURVQ.js} +5 -5
  103. package/dist/{chunk-YIGBJNH4.js → chunk-INQHESFB.js} +5 -4
  104. package/dist/chunk-IP74LCOQ.js +57 -0
  105. package/dist/chunk-IPHHDDC6.js +45 -0
  106. package/dist/{chunk-5WERBKLE.js → chunk-ISUAAMGS.js} +42 -221
  107. package/dist/{chunk-7FHNFCHK.js → chunk-IUPG3UKI.js} +154 -368
  108. package/dist/{chunk-HWD4JPU7.js → chunk-IVBOQAGB.js} +4 -2
  109. package/dist/{chunk-4SLBCEPD.js → chunk-J2JAKCIW.js} +88 -57
  110. package/dist/{chunk-G5YJBNDZ.js → chunk-J3IOLXWM.js} +8 -6
  111. package/dist/{chunk-FQ6WH6PB.js → chunk-JA5FI3QV.js} +6 -4
  112. package/dist/chunk-JAVI7JSP.js +49 -0
  113. package/dist/{chunk-ZFQMMU5Y.js → chunk-JB5LINEM.js} +6 -2
  114. package/dist/{chunk-LQH4P45K.js → chunk-JENSEMXF.js} +1 -1
  115. package/dist/{chunk-M6D2U3YM.js → chunk-JJF6HALY.js} +4 -3
  116. package/dist/chunk-JLUCKAEL.js +38 -0
  117. package/dist/{chunk-M4H2UG4R.js → chunk-JRBFANFE.js} +19 -16
  118. package/dist/{chunk-YZDZOEV4.js → chunk-KDNTAPLX.js} +3 -3
  119. package/dist/{chunk-IFFRGC3N.js → chunk-KFAVQZSX.js} +14 -12
  120. package/dist/chunk-KJXD4PNL.js +50 -0
  121. package/dist/chunk-KN5BXMWN.js +44 -0
  122. package/dist/{chunk-HXXP2NTE.js → chunk-KQGURXFU.js} +9 -7
  123. package/dist/{chunk-PQH56YF6.js → chunk-KXITGYLF.js} +6 -4
  124. package/dist/{chunk-MMZUN7ZO.js → chunk-L27SV425.js} +22 -20
  125. package/dist/{chunk-XQ3YZ4QW.js → chunk-LDLL7LB3.js} +24 -22
  126. package/dist/{chunk-6DQYZU2W.js → chunk-LFGTYX5U.js} +15 -15
  127. package/dist/{chunk-4D62IZII.js → chunk-LGBMTVNT.js} +7 -5
  128. package/dist/{chunk-YKTE2RU3.js → chunk-LGFL54FP.js} +3 -2
  129. package/dist/{chunk-GDZB57IU.js → chunk-LJXMYKZJ.js} +7 -5
  130. package/dist/{chunk-YJ3TBOTK.js → chunk-LKOR5UET.js} +29 -26
  131. package/dist/{chunk-WIWTJMMR.js → chunk-LNBQOP7D.js} +23 -21
  132. package/dist/{chunk-TGVVUKTG.js → chunk-LO6P2VYG.js} +2 -2
  133. package/dist/{chunk-HE3HRDNZ.js → chunk-LQJPN536.js} +2 -2
  134. package/dist/{chunk-PRW3HXM3.js → chunk-LYBNHMVZ.js} +29 -5
  135. package/dist/{chunk-75ZOZFGH.js → chunk-LZ7NUC62.js} +20 -18
  136. package/dist/chunk-M32BLWDH.js +37 -0
  137. package/dist/{chunk-QKMRFNMA.js → chunk-M3NANSDZ.js} +17 -15
  138. package/dist/chunk-MFHL5URL.js +31 -0
  139. package/dist/{chunk-TYD6I4CZ.js → chunk-MFR5OPBD.js} +6 -6
  140. package/dist/{chunk-LIRVU3HW.js → chunk-MG4ZL5RW.js} +32 -20
  141. package/dist/{chunk-ICHDSWEY.js → chunk-MO6P2JZH.js} +10 -8
  142. package/dist/{chunk-3LZ6P5EP.js → chunk-MUWDB4R4.js} +1 -1
  143. package/dist/{chunk-E57AOFYN.js → chunk-MZCGSXVR.js} +15 -13
  144. package/dist/{chunk-77O633L5.js → chunk-N3XIYPU3.js} +14 -12
  145. package/dist/{chunk-CG6CULP6.js → chunk-NDCF4R6S.js} +7 -5
  146. package/dist/{chunk-JS6WMC3J.js → chunk-NR2UJWOC.js} +10 -8
  147. package/dist/chunk-NXJ5URP6.js +51 -0
  148. package/dist/{chunk-NTAVOWYD.js → chunk-NY2XSR5K.js} +20 -18
  149. package/dist/{chunk-PUEWDYGP.js → chunk-O45HFTFS.js} +3 -2
  150. package/dist/{chunk-URIKUID7.js → chunk-O4GXGGBX.js} +14 -12
  151. package/dist/{chunk-C7CEK3KW.js → chunk-O5PXQR67.js} +7 -5
  152. package/dist/{chunk-E2VXBSIR.js → chunk-O66DM6DJ.js} +6 -4
  153. package/dist/{chunk-P2VBXX7N.js → chunk-O7FDLW7L.js} +11 -9
  154. package/dist/{chunk-COYN3UAN.js → chunk-O7XLYEFA.js} +59 -22
  155. package/dist/{chunk-5QUOPNLN.js → chunk-OHNCWBKF.js} +4 -4
  156. package/dist/{chunk-AZDITBCT.js → chunk-OHVTTOPS.js} +3 -3
  157. package/dist/chunk-OMI6FPPN.js +43 -0
  158. package/dist/chunk-ONUPY3H6.js +53 -0
  159. package/dist/chunk-OTLDSZDV.js +69 -0
  160. package/dist/{chunk-L4CESDPB.js → chunk-OUBGGKDU.js} +1 -1
  161. package/dist/{chunk-4FOAYLI4.js → chunk-OWNCM4ZN.js} +9 -7
  162. package/dist/{chunk-4B6BT75O.js → chunk-P2V7QW4D.js} +81 -24
  163. package/dist/{chunk-QHJJMZLX.js → chunk-P32RUW3B.js} +167 -92
  164. package/dist/{chunk-F6H2RJ3N.js → chunk-PAQ2AS5E.js} +1 -1
  165. package/dist/{chunk-ZLS6PU2O.js → chunk-PBPBMP2B.js} +4 -3
  166. package/dist/{chunk-ZOSD4FXV.js → chunk-PJSJPMJI.js} +3 -3
  167. package/dist/{chunk-XOL3GFW2.js → chunk-PKBHS4AA.js} +68 -31
  168. package/dist/{chunk-ZZFHLRQW.js → chunk-PMUAJGLI.js} +18 -16
  169. package/dist/{chunk-SH27FYPF.js → chunk-PPD7HTDP.js} +20 -18
  170. package/dist/chunk-PSOFBQWB.js +42 -0
  171. package/dist/{chunk-PAINMSID.js → chunk-Q2TECDIT.js} +987 -7619
  172. package/dist/{chunk-LU4MQVAL.js → chunk-Q4K5WB2W.js} +11 -10
  173. package/dist/{chunk-ECLXZWAG.js → chunk-Q6DFNVRJ.js} +14 -12
  174. package/dist/chunk-QA4O2GGC.js +265 -0
  175. package/dist/{chunk-4WXRPQDE.js → chunk-QAXW2N3B.js} +182 -33
  176. package/dist/{chunk-WCEF7H6L.js → chunk-QFWA2DPH.js} +8 -5
  177. package/dist/{chunk-CPK7QSBG.js → chunk-QKUJMING.js} +8 -6
  178. package/dist/{chunk-LEBR5NHW.js → chunk-R44CYFPV.js} +18 -15
  179. package/dist/{chunk-BEPCKDCP.js → chunk-R7NYHMUU.js} +153 -84
  180. package/dist/{chunk-G6X4YL4D.js → chunk-REWWDVQB.js} +5 -4
  181. package/dist/{chunk-LN77DXBM.js → chunk-RGERPOIV.js} +10 -10
  182. package/dist/{chunk-UDXWIPCB.js → chunk-RLDGWLQ7.js} +9 -7
  183. package/dist/chunk-RUGXBPWI.js +384 -0
  184. package/dist/{chunk-FYBF5MB2.js → chunk-RXPJMEOW.js} +13 -11
  185. package/dist/{chunk-K332XW7K.js → chunk-S4PMJU6H.js} +20 -9
  186. package/dist/{chunk-THN26IEF.js → chunk-S7FCV7S5.js} +4 -1
  187. package/dist/{chunk-OV57AHCG.js → chunk-SDKLKB6I.js} +26 -24
  188. package/dist/{chunk-O4IKAIZ2.js → chunk-SFSPGFCV.js} +28 -22
  189. package/dist/{chunk-TQ4TG57V.js → chunk-SFUP7TTO.js} +4 -4
  190. package/dist/{chunk-YBOVNMHC.js → chunk-SLXZOMA6.js} +29 -16
  191. package/dist/{chunk-LWDNKE4X.js → chunk-SQV37XO2.js} +6 -6
  192. package/dist/{chunk-67BP7HXL.js → chunk-SU74NDMQ.js} +19 -17
  193. package/dist/{chunk-JKIGL3XQ.js → chunk-SYV5LHML.js} +36 -33
  194. package/dist/chunk-T4YPZIQN.js +36 -0
  195. package/dist/{chunk-GX74YWR7.js → chunk-T6DQR5TV.js} +16 -14
  196. package/dist/{chunk-LNWEWYCM.js → chunk-THDMSZ3R.js} +345 -253
  197. package/dist/{chunk-NCB6656Z.js → chunk-TNR75OXT.js} +7 -7
  198. package/dist/{chunk-ODMBPDDV.js → chunk-TUULXQRW.js} +124 -2
  199. package/dist/{chunk-MD7KUEJ3.js → chunk-TYQBFTBR.js} +9 -7
  200. package/dist/chunk-U76OWS3Q.js +49 -0
  201. package/dist/{chunk-GSGIZ2OO.js → chunk-UCROWG2D.js} +27 -24
  202. package/dist/{chunk-PTQ3ZALZ.js → chunk-UF4AZOZB.js} +14 -12
  203. package/dist/{chunk-QE527XRY.js → chunk-UF4GLFBX.js} +26 -23
  204. package/dist/{chunk-YWAKDNMH.js → chunk-UGUP3ZM6.js} +70 -19
  205. package/dist/{chunk-3G6S7LAA.js → chunk-UNAGJYET.js} +14 -12
  206. package/dist/{chunk-EDZ45WIR.js → chunk-UOR2DTHH.js} +16 -14
  207. package/dist/{chunk-42EPP7OB.js → chunk-UPOY4YSQ.js} +14 -12
  208. package/dist/{chunk-API5TOUB.js → chunk-UPS2DGFC.js} +1 -1
  209. package/dist/{chunk-D2WSW4GU.js → chunk-UUU4CLJG.js} +4 -2
  210. package/dist/{chunk-ZKYRDV7A.js → chunk-UWMJKX5U.js} +14 -12
  211. package/dist/{chunk-HS4BGB4G.js → chunk-UWOJLHFT.js} +25 -23
  212. package/dist/{chunk-OKUB6RJA.js → chunk-VBTP56CE.js} +8 -6
  213. package/dist/{chunk-3SSTNB4E.js → chunk-VCTWPLAO.js} +34 -14
  214. package/dist/{chunk-YF5DZCPN.js → chunk-VNU26RCO.js} +37 -34
  215. package/dist/{chunk-AOCWFA7T.js → chunk-VTZMAJ3W.js} +8 -8
  216. package/dist/{chunk-ZQLRCA2V.js → chunk-VW62D6QE.js} +10 -8
  217. package/dist/{chunk-WAZEXEJH.js → chunk-VY72R2XZ.js} +45 -2
  218. package/dist/{chunk-WEOMJHPV.js → chunk-VZALIKIF.js} +18 -15
  219. package/dist/{chunk-TSM6T6GQ.js → chunk-W62H2XSO.js} +25 -23
  220. package/dist/{chunk-BC6KKZ67.js → chunk-W7VWI2YH.js} +9 -6
  221. package/dist/{chunk-LO3BLMVG.js → chunk-WERM6KPJ.js} +7 -4
  222. package/dist/{chunk-36RY7ZXM.js → chunk-WF7B67YE.js} +88 -26
  223. package/dist/{chunk-TQTRWENN.js → chunk-WG5U3F5V.js} +14 -12
  224. package/dist/{chunk-NRQ65LTQ.js → chunk-WJF2CS6M.js} +6 -5
  225. package/dist/{chunk-FVMPFCDS.js → chunk-WKUJ3KPV.js} +4 -4
  226. package/dist/{chunk-BA3U7ALS.js → chunk-WMTRHUI5.js} +26 -22
  227. package/dist/chunk-WNKPRSGI.js +36 -0
  228. package/dist/{chunk-GIFMBCTW.js → chunk-WXFLMQSR.js} +10 -8
  229. package/dist/{chunk-JYTIHTIK.js → chunk-X3WY6MN3.js} +4 -4
  230. package/dist/{chunk-S2RY3BOD.js → chunk-X4CXA2IL.js} +31 -21
  231. package/dist/{chunk-26Z7OGQW.js → chunk-X5F3Q5LV.js} +60 -30
  232. package/dist/{chunk-4CLK2RJO.js → chunk-XD75VZIH.js} +6 -4
  233. package/dist/{chunk-KDAHXQIE.js → chunk-XERYFDB5.js} +37 -34
  234. package/dist/{chunk-U3NBK4EU.js → chunk-XI2LCCYQ.js} +8 -8
  235. package/dist/{chunk-MZGRDONP.js → chunk-Y2EQNWKV.js} +55 -38
  236. package/dist/{chunk-A2G72UI4.js → chunk-YHCMZC2J.js} +7 -7
  237. package/dist/{chunk-4TKVU2I2.js → chunk-YYY3AZFE.js} +2 -2
  238. package/dist/{chunk-2HTEMYTB.js → chunk-Z5IA3WDR.js} +17 -15
  239. package/dist/{chunk-FRHD22WM.js → chunk-ZFFYNRIO.js} +25 -23
  240. package/dist/{chunk-6EXDI5GI.js → chunk-ZFL7NY4F.js} +43 -40
  241. package/dist/{chunk-4PYC2UGC.js → chunk-ZGULQAPZ.js} +7 -4
  242. package/dist/{chunk-4SKZDI62.js → chunk-ZIUFM5HT.js} +3 -1
  243. package/dist/{chunk-CNPY4NTZ.js → chunk-ZJFRMSJT.js} +15 -13
  244. package/dist/{chunk-Q26LDIUV.js → chunk-ZJXLNDH4.js} +18 -15
  245. package/dist/{chunk-LPV6T362.js → chunk-ZQ3ON2VQ.js} +8 -6
  246. package/dist/{chunk-ZX7235KR.js → chunk-ZQ7SKESZ.js} +44 -383
  247. package/dist/{chunk-7QPCGTPS.js → chunk-ZQXZ2SES.js} +24 -21
  248. package/dist/{chunk-4CYTJ5TZ.js → chunk-ZX57KSEQ.js} +4 -3
  249. package/dist/{chunk-37WE3LS2.js → chunk-ZZK56BLP.js} +5 -3
  250. package/dist/files.json +533 -509
  251. package/dist/packages/sdk/npm/index.js +448 -67
  252. package/dist/packages/ui/dist/assets/{elk-api-CowTnhEJ.js → elk-api-CIf-0gz5.js} +2 -2
  253. package/dist/packages/ui/dist/assets/index-CoK_Dl0D.js +47 -0
  254. package/dist/packages/ui/dist/index.html +2 -1
  255. package/package.json +4 -4
  256. package/dist/chunk-26WBY34Y.js +0 -37
  257. package/dist/chunk-3TD6S4TC.js +0 -49
  258. package/dist/chunk-5G7ILBUG.js +0 -66
  259. package/dist/chunk-6FNAKCET.js +0 -38
  260. package/dist/chunk-AM6FP6JW.js +0 -43
  261. package/dist/chunk-CFH3QH26.js +0 -29
  262. package/dist/chunk-CLD4RVTA.js +0 -45
  263. package/dist/chunk-D5KV5PSK.js +0 -45
  264. package/dist/chunk-D5MASS4I.js +0 -48
  265. package/dist/chunk-DN4A2Q2O.js +0 -57
  266. package/dist/chunk-FGAGWYZB.js +0 -47
  267. package/dist/chunk-JITJP64K.js +0 -34
  268. package/dist/chunk-JRXHON4E.js +0 -41
  269. package/dist/chunk-JU4QNJSR.js +0 -62
  270. package/dist/chunk-N3RUGTGV.js +0 -39
  271. package/dist/chunk-PKJAV25S.js +0 -43
  272. package/dist/chunk-PRTBPXYA.js +0 -50
  273. package/dist/chunk-PRZ7KMWL.js +0 -42
  274. package/dist/chunk-QSIDVFB7.js +0 -45
  275. package/dist/chunk-SB5GRUFM.js +0 -54
  276. package/dist/chunk-T74WQQGS.js +0 -40
  277. package/dist/chunk-X7EMBM5X.js +0 -34
  278. package/dist/chunk-Z6VLC5X4.js +0 -36
  279. package/dist/chunk-ZPDDEVQX.js +0 -47
  280. package/dist/packages/ui/dist/assets/index-z2wv0d5d.js +0 -47
@@ -8,22 +8,22 @@ import {
8
8
  addStoreReference,
9
9
  readStoreMarker,
10
10
  readStoreVia
11
- } from "./chunk-D2WSW4GU.js";
11
+ } from "./chunk-UUU4CLJG.js";
12
12
  import {
13
13
  AdapterError,
14
14
  mergeBlockers,
15
15
  requireApproval
16
- } from "./chunk-4KNOJC6J.js";
16
+ } from "./chunk-7IGKHZ4Z.js";
17
17
  import {
18
18
  outsideProfileSystems,
19
19
  readCatalog
20
- } from "./chunk-4SLBCEPD.js";
20
+ } from "./chunk-J2JAKCIW.js";
21
21
  import {
22
22
  baseClonePath,
23
23
  createGit,
24
24
  readChangeRepos,
25
25
  writeChangeRepos
26
- } from "./chunk-XOL3GFW2.js";
26
+ } from "./chunk-PKBHS4AA.js";
27
27
  import {
28
28
  ChangeArtifact,
29
29
  ChangeLifecycle,
@@ -50,13 +50,15 @@ import {
50
50
  questionsRelOf,
51
51
  readFlow,
52
52
  readQuestion,
53
- require_dist,
54
53
  specFlowFiles,
55
54
  toCanonicalYaml
56
- } from "./chunk-PAINMSID.js";
55
+ } from "./chunk-Q2TECDIT.js";
57
56
  import {
58
57
  writeFileAtomic
59
- } from "./chunk-ODMBPDDV.js";
58
+ } from "./chunk-TUULXQRW.js";
59
+ import {
60
+ require_dist
61
+ } from "./chunk-BQGDB6ZL.js";
60
62
  import {
61
63
  __toESM
62
64
  } from "./chunk-TV45EUGM.js";
@@ -628,22 +630,33 @@ function changeStore(root) {
628
630
  await writeFileAtomic(path, serializeChange(value));
629
631
  return path;
630
632
  },
633
+ listWithProblems,
631
634
  async list() {
632
- let names;
635
+ return (await listWithProblems()).changes;
636
+ }
637
+ };
638
+ async function listWithProblems() {
639
+ let names;
640
+ try {
641
+ names = (await readdir2(changesDirOf(root), { withFileTypes: true })).filter((d) => d.isDirectory() && d.name !== "archive" && RecordId.safeParse(d.name).success).map((d) => d.name).sort();
642
+ } catch {
643
+ return { changes: [], problems: [] };
644
+ }
645
+ const changes = [];
646
+ const problems = [];
647
+ for (const n of names) {
633
648
  try {
634
- names = (await readdir2(changesDirOf(root), { withFileTypes: true })).filter((d) => d.isDirectory() && d.name !== "archive" && RecordId.safeParse(d.name).success).map((d) => d.name).sort();
635
- } catch {
636
- return [];
637
- }
638
- const out = [];
639
- for (const n of names) {
640
649
  const c = await tryRead(n);
641
650
  if (c)
642
- out.push(c);
651
+ changes.push(c);
652
+ } catch (e) {
653
+ if (!(e instanceof ChangeFileError))
654
+ throw e;
655
+ problems.push({ file: e.path, message: e.message });
643
656
  }
644
- return out;
645
657
  }
646
- };
658
+ return { changes, problems };
659
+ }
647
660
  }
648
661
 
649
662
  // packages/changes/dist/codeowners.js
@@ -1650,8 +1663,19 @@ async function checkFindings(root, change, gates) {
1650
1663
  continue;
1651
1664
  const round2 = Math.max(...rounds);
1652
1665
  const dir = join7(base, String(round2));
1666
+ const files = (await readdir4(dir)).filter((f) => /\.ya?ml$/.test(f)).sort();
1667
+ const unfinished = {
1668
+ code: "round-unfinished",
1669
+ message: `Critic round ${round2} on the ${gate} gate didn't finish: run atticus critic ${change.id} --gate ${gate} again.`
1670
+ };
1671
+ let hasMeta = false;
1653
1672
  try {
1654
1673
  const meta = (0, import_yaml5.parse)(await readFile6(join7(dir, "meta", "round.yaml"), "utf8"));
1674
+ hasMeta = true;
1675
+ if (meta?.state === "in-progress") {
1676
+ reasons.push(unfinished);
1677
+ continue;
1678
+ }
1655
1679
  for (const l of meta?.lenses ?? [])
1656
1680
  if (l.state === "waiting")
1657
1681
  reasons.push({
@@ -1665,7 +1689,10 @@ async function checkFindings(root, change, gates) {
1665
1689
  });
1666
1690
  } catch {
1667
1691
  }
1668
- const files = (await readdir4(dir)).filter((f) => /\.ya?ml$/.test(f)).sort();
1692
+ if (!hasMeta && files.length === 0) {
1693
+ reasons.push(unfinished);
1694
+ continue;
1695
+ }
1669
1696
  for (const f of files) {
1670
1697
  const rel = `review/${gate}/${round2}/${f}`;
1671
1698
  let data;
@@ -1837,19 +1864,87 @@ var NothingFile = external_exports.strictObject({
1837
1864
  commit: external_exports.string().regex(/^[0-9a-f]{7,64}$/).optional(),
1838
1865
  at: external_exports.string().min(1),
1839
1866
  by: external_exports.string().min(1)
1840
- }))
1867
+ })),
1868
+ /**
1869
+ * Review round 48: the change branch's commit when Sync first read each release PR merged, so
1870
+ * a merged PR stands only while the branch is there (work landed since needs a PR of its own).
1871
+ */
1872
+ merged: external_exports.array(external_exports.strictObject({
1873
+ repo: external_exports.string().min(1),
1874
+ number: external_exports.number().int().positive(),
1875
+ commit: external_exports.string().regex(/^[0-9a-f]{7,64}$/),
1876
+ at: external_exports.string().min(1)
1877
+ })).optional()
1841
1878
  });
1842
- async function readNothing(root, id) {
1879
+ async function readReleaseFile(root, id) {
1880
+ const empty = { schemaVersion: 1, nothingToRelease: [] };
1843
1881
  const text = await readFile8(join9(changeFolder(root, id), RELEASE_PRS_FILE), "utf8").catch(() => void 0);
1844
1882
  if (text === void 0)
1845
- return [];
1883
+ return empty;
1846
1884
  try {
1847
1885
  const r = NothingFile.safeParse((0, import_yaml7.parse)(text));
1848
- return r.success ? r.data.nothingToRelease : [];
1886
+ return r.success ? r.data : empty;
1849
1887
  } catch {
1850
- return [];
1888
+ return empty;
1851
1889
  }
1852
1890
  }
1891
+ async function readNothing(root, id) {
1892
+ return (await readReleaseFile(root, id)).nothingToRelease;
1893
+ }
1894
+ async function writeReleaseFile(root, id, nothing, merged) {
1895
+ const byRepo = (xs) => [...xs].sort((a, b) => a.repo < b.repo ? -1 : a.repo > b.repo ? 1 : 0);
1896
+ await writeFile(join9(changeFolder(root, id), RELEASE_PRS_FILE), toCanonicalYaml(NothingFile.parse({
1897
+ schemaVersion: 1,
1898
+ nothingToRelease: byRepo(nothing),
1899
+ ...merged.length ? { merged: byRepo(merged) } : {}
1900
+ })), "utf8");
1901
+ }
1902
+ function repoDir(root, r) {
1903
+ const dirs = [join9(root, r.worktree)];
1904
+ try {
1905
+ dirs.push(baseClonePath(root, r.id));
1906
+ } catch {
1907
+ }
1908
+ return dirs.find((d) => existsSync(d));
1909
+ }
1910
+ async function staleReleasePrs(root, id, o = {}) {
1911
+ const out = /* @__PURE__ */ new Set();
1912
+ const cr = await readChangeRepos(root, id).catch(() => void 0);
1913
+ const merged = (await readReleaseFile(root, id)).merged ?? [];
1914
+ if (!cr || !merged.length)
1915
+ return out;
1916
+ const git = o.git ?? createGit({ timeoutMs: 3e4 });
1917
+ const remote = o.remote ?? "origin";
1918
+ for (const r of cr.repos) {
1919
+ if (r.pr?.state !== "merged")
1920
+ continue;
1921
+ const entry = merged.find((x) => x.repo === r.id && x.number === r.pr.number);
1922
+ if (!entry)
1923
+ continue;
1924
+ const dir = repoDir(root, r);
1925
+ if (!dir)
1926
+ continue;
1927
+ if (await movedPast(git, dir, remote, r.branch, entry.commit))
1928
+ out.add(r.id);
1929
+ }
1930
+ return out;
1931
+ }
1932
+ async function movedPast(git, dir, remote, branch, commit) {
1933
+ const ref = `refs/heads/${branch}`;
1934
+ const known = (sha) => git(["cat-file", "-e", `${sha}^{commit}`], dir).then(() => true, () => false);
1935
+ const here = await git(["rev-parse", "--verify", "--quiet", `${ref}^{commit}`], dir).then((x) => x.stdout.trim() || void 0, () => void 0);
1936
+ const onHost = await git(["ls-remote", "--heads", remote, ref], dir).then((x) => x.stdout.trim().split(/\s+/)[0] || void 0, () => void 0);
1937
+ if (onHost && !sameSha(onHost, commit) && !await known(onHost))
1938
+ await git(["fetch", "-q", remote, `+${ref}:refs/remotes/${remote}/${branch}`], dir).catch(() => void 0);
1939
+ const ahead = async (sha) => {
1940
+ if (!sha || sameSha(sha, commit))
1941
+ return false;
1942
+ if (!await known(sha) || !await known(commit))
1943
+ return true;
1944
+ return git(["merge-base", "--is-ancestor", sha, commit], dir).then(() => false, () => true);
1945
+ };
1946
+ return await ahead(here) || await ahead(onHost);
1947
+ }
1853
1948
  async function nothingToRelease(root, id, o = {}) {
1854
1949
  const entries = await readNothing(root, id);
1855
1950
  const out = /* @__PURE__ */ new Set();
@@ -1866,12 +1961,7 @@ async function nothingToRelease(root, id, o = {}) {
1866
1961
  }
1867
1962
  return out;
1868
1963
  async function moved(r, commit) {
1869
- const dirs = [join9(root, r.worktree)];
1870
- try {
1871
- dirs.push(baseClonePath(root, r.id));
1872
- } catch {
1873
- }
1874
- const dir = dirs.find((d) => existsSync(d));
1964
+ const dir = repoDir(root, r);
1875
1965
  if (!dir)
1876
1966
  return false;
1877
1967
  const ref = `refs/heads/${r.branch}`;
@@ -1912,12 +2002,15 @@ async function raiseReleasePrs(root, id, o) {
1912
2002
  const rows = [];
1913
2003
  let changed2 = false;
1914
2004
  const repos = cr.repos.map((r) => ({ ...r }));
1915
- const before = await readNothing(root, id);
2005
+ const file = await readReleaseFile(root, id);
2006
+ const before = file.nothingToRelease;
1916
2007
  const nothing = new Map(before.map((x) => [x.repo, x]));
2008
+ const stale = await staleReleasePrs(root, id, { git, remote });
1917
2009
  for (const r of repos) {
1918
- if (!live(r.pr))
2010
+ const movedOn = r.pr?.state === "merged" && stale.has(r.id) ? `Release PR #${r.pr.number} merged before ${r.branch} moved on; this one carries what landed since.` : void 0;
2011
+ if (!live(r.pr) || movedOn)
1919
2012
  nothing.delete(r.id);
1920
- if (live(r.pr)) {
2013
+ if (live(r.pr) && !movedOn) {
1921
2014
  rows.push({
1922
2015
  repo: r.id,
1923
2016
  outcome: "kept",
@@ -1964,7 +2057,7 @@ async function raiseReleasePrs(root, id, o) {
1964
2057
  });
1965
2058
  continue;
1966
2059
  }
1967
- const notes = [];
2060
+ const notes = movedOn ? [movedOn] : [];
1968
2061
  const dir = join9(root, r.worktree);
1969
2062
  if (existsSync(dir)) {
1970
2063
  const onHost = await git(["ls-remote", "--heads", remote, `refs/heads/${r.branch}`], dir).then((x) => x.stdout.trim() ? "yes" : "no").catch((e) => {
@@ -2048,8 +2141,10 @@ async function raiseReleasePrs(root, id, o) {
2048
2141
  if (changed2)
2049
2142
  await writeChangeRepos(root, { ...cr, repos });
2050
2143
  const after = [...nothing.values()].sort((a, b) => a.repo < b.repo ? -1 : 1);
2051
- if (JSON.stringify(after) !== JSON.stringify(before))
2052
- await writeFile(join9(changeFolder(root, id), RELEASE_PRS_FILE), toCanonicalYaml(NothingFile.parse({ schemaVersion: 1, nothingToRelease: after })), "utf8");
2144
+ const mergedBefore = file.merged ?? [];
2145
+ const mergedAfter = mergedBefore.filter((x) => repos.some((r) => r.id === x.repo && r.pr?.number === x.number && r.pr.state === "merged"));
2146
+ if (JSON.stringify(after) !== JSON.stringify(before) || mergedAfter.length !== mergedBefore.length)
2147
+ await writeReleaseFile(root, id, after, mergedAfter);
2053
2148
  return { change: id, rows };
2054
2149
  }
2055
2150
  async function syncReleasePrs(root, id, o) {
@@ -2060,6 +2155,9 @@ async function syncReleasePrs(root, id, o) {
2060
2155
  const now = o.now ?? nowIso();
2061
2156
  let changed2 = false;
2062
2157
  const repos = cr.repos.map((r) => ({ ...r }));
2158
+ const file = await readReleaseFile(root, id);
2159
+ const merged = [...file.merged ?? []];
2160
+ let mergedChanged = false;
2063
2161
  for (const r of repos) {
2064
2162
  if (!r.pr)
2065
2163
  continue;
@@ -2100,6 +2198,16 @@ async function syncReleasePrs(root, id, o) {
2100
2198
  r.build = { ...r.build, status: build, at: now };
2101
2199
  changed2 = true;
2102
2200
  }
2201
+ if (pr.state === "merged" && !merged.some((x) => x.repo === r.id && x.number === pr.number)) {
2202
+ const commit = await branchTip(root, r, o.git, o.remote ?? "origin");
2203
+ if (commit) {
2204
+ for (let i = merged.length - 1; i >= 0; i--)
2205
+ if (merged[i].repo === r.id)
2206
+ merged.splice(i, 1);
2207
+ merged.push({ repo: r.id, number: pr.number, commit, at: now });
2208
+ mergedChanged = true;
2209
+ }
2210
+ }
2103
2211
  rows.push({
2104
2212
  repo: r.id,
2105
2213
  outcome: "kept",
@@ -2109,8 +2217,25 @@ async function syncReleasePrs(root, id, o) {
2109
2217
  }
2110
2218
  if (changed2)
2111
2219
  await writeChangeRepos(root, { ...cr, repos });
2220
+ if (mergedChanged)
2221
+ await writeReleaseFile(root, id, file.nothingToRelease, merged);
2112
2222
  return { change: id, rows };
2113
2223
  }
2224
+ async function branchTip(root, r, g, remote) {
2225
+ const dir = repoDir(root, r);
2226
+ if (!dir)
2227
+ return void 0;
2228
+ const git = g ?? createGit({ timeoutMs: 3e4 });
2229
+ const ref = `refs/heads/${r.branch}`;
2230
+ const onHost = await git(["ls-remote", "--heads", remote, ref], dir).then((x) => x.stdout.trim().split(/\s+/)[0] || void 0, () => void 0);
2231
+ if (onHost) {
2232
+ await git(["fetch", "-q", remote, `+${ref}:refs/remotes/${remote}/${r.branch}`], dir).catch(() => void 0);
2233
+ if (/^[0-9a-f]{7,64}$/.test(onHost))
2234
+ return onHost;
2235
+ }
2236
+ const here = await git(["rev-parse", "--verify", "--quiet", `${ref}^{commit}`], dir).then((x) => x.stdout.trim(), () => "");
2237
+ return /^[0-9a-f]{7,64}$/.test(here) ? here : void 0;
2238
+ }
2114
2239
  function buildOf(pr) {
2115
2240
  if (!pr.checks.length)
2116
2241
  return void 0;
@@ -2137,10 +2262,18 @@ async function releasePrReasons(root, id, o = {}) {
2137
2262
  return [];
2138
2263
  const merged = await requireMergedPrs(root);
2139
2264
  const nothing = await nothingToRelease(root, id, o);
2265
+ const stale = await staleReleasePrs(root, id, o);
2140
2266
  const out = [];
2141
2267
  for (const r of cr.repos) {
2142
2268
  if (!r.pr && nothing.has(r.id))
2143
2269
  continue;
2270
+ if (r.pr?.state === "merged" && stale.has(r.id)) {
2271
+ out.push({
2272
+ code: "release-pr-stale",
2273
+ message: `${r.id}: ${r.branch} has commits since release PR #${r.pr.number} merged, so they haven't reached its default branch: raise the release PRs again (Release \u203A Raise the release PRs, or atticus change release-prs ${id} --approve).`
2274
+ });
2275
+ continue;
2276
+ }
2144
2277
  if (!r.pr || r.pr.state === "closed")
2145
2278
  out.push({
2146
2279
  code: "release-pr-missing",
@@ -2394,12 +2527,13 @@ function gitHandoffPublisher(opts = {}) {
2394
2527
  const gitDir = await out(["rev-parse", "--absolute-git-dir"]);
2395
2528
  await tryOut(["fetch", "--quiet", remote, base]);
2396
2529
  await tryOut(["fetch", "--quiet", remote, branch]);
2397
- const start = await tryOut([
2530
+ const onRemote = await tryOut([
2398
2531
  "rev-parse",
2399
2532
  "--verify",
2400
2533
  "--quiet",
2401
2534
  `refs/remotes/${remote}/${branch}^{commit}`
2402
- ]) ?? await tryOut([
2535
+ ]);
2536
+ const start = onRemote ?? await tryOut([
2403
2537
  "rev-parse",
2404
2538
  "--verify",
2405
2539
  "--quiet",
@@ -2414,9 +2548,9 @@ function gitHandoffPublisher(opts = {}) {
2414
2548
  const tree = (await staged(["write-tree"], root)).stdout.trim();
2415
2549
  const startTree = await out(["rev-parse", `${start}^{tree}`]);
2416
2550
  const commit = tree === startTree ? start : await out(["commit-tree", tree, "-p", start, "-m", message]);
2417
- await out(["update-ref", `refs/heads/${branch}`, commit]);
2418
2551
  await out(["push", "--quiet", remote, `${commit}:refs/heads/${branch}`]);
2419
- return { commit };
2552
+ await keepLocalBranch(out, tryOut, branch, start, commit);
2553
+ return { commit, changed: commit !== onRemote };
2420
2554
  } finally {
2421
2555
  await rm(index, { force: true });
2422
2556
  }
@@ -2424,6 +2558,23 @@ function gitHandoffPublisher(opts = {}) {
2424
2558
  }
2425
2559
  }
2426
2560
  var queue = /* @__PURE__ */ new Map();
2561
+ async function keepLocalBranch(out, tryOut, branch, start, commit) {
2562
+ const ref = `refs/heads/${branch}`;
2563
+ const local = await tryOut(["rev-parse", "--verify", "--quiet", `${ref}^{commit}`]);
2564
+ if (local === commit)
2565
+ return;
2566
+ const list = await tryOut(["worktree", "list", "--porcelain"]) ?? "";
2567
+ if (list.split(/\r?\n/).includes(`branch ${ref}`))
2568
+ return;
2569
+ if (!local) {
2570
+ await tryOut(["update-ref", ref, commit, ""]);
2571
+ return;
2572
+ }
2573
+ const own = await tryOut(["rev-list", "--count", `${start}..${local}`]);
2574
+ if (own === void 0 || own !== "0")
2575
+ return;
2576
+ await out(["update-ref", ref, commit, local]).catch(() => void 0);
2577
+ }
2427
2578
 
2428
2579
  // packages/changes/dist/handoff.js
2429
2580
  import { readdir as readdir6, readFile as readFile12 } from "node:fs/promises";
@@ -2985,7 +3136,7 @@ async function handoff(root, id, opts) {
2985
3136
  if (live2 && live2.phase === phase) {
2986
3137
  const pr2 = await handoffPr(opts.gitHost, repo, id, live2);
2987
3138
  if (pr2.state === "open" || pr2.state === "draft") {
2988
- await opts.publisher?.publish({
3139
+ const published = await opts.publisher?.publish({
2989
3140
  root,
2990
3141
  branch,
2991
3142
  base: pr2.base,
@@ -2993,7 +3144,9 @@ async function handoff(root, id, opts) {
2993
3144
  message: `${handoffName(a.type, phase)}: update`,
2994
3145
  approval: opts.approval
2995
3146
  });
2996
- await opts.gitHost.comment(repo, pr2.number, `${by} updated the hand-off for another review.`, opts.approval);
3147
+ const unchanged = published ? published.changed === false : sameArtifacts(hashed, live2.artifacts);
3148
+ if (!unchanged)
3149
+ await opts.gitHost.comment(repo, pr2.number, `${by} updated the hand-off for another review.`, opts.approval);
2997
3150
  const updated = {
2998
3151
  ...live2,
2999
3152
  state: "open",
@@ -3014,6 +3167,13 @@ async function handoff(root, id, opts) {
3014
3167
  live2.state = "closed";
3015
3168
  live2.updatedAt = now;
3016
3169
  }
3170
+ if (change.state === "returned") {
3171
+ const open = (await opts.gitHost.listPullRequests(repo, { head: branch })).find((p) => p.state === "open" || p.state === "draft");
3172
+ if (open) {
3173
+ const message = `PR #${open.number} from ${branch} is still open on the Git host (${open.url}): close it there first (the return asked for that), then resubmit the change.`;
3174
+ throw new ChangeError("refused", message, [{ code: "host-refused", message }]);
3175
+ }
3176
+ }
3017
3177
  const base = opts.base ?? (await opts.gitHost.getRepo(repo)).defaultBranch;
3018
3178
  const next = a.next;
3019
3179
  await opts.publisher?.publish({
@@ -3024,13 +3184,23 @@ async function handoff(root, id, opts) {
3024
3184
  message: `${handoffName(a.type, phase)}: ${change.title}`,
3025
3185
  approval: opts.approval
3026
3186
  });
3027
- const pr = await opts.gitHost.createPullRequest({
3028
- repo,
3029
- head: branch,
3030
- base,
3031
- title: `${change.title}: ${handoffName(a.type, phase)}`,
3032
- body: prBody(a, phase, change.state === "returned" ? nextAfterResubmit(a, phase) : next, [...files.map((f) => `${rel}/${id}/${f}`), ...questionFiles], reviewers, opts.review)
3033
- }, opts.approval);
3187
+ let pr;
3188
+ try {
3189
+ pr = await opts.gitHost.createPullRequest({
3190
+ repo,
3191
+ head: branch,
3192
+ base,
3193
+ title: `${change.title}: ${handoffName(a.type, phase)}`,
3194
+ body: prBody(a, phase, change.state === "returned" ? nextAfterResubmit(a, phase) : next, [...files.map((f) => `${rel}/${id}/${f}`), ...questionFiles], reviewers, opts.review)
3195
+ }, opts.approval);
3196
+ } catch (e) {
3197
+ if (!(e instanceof AdapterError) || e.code !== "conflict")
3198
+ throw e;
3199
+ const open = (await opts.gitHost.listPullRequests(repo, { head: branch }).catch(() => [])).filter((p) => p.base === base && (p.state === "open" || p.state === "draft")).at(0);
3200
+ if (!open)
3201
+ throw e;
3202
+ pr = open;
3203
+ }
3034
3204
  const h = {
3035
3205
  phase,
3036
3206
  branch,
@@ -3057,6 +3227,10 @@ async function handoff(root, id, opts) {
3057
3227
  });
3058
3228
  return h;
3059
3229
  }
3230
+ function sameArtifacts(a, b) {
3231
+ const key = (xs) => JSON.stringify([...xs].map((x) => `${x.path} ${x.sha256}`).sort());
3232
+ return key(a) === key(b);
3233
+ }
3060
3234
  function nextAfterResubmit(a, phase) {
3061
3235
  const next = a.type.phases[a.type.phases.indexOf(phase) + 1];
3062
3236
  return next ? phaseState(next) : "released";
@@ -3839,7 +4013,7 @@ async function metarepoOrigin(root, git = createGit()) {
3839
4013
  return void 0;
3840
4014
  }
3841
4015
  }
3842
- async function referenceMetarepoIn(root, repoDir, o = {}) {
4016
+ async function referenceMetarepoIn(root, repoDir2, o = {}) {
3843
4017
  const { settings } = await loadOpenSpecSettings(orgPackDirOf(root));
3844
4018
  if (!settings.referenceInRepos)
3845
4019
  return { action: "off" };
@@ -3851,7 +4025,7 @@ async function referenceMetarepoIn(root, repoDir, o = {}) {
3851
4025
  file,
3852
4026
  why: marker.missing ? `this metarepo isn't an OpenSpec store yet (no ${STORE_MARKER}): run atticus upgrade --openspec-store, commit the file, then hand down again` : `this metarepo's ${STORE_MARKER} can't be read (${marker.notes.join("; ")})`
3853
4027
  };
3854
- const path = join17(repoDir, "openspec", "config.yaml");
4028
+ const path = join17(repoDir2, "openspec", "config.yaml");
3855
4029
  const text = await readFile15(path, "utf8").catch(() => void 0);
3856
4030
  if (text === void 0)
3857
4031
  return {
@@ -4106,6 +4280,7 @@ export {
4106
4280
  prApprovers,
4107
4281
  RELEASE_PR_STATES,
4108
4282
  RELEASE_PRS_FILE,
4283
+ staleReleasePrs,
4109
4284
  nothingToRelease,
4110
4285
  raiseReleasePrs,
4111
4286
  syncReleasePrs,
@@ -89,6 +89,7 @@ import {
89
89
  splitTargetGroups,
90
90
  staleFlows,
91
91
  staleTargetQuestions,
92
+ staleTopicQuestions,
92
93
  suggestionWhy,
93
94
  targetGroupQuestion,
94
95
  targetGroupWordings,
@@ -106,22 +107,24 @@ import {
106
107
  withExcludes,
107
108
  withPluginScan,
108
109
  writeCatalog
109
- } from "./chunk-4SLBCEPD.js";
110
- import "./chunk-64AADMTW.js";
111
- import "./chunk-JYMIB5XY.js";
112
- import "./chunk-CPK7QSBG.js";
113
- import "./chunk-YO2PKTXT.js";
114
- import "./chunk-TWQRPM76.js";
115
- import "./chunk-XOL3GFW2.js";
116
- import "./chunk-QHJJMZLX.js";
117
- import "./chunk-7AB6OWTV.js";
110
+ } from "./chunk-J2JAKCIW.js";
111
+ import "./chunk-745DAZ4L.js";
112
+ import "./chunk-CXJ6FUKN.js";
113
+ import "./chunk-QKUJMING.js";
114
+ import "./chunk-6ZGLAACW.js";
115
+ import "./chunk-CQDGOPGH.js";
116
+ import "./chunk-3NFFJL5D.js";
117
+ import "./chunk-PKBHS4AA.js";
118
+ import "./chunk-P32RUW3B.js";
119
+ import "./chunk-QA4O2GGC.js";
118
120
  import {
119
121
  fieldKey,
120
122
  lineNamesField,
121
123
  lineNamesRoute,
122
124
  lineNamesWord
123
- } from "./chunk-PAINMSID.js";
124
- import "./chunk-ODMBPDDV.js";
125
+ } from "./chunk-Q2TECDIT.js";
126
+ import "./chunk-TUULXQRW.js";
127
+ import "./chunk-BQGDB6ZL.js";
125
128
  import "./chunk-TV45EUGM.js";
126
129
  export {
127
130
  CLEAR_MATCH,
@@ -213,6 +216,7 @@ export {
213
216
  splitTargetGroups,
214
217
  staleFlows,
215
218
  staleTargetQuestions,
219
+ staleTopicQuestions,
216
220
  suggestionWhy,
217
221
  targetGroupQuestion,
218
222
  targetGroupWordings,
@@ -6,10 +6,13 @@ var __atticusPath = (p) => __atticusFileURLToPath(__atticusUrl(p));
6
6
  import {
7
7
  aliasArgv,
8
8
  isLegacy
9
- } from "./chunk-BXBCMGIQ.js";
9
+ } from "./chunk-24OXGB3P.js";
10
10
  import {
11
11
  isHandoffStep
12
12
  } from "./chunk-4Q3NN7VF.js";
13
+ import {
14
+ optionsFor
15
+ } from "./chunk-QA4O2GGC.js";
13
16
 
14
17
  // packages/cli/dist/command-catalog.js
15
18
  var AREAS = [
@@ -189,24 +192,45 @@ function parseArgs(id, usage) {
189
192
  }
190
193
  return out;
191
194
  }
192
- function parseFlags(text, summaries) {
195
+ function requiredFlags(usage) {
196
+ let masked = "";
197
+ let depth = 0;
198
+ let quoted = false;
199
+ for (const ch of usage) {
200
+ if (ch === '"')
201
+ quoted = !quoted;
202
+ else if (!quoted && (ch === "[" || ch === "<"))
203
+ depth++;
204
+ else if (!quoted && (ch === "]" || ch === ">"))
205
+ depth = Math.max(0, depth - 1);
206
+ masked += depth || quoted || ch === '"' || ch === "]" || ch === ">" ? "_" : ch;
207
+ }
208
+ const tokens = masked.split(/\s+/).filter(Boolean);
209
+ const flagOf = (t) => /^--[a-z]/.test(t) ? t.split("=")[0] : void 0;
210
+ const bar = tokens.indexOf("|");
211
+ if (bar < 0)
212
+ return new Set(tokens.map(flagOf).filter((f) => !!f));
213
+ const first = tokens.slice(0, bar).map(flagOf).filter((f) => !!f);
214
+ return new Set(first.slice(0, -1));
215
+ }
216
+ function parseFlags(text, summaries, required, options) {
193
217
  const out = /* @__PURE__ */ new Map();
194
218
  const re = /(--[a-z][a-z-]*)(?:[ =]("[^"]*"|<[^>]+>|[A-Za-z0-9][\w.,=-]*(?:\|[\w.-]+)*))?/g;
195
219
  for (const m of text.matchAll(re)) {
196
220
  const name = m[1];
197
221
  if (out.has(name))
198
222
  continue;
199
- const before = text.slice(0, m.index);
200
- const opened = (before.match(/\[/g) ?? []).length - (before.match(/\]/g) ?? []).length;
223
+ const type = options[name.slice(2)]?.type;
201
224
  let value = m[2]?.replace(/^<|>$/g, "");
202
- if (value?.startsWith("--") || value && /^[a-z]+$/.test(value) && !m[2].startsWith("<"))
203
- value = /^(m|n|t|s|k|f|c|d|o|p|file|dir|id)$/.test(value) ? value : void 0;
225
+ if (value?.startsWith("--") || type === "boolean")
226
+ value = void 0;
227
+ else if (type === "string")
228
+ value ??= "value";
204
229
  const summary = summaries.get(name);
205
230
  out.set(name, {
206
231
  name,
207
232
  ...value ? { value } : {},
208
- // `<folder> | --org <org>`: the option is given instead of the argument, not as well.
209
- required: opened <= 0 && !/(<[^>]+>|"[^"]*")\s*\|\s*$/.test(before),
233
+ required: required.has(name),
210
234
  ...summary ? { summary } : {}
211
235
  });
212
236
  }
@@ -235,13 +259,14 @@ function parseHelp(help) {
235
259
  const written = cut > 0 ? b.line.slice(cut).trim() : b.below ?? "";
236
260
  const summary = written.replace(/(\s*\[[^\]]*--[^\]]*\](\.\.\.)?)+\s*$/, "");
237
261
  const tokens = usage.split(" ").slice(1);
238
- const words = [];
262
+ const named = [];
239
263
  for (const t of tokens) {
240
264
  if (!isWord(t))
241
265
  break;
242
- words.push(t);
266
+ named.push(t);
243
267
  }
244
- const id = words.join(" ");
268
+ const after = tokens[named.length];
269
+ const ways = after && /^[a-z][a-z-]*(\|[a-z][a-z-]*)+$/.test(after) ? after.split("|") : [];
245
270
  const summaries = /* @__PURE__ */ new Map();
246
271
  for (const m of b.more) {
247
272
  const c = m.search(/ {2,}/);
@@ -253,21 +278,24 @@ function parseHelp(help) {
253
278
  }
254
279
  const optionText = [
255
280
  `${usage} `,
256
- written,
281
+ written.slice(summary.length),
257
282
  // Each option line's option part only: its description may hold brackets of its own.
258
283
  ...b.more.map((m) => {
259
284
  const c = m.search(/ {2,}/);
260
285
  return `[${(c > 0 ? m.slice(0, c) : m).replace(/^\[|\]$/g, "")}]`;
261
286
  })
262
287
  ].join(" ");
263
- out.push({
264
- id,
265
- words,
266
- usage,
267
- summary,
268
- args: parseArgs(id, usage.slice(`atticus ${id}`.length)),
269
- flags: parseFlags(optionText, summaries)
270
- });
288
+ const required = requiredFlags(usage);
289
+ const approves = APPROVE_FLAGS.filter((f) => new RegExp(`${f}(?![a-z-])`).test(written));
290
+ const rest = usage.slice(`atticus ${[...named, ...ways.length ? [after] : []].join(" ")}`.length);
291
+ for (const words of ways.length ? ways.map((w) => [...named, w]) : [named]) {
292
+ const id = words.join(" ");
293
+ const flags = parseFlags(optionText, summaries, required, optionsFor(words));
294
+ for (const name of approves)
295
+ if (!flags.some((f) => f.name === name))
296
+ flags.push({ name, required: false });
297
+ out.push({ id, words, usage, summary, args: parseArgs(id, rest), flags });
298
+ }
271
299
  }
272
300
  return out;
273
301
  }
@@ -298,6 +326,7 @@ function commandCatalog(help) {
298
326
 
299
327
  export {
300
328
  AREAS,
329
+ requiredFlags,
301
330
  parseHelp,
302
331
  commandCatalog
303
332
  };