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

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 (273) hide show
  1. package/dist/bin.js +8 -4
  2. package/dist/chunk-265LWMOA.js +91 -0
  3. package/dist/chunk-26WBY34Y.js +37 -0
  4. package/dist/{chunk-UBBC2XSG.js → chunk-26Z7OGQW.js} +518 -93
  5. package/dist/chunk-2D7PWSOK.js +172 -0
  6. package/dist/{chunk-JCZIKA4C.js → chunk-2HH3UCZM.js} +4 -4
  7. package/dist/{chunk-GDLULHTC.js → chunk-2HTEMYTB.js} +12 -26
  8. package/dist/chunk-2UCRFXFZ.js +130 -0
  9. package/dist/{chunk-MVZVGYXH.js → chunk-2V2ZPQQU.js} +81 -13
  10. package/dist/{chunk-BOHJZTEQ.js → chunk-36RY7ZXM.js} +130 -71
  11. package/dist/{chunk-I3E7CX4H.js → chunk-37WE3LS2.js} +3 -3
  12. package/dist/{chunk-IPKHE5D6.js → chunk-3AQ2R5NL.js} +1520 -871
  13. package/dist/chunk-3G6S7LAA.js +43 -0
  14. package/dist/chunk-3J5I7ZOU.js +58 -0
  15. package/dist/{chunk-65NYPGRC.js → chunk-3LZ6P5EP.js} +1 -1
  16. package/dist/chunk-3SSTNB4E.js +191 -0
  17. package/dist/chunk-3TD6S4TC.js +49 -0
  18. package/dist/{chunk-3C7EYRFZ.js → chunk-3UTYPHN3.js} +1 -1
  19. package/dist/{chunk-G2B4ZQGH.js → chunk-3WON4G3M.js} +2 -2
  20. package/dist/{chunk-S3QNRWYR.js → chunk-42EPP7OB.js} +12 -12
  21. package/dist/chunk-455SYIIE.js +113 -0
  22. package/dist/{chunk-YISXLPHN.js → chunk-4B6BT75O.js} +166 -23
  23. package/dist/{chunk-C6EKFH7J.js → chunk-4CLK2RJO.js} +7 -7
  24. package/dist/chunk-4CYTJ5TZ.js +38 -0
  25. package/dist/{chunk-EYWIDJFU.js → chunk-4D62IZII.js} +5 -5
  26. package/dist/chunk-4FOAYLI4.js +328 -0
  27. package/dist/{chunk-7JUKDRSZ.js → chunk-4KNOJC6J.js} +294 -215
  28. package/dist/{chunk-YMZ3TNYB.js → chunk-4PYC2UGC.js} +2 -2
  29. package/dist/{chunk-27NKUS3X.js → chunk-4SLBCEPD.js} +2104 -726
  30. package/dist/chunk-4TKVU2I2.js +122 -0
  31. package/dist/{chunk-RUVFXE2L.js → chunk-4WXRPQDE.js} +448 -47
  32. package/dist/{chunk-7ZUIMTOU.js → chunk-5CMPVC3N.js} +24 -24
  33. package/dist/chunk-5G7ILBUG.js +66 -0
  34. package/dist/{chunk-HFQCFSJR.js → chunk-5PV7S2ZP.js} +3 -3
  35. package/dist/{chunk-FITWGOJ2.js → chunk-5QUOPNLN.js} +4 -4
  36. package/dist/{chunk-Z6LF7HQN.js → chunk-5TDRBOAV.js} +5 -5
  37. package/dist/{chunk-T6AIP7H5.js → chunk-5WERBKLE.js} +199 -63
  38. package/dist/{chunk-XPCM366L.js → chunk-62DLJSLV.js} +8 -8
  39. package/dist/{chunk-L24C55VN.js → chunk-64AADMTW.js} +99 -25
  40. package/dist/{chunk-K65BJIMT.js → chunk-67BP7HXL.js} +17 -17
  41. package/dist/chunk-6DQYZU2W.js +379 -0
  42. package/dist/{chunk-EDS2L2LD.js → chunk-6EXDI5GI.js} +52 -26
  43. package/dist/chunk-6FNAKCET.js +38 -0
  44. package/dist/{chunk-6IU67AEK.js → chunk-75ASLHBT.js} +21 -15
  45. package/dist/{chunk-A3GY6SOA.js → chunk-75ZOZFGH.js} +18 -18
  46. package/dist/{chunk-MGYZM27B.js → chunk-77O633L5.js} +49 -23
  47. package/dist/{chunk-GQ4N4WKF.js → chunk-7AB6OWTV.js} +3 -3
  48. package/dist/{chunk-M766ZJ6W.js → chunk-7CZHUZBL.js} +25 -25
  49. package/dist/{chunk-A7UPUQFY.js → chunk-7FHNFCHK.js} +643 -124
  50. package/dist/chunk-7FUIVIBG.js +415 -0
  51. package/dist/{chunk-6QSERWXH.js → chunk-7QPCGTPS.js} +21 -21
  52. package/dist/{chunk-LR3R6Z2A.js → chunk-A2G72UI4.js} +7 -7
  53. package/dist/{chunk-I4JRCD6M.js → chunk-AE4P57KK.js} +23 -17
  54. package/dist/{chunk-AVJDSJ2F.js → chunk-AHW3RY3X.js} +7 -7
  55. package/dist/chunk-AM6FP6JW.js +43 -0
  56. package/dist/{chunk-CSZ4C5N6.js → chunk-AOCWFA7T.js} +93 -10
  57. package/dist/{chunk-EPTBZ3GP.js → chunk-API5TOUB.js} +1 -1
  58. package/dist/{chunk-652QWTLZ.js → chunk-AZDITBCT.js} +3 -3
  59. package/dist/{chunk-DPUYDDQG.js → chunk-BA2HUMDN.js} +25 -3
  60. package/dist/chunk-BA3U7ALS.js +99 -0
  61. package/dist/{chunk-HVUPKCGJ.js → chunk-BC6KKZ67.js} +5 -5
  62. package/dist/{chunk-CKSITVS4.js → chunk-BEPCKDCP.js} +2554 -722
  63. package/dist/{chunk-3ALD2W2A.js → chunk-BPPU3PW7.js} +4 -4
  64. package/dist/{chunk-QRAOANID.js → chunk-BVWWPBKD.js} +21 -21
  65. package/dist/{chunk-ZDPAS56H.js → chunk-BXBCMGIQ.js} +7 -1
  66. package/dist/chunk-BXZ4PKIT.js +233 -0
  67. package/dist/chunk-C7CEK3KW.js +247 -0
  68. package/dist/chunk-CFH3QH26.js +29 -0
  69. package/dist/chunk-CG6CULP6.js +170 -0
  70. package/dist/chunk-CLD4RVTA.js +45 -0
  71. package/dist/{chunk-DKJA76CJ.js → chunk-CNPY4NTZ.js} +13 -13
  72. package/dist/chunk-CNU5Q2D5.js +575 -0
  73. package/dist/{chunk-T2UYZSCQ.js → chunk-COYN3UAN.js} +126 -23
  74. package/dist/{chunk-23W7VWKR.js → chunk-CPK7QSBG.js} +1360 -113
  75. package/dist/{chunk-4AK7IBVP.js → chunk-D2WSW4GU.js} +1 -1
  76. package/dist/{chunk-ABWHYWNI.js → chunk-D57MFJPP.js} +3 -3
  77. package/dist/chunk-D5KV5PSK.js +45 -0
  78. package/dist/chunk-D5MASS4I.js +48 -0
  79. package/dist/{chunk-7EOBHUMC.js → chunk-DCWN3HFV.js} +2 -2
  80. package/dist/{chunk-QSXK2RGH.js → chunk-DDJPM5YX.js} +2 -2
  81. package/dist/chunk-DN4A2Q2O.js +57 -0
  82. package/dist/{chunk-IHMLFRVV.js → chunk-DUPZPDCJ.js} +58 -16
  83. package/dist/{chunk-PRPPGYZG.js → chunk-E2VXBSIR.js} +4 -4
  84. package/dist/chunk-E57AOFYN.js +32 -0
  85. package/dist/{chunk-UGLN7QHV.js → chunk-ECLXZWAG.js} +12 -12
  86. package/dist/{chunk-5WG5YP4T.js → chunk-EDZ45WIR.js} +14 -14
  87. package/dist/chunk-EFCQSMXB.js +37 -0
  88. package/dist/{chunk-2ANOROX3.js → chunk-EZIN5E5B.js} +8 -8
  89. package/dist/{chunk-BWZ77RQT.js → chunk-F6H2RJ3N.js} +1 -1
  90. package/dist/{chunk-OLQJTJJU.js → chunk-FAJDKNSD.js} +7 -3
  91. package/dist/chunk-FGAGWYZB.js +47 -0
  92. package/dist/{chunk-4WBVUHXN.js → chunk-FLVZFTLQ.js} +18 -18
  93. package/dist/chunk-FQ6WH6PB.js +140 -0
  94. package/dist/{chunk-T6XQL73F.js → chunk-FRHD22WM.js} +61 -23
  95. package/dist/{chunk-XAKWMCXI.js → chunk-FVMPFCDS.js} +4 -4
  96. package/dist/{chunk-B2WLAWNJ.js → chunk-FY3QIRTL.js} +3 -3
  97. package/dist/{chunk-CPA6HPVR.js → chunk-FYBF5MB2.js} +15 -11
  98. package/dist/{chunk-V2YTAIQO.js → chunk-G5YJBNDZ.js} +21 -6
  99. package/dist/chunk-G6IQYM25.js +339 -0
  100. package/dist/chunk-G6X4YL4D.js +161 -0
  101. package/dist/{chunk-SJRGMG6A.js → chunk-GC2VK3JT.js} +25 -25
  102. package/dist/{chunk-SP2I63OO.js → chunk-GCS3FZOB.js} +77 -3
  103. package/dist/{chunk-6TACQN3N.js → chunk-GDZB57IU.js} +5 -5
  104. package/dist/chunk-GIFMBCTW.js +221 -0
  105. package/dist/{chunk-YY6ZQQBP.js → chunk-GK4PYVEC.js} +18 -8
  106. package/dist/{chunk-TDD55CJH.js → chunk-GNWAOVFQ.js} +6 -5
  107. package/dist/chunk-GS76RXQE.js +226 -0
  108. package/dist/{chunk-YYQN46FY.js → chunk-GSGIZ2OO.js} +23 -23
  109. package/dist/chunk-GUYL7RMK.js +60 -0
  110. package/dist/chunk-GX74YWR7.js +321 -0
  111. package/dist/chunk-HE3HRDNZ.js +122 -0
  112. package/dist/{chunk-AIOQPLA5.js → chunk-HGHRSF3E.js} +30 -12
  113. package/dist/{chunk-2RMYG36Q.js → chunk-HK3VOHIE.js} +198 -336
  114. package/dist/{chunk-QZSX3F7C.js → chunk-HS4BGB4G.js} +24 -22
  115. package/dist/{chunk-XY3P7JW7.js → chunk-HSZMPH5T.js} +834 -149
  116. package/dist/{chunk-L6SGQIR3.js → chunk-HWD4JPU7.js} +4 -2
  117. package/dist/{chunk-PCVDV3UZ.js → chunk-HXXP2NTE.js} +6 -6
  118. package/dist/{chunk-AA6YULYB.js → chunk-I2A3Z5AK.js} +7 -7
  119. package/dist/{chunk-N7IXEHK3.js → chunk-ICHDSWEY.js} +7 -7
  120. package/dist/chunk-IFFRGC3N.js +31 -0
  121. package/dist/{chunk-4BN53TG3.js → chunk-IFHDV6KQ.js} +31 -23
  122. package/dist/chunk-J2O4LFVI.js +80 -0
  123. package/dist/chunk-J5AAZ6OJ.js +161 -0
  124. package/dist/{chunk-ZMFPW66A.js → chunk-JAABT3DA.js} +3 -3
  125. package/dist/chunk-JITJP64K.js +34 -0
  126. package/dist/chunk-JKIGL3XQ.js +162 -0
  127. package/dist/chunk-JRVNXLZP.js +615 -0
  128. package/dist/chunk-JRXHON4E.js +41 -0
  129. package/dist/{chunk-DHPACDG7.js → chunk-JS6WMC3J.js} +8 -8
  130. package/dist/chunk-JU4QNJSR.js +62 -0
  131. package/dist/{chunk-PAMPPUR6.js → chunk-JYMIB5XY.js} +1697 -172
  132. package/dist/{chunk-RRTKKSLQ.js → chunk-JYTIHTIK.js} +8 -6
  133. package/dist/{chunk-3HI6Z55Y.js → chunk-K332XW7K.js} +324 -39
  134. package/dist/{chunk-GLUX4EEP.js → chunk-K6JB6XTX.js} +9 -9
  135. package/dist/chunk-KDAHXQIE.js +294 -0
  136. package/dist/chunk-KYZMRSPS.js +93 -0
  137. package/dist/chunk-L4CESDPB.js +22 -0
  138. package/dist/{chunk-NXFPS2LR.js → chunk-LEBR5NHW.js} +14 -14
  139. package/dist/chunk-LIJJCBQI.js +223 -0
  140. package/dist/{chunk-DE76JROX.js → chunk-LIRVU3HW.js} +16 -16
  141. package/dist/{chunk-JMSCMUCA.js → chunk-LN77DXBM.js} +145 -21
  142. package/dist/{chunk-JIITQXFB.js → chunk-LNWEWYCM.js} +2969 -788
  143. package/dist/{chunk-TANFV3MZ.js → chunk-LO3BLMVG.js} +3 -3
  144. package/dist/chunk-LPV6T362.js +250 -0
  145. package/dist/{chunk-2VHF7OXM.js → chunk-LQH4P45K.js} +1 -1
  146. package/dist/chunk-LU4MQVAL.js +41 -0
  147. package/dist/chunk-LWDNKE4X.js +273 -0
  148. package/dist/chunk-M4H2UG4R.js +218 -0
  149. package/dist/{chunk-6BVONWJ7.js → chunk-M6D2U3YM.js} +3 -3
  150. package/dist/chunk-MD7KUEJ3.js +514 -0
  151. package/dist/{chunk-66YVAGGM.js → chunk-MMZUN7ZO.js} +20 -20
  152. package/dist/chunk-MZGRDONP.js +916 -0
  153. package/dist/chunk-N3RUGTGV.js +39 -0
  154. package/dist/{chunk-JGZCG5VM.js → chunk-NCB6656Z.js} +7 -7
  155. package/dist/{chunk-4NDAAFQT.js → chunk-NRQ65LTQ.js} +7 -5
  156. package/dist/{chunk-UNM6ZOKP.js → chunk-NTAVOWYD.js} +145 -18
  157. package/dist/{chunk-3USYZGRF.js → chunk-NYOABJNK.js} +36 -27
  158. package/dist/{chunk-WVPJSRRJ.js → chunk-O4IKAIZ2.js} +24 -20
  159. package/dist/{chunk-D3PO4DOZ.js → chunk-ODMBPDDV.js} +51 -14
  160. package/dist/chunk-OKUB6RJA.js +533 -0
  161. package/dist/chunk-OMPENNWY.js +39 -0
  162. package/dist/chunk-OPQZISG3.js +25 -0
  163. package/dist/{chunk-5GGOLAKC.js → chunk-OV57AHCG.js} +26 -26
  164. package/dist/chunk-OZJ3JLYI.js +58 -0
  165. package/dist/{chunk-KEM4SDDP.js → chunk-P2VBXX7N.js} +11 -10
  166. package/dist/{chunk-S2A7YC3Q.js → chunk-PAINMSID.js} +10150 -1720
  167. package/dist/chunk-PKJAV25S.js +43 -0
  168. package/dist/{chunk-EBEW3XXQ.js → chunk-PNQLCRSS.js} +4 -4
  169. package/dist/{chunk-WY6PP6AA.js → chunk-PQH56YF6.js} +37 -5
  170. package/dist/chunk-PRTBPXYA.js +50 -0
  171. package/dist/{chunk-YEDDOYSC.js → chunk-PRW3HXM3.js} +2 -2
  172. package/dist/chunk-PRZ7KMWL.js +42 -0
  173. package/dist/{chunk-6M5NK3K3.js → chunk-PTQ3ZALZ.js} +42 -4
  174. package/dist/{chunk-5GDRCDQB.js → chunk-PUEWDYGP.js} +2 -2
  175. package/dist/chunk-Q26LDIUV.js +236 -0
  176. package/dist/{chunk-CR3MTH32.js → chunk-Q46QDDMF.js} +77 -7
  177. package/dist/chunk-QBNWF5ZU.js +19 -0
  178. package/dist/chunk-QE527XRY.js +342 -0
  179. package/dist/{chunk-CNUKCS2T.js → chunk-QHJJMZLX.js} +1518 -54
  180. package/dist/chunk-QJCJOMW3.js +425 -0
  181. package/dist/{chunk-VYDBJ73M.js → chunk-QKMRFNMA.js} +15 -15
  182. package/dist/chunk-QOOEYDNJ.js +317 -0
  183. package/dist/chunk-QSIDVFB7.js +45 -0
  184. package/dist/{chunk-R77KLRB3.js → chunk-RA33EYS4.js} +19 -18
  185. package/dist/{chunk-DFBCSHVT.js → chunk-RALY3E5U.js} +4 -4
  186. package/dist/{chunk-ZCJDOK2S.js → chunk-S2RY3BOD.js} +35 -21
  187. package/dist/chunk-S5LSDXV4.js +40 -0
  188. package/dist/chunk-SB5GRUFM.js +54 -0
  189. package/dist/chunk-SH27FYPF.js +150 -0
  190. package/dist/chunk-T74WQQGS.js +40 -0
  191. package/dist/{chunk-O3WI5KWW.js → chunk-TGVVUKTG.js} +2 -2
  192. package/dist/chunk-THN26IEF.js +48 -0
  193. package/dist/chunk-TJH2EUAZ.js +47 -0
  194. package/dist/{chunk-ZNCEKR4J.js → chunk-TQ4TG57V.js} +12 -8
  195. package/dist/{chunk-7FBGJFEE.js → chunk-TQTRWENN.js} +12 -12
  196. package/dist/{chunk-TYAID7B7.js → chunk-TSM6T6GQ.js} +23 -23
  197. package/dist/{chunk-DPZHZQKE.js → chunk-TW3KOSQK.js} +43 -10
  198. package/dist/{chunk-MC3H7736.js → chunk-TWQRPM76.js} +37 -4
  199. package/dist/chunk-TYD6I4CZ.js +109 -0
  200. package/dist/chunk-U3NBK4EU.js +420 -0
  201. package/dist/{chunk-6JCPI55B.js → chunk-UDXWIPCB.js} +47 -7
  202. package/dist/{chunk-MMOSZPWJ.js → chunk-UEVZZZU2.js} +4 -4
  203. package/dist/{chunk-JBTK5OP2.js → chunk-UF4UHCIG.js} +2 -2
  204. package/dist/{chunk-6JUBZBMW.js → chunk-UFE36WJH.js} +4 -4
  205. package/dist/{chunk-ONLS5QA5.js → chunk-URIKUID7.js} +12 -12
  206. package/dist/chunk-UYLBRRFK.js +1106 -0
  207. package/dist/chunk-UZACEG2C.js +515 -0
  208. package/dist/{chunk-7SW2QWLU.js → chunk-VAMHOHUU.js} +12 -12
  209. package/dist/{chunk-RZPYKDWS.js → chunk-VUVGX5L2.js} +1 -1
  210. package/dist/{chunk-Q4D5X7QB.js → chunk-VYOCPTUB.js} +44 -24
  211. package/dist/{chunk-CAQZUNOH.js → chunk-WAZEXEJH.js} +567 -3
  212. package/dist/chunk-WCEF7H6L.js +221 -0
  213. package/dist/{chunk-2DIQQJCB.js → chunk-WEOMJHPV.js} +12 -12
  214. package/dist/{chunk-FHH4I4ZV.js → chunk-WFU77T3A.js} +12 -6
  215. package/dist/chunk-WIWTJMMR.js +292 -0
  216. package/dist/{chunk-2BFCZ3RK.js → chunk-WNTIOBOG.js} +18 -18
  217. package/dist/{chunk-7WD63HU2.js → chunk-X2CUXTWU.js} +6 -6
  218. package/dist/chunk-X7EMBM5X.js +34 -0
  219. package/dist/chunk-XEQCQO66.js +33 -0
  220. package/dist/{chunk-F7HYOUFF.js → chunk-XG4WJHLQ.js} +20 -4
  221. package/dist/{chunk-EFHQ3TWP.js → chunk-XOL3GFW2.js} +171 -31
  222. package/dist/{chunk-NE2W3OO7.js → chunk-XQ3YZ4QW.js} +22 -22
  223. package/dist/{chunk-CEXSU4S6.js → chunk-Y6K3CJBU.js} +723 -85
  224. package/dist/{chunk-4RS5KZQD.js → chunk-YAH5IQAL.js} +5 -5
  225. package/dist/{chunk-64EQYWCA.js → chunk-YBOVNMHC.js} +51 -14
  226. package/dist/chunk-YF5DZCPN.js +1212 -0
  227. package/dist/chunk-YIGBJNH4.js +37 -0
  228. package/dist/{chunk-BKVWTZ6A.js → chunk-YJ3TBOTK.js} +25 -25
  229. package/dist/{chunk-Q5AMFEWD.js → chunk-YKTE2RU3.js} +2 -2
  230. package/dist/{chunk-7EKXJZ2Y.js → chunk-YO2PKTXT.js} +296 -37
  231. package/dist/{chunk-6J5OKA4Y.js → chunk-YTTNTQOX.js} +15 -15
  232. package/dist/{chunk-OT2O76OS.js → chunk-YWAKDNMH.js} +183 -33
  233. package/dist/{chunk-R6XF6UR3.js → chunk-YZDZOEV4.js} +4 -4
  234. package/dist/chunk-Z3QFH7YG.js +17 -0
  235. package/dist/{chunk-W5BVQF44.js → chunk-Z6VLC5X4.js} +17 -17
  236. package/dist/{chunk-HLJAXMM4.js → chunk-ZFQMMU5Y.js} +2 -2
  237. package/dist/{chunk-W3BQAZ3Q.js → chunk-ZKYRDV7A.js} +12 -12
  238. package/dist/{chunk-ZMAINWBW.js → chunk-ZLS6PU2O.js} +3 -3
  239. package/dist/{chunk-ZVM6AKKM.js → chunk-ZOSD4FXV.js} +3 -3
  240. package/dist/chunk-ZPDDEVQX.js +47 -0
  241. package/dist/{chunk-TXLH6WHQ.js → chunk-ZQLRCA2V.js} +11 -11
  242. package/dist/{chunk-HITVBIJS.js → chunk-ZX7235KR.js} +128 -54
  243. package/dist/{chunk-GT4I4ZWM.js → chunk-ZZFHLRQW.js} +18 -16
  244. package/dist/files.json +636 -364
  245. package/dist/packages/naysayer/constitution/constitution.yaml +19 -0
  246. package/dist/packages/sdk/npm/index.js +5614 -2343
  247. package/dist/packages/ui/dist/assets/{elk-api-tma0MCuh.js → elk-api-CowTnhEJ.js} +2 -2
  248. package/dist/packages/ui/dist/assets/index-Dw20IRhQ.css +1 -0
  249. package/dist/packages/ui/dist/assets/index-z2wv0d5d.js +47 -0
  250. package/dist/packages/ui/dist/index.html +2 -2
  251. package/package.json +4 -4
  252. package/dist/chunk-2BF2EYJV.js +0 -174
  253. package/dist/chunk-42EVSKME.js +0 -37
  254. package/dist/chunk-4BKGMUIK.js +0 -53
  255. package/dist/chunk-5KLGBXG5.js +0 -48
  256. package/dist/chunk-6BNC6EQ4.js +0 -41
  257. package/dist/chunk-6D2CQ5II.js +0 -41
  258. package/dist/chunk-7AVHLZGD.js +0 -45
  259. package/dist/chunk-D46WUV3T.js +0 -33
  260. package/dist/chunk-E36QOJMD.js +0 -47
  261. package/dist/chunk-FQXYPF7E.js +0 -147
  262. package/dist/chunk-GBRFVT63.js +0 -45
  263. package/dist/chunk-ICY36XCH.js +0 -34
  264. package/dist/chunk-J4K3KVLD.js +0 -131
  265. package/dist/chunk-JZU3H6UQ.js +0 -54
  266. package/dist/chunk-NN2ZQEB4.js +0 -38
  267. package/dist/chunk-PCOCACY3.js +0 -385
  268. package/dist/chunk-RTEYOSJY.js +0 -29
  269. package/dist/chunk-RVH5SUW5.js +0 -69
  270. package/dist/chunk-VN3DP4LQ.js +0 -43
  271. package/dist/chunk-XPTOBS2D.js +0 -48
  272. package/dist/packages/ui/dist/assets/index-B54fm9FQ.js +0 -29
  273. package/dist/packages/ui/dist/assets/index-DD_hufQz.css +0 -1
@@ -4,61 +4,108 @@ var require = __atticusCreateRequire(import.meta.url);
4
4
  var __atticusUrl = (p) => new URL("./" + p, import.meta.url).href;
5
5
  var __atticusPath = (p) => __atticusFileURLToPath(__atticusUrl(p));
6
6
  import {
7
+ onboardingQueue,
8
+ queueWhy,
9
+ reasonOf
10
+ } from "./chunk-HE3HRDNZ.js";
11
+ import {
12
+ onboardingView
13
+ } from "./chunk-PNQLCRSS.js";
14
+ import {
15
+ houseUntaughtOf,
16
+ houseUntaughtWords
17
+ } from "./chunk-3J5I7ZOU.js";
18
+ import {
19
+ repoIdKey
20
+ } from "./chunk-OMPENNWY.js";
21
+ import {
22
+ catalogSources
23
+ } from "./chunk-4FOAYLI4.js";
24
+ import {
25
+ readTaskRun
26
+ } from "./chunk-Y6K3CJBU.js";
27
+ import {
28
+ rulesLackingAll
29
+ } from "./chunk-GIFMBCTW.js";
30
+ import {
31
+ loadReadPlan,
7
32
  partOfWords,
33
+ readCostOf,
34
+ readCostWords,
8
35
  readPlanProgress,
9
- readPlanRelOf
10
- } from "./chunk-FQXYPF7E.js";
36
+ readPlanRelOf,
37
+ tokensWords
38
+ } from "./chunk-MD7KUEJ3.js";
11
39
  import {
12
- onboardingView
13
- } from "./chunk-EBEW3XXQ.js";
40
+ checkoutOf,
41
+ conventionsAt
42
+ } from "./chunk-Q46QDDMF.js";
43
+ import {
44
+ readChangeTasks
45
+ } from "./chunk-YWAKDNMH.js";
14
46
  import {
15
47
  isMetarepo,
16
48
  notMetarepo
17
49
  } from "./chunk-3G4YI4ZU.js";
18
- import {
19
- readChangeTasks
20
- } from "./chunk-OT2O76OS.js";
21
50
  import {
22
51
  ASSISTANT_FORMATS,
23
52
  probedAssistant,
24
53
  readProbes,
25
54
  whatRunsWhere
26
- } from "./chunk-IPKHE5D6.js";
55
+ } from "./chunk-3AQ2R5NL.js";
27
56
  import {
28
- metarepoOpenSpec,
29
- openspecProgress,
30
- readNeeds
31
- } from "./chunk-CKSITVS4.js";
57
+ readNeeds,
58
+ seedCollisions
59
+ } from "./chunk-BEPCKDCP.js";
32
60
  import {
33
61
  readChangeFiles
34
- } from "./chunk-3HI6Z55Y.js";
62
+ } from "./chunk-K332XW7K.js";
35
63
  import {
64
+ assess,
36
65
  changeStore,
66
+ isManualPrUrl,
67
+ liveHandoff,
68
+ loadChangeContext,
37
69
  loadChangePolicy,
70
+ releasePrReasons,
38
71
  stageCompletion
39
- } from "./chunk-XY3P7JW7.js";
72
+ } from "./chunk-HSZMPH5T.js";
73
+ import {
74
+ readCatalog
75
+ } from "./chunk-4SLBCEPD.js";
40
76
  import {
41
77
  readKnowledge,
42
78
  snapshotDates,
43
79
  workingDays
44
- } from "./chunk-L24C55VN.js";
80
+ } from "./chunk-64AADMTW.js";
81
+ import {
82
+ baseClonePath
83
+ } from "./chunk-XOL3GFW2.js";
45
84
  import {
46
85
  stepClassOfNextStep
47
- } from "./chunk-CNUKCS2T.js";
86
+ } from "./chunk-QHJJMZLX.js";
48
87
  import {
49
88
  ScanVerifyProposal,
89
+ catalogDirOf,
50
90
  changesDirOf,
91
+ changesRelOf,
51
92
  factsDirOf,
93
+ factsFileOf,
94
+ factsRelOf,
52
95
  fastPathOf,
96
+ headFromFiles,
97
+ isAdopted,
53
98
  listQuestions,
54
99
  loadOrgPack,
100
+ orderQuestions,
55
101
  orgPackDirOf,
56
102
  proposalsDirOf,
103
+ questionWeights,
57
104
  readRepoSpec,
58
105
  readSpecFindings,
59
106
  require_dist,
60
107
  stepModelsOf
61
- } from "./chunk-S2A7YC3Q.js";
108
+ } from "./chunk-PAINMSID.js";
62
109
  import {
63
110
  __toESM
64
111
  } from "./chunk-TV45EUGM.js";
@@ -71,10 +118,6 @@ import { join } from "node:path";
71
118
  var METAREPO = "metarepo";
72
119
  var DRAFTING = ["feature", "architecture", "stories"];
73
120
  var draftingAt = (s) => DRAFTING.indexOf(s);
74
- var canMoveOn = (state) => {
75
- const at = draftingAt(stageOf(state));
76
- return at >= 0 && at < DRAFTING.length - 1;
77
- };
78
121
  var STALE_DAYS = 14;
79
122
  var plural = (n, one, many = `${one}s`) => `${n} ${n === 1 ? one : many}`;
80
123
  async function verifyState(root, repo) {
@@ -90,15 +133,46 @@ async function verifyState(root, repo) {
90
133
  return "accept";
91
134
  return "done";
92
135
  }
136
+ async function staleOf(root, repo) {
137
+ const text = await readFile(join(factsDirOf(root), `${repo}.verify.yaml`), "utf8").catch(() => void 0);
138
+ let facts;
139
+ try {
140
+ const c = (0, import_yaml.parse)(text ?? "")?.commit;
141
+ if (typeof c === "string" && /^[0-9a-f]{7,64}$/.test(c))
142
+ facts = c;
143
+ } catch {
144
+ return void 0;
145
+ }
146
+ if (!facts)
147
+ return void 0;
148
+ let dir;
149
+ try {
150
+ dir = isAdopted(root) ? root : baseClonePath(root, repo);
151
+ } catch {
152
+ return void 0;
153
+ }
154
+ const head = await headFromFiles(dir);
155
+ if (!head || head.startsWith(facts) || facts.startsWith(head))
156
+ return void 0;
157
+ return { facts, head };
158
+ }
93
159
  async function readNextState(root) {
94
160
  const view = await onboardingView(root);
95
161
  const problems = [...view.problems];
96
162
  const repos = [];
163
+ const factIds = (await readdir(factsDirOf(root)).catch(() => [])).map((n) => factsFileOf(n)).flatMap((f) => f?.facts ? [f.repo] : []);
164
+ const fromFacts = catalogSources((await readCatalog(join(catalogDirOf(root), "generated"), { cacheRoot: root })).records);
97
165
  for (const r of view.repos) {
166
+ const hasFacts = existsSync(join(factsDirOf(root), `${r.id}.jsonl`));
167
+ const near = hasFacts ? [] : factIds.filter((x) => x !== r.id && repoIdKey(x) === repoIdKey(r.id)).sort().map((x) => ({ id: x, file: `${factsRelOf(root)}/${x}.jsonl` }));
98
168
  const spec = await readRepoSpec(root, r.id, { cacheRoot: root });
99
169
  problems.push(...spec.problems);
100
170
  const findings = await readSpecFindings(root, r.id);
101
171
  const plan = await readPlanProgress(root, r.id);
172
+ const planFile = await loadReadPlan(root, r.id);
173
+ const mapped = !!spec.header?.template.startsWith("facts@") || (fromFacts.get(r.id)?.facts ?? 0) > 0;
174
+ const stale = mapped && hasFacts ? await staleOf(root, r.id) : void 0;
175
+ const rules = hasFacts && r.cloned && !await staleOf(root, r.id) ? await rulesLackingAll(root, r.id, planFile?.rules) : [];
102
176
  repos.push({
103
177
  id: r.id,
104
178
  cloned: r.cloned,
@@ -109,8 +183,12 @@ async function readNextState(root) {
109
183
  checked: !!findings && findings.draftedAt === spec.header?.drafted?.at,
110
184
  findings: findings?.findings.filter((f) => !f.question).length ?? 0,
111
185
  described: !r.description ? "none" : r.description.trust === "suggested" ? "draft" : "said",
112
- ...spec.header?.template.startsWith("facts@") ? { facts: true } : {},
113
- ...existsSync(join(factsDirOf(root), `${r.id}.jsonl`)) ? { read: true } : {},
186
+ ...mapped ? { facts: true } : {},
187
+ ...stale ? { stale } : {},
188
+ ...rules.length ? { rules } : {},
189
+ ...planFile ? { cost: readCostOf(planFile) } : {},
190
+ ...hasFacts ? { read: true } : {},
191
+ ...near.length ? { nearFacts: near } : {},
114
192
  ...plan ? {
115
193
  readPlan: {
116
194
  total: plan.total,
@@ -121,10 +199,30 @@ async function readNextState(root) {
121
199
  } : {}
122
200
  });
123
201
  }
202
+ const waiting = repos.filter((r) => r.cloned && !r.facts && !r.scanned);
203
+ if (waiting.length) {
204
+ const q = await onboardingQueue(root, waiting.map((r) => ({
205
+ repo: r.id,
206
+ ...r.read || (r.readPlan?.done ?? 0) > 0 ? { started: true } : {}
207
+ })));
208
+ problems.push(...q.problems);
209
+ q.queue.forEach((x, order) => {
210
+ const r = repos.find((y) => y.id === x.repo);
211
+ r.queue = { order, reason: reasonOf(x), why: queueWhy(x) };
212
+ });
213
+ const first = waiting.filter((r) => !r.read).sort((a, b) => (a.queue?.order ?? Infinity) - (b.queue?.order ?? Infinity))[0];
214
+ const dir = first ? await checkoutOf(root, first.id) : void 0;
215
+ if (first && dir && (await conventionsAt(root)).housePrefixes.length) {
216
+ const found = await houseUntaughtOf(root, first.id, { dir }).catch(() => []);
217
+ if (found.length)
218
+ first.houseUntaught = found;
219
+ }
220
+ }
124
221
  const open = await listQuestions(root, { state: "open" });
125
222
  problems.push(...open.problems);
126
223
  const changeIds = new Set(await changeStore(root).list().then((cs) => cs.map((c) => c.id), () => []));
127
224
  const changeQuestions = {};
225
+ const openIds = new Set(open.questions.map((q) => q.id));
128
226
  for (const q of open.questions)
129
227
  if (changeIds.has(q.repo))
130
228
  (changeQuestions[q.repo] ??= []).push(q.id);
@@ -164,9 +262,12 @@ async function readNextState(root) {
164
262
  let active;
165
263
  const types = orgPack instanceof Error ? [] : orgPack.changeTypes.types;
166
264
  const { policy } = await loadChangePolicy(orgPackDirOf(root));
167
- const os = metarepoOpenSpec(root);
265
+ const clashes = await seedCollisions(root).catch(() => []);
266
+ let ctxP;
267
+ const changeContext = () => ctxP ??= loadChangeContext(root);
168
268
  try {
169
269
  for (const c of await changeStore(root).list()) {
270
+ const clash = clashes.filter((x) => x.change === c.id).map(({ seed, repo, capability, flow }) => ({ seed, repo, capability, flow }));
170
271
  const files = await readChangeFiles(join(changesDirOf(root), c.id)).catch(() => void 0);
171
272
  const stagesDone = (await stageCompletion({ root, policy }, c)).filter((s) => s.state === "done").map((s) => s.stage);
172
273
  const needs = await readNeeds(root, c.id);
@@ -180,17 +281,41 @@ async function readNextState(root) {
180
281
  // The lead time as the knowledge scan read it (ADR 0117); a need with none sorts last.
181
282
  days: n.leadTimeDays ? workingDays(n.leadTimeDays) : 0
182
283
  })).sort((a, b) => b.days - a.days)[0];
183
- const progress = os && canMoveOn(c.state) ? await openspecProgress(os, c.id).catch(() => void 0) : void 0;
284
+ const own = stageOf(c.state);
285
+ const loop = draftingAt(own) >= 0 ? await loopState(root, c.id, own) : void 0;
286
+ const live = c.state === "returned" ? void 0 : liveHandoff(c);
184
287
  const busy = await stageInProgress(root, c.id);
288
+ const asked = await stageQuestions(root, c.id, openIds);
289
+ const questions = [.../* @__PURE__ */ new Set([...changeQuestions[c.id] ?? [], ...asked])];
290
+ const missing = c.state === "define" || c.state === "returned" ? await draftMissing(changeContext, c).catch(() => ({ draft: false, brief: false })) : { draft: false, brief: false };
291
+ const blocking = stageOf(c.state) === "tasks" ? await blockingOf(changeContext, c).catch(() => 0) : 0;
185
292
  if (busy && stageOf(c.state) !== "done" && (!active || busy > active.at))
186
293
  active = { id: c.id, at: busy };
187
294
  changes.push({
188
295
  id: c.id,
189
296
  state: c.state,
190
- tasks: files ? readChangeTasks(files).map((t) => ({ id: t.id, repo: t.repo, done: t.done })) : [],
297
+ tasks: files ? await Promise.all(readChangeTasks(files).map(async (t) => {
298
+ const run = t.done ? void 0 : (await readTaskRun(root, c.id, t.id).catch(() => void 0))?.state;
299
+ return { id: t.id, repo: t.repo, done: t.done, ...run ? { run } : {} };
300
+ })) : [],
191
301
  feature: existsSync(join(changesDirOf(root), c.id, "feature.yaml")),
302
+ ...missing.draft ? { undrafted: true } : {},
303
+ ...blocking ? { blocking } : {},
304
+ ...stageOf(c.state) === "release" ? await releasePrsOf(root, c.id) : {},
305
+ ...missing.brief ? { brief: `${changesRelOf(root)}/${c.id}/brief.md` } : {},
306
+ ...questions.length ? { questions } : {},
307
+ ...knowledge.items.length ? { knowledge: true } : {},
192
308
  ...stagesDone.length ? { stagesDone } : {},
193
- ...progress?.next ? { openspecStage: progress.next } : {},
309
+ ...loop ? { loop } : {},
310
+ ...live ? {
311
+ handoff: {
312
+ phase: live.phase,
313
+ number: live.pr.number,
314
+ url: live.pr.url,
315
+ state: live.state
316
+ }
317
+ } : {},
318
+ ...clash.length ? { seedCollisions: clash } : {},
194
319
  ...await isFast(root, c, types) ? {
195
320
  fast: true,
196
321
  .../^state: done$/m.test(await readFile(join(changesDirOf(root), c.id, "stage", "small.yaml"), "utf8").catch(() => "")) ? { fastDone: true } : {}
@@ -209,7 +334,8 @@ async function readNextState(root) {
209
334
  return {
210
335
  repos,
211
336
  catalogRecords: view.catalog.records,
212
- openQuestions: open.questions.map((q) => q.id),
337
+ // ADR 0140 (Q3): in the order to ask them, what a change in flight rests on first.
338
+ openQuestions: orderQuestions(open.questions, await questionWeights(root, open.questions).catch(() => /* @__PURE__ */ new Map())).map((q) => q.id),
213
339
  ...Object.keys(changeQuestions).length ? { changeQuestions } : {},
214
340
  ...active ? { active: active.id } : {},
215
341
  sources,
@@ -237,6 +363,35 @@ async function stageInProgress(root, change) {
237
363
  }
238
364
  return newest;
239
365
  }
366
+ async function loopState(root, change, stage) {
367
+ const t = await readFile(join(changesDirOf(root), change, "stage", `${stage}.yaml`), "utf8").catch(() => void 0);
368
+ if (t === void 0)
369
+ return void 0;
370
+ try {
371
+ const s = (0, import_yaml.parse)(t)?.state;
372
+ return typeof s === "string" ? s : void 0;
373
+ } catch {
374
+ return void 0;
375
+ }
376
+ }
377
+ async function stageQuestions(root, change, open) {
378
+ const out = [];
379
+ for (const s of DRAFTING) {
380
+ const t = await readFile(join(changesDirOf(root), change, "stage", `${s}.yaml`), "utf8").catch(() => "");
381
+ let y;
382
+ try {
383
+ y = (0, import_yaml.parse)(t);
384
+ } catch {
385
+ continue;
386
+ }
387
+ if (Array.isArray(y?.questions)) {
388
+ for (const q of y.questions)
389
+ if (typeof q === "string" && open.has(q))
390
+ out.push(q);
391
+ }
392
+ }
393
+ return out;
394
+ }
240
395
  async function isFast(root, c, types) {
241
396
  const type = types.find((t) => t.id === c.type);
242
397
  if (!type || type.size !== "small" && !type.smallWhenBriefSays)
@@ -244,6 +399,25 @@ async function isFast(root, c, types) {
244
399
  const brief = await readFile(join(changesDirOf(root), c.id, "brief.md"), "utf8").catch(() => "");
245
400
  return fastPathOf(type, brief).fast;
246
401
  }
402
+ async function draftMissing(ctx, c) {
403
+ const a = await assess(await ctx(), c);
404
+ return {
405
+ draft: a.blockers.some((b) => b.code === "missing-artifact" && (b.artifact === "proposal" || b.artifact === "specs")),
406
+ brief: a.blockers.some((b) => (b.code === "missing-artifact" || b.code === "unfilled-artifact") && b.artifact === "brief")
407
+ };
408
+ }
409
+ async function blockingOf(ctx, c) {
410
+ const a = await assess(await ctx(), c);
411
+ return a.blockers.filter((b) => b.code === "blocking-finding" || b.code === "open-gap").length;
412
+ }
413
+ async function releasePrsOf(root, id) {
414
+ const reasons = await releasePrReasons(root, id).catch(() => []);
415
+ if (reasons.some((r) => r.code === "release-pr-missing"))
416
+ return { releasePrs: "raise" };
417
+ if (reasons.some((r) => r.code === "release-pr-not-merged"))
418
+ return { releasePrs: "merge" };
419
+ return {};
420
+ }
247
421
  function stageOf(state) {
248
422
  switch (state) {
249
423
  case "draft":
@@ -268,7 +442,7 @@ function changeSteps(c) {
268
442
  const stage = stageSteps(c);
269
443
  const id = c.id;
270
444
  const done = stageOf(c.state) === "done";
271
- const find = c.feature && !c.needs && !done ? [
445
+ const find = c.feature && c.knowledge && !c.needs && !done ? [
272
446
  {
273
447
  step: "needs",
274
448
  command: `atticus change needs ${id}`,
@@ -288,13 +462,101 @@ function changeSteps(c) {
288
462
  person: true
289
463
  }
290
464
  ] : [];
291
- return [...find, ...stage, ...raise];
465
+ const seeds = done ? [] : [...new Set((c.seedCollisions ?? []).map((x) => x.repo))].sort().map((repo) => {
466
+ const xs = c.seedCollisions.filter((x) => x.repo === repo);
467
+ return {
468
+ step: "accept-seed",
469
+ command: `atticus spec accept ${repo}`,
470
+ where: METAREPO,
471
+ why: `${id} adds ${xs.map((x) => x.flow).join(", ")} as new, and ${repo}'s starting spec (${xs[0].seed}), not accepted yet, adds ${xs.length === 1 ? "it" : "them"} too: archiving both would fail on a requirement added twice. A person reads and accepts the seed. Then run the change's stories stage again (atticus plan stories ${id}) so it modifies the seeded requirement (ADR 0156).`,
472
+ person: true,
473
+ change: id,
474
+ repo
475
+ };
476
+ });
477
+ const gate = done ? [] : handoffWait(c);
478
+ if (gate.length)
479
+ return [...gate, ...find, ...raise];
480
+ const asked = done ? [] : questionStep(c);
481
+ const ownDone = (c.stagesDone ?? []).includes(stageOf(c.state));
482
+ return ownDone ? [...seeds, ...stage, ...asked, ...find, ...raise] : [...asked, ...seeds, ...stage, ...find, ...raise];
483
+ }
484
+ function handoffWait(c) {
485
+ const h = c.handoff;
486
+ if (!h)
487
+ return [];
488
+ const id = c.id;
489
+ if (h.state === "changes-requested")
490
+ return [
491
+ {
492
+ step: "handoff",
493
+ command: `atticus change handoff ${id} --approve`,
494
+ where: METAREPO,
495
+ why: `Changes were requested on PR #${h.number} (${id}'s ${h.phase} hand-off): update the work, then a person hands it off again.`,
496
+ change: id,
497
+ person: true,
498
+ ...isManualPrUrl(h.url) ? {} : { pr: h.url }
499
+ }
500
+ ];
501
+ if (isManualPrUrl(h.url))
502
+ return [
503
+ {
504
+ step: "merge",
505
+ command: `atticus todo --change ${id}`,
506
+ where: METAREPO,
507
+ why: `${id}'s ${h.phase} hand-off PR isn't open yet: your Git host is manual, so opening it is a step waiting on you (atticus todo, or Home \u203A Manual steps in the app). Open it on the Git host as its step says, record its link, then sync; merging it approves the ${h.phase} gate.`,
508
+ change: id,
509
+ person: true,
510
+ pr: h.url
511
+ }
512
+ ];
513
+ return [
514
+ {
515
+ step: "merge",
516
+ command: `atticus change sync ${id}`,
517
+ where: METAREPO,
518
+ why: `${id}'s ${h.phase} hand-off PR #${h.number} is raised (${h.url}): a person approves and merges it on the Git host, then syncing moves the change on (ADR 0073).`,
519
+ change: id,
520
+ person: true,
521
+ pr: h.url
522
+ }
523
+ ];
524
+ }
525
+ function questionStep(c) {
526
+ const ids = c.questions ?? [];
527
+ if (!ids.length)
528
+ return [];
529
+ const stage = stageOf(c.state);
530
+ const again = draftingAt(stage) >= 0 ? `Answer ${plural(ids.length, "question")} on Questions (or atticus questions answer <id>), then run the ${c.fast ? "fast path's one step" : `${stage} stage`} again.` : `Its stage goes on once ${ids.length === 1 ? "it is" : "they are"} answered.`;
531
+ return [
532
+ {
533
+ step: "answer",
534
+ command: "atticus questions list --state open",
535
+ slash: "/atticus-answer",
536
+ where: METAREPO,
537
+ why: `${plural(ids.length, "question")} of ${c.id} ${ids.length === 1 ? "is" : "are"} waiting for a person: ${ids.join(", ")}. ${again}`,
538
+ person: true,
539
+ change: c.id
540
+ }
541
+ ];
542
+ }
543
+ function againWhy(c, stage) {
544
+ return c.loop === "questions" && !c.questions?.length ? `The questions the ${stage} stage of ${c.id} asked are answered: run the stage again so it reads the answers (ADR 0087).` : void 0;
292
545
  }
293
546
  function stageSteps(c) {
294
547
  const id = c.id;
295
- const byState = stageOf(c.state);
296
- const at = draftingAt;
297
- const stage = c.openspecStage && at(byState) >= 0 && at(c.openspecStage) > at(byState) ? c.openspecStage : byState;
548
+ const stage = stageOf(c.state);
549
+ if (c.brief && stage === "feature" && !c.stagesDone?.includes("feature"))
550
+ return [
551
+ {
552
+ step: "brief",
553
+ command: c.brief,
554
+ where: METAREPO,
555
+ why: `Write the brief of ${id} (${c.brief}): it still holds only the template. The feature stage places the change on the estate from it.`,
556
+ change: id,
557
+ person: true
558
+ }
559
+ ];
298
560
  if (c.fast && (stage === "feature" || stage === "architecture" || stage === "stories"))
299
561
  return c.fastDone ? [
300
562
  {
@@ -318,6 +580,17 @@ function stageSteps(c) {
318
580
  if ((stage === "feature" || stage === "architecture" || stage === "stories") && c.stagesDone?.includes(stage)) {
319
581
  const later = c.stagesDone.slice(c.stagesDone.indexOf(stage) + 1);
320
582
  const gate = c.state === "returned" ? "define" : c.state;
583
+ if (stage === "feature" && c.undrafted)
584
+ return [
585
+ {
586
+ step: "draft",
587
+ command: `atticus change draft ${id}`,
588
+ slash: `/atticus-draft ${id}`,
589
+ where: METAREPO,
590
+ why: `${id} is placed on the estate, but its proposal or specs aren't written yet: your assistant drafts them, and Atticus checks the draft. Then a person raises the define hand-off.`,
591
+ change: id
592
+ }
593
+ ];
321
594
  return [
322
595
  {
323
596
  step: "handoff",
@@ -337,18 +610,29 @@ function stageSteps(c) {
337
610
  command: `atticus change feature ${id}`,
338
611
  slash: `/atticus-feature ${id}`,
339
612
  where: METAREPO,
340
- why: `${id} is at the feature stage: your assistant places it on the estate's flows and features, and Atticus checks and criticises every draft until nothing blocks (ADR 0087).`,
613
+ why: againWhy(c, "feature") ?? `${id} is at the feature stage: your assistant places it on the estate's flows and features, and Atticus checks and criticises every draft until nothing blocks (ADR 0087).`,
341
614
  change: id
342
615
  }
343
616
  ];
344
617
  case "architecture":
345
618
  return [
619
+ // Fifth UX walk: the architecture stage reads the placed feature; without one it refuses.
620
+ ...c.feature === false ? [
621
+ {
622
+ step: "feature",
623
+ command: `atticus change feature ${id}`,
624
+ slash: `/atticus-feature ${id}`,
625
+ where: METAREPO,
626
+ why: `${id} isn't placed on the estate yet: your assistant places it on the flows and features first, then writes its target flows.`,
627
+ change: id
628
+ }
629
+ ] : [],
346
630
  {
347
631
  step: "architecture",
348
632
  command: `atticus change architecture ${id}`,
349
633
  slash: `/atticus-architecture ${id}`,
350
634
  where: METAREPO,
351
- why: `${id} is at the architecture stage: your assistant writes its target flows, and Atticus checks and criticises every draft until nothing blocks (ADR 0087).`,
635
+ why: againWhy(c, "architecture") ?? `${id} is at the architecture stage: your assistant writes its target flows, and Atticus checks and criticises every draft until nothing blocks (ADR 0087).`,
352
636
  change: id
353
637
  }
354
638
  ];
@@ -359,35 +643,83 @@ function stageSteps(c) {
359
643
  command: `atticus plan stories ${id}`,
360
644
  slash: `/atticus-stories ${id}`,
361
645
  where: METAREPO,
362
- why: `${id} has an approved design: write its stories and tasks.`,
646
+ why: againWhy(c, "stories") ?? `${id} has an approved design: write its stories and tasks.`,
363
647
  change: id
364
648
  }
365
649
  ];
366
650
  case "tasks": {
367
- const t = c.tasks.find((x) => !x.done);
368
- if (!t)
651
+ const underWay = (x) => x.run === "built" || x.run === "unverified" || x.run === "pr-open" || x.run === "waiting";
652
+ const open = c.tasks.filter((x) => !x.done);
653
+ const t = open.find((x) => !underWay(x));
654
+ const drafted = open.filter(underWay).map((x) => x.id);
655
+ const draftedNote = drafted.length ? ` ${drafted.length === 1 ? "Task" : "Tasks"} ${drafted.join(", ")} ${drafted.length === 1 ? "is" : "are"} under way: raise or merge ${drafted.length === 1 ? "its" : "their"} PR on the Task board.` : "";
656
+ if (!t && drafted.length)
369
657
  return [
370
658
  {
371
659
  step: "tasks",
372
660
  command: `atticus change status ${id}`,
373
661
  where: METAREPO,
374
- why: `Every task of ${id} is ticked; the status says what is left before release.`,
662
+ why: `Every task of ${id} not ticked is under way.${draftedNote}`,
375
663
  change: id
376
664
  }
377
665
  ];
666
+ const handoffStep = {
667
+ step: "handoff",
668
+ command: `atticus change handoff ${id} --approve`,
669
+ where: METAREPO,
670
+ why: `Every task of ${id} is ticked: a person raises its ${c.state} hand-off PR, and merging it approves the ${c.state} gate and moves it on (ADR 0073).`,
671
+ change: id,
672
+ person: true
673
+ };
674
+ if (!t && c.blocking)
675
+ return [
676
+ {
677
+ step: "findings",
678
+ command: `atticus change status ${id}`,
679
+ where: METAREPO,
680
+ why: `Every task of ${id} is ticked, but ${plural(c.blocking, "blocking finding")} hold${c.blocking === 1 ? "s" : ""} its ${c.state} hand-off: a person resolves each (Apply fix, Not relevant or Waive, on the change's page), then raises the hand-off PR.`,
681
+ change: id,
682
+ person: true
683
+ },
684
+ handoffStep
685
+ ];
686
+ if (!t)
687
+ return [handoffStep];
378
688
  return [
379
689
  {
380
690
  step: "task",
381
691
  command: `atticus task run ${id} ${t.id}`,
382
692
  slash: `/atticus-task ${id} ${t.id}`,
383
693
  where: METAREPO,
384
- why: `Task ${t.id} of ${id} in ${t.repo} is the first one not done. /atticus-task gives your assistant its context (atticus task context ${id} ${t.id}): the story, the criteria, the step with today's code and the files to change (ADR 0113).`,
694
+ why: `Task ${t.id} of ${id} in ${t.repo} is the first one not done. /atticus-task gives your assistant its context (atticus task context ${id} ${t.id}): the story, the criteria, the step with today's code and the files to change (ADR 0113).${draftedNote}`,
385
695
  repo: t.repo,
386
696
  change: id
387
697
  }
388
698
  ];
389
699
  }
390
700
  case "release":
701
+ if (c.releasePrs === "raise")
702
+ return [
703
+ {
704
+ step: "release-prs",
705
+ command: `atticus change release-prs ${id} --approve`,
706
+ where: METAREPO,
707
+ why: `${id}'s code reaches each repo's default branch through its release PRs: raise them (Release \u203A Raise the release PRs), then a person merges each on the Git host.`,
708
+ person: true,
709
+ change: id
710
+ }
711
+ ];
712
+ if (c.releasePrs === "merge")
713
+ return [
714
+ {
715
+ step: "release-prs-merge",
716
+ command: `atticus change sync ${id}`,
717
+ where: METAREPO,
718
+ why: `${id}'s release PRs wait on a person on the Git host: merge each, then Sync records it (Release).`,
719
+ person: true,
720
+ change: id
721
+ }
722
+ ];
391
723
  return [
392
724
  {
393
725
  step: "release",
@@ -402,7 +734,9 @@ function stageSteps(c) {
402
734
  return [];
403
735
  }
404
736
  }
405
- function changeAnswer(id, ids) {
737
+ function changeAnswer(c, filed) {
738
+ const id = c.id;
739
+ const ids = filed.filter((q) => !c.questions?.includes(q));
406
740
  if (!ids.length)
407
741
  return [];
408
742
  return [
@@ -417,13 +751,25 @@ function changeAnswer(id, ids) {
417
751
  }
418
752
  ];
419
753
  }
754
+ function nearFactsWords(r) {
755
+ return (r.nearFacts ?? []).map((n) => ` No facts are filed under ${r.id}, but ${n.id} has some (${n.file}) and its id is near this one: if they are one repo, keep one id with atticus repo rename ${r.id} ${n.id} (or rename the facts to ${r.id}).`).join("");
756
+ }
757
+ function costWords(r) {
758
+ const e = r.cost?.estimated;
759
+ if (!e)
760
+ return "";
761
+ return ` Estimated about ${tokensWords(e.tokens)} tokens in ${e.sessions} session${e.sessions === 1 ? "" : "s"} (atticus map ${r.id} --estimate; an estimate, not a meter).`;
762
+ }
420
763
  function nextSteps(s) {
421
764
  const out = [];
422
765
  const byChange = s.changeQuestions ?? {};
423
766
  const inHand = s.active ? s.changes.find((c) => c.id === s.active) : void 0;
424
767
  if (inHand && stageOf(inHand.state) !== "done")
425
- out.push(...changeAnswer(inHand.id, byChange[inHand.id] ?? []), ...changeSteps(inHand));
426
- const ofChanges = new Set(Object.values(byChange).flat());
768
+ out.push(...changeAnswer(inHand, byChange[inHand.id] ?? []), ...changeSteps(inHand));
769
+ const ofChanges = /* @__PURE__ */ new Set([
770
+ ...Object.values(byChange).flat(),
771
+ ...s.changes.filter((c) => stageOf(c.state) !== "done").flatMap((c) => c.questions ?? [])
772
+ ]);
427
773
  const repoQuestions = s.openQuestions.filter((id) => !ofChanges.has(id));
428
774
  if (s.repos.length === 0 && !inHand) {
429
775
  out.push({
@@ -440,7 +786,7 @@ function nextSteps(s) {
440
786
  command: "atticus workspace sync",
441
787
  why: `${plural(notCloned.length, "repo")} ${notCloned.length === 1 ? "isn't" : "aren't"} cloned yet: ${notCloned.map((r) => r.id).join(", ")}.`
442
788
  });
443
- const unread = s.repos.filter((r) => r.cloned && !r.facts && !r.scanned);
789
+ const unread = s.repos.filter((r) => r.cloned && !r.facts && !r.scanned).sort((a, b) => (a.queue?.order ?? Infinity) - (b.queue?.order ?? Infinity));
444
790
  for (const r of unread)
445
791
  out.push(r.read ? {
446
792
  step: "write",
@@ -453,7 +799,26 @@ function nextSteps(s) {
453
799
  slash: `/atticus-map ${r.id}`,
454
800
  where: METAREPO,
455
801
  // A-ledger: a repo read in parts says which part comes next, so nobody keeps the list.
456
- why: r.readPlan?.next ? `${r.id} is read in ${r.readPlan.total} parts (${r.readPlan.file}): ${partOfWords({ part: r.readPlan.next.part, total: r.readPlan.total })} is next, ${r.readPlan.done === 0 ? "none" : r.readPlan.done} ${r.readPlan.done === 1 ? "is" : "are"} read (${r.readPlan.next.paths.join(", ")}). Your assistant reads the part and writes its facts, each citing its line.` : `${r.id} isn't read yet: your assistant reads it and writes its facts, each citing its line, and atticus verify ${r.id} checks them.`,
802
+ why: (r.readPlan?.next ? `${r.id} is read in ${r.readPlan.total} parts (${r.readPlan.file}): ${partOfWords({ part: r.readPlan.next.part, total: r.readPlan.total })} is next, ${r.readPlan.done === 0 ? "none" : r.readPlan.done} ${r.readPlan.done === 1 ? "is" : "are"} read (${r.readPlan.next.paths.join(", ")}). Your assistant reads the part and writes its facts, each citing its line.` : `${r.id} isn't read yet: your assistant reads it and writes its facts, each citing its line, and atticus verify ${r.id} checks them.`) + // Only a reason that moved it up the queue is worth a sentence here; --queue says all.
803
+ (r.queue && (r.queue.reason === "called" || r.queue.reason === "gateway" || r.queue.reason === "places") ? ` ${r.queue.why}` : "") + costWords(r) + houseUntaughtWords(r.id, r.houseUntaught ?? []) + nearFactsWords(r),
804
+ repo: r.id
805
+ });
806
+ for (const r of s.repos.filter((x) => x.cloned && x.facts && x.stale))
807
+ out.push({
808
+ step: "reread",
809
+ command: `atticus map ${r.id}`,
810
+ slash: `/atticus-map ${r.id}`,
811
+ where: METAREPO,
812
+ why: `${r.id}'s clone moved past its facts' commit (facts ${r.stale.facts.slice(0, 12)}, clone ${r.stale.head.slice(0, 12)}): atticus estate fresh says how many facts to read again; your assistant reads only the files that changed.`,
813
+ repo: r.id
814
+ });
815
+ for (const r of s.repos.filter((x) => x.cloned && x.read && x.rules?.length))
816
+ out.push({
817
+ step: "rules",
818
+ command: `atticus map ${r.id} --rules`,
819
+ slash: `/atticus-map ${r.id} --rules`,
820
+ where: METAREPO,
821
+ why: `${r.id} was read before reading rules added since (${r.rules.join(", ")}): your assistant reads only the files they apply to, for what they ask, and atticus verify ${r.id} records the rules. atticus map --all --stale tops up every such repo.`,
457
822
  repo: r.id
458
823
  });
459
824
  const cloned = s.repos.filter((r) => r.cloned && !r.facts && r.scanned);
@@ -593,7 +958,7 @@ function nextSteps(s) {
593
958
  const inFlight = s.changes.filter((c) => stageOf(c.state) !== "done");
594
959
  for (const c of inFlight)
595
960
  if (c !== inHand)
596
- out.push(...changeAnswer(c.id, byChange[c.id] ?? []), ...changeSteps(c));
961
+ out.push(...changeAnswer(c, byChange[c.id] ?? []), ...changeSteps(c));
597
962
  if (!inFlight.length)
598
963
  out.push({
599
964
  step: "new-change",
@@ -608,6 +973,8 @@ async function nextCommand(root, o, io) {
608
973
  return 2;
609
974
  }
610
975
  const state = await readNextState(root);
976
+ if (o.queue)
977
+ return queueOut(state, o, io);
611
978
  const steps = nextSteps(state);
612
979
  const runtime = await loadOrgPack(orgPackDirOf(root)).then((op) => op.runtime).catch(() => void 0);
613
980
  const probes = (await readProbes(root)).results;
@@ -656,9 +1023,43 @@ async function nextCommand(root, o, io) {
656
1023
  });
657
1024
  return 0;
658
1025
  }
1026
+ function queueOut(s, o, io) {
1027
+ const waiting = s.repos.filter((r) => r.queue).sort((a, b) => a.queue.order - b.queue.order);
1028
+ const read = s.repos.filter((r) => r.facts);
1029
+ if (o.json) {
1030
+ io.out(JSON.stringify({
1031
+ queue: waiting.map((r) => ({
1032
+ repo: r.id,
1033
+ order: r.queue.order + 1,
1034
+ reason: r.queue.reason,
1035
+ why: r.queue.why,
1036
+ command: `atticus map ${r.id}`,
1037
+ slash: `/atticus-map ${r.id}`,
1038
+ ...r.cost ? { cost: r.cost } : {}
1039
+ })),
1040
+ read: read.map((r) => ({
1041
+ repo: r.id,
1042
+ ...r.cost ? { cost: r.cost } : {},
1043
+ ...r.stale ? { stale: r.stale } : {}
1044
+ })),
1045
+ problems: s.problems
1046
+ }, null, 2));
1047
+ return 0;
1048
+ }
1049
+ for (const p of s.problems)
1050
+ io.err(`Couldn't read ${p.file}: ${p.message}`);
1051
+ io.out(waiting.length ? `${plural(waiting.length, "repo")} to read, in the order that lands links early (callees and gateways first):` : "No repo is waiting to be read.");
1052
+ waiting.forEach((r, i) => io.out(` ${i + 1}. ${r.id}: ${r.queue.why} ${r.cost?.estimated ? `Cost: ${readCostWords(r.cost)}.` : `Cost: not estimated yet (atticus map ${r.id} --estimate).`}`));
1053
+ if (read.length) {
1054
+ io.out(`${plural(read.length, "repo")} read:`);
1055
+ for (const r of read)
1056
+ io.out(` ${r.id}: ${r.cost ? readCostWords(r.cost) || "no cost on file" : "no cost on file (read before Atticus recorded one)"}${r.stale ? `; its clone moved past its facts' commit: atticus estate fresh` : ""}`);
1057
+ }
1058
+ io.out("Tokens estimated are counted from the source; reported ones are your assistant's word (atticus map <repo> --spent); Atticus meters neither.");
1059
+ return 0;
1060
+ }
659
1061
 
660
1062
  export {
661
- canMoveOn,
662
1063
  readNextState,
663
1064
  changeSteps,
664
1065
  nextSteps,