@maycombhq/atticus 2.0.0-beta.26 → 2.0.0-beta.27

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 (325) hide show
  1. package/dist/bin.js +3 -3
  2. package/dist/chunk-22A2K555.js +653 -0
  3. package/dist/{chunk-UTZMF5CV.js → chunk-23TTURB2.js} +1 -1
  4. package/dist/{chunk-XIGVTH24.js → chunk-2666BPJE.js} +19 -19
  5. package/dist/{chunk-KFZ5IXEZ.js → chunk-2ALBHI4Q.js} +28 -27
  6. package/dist/chunk-2ANBMA74.js +107 -0
  7. package/dist/{chunk-UIYPX2BA.js → chunk-2HCW6HXK.js} +27 -26
  8. package/dist/{chunk-DJBXXYYA.js → chunk-2ISR6MWD.js} +15 -15
  9. package/dist/{chunk-ZDA72732.js → chunk-2MRYL45Z.js} +50 -9
  10. package/dist/{chunk-DB3NWAU3.js → chunk-3GNUHLAN.js} +4 -4
  11. package/dist/chunk-3GURU22K.js +44 -0
  12. package/dist/{chunk-UFIQ5FWY.js → chunk-3M3MDBOG.js} +1 -1
  13. package/dist/{chunk-DHQXCP2X.js → chunk-3PBIZBWN.js} +1 -1
  14. package/dist/{chunk-7IWMRZRI.js → chunk-3PWXVBCB.js} +83 -40
  15. package/dist/chunk-3W2QX6TT.js +58 -0
  16. package/dist/{chunk-H7CSCA73.js → chunk-3Z7ATALI.js} +5 -5
  17. package/dist/{chunk-ZGULQAPZ.js → chunk-44SWXDD7.js} +8 -5
  18. package/dist/{chunk-IEIHVMM6.js → chunk-46N5O5H7.js} +5 -5
  19. package/dist/{chunk-4DHYXODN.js → chunk-4D4DNTFE.js} +4 -4
  20. package/dist/{chunk-B3JHERXM.js → chunk-4EAT7HOX.js} +7 -5
  21. package/dist/{chunk-OH2OHNB5.js → chunk-4FLIW5PJ.js} +4 -4
  22. package/dist/{chunk-PGDVJWCI.js → chunk-4LWA5VMJ.js} +52 -37
  23. package/dist/{chunk-YWQZ7CCW.js → chunk-4ODVHNA6.js} +18 -17
  24. package/dist/{chunk-IH6BYFMH.js → chunk-4POSAXNC.js} +6 -6
  25. package/dist/{chunk-D5H3RZNE.js → chunk-4PQ4KDOA.js} +16 -15
  26. package/dist/{chunk-RQM5Y3HJ.js → chunk-4UVTNHA6.js} +1 -1
  27. package/dist/{chunk-KVVNAUIG.js → chunk-4XK3HLOH.js} +1 -0
  28. package/dist/{chunk-ZQGFZJH5.js → chunk-523NRKHF.js} +4 -4
  29. package/dist/{chunk-GJSLO2E2.js → chunk-5GCCG3GJ.js} +11 -5
  30. package/dist/{chunk-VGGSHDQU.js → chunk-5XW6RUDV.js} +8 -8
  31. package/dist/{chunk-K35VNKJH.js → chunk-5YEUAZZE.js} +8 -8
  32. package/dist/{chunk-YEHSJY6B.js → chunk-62LD7CSY.js} +13 -13
  33. package/dist/{chunk-DB6TDJ4T.js → chunk-67Y2J55V.js} +22 -21
  34. package/dist/{chunk-KL7UHAOR.js → chunk-6DSZ4CL7.js} +36 -21
  35. package/dist/{chunk-WM4EMP7T.js → chunk-6G67LSBG.js} +283 -61
  36. package/dist/{chunk-TLBPTUFU.js → chunk-6OEB4FTC.js} +20 -19
  37. package/dist/{chunk-GXJ2PSDW.js → chunk-6OTGCKYH.js} +9 -9
  38. package/dist/{chunk-EQMNMG6X.js → chunk-6XLCMDIP.js} +13 -13
  39. package/dist/chunk-76DZJTU7.js +190 -0
  40. package/dist/chunk-7764GVJK.js +37 -0
  41. package/dist/{chunk-KS2IQYTZ.js → chunk-7BOGXFZ3.js} +11 -11
  42. package/dist/{chunk-ZA2PWNR3.js → chunk-7CVHKNAF.js} +16 -15
  43. package/dist/{chunk-LBBI5P5G.js → chunk-7FEIS3KV.js} +25 -24
  44. package/dist/{chunk-OXCHO2QS.js → chunk-7GXM45T5.js} +26 -23
  45. package/dist/{chunk-YLXPJWNO.js → chunk-7YMAMNMT.js} +17 -16
  46. package/dist/chunk-7YWS47SE.js +56 -0
  47. package/dist/{chunk-LZFKJ2BR.js → chunk-A3LVMCA5.js} +1 -1
  48. package/dist/{chunk-PXDAGXQN.js → chunk-A7ZJKLFC.js} +11 -11
  49. package/dist/chunk-AANQC5QP.js +47 -0
  50. package/dist/{chunk-HV6PXXK7.js → chunk-AIQLTDC3.js} +3 -3
  51. package/dist/{chunk-PFWP624T.js → chunk-AKZTCZ6F.js} +4 -4
  52. package/dist/{chunk-KAWWXCPI.js → chunk-ALCSTVWQ.js} +3 -3
  53. package/dist/{chunk-7ZBYRMWK.js → chunk-ALUHO7SE.js} +26 -25
  54. package/dist/{chunk-3KP7OOJ4.js → chunk-AMZ4XMES.js} +8 -8
  55. package/dist/{chunk-V5ZKGBYL.js → chunk-AOQG37K4.js} +8 -6
  56. package/dist/{chunk-CNT6T2JM.js → chunk-ARXZTHEI.js} +16 -15
  57. package/dist/{chunk-KFJMQUSK.js → chunk-AS4CTARY.js} +16 -15
  58. package/dist/{chunk-MM7JSMLW.js → chunk-AVUPW23W.js} +18 -17
  59. package/dist/{chunk-NQDVD2YR.js → chunk-B56FCIEJ.js} +12 -12
  60. package/dist/{chunk-CPE7HLIK.js → chunk-BABATPOZ.js} +18 -17
  61. package/dist/{chunk-63572EFC.js → chunk-BIOKDLLX.js} +21 -19
  62. package/dist/{chunk-D4TW3PUO.js → chunk-BUBKKEUV.js} +5 -5
  63. package/dist/{chunk-FOOU5OJE.js → chunk-CDC6VECU.js} +3 -3
  64. package/dist/chunk-CHEFUNZ4.js +425 -0
  65. package/dist/{chunk-IL7PVMUO.js → chunk-CIFR3DPV.js} +6 -6
  66. package/dist/{chunk-DS5M2J2H.js → chunk-CLBVKD4P.js} +16 -15
  67. package/dist/{chunk-2FTHLB2H.js → chunk-CLM5Z3R5.js} +5 -5
  68. package/dist/{chunk-CFK6CFXM.js → chunk-CLYV5MB6.js} +9 -9
  69. package/dist/{chunk-KZ4I5M2X.js → chunk-CRYIBCGP.js} +37 -19
  70. package/dist/{chunk-PLSCWC2V.js → chunk-D3L5SO27.js} +5 -5
  71. package/dist/chunk-DAZM2INZ.js +34 -0
  72. package/dist/{chunk-I72PEROE.js → chunk-DF4BXBB2.js} +6 -6
  73. package/dist/{chunk-PZFZPHCT.js → chunk-E7Q52EOO.js} +11 -11
  74. package/dist/{chunk-R2FUFBHW.js → chunk-EFDUC35B.js} +3 -3
  75. package/dist/{chunk-43OWNS5N.js → chunk-EHXEJFHD.js} +5 -5
  76. package/dist/{chunk-HQMLY2R6.js → chunk-ELJ5Q4J2.js} +2 -2
  77. package/dist/{chunk-F4EGHECF.js → chunk-EM6DKBTJ.js} +3 -3
  78. package/dist/{chunk-UZBLVNW6.js → chunk-EMC46SU4.js} +38 -17
  79. package/dist/{chunk-F6GRBF5L.js → chunk-EQEDIWFQ.js} +25 -24
  80. package/dist/chunk-EW574EZI.js +57 -0
  81. package/dist/{chunk-HSJKYDHI.js → chunk-EYINWNXL.js} +5 -5
  82. package/dist/{chunk-KUEG2Y7M.js → chunk-EYVYHYCA.js} +8 -8
  83. package/dist/{chunk-ELR7DEQM.js → chunk-F66542M6.js} +34 -9
  84. package/dist/{chunk-RCLBIJRN.js → chunk-F74OMLNU.js} +6 -6
  85. package/dist/{chunk-PBDIVTFL.js → chunk-FADIWOA5.js} +3 -3
  86. package/dist/{chunk-LHN5UCXD.js → chunk-FC3ZVD3O.js} +3 -3
  87. package/dist/{chunk-DXLWZ3BJ.js → chunk-FG65LXED.js} +8 -8
  88. package/dist/{chunk-V5FT3MZG.js → chunk-FKAUBC4Y.js} +8 -8
  89. package/dist/{chunk-RBO4A7TC.js → chunk-FM3EEDS2.js} +15 -15
  90. package/dist/{chunk-TYN5SG5H.js → chunk-FS4E7F6O.js} +403 -148
  91. package/dist/{chunk-HVWPN2RY.js → chunk-FSYJPYLE.js} +16 -15
  92. package/dist/{chunk-IBIIKUC7.js → chunk-G33UIUG3.js} +46 -20
  93. package/dist/{chunk-4NWE2KY3.js → chunk-G3F4BYML.js} +15 -14
  94. package/dist/{chunk-2GT47PWU.js → chunk-GBJRFFDW.js} +5 -5
  95. package/dist/{chunk-NMURRF5F.js → chunk-GF6GBHFN.js} +13 -11
  96. package/dist/{chunk-C3TBDX7Y.js → chunk-GLHOUT5E.js} +26 -25
  97. package/dist/{chunk-ZWMHL346.js → chunk-GM6GXO2A.js} +20 -19
  98. package/dist/{chunk-MKUBDKE2.js → chunk-GSJ2RXE7.js} +29 -28
  99. package/dist/{chunk-YJBD5NDV.js → chunk-GT72FDER.js} +6 -6
  100. package/dist/{chunk-BEEHCL5O.js → chunk-GW6ZH77P.js} +37 -36
  101. package/dist/{chunk-BABRMZET.js → chunk-GZILYRGC.js} +3 -3
  102. package/dist/{chunk-5JGRF53S.js → chunk-GZSOZYEP.js} +3 -3
  103. package/dist/{chunk-IP6ARMZU.js → chunk-H25QNDKK.js} +58 -36
  104. package/dist/{chunk-BIAQ6NQS.js → chunk-H3RKW4RF.js} +7 -7
  105. package/dist/chunk-H7M7ZH6H.js +52 -0
  106. package/dist/chunk-H7NRWSMP.js +55 -0
  107. package/dist/{chunk-2JT4QV3Q.js → chunk-HDWVR5KD.js} +4 -4
  108. package/dist/{chunk-UAYU6K24.js → chunk-HG24EF5S.js} +16 -15
  109. package/dist/chunk-HPNYSY5M.js +1068 -0
  110. package/dist/{chunk-JJEXMHNZ.js → chunk-HUMM4S5I.js} +6 -6
  111. package/dist/{chunk-DARX3ATP.js → chunk-HVPS2YCW.js} +11 -11
  112. package/dist/{chunk-IGOE6KPG.js → chunk-I34CXV2C.js} +185 -11
  113. package/dist/{chunk-6U65YB54.js → chunk-I57IH5X6.js} +360 -271
  114. package/dist/{chunk-WYO4L4NU.js → chunk-I5X4WU7U.js} +6 -6
  115. package/dist/chunk-IAVVJ34R.js +55 -0
  116. package/dist/chunk-IBJE2E2S.js +51 -0
  117. package/dist/{chunk-HNNMT5L2.js → chunk-IF3X6FMO.js} +1 -1
  118. package/dist/{chunk-CUTMM4NY.js → chunk-IJHJIL6T.js} +154 -25
  119. package/dist/chunk-IM435QAM.js +72 -0
  120. package/dist/{chunk-MQ6HP2TU.js → chunk-IMBJ7WAO.js} +6 -6
  121. package/dist/{chunk-5A4RHEEL.js → chunk-INCFIDCB.js} +2 -2
  122. package/dist/{chunk-RTCZKKG7.js → chunk-IPMPLTEG.js} +3 -3
  123. package/dist/{chunk-QAFQLILX.js → chunk-IPSZDVLI.js} +12 -12
  124. package/dist/{chunk-JLTJAOO4.js → chunk-IX2EOYOU.js} +50 -13
  125. package/dist/{chunk-DOU52XFZ.js → chunk-IXNMGPF7.js} +61 -28
  126. package/dist/{chunk-XT3ZW7C7.js → chunk-J6GO3K7G.js} +19 -18
  127. package/dist/chunk-JBLM6IUA.js +42 -0
  128. package/dist/{chunk-CSHJZFOE.js → chunk-JL2VOYSL.js} +91 -93
  129. package/dist/{chunk-ACY3U2RD.js → chunk-JRXFZB6J.js} +8 -8
  130. package/dist/{chunk-P6EJNPFF.js → chunk-JTOLBS7R.js} +951 -409
  131. package/dist/{chunk-FYCN2Y5P.js → chunk-K73BHPTQ.js} +19 -18
  132. package/dist/{chunk-EVKDWJ5Y.js → chunk-KF7KVUNJ.js} +5 -5
  133. package/dist/{chunk-SRB54QGX.js → chunk-KKUCBKJE.js} +20 -19
  134. package/dist/{chunk-LTOBNBJ6.js → chunk-KLFFHBWG.js} +27 -26
  135. package/dist/{chunk-DXBXZNKV.js → chunk-KMYB2XO7.js} +21 -13
  136. package/dist/chunk-KNYQUWFN.js +52 -0
  137. package/dist/{chunk-6EMJ4XFC.js → chunk-KOAJPMU2.js} +31 -20
  138. package/dist/chunk-KRTSE73S.js +55 -0
  139. package/dist/{chunk-GAJBMPWC.js → chunk-L3AM5YRP.js} +28 -9
  140. package/dist/{chunk-YYV276DM.js → chunk-LCIIFAID.js} +22 -21
  141. package/dist/{chunk-SZDOBIWE.js → chunk-LCQIRCOT.js} +55 -10
  142. package/dist/{chunk-OI32KTDM.js → chunk-LFHBAWIM.js} +13 -13
  143. package/dist/chunk-LIHEMWIT.js +39 -0
  144. package/dist/{chunk-CG6MG7SE.js → chunk-LJLYWILK.js} +14 -14
  145. package/dist/{chunk-6SIGGA37.js → chunk-LNJKDS5C.js} +26 -25
  146. package/dist/{chunk-3GEAUW62.js → chunk-LTHY7E2P.js} +16 -15
  147. package/dist/{chunk-RO6BE7ZS.js → chunk-LTVOQJKT.js} +7 -7
  148. package/dist/{chunk-BD7HBZLP.js → chunk-LZO3JABE.js} +6 -6
  149. package/dist/{chunk-PXMV2LLY.js → chunk-M65AZ4ZE.js} +3 -5
  150. package/dist/chunk-MPNTEWNY.js +492 -0
  151. package/dist/chunk-MQGQ3AWK.js +58 -0
  152. package/dist/{chunk-ZNYSBQIA.js → chunk-MUXYUIBV.js} +6 -6
  153. package/dist/{chunk-CNEOKSTO.js → chunk-MWRRJDXQ.js} +34 -31
  154. package/dist/{chunk-VJO7M34N.js → chunk-MZDHFWTN.js} +2 -2
  155. package/dist/chunk-N2XCT5OX.js +68 -0
  156. package/dist/{chunk-2IO6XH37.js → chunk-N3JGYAMD.js} +15 -15
  157. package/dist/{chunk-K3QKOVZN.js → chunk-N5DLB74D.js} +367 -71
  158. package/dist/{chunk-H5BIVULF.js → chunk-NC3Q7RIB.js} +10 -10
  159. package/dist/{chunk-HVOE7ZW2.js → chunk-NCNLX4DL.js} +19 -18
  160. package/dist/{chunk-3D74UADA.js → chunk-NGSGJLKW.js} +2 -2
  161. package/dist/{chunk-B7KGNEFI.js → chunk-NN7K2LLN.js} +25 -24
  162. package/dist/{chunk-76AHTJVY.js → chunk-NNURP7VO.js} +15 -15
  163. package/dist/chunk-NSQB24WR.js +56 -0
  164. package/dist/{chunk-GFFTVQ7R.js → chunk-NV5S63YK.js} +7 -7
  165. package/dist/{chunk-CTJHEG6A.js → chunk-NWMFVPEP.js} +2 -0
  166. package/dist/{chunk-7JZONWAA.js → chunk-NYT6QGZA.js} +22 -18
  167. package/dist/chunk-OB2DAIJX.js +62 -0
  168. package/dist/{chunk-IZIGZ7KY.js → chunk-OC3OXDTG.js} +13 -8
  169. package/dist/{chunk-2XIIUXGX.js → chunk-OD6RNYMQ.js} +16 -16
  170. package/dist/{chunk-723OQZ3N.js → chunk-OFYBRMRG.js} +6 -6
  171. package/dist/chunk-OGTELPDN.js +43 -0
  172. package/dist/{chunk-E5NHFHGC.js → chunk-OQ7SBQ2Z.js} +7 -7
  173. package/dist/{chunk-6TZ4YRGJ.js → chunk-OUDGBJC2.js} +16 -9
  174. package/dist/{chunk-W4SMKUAK.js → chunk-OUGTAOGA.js} +2 -2
  175. package/dist/chunk-OWP5FCYM.js +60 -0
  176. package/dist/{chunk-ET7SPOBA.js → chunk-P36PTWBM.js} +8 -8
  177. package/dist/{chunk-64LSDT3D.js → chunk-P6Y2J2QY.js} +12 -12
  178. package/dist/{chunk-ANFBBJEV.js → chunk-PDJL2HO5.js} +24 -22
  179. package/dist/{chunk-UXVKFOMC.js → chunk-PPKH6ULR.js} +152 -20
  180. package/dist/{chunk-WLA2JZ2K.js → chunk-Q4PFF2ZE.js} +8 -8
  181. package/dist/chunk-Q7EUPQEG.js +5 -0
  182. package/dist/{chunk-2HDNOUJU.js → chunk-QC6GSNIK.js} +7055 -3456
  183. package/dist/chunk-QCRQNYGI.js +211 -0
  184. package/dist/chunk-QDF533AW.js +90 -0
  185. package/dist/chunk-QDGNDNBG.js +50 -0
  186. package/dist/{chunk-HWPX3T55.js → chunk-QGMD3PYL.js} +31 -24
  187. package/dist/{chunk-VCXFMXMX.js → chunk-QLT3WYTD.js} +6 -6
  188. package/dist/{chunk-ZFLBWL2G.js → chunk-QNDMAKQS.js} +11 -3
  189. package/dist/{chunk-UWBPC5XH.js → chunk-QNXMVJMA.js} +8 -8
  190. package/dist/{chunk-XDLMQL5A.js → chunk-QPAANKUR.js} +7 -7
  191. package/dist/{chunk-BGOAJFPB.js → chunk-QS4VX3HZ.js} +1 -1
  192. package/dist/{chunk-YIOYKA4V.js → chunk-QSM4K6LI.js} +7 -7
  193. package/dist/{chunk-TPKJD42W.js → chunk-QUFZDWPC.js} +8 -8
  194. package/dist/{chunk-QXCGRQGO.js → chunk-QXXEOH3A.js} +18 -6
  195. package/dist/{chunk-QA4O2GGC.js → chunk-R4TUWD4C.js} +17 -1
  196. package/dist/{chunk-UJ5ZJS4B.js → chunk-ROI64BAI.js} +22 -21
  197. package/dist/{chunk-LCRQPWTC.js → chunk-RPVL3RTX.js} +19 -18
  198. package/dist/{chunk-QQAWI5LD.js → chunk-RUNHVUCW.js} +16 -15
  199. package/dist/{chunk-7AEB74KW.js → chunk-RWYPLODE.js} +9 -9
  200. package/dist/{chunk-VTR4AC2U.js → chunk-RZYRUXSU.js} +4 -4
  201. package/dist/{chunk-CWLXVRFH.js → chunk-S6TLXRBR.js} +7 -7
  202. package/dist/{chunk-Z33UNTHI.js → chunk-SCOP3J6X.js} +7 -7
  203. package/dist/{chunk-XEWFVHOT.js → chunk-SCP24MJX.js} +24 -23
  204. package/dist/{chunk-MCORC2LG.js → chunk-SF3HXNXR.js} +6 -6
  205. package/dist/{chunk-BSZII65X.js → chunk-SFCFL7Y5.js} +1 -1
  206. package/dist/{chunk-LY7DOYX2.js → chunk-SHFY73RI.js} +53 -112
  207. package/dist/{chunk-IERXBWQU.js → chunk-SHIARIEZ.js} +20 -19
  208. package/dist/chunk-SMFFUFMN.js +1876 -0
  209. package/dist/{chunk-WH3ZFLXT.js → chunk-SVOGRJO6.js} +197 -124
  210. package/dist/chunk-SVZAAOHJ.js +46 -0
  211. package/dist/{chunk-NCZS2BN2.js → chunk-SZOU32VF.js} +21 -20
  212. package/dist/{chunk-MTIRNHRJ.js → chunk-T2MN24LZ.js} +1 -1
  213. package/dist/{chunk-KZH5YV6J.js → chunk-TD5WWJLN.js} +6 -6
  214. package/dist/{chunk-UBEFT3MQ.js → chunk-TFN2N227.js} +6 -6
  215. package/dist/{chunk-BIKMME4S.js → chunk-TFXNOQEU.js} +28 -27
  216. package/dist/{chunk-6P67IUET.js → chunk-TMETWJFO.js} +11 -11
  217. package/dist/chunk-TNSAIISO.js +50 -0
  218. package/dist/{chunk-SDHGFMES.js → chunk-TRJO2I4S.js} +3 -3
  219. package/dist/{chunk-NVVEVP5O.js → chunk-TRSNIJNM.js} +7 -7
  220. package/dist/{chunk-VIQHZA53.js → chunk-U3Z2QZE3.js} +6 -6
  221. package/dist/{chunk-TQG2DDWH.js → chunk-U7L3ORPK.js} +22 -21
  222. package/dist/{chunk-3KIMLBGZ.js → chunk-UDM6HGF4.js} +6 -6
  223. package/dist/{chunk-NMCPIYTF.js → chunk-UDM7LXNJ.js} +7 -7
  224. package/dist/chunk-UDTO3U6E.js +35 -0
  225. package/dist/{chunk-ZFEOIYK5.js → chunk-UEUPEUZX.js} +3 -3
  226. package/dist/chunk-UWBODTY7.js +514 -0
  227. package/dist/{chunk-BIWNRS5I.js → chunk-UYYYQTPD.js} +78 -47
  228. package/dist/{chunk-IDRCBMJF.js → chunk-V34N6JAN.js} +32 -31
  229. package/dist/{chunk-EY3OVHNC.js → chunk-V3Y5P7OS.js} +24 -23
  230. package/dist/chunk-V6MLVGTP.js +89 -0
  231. package/dist/{chunk-EECFUQP3.js → chunk-VC2XHC7P.js} +184 -46
  232. package/dist/{chunk-H26T2LQL.js → chunk-VCYE4MUD.js} +29 -28
  233. package/dist/{chunk-EUTZTJIO.js → chunk-VN2VJ6BV.js} +19 -15
  234. package/dist/{chunk-P6DM2EFI.js → chunk-VVLWEM2Y.js} +6 -6
  235. package/dist/{chunk-YXKCE5BA.js → chunk-VWCNMDMZ.js} +5 -5
  236. package/dist/{chunk-BV2BZIUF.js → chunk-W2A4NHQD.js} +25 -24
  237. package/dist/{chunk-VPQUFIE7.js → chunk-W6OY2PMB.js} +10 -10
  238. package/dist/{chunk-FIZ5LYL2.js → chunk-WC6DHBVG.js} +16 -15
  239. package/dist/{chunk-GHST3KAB.js → chunk-WCA3WIGG.js} +5 -5
  240. package/dist/{chunk-6ZDAEUKB.js → chunk-WJWSB65O.js} +1602 -452
  241. package/dist/{chunk-IFQJ3YQE.js → chunk-WNPGLGCJ.js} +5 -5
  242. package/dist/chunk-WTOVWEY3.js +67 -0
  243. package/dist/{chunk-XIJBQM45.js → chunk-X5B7KYPD.js} +507 -20
  244. package/dist/{chunk-ZLBUFK7L.js → chunk-X73WLHSN.js} +7 -7
  245. package/dist/{chunk-GNFZ227W.js → chunk-XIIT4PVT.js} +3 -3
  246. package/dist/{chunk-U3JXMY56.js → chunk-XLTT5QCX.js} +28 -25
  247. package/dist/{chunk-5UIGGXA5.js → chunk-XMIS25ZJ.js} +21 -20
  248. package/dist/{chunk-IYEET4VM.js → chunk-XPDQ4T6G.js} +27 -26
  249. package/dist/{chunk-WT6EXYEY.js → chunk-XRWUYOX3.js} +138 -22
  250. package/dist/{chunk-I2EWY3MG.js → chunk-XZY4GTCX.js} +14 -9
  251. package/dist/{chunk-2SCZZQNQ.js → chunk-Y2TVTI4P.js} +121 -15
  252. package/dist/{chunk-Q3RKXK5Z.js → chunk-Y2U4CSCA.js} +28 -27
  253. package/dist/chunk-Y2U63JKE.js +41 -0
  254. package/dist/{chunk-V3M4VFUB.js → chunk-Y6S7VCYN.js} +6 -6
  255. package/dist/{chunk-SAPX3PVK.js → chunk-YAPMGK7E.js} +11 -11
  256. package/dist/{chunk-MY3LDBMR.js → chunk-YAPVAYZN.js} +3 -3
  257. package/dist/{chunk-ZYLGEWTC.js → chunk-YCBDNWX3.js} +78 -57
  258. package/dist/{chunk-RK5P2DWD.js → chunk-YIGSUTW2.js} +1329 -92
  259. package/dist/{chunk-XI3GPYP4.js → chunk-YJTBE6AJ.js} +5 -5
  260. package/dist/chunk-YQ3IXQIH.js +185 -0
  261. package/dist/{chunk-MZXDSAKW.js → chunk-YRHKEXTP.js} +11 -11
  262. package/dist/{chunk-DPH4BS3F.js → chunk-YSSFS3YC.js} +17 -17
  263. package/dist/{chunk-ISCX25D7.js → chunk-YXG2VQJJ.js} +200 -56
  264. package/dist/{chunk-VUSYN4R4.js → chunk-Z4GLFTEH.js} +8 -8
  265. package/dist/{chunk-NP3PG6OI.js → chunk-Z65FWO6A.js} +157 -89
  266. package/dist/{chunk-KJD4DLRZ.js → chunk-ZDG637ZT.js} +22 -21
  267. package/dist/{chunk-DASVVML7.js → chunk-ZIAMPN7N.js} +6 -6
  268. package/dist/chunk-ZIIBQHCX.js +53 -0
  269. package/dist/{chunk-IJN5PSDU.js → chunk-ZJJMYPGZ.js} +57 -27
  270. package/dist/{chunk-NECDBPFP.js → chunk-ZOAX7W5S.js} +11 -11
  271. package/dist/chunk-ZSSR5GGB.js +48 -0
  272. package/dist/files.json +657 -553
  273. package/dist/fixtures/forge/expected/crosscheck.json +726 -0
  274. package/dist/fixtures/forge/slots/README.md +13 -0
  275. package/dist/fixtures/forge/slots/build.json +2686 -0
  276. package/dist/fixtures/forge/slots/crosscheck/forge-ledger.crosscheck.yaml +8 -0
  277. package/dist/fixtures/forge/slots/facts/forge-ledger.jsonl +17 -0
  278. package/dist/fixtures/forge/slots/facts/forge-ledger.meta.json +9 -0
  279. package/dist/fixtures/forge/slots/legacy/joins.json +113 -0
  280. package/dist/fixtures/forge/slots/readers/forge-events.json +306 -0
  281. package/dist/fixtures/forge/slots/readers/forge-gateway.json +238 -0
  282. package/dist/fixtures/forge/slots/readers/forge-infra.json +264 -0
  283. package/dist/fixtures/forge/slots/readers/forge-ledger.json +756 -0
  284. package/dist/fixtures/forge/slots/readers/forge-portal-bff.json +349 -0
  285. package/dist/fixtures/forge/slots/readers/forge-portal-ui.json +214 -0
  286. package/dist/fixtures/forge/slots/readers/forge-reports-job.json +258 -0
  287. package/dist/packages/sdk/npm/index.js +3788 -2939
  288. package/dist/packages/ui/dist/assets/{elk-api-BdXSPeBO.js → elk-api-CPE6PVL8.js} +2 -2
  289. package/dist/packages/ui/dist/assets/index-BYcVqj0l.js +65 -0
  290. package/dist/packages/ui/dist/assets/index-DF52Ejvz.css +1 -0
  291. package/dist/packages/ui/dist/index.html +2 -2
  292. package/package.json +4 -4
  293. package/dist/chunk-24OXGB3P.js +0 -82
  294. package/dist/chunk-3FFIDQQB.js +0 -42
  295. package/dist/chunk-4N5W7LYW.js +0 -41
  296. package/dist/chunk-7NVLGPER.js +0 -45
  297. package/dist/chunk-A6LGX56J.js +0 -52
  298. package/dist/chunk-AHACUPGL.js +0 -46
  299. package/dist/chunk-DG7KYZAL.js +0 -40
  300. package/dist/chunk-DWD6BKHG.js +0 -52
  301. package/dist/chunk-EEVSFGIU.js +0 -50
  302. package/dist/chunk-EN3N6LNU.js +0 -52
  303. package/dist/chunk-FWQDH5NK.js +0 -55
  304. package/dist/chunk-GHCFWIUW.js +0 -38
  305. package/dist/chunk-GSIJWDXH.js +0 -43
  306. package/dist/chunk-HCC5547C.js +0 -232
  307. package/dist/chunk-HLDUWEO7.js +0 -36
  308. package/dist/chunk-K2NQTROJ.js +0 -170
  309. package/dist/chunk-LH4WAJLC.js +0 -45
  310. package/dist/chunk-M5IQUWJR.js +0 -59
  311. package/dist/chunk-MEMEO7YO.js +0 -988
  312. package/dist/chunk-MGNO4Q6V.js +0 -51
  313. package/dist/chunk-MZ6GOFRF.js +0 -55
  314. package/dist/chunk-N2AW2DHF.js +0 -51
  315. package/dist/chunk-N35Y5HZO.js +0 -47
  316. package/dist/chunk-NHFMLMLN.js +0 -257
  317. package/dist/chunk-PR6Z5L7W.js +0 -67
  318. package/dist/chunk-STBJ6SVJ.js +0 -50
  319. package/dist/chunk-U3RGBYXE.js +0 -62
  320. package/dist/chunk-URZKIL37.js +0 -42
  321. package/dist/chunk-W7HNZDHB.js +0 -71
  322. package/dist/chunk-YYZWSVIS.js +0 -33
  323. package/dist/chunk-ZAMSF2DF.js +0 -54
  324. package/dist/packages/ui/dist/assets/index-DRSUhpFi.css +0 -1
  325. package/dist/packages/ui/dist/assets/index-RZe5iotJ.js +0 -63
@@ -10,22 +10,22 @@ import {
10
10
  blockingIssues,
11
11
  readStoreMarker,
12
12
  readStoreVia
13
- } from "./chunk-UTZMF5CV.js";
13
+ } from "./chunk-23TTURB2.js";
14
+ import {
15
+ outsideProfileSystems,
16
+ readCatalog
17
+ } from "./chunk-QC6GSNIK.js";
14
18
  import {
15
19
  AdapterError,
16
20
  mergeBlockers,
17
21
  requireApproval
18
- } from "./chunk-6U65YB54.js";
19
- import {
20
- outsideProfileSystems,
21
- readCatalog
22
- } from "./chunk-2HDNOUJU.js";
22
+ } from "./chunk-I57IH5X6.js";
23
23
  import {
24
24
  baseClonePath,
25
25
  createGit,
26
26
  readChangeRepos,
27
27
  writeChangeRepos
28
- } from "./chunk-XIJBQM45.js";
28
+ } from "./chunk-X5B7KYPD.js";
29
29
  import {
30
30
  ChangeLifecycle,
31
31
  ChangeTouches,
@@ -46,10 +46,10 @@ import {
46
46
  specFlowFiles,
47
47
  taskBranch,
48
48
  toCanonicalYaml
49
- } from "./chunk-6ZDAEUKB.js";
49
+ } from "./chunk-WJWSB65O.js";
50
50
  import {
51
51
  writeFileAtomic
52
- } from "./chunk-MEMEO7YO.js";
52
+ } from "./chunk-SMFFUFMN.js";
53
53
  import {
54
54
  ChangeArtifact,
55
55
  Finding,
@@ -62,7 +62,7 @@ import {
62
62
  fastPathOf,
63
63
  loadOpenSpecSettings,
64
64
  loadOrgPack
65
- } from "./chunk-LZFKJ2BR.js";
65
+ } from "./chunk-A3LVMCA5.js";
66
66
  import {
67
67
  require_dist
68
68
  } from "./chunk-BQGDB6ZL.js";
@@ -1463,8 +1463,46 @@ function testPlanFor(ctx, type, risk) {
1463
1463
  // packages/changes/dist/lifecycle.js
1464
1464
  var import_yaml5 = __toESM(require_dist(), 1);
1465
1465
  import { createHash } from "node:crypto";
1466
- import { readdir as readdir4, readFile as readFile6 } from "node:fs/promises";
1467
- import { join as join7 } from "node:path";
1466
+ import { readdir as readdir5, readFile as readFile7 } from "node:fs/promises";
1467
+ import { join as join8 } from "node:path";
1468
+
1469
+ // packages/changes/dist/planning.js
1470
+ import { copyFile, mkdir, readdir as readdir4, readFile as readFile6 } from "node:fs/promises";
1471
+ import { dirname, join as join7 } from "node:path";
1472
+ var GENERATED_MARK = "<!-- Generated by atticus plan";
1473
+ var PLANNING_FILES = ["stories.md", "tasks.md", "requests.md"];
1474
+ var isGenerated = (text) => text.replace(/^\uFEFF/, "").trimStart().startsWith(GENERATED_MARK);
1475
+ async function personWritten(dir, rels) {
1476
+ const own = [];
1477
+ for (const rel of rels) {
1478
+ const text = await readFile6(join7(dir, ...rel.split("/")), "utf8").catch(() => void 0);
1479
+ if (text !== void 0 && !isGenerated(text))
1480
+ own.push(rel);
1481
+ }
1482
+ return own;
1483
+ }
1484
+ async function keepPersonWritten(dir, rel, stage, files, o = {}) {
1485
+ if (!files.length)
1486
+ return void 0;
1487
+ const base = join7(dir, "stage", `${stage}-by-person`);
1488
+ const taken = (await readdir4(base).catch(() => [])).map((n2) => Number(n2)).filter((n2) => Number.isInteger(n2) && n2 > 0);
1489
+ const n = Math.max(Math.max(0, ...taken) + 1, Math.floor(o.atLeast ?? 1));
1490
+ for (const f of files) {
1491
+ const dest = join7(base, String(n), ...f.split("/"));
1492
+ await mkdir(dirname(dest), { recursive: true });
1493
+ await copyFile(join7(dir, ...f.split("/")), dest).catch((e) => {
1494
+ if (e.code !== "ENOENT")
1495
+ throw e;
1496
+ });
1497
+ }
1498
+ return `${rel}/stage/${stage}-by-person/${n}/`;
1499
+ }
1500
+ var personWrittenPlanning = (dir) => personWritten(dir, PLANNING_FILES);
1501
+ var writesPlanning = (step) => step.artifacts.includes("stories") || step.artifacts.includes("tasks");
1502
+ var stageWorkDone = (state) => state === "done" || state === "person";
1503
+ var stageIdle = (state) => state === "not-started" || state === "skipped";
1504
+
1505
+ // packages/changes/dist/lifecycle.js
1468
1506
  function phaseState(phase) {
1469
1507
  return phase === "release" ? "release-ready" : phase;
1470
1508
  }
@@ -1529,7 +1567,7 @@ async function phaseStage(ctx, change, phase) {
1529
1567
  return void 0;
1530
1568
  const dir = changeFolder(ctx.root, change.id);
1531
1569
  for (const x of ctx.policy.stages)
1532
- if (await readFile6(join7(dir, ...x.loop.split("/"))).then(() => true, () => false))
1570
+ if (await readFile7(join8(dir, ...x.loop.split("/"))).then(() => true, () => false))
1533
1571
  return step;
1534
1572
  return void 0;
1535
1573
  }
@@ -1538,9 +1576,12 @@ async function checkStage(root, change, step) {
1538
1576
  const dir = changeFolder(root, change.id);
1539
1577
  const run = stageCommand(step, change.id);
1540
1578
  const reason = (message) => [{ code: "stage-not-done", message }];
1541
- const text = await readFile6(join7(dir, ...step.loop.split("/")), "utf8").catch(() => void 0);
1542
- if (text === void 0)
1579
+ const text = await readFile7(join8(dir, ...step.loop.split("/")), "utf8").catch(() => void 0);
1580
+ if (text === void 0) {
1581
+ if (writesPlanning(step) && (await personWrittenPlanning(dir)).length)
1582
+ return [];
1543
1583
  return reason(`The ${step.stage} stage hasn't run yet: run ${run}.`);
1584
+ }
1544
1585
  let loop;
1545
1586
  try {
1546
1587
  loop = (0, import_yaml5.parse)(text);
@@ -1572,7 +1613,7 @@ async function checkStage(root, change, step) {
1572
1613
  const out = [];
1573
1614
  const artifactFile = new Set(Object.values(FILE));
1574
1615
  for (const w of step.writes.filter((x) => !x.endsWith("/") && !x.startsWith("stage/") && !isWritePattern(x) && !artifactFile.has(x)))
1575
- if (!await readFile6(join7(dir, ...w.split("/"))).then(() => true, () => false))
1616
+ if (!await readFile7(join8(dir, ...w.split("/"))).then(() => true, () => false))
1576
1617
  out.push(...reason(`${w} is missing, though the ${step.stage} stage is done: run ${run} again.`));
1577
1618
  return out;
1578
1619
  }
@@ -1584,7 +1625,7 @@ async function stageFiles(dir, step) {
1584
1625
  else if (isWritePattern(w)) {
1585
1626
  const parent = w.split("/").slice(0, -1).join("/");
1586
1627
  out.push(...(await walk(dir, parent)).filter((p) => writeMatches(w, p)));
1587
- } else if (await readFile6(join7(dir, ...w.split("/"))).then(() => true, () => false))
1628
+ } else if (await readFile7(join8(dir, ...w.split("/"))).then(() => true, () => false))
1588
1629
  out.push(w);
1589
1630
  }
1590
1631
  return [...new Set(out)].sort();
@@ -1592,7 +1633,7 @@ async function stageFiles(dir, step) {
1592
1633
  async function walk(dir, rel = "") {
1593
1634
  let entries;
1594
1635
  try {
1595
- entries = await readdir4(join7(dir, rel), { withFileTypes: true });
1636
+ entries = await readdir5(join8(dir, rel), { withFileTypes: true });
1596
1637
  } catch {
1597
1638
  return [];
1598
1639
  }
@@ -1615,7 +1656,7 @@ async function artifactFiles(dir, artifact) {
1615
1656
  }
1616
1657
  const f = `${artifact}.md`;
1617
1658
  try {
1618
- await readFile6(join7(dir, f));
1659
+ await readFile7(join8(dir, f));
1619
1660
  return [f];
1620
1661
  } catch {
1621
1662
  return [];
@@ -1634,6 +1675,9 @@ var FILE = {
1634
1675
  tasks: "tasks.md",
1635
1676
  snow: "snow.md"
1636
1677
  };
1678
+ async function artifactWritten(root, change, artifact) {
1679
+ return (await checkArtifacts(root, { id: change }, [artifact])).length === 0;
1680
+ }
1637
1681
  async function checkArtifacts(root, change, artifacts) {
1638
1682
  const dir = changeFolder(root, change.id);
1639
1683
  const reasons = [];
@@ -1645,7 +1689,7 @@ async function checkArtifacts(root, change, artifacts) {
1645
1689
  reasons.push({ code: "missing-artifact", artifact: a, message: `${FILE[a]} is missing.` });
1646
1690
  continue;
1647
1691
  }
1648
- const texts = await Promise.all(files.map((f) => readFile6(join7(dir, f), "utf8")));
1692
+ const texts = await Promise.all(files.map((f) => readFile7(join8(dir, f), "utf8")));
1649
1693
  if (!texts.some(isFilled)) {
1650
1694
  reasons.push({
1651
1695
  code: "unfilled-artifact",
@@ -1659,25 +1703,25 @@ async function checkArtifacts(root, change, artifacts) {
1659
1703
  async function checkFindings(root, change, gates) {
1660
1704
  const reasons = [];
1661
1705
  for (const gate of gates) {
1662
- const base = join7(changeFolder(root, change.id), "review", gate);
1706
+ const base = join8(changeFolder(root, change.id), "review", gate);
1663
1707
  let rounds;
1664
1708
  try {
1665
- rounds = (await readdir4(base, { withFileTypes: true })).filter((d) => d.isDirectory() && /^\d+$/.test(d.name)).map((d) => Number(d.name));
1709
+ rounds = (await readdir5(base, { withFileTypes: true })).filter((d) => d.isDirectory() && /^\d+$/.test(d.name)).map((d) => Number(d.name));
1666
1710
  } catch {
1667
1711
  continue;
1668
1712
  }
1669
1713
  if (rounds.length === 0)
1670
1714
  continue;
1671
1715
  const round2 = Math.max(...rounds);
1672
- const dir = join7(base, String(round2));
1673
- const files = (await readdir4(dir)).filter((f) => /\.ya?ml$/.test(f)).sort();
1716
+ const dir = join8(base, String(round2));
1717
+ const files = (await readdir5(dir)).filter((f) => /\.ya?ml$/.test(f)).sort();
1674
1718
  const unfinished = {
1675
1719
  code: "round-unfinished",
1676
1720
  message: `Critic round ${round2} on the ${gate} gate didn't finish: run atticus critic ${change.id} --gate ${gate} again.`
1677
1721
  };
1678
1722
  let hasMeta = false;
1679
1723
  try {
1680
- const meta = (0, import_yaml5.parse)(await readFile6(join7(dir, "meta", "round.yaml"), "utf8"));
1724
+ const meta = (0, import_yaml5.parse)(await readFile7(join8(dir, "meta", "round.yaml"), "utf8"));
1681
1725
  hasMeta = true;
1682
1726
  if (meta?.state === "in-progress") {
1683
1727
  reasons.push(unfinished);
@@ -1704,7 +1748,7 @@ async function checkFindings(root, change, gates) {
1704
1748
  const rel = `review/${gate}/${round2}/${f}`;
1705
1749
  let data;
1706
1750
  try {
1707
- data = (0, import_yaml5.parse)(await readFile6(join7(dir, f), "utf8"));
1751
+ data = (0, import_yaml5.parse)(await readFile7(join8(dir, f), "utf8"));
1708
1752
  } catch {
1709
1753
  data = void 0;
1710
1754
  }
@@ -1752,7 +1796,7 @@ function mandatoryGates(ctx) {
1752
1796
  async function checkMandatoryRounds(root, change, gates) {
1753
1797
  const reasons = [];
1754
1798
  for (const gate of gates) {
1755
- const rounds = await readdir4(join7(changeFolder(root, change.id), "review", gate), {
1799
+ const rounds = await readdir5(join8(changeFolder(root, change.id), "review", gate), {
1756
1800
  withFileTypes: true
1757
1801
  }).then((ds) => ds.filter((d) => d.isDirectory() && /^\d+$/.test(d.name)), () => []);
1758
1802
  if (rounds.length === 0)
@@ -1780,15 +1824,31 @@ function sha256(text) {
1780
1824
 
1781
1825
  // packages/changes/dist/progress.js
1782
1826
  var import_yaml6 = __toESM(require_dist(), 1);
1783
- import { readFile as readFile7 } from "node:fs/promises";
1784
- import { join as join8 } from "node:path";
1827
+ import { readFile as readFile8 } from "node:fs/promises";
1828
+ import { join as join9 } from "node:path";
1829
+ function phaseIndex(state) {
1830
+ if (state === "draft" || state === "returned")
1831
+ return 0;
1832
+ if (state === "release-ready")
1833
+ return PHASES.indexOf("release");
1834
+ const i = PHASES.indexOf(state);
1835
+ return i >= 0 ? i : PHASES.length;
1836
+ }
1785
1837
  async function stageCompletion(ctx, change) {
1786
1838
  const dir = changeFolder(ctx.root, change.id);
1787
1839
  const out = [];
1788
1840
  for (const s of ctx.policy.stages) {
1789
- const text = await readFile7(join8(dir, ...s.loop.split("/")), "utf8").catch(() => void 0);
1841
+ const text = await readFile8(join9(dir, ...s.loop.split("/")), "utf8").catch(() => void 0);
1790
1842
  let state = "not-started";
1791
- if (text !== void 0) {
1843
+ if (text === void 0) {
1844
+ const own = writesPlanning(s) ? await personWrittenPlanning(dir) : [];
1845
+ if (own.length) {
1846
+ out.push({ stage: s.stage, phase: s.phase, state: "person", files: own });
1847
+ continue;
1848
+ }
1849
+ if (change.state && phaseIndex(change.state) > PHASES.indexOf(s.phase))
1850
+ state = "skipped";
1851
+ } else {
1792
1852
  try {
1793
1853
  const y = (0, import_yaml6.parse)(text);
1794
1854
  state = typeof y?.state === "string" ? y.state : "unknown";
@@ -1803,7 +1863,7 @@ async function stageCompletion(ctx, change) {
1803
1863
  var cap = (s) => s.charAt(0).toUpperCase() + s.slice(1);
1804
1864
  var and = (xs) => xs.length <= 1 ? xs[0] ?? "" : `${xs.slice(0, -1).join(", ")} and ${xs.at(-1)}`;
1805
1865
  function workProgress(type, state, stages, raised = false) {
1806
- if (stages.every((s) => s.state === "not-started"))
1866
+ if (stages.every((s) => stageIdle(s.state)))
1807
1867
  return void 0;
1808
1868
  const phase = state === "returned" ? type.phases[0] : statePhase(state);
1809
1869
  if (!phase)
@@ -1812,21 +1872,22 @@ function workProgress(type, state, stages, raised = false) {
1812
1872
  const own = stages.filter((s) => type.phases.includes(s.phase));
1813
1873
  if (own.length && own.every((s) => type.phases.indexOf(s.phase) < at))
1814
1874
  return void 0;
1815
- const done = own.filter((s) => s.state === "done").map((s) => s.stage);
1816
- const ahead = own.filter((s) => s.state === "done" && type.phases.indexOf(s.phase) > at).map((s) => s.phase);
1875
+ const done = own.filter((s) => stageWorkDone(s.state)).map((s) => s.stage);
1876
+ const ahead = own.filter((s) => stageWorkDone(s.state) && type.phases.indexOf(s.phase) > at).map((s) => s.phase);
1817
1877
  const current = own.find((s) => s.phase === phase);
1818
- const under = own.find((s) => s.state !== "done" && s.state !== "not-started");
1819
- const last = own.filter((s) => s.state === "done").at(-1);
1878
+ const under = own.find((s) => !stageWorkDone(s.state) && !stageIdle(s.state));
1879
+ const last = own.filter((s) => stageWorkDone(s.state)).at(-1);
1880
+ const said = (s) => s.state === "person" ? `${s.stage} (written by a person)` : s.stage;
1820
1881
  const name = handoffName(type, phase);
1821
1882
  let summary;
1822
1883
  if (under)
1823
1884
  summary = `The ${under.stage} stage is ${under.state === "questions" ? "waiting on answers" : under.state}${done.length ? ` (${and(done)} done)` : ""}; the change is in ${state}.`;
1824
- else if (!current || current.state !== "done")
1885
+ else if (!current || !stageWorkDone(current.state))
1825
1886
  summary = `${done.length ? `${cap(and(done))} done; ` : ""}the ${current?.stage ?? phase} stage hasn't run yet; the change is in ${state}.`;
1826
1887
  else if (ahead.length)
1827
- summary = `${cap(last.stage)} done; the change is still in ${state}: ${raised ? "merge" : "raise"} "${name}" (the ${phase} hand-off), then the ${and(ahead)} hand-offs.`;
1888
+ summary = `${cap(said(last))} done; the change is still in ${state}: ${raised ? "merge" : "raise"} "${name}" (the ${phase} hand-off), then the ${and(ahead)} hand-offs.`;
1828
1889
  else
1829
- summary = `${cap(current.stage)} done; waiting on "${name}" (the ${phase} hand-off${raised ? " PR to merge" : ", not raised yet"}).`;
1890
+ summary = `${cap(said(current))} done; waiting on "${name}" (the ${phase} hand-off${raised ? " PR to merge" : ", not raised yet"}).`;
1830
1891
  return { done, ahead, summary };
1831
1892
  }
1832
1893
 
@@ -1847,20 +1908,20 @@ function prApprovers(handoff2, approvers) {
1847
1908
  }
1848
1909
 
1849
1910
  // packages/changes/dist/assess.js
1850
- import { readFile as readFile10 } from "node:fs/promises";
1851
- import { join as join11 } from "node:path";
1911
+ import { readFile as readFile11 } from "node:fs/promises";
1912
+ import { join as join12 } from "node:path";
1852
1913
 
1853
1914
  // packages/changes/dist/release-prs.js
1854
1915
  var import_yaml8 = __toESM(require_dist(), 1);
1855
- import { readFile as readFile9, writeFile } from "node:fs/promises";
1916
+ import { readFile as readFile10, writeFile } from "node:fs/promises";
1856
1917
  import { existsSync as existsSync2 } from "node:fs";
1857
- import { join as join10 } from "node:path";
1918
+ import { join as join11 } from "node:path";
1858
1919
 
1859
1920
  // packages/changes/dist/task-branches.js
1860
1921
  var import_yaml7 = __toESM(require_dist(), 1);
1861
1922
  import { existsSync } from "node:fs";
1862
- import { readdir as readdir5, readFile as readFile8 } from "node:fs/promises";
1863
- import { join as join9 } from "node:path";
1923
+ import { readdir as readdir6, readFile as readFile9 } from "node:fs/promises";
1924
+ import { join as join10 } from "node:path";
1864
1925
  var TASK_DECISION_FILE = "decision.yaml";
1865
1926
  var TaskDecision = external_exports.strictObject({
1866
1927
  schemaVersion: external_exports.literal(1),
@@ -1873,12 +1934,12 @@ var TaskDecision = external_exports.strictObject({
1873
1934
  reason: external_exports.string().min(1)
1874
1935
  });
1875
1936
  async function taskRefs(root, id) {
1876
- const dir = join9(changeFolder(root, id), "tasks");
1937
+ const dir = join10(changeFolder(root, id), "tasks");
1877
1938
  const out = [];
1878
- for (const d of await readdir5(dir, { withFileTypes: true }).catch(() => [])) {
1939
+ for (const d of await readdir6(dir, { withFileTypes: true }).catch(() => [])) {
1879
1940
  if (!d.isDirectory())
1880
1941
  continue;
1881
- const text = await readFile8(join9(dir, d.name, "task-run.yaml"), "utf8").catch(() => void 0);
1942
+ const text = await readFile9(join10(dir, d.name, "task-run.yaml"), "utf8").catch(() => void 0);
1882
1943
  let y;
1883
1944
  try {
1884
1945
  y = text ? (0, import_yaml7.parse)(text) : void 0;
@@ -1906,7 +1967,7 @@ async function taskRefs(root, id) {
1906
1967
  return out;
1907
1968
  }
1908
1969
  function repoDir(root, r) {
1909
- const dirs = [join9(root, r.worktree)];
1970
+ const dirs = [join10(root, r.worktree)];
1910
1971
  try {
1911
1972
  dirs.push(baseClonePath(root, r.id));
1912
1973
  } catch {
@@ -1914,7 +1975,7 @@ function repoDir(root, r) {
1914
1975
  return dirs.find((d) => existsSync(d));
1915
1976
  }
1916
1977
  async function readTaskDecision(root, id, task) {
1917
- const text = await readFile8(join9(changeFolder(root, id), "tasks", task, TASK_DECISION_FILE), "utf8").catch(() => void 0);
1978
+ const text = await readFile9(join10(changeFolder(root, id), "tasks", task, TASK_DECISION_FILE), "utf8").catch(() => void 0);
1918
1979
  if (text === void 0)
1919
1980
  return void 0;
1920
1981
  try {
@@ -2031,7 +2092,7 @@ async function recordTaskDecision(root, id, task, o) {
2031
2092
  at: o.at,
2032
2093
  reason
2033
2094
  });
2034
- await writeFileAtomic(join9(changeFolder(root, id), "tasks", task, TASK_DECISION_FILE), toCanonicalYaml(d, ["schemaVersion", "task", "branch", "commit"]));
2095
+ await writeFileAtomic(join10(changeFolder(root, id), "tasks", task, TASK_DECISION_FILE), toCanonicalYaml(d, ["schemaVersion", "task", "branch", "commit"]));
2035
2096
  return d;
2036
2097
  }
2037
2098
 
@@ -2066,7 +2127,7 @@ var NothingFile = external_exports.strictObject({
2066
2127
  });
2067
2128
  async function readReleaseFile(root, id) {
2068
2129
  const empty = { schemaVersion: 1, nothingToRelease: [] };
2069
- const text = await readFile9(join10(changeFolder(root, id), RELEASE_PRS_FILE), "utf8").catch(() => void 0);
2130
+ const text = await readFile10(join11(changeFolder(root, id), RELEASE_PRS_FILE), "utf8").catch(() => void 0);
2070
2131
  if (text === void 0)
2071
2132
  return empty;
2072
2133
  try {
@@ -2081,14 +2142,14 @@ async function readNothing(root, id) {
2081
2142
  }
2082
2143
  async function writeReleaseFile(root, id, nothing, merged) {
2083
2144
  const byRepo = (xs) => [...xs].sort((a, b) => a.repo < b.repo ? -1 : a.repo > b.repo ? 1 : 0);
2084
- await writeFile(join10(changeFolder(root, id), RELEASE_PRS_FILE), toCanonicalYaml(NothingFile.parse({
2145
+ await writeFile(join11(changeFolder(root, id), RELEASE_PRS_FILE), toCanonicalYaml(NothingFile.parse({
2085
2146
  schemaVersion: 1,
2086
2147
  nothingToRelease: byRepo(nothing),
2087
2148
  ...merged.length ? { merged: byRepo(merged) } : {}
2088
2149
  })), "utf8");
2089
2150
  }
2090
2151
  function repoDir2(root, r) {
2091
- const dirs = [join10(root, r.worktree)];
2152
+ const dirs = [join11(root, r.worktree)];
2092
2153
  try {
2093
2154
  dirs.push(baseClonePath(root, r.id));
2094
2155
  } catch {
@@ -2259,7 +2320,7 @@ async function raiseReleasePrs(root, id, o) {
2259
2320
  continue;
2260
2321
  }
2261
2322
  const notes = movedOn ? [movedOn] : [];
2262
- const dir = join10(root, r.worktree);
2323
+ const dir = join11(root, r.worktree);
2263
2324
  if (existsSync2(dir)) {
2264
2325
  const onHost = await git(["ls-remote", "--heads", remote, `refs/heads/${r.branch}`], dir).then((x) => x.stdout.trim() ? "yes" : "no").catch((e) => {
2265
2326
  notes.push(`Atticus couldn't reach ${remote} (${firstLine(e)}): push ${r.branch} yourself if the host lacks it.`);
@@ -2447,7 +2508,7 @@ function buildOf(pr) {
2447
2508
  return "passed";
2448
2509
  }
2449
2510
  async function requireMergedPrs(root) {
2450
- const text = await readFile9(join10(orgPackDirOf(root), "process", "ci.yaml"), "utf8").catch(() => void 0);
2511
+ const text = await readFile10(join11(orgPackDirOf(root), "process", "ci.yaml"), "utf8").catch(() => void 0);
2451
2512
  if (text === void 0)
2452
2513
  return true;
2453
2514
  try {
@@ -2580,43 +2641,45 @@ async function changeReport(root, id) {
2580
2641
  const ctx = await loadChangeContext(root);
2581
2642
  const a = await assess(ctx, await changeStore(root).read(id));
2582
2643
  const tasks = a.phase === "build" ? await taskTicks(root, id) : void 0;
2583
- return { ...a, nextStep: nextStep(a, tasks), problems: ctx.problems };
2644
+ const next = nextStep(a, tasks);
2645
+ return { ...a, nextStep: next.text, ready: next.ready, problems: ctx.problems };
2584
2646
  }
2585
2647
  async function taskTicks(root, id) {
2586
- const text = await readFile10(join11(changeFolder(root, id), "tasks.md"), "utf8").catch(() => "");
2648
+ const text = await readFile11(join12(changeFolder(root, id), "tasks.md"), "utf8").catch(() => "");
2587
2649
  const boxes = [...text.matchAll(/^\s*[-*]\s+\[([ xX])\]/gm)].map((m) => m[1] !== " ");
2588
2650
  return boxes.length ? { done: boxes.filter(Boolean).length, total: boxes.length } : void 0;
2589
2651
  }
2590
2652
  function nextStep(a, tasks) {
2653
+ const not = (text) => ({ text, ready: false });
2591
2654
  switch (a.state) {
2592
2655
  case "draft":
2593
- return "Create the change with atticus change new.";
2656
+ return not("Create the change with atticus change new.");
2594
2657
  case "archived":
2595
- return "Nothing: the change is archived.";
2658
+ return not("Nothing: the change is archived.");
2596
2659
  case "released":
2597
- return "Archive the change.";
2660
+ return not("Archive the change.");
2598
2661
  case "post-release-review":
2599
- return a.reasons.length ? "Resolve the post-release review findings, then archive the change." : "Review the skipped lenses, then archive the change.";
2662
+ return not(a.reasons.length ? "Resolve the post-release review findings, then archive the change." : "Review the skipped lenses, then archive the change.");
2600
2663
  case "returned":
2601
- return `Revise the work, then hand off ${a.phase} again.`;
2664
+ return not(`Revise the work, then hand off ${a.phase} again.`);
2602
2665
  }
2603
2666
  const name = handoffName(a.type, a.phase);
2604
2667
  if (!a.handoff) {
2605
2668
  if (!a.blockers.length && tasks && tasks.done < tasks.total)
2606
- return `Finish the ${a.phase} work (${tasks.done} of ${tasks.total} tasks ticked in tasks.md), then raise "${name}".`;
2607
- return a.blockers.length ? `Finish the ${a.phase} work, then raise "${name}".` : `Ready to raise "${name}".`;
2669
+ return not(`Finish the ${a.phase} work (${tasks.done} of ${tasks.total} tasks ticked in tasks.md), then raise "${name}".`);
2670
+ return a.blockers.length ? not(`Finish the ${a.phase} work, then raise "${name}".`) : { text: `Ready to raise "${name}".`, ready: true };
2608
2671
  }
2609
2672
  if (a.handoff.state === "changes-requested")
2610
- return `Update the artifacts and hand off again on PR #${a.handoff.pr.number}.`;
2673
+ return not(`Update the artifacts and hand off again on PR #${a.handoff.pr.number}.`);
2611
2674
  if (isManualPrUrl(a.handoff.pr.url))
2612
- return manualHandoffWords(a.handoff.phase);
2613
- return `Merge PR #${a.handoff.pr.number} once it is approved (${a.handoff.pr.url}); syncing then moves the change on.`;
2675
+ return not(manualHandoffWords(a.handoff.phase));
2676
+ return not(`Merge PR #${a.handoff.pr.number} once it is approved (${a.handoff.pr.url}); syncing then moves the change on.`);
2614
2677
  }
2615
2678
 
2616
2679
  // packages/changes/dist/new-change.js
2617
2680
  var import_yaml9 = __toESM(require_dist(), 1);
2618
- import { mkdir, readFile as readFile11, writeFile as writeFile2 } from "node:fs/promises";
2619
- import { join as join12 } from "node:path";
2681
+ import { mkdir as mkdir2, readFile as readFile12, writeFile as writeFile2 } from "node:fs/promises";
2682
+ import { join as join13 } from "node:path";
2620
2683
  var nowIso2 = () => (/* @__PURE__ */ new Date()).toISOString().replace(/\.\d{3}Z$/, "Z");
2621
2684
  var strip2 = (h) => h.startsWith("@") ? h.slice(1) : h;
2622
2685
  function windowsUnsafeName(id) {
@@ -2628,7 +2691,7 @@ function slugify(title) {
2628
2691
  }
2629
2692
  async function exists(path) {
2630
2693
  try {
2631
- await readFile11(path);
2694
+ await readFile12(path);
2632
2695
  return true;
2633
2696
  } catch {
2634
2697
  return false;
@@ -2636,7 +2699,7 @@ async function exists(path) {
2636
2699
  }
2637
2700
  async function defaultSchema(root) {
2638
2701
  try {
2639
- const cfg = (0, import_yaml9.parse)(await readFile11(join12(openspecDirOf(root), "config.yaml"), "utf8"));
2702
+ const cfg = (0, import_yaml9.parse)(await readFile12(join13(openspecDirOf(root), "config.yaml"), "utf8"));
2640
2703
  if (cfg && typeof cfg.schema === "string")
2641
2704
  return cfg.schema;
2642
2705
  } catch {
@@ -2660,17 +2723,17 @@ async function newChange(root, opts) {
2660
2723
  const now = opts.now ?? nowIso2();
2661
2724
  const by = strip2(opts.by);
2662
2725
  const dir = changeFolder(root, id);
2663
- if (opts.openspec && !await exists(join12(dir, ".openspec.yaml"))) {
2726
+ if (opts.openspec && !await exists(join13(dir, ".openspec.yaml"))) {
2664
2727
  await opts.openspec.newChange(id, { description: opts.title });
2665
2728
  } else {
2666
- await mkdir(dir, { recursive: true });
2667
- if (!await exists(join12(dir, ".openspec.yaml")))
2668
- await writeFile2(join12(dir, ".openspec.yaml"), `schema: ${await defaultSchema(root)}
2729
+ await mkdir2(dir, { recursive: true });
2730
+ if (!await exists(join13(dir, ".openspec.yaml")))
2731
+ await writeFile2(join13(dir, ".openspec.yaml"), `schema: ${await defaultSchema(root)}
2669
2732
  created: ${now.slice(0, 10)}
2670
2733
  `, "utf8");
2671
2734
  }
2672
- if (!await exists(join12(dir, "brief.md")))
2673
- await writeFileAtomic(join12(dir, "brief.md"), renderTemplate(template, {
2735
+ if (!await exists(join13(dir, "brief.md")))
2736
+ await writeFileAtomic(join13(dir, "brief.md"), renderTemplate(template, {
2674
2737
  title: opts.title,
2675
2738
  id,
2676
2739
  type: type.id,
@@ -2710,7 +2773,7 @@ created: ${now.slice(0, 10)}
2710
2773
  // packages/changes/dist/publish.js
2711
2774
  import { rm } from "node:fs/promises";
2712
2775
  import { randomUUID } from "node:crypto";
2713
- import { join as join13, resolve } from "node:path";
2776
+ import { join as join14, resolve } from "node:path";
2714
2777
  function gitHandoffPublisher(opts = {}) {
2715
2778
  const remote = opts.remote ?? "origin";
2716
2779
  const env = opts.env ?? process.env;
@@ -2744,7 +2807,7 @@ function gitHandoffPublisher(opts = {}) {
2744
2807
  "--quiet",
2745
2808
  `refs/remotes/${remote}/${base}^{commit}`
2746
2809
  ]) ?? await out(["rev-parse", "--verify", `refs/heads/${base}^{commit}`]);
2747
- const index = join13(gitDir, `atticus-handoff-index-${process.pid}-${randomUUID()}`);
2810
+ const index = join14(gitDir, `atticus-handoff-index-${process.pid}-${randomUUID()}`);
2748
2811
  const staged = createGit({ env: { ...env, GIT_INDEX_FILE: index } });
2749
2812
  try {
2750
2813
  await staged(["read-tree", start], root);
@@ -2799,13 +2862,13 @@ async function keepLocalBranch(out, tryOut, branch, start, commit) {
2799
2862
  }
2800
2863
 
2801
2864
  // packages/changes/dist/handoff.js
2802
- import { readdir as readdir7, readFile as readFile13 } from "node:fs/promises";
2803
- import { join as join15 } from "node:path";
2865
+ import { readdir as readdir8, readFile as readFile14 } from "node:fs/promises";
2866
+ import { join as join16 } from "node:path";
2804
2867
 
2805
2868
  // packages/changes/dist/drafted.js
2806
2869
  var import_yaml10 = __toESM(require_dist(), 1);
2807
- import { mkdir as mkdir2, readdir as readdir6, readFile as readFile12, rm as rm2 } from "node:fs/promises";
2808
- import { dirname, join as join14, relative, sep } from "node:path";
2870
+ import { mkdir as mkdir3, readdir as readdir7, readFile as readFile13, rm as rm2 } from "node:fs/promises";
2871
+ import { dirname as dirname2, join as join15, relative, sep } from "node:path";
2809
2872
  var CAPTURE_SCHEMA_VERSION = 1;
2810
2873
  var DraftCapture = external_exports.object({
2811
2874
  schemaVersion: external_exports.literal(CAPTURE_SCHEMA_VERSION),
@@ -2880,7 +2943,7 @@ var sameText = (text, recorded) => sha256(text) === recorded || sha256(text.repl
2880
2943
  async function walk2(dir, rel = "") {
2881
2944
  let entries;
2882
2945
  try {
2883
- entries = await readdir6(join14(dir, rel), { withFileTypes: true });
2946
+ entries = await readdir7(join15(dir, rel), { withFileTypes: true });
2884
2947
  } catch {
2885
2948
  return [];
2886
2949
  }
@@ -3025,7 +3088,7 @@ async function captureHandoff(input) {
3025
3088
  } else {
3026
3089
  const texts = await Promise.all(recorded.map(async (r) => [
3027
3090
  r,
3028
- await readFile12(join14(folder, ...r.path.split("/")), "utf8").catch(() => void 0)
3091
+ await readFile13(join15(folder, ...r.path.split("/")), "utf8").catch(() => void 0)
3029
3092
  ]));
3030
3093
  if (texts.every(([r, t]) => t !== void 0 && sameText(t, r.sha256))) {
3031
3094
  from = "working-tree";
@@ -3089,11 +3152,11 @@ async function captureHandoff(input) {
3089
3152
  } : {}
3090
3153
  };
3091
3154
  const p = capturePaths(name);
3092
- await rm2(join14(folder, ...p.drafted.split("/")), { recursive: true, force: true });
3093
- await rm2(join14(folder, ...p.merged.split("/")), { recursive: true, force: true });
3155
+ await rm2(join15(folder, ...p.drafted.split("/")), { recursive: true, force: true });
3156
+ await rm2(join15(folder, ...p.merged.split("/")), { recursive: true, force: true });
3094
3157
  const put = async (base, rel, text) => {
3095
- const f = join14(folder, ...base.split("/"), ...rel.split("/"));
3096
- await mkdir2(dirname(f), { recursive: true });
3158
+ const f = join15(folder, ...base.split("/"), ...rel.split("/"));
3159
+ await mkdir3(dirname2(f), { recursive: true });
3097
3160
  await writeFileAtomic(f, text);
3098
3161
  };
3099
3162
  for (const [rel, t] of draftedFiles)
@@ -3101,37 +3164,37 @@ async function captureHandoff(input) {
3101
3164
  if (state === "captured")
3102
3165
  for (const [rel, t] of mergedFiles)
3103
3166
  await put(p.merged, rel, t);
3104
- await mkdir2(join14(folder, "stage"), { recursive: true });
3105
- await writeFileAtomic(join14(folder, ...p.capture.split("/")), HEADER + (0, import_yaml10.stringify)(capture, { lineWidth: 0 }));
3167
+ await mkdir3(join15(folder, "stage"), { recursive: true });
3168
+ await writeFileAtomic(join15(folder, ...p.capture.split("/")), HEADER + (0, import_yaml10.stringify)(capture, { lineWidth: 0 }));
3106
3169
  return { capture, file: p.capture };
3107
3170
  }
3108
3171
  async function readFolderFiles(dir) {
3109
3172
  const out = /* @__PURE__ */ new Map();
3110
3173
  for (const f of await walk2(dir))
3111
- out.set(f, (await readFile12(join14(dir, ...f.split("/")), "utf8")).replace(/\r\n/g, "\n"));
3174
+ out.set(f, (await readFile13(join15(dir, ...f.split("/")), "utf8")).replace(/\r\n/g, "\n"));
3112
3175
  return out;
3113
3176
  }
3114
3177
  async function changeFolders(root) {
3115
- const base = join14(root, ...changesRelOf(root).split("/"));
3178
+ const base = join15(root, ...changesRelOf(root).split("/"));
3116
3179
  const out = [];
3117
- const list = async (dir) => (await readdir6(dir, { withFileTypes: true }).catch(() => [])).filter((e) => e.isDirectory()).map((e) => e.name).sort();
3180
+ const list = async (dir) => (await readdir7(dir, { withFileTypes: true }).catch(() => [])).filter((e) => e.isDirectory()).map((e) => e.name).sort();
3118
3181
  for (const name of await list(base)) {
3119
3182
  if (name === "archive")
3120
- for (const a of await list(join14(base, "archive")))
3121
- out.push(join14(base, "archive", a));
3183
+ for (const a of await list(join15(base, "archive")))
3184
+ out.push(join15(base, "archive", a));
3122
3185
  else
3123
- out.push(join14(base, name));
3186
+ out.push(join15(base, name));
3124
3187
  }
3125
3188
  return out;
3126
3189
  }
3127
3190
  async function readDraftPairs(root) {
3128
3191
  const out = [];
3129
3192
  for (const folder of await changeFolders(root)) {
3130
- const names = (await readdir6(join14(folder, "stage")).catch(() => [])).filter((f) => f.endsWith(".capture.yaml")).sort();
3193
+ const names = (await readdir7(join15(folder, "stage")).catch(() => [])).filter((f) => f.endsWith(".capture.yaml")).sort();
3131
3194
  for (const f of names) {
3132
3195
  let capture;
3133
3196
  try {
3134
- capture = DraftCapture.parse((0, import_yaml10.parse)(await readFile12(join14(folder, "stage", f), "utf8")));
3197
+ capture = DraftCapture.parse((0, import_yaml10.parse)(await readFile13(join15(folder, "stage", f), "utf8")));
3135
3198
  } catch {
3136
3199
  continue;
3137
3200
  }
@@ -3139,8 +3202,8 @@ async function readDraftPairs(root) {
3139
3202
  out.push({
3140
3203
  capture,
3141
3204
  folder: relative(root, folder).split(sep).join("/"),
3142
- drafted: await readFolderFiles(join14(folder, ...p.drafted.split("/"))),
3143
- merged: await readFolderFiles(join14(folder, ...p.merged.split("/")))
3205
+ drafted: await readFolderFiles(join15(folder, ...p.drafted.split("/"))),
3206
+ merged: await readFolderFiles(join15(folder, ...p.merged.split("/")))
3144
3207
  });
3145
3208
  }
3146
3209
  }
@@ -3160,8 +3223,8 @@ async function completeCaptures(root, ctx, o) {
3160
3223
  continue;
3161
3224
  for (const h of change.handoffs.filter((x) => x.state === "merged")) {
3162
3225
  const { name } = await captureStageOf(ctx, change, h.phase);
3163
- const file = join14(changeFolder(root, change.id), ...capturePaths(name).capture.split("/"));
3164
- const prior = await readFile12(file, "utf8").then((t) => DraftCapture.safeParse((0, import_yaml10.parse)(t)), () => void 0);
3226
+ const file = join15(changeFolder(root, change.id), ...capturePaths(name).capture.split("/"));
3227
+ const prior = await readFile13(file, "utf8").then((t) => DraftCapture.safeParse((0, import_yaml10.parse)(t)), () => void 0);
3165
3228
  if (prior?.success && prior.data.pr.number === h.pr.number && prior.data.state !== "waiting-for-merge")
3166
3229
  continue;
3167
3230
  const base = prior?.success ? prior.data.base : o.defaultBase ?? "main";
@@ -3202,16 +3265,16 @@ async function load(root, id) {
3202
3265
  }
3203
3266
  async function walkReview(dir, gate) {
3204
3267
  const out = [];
3205
- const base = join15(dir, "review", gate);
3268
+ const base = join16(dir, "review", gate);
3206
3269
  let rounds;
3207
3270
  try {
3208
- rounds = (await readdir7(base)).filter((r) => /^\d+$/.test(r)).sort((a, b) => Number(a) - Number(b));
3271
+ rounds = (await readdir8(base)).filter((r) => /^\d+$/.test(r)).sort((a, b) => Number(a) - Number(b));
3209
3272
  } catch {
3210
3273
  return [];
3211
3274
  }
3212
3275
  for (const r of rounds) {
3213
3276
  try {
3214
- for (const f of (await readdir7(join15(base, r))).filter((x) => /\.ya?ml$/.test(x)).sort())
3277
+ for (const f of (await readdir8(join16(base, r))).filter((x) => /\.ya?ml$/.test(x)).sort())
3215
3278
  out.push(`review/${gate}/${r}/${f}`);
3216
3279
  } catch {
3217
3280
  }
@@ -3222,12 +3285,12 @@ async function keptPairFiles(dir) {
3222
3285
  const out = [];
3223
3286
  let entries;
3224
3287
  try {
3225
- entries = await readdir7(join15(dir, "stage"), { withFileTypes: true });
3288
+ entries = await readdir8(join16(dir, "stage"), { withFileTypes: true });
3226
3289
  } catch {
3227
3290
  return out;
3228
3291
  }
3229
3292
  const walk3 = async (rel) => {
3230
- for (const e of await readdir7(join15(dir, ...rel.split("/")), { withFileTypes: true }).catch(() => [])) {
3293
+ for (const e of await readdir8(join16(dir, ...rel.split("/")), { withFileTypes: true }).catch(() => [])) {
3231
3294
  const p = `${rel}/${e.name}`;
3232
3295
  if (e.isDirectory())
3233
3296
  await walk3(p);
@@ -3261,7 +3324,7 @@ async function handoffFiles(ctx, a, phase) {
3261
3324
  for (const f of await stageFiles(dir, step))
3262
3325
  files.add(f);
3263
3326
  }
3264
- const present = async (f) => readFile13(join15(dir, ...f.split("/"))).then(() => true, () => false);
3327
+ const present = async (f) => readFile14(join16(dir, ...f.split("/"))).then(() => true, () => false);
3265
3328
  for (const own of [
3266
3329
  "stage/corrections.yaml",
3267
3330
  "stage/drafted.yaml",
@@ -3274,7 +3337,7 @@ async function handoffFiles(ctx, a, phase) {
3274
3337
  for (const extra of ["tasks.md", "repos.yaml"])
3275
3338
  if (await present(extra))
3276
3339
  files.add(extra);
3277
- for (const t of await readdir7(join15(dir, "tasks"), { withFileTypes: true }).catch(() => []))
3340
+ for (const t of await readdir8(join16(dir, "tasks"), { withFileTypes: true }).catch(() => []))
3278
3341
  if (t.isDirectory() && await present(`tasks/${t.name}/report.md`))
3279
3342
  files.add(`tasks/${t.name}/report.md`);
3280
3343
  }
@@ -3348,7 +3411,7 @@ async function handoff(root, id, opts) {
3348
3411
  await requireValid(opts.openspec, id);
3349
3412
  const { files, artifacts } = await handoffFiles(ctx, a, phase);
3350
3413
  const dir = changeFolder(root, id);
3351
- const hashed = await Promise.all(files.map(async (path) => ({ path, sha256: sha256(await readFile13(join15(dir, path))) })));
3414
+ const hashed = await Promise.all(files.map(async (path) => ({ path, sha256: sha256(await readFile14(join16(dir, path))) })));
3352
3415
  const authors = { ...change.authors };
3353
3416
  for (const art of artifacts) {
3354
3417
  const people = (opts.authors?.[art] ?? [by]).map(strip3);
@@ -3711,8 +3774,8 @@ async function archiveChange(root, id, opts) {
3711
3774
 
3712
3775
  // packages/changes/dist/learn.js
3713
3776
  var import_yaml11 = __toESM(require_dist(), 1);
3714
- import { readFile as readFile14 } from "node:fs/promises";
3715
- import { join as join16 } from "node:path";
3777
+ import { readFile as readFile15 } from "node:fs/promises";
3778
+ import { join as join17 } from "node:path";
3716
3779
  var LEARN_SCHEMA_VERSION = 1;
3717
3780
  var MAX_CELLS = 4e6;
3718
3781
  var lines = (text) => {
@@ -4101,7 +4164,7 @@ async function pairTouches(root, p) {
4101
4164
  flows.push(m[1]);
4102
4165
  }
4103
4166
  }
4104
- const change = yaml(await readFile14(join16(root, ...p.folder.split("/"), "change.yaml"), "utf8").catch(() => ""));
4167
+ const change = yaml(await readFile15(join17(root, ...p.folder.split("/"), "change.yaml"), "utf8").catch(() => ""));
4105
4168
  const touches = change?.touches ?? {};
4106
4169
  for (const r of Array.isArray(touches.repos) ? touches.repos : [])
4107
4170
  if (typeof r === "string")
@@ -4194,8 +4257,8 @@ async function detectConflicts(root) {
4194
4257
  }
4195
4258
 
4196
4259
  // packages/changes/dist/size.js
4197
- import { readFile as readFile15 } from "node:fs/promises";
4198
- import { join as join17 } from "node:path";
4260
+ import { readFile as readFile16 } from "node:fs/promises";
4261
+ import { join as join18 } from "node:path";
4199
4262
  async function changeSize(ctx, change) {
4200
4263
  const type = ctx.orgPack.changeTypes.types.find((t) => t.id === change.type);
4201
4264
  if (!type)
@@ -4204,7 +4267,7 @@ async function changeSize(ctx, change) {
4204
4267
  why: "standard",
4205
4268
  words: `${change.type} isn't a change type in change-types.yaml, so ${change.id} takes the full path.`
4206
4269
  };
4207
- const brief = await readFile15(join17(changeFolder(ctx.root, change.id), "brief.md"), "utf8").catch(() => "");
4270
+ const brief = await readFile16(join18(changeFolder(ctx.root, change.id), "brief.md"), "utf8").catch(() => "");
4208
4271
  const f = fastPathOf(type, brief);
4209
4272
  const gate = f.fast ? fastGateOf(type, ctx.orgPack.gates) : void 0;
4210
4273
  const words = {
@@ -4219,12 +4282,12 @@ async function changeSize(ctx, change) {
4219
4282
 
4220
4283
  // packages/changes/dist/openspec-stores.js
4221
4284
  import { existsSync as existsSync3 } from "node:fs";
4222
- import { readFile as readFile16, writeFile as writeFile3 } from "node:fs/promises";
4285
+ import { readFile as readFile17, writeFile as writeFile3 } from "node:fs/promises";
4223
4286
  import { homedir } from "node:os";
4224
- import { basename, isAbsolute, join as join18, relative as relative2, resolve as resolve2, sep as sep2 } from "node:path";
4287
+ import { basename, isAbsolute, join as join19, relative as relative2, resolve as resolve2, sep as sep2 } from "node:path";
4225
4288
  function storeDirOf(root, path) {
4226
4289
  if (path === "~" || path.startsWith("~/") || path.startsWith("~\\"))
4227
- return join18(homedir(), path.slice(2));
4290
+ return join19(homedir(), path.slice(2));
4228
4291
  return isAbsolute(path) ? resolve2(path) : resolve2(root, path);
4229
4292
  }
4230
4293
  function packRel(root) {
@@ -4254,7 +4317,7 @@ async function storeSpecLookup(root, capability) {
4254
4317
  var REMOTE = /^[a-z][a-z0-9+.-]*:\/\//i;
4255
4318
  var SCP = /^[^/\\]+@[^:/\\]+:/;
4256
4319
  async function metarepoOrigin(root, git = createGit()) {
4257
- if (!existsSync3(join18(root, ".git")))
4320
+ if (!existsSync3(join19(root, ".git")))
4258
4321
  return void 0;
4259
4322
  try {
4260
4323
  const url = (await git(["remote", "get-url", "origin"], root)).stdout.trim();
@@ -4277,8 +4340,8 @@ async function referenceMetarepoIn(root, repoDir3, o = {}) {
4277
4340
  file,
4278
4341
  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("; ")})`
4279
4342
  };
4280
- const path = join18(repoDir3, "openspec", "config.yaml");
4281
- const text = await readFile16(path, "utf8").catch(() => void 0);
4343
+ const path = join19(repoDir3, "openspec", "config.yaml");
4344
+ const text = await readFile17(path, "utf8").catch(() => void 0);
4282
4345
  if (text === void 0)
4283
4346
  return {
4284
4347
  action: "skipped",
@@ -4529,6 +4592,15 @@ export {
4529
4592
  scoreRisk,
4530
4593
  testsFor,
4531
4594
  testPlanFor,
4595
+ GENERATED_MARK,
4596
+ PLANNING_FILES,
4597
+ isGenerated,
4598
+ personWritten,
4599
+ keepPersonWritten,
4600
+ personWrittenPlanning,
4601
+ writesPlanning,
4602
+ stageWorkDone,
4603
+ stageIdle,
4532
4604
  phaseState,
4533
4605
  statePhase,
4534
4606
  nextState,
@@ -4541,6 +4613,7 @@ export {
4541
4613
  checkStage,
4542
4614
  stageFiles,
4543
4615
  artifactFiles,
4616
+ artifactWritten,
4544
4617
  checkArtifacts,
4545
4618
  checkFindings,
4546
4619
  mandatoryGates,