@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.
- package/dist/bin.js +8 -4
- package/dist/chunk-265LWMOA.js +91 -0
- package/dist/chunk-26WBY34Y.js +37 -0
- package/dist/{chunk-UBBC2XSG.js → chunk-26Z7OGQW.js} +518 -93
- package/dist/chunk-2D7PWSOK.js +172 -0
- package/dist/{chunk-JCZIKA4C.js → chunk-2HH3UCZM.js} +4 -4
- package/dist/{chunk-GDLULHTC.js → chunk-2HTEMYTB.js} +12 -26
- package/dist/chunk-2UCRFXFZ.js +130 -0
- package/dist/{chunk-MVZVGYXH.js → chunk-2V2ZPQQU.js} +81 -13
- package/dist/{chunk-BOHJZTEQ.js → chunk-36RY7ZXM.js} +130 -71
- package/dist/{chunk-I3E7CX4H.js → chunk-37WE3LS2.js} +3 -3
- package/dist/{chunk-IPKHE5D6.js → chunk-3AQ2R5NL.js} +1520 -871
- package/dist/chunk-3G6S7LAA.js +43 -0
- package/dist/chunk-3J5I7ZOU.js +58 -0
- package/dist/{chunk-65NYPGRC.js → chunk-3LZ6P5EP.js} +1 -1
- package/dist/chunk-3SSTNB4E.js +191 -0
- package/dist/chunk-3TD6S4TC.js +49 -0
- package/dist/{chunk-3C7EYRFZ.js → chunk-3UTYPHN3.js} +1 -1
- package/dist/{chunk-G2B4ZQGH.js → chunk-3WON4G3M.js} +2 -2
- package/dist/{chunk-S3QNRWYR.js → chunk-42EPP7OB.js} +12 -12
- package/dist/chunk-455SYIIE.js +113 -0
- package/dist/{chunk-YISXLPHN.js → chunk-4B6BT75O.js} +166 -23
- package/dist/{chunk-C6EKFH7J.js → chunk-4CLK2RJO.js} +7 -7
- package/dist/chunk-4CYTJ5TZ.js +38 -0
- package/dist/{chunk-EYWIDJFU.js → chunk-4D62IZII.js} +5 -5
- package/dist/chunk-4FOAYLI4.js +328 -0
- package/dist/{chunk-7JUKDRSZ.js → chunk-4KNOJC6J.js} +294 -215
- package/dist/{chunk-YMZ3TNYB.js → chunk-4PYC2UGC.js} +2 -2
- package/dist/{chunk-27NKUS3X.js → chunk-4SLBCEPD.js} +2104 -726
- package/dist/chunk-4TKVU2I2.js +122 -0
- package/dist/{chunk-RUVFXE2L.js → chunk-4WXRPQDE.js} +448 -47
- package/dist/{chunk-7ZUIMTOU.js → chunk-5CMPVC3N.js} +24 -24
- package/dist/chunk-5G7ILBUG.js +66 -0
- package/dist/{chunk-HFQCFSJR.js → chunk-5PV7S2ZP.js} +3 -3
- package/dist/{chunk-FITWGOJ2.js → chunk-5QUOPNLN.js} +4 -4
- package/dist/{chunk-Z6LF7HQN.js → chunk-5TDRBOAV.js} +5 -5
- package/dist/{chunk-T6AIP7H5.js → chunk-5WERBKLE.js} +199 -63
- package/dist/{chunk-XPCM366L.js → chunk-62DLJSLV.js} +8 -8
- package/dist/{chunk-L24C55VN.js → chunk-64AADMTW.js} +99 -25
- package/dist/{chunk-K65BJIMT.js → chunk-67BP7HXL.js} +17 -17
- package/dist/chunk-6DQYZU2W.js +379 -0
- package/dist/{chunk-EDS2L2LD.js → chunk-6EXDI5GI.js} +52 -26
- package/dist/chunk-6FNAKCET.js +38 -0
- package/dist/{chunk-6IU67AEK.js → chunk-75ASLHBT.js} +21 -15
- package/dist/{chunk-A3GY6SOA.js → chunk-75ZOZFGH.js} +18 -18
- package/dist/{chunk-MGYZM27B.js → chunk-77O633L5.js} +49 -23
- package/dist/{chunk-GQ4N4WKF.js → chunk-7AB6OWTV.js} +3 -3
- package/dist/{chunk-M766ZJ6W.js → chunk-7CZHUZBL.js} +25 -25
- package/dist/{chunk-A7UPUQFY.js → chunk-7FHNFCHK.js} +643 -124
- package/dist/chunk-7FUIVIBG.js +415 -0
- package/dist/{chunk-6QSERWXH.js → chunk-7QPCGTPS.js} +21 -21
- package/dist/{chunk-LR3R6Z2A.js → chunk-A2G72UI4.js} +7 -7
- package/dist/{chunk-I4JRCD6M.js → chunk-AE4P57KK.js} +23 -17
- package/dist/{chunk-AVJDSJ2F.js → chunk-AHW3RY3X.js} +7 -7
- package/dist/chunk-AM6FP6JW.js +43 -0
- package/dist/{chunk-CSZ4C5N6.js → chunk-AOCWFA7T.js} +93 -10
- package/dist/{chunk-EPTBZ3GP.js → chunk-API5TOUB.js} +1 -1
- package/dist/{chunk-652QWTLZ.js → chunk-AZDITBCT.js} +3 -3
- package/dist/{chunk-DPUYDDQG.js → chunk-BA2HUMDN.js} +25 -3
- package/dist/chunk-BA3U7ALS.js +99 -0
- package/dist/{chunk-HVUPKCGJ.js → chunk-BC6KKZ67.js} +5 -5
- package/dist/{chunk-CKSITVS4.js → chunk-BEPCKDCP.js} +2554 -722
- package/dist/{chunk-3ALD2W2A.js → chunk-BPPU3PW7.js} +4 -4
- package/dist/{chunk-QRAOANID.js → chunk-BVWWPBKD.js} +21 -21
- package/dist/{chunk-ZDPAS56H.js → chunk-BXBCMGIQ.js} +7 -1
- package/dist/chunk-BXZ4PKIT.js +233 -0
- package/dist/chunk-C7CEK3KW.js +247 -0
- package/dist/chunk-CFH3QH26.js +29 -0
- package/dist/chunk-CG6CULP6.js +170 -0
- package/dist/chunk-CLD4RVTA.js +45 -0
- package/dist/{chunk-DKJA76CJ.js → chunk-CNPY4NTZ.js} +13 -13
- package/dist/chunk-CNU5Q2D5.js +575 -0
- package/dist/{chunk-T2UYZSCQ.js → chunk-COYN3UAN.js} +126 -23
- package/dist/{chunk-23W7VWKR.js → chunk-CPK7QSBG.js} +1360 -113
- package/dist/{chunk-4AK7IBVP.js → chunk-D2WSW4GU.js} +1 -1
- package/dist/{chunk-ABWHYWNI.js → chunk-D57MFJPP.js} +3 -3
- package/dist/chunk-D5KV5PSK.js +45 -0
- package/dist/chunk-D5MASS4I.js +48 -0
- package/dist/{chunk-7EOBHUMC.js → chunk-DCWN3HFV.js} +2 -2
- package/dist/{chunk-QSXK2RGH.js → chunk-DDJPM5YX.js} +2 -2
- package/dist/chunk-DN4A2Q2O.js +57 -0
- package/dist/{chunk-IHMLFRVV.js → chunk-DUPZPDCJ.js} +58 -16
- package/dist/{chunk-PRPPGYZG.js → chunk-E2VXBSIR.js} +4 -4
- package/dist/chunk-E57AOFYN.js +32 -0
- package/dist/{chunk-UGLN7QHV.js → chunk-ECLXZWAG.js} +12 -12
- package/dist/{chunk-5WG5YP4T.js → chunk-EDZ45WIR.js} +14 -14
- package/dist/chunk-EFCQSMXB.js +37 -0
- package/dist/{chunk-2ANOROX3.js → chunk-EZIN5E5B.js} +8 -8
- package/dist/{chunk-BWZ77RQT.js → chunk-F6H2RJ3N.js} +1 -1
- package/dist/{chunk-OLQJTJJU.js → chunk-FAJDKNSD.js} +7 -3
- package/dist/chunk-FGAGWYZB.js +47 -0
- package/dist/{chunk-4WBVUHXN.js → chunk-FLVZFTLQ.js} +18 -18
- package/dist/chunk-FQ6WH6PB.js +140 -0
- package/dist/{chunk-T6XQL73F.js → chunk-FRHD22WM.js} +61 -23
- package/dist/{chunk-XAKWMCXI.js → chunk-FVMPFCDS.js} +4 -4
- package/dist/{chunk-B2WLAWNJ.js → chunk-FY3QIRTL.js} +3 -3
- package/dist/{chunk-CPA6HPVR.js → chunk-FYBF5MB2.js} +15 -11
- package/dist/{chunk-V2YTAIQO.js → chunk-G5YJBNDZ.js} +21 -6
- package/dist/chunk-G6IQYM25.js +339 -0
- package/dist/chunk-G6X4YL4D.js +161 -0
- package/dist/{chunk-SJRGMG6A.js → chunk-GC2VK3JT.js} +25 -25
- package/dist/{chunk-SP2I63OO.js → chunk-GCS3FZOB.js} +77 -3
- package/dist/{chunk-6TACQN3N.js → chunk-GDZB57IU.js} +5 -5
- package/dist/chunk-GIFMBCTW.js +221 -0
- package/dist/{chunk-YY6ZQQBP.js → chunk-GK4PYVEC.js} +18 -8
- package/dist/{chunk-TDD55CJH.js → chunk-GNWAOVFQ.js} +6 -5
- package/dist/chunk-GS76RXQE.js +226 -0
- package/dist/{chunk-YYQN46FY.js → chunk-GSGIZ2OO.js} +23 -23
- package/dist/chunk-GUYL7RMK.js +60 -0
- package/dist/chunk-GX74YWR7.js +321 -0
- package/dist/chunk-HE3HRDNZ.js +122 -0
- package/dist/{chunk-AIOQPLA5.js → chunk-HGHRSF3E.js} +30 -12
- package/dist/{chunk-2RMYG36Q.js → chunk-HK3VOHIE.js} +198 -336
- package/dist/{chunk-QZSX3F7C.js → chunk-HS4BGB4G.js} +24 -22
- package/dist/{chunk-XY3P7JW7.js → chunk-HSZMPH5T.js} +834 -149
- package/dist/{chunk-L6SGQIR3.js → chunk-HWD4JPU7.js} +4 -2
- package/dist/{chunk-PCVDV3UZ.js → chunk-HXXP2NTE.js} +6 -6
- package/dist/{chunk-AA6YULYB.js → chunk-I2A3Z5AK.js} +7 -7
- package/dist/{chunk-N7IXEHK3.js → chunk-ICHDSWEY.js} +7 -7
- package/dist/chunk-IFFRGC3N.js +31 -0
- package/dist/{chunk-4BN53TG3.js → chunk-IFHDV6KQ.js} +31 -23
- package/dist/chunk-J2O4LFVI.js +80 -0
- package/dist/chunk-J5AAZ6OJ.js +161 -0
- package/dist/{chunk-ZMFPW66A.js → chunk-JAABT3DA.js} +3 -3
- package/dist/chunk-JITJP64K.js +34 -0
- package/dist/chunk-JKIGL3XQ.js +162 -0
- package/dist/chunk-JRVNXLZP.js +615 -0
- package/dist/chunk-JRXHON4E.js +41 -0
- package/dist/{chunk-DHPACDG7.js → chunk-JS6WMC3J.js} +8 -8
- package/dist/chunk-JU4QNJSR.js +62 -0
- package/dist/{chunk-PAMPPUR6.js → chunk-JYMIB5XY.js} +1697 -172
- package/dist/{chunk-RRTKKSLQ.js → chunk-JYTIHTIK.js} +8 -6
- package/dist/{chunk-3HI6Z55Y.js → chunk-K332XW7K.js} +324 -39
- package/dist/{chunk-GLUX4EEP.js → chunk-K6JB6XTX.js} +9 -9
- package/dist/chunk-KDAHXQIE.js +294 -0
- package/dist/chunk-KYZMRSPS.js +93 -0
- package/dist/chunk-L4CESDPB.js +22 -0
- package/dist/{chunk-NXFPS2LR.js → chunk-LEBR5NHW.js} +14 -14
- package/dist/chunk-LIJJCBQI.js +223 -0
- package/dist/{chunk-DE76JROX.js → chunk-LIRVU3HW.js} +16 -16
- package/dist/{chunk-JMSCMUCA.js → chunk-LN77DXBM.js} +145 -21
- package/dist/{chunk-JIITQXFB.js → chunk-LNWEWYCM.js} +2969 -788
- package/dist/{chunk-TANFV3MZ.js → chunk-LO3BLMVG.js} +3 -3
- package/dist/chunk-LPV6T362.js +250 -0
- package/dist/{chunk-2VHF7OXM.js → chunk-LQH4P45K.js} +1 -1
- package/dist/chunk-LU4MQVAL.js +41 -0
- package/dist/chunk-LWDNKE4X.js +273 -0
- package/dist/chunk-M4H2UG4R.js +218 -0
- package/dist/{chunk-6BVONWJ7.js → chunk-M6D2U3YM.js} +3 -3
- package/dist/chunk-MD7KUEJ3.js +514 -0
- package/dist/{chunk-66YVAGGM.js → chunk-MMZUN7ZO.js} +20 -20
- package/dist/chunk-MZGRDONP.js +916 -0
- package/dist/chunk-N3RUGTGV.js +39 -0
- package/dist/{chunk-JGZCG5VM.js → chunk-NCB6656Z.js} +7 -7
- package/dist/{chunk-4NDAAFQT.js → chunk-NRQ65LTQ.js} +7 -5
- package/dist/{chunk-UNM6ZOKP.js → chunk-NTAVOWYD.js} +145 -18
- package/dist/{chunk-3USYZGRF.js → chunk-NYOABJNK.js} +36 -27
- package/dist/{chunk-WVPJSRRJ.js → chunk-O4IKAIZ2.js} +24 -20
- package/dist/{chunk-D3PO4DOZ.js → chunk-ODMBPDDV.js} +51 -14
- package/dist/chunk-OKUB6RJA.js +533 -0
- package/dist/chunk-OMPENNWY.js +39 -0
- package/dist/chunk-OPQZISG3.js +25 -0
- package/dist/{chunk-5GGOLAKC.js → chunk-OV57AHCG.js} +26 -26
- package/dist/chunk-OZJ3JLYI.js +58 -0
- package/dist/{chunk-KEM4SDDP.js → chunk-P2VBXX7N.js} +11 -10
- package/dist/{chunk-S2A7YC3Q.js → chunk-PAINMSID.js} +10150 -1720
- package/dist/chunk-PKJAV25S.js +43 -0
- package/dist/{chunk-EBEW3XXQ.js → chunk-PNQLCRSS.js} +4 -4
- package/dist/{chunk-WY6PP6AA.js → chunk-PQH56YF6.js} +37 -5
- package/dist/chunk-PRTBPXYA.js +50 -0
- package/dist/{chunk-YEDDOYSC.js → chunk-PRW3HXM3.js} +2 -2
- package/dist/chunk-PRZ7KMWL.js +42 -0
- package/dist/{chunk-6M5NK3K3.js → chunk-PTQ3ZALZ.js} +42 -4
- package/dist/{chunk-5GDRCDQB.js → chunk-PUEWDYGP.js} +2 -2
- package/dist/chunk-Q26LDIUV.js +236 -0
- package/dist/{chunk-CR3MTH32.js → chunk-Q46QDDMF.js} +77 -7
- package/dist/chunk-QBNWF5ZU.js +19 -0
- package/dist/chunk-QE527XRY.js +342 -0
- package/dist/{chunk-CNUKCS2T.js → chunk-QHJJMZLX.js} +1518 -54
- package/dist/chunk-QJCJOMW3.js +425 -0
- package/dist/{chunk-VYDBJ73M.js → chunk-QKMRFNMA.js} +15 -15
- package/dist/chunk-QOOEYDNJ.js +317 -0
- package/dist/chunk-QSIDVFB7.js +45 -0
- package/dist/{chunk-R77KLRB3.js → chunk-RA33EYS4.js} +19 -18
- package/dist/{chunk-DFBCSHVT.js → chunk-RALY3E5U.js} +4 -4
- package/dist/{chunk-ZCJDOK2S.js → chunk-S2RY3BOD.js} +35 -21
- package/dist/chunk-S5LSDXV4.js +40 -0
- package/dist/chunk-SB5GRUFM.js +54 -0
- package/dist/chunk-SH27FYPF.js +150 -0
- package/dist/chunk-T74WQQGS.js +40 -0
- package/dist/{chunk-O3WI5KWW.js → chunk-TGVVUKTG.js} +2 -2
- package/dist/chunk-THN26IEF.js +48 -0
- package/dist/chunk-TJH2EUAZ.js +47 -0
- package/dist/{chunk-ZNCEKR4J.js → chunk-TQ4TG57V.js} +12 -8
- package/dist/{chunk-7FBGJFEE.js → chunk-TQTRWENN.js} +12 -12
- package/dist/{chunk-TYAID7B7.js → chunk-TSM6T6GQ.js} +23 -23
- package/dist/{chunk-DPZHZQKE.js → chunk-TW3KOSQK.js} +43 -10
- package/dist/{chunk-MC3H7736.js → chunk-TWQRPM76.js} +37 -4
- package/dist/chunk-TYD6I4CZ.js +109 -0
- package/dist/chunk-U3NBK4EU.js +420 -0
- package/dist/{chunk-6JCPI55B.js → chunk-UDXWIPCB.js} +47 -7
- package/dist/{chunk-MMOSZPWJ.js → chunk-UEVZZZU2.js} +4 -4
- package/dist/{chunk-JBTK5OP2.js → chunk-UF4UHCIG.js} +2 -2
- package/dist/{chunk-6JUBZBMW.js → chunk-UFE36WJH.js} +4 -4
- package/dist/{chunk-ONLS5QA5.js → chunk-URIKUID7.js} +12 -12
- package/dist/chunk-UYLBRRFK.js +1106 -0
- package/dist/chunk-UZACEG2C.js +515 -0
- package/dist/{chunk-7SW2QWLU.js → chunk-VAMHOHUU.js} +12 -12
- package/dist/{chunk-RZPYKDWS.js → chunk-VUVGX5L2.js} +1 -1
- package/dist/{chunk-Q4D5X7QB.js → chunk-VYOCPTUB.js} +44 -24
- package/dist/{chunk-CAQZUNOH.js → chunk-WAZEXEJH.js} +567 -3
- package/dist/chunk-WCEF7H6L.js +221 -0
- package/dist/{chunk-2DIQQJCB.js → chunk-WEOMJHPV.js} +12 -12
- package/dist/{chunk-FHH4I4ZV.js → chunk-WFU77T3A.js} +12 -6
- package/dist/chunk-WIWTJMMR.js +292 -0
- package/dist/{chunk-2BFCZ3RK.js → chunk-WNTIOBOG.js} +18 -18
- package/dist/{chunk-7WD63HU2.js → chunk-X2CUXTWU.js} +6 -6
- package/dist/chunk-X7EMBM5X.js +34 -0
- package/dist/chunk-XEQCQO66.js +33 -0
- package/dist/{chunk-F7HYOUFF.js → chunk-XG4WJHLQ.js} +20 -4
- package/dist/{chunk-EFHQ3TWP.js → chunk-XOL3GFW2.js} +171 -31
- package/dist/{chunk-NE2W3OO7.js → chunk-XQ3YZ4QW.js} +22 -22
- package/dist/{chunk-CEXSU4S6.js → chunk-Y6K3CJBU.js} +723 -85
- package/dist/{chunk-4RS5KZQD.js → chunk-YAH5IQAL.js} +5 -5
- package/dist/{chunk-64EQYWCA.js → chunk-YBOVNMHC.js} +51 -14
- package/dist/chunk-YF5DZCPN.js +1212 -0
- package/dist/chunk-YIGBJNH4.js +37 -0
- package/dist/{chunk-BKVWTZ6A.js → chunk-YJ3TBOTK.js} +25 -25
- package/dist/{chunk-Q5AMFEWD.js → chunk-YKTE2RU3.js} +2 -2
- package/dist/{chunk-7EKXJZ2Y.js → chunk-YO2PKTXT.js} +296 -37
- package/dist/{chunk-6J5OKA4Y.js → chunk-YTTNTQOX.js} +15 -15
- package/dist/{chunk-OT2O76OS.js → chunk-YWAKDNMH.js} +183 -33
- package/dist/{chunk-R6XF6UR3.js → chunk-YZDZOEV4.js} +4 -4
- package/dist/chunk-Z3QFH7YG.js +17 -0
- package/dist/{chunk-W5BVQF44.js → chunk-Z6VLC5X4.js} +17 -17
- package/dist/{chunk-HLJAXMM4.js → chunk-ZFQMMU5Y.js} +2 -2
- package/dist/{chunk-W3BQAZ3Q.js → chunk-ZKYRDV7A.js} +12 -12
- package/dist/{chunk-ZMAINWBW.js → chunk-ZLS6PU2O.js} +3 -3
- package/dist/{chunk-ZVM6AKKM.js → chunk-ZOSD4FXV.js} +3 -3
- package/dist/chunk-ZPDDEVQX.js +47 -0
- package/dist/{chunk-TXLH6WHQ.js → chunk-ZQLRCA2V.js} +11 -11
- package/dist/{chunk-HITVBIJS.js → chunk-ZX7235KR.js} +128 -54
- package/dist/{chunk-GT4I4ZWM.js → chunk-ZZFHLRQW.js} +18 -16
- package/dist/files.json +636 -364
- package/dist/packages/naysayer/constitution/constitution.yaml +19 -0
- package/dist/packages/sdk/npm/index.js +5614 -2343
- package/dist/packages/ui/dist/assets/{elk-api-tma0MCuh.js → elk-api-CowTnhEJ.js} +2 -2
- package/dist/packages/ui/dist/assets/index-Dw20IRhQ.css +1 -0
- package/dist/packages/ui/dist/assets/index-z2wv0d5d.js +47 -0
- package/dist/packages/ui/dist/index.html +2 -2
- package/package.json +4 -4
- package/dist/chunk-2BF2EYJV.js +0 -174
- package/dist/chunk-42EVSKME.js +0 -37
- package/dist/chunk-4BKGMUIK.js +0 -53
- package/dist/chunk-5KLGBXG5.js +0 -48
- package/dist/chunk-6BNC6EQ4.js +0 -41
- package/dist/chunk-6D2CQ5II.js +0 -41
- package/dist/chunk-7AVHLZGD.js +0 -45
- package/dist/chunk-D46WUV3T.js +0 -33
- package/dist/chunk-E36QOJMD.js +0 -47
- package/dist/chunk-FQXYPF7E.js +0 -147
- package/dist/chunk-GBRFVT63.js +0 -45
- package/dist/chunk-ICY36XCH.js +0 -34
- package/dist/chunk-J4K3KVLD.js +0 -131
- package/dist/chunk-JZU3H6UQ.js +0 -54
- package/dist/chunk-NN2ZQEB4.js +0 -38
- package/dist/chunk-PCOCACY3.js +0 -385
- package/dist/chunk-RTEYOSJY.js +0 -29
- package/dist/chunk-RVH5SUW5.js +0 -69
- package/dist/chunk-VN3DP4LQ.js +0 -43
- package/dist/chunk-XPTOBS2D.js +0 -48
- package/dist/packages/ui/dist/assets/index-B54fm9FQ.js +0 -29
- 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
|
-
|
|
36
|
+
readPlanRelOf,
|
|
37
|
+
tokensWords
|
|
38
|
+
} from "./chunk-MD7KUEJ3.js";
|
|
11
39
|
import {
|
|
12
|
-
|
|
13
|
-
|
|
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-
|
|
55
|
+
} from "./chunk-3AQ2R5NL.js";
|
|
27
56
|
import {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
} from "./chunk-CKSITVS4.js";
|
|
57
|
+
readNeeds,
|
|
58
|
+
seedCollisions
|
|
59
|
+
} from "./chunk-BEPCKDCP.js";
|
|
32
60
|
import {
|
|
33
61
|
readChangeFiles
|
|
34
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
80
|
+
} from "./chunk-64AADMTW.js";
|
|
81
|
+
import {
|
|
82
|
+
baseClonePath
|
|
83
|
+
} from "./chunk-XOL3GFW2.js";
|
|
45
84
|
import {
|
|
46
85
|
stepClassOfNextStep
|
|
47
|
-
} from "./chunk-
|
|
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-
|
|
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
|
-
...
|
|
113
|
-
...
|
|
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
|
|
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
|
|
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) =>
|
|
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
|
-
...
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
296
|
-
|
|
297
|
-
|
|
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
|
|
368
|
-
|
|
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}
|
|
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(
|
|
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
|
|
426
|
-
const ofChanges = new Set(
|
|
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
|
|
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,
|