@maycombhq/atticus 2.0.0-beta.25 → 2.0.0-beta.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +3 -3
- package/dist/chunk-22A2K555.js +653 -0
- package/dist/{chunk-UTZMF5CV.js → chunk-23TTURB2.js} +1 -1
- package/dist/{chunk-F36DIKJ3.js → chunk-2666BPJE.js} +19 -19
- package/dist/{chunk-E2OP6JNF.js → chunk-2ALBHI4Q.js} +28 -27
- package/dist/chunk-2ANBMA74.js +107 -0
- package/dist/{chunk-S7UQFI4B.js → chunk-2HCW6HXK.js} +27 -26
- package/dist/{chunk-HV3KPEFH.js → chunk-2ISR6MWD.js} +15 -15
- package/dist/{chunk-QQD25YNF.js → chunk-2MRYL45Z.js} +50 -9
- package/dist/{chunk-KN4UQJ7R.js → chunk-3GNUHLAN.js} +4 -4
- package/dist/chunk-3GURU22K.js +44 -0
- package/dist/{chunk-4U3JLIRC.js → chunk-3M3MDBOG.js} +1 -1
- package/dist/{chunk-DJ4C5ELF.js → chunk-3PBIZBWN.js} +1 -1
- package/dist/{chunk-XUCHGEF5.js → chunk-3PWXVBCB.js} +83 -40
- package/dist/chunk-3W2QX6TT.js +58 -0
- package/dist/{chunk-CPFAWYVC.js → chunk-3Z7ATALI.js} +5 -5
- package/dist/{chunk-ZGULQAPZ.js → chunk-44SWXDD7.js} +8 -5
- package/dist/{chunk-LGE6H4UP.js → chunk-46N5O5H7.js} +5 -5
- package/dist/{chunk-SRLUADSY.js → chunk-4D4DNTFE.js} +4 -4
- package/dist/{chunk-DMQJDHXG.js → chunk-4EAT7HOX.js} +7 -5
- package/dist/{chunk-DPZD7WVX.js → chunk-4FLIW5PJ.js} +4 -4
- package/dist/{chunk-SGTAQNOP.js → chunk-4LWA5VMJ.js} +52 -37
- package/dist/{chunk-D45K3XKK.js → chunk-4ODVHNA6.js} +18 -17
- package/dist/{chunk-7QZDGM5V.js → chunk-4POSAXNC.js} +6 -6
- package/dist/{chunk-A3J75BO2.js → chunk-4PQ4KDOA.js} +16 -15
- package/dist/{chunk-2Y5FJQSF.js → chunk-4UVTNHA6.js} +1 -1
- package/dist/{chunk-KVVNAUIG.js → chunk-4XK3HLOH.js} +1 -0
- package/dist/{chunk-V7T6URII.js → chunk-523NRKHF.js} +4 -4
- package/dist/{chunk-7EAH2MFY.js → chunk-5GCCG3GJ.js} +11 -5
- package/dist/{chunk-7U6PBBXG.js → chunk-5XW6RUDV.js} +8 -8
- package/dist/{chunk-Y3J365UC.js → chunk-5YEUAZZE.js} +8 -8
- package/dist/{chunk-JWLABUXL.js → chunk-62LD7CSY.js} +13 -13
- package/dist/{chunk-LOJGNSPA.js → chunk-67Y2J55V.js} +22 -21
- package/dist/{chunk-UCKG6UE7.js → chunk-6DSZ4CL7.js} +37 -22
- package/dist/{chunk-FNP4M4VL.js → chunk-6G67LSBG.js} +283 -61
- package/dist/{chunk-5GLGLWAJ.js → chunk-6OEB4FTC.js} +20 -19
- package/dist/{chunk-5RKN5QIX.js → chunk-6OTGCKYH.js} +9 -9
- package/dist/{chunk-UI7ID4HG.js → chunk-6XLCMDIP.js} +13 -13
- package/dist/chunk-76DZJTU7.js +190 -0
- package/dist/chunk-7764GVJK.js +37 -0
- package/dist/{chunk-TKCNJJ2S.js → chunk-7BOGXFZ3.js} +11 -11
- package/dist/{chunk-Q52KWTG5.js → chunk-7CVHKNAF.js} +16 -15
- package/dist/{chunk-XF5UMMQL.js → chunk-7FEIS3KV.js} +25 -24
- package/dist/{chunk-UTYL4XVA.js → chunk-7GXM45T5.js} +26 -23
- package/dist/{chunk-4PW5SRKJ.js → chunk-7YMAMNMT.js} +17 -16
- package/dist/chunk-7YWS47SE.js +56 -0
- package/dist/{chunk-LZFKJ2BR.js → chunk-A3LVMCA5.js} +1 -1
- package/dist/{chunk-7YFUNWFM.js → chunk-A7ZJKLFC.js} +11 -11
- package/dist/chunk-AANQC5QP.js +47 -0
- package/dist/{chunk-LP5QGTCR.js → chunk-AIQLTDC3.js} +3 -3
- package/dist/{chunk-EPXYFJTY.js → chunk-AKZTCZ6F.js} +4 -4
- package/dist/{chunk-5267F4BS.js → chunk-ALCSTVWQ.js} +3 -3
- package/dist/{chunk-NMBHFSJQ.js → chunk-ALUHO7SE.js} +26 -25
- package/dist/{chunk-3WO7ASU7.js → chunk-AMZ4XMES.js} +8 -8
- package/dist/{chunk-JKEUPSCE.js → chunk-AOQG37K4.js} +8 -6
- package/dist/{chunk-3NA2VE45.js → chunk-ARXZTHEI.js} +16 -15
- package/dist/{chunk-W2W7YCFL.js → chunk-AS4CTARY.js} +16 -15
- package/dist/{chunk-7AKJ2XTW.js → chunk-AVUPW23W.js} +18 -17
- package/dist/{chunk-CMUJSPP4.js → chunk-B56FCIEJ.js} +12 -12
- package/dist/{chunk-K3OIBTCV.js → chunk-BABATPOZ.js} +18 -17
- package/dist/{chunk-VAZYNF6I.js → chunk-BIOKDLLX.js} +21 -19
- package/dist/{chunk-23QHP4JJ.js → chunk-BUBKKEUV.js} +5 -5
- package/dist/{chunk-N3OEBQTA.js → chunk-CDC6VECU.js} +3 -3
- package/dist/chunk-CHEFUNZ4.js +425 -0
- package/dist/{chunk-MM7YWUBB.js → chunk-CIFR3DPV.js} +6 -6
- package/dist/{chunk-JCKKAELC.js → chunk-CLBVKD4P.js} +16 -15
- package/dist/{chunk-HHZEXF7V.js → chunk-CLM5Z3R5.js} +5 -5
- package/dist/{chunk-M7XNX5IC.js → chunk-CLYV5MB6.js} +9 -9
- package/dist/{chunk-SHWHRCMU.js → chunk-CRYIBCGP.js} +37 -19
- package/dist/{chunk-6576X5BJ.js → chunk-D3L5SO27.js} +5 -5
- package/dist/chunk-DAZM2INZ.js +34 -0
- package/dist/{chunk-VBJHIRKV.js → chunk-DF4BXBB2.js} +6 -6
- package/dist/{chunk-U4HZ5CXL.js → chunk-E7Q52EOO.js} +11 -11
- package/dist/{chunk-MZTU5L6S.js → chunk-EFDUC35B.js} +3 -3
- package/dist/{chunk-GIOOA2ZO.js → chunk-EHXEJFHD.js} +5 -5
- package/dist/{chunk-M6HI36T3.js → chunk-ELJ5Q4J2.js} +2 -2
- package/dist/{chunk-MJAIBPI5.js → chunk-EM6DKBTJ.js} +3 -3
- package/dist/{chunk-YGS2YVF2.js → chunk-EMC46SU4.js} +38 -17
- package/dist/{chunk-CB6H7MH2.js → chunk-EQEDIWFQ.js} +25 -24
- package/dist/chunk-EW574EZI.js +57 -0
- package/dist/{chunk-JJEPU4VS.js → chunk-EYINWNXL.js} +5 -5
- package/dist/{chunk-MJOIMGS4.js → chunk-EYVYHYCA.js} +8 -8
- package/dist/{chunk-WGOQZ4PQ.js → chunk-F66542M6.js} +34 -9
- package/dist/{chunk-EUCATH2U.js → chunk-F74OMLNU.js} +6 -6
- package/dist/{chunk-G5P7F6RQ.js → chunk-FADIWOA5.js} +3 -3
- package/dist/{chunk-JMOZ6K5A.js → chunk-FC3ZVD3O.js} +3 -3
- package/dist/{chunk-XXJSGCDO.js → chunk-FG65LXED.js} +8 -8
- package/dist/{chunk-5WZV37WS.js → chunk-FKAUBC4Y.js} +8 -8
- package/dist/{chunk-WA644MUQ.js → chunk-FM3EEDS2.js} +15 -15
- package/dist/{chunk-XZQBFF65.js → chunk-FS4E7F6O.js} +403 -148
- package/dist/{chunk-Q6UYUCNS.js → chunk-FSYJPYLE.js} +16 -15
- package/dist/{chunk-H7GAPNGQ.js → chunk-G33UIUG3.js} +46 -20
- package/dist/{chunk-OEUTV6EL.js → chunk-G3F4BYML.js} +15 -14
- package/dist/{chunk-7UYRN4ON.js → chunk-GBJRFFDW.js} +5 -5
- package/dist/{chunk-7HW2CMIN.js → chunk-GF6GBHFN.js} +13 -11
- package/dist/{chunk-DCPI3ETH.js → chunk-GLHOUT5E.js} +26 -25
- package/dist/{chunk-VOBG7BLB.js → chunk-GM6GXO2A.js} +20 -19
- package/dist/{chunk-KJPKIU2R.js → chunk-GSJ2RXE7.js} +29 -28
- package/dist/{chunk-HU7VXMFV.js → chunk-GT72FDER.js} +6 -6
- package/dist/{chunk-SBNBVUOF.js → chunk-GW6ZH77P.js} +37 -36
- package/dist/{chunk-6WYOJCB4.js → chunk-GZILYRGC.js} +3 -3
- package/dist/{chunk-4SS5ZK47.js → chunk-GZSOZYEP.js} +3 -3
- package/dist/{chunk-N6SSI6XO.js → chunk-H25QNDKK.js} +58 -36
- package/dist/{chunk-DYVUNT4O.js → chunk-H3RKW4RF.js} +7 -7
- package/dist/chunk-H7M7ZH6H.js +52 -0
- package/dist/chunk-H7NRWSMP.js +55 -0
- package/dist/{chunk-KW4DIXUL.js → chunk-HDWVR5KD.js} +4 -4
- package/dist/{chunk-HR34F2AJ.js → chunk-HG24EF5S.js} +16 -15
- package/dist/chunk-HPNYSY5M.js +1068 -0
- package/dist/{chunk-3VC2XJ53.js → chunk-HUMM4S5I.js} +6 -6
- package/dist/{chunk-K373N5U6.js → chunk-HVPS2YCW.js} +11 -11
- package/dist/{chunk-IGOE6KPG.js → chunk-I34CXV2C.js} +185 -11
- package/dist/{chunk-U7YZ3IRI.js → chunk-I57IH5X6.js} +360 -271
- package/dist/{chunk-P56N3NPT.js → chunk-I5X4WU7U.js} +6 -6
- package/dist/chunk-IAVVJ34R.js +55 -0
- package/dist/chunk-IBJE2E2S.js +51 -0
- package/dist/{chunk-EXCXNDTQ.js → chunk-IF3X6FMO.js} +1 -1
- package/dist/{chunk-GAVEIYKH.js → chunk-IJHJIL6T.js} +154 -25
- package/dist/chunk-IM435QAM.js +72 -0
- package/dist/{chunk-7NLYSTEK.js → chunk-IMBJ7WAO.js} +6 -6
- package/dist/{chunk-EM7F6XEU.js → chunk-INCFIDCB.js} +2 -2
- package/dist/{chunk-AYWJMHSX.js → chunk-IPMPLTEG.js} +3 -3
- package/dist/{chunk-PGKCRK77.js → chunk-IPSZDVLI.js} +12 -12
- package/dist/{chunk-IMTAHDME.js → chunk-IX2EOYOU.js} +50 -13
- package/dist/{chunk-QE444DZ2.js → chunk-IXNMGPF7.js} +61 -28
- package/dist/{chunk-NL6GIEJU.js → chunk-J6GO3K7G.js} +19 -18
- package/dist/chunk-JBLM6IUA.js +42 -0
- package/dist/{chunk-IWQEZFVV.js → chunk-JL2VOYSL.js} +91 -93
- package/dist/{chunk-K77ILFUQ.js → chunk-JRXFZB6J.js} +8 -8
- package/dist/{chunk-UR6JGVX2.js → chunk-JTOLBS7R.js} +988 -410
- package/dist/{chunk-GD6FXN6R.js → chunk-K73BHPTQ.js} +19 -18
- package/dist/{chunk-PYVFLITV.js → chunk-KF7KVUNJ.js} +5 -5
- package/dist/{chunk-F4WKGX7K.js → chunk-KKUCBKJE.js} +20 -19
- package/dist/{chunk-U7F6E5M3.js → chunk-KLFFHBWG.js} +27 -26
- package/dist/{chunk-ROVOAF2O.js → chunk-KMYB2XO7.js} +21 -13
- package/dist/chunk-KNYQUWFN.js +52 -0
- package/dist/{chunk-KFDOL2Y4.js → chunk-KOAJPMU2.js} +31 -20
- package/dist/chunk-KRTSE73S.js +55 -0
- package/dist/{chunk-IW3QMW3X.js → chunk-L3AM5YRP.js} +28 -9
- package/dist/{chunk-334N6EI2.js → chunk-LCIIFAID.js} +22 -21
- package/dist/{chunk-DLNQ3HUM.js → chunk-LCQIRCOT.js} +55 -10
- package/dist/{chunk-QFOJ3UPU.js → chunk-LFHBAWIM.js} +13 -13
- package/dist/chunk-LIHEMWIT.js +39 -0
- package/dist/{chunk-T5QYYB5L.js → chunk-LJLYWILK.js} +14 -14
- package/dist/{chunk-E7PR4WMM.js → chunk-LNJKDS5C.js} +26 -25
- package/dist/{chunk-HHZ2ZKUD.js → chunk-LTHY7E2P.js} +16 -15
- package/dist/{chunk-4WIVTPGE.js → chunk-LTVOQJKT.js} +7 -7
- package/dist/{chunk-TIOYZDRB.js → chunk-LZO3JABE.js} +6 -6
- package/dist/{chunk-PXMV2LLY.js → chunk-M65AZ4ZE.js} +3 -5
- package/dist/chunk-MPNTEWNY.js +492 -0
- package/dist/chunk-MQGQ3AWK.js +58 -0
- package/dist/{chunk-NQLTWGF4.js → chunk-MUXYUIBV.js} +6 -6
- package/dist/{chunk-5R3FRI6H.js → chunk-MWRRJDXQ.js} +34 -31
- package/dist/{chunk-XY6FVBBV.js → chunk-MZDHFWTN.js} +2 -2
- package/dist/chunk-N2XCT5OX.js +68 -0
- package/dist/{chunk-C5LX54QK.js → chunk-N3JGYAMD.js} +15 -15
- package/dist/{chunk-RL7PETU6.js → chunk-N5DLB74D.js} +367 -71
- package/dist/{chunk-MJMEF7SD.js → chunk-NC3Q7RIB.js} +10 -10
- package/dist/{chunk-4GWQVT2C.js → chunk-NCNLX4DL.js} +19 -18
- package/dist/{chunk-3D74UADA.js → chunk-NGSGJLKW.js} +2 -2
- package/dist/{chunk-OOU4N2JQ.js → chunk-NN7K2LLN.js} +25 -24
- package/dist/{chunk-ELNIQYLR.js → chunk-NNURP7VO.js} +15 -15
- package/dist/chunk-NSQB24WR.js +56 -0
- package/dist/{chunk-MWOPED6I.js → chunk-NV5S63YK.js} +7 -7
- package/dist/{chunk-CTJHEG6A.js → chunk-NWMFVPEP.js} +2 -0
- package/dist/{chunk-7E3G5NCH.js → chunk-NYT6QGZA.js} +22 -18
- package/dist/chunk-OB2DAIJX.js +62 -0
- package/dist/{chunk-YAUMNRCB.js → chunk-OC3OXDTG.js} +13 -8
- package/dist/{chunk-DAHKLVHU.js → chunk-OD6RNYMQ.js} +16 -16
- package/dist/{chunk-7FUQAT2R.js → chunk-OFYBRMRG.js} +6 -6
- package/dist/chunk-OGTELPDN.js +43 -0
- package/dist/{chunk-BS52P2CM.js → chunk-OQ7SBQ2Z.js} +7 -7
- package/dist/{chunk-OMSH46JK.js → chunk-OUDGBJC2.js} +16 -9
- package/dist/{chunk-USH4VU5D.js → chunk-OUGTAOGA.js} +2 -2
- package/dist/chunk-OWP5FCYM.js +60 -0
- package/dist/{chunk-YEGGQG5E.js → chunk-P36PTWBM.js} +8 -8
- package/dist/{chunk-IKRM64KR.js → chunk-P6Y2J2QY.js} +12 -12
- package/dist/{chunk-P4QTTCVK.js → chunk-PDJL2HO5.js} +24 -22
- package/dist/{chunk-WDJGJ3HV.js → chunk-PPKH6ULR.js} +152 -20
- package/dist/{chunk-5OVSDV77.js → chunk-Q4PFF2ZE.js} +8 -8
- package/dist/chunk-Q7EUPQEG.js +5 -0
- package/dist/{chunk-YRKAJ42V.js → chunk-QC6GSNIK.js} +7074 -3456
- package/dist/chunk-QCRQNYGI.js +211 -0
- package/dist/chunk-QDF533AW.js +90 -0
- package/dist/chunk-QDGNDNBG.js +50 -0
- package/dist/{chunk-2ULVUSIP.js → chunk-QGMD3PYL.js} +31 -24
- package/dist/{chunk-QEP4HTJE.js → chunk-QLT3WYTD.js} +6 -6
- package/dist/{chunk-GX67TNFA.js → chunk-QNDMAKQS.js} +11 -3
- package/dist/{chunk-XM3JE4QY.js → chunk-QNXMVJMA.js} +8 -8
- package/dist/{chunk-XP5DF5MC.js → chunk-QPAANKUR.js} +13 -12
- package/dist/{chunk-SD3PGZSR.js → chunk-QS4VX3HZ.js} +1 -1
- package/dist/{chunk-ZD64ZR64.js → chunk-QSM4K6LI.js} +7 -7
- package/dist/{chunk-Z4N7BKLN.js → chunk-QUFZDWPC.js} +8 -8
- package/dist/{chunk-ELNLHU7Y.js → chunk-QXXEOH3A.js} +18 -6
- package/dist/{chunk-QA4O2GGC.js → chunk-R4TUWD4C.js} +17 -1
- package/dist/{chunk-TAIYQDIV.js → chunk-ROI64BAI.js} +22 -21
- package/dist/{chunk-NMGFXT4S.js → chunk-RPVL3RTX.js} +19 -18
- package/dist/{chunk-62FMA437.js → chunk-RUNHVUCW.js} +16 -15
- package/dist/{chunk-I2M7MXSV.js → chunk-RWYPLODE.js} +9 -9
- package/dist/{chunk-5K6ZKHZR.js → chunk-RZYRUXSU.js} +4 -4
- package/dist/{chunk-TVFADTAT.js → chunk-S6TLXRBR.js} +7 -7
- package/dist/{chunk-PCZ4C2V7.js → chunk-SCOP3J6X.js} +7 -7
- package/dist/{chunk-JXLUHMTC.js → chunk-SCP24MJX.js} +24 -23
- package/dist/{chunk-R6HJ4SDB.js → chunk-SF3HXNXR.js} +6 -6
- package/dist/{chunk-7F4GZ7U2.js → chunk-SFCFL7Y5.js} +1 -1
- package/dist/{chunk-5RDKQOY3.js → chunk-SHFY73RI.js} +53 -112
- package/dist/{chunk-H75SPCAW.js → chunk-SHIARIEZ.js} +20 -19
- package/dist/chunk-SMFFUFMN.js +1876 -0
- package/dist/{chunk-JQGWP3SC.js → chunk-SVOGRJO6.js} +197 -124
- package/dist/chunk-SVZAAOHJ.js +46 -0
- package/dist/{chunk-BJDVI5W6.js → chunk-SZOU32VF.js} +21 -20
- package/dist/{chunk-MXPKXCGP.js → chunk-T2MN24LZ.js} +1 -1
- package/dist/{chunk-A3AADMM2.js → chunk-TD5WWJLN.js} +6 -6
- package/dist/{chunk-SXF66YNZ.js → chunk-TFN2N227.js} +6 -6
- package/dist/{chunk-RSA5JJMN.js → chunk-TFXNOQEU.js} +28 -27
- package/dist/{chunk-BEDZNT62.js → chunk-TMETWJFO.js} +11 -11
- package/dist/chunk-TNSAIISO.js +50 -0
- package/dist/{chunk-IDTVBZQI.js → chunk-TRJO2I4S.js} +3 -3
- package/dist/{chunk-IFDCCCEN.js → chunk-TRSNIJNM.js} +7 -7
- package/dist/{chunk-GDGE7ZHC.js → chunk-U3Z2QZE3.js} +6 -6
- package/dist/{chunk-GVOQJPKA.js → chunk-U7L3ORPK.js} +22 -21
- package/dist/{chunk-5UJ7C7IH.js → chunk-UDM6HGF4.js} +6 -6
- package/dist/{chunk-Z3KEX7ON.js → chunk-UDM7LXNJ.js} +7 -7
- package/dist/chunk-UDTO3U6E.js +35 -0
- package/dist/{chunk-UVKJVTKX.js → chunk-UEUPEUZX.js} +3 -3
- package/dist/chunk-UWBODTY7.js +514 -0
- package/dist/{chunk-KGT5RIGE.js → chunk-UYYYQTPD.js} +84 -51
- package/dist/{chunk-LKRMVWXB.js → chunk-V34N6JAN.js} +32 -31
- package/dist/{chunk-RX56MZLX.js → chunk-V3Y5P7OS.js} +24 -23
- package/dist/chunk-V6MLVGTP.js +89 -0
- package/dist/chunk-VC2XHC7P.js +424 -0
- package/dist/{chunk-MM5OAVSW.js → chunk-VCYE4MUD.js} +29 -28
- package/dist/{chunk-AGAFNUYZ.js → chunk-VN2VJ6BV.js} +19 -15
- package/dist/{chunk-DBVQEPZB.js → chunk-VVLWEM2Y.js} +6 -6
- package/dist/{chunk-F56DNMDD.js → chunk-VWCNMDMZ.js} +5 -5
- package/dist/{chunk-LNGFTPU7.js → chunk-W2A4NHQD.js} +25 -24
- package/dist/{chunk-LQD3R6NZ.js → chunk-W6OY2PMB.js} +10 -10
- package/dist/{chunk-IP6TSICI.js → chunk-WC6DHBVG.js} +16 -15
- package/dist/{chunk-MELS6T5J.js → chunk-WCA3WIGG.js} +5 -5
- package/dist/{chunk-GLISHJ4G.js → chunk-WJWSB65O.js} +1602 -452
- package/dist/{chunk-77REYYY5.js → chunk-WNPGLGCJ.js} +5 -5
- package/dist/chunk-WTOVWEY3.js +67 -0
- package/dist/{chunk-WS7KBKP4.js → chunk-X5B7KYPD.js} +507 -20
- package/dist/{chunk-O6DJMDBR.js → chunk-X73WLHSN.js} +7 -7
- package/dist/{chunk-YGNQUFVZ.js → chunk-XIIT4PVT.js} +3 -3
- package/dist/{chunk-5P4PNGPL.js → chunk-XLTT5QCX.js} +28 -25
- package/dist/{chunk-NPZ4KXIV.js → chunk-XMIS25ZJ.js} +21 -20
- package/dist/{chunk-NB664KWQ.js → chunk-XPDQ4T6G.js} +27 -26
- package/dist/{chunk-EAGSM3XY.js → chunk-XRWUYOX3.js} +138 -22
- package/dist/{chunk-2VN4TLGI.js → chunk-XZY4GTCX.js} +14 -9
- package/dist/{chunk-QSKY7FE3.js → chunk-Y2TVTI4P.js} +121 -15
- package/dist/{chunk-XVQQ3BQS.js → chunk-Y2U4CSCA.js} +28 -27
- package/dist/chunk-Y2U63JKE.js +41 -0
- package/dist/{chunk-UJ535VWR.js → chunk-Y6S7VCYN.js} +6 -6
- package/dist/{chunk-SEBBJQWK.js → chunk-YAPMGK7E.js} +11 -11
- package/dist/{chunk-CNF7D3A7.js → chunk-YAPVAYZN.js} +3 -3
- package/dist/{chunk-B2U4AOZ5.js → chunk-YCBDNWX3.js} +78 -57
- package/dist/{chunk-CGVRLQAY.js → chunk-YIGSUTW2.js} +1329 -92
- package/dist/{chunk-J65TN6QU.js → chunk-YJTBE6AJ.js} +5 -5
- package/dist/chunk-YQ3IXQIH.js +185 -0
- package/dist/{chunk-ZJQ64T6M.js → chunk-YRHKEXTP.js} +11 -11
- package/dist/{chunk-MN2XDLDM.js → chunk-YSSFS3YC.js} +17 -17
- package/dist/{chunk-BPDS7KUR.js → chunk-YXG2VQJJ.js} +200 -56
- package/dist/{chunk-XC5ZDFW7.js → chunk-Z4GLFTEH.js} +8 -8
- package/dist/{chunk-7X3WLAKP.js → chunk-Z65FWO6A.js} +157 -89
- package/dist/{chunk-OW53P52N.js → chunk-ZDG637ZT.js} +22 -21
- package/dist/{chunk-BIQNPWGX.js → chunk-ZIAMPN7N.js} +6 -6
- package/dist/chunk-ZIIBQHCX.js +53 -0
- package/dist/{chunk-RFQW7XT3.js → chunk-ZJJMYPGZ.js} +57 -27
- package/dist/{chunk-Y6KPWRZJ.js → chunk-ZOAX7W5S.js} +11 -11
- package/dist/chunk-ZSSR5GGB.js +48 -0
- package/dist/files.json +655 -551
- package/dist/fixtures/forge/expected/crosscheck.json +726 -0
- package/dist/fixtures/forge/slots/README.md +13 -0
- package/dist/fixtures/forge/slots/build.json +2686 -0
- package/dist/fixtures/forge/slots/crosscheck/forge-ledger.crosscheck.yaml +8 -0
- package/dist/fixtures/forge/slots/facts/forge-ledger.jsonl +17 -0
- package/dist/fixtures/forge/slots/facts/forge-ledger.meta.json +9 -0
- package/dist/fixtures/forge/slots/legacy/joins.json +113 -0
- package/dist/fixtures/forge/slots/readers/forge-events.json +306 -0
- package/dist/fixtures/forge/slots/readers/forge-gateway.json +238 -0
- package/dist/fixtures/forge/slots/readers/forge-infra.json +264 -0
- package/dist/fixtures/forge/slots/readers/forge-ledger.json +756 -0
- package/dist/fixtures/forge/slots/readers/forge-portal-bff.json +349 -0
- package/dist/fixtures/forge/slots/readers/forge-portal-ui.json +214 -0
- package/dist/fixtures/forge/slots/readers/forge-reports-job.json +258 -0
- package/dist/packages/sdk/npm/index.js +3859 -2939
- package/dist/packages/ui/dist/assets/{elk-api-ts8TigYQ.js → elk-api-CPE6PVL8.js} +2 -2
- package/dist/packages/ui/dist/assets/index-BYcVqj0l.js +65 -0
- package/dist/packages/ui/dist/assets/index-DF52Ejvz.css +1 -0
- package/dist/packages/ui/dist/index.html +2 -2
- package/package.json +5 -5
- package/dist/chunk-24OXGB3P.js +0 -82
- package/dist/chunk-2RABF6RT.js +0 -36
- package/dist/chunk-5CPZIWIN.js +0 -38
- package/dist/chunk-7YSMZEO3.js +0 -55
- package/dist/chunk-AENMOZMM.js +0 -42
- package/dist/chunk-BDKYHCGI.js +0 -71
- package/dist/chunk-BMMTWRWE.js +0 -50
- package/dist/chunk-CQRFCWQV.js +0 -45
- package/dist/chunk-CVWKS6GO.js +0 -50
- package/dist/chunk-D2CGJ7RR.js +0 -46
- package/dist/chunk-D7QIZLWB.js +0 -38
- package/dist/chunk-DM3H4V2G.js +0 -62
- package/dist/chunk-EJGUEUXG.js +0 -51
- package/dist/chunk-ELKTDXV3.js +0 -67
- package/dist/chunk-EP7ZBZLT.js +0 -170
- package/dist/chunk-EXGXCVWC.js +0 -52
- package/dist/chunk-FJS2FZFZ.js +0 -41
- package/dist/chunk-G3ZFEHCX.js +0 -925
- package/dist/chunk-GAU2IFIC.js +0 -33
- package/dist/chunk-GPOL5H3B.js +0 -55
- package/dist/chunk-HD72AL3L.js +0 -43
- package/dist/chunk-K4C2DWOZ.js +0 -232
- package/dist/chunk-KY3BUZYI.js +0 -54
- package/dist/chunk-LMNCRSER.js +0 -257
- package/dist/chunk-LPXH2DA4.js +0 -40
- package/dist/chunk-MLUHBVCI.js +0 -45
- package/dist/chunk-ONB7M2AF.js +0 -52
- package/dist/chunk-QBK33722.js +0 -51
- package/dist/chunk-S7I7SLZN.js +0 -59
- package/dist/chunk-UCQB6NKS.js +0 -192
- package/dist/chunk-UKMA5JFE.js +0 -52
- package/dist/chunk-X7QLAUNS.js +0 -47
- package/dist/packages/ui/dist/assets/index-CIfmX7DJ.css +0 -1
- package/dist/packages/ui/dist/assets/index-DNtpSfZS.js +0 -63
|
@@ -10,22 +10,22 @@ import {
|
|
|
10
10
|
blockingIssues,
|
|
11
11
|
readStoreMarker,
|
|
12
12
|
readStoreVia
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-23TTURB2.js";
|
|
14
|
+
import {
|
|
15
|
+
outsideProfileSystems,
|
|
16
|
+
readCatalog
|
|
17
|
+
} from "./chunk-QC6GSNIK.js";
|
|
14
18
|
import {
|
|
15
19
|
AdapterError,
|
|
16
20
|
mergeBlockers,
|
|
17
21
|
requireApproval
|
|
18
|
-
} from "./chunk-
|
|
19
|
-
import {
|
|
20
|
-
outsideProfileSystems,
|
|
21
|
-
readCatalog
|
|
22
|
-
} from "./chunk-YRKAJ42V.js";
|
|
22
|
+
} from "./chunk-I57IH5X6.js";
|
|
23
23
|
import {
|
|
24
24
|
baseClonePath,
|
|
25
25
|
createGit,
|
|
26
26
|
readChangeRepos,
|
|
27
27
|
writeChangeRepos
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-X5B7KYPD.js";
|
|
29
29
|
import {
|
|
30
30
|
ChangeLifecycle,
|
|
31
31
|
ChangeTouches,
|
|
@@ -46,10 +46,10 @@ import {
|
|
|
46
46
|
specFlowFiles,
|
|
47
47
|
taskBranch,
|
|
48
48
|
toCanonicalYaml
|
|
49
|
-
} from "./chunk-
|
|
49
|
+
} from "./chunk-WJWSB65O.js";
|
|
50
50
|
import {
|
|
51
51
|
writeFileAtomic
|
|
52
|
-
} from "./chunk-
|
|
52
|
+
} from "./chunk-SMFFUFMN.js";
|
|
53
53
|
import {
|
|
54
54
|
ChangeArtifact,
|
|
55
55
|
Finding,
|
|
@@ -62,7 +62,7 @@ import {
|
|
|
62
62
|
fastPathOf,
|
|
63
63
|
loadOpenSpecSettings,
|
|
64
64
|
loadOrgPack
|
|
65
|
-
} from "./chunk-
|
|
65
|
+
} from "./chunk-A3LVMCA5.js";
|
|
66
66
|
import {
|
|
67
67
|
require_dist
|
|
68
68
|
} from "./chunk-BQGDB6ZL.js";
|
|
@@ -1463,8 +1463,46 @@ function testPlanFor(ctx, type, risk) {
|
|
|
1463
1463
|
// packages/changes/dist/lifecycle.js
|
|
1464
1464
|
var import_yaml5 = __toESM(require_dist(), 1);
|
|
1465
1465
|
import { createHash } from "node:crypto";
|
|
1466
|
-
import { readdir as
|
|
1467
|
-
import { join as
|
|
1466
|
+
import { readdir as readdir5, readFile as readFile7 } from "node:fs/promises";
|
|
1467
|
+
import { join as join8 } from "node:path";
|
|
1468
|
+
|
|
1469
|
+
// packages/changes/dist/planning.js
|
|
1470
|
+
import { copyFile, mkdir, readdir as readdir4, readFile as readFile6 } from "node:fs/promises";
|
|
1471
|
+
import { dirname, join as join7 } from "node:path";
|
|
1472
|
+
var GENERATED_MARK = "<!-- Generated by atticus plan";
|
|
1473
|
+
var PLANNING_FILES = ["stories.md", "tasks.md", "requests.md"];
|
|
1474
|
+
var isGenerated = (text) => text.replace(/^\uFEFF/, "").trimStart().startsWith(GENERATED_MARK);
|
|
1475
|
+
async function personWritten(dir, rels) {
|
|
1476
|
+
const own = [];
|
|
1477
|
+
for (const rel of rels) {
|
|
1478
|
+
const text = await readFile6(join7(dir, ...rel.split("/")), "utf8").catch(() => void 0);
|
|
1479
|
+
if (text !== void 0 && !isGenerated(text))
|
|
1480
|
+
own.push(rel);
|
|
1481
|
+
}
|
|
1482
|
+
return own;
|
|
1483
|
+
}
|
|
1484
|
+
async function keepPersonWritten(dir, rel, stage, files, o = {}) {
|
|
1485
|
+
if (!files.length)
|
|
1486
|
+
return void 0;
|
|
1487
|
+
const base = join7(dir, "stage", `${stage}-by-person`);
|
|
1488
|
+
const taken = (await readdir4(base).catch(() => [])).map((n2) => Number(n2)).filter((n2) => Number.isInteger(n2) && n2 > 0);
|
|
1489
|
+
const n = Math.max(Math.max(0, ...taken) + 1, Math.floor(o.atLeast ?? 1));
|
|
1490
|
+
for (const f of files) {
|
|
1491
|
+
const dest = join7(base, String(n), ...f.split("/"));
|
|
1492
|
+
await mkdir(dirname(dest), { recursive: true });
|
|
1493
|
+
await copyFile(join7(dir, ...f.split("/")), dest).catch((e) => {
|
|
1494
|
+
if (e.code !== "ENOENT")
|
|
1495
|
+
throw e;
|
|
1496
|
+
});
|
|
1497
|
+
}
|
|
1498
|
+
return `${rel}/stage/${stage}-by-person/${n}/`;
|
|
1499
|
+
}
|
|
1500
|
+
var personWrittenPlanning = (dir) => personWritten(dir, PLANNING_FILES);
|
|
1501
|
+
var writesPlanning = (step) => step.artifacts.includes("stories") || step.artifacts.includes("tasks");
|
|
1502
|
+
var stageWorkDone = (state) => state === "done" || state === "person";
|
|
1503
|
+
var stageIdle = (state) => state === "not-started" || state === "skipped";
|
|
1504
|
+
|
|
1505
|
+
// packages/changes/dist/lifecycle.js
|
|
1468
1506
|
function phaseState(phase) {
|
|
1469
1507
|
return phase === "release" ? "release-ready" : phase;
|
|
1470
1508
|
}
|
|
@@ -1529,7 +1567,7 @@ async function phaseStage(ctx, change, phase) {
|
|
|
1529
1567
|
return void 0;
|
|
1530
1568
|
const dir = changeFolder(ctx.root, change.id);
|
|
1531
1569
|
for (const x of ctx.policy.stages)
|
|
1532
|
-
if (await
|
|
1570
|
+
if (await readFile7(join8(dir, ...x.loop.split("/"))).then(() => true, () => false))
|
|
1533
1571
|
return step;
|
|
1534
1572
|
return void 0;
|
|
1535
1573
|
}
|
|
@@ -1538,9 +1576,12 @@ async function checkStage(root, change, step) {
|
|
|
1538
1576
|
const dir = changeFolder(root, change.id);
|
|
1539
1577
|
const run = stageCommand(step, change.id);
|
|
1540
1578
|
const reason = (message) => [{ code: "stage-not-done", message }];
|
|
1541
|
-
const text = await
|
|
1542
|
-
if (text === void 0)
|
|
1579
|
+
const text = await readFile7(join8(dir, ...step.loop.split("/")), "utf8").catch(() => void 0);
|
|
1580
|
+
if (text === void 0) {
|
|
1581
|
+
if (writesPlanning(step) && (await personWrittenPlanning(dir)).length)
|
|
1582
|
+
return [];
|
|
1543
1583
|
return reason(`The ${step.stage} stage hasn't run yet: run ${run}.`);
|
|
1584
|
+
}
|
|
1544
1585
|
let loop;
|
|
1545
1586
|
try {
|
|
1546
1587
|
loop = (0, import_yaml5.parse)(text);
|
|
@@ -1572,7 +1613,7 @@ async function checkStage(root, change, step) {
|
|
|
1572
1613
|
const out = [];
|
|
1573
1614
|
const artifactFile = new Set(Object.values(FILE));
|
|
1574
1615
|
for (const w of step.writes.filter((x) => !x.endsWith("/") && !x.startsWith("stage/") && !isWritePattern(x) && !artifactFile.has(x)))
|
|
1575
|
-
if (!await
|
|
1616
|
+
if (!await readFile7(join8(dir, ...w.split("/"))).then(() => true, () => false))
|
|
1576
1617
|
out.push(...reason(`${w} is missing, though the ${step.stage} stage is done: run ${run} again.`));
|
|
1577
1618
|
return out;
|
|
1578
1619
|
}
|
|
@@ -1584,7 +1625,7 @@ async function stageFiles(dir, step) {
|
|
|
1584
1625
|
else if (isWritePattern(w)) {
|
|
1585
1626
|
const parent = w.split("/").slice(0, -1).join("/");
|
|
1586
1627
|
out.push(...(await walk(dir, parent)).filter((p) => writeMatches(w, p)));
|
|
1587
|
-
} else if (await
|
|
1628
|
+
} else if (await readFile7(join8(dir, ...w.split("/"))).then(() => true, () => false))
|
|
1588
1629
|
out.push(w);
|
|
1589
1630
|
}
|
|
1590
1631
|
return [...new Set(out)].sort();
|
|
@@ -1592,7 +1633,7 @@ async function stageFiles(dir, step) {
|
|
|
1592
1633
|
async function walk(dir, rel = "") {
|
|
1593
1634
|
let entries;
|
|
1594
1635
|
try {
|
|
1595
|
-
entries = await
|
|
1636
|
+
entries = await readdir5(join8(dir, rel), { withFileTypes: true });
|
|
1596
1637
|
} catch {
|
|
1597
1638
|
return [];
|
|
1598
1639
|
}
|
|
@@ -1615,7 +1656,7 @@ async function artifactFiles(dir, artifact) {
|
|
|
1615
1656
|
}
|
|
1616
1657
|
const f = `${artifact}.md`;
|
|
1617
1658
|
try {
|
|
1618
|
-
await
|
|
1659
|
+
await readFile7(join8(dir, f));
|
|
1619
1660
|
return [f];
|
|
1620
1661
|
} catch {
|
|
1621
1662
|
return [];
|
|
@@ -1634,6 +1675,9 @@ var FILE = {
|
|
|
1634
1675
|
tasks: "tasks.md",
|
|
1635
1676
|
snow: "snow.md"
|
|
1636
1677
|
};
|
|
1678
|
+
async function artifactWritten(root, change, artifact) {
|
|
1679
|
+
return (await checkArtifacts(root, { id: change }, [artifact])).length === 0;
|
|
1680
|
+
}
|
|
1637
1681
|
async function checkArtifacts(root, change, artifacts) {
|
|
1638
1682
|
const dir = changeFolder(root, change.id);
|
|
1639
1683
|
const reasons = [];
|
|
@@ -1645,7 +1689,7 @@ async function checkArtifacts(root, change, artifacts) {
|
|
|
1645
1689
|
reasons.push({ code: "missing-artifact", artifact: a, message: `${FILE[a]} is missing.` });
|
|
1646
1690
|
continue;
|
|
1647
1691
|
}
|
|
1648
|
-
const texts = await Promise.all(files.map((f) =>
|
|
1692
|
+
const texts = await Promise.all(files.map((f) => readFile7(join8(dir, f), "utf8")));
|
|
1649
1693
|
if (!texts.some(isFilled)) {
|
|
1650
1694
|
reasons.push({
|
|
1651
1695
|
code: "unfilled-artifact",
|
|
@@ -1659,25 +1703,25 @@ async function checkArtifacts(root, change, artifacts) {
|
|
|
1659
1703
|
async function checkFindings(root, change, gates) {
|
|
1660
1704
|
const reasons = [];
|
|
1661
1705
|
for (const gate of gates) {
|
|
1662
|
-
const base =
|
|
1706
|
+
const base = join8(changeFolder(root, change.id), "review", gate);
|
|
1663
1707
|
let rounds;
|
|
1664
1708
|
try {
|
|
1665
|
-
rounds = (await
|
|
1709
|
+
rounds = (await readdir5(base, { withFileTypes: true })).filter((d) => d.isDirectory() && /^\d+$/.test(d.name)).map((d) => Number(d.name));
|
|
1666
1710
|
} catch {
|
|
1667
1711
|
continue;
|
|
1668
1712
|
}
|
|
1669
1713
|
if (rounds.length === 0)
|
|
1670
1714
|
continue;
|
|
1671
1715
|
const round2 = Math.max(...rounds);
|
|
1672
|
-
const dir =
|
|
1673
|
-
const files = (await
|
|
1716
|
+
const dir = join8(base, String(round2));
|
|
1717
|
+
const files = (await readdir5(dir)).filter((f) => /\.ya?ml$/.test(f)).sort();
|
|
1674
1718
|
const unfinished = {
|
|
1675
1719
|
code: "round-unfinished",
|
|
1676
1720
|
message: `Critic round ${round2} on the ${gate} gate didn't finish: run atticus critic ${change.id} --gate ${gate} again.`
|
|
1677
1721
|
};
|
|
1678
1722
|
let hasMeta = false;
|
|
1679
1723
|
try {
|
|
1680
|
-
const meta = (0, import_yaml5.parse)(await
|
|
1724
|
+
const meta = (0, import_yaml5.parse)(await readFile7(join8(dir, "meta", "round.yaml"), "utf8"));
|
|
1681
1725
|
hasMeta = true;
|
|
1682
1726
|
if (meta?.state === "in-progress") {
|
|
1683
1727
|
reasons.push(unfinished);
|
|
@@ -1704,7 +1748,7 @@ async function checkFindings(root, change, gates) {
|
|
|
1704
1748
|
const rel = `review/${gate}/${round2}/${f}`;
|
|
1705
1749
|
let data;
|
|
1706
1750
|
try {
|
|
1707
|
-
data = (0, import_yaml5.parse)(await
|
|
1751
|
+
data = (0, import_yaml5.parse)(await readFile7(join8(dir, f), "utf8"));
|
|
1708
1752
|
} catch {
|
|
1709
1753
|
data = void 0;
|
|
1710
1754
|
}
|
|
@@ -1752,7 +1796,7 @@ function mandatoryGates(ctx) {
|
|
|
1752
1796
|
async function checkMandatoryRounds(root, change, gates) {
|
|
1753
1797
|
const reasons = [];
|
|
1754
1798
|
for (const gate of gates) {
|
|
1755
|
-
const rounds = await
|
|
1799
|
+
const rounds = await readdir5(join8(changeFolder(root, change.id), "review", gate), {
|
|
1756
1800
|
withFileTypes: true
|
|
1757
1801
|
}).then((ds) => ds.filter((d) => d.isDirectory() && /^\d+$/.test(d.name)), () => []);
|
|
1758
1802
|
if (rounds.length === 0)
|
|
@@ -1780,15 +1824,31 @@ function sha256(text) {
|
|
|
1780
1824
|
|
|
1781
1825
|
// packages/changes/dist/progress.js
|
|
1782
1826
|
var import_yaml6 = __toESM(require_dist(), 1);
|
|
1783
|
-
import { readFile as
|
|
1784
|
-
import { join as
|
|
1827
|
+
import { readFile as readFile8 } from "node:fs/promises";
|
|
1828
|
+
import { join as join9 } from "node:path";
|
|
1829
|
+
function phaseIndex(state) {
|
|
1830
|
+
if (state === "draft" || state === "returned")
|
|
1831
|
+
return 0;
|
|
1832
|
+
if (state === "release-ready")
|
|
1833
|
+
return PHASES.indexOf("release");
|
|
1834
|
+
const i = PHASES.indexOf(state);
|
|
1835
|
+
return i >= 0 ? i : PHASES.length;
|
|
1836
|
+
}
|
|
1785
1837
|
async function stageCompletion(ctx, change) {
|
|
1786
1838
|
const dir = changeFolder(ctx.root, change.id);
|
|
1787
1839
|
const out = [];
|
|
1788
1840
|
for (const s of ctx.policy.stages) {
|
|
1789
|
-
const text = await
|
|
1841
|
+
const text = await readFile8(join9(dir, ...s.loop.split("/")), "utf8").catch(() => void 0);
|
|
1790
1842
|
let state = "not-started";
|
|
1791
|
-
if (text
|
|
1843
|
+
if (text === void 0) {
|
|
1844
|
+
const own = writesPlanning(s) ? await personWrittenPlanning(dir) : [];
|
|
1845
|
+
if (own.length) {
|
|
1846
|
+
out.push({ stage: s.stage, phase: s.phase, state: "person", files: own });
|
|
1847
|
+
continue;
|
|
1848
|
+
}
|
|
1849
|
+
if (change.state && phaseIndex(change.state) > PHASES.indexOf(s.phase))
|
|
1850
|
+
state = "skipped";
|
|
1851
|
+
} else {
|
|
1792
1852
|
try {
|
|
1793
1853
|
const y = (0, import_yaml6.parse)(text);
|
|
1794
1854
|
state = typeof y?.state === "string" ? y.state : "unknown";
|
|
@@ -1803,7 +1863,7 @@ async function stageCompletion(ctx, change) {
|
|
|
1803
1863
|
var cap = (s) => s.charAt(0).toUpperCase() + s.slice(1);
|
|
1804
1864
|
var and = (xs) => xs.length <= 1 ? xs[0] ?? "" : `${xs.slice(0, -1).join(", ")} and ${xs.at(-1)}`;
|
|
1805
1865
|
function workProgress(type, state, stages, raised = false) {
|
|
1806
|
-
if (stages.every((s) => s.state
|
|
1866
|
+
if (stages.every((s) => stageIdle(s.state)))
|
|
1807
1867
|
return void 0;
|
|
1808
1868
|
const phase = state === "returned" ? type.phases[0] : statePhase(state);
|
|
1809
1869
|
if (!phase)
|
|
@@ -1812,21 +1872,22 @@ function workProgress(type, state, stages, raised = false) {
|
|
|
1812
1872
|
const own = stages.filter((s) => type.phases.includes(s.phase));
|
|
1813
1873
|
if (own.length && own.every((s) => type.phases.indexOf(s.phase) < at))
|
|
1814
1874
|
return void 0;
|
|
1815
|
-
const done = own.filter((s) => s.state
|
|
1816
|
-
const ahead = own.filter((s) => s.state
|
|
1875
|
+
const done = own.filter((s) => stageWorkDone(s.state)).map((s) => s.stage);
|
|
1876
|
+
const ahead = own.filter((s) => stageWorkDone(s.state) && type.phases.indexOf(s.phase) > at).map((s) => s.phase);
|
|
1817
1877
|
const current = own.find((s) => s.phase === phase);
|
|
1818
|
-
const under = own.find((s) => s.state
|
|
1819
|
-
const last = own.filter((s) => s.state
|
|
1878
|
+
const under = own.find((s) => !stageWorkDone(s.state) && !stageIdle(s.state));
|
|
1879
|
+
const last = own.filter((s) => stageWorkDone(s.state)).at(-1);
|
|
1880
|
+
const said = (s) => s.state === "person" ? `${s.stage} (written by a person)` : s.stage;
|
|
1820
1881
|
const name = handoffName(type, phase);
|
|
1821
1882
|
let summary;
|
|
1822
1883
|
if (under)
|
|
1823
1884
|
summary = `The ${under.stage} stage is ${under.state === "questions" ? "waiting on answers" : under.state}${done.length ? ` (${and(done)} done)` : ""}; the change is in ${state}.`;
|
|
1824
|
-
else if (!current || current.state
|
|
1885
|
+
else if (!current || !stageWorkDone(current.state))
|
|
1825
1886
|
summary = `${done.length ? `${cap(and(done))} done; ` : ""}the ${current?.stage ?? phase} stage hasn't run yet; the change is in ${state}.`;
|
|
1826
1887
|
else if (ahead.length)
|
|
1827
|
-
summary = `${cap(last
|
|
1888
|
+
summary = `${cap(said(last))} done; the change is still in ${state}: ${raised ? "merge" : "raise"} "${name}" (the ${phase} hand-off), then the ${and(ahead)} hand-offs.`;
|
|
1828
1889
|
else
|
|
1829
|
-
summary = `${cap(current
|
|
1890
|
+
summary = `${cap(said(current))} done; waiting on "${name}" (the ${phase} hand-off${raised ? " PR to merge" : ", not raised yet"}).`;
|
|
1830
1891
|
return { done, ahead, summary };
|
|
1831
1892
|
}
|
|
1832
1893
|
|
|
@@ -1847,20 +1908,20 @@ function prApprovers(handoff2, approvers) {
|
|
|
1847
1908
|
}
|
|
1848
1909
|
|
|
1849
1910
|
// packages/changes/dist/assess.js
|
|
1850
|
-
import { readFile as
|
|
1851
|
-
import { join as
|
|
1911
|
+
import { readFile as readFile11 } from "node:fs/promises";
|
|
1912
|
+
import { join as join12 } from "node:path";
|
|
1852
1913
|
|
|
1853
1914
|
// packages/changes/dist/release-prs.js
|
|
1854
1915
|
var import_yaml8 = __toESM(require_dist(), 1);
|
|
1855
|
-
import { readFile as
|
|
1916
|
+
import { readFile as readFile10, writeFile } from "node:fs/promises";
|
|
1856
1917
|
import { existsSync as existsSync2 } from "node:fs";
|
|
1857
|
-
import { join as
|
|
1918
|
+
import { join as join11 } from "node:path";
|
|
1858
1919
|
|
|
1859
1920
|
// packages/changes/dist/task-branches.js
|
|
1860
1921
|
var import_yaml7 = __toESM(require_dist(), 1);
|
|
1861
1922
|
import { existsSync } from "node:fs";
|
|
1862
|
-
import { readdir as
|
|
1863
|
-
import { join as
|
|
1923
|
+
import { readdir as readdir6, readFile as readFile9 } from "node:fs/promises";
|
|
1924
|
+
import { join as join10 } from "node:path";
|
|
1864
1925
|
var TASK_DECISION_FILE = "decision.yaml";
|
|
1865
1926
|
var TaskDecision = external_exports.strictObject({
|
|
1866
1927
|
schemaVersion: external_exports.literal(1),
|
|
@@ -1873,12 +1934,12 @@ var TaskDecision = external_exports.strictObject({
|
|
|
1873
1934
|
reason: external_exports.string().min(1)
|
|
1874
1935
|
});
|
|
1875
1936
|
async function taskRefs(root, id) {
|
|
1876
|
-
const dir =
|
|
1937
|
+
const dir = join10(changeFolder(root, id), "tasks");
|
|
1877
1938
|
const out = [];
|
|
1878
|
-
for (const d of await
|
|
1939
|
+
for (const d of await readdir6(dir, { withFileTypes: true }).catch(() => [])) {
|
|
1879
1940
|
if (!d.isDirectory())
|
|
1880
1941
|
continue;
|
|
1881
|
-
const text = await
|
|
1942
|
+
const text = await readFile9(join10(dir, d.name, "task-run.yaml"), "utf8").catch(() => void 0);
|
|
1882
1943
|
let y;
|
|
1883
1944
|
try {
|
|
1884
1945
|
y = text ? (0, import_yaml7.parse)(text) : void 0;
|
|
@@ -1906,7 +1967,7 @@ async function taskRefs(root, id) {
|
|
|
1906
1967
|
return out;
|
|
1907
1968
|
}
|
|
1908
1969
|
function repoDir(root, r) {
|
|
1909
|
-
const dirs = [
|
|
1970
|
+
const dirs = [join10(root, r.worktree)];
|
|
1910
1971
|
try {
|
|
1911
1972
|
dirs.push(baseClonePath(root, r.id));
|
|
1912
1973
|
} catch {
|
|
@@ -1914,7 +1975,7 @@ function repoDir(root, r) {
|
|
|
1914
1975
|
return dirs.find((d) => existsSync(d));
|
|
1915
1976
|
}
|
|
1916
1977
|
async function readTaskDecision(root, id, task) {
|
|
1917
|
-
const text = await
|
|
1978
|
+
const text = await readFile9(join10(changeFolder(root, id), "tasks", task, TASK_DECISION_FILE), "utf8").catch(() => void 0);
|
|
1918
1979
|
if (text === void 0)
|
|
1919
1980
|
return void 0;
|
|
1920
1981
|
try {
|
|
@@ -2031,7 +2092,7 @@ async function recordTaskDecision(root, id, task, o) {
|
|
|
2031
2092
|
at: o.at,
|
|
2032
2093
|
reason
|
|
2033
2094
|
});
|
|
2034
|
-
await writeFileAtomic(
|
|
2095
|
+
await writeFileAtomic(join10(changeFolder(root, id), "tasks", task, TASK_DECISION_FILE), toCanonicalYaml(d, ["schemaVersion", "task", "branch", "commit"]));
|
|
2035
2096
|
return d;
|
|
2036
2097
|
}
|
|
2037
2098
|
|
|
@@ -2066,7 +2127,7 @@ var NothingFile = external_exports.strictObject({
|
|
|
2066
2127
|
});
|
|
2067
2128
|
async function readReleaseFile(root, id) {
|
|
2068
2129
|
const empty = { schemaVersion: 1, nothingToRelease: [] };
|
|
2069
|
-
const text = await
|
|
2130
|
+
const text = await readFile10(join11(changeFolder(root, id), RELEASE_PRS_FILE), "utf8").catch(() => void 0);
|
|
2070
2131
|
if (text === void 0)
|
|
2071
2132
|
return empty;
|
|
2072
2133
|
try {
|
|
@@ -2081,14 +2142,14 @@ async function readNothing(root, id) {
|
|
|
2081
2142
|
}
|
|
2082
2143
|
async function writeReleaseFile(root, id, nothing, merged) {
|
|
2083
2144
|
const byRepo = (xs) => [...xs].sort((a, b) => a.repo < b.repo ? -1 : a.repo > b.repo ? 1 : 0);
|
|
2084
|
-
await writeFile(
|
|
2145
|
+
await writeFile(join11(changeFolder(root, id), RELEASE_PRS_FILE), toCanonicalYaml(NothingFile.parse({
|
|
2085
2146
|
schemaVersion: 1,
|
|
2086
2147
|
nothingToRelease: byRepo(nothing),
|
|
2087
2148
|
...merged.length ? { merged: byRepo(merged) } : {}
|
|
2088
2149
|
})), "utf8");
|
|
2089
2150
|
}
|
|
2090
2151
|
function repoDir2(root, r) {
|
|
2091
|
-
const dirs = [
|
|
2152
|
+
const dirs = [join11(root, r.worktree)];
|
|
2092
2153
|
try {
|
|
2093
2154
|
dirs.push(baseClonePath(root, r.id));
|
|
2094
2155
|
} catch {
|
|
@@ -2259,7 +2320,7 @@ async function raiseReleasePrs(root, id, o) {
|
|
|
2259
2320
|
continue;
|
|
2260
2321
|
}
|
|
2261
2322
|
const notes = movedOn ? [movedOn] : [];
|
|
2262
|
-
const dir =
|
|
2323
|
+
const dir = join11(root, r.worktree);
|
|
2263
2324
|
if (existsSync2(dir)) {
|
|
2264
2325
|
const onHost = await git(["ls-remote", "--heads", remote, `refs/heads/${r.branch}`], dir).then((x) => x.stdout.trim() ? "yes" : "no").catch((e) => {
|
|
2265
2326
|
notes.push(`Atticus couldn't reach ${remote} (${firstLine(e)}): push ${r.branch} yourself if the host lacks it.`);
|
|
@@ -2447,7 +2508,7 @@ function buildOf(pr) {
|
|
|
2447
2508
|
return "passed";
|
|
2448
2509
|
}
|
|
2449
2510
|
async function requireMergedPrs(root) {
|
|
2450
|
-
const text = await
|
|
2511
|
+
const text = await readFile10(join11(orgPackDirOf(root), "process", "ci.yaml"), "utf8").catch(() => void 0);
|
|
2451
2512
|
if (text === void 0)
|
|
2452
2513
|
return true;
|
|
2453
2514
|
try {
|
|
@@ -2580,43 +2641,45 @@ async function changeReport(root, id) {
|
|
|
2580
2641
|
const ctx = await loadChangeContext(root);
|
|
2581
2642
|
const a = await assess(ctx, await changeStore(root).read(id));
|
|
2582
2643
|
const tasks = a.phase === "build" ? await taskTicks(root, id) : void 0;
|
|
2583
|
-
|
|
2644
|
+
const next = nextStep(a, tasks);
|
|
2645
|
+
return { ...a, nextStep: next.text, ready: next.ready, problems: ctx.problems };
|
|
2584
2646
|
}
|
|
2585
2647
|
async function taskTicks(root, id) {
|
|
2586
|
-
const text = await
|
|
2648
|
+
const text = await readFile11(join12(changeFolder(root, id), "tasks.md"), "utf8").catch(() => "");
|
|
2587
2649
|
const boxes = [...text.matchAll(/^\s*[-*]\s+\[([ xX])\]/gm)].map((m) => m[1] !== " ");
|
|
2588
2650
|
return boxes.length ? { done: boxes.filter(Boolean).length, total: boxes.length } : void 0;
|
|
2589
2651
|
}
|
|
2590
2652
|
function nextStep(a, tasks) {
|
|
2653
|
+
const not = (text) => ({ text, ready: false });
|
|
2591
2654
|
switch (a.state) {
|
|
2592
2655
|
case "draft":
|
|
2593
|
-
return "Create the change with atticus change new.";
|
|
2656
|
+
return not("Create the change with atticus change new.");
|
|
2594
2657
|
case "archived":
|
|
2595
|
-
return "Nothing: the change is archived.";
|
|
2658
|
+
return not("Nothing: the change is archived.");
|
|
2596
2659
|
case "released":
|
|
2597
|
-
return "Archive the change.";
|
|
2660
|
+
return not("Archive the change.");
|
|
2598
2661
|
case "post-release-review":
|
|
2599
|
-
return a.reasons.length ? "Resolve the post-release review findings, then archive the change." : "Review the skipped lenses, then archive the change.";
|
|
2662
|
+
return not(a.reasons.length ? "Resolve the post-release review findings, then archive the change." : "Review the skipped lenses, then archive the change.");
|
|
2600
2663
|
case "returned":
|
|
2601
|
-
return `Revise the work, then hand off ${a.phase} again
|
|
2664
|
+
return not(`Revise the work, then hand off ${a.phase} again.`);
|
|
2602
2665
|
}
|
|
2603
2666
|
const name = handoffName(a.type, a.phase);
|
|
2604
2667
|
if (!a.handoff) {
|
|
2605
2668
|
if (!a.blockers.length && tasks && tasks.done < tasks.total)
|
|
2606
|
-
return `Finish the ${a.phase} work (${tasks.done} of ${tasks.total} tasks ticked in tasks.md), then raise "${name}"
|
|
2607
|
-
return a.blockers.length ? `Finish the ${a.phase} work, then raise "${name}".` : `Ready to raise "${name}"
|
|
2669
|
+
return not(`Finish the ${a.phase} work (${tasks.done} of ${tasks.total} tasks ticked in tasks.md), then raise "${name}".`);
|
|
2670
|
+
return a.blockers.length ? not(`Finish the ${a.phase} work, then raise "${name}".`) : { text: `Ready to raise "${name}".`, ready: true };
|
|
2608
2671
|
}
|
|
2609
2672
|
if (a.handoff.state === "changes-requested")
|
|
2610
|
-
return `Update the artifacts and hand off again on PR #${a.handoff.pr.number}
|
|
2673
|
+
return not(`Update the artifacts and hand off again on PR #${a.handoff.pr.number}.`);
|
|
2611
2674
|
if (isManualPrUrl(a.handoff.pr.url))
|
|
2612
|
-
return manualHandoffWords(a.handoff.phase);
|
|
2613
|
-
return `Merge PR #${a.handoff.pr.number} once it is approved (${a.handoff.pr.url}); syncing then moves the change on
|
|
2675
|
+
return not(manualHandoffWords(a.handoff.phase));
|
|
2676
|
+
return not(`Merge PR #${a.handoff.pr.number} once it is approved (${a.handoff.pr.url}); syncing then moves the change on.`);
|
|
2614
2677
|
}
|
|
2615
2678
|
|
|
2616
2679
|
// packages/changes/dist/new-change.js
|
|
2617
2680
|
var import_yaml9 = __toESM(require_dist(), 1);
|
|
2618
|
-
import { mkdir, readFile as
|
|
2619
|
-
import { join as
|
|
2681
|
+
import { mkdir as mkdir2, readFile as readFile12, writeFile as writeFile2 } from "node:fs/promises";
|
|
2682
|
+
import { join as join13 } from "node:path";
|
|
2620
2683
|
var nowIso2 = () => (/* @__PURE__ */ new Date()).toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
2621
2684
|
var strip2 = (h) => h.startsWith("@") ? h.slice(1) : h;
|
|
2622
2685
|
function windowsUnsafeName(id) {
|
|
@@ -2628,7 +2691,7 @@ function slugify(title) {
|
|
|
2628
2691
|
}
|
|
2629
2692
|
async function exists(path) {
|
|
2630
2693
|
try {
|
|
2631
|
-
await
|
|
2694
|
+
await readFile12(path);
|
|
2632
2695
|
return true;
|
|
2633
2696
|
} catch {
|
|
2634
2697
|
return false;
|
|
@@ -2636,7 +2699,7 @@ async function exists(path) {
|
|
|
2636
2699
|
}
|
|
2637
2700
|
async function defaultSchema(root) {
|
|
2638
2701
|
try {
|
|
2639
|
-
const cfg = (0, import_yaml9.parse)(await
|
|
2702
|
+
const cfg = (0, import_yaml9.parse)(await readFile12(join13(openspecDirOf(root), "config.yaml"), "utf8"));
|
|
2640
2703
|
if (cfg && typeof cfg.schema === "string")
|
|
2641
2704
|
return cfg.schema;
|
|
2642
2705
|
} catch {
|
|
@@ -2660,17 +2723,17 @@ async function newChange(root, opts) {
|
|
|
2660
2723
|
const now = opts.now ?? nowIso2();
|
|
2661
2724
|
const by = strip2(opts.by);
|
|
2662
2725
|
const dir = changeFolder(root, id);
|
|
2663
|
-
if (opts.openspec && !await exists(
|
|
2726
|
+
if (opts.openspec && !await exists(join13(dir, ".openspec.yaml"))) {
|
|
2664
2727
|
await opts.openspec.newChange(id, { description: opts.title });
|
|
2665
2728
|
} else {
|
|
2666
|
-
await
|
|
2667
|
-
if (!await exists(
|
|
2668
|
-
await writeFile2(
|
|
2729
|
+
await mkdir2(dir, { recursive: true });
|
|
2730
|
+
if (!await exists(join13(dir, ".openspec.yaml")))
|
|
2731
|
+
await writeFile2(join13(dir, ".openspec.yaml"), `schema: ${await defaultSchema(root)}
|
|
2669
2732
|
created: ${now.slice(0, 10)}
|
|
2670
2733
|
`, "utf8");
|
|
2671
2734
|
}
|
|
2672
|
-
if (!await exists(
|
|
2673
|
-
await writeFileAtomic(
|
|
2735
|
+
if (!await exists(join13(dir, "brief.md")))
|
|
2736
|
+
await writeFileAtomic(join13(dir, "brief.md"), renderTemplate(template, {
|
|
2674
2737
|
title: opts.title,
|
|
2675
2738
|
id,
|
|
2676
2739
|
type: type.id,
|
|
@@ -2710,7 +2773,7 @@ created: ${now.slice(0, 10)}
|
|
|
2710
2773
|
// packages/changes/dist/publish.js
|
|
2711
2774
|
import { rm } from "node:fs/promises";
|
|
2712
2775
|
import { randomUUID } from "node:crypto";
|
|
2713
|
-
import { join as
|
|
2776
|
+
import { join as join14, resolve } from "node:path";
|
|
2714
2777
|
function gitHandoffPublisher(opts = {}) {
|
|
2715
2778
|
const remote = opts.remote ?? "origin";
|
|
2716
2779
|
const env = opts.env ?? process.env;
|
|
@@ -2744,7 +2807,7 @@ function gitHandoffPublisher(opts = {}) {
|
|
|
2744
2807
|
"--quiet",
|
|
2745
2808
|
`refs/remotes/${remote}/${base}^{commit}`
|
|
2746
2809
|
]) ?? await out(["rev-parse", "--verify", `refs/heads/${base}^{commit}`]);
|
|
2747
|
-
const index =
|
|
2810
|
+
const index = join14(gitDir, `atticus-handoff-index-${process.pid}-${randomUUID()}`);
|
|
2748
2811
|
const staged = createGit({ env: { ...env, GIT_INDEX_FILE: index } });
|
|
2749
2812
|
try {
|
|
2750
2813
|
await staged(["read-tree", start], root);
|
|
@@ -2799,13 +2862,13 @@ async function keepLocalBranch(out, tryOut, branch, start, commit) {
|
|
|
2799
2862
|
}
|
|
2800
2863
|
|
|
2801
2864
|
// packages/changes/dist/handoff.js
|
|
2802
|
-
import { readdir as
|
|
2803
|
-
import { join as
|
|
2865
|
+
import { readdir as readdir8, readFile as readFile14 } from "node:fs/promises";
|
|
2866
|
+
import { join as join16 } from "node:path";
|
|
2804
2867
|
|
|
2805
2868
|
// packages/changes/dist/drafted.js
|
|
2806
2869
|
var import_yaml10 = __toESM(require_dist(), 1);
|
|
2807
|
-
import { mkdir as
|
|
2808
|
-
import { dirname, join as
|
|
2870
|
+
import { mkdir as mkdir3, readdir as readdir7, readFile as readFile13, rm as rm2 } from "node:fs/promises";
|
|
2871
|
+
import { dirname as dirname2, join as join15, relative, sep } from "node:path";
|
|
2809
2872
|
var CAPTURE_SCHEMA_VERSION = 1;
|
|
2810
2873
|
var DraftCapture = external_exports.object({
|
|
2811
2874
|
schemaVersion: external_exports.literal(CAPTURE_SCHEMA_VERSION),
|
|
@@ -2880,7 +2943,7 @@ var sameText = (text, recorded) => sha256(text) === recorded || sha256(text.repl
|
|
|
2880
2943
|
async function walk2(dir, rel = "") {
|
|
2881
2944
|
let entries;
|
|
2882
2945
|
try {
|
|
2883
|
-
entries = await
|
|
2946
|
+
entries = await readdir7(join15(dir, rel), { withFileTypes: true });
|
|
2884
2947
|
} catch {
|
|
2885
2948
|
return [];
|
|
2886
2949
|
}
|
|
@@ -3025,7 +3088,7 @@ async function captureHandoff(input) {
|
|
|
3025
3088
|
} else {
|
|
3026
3089
|
const texts = await Promise.all(recorded.map(async (r) => [
|
|
3027
3090
|
r,
|
|
3028
|
-
await
|
|
3091
|
+
await readFile13(join15(folder, ...r.path.split("/")), "utf8").catch(() => void 0)
|
|
3029
3092
|
]));
|
|
3030
3093
|
if (texts.every(([r, t]) => t !== void 0 && sameText(t, r.sha256))) {
|
|
3031
3094
|
from = "working-tree";
|
|
@@ -3089,11 +3152,11 @@ async function captureHandoff(input) {
|
|
|
3089
3152
|
} : {}
|
|
3090
3153
|
};
|
|
3091
3154
|
const p = capturePaths(name);
|
|
3092
|
-
await rm2(
|
|
3093
|
-
await rm2(
|
|
3155
|
+
await rm2(join15(folder, ...p.drafted.split("/")), { recursive: true, force: true });
|
|
3156
|
+
await rm2(join15(folder, ...p.merged.split("/")), { recursive: true, force: true });
|
|
3094
3157
|
const put = async (base, rel, text) => {
|
|
3095
|
-
const f =
|
|
3096
|
-
await
|
|
3158
|
+
const f = join15(folder, ...base.split("/"), ...rel.split("/"));
|
|
3159
|
+
await mkdir3(dirname2(f), { recursive: true });
|
|
3097
3160
|
await writeFileAtomic(f, text);
|
|
3098
3161
|
};
|
|
3099
3162
|
for (const [rel, t] of draftedFiles)
|
|
@@ -3101,37 +3164,37 @@ async function captureHandoff(input) {
|
|
|
3101
3164
|
if (state === "captured")
|
|
3102
3165
|
for (const [rel, t] of mergedFiles)
|
|
3103
3166
|
await put(p.merged, rel, t);
|
|
3104
|
-
await
|
|
3105
|
-
await writeFileAtomic(
|
|
3167
|
+
await mkdir3(join15(folder, "stage"), { recursive: true });
|
|
3168
|
+
await writeFileAtomic(join15(folder, ...p.capture.split("/")), HEADER + (0, import_yaml10.stringify)(capture, { lineWidth: 0 }));
|
|
3106
3169
|
return { capture, file: p.capture };
|
|
3107
3170
|
}
|
|
3108
3171
|
async function readFolderFiles(dir) {
|
|
3109
3172
|
const out = /* @__PURE__ */ new Map();
|
|
3110
3173
|
for (const f of await walk2(dir))
|
|
3111
|
-
out.set(f, (await
|
|
3174
|
+
out.set(f, (await readFile13(join15(dir, ...f.split("/")), "utf8")).replace(/\r\n/g, "\n"));
|
|
3112
3175
|
return out;
|
|
3113
3176
|
}
|
|
3114
3177
|
async function changeFolders(root) {
|
|
3115
|
-
const base =
|
|
3178
|
+
const base = join15(root, ...changesRelOf(root).split("/"));
|
|
3116
3179
|
const out = [];
|
|
3117
|
-
const list = async (dir) => (await
|
|
3180
|
+
const list = async (dir) => (await readdir7(dir, { withFileTypes: true }).catch(() => [])).filter((e) => e.isDirectory()).map((e) => e.name).sort();
|
|
3118
3181
|
for (const name of await list(base)) {
|
|
3119
3182
|
if (name === "archive")
|
|
3120
|
-
for (const a of await list(
|
|
3121
|
-
out.push(
|
|
3183
|
+
for (const a of await list(join15(base, "archive")))
|
|
3184
|
+
out.push(join15(base, "archive", a));
|
|
3122
3185
|
else
|
|
3123
|
-
out.push(
|
|
3186
|
+
out.push(join15(base, name));
|
|
3124
3187
|
}
|
|
3125
3188
|
return out;
|
|
3126
3189
|
}
|
|
3127
3190
|
async function readDraftPairs(root) {
|
|
3128
3191
|
const out = [];
|
|
3129
3192
|
for (const folder of await changeFolders(root)) {
|
|
3130
|
-
const names = (await
|
|
3193
|
+
const names = (await readdir7(join15(folder, "stage")).catch(() => [])).filter((f) => f.endsWith(".capture.yaml")).sort();
|
|
3131
3194
|
for (const f of names) {
|
|
3132
3195
|
let capture;
|
|
3133
3196
|
try {
|
|
3134
|
-
capture = DraftCapture.parse((0, import_yaml10.parse)(await
|
|
3197
|
+
capture = DraftCapture.parse((0, import_yaml10.parse)(await readFile13(join15(folder, "stage", f), "utf8")));
|
|
3135
3198
|
} catch {
|
|
3136
3199
|
continue;
|
|
3137
3200
|
}
|
|
@@ -3139,8 +3202,8 @@ async function readDraftPairs(root) {
|
|
|
3139
3202
|
out.push({
|
|
3140
3203
|
capture,
|
|
3141
3204
|
folder: relative(root, folder).split(sep).join("/"),
|
|
3142
|
-
drafted: await readFolderFiles(
|
|
3143
|
-
merged: await readFolderFiles(
|
|
3205
|
+
drafted: await readFolderFiles(join15(folder, ...p.drafted.split("/"))),
|
|
3206
|
+
merged: await readFolderFiles(join15(folder, ...p.merged.split("/")))
|
|
3144
3207
|
});
|
|
3145
3208
|
}
|
|
3146
3209
|
}
|
|
@@ -3160,8 +3223,8 @@ async function completeCaptures(root, ctx, o) {
|
|
|
3160
3223
|
continue;
|
|
3161
3224
|
for (const h of change.handoffs.filter((x) => x.state === "merged")) {
|
|
3162
3225
|
const { name } = await captureStageOf(ctx, change, h.phase);
|
|
3163
|
-
const file =
|
|
3164
|
-
const prior = await
|
|
3226
|
+
const file = join15(changeFolder(root, change.id), ...capturePaths(name).capture.split("/"));
|
|
3227
|
+
const prior = await readFile13(file, "utf8").then((t) => DraftCapture.safeParse((0, import_yaml10.parse)(t)), () => void 0);
|
|
3165
3228
|
if (prior?.success && prior.data.pr.number === h.pr.number && prior.data.state !== "waiting-for-merge")
|
|
3166
3229
|
continue;
|
|
3167
3230
|
const base = prior?.success ? prior.data.base : o.defaultBase ?? "main";
|
|
@@ -3202,16 +3265,16 @@ async function load(root, id) {
|
|
|
3202
3265
|
}
|
|
3203
3266
|
async function walkReview(dir, gate) {
|
|
3204
3267
|
const out = [];
|
|
3205
|
-
const base =
|
|
3268
|
+
const base = join16(dir, "review", gate);
|
|
3206
3269
|
let rounds;
|
|
3207
3270
|
try {
|
|
3208
|
-
rounds = (await
|
|
3271
|
+
rounds = (await readdir8(base)).filter((r) => /^\d+$/.test(r)).sort((a, b) => Number(a) - Number(b));
|
|
3209
3272
|
} catch {
|
|
3210
3273
|
return [];
|
|
3211
3274
|
}
|
|
3212
3275
|
for (const r of rounds) {
|
|
3213
3276
|
try {
|
|
3214
|
-
for (const f of (await
|
|
3277
|
+
for (const f of (await readdir8(join16(base, r))).filter((x) => /\.ya?ml$/.test(x)).sort())
|
|
3215
3278
|
out.push(`review/${gate}/${r}/${f}`);
|
|
3216
3279
|
} catch {
|
|
3217
3280
|
}
|
|
@@ -3222,12 +3285,12 @@ async function keptPairFiles(dir) {
|
|
|
3222
3285
|
const out = [];
|
|
3223
3286
|
let entries;
|
|
3224
3287
|
try {
|
|
3225
|
-
entries = await
|
|
3288
|
+
entries = await readdir8(join16(dir, "stage"), { withFileTypes: true });
|
|
3226
3289
|
} catch {
|
|
3227
3290
|
return out;
|
|
3228
3291
|
}
|
|
3229
3292
|
const walk3 = async (rel) => {
|
|
3230
|
-
for (const e of await
|
|
3293
|
+
for (const e of await readdir8(join16(dir, ...rel.split("/")), { withFileTypes: true }).catch(() => [])) {
|
|
3231
3294
|
const p = `${rel}/${e.name}`;
|
|
3232
3295
|
if (e.isDirectory())
|
|
3233
3296
|
await walk3(p);
|
|
@@ -3261,7 +3324,7 @@ async function handoffFiles(ctx, a, phase) {
|
|
|
3261
3324
|
for (const f of await stageFiles(dir, step))
|
|
3262
3325
|
files.add(f);
|
|
3263
3326
|
}
|
|
3264
|
-
const present = async (f) =>
|
|
3327
|
+
const present = async (f) => readFile14(join16(dir, ...f.split("/"))).then(() => true, () => false);
|
|
3265
3328
|
for (const own of [
|
|
3266
3329
|
"stage/corrections.yaml",
|
|
3267
3330
|
"stage/drafted.yaml",
|
|
@@ -3274,7 +3337,7 @@ async function handoffFiles(ctx, a, phase) {
|
|
|
3274
3337
|
for (const extra of ["tasks.md", "repos.yaml"])
|
|
3275
3338
|
if (await present(extra))
|
|
3276
3339
|
files.add(extra);
|
|
3277
|
-
for (const t of await
|
|
3340
|
+
for (const t of await readdir8(join16(dir, "tasks"), { withFileTypes: true }).catch(() => []))
|
|
3278
3341
|
if (t.isDirectory() && await present(`tasks/${t.name}/report.md`))
|
|
3279
3342
|
files.add(`tasks/${t.name}/report.md`);
|
|
3280
3343
|
}
|
|
@@ -3348,7 +3411,7 @@ async function handoff(root, id, opts) {
|
|
|
3348
3411
|
await requireValid(opts.openspec, id);
|
|
3349
3412
|
const { files, artifacts } = await handoffFiles(ctx, a, phase);
|
|
3350
3413
|
const dir = changeFolder(root, id);
|
|
3351
|
-
const hashed = await Promise.all(files.map(async (path) => ({ path, sha256: sha256(await
|
|
3414
|
+
const hashed = await Promise.all(files.map(async (path) => ({ path, sha256: sha256(await readFile14(join16(dir, path))) })));
|
|
3352
3415
|
const authors = { ...change.authors };
|
|
3353
3416
|
for (const art of artifacts) {
|
|
3354
3417
|
const people = (opts.authors?.[art] ?? [by]).map(strip3);
|
|
@@ -3711,8 +3774,8 @@ async function archiveChange(root, id, opts) {
|
|
|
3711
3774
|
|
|
3712
3775
|
// packages/changes/dist/learn.js
|
|
3713
3776
|
var import_yaml11 = __toESM(require_dist(), 1);
|
|
3714
|
-
import { readFile as
|
|
3715
|
-
import { join as
|
|
3777
|
+
import { readFile as readFile15 } from "node:fs/promises";
|
|
3778
|
+
import { join as join17 } from "node:path";
|
|
3716
3779
|
var LEARN_SCHEMA_VERSION = 1;
|
|
3717
3780
|
var MAX_CELLS = 4e6;
|
|
3718
3781
|
var lines = (text) => {
|
|
@@ -4101,7 +4164,7 @@ async function pairTouches(root, p) {
|
|
|
4101
4164
|
flows.push(m[1]);
|
|
4102
4165
|
}
|
|
4103
4166
|
}
|
|
4104
|
-
const change = yaml(await
|
|
4167
|
+
const change = yaml(await readFile15(join17(root, ...p.folder.split("/"), "change.yaml"), "utf8").catch(() => ""));
|
|
4105
4168
|
const touches = change?.touches ?? {};
|
|
4106
4169
|
for (const r of Array.isArray(touches.repos) ? touches.repos : [])
|
|
4107
4170
|
if (typeof r === "string")
|
|
@@ -4194,8 +4257,8 @@ async function detectConflicts(root) {
|
|
|
4194
4257
|
}
|
|
4195
4258
|
|
|
4196
4259
|
// packages/changes/dist/size.js
|
|
4197
|
-
import { readFile as
|
|
4198
|
-
import { join as
|
|
4260
|
+
import { readFile as readFile16 } from "node:fs/promises";
|
|
4261
|
+
import { join as join18 } from "node:path";
|
|
4199
4262
|
async function changeSize(ctx, change) {
|
|
4200
4263
|
const type = ctx.orgPack.changeTypes.types.find((t) => t.id === change.type);
|
|
4201
4264
|
if (!type)
|
|
@@ -4204,7 +4267,7 @@ async function changeSize(ctx, change) {
|
|
|
4204
4267
|
why: "standard",
|
|
4205
4268
|
words: `${change.type} isn't a change type in change-types.yaml, so ${change.id} takes the full path.`
|
|
4206
4269
|
};
|
|
4207
|
-
const brief = await
|
|
4270
|
+
const brief = await readFile16(join18(changeFolder(ctx.root, change.id), "brief.md"), "utf8").catch(() => "");
|
|
4208
4271
|
const f = fastPathOf(type, brief);
|
|
4209
4272
|
const gate = f.fast ? fastGateOf(type, ctx.orgPack.gates) : void 0;
|
|
4210
4273
|
const words = {
|
|
@@ -4219,12 +4282,12 @@ async function changeSize(ctx, change) {
|
|
|
4219
4282
|
|
|
4220
4283
|
// packages/changes/dist/openspec-stores.js
|
|
4221
4284
|
import { existsSync as existsSync3 } from "node:fs";
|
|
4222
|
-
import { readFile as
|
|
4285
|
+
import { readFile as readFile17, writeFile as writeFile3 } from "node:fs/promises";
|
|
4223
4286
|
import { homedir } from "node:os";
|
|
4224
|
-
import { basename, isAbsolute, join as
|
|
4287
|
+
import { basename, isAbsolute, join as join19, relative as relative2, resolve as resolve2, sep as sep2 } from "node:path";
|
|
4225
4288
|
function storeDirOf(root, path) {
|
|
4226
4289
|
if (path === "~" || path.startsWith("~/") || path.startsWith("~\\"))
|
|
4227
|
-
return
|
|
4290
|
+
return join19(homedir(), path.slice(2));
|
|
4228
4291
|
return isAbsolute(path) ? resolve2(path) : resolve2(root, path);
|
|
4229
4292
|
}
|
|
4230
4293
|
function packRel(root) {
|
|
@@ -4254,7 +4317,7 @@ async function storeSpecLookup(root, capability) {
|
|
|
4254
4317
|
var REMOTE = /^[a-z][a-z0-9+.-]*:\/\//i;
|
|
4255
4318
|
var SCP = /^[^/\\]+@[^:/\\]+:/;
|
|
4256
4319
|
async function metarepoOrigin(root, git = createGit()) {
|
|
4257
|
-
if (!existsSync3(
|
|
4320
|
+
if (!existsSync3(join19(root, ".git")))
|
|
4258
4321
|
return void 0;
|
|
4259
4322
|
try {
|
|
4260
4323
|
const url = (await git(["remote", "get-url", "origin"], root)).stdout.trim();
|
|
@@ -4277,8 +4340,8 @@ async function referenceMetarepoIn(root, repoDir3, o = {}) {
|
|
|
4277
4340
|
file,
|
|
4278
4341
|
why: marker.missing ? `this metarepo isn't an OpenSpec store yet (no ${STORE_MARKER}): run atticus upgrade --openspec-store, commit the file, then hand down again` : `this metarepo's ${STORE_MARKER} can't be read (${marker.notes.join("; ")})`
|
|
4279
4342
|
};
|
|
4280
|
-
const path =
|
|
4281
|
-
const text = await
|
|
4343
|
+
const path = join19(repoDir3, "openspec", "config.yaml");
|
|
4344
|
+
const text = await readFile17(path, "utf8").catch(() => void 0);
|
|
4282
4345
|
if (text === void 0)
|
|
4283
4346
|
return {
|
|
4284
4347
|
action: "skipped",
|
|
@@ -4529,6 +4592,15 @@ export {
|
|
|
4529
4592
|
scoreRisk,
|
|
4530
4593
|
testsFor,
|
|
4531
4594
|
testPlanFor,
|
|
4595
|
+
GENERATED_MARK,
|
|
4596
|
+
PLANNING_FILES,
|
|
4597
|
+
isGenerated,
|
|
4598
|
+
personWritten,
|
|
4599
|
+
keepPersonWritten,
|
|
4600
|
+
personWrittenPlanning,
|
|
4601
|
+
writesPlanning,
|
|
4602
|
+
stageWorkDone,
|
|
4603
|
+
stageIdle,
|
|
4532
4604
|
phaseState,
|
|
4533
4605
|
statePhase,
|
|
4534
4606
|
nextState,
|
|
@@ -4541,6 +4613,7 @@ export {
|
|
|
4541
4613
|
checkStage,
|
|
4542
4614
|
stageFiles,
|
|
4543
4615
|
artifactFiles,
|
|
4616
|
+
artifactWritten,
|
|
4544
4617
|
checkArtifacts,
|
|
4545
4618
|
checkFindings,
|
|
4546
4619
|
mandatoryGates,
|