@maycombhq/atticus 2.0.0-beta.2 → 2.0.0-beta.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +8 -4
- package/dist/chunk-23XVSEV5.js +49 -0
- package/dist/{chunk-ZDPAS56H.js → chunk-24OXGB3P.js} +8 -2
- package/dist/{chunk-7EOBHUMC.js → chunk-24XLDU72.js} +4 -3
- package/dist/{chunk-CR3MTH32.js → chunk-2F4CYZKJ.js} +86 -11
- package/dist/{chunk-6IU67AEK.js → chunk-2GF7OLF3.js} +23 -15
- package/dist/chunk-2IIMFOPM.js +41 -0
- package/dist/chunk-2LGRMVCA.js +617 -0
- package/dist/{chunk-XPCM366L.js → chunk-2MMCFP5C.js} +10 -8
- package/dist/{chunk-JBTK5OP2.js → chunk-2Q56PQPS.js} +6 -4
- package/dist/{chunk-Z6LF7HQN.js → chunk-2Q5EDGEO.js} +7 -5
- package/dist/{chunk-3USYZGRF.js → chunk-2RLKFUUL.js} +38 -27
- package/dist/chunk-2SKB4O2E.js +59 -0
- package/dist/{chunk-SP2I63OO.js → chunk-34S2WGOB.js} +87 -4
- package/dist/{chunk-GQ4N4WKF.js → chunk-3NFFJL5D.js} +33 -27
- package/dist/{chunk-SJRGMG6A.js → chunk-3NWDLGG6.js} +28 -25
- package/dist/{chunk-4WBVUHXN.js → chunk-3RM4UK6W.js} +20 -18
- package/dist/chunk-42SIDKEU.js +583 -0
- package/dist/{chunk-GLUX4EEP.js → chunk-4EURQWQD.js} +20 -15
- package/dist/chunk-4U276ICE.js +39 -0
- package/dist/{chunk-ZMFPW66A.js → chunk-53T4O55J.js} +4 -3
- package/dist/{chunk-6J5OKA4Y.js → chunk-57TDNMI3.js} +17 -15
- package/dist/chunk-5BD2KYLE.js +57 -0
- package/dist/{chunk-7EFILTCI.js → chunk-5F7GFN2F.js} +28 -0
- package/dist/chunk-5NMKONLP.js +95 -0
- package/dist/{chunk-7ZUIMTOU.js → chunk-5SJZW52K.js} +26 -24
- package/dist/{chunk-4RS5KZQD.js → chunk-63YRMR6J.js} +6 -5
- package/dist/chunk-66PPNOON.js +62 -0
- package/dist/chunk-6H3Z5JHH.js +64 -0
- package/dist/{chunk-CEXSU4S6.js → chunk-6MUGR4LS.js} +775 -89
- package/dist/{chunk-QSXK2RGH.js → chunk-6OJQOPUN.js} +5 -3
- package/dist/{chunk-MVZVGYXH.js → chunk-6PPOWY5E.js} +84 -14
- package/dist/{chunk-7EKXJZ2Y.js → chunk-6ZGLAACW.js} +299 -38
- package/dist/chunk-6ZJ5A7AF.js +222 -0
- package/dist/{chunk-L24C55VN.js → chunk-745DAZ4L.js} +142 -30
- package/dist/{chunk-Q4D5X7QB.js → chunk-7ASNL4Q4.js} +46 -24
- package/dist/chunk-7BR7IPOH.js +35 -0
- package/dist/{chunk-7WD63HU2.js → chunk-7DOR27HL.js} +6 -6
- package/dist/chunk-7FTTA3HD.js +341 -0
- package/dist/{chunk-OLQJTJJU.js → chunk-7GJS6DNX.js} +12 -3
- package/dist/{chunk-7JUKDRSZ.js → chunk-7IGKHZ4Z.js} +347 -226
- package/dist/{chunk-G2B4ZQGH.js → chunk-7IOWA5D5.js} +11 -6
- package/dist/{chunk-EBEW3XXQ.js → chunk-7JITZFJC.js} +7 -5
- package/dist/chunk-7MJSQTL5.js +174 -0
- package/dist/{chunk-I4JRCD6M.js → chunk-7UOMVMFG.js} +25 -17
- package/dist/{chunk-YY6ZQQBP.js → chunk-AFWUDXEM.js} +19 -7
- package/dist/chunk-AFZ3QA6W.js +47 -0
- package/dist/chunk-AJQ72EBM.js +420 -0
- package/dist/chunk-AJYXNTNZ.js +317 -0
- package/dist/chunk-AVTBS4OW.js +49 -0
- package/dist/{chunk-FHH4I4ZV.js → chunk-BDKC6H5P.js} +12 -6
- package/dist/{chunk-IPKHE5D6.js → chunk-BEVTIBRH.js} +1526 -875
- package/dist/chunk-BHT7QK4G.js +162 -0
- package/dist/{chunk-6JUBZBMW.js → chunk-BIGDQDHD.js} +6 -4
- package/dist/{chunk-2BFCZ3RK.js → chunk-BO4KX37X.js} +20 -18
- package/dist/chunk-BPK5P77O.js +115 -0
- package/dist/chunk-BQ4SQQC6.js +59 -0
- package/dist/chunk-BQGDB6ZL.js +7342 -0
- package/dist/{chunk-2ANOROX3.js → chunk-BTGPE6CR.js} +11 -9
- package/dist/chunk-BTY3HZBO.js +93 -0
- package/dist/{chunk-DPZHZQKE.js → chunk-BXYMYEJ4.js} +44 -10
- package/dist/{chunk-2RMYG36Q.js → chunk-C3RY6KU6.js} +309 -346
- package/dist/chunk-C4R4JLHE.js +40 -0
- package/dist/chunk-CADWLE2T.js +18 -0
- package/dist/chunk-CBGGOQWU.js +82 -0
- package/dist/chunk-CMDXGQTS.js +47 -0
- package/dist/{chunk-MC3H7736.js → chunk-CQDGOPGH.js} +58 -18
- package/dist/{chunk-HFQCFSJR.js → chunk-CX4RZ2KS.js} +4 -3
- package/dist/{chunk-PAMPPUR6.js → chunk-CXJ6FUKN.js} +1852 -207
- package/dist/{chunk-ABWHYWNI.js → chunk-D73UEXYW.js} +3 -3
- package/dist/chunk-DCZWQLYT.js +1205 -0
- package/dist/chunk-DLOBCJL6.js +48 -0
- package/dist/{chunk-4BN53TG3.js → chunk-DOBQKHIF.js} +31 -23
- package/dist/chunk-E3ISYXO3.js +423 -0
- package/dist/{chunk-7SW2QWLU.js → chunk-E6ZIEVOI.js} +16 -13
- package/dist/chunk-EBL2R3YG.js +43 -0
- package/dist/{chunk-AIOQPLA5.js → chunk-EGQRREQH.js} +41 -15
- package/dist/chunk-EHA7RMZ3.js +58 -0
- package/dist/{chunk-M766ZJ6W.js → chunk-EIPTLPFC.js} +38 -27
- package/dist/chunk-EMRIQUND.js +517 -0
- package/dist/{chunk-DFBCSHVT.js → chunk-EPCJQQWD.js} +6 -4
- package/dist/{chunk-RZPYKDWS.js → chunk-F3P7N7SF.js} +1 -1
- package/dist/{chunk-R77KLRB3.js → chunk-FFLNS6VP.js} +21 -18
- package/dist/chunk-FFTRTL6R.js +26 -0
- package/dist/{chunk-IHMLFRVV.js → chunk-FPJPLKDW.js} +62 -16
- package/dist/{chunk-JCZIKA4C.js → chunk-FSMSFDLD.js} +5 -4
- package/dist/{chunk-AVJDSJ2F.js → chunk-FUJM6RTF.js} +8 -7
- package/dist/chunk-FZOJFH7Q.js +132 -0
- package/dist/{chunk-QRAOANID.js → chunk-G6X77UJZ.js} +23 -21
- package/dist/{chunk-3ALD2W2A.js → chunk-GCWRWSU7.js} +10 -4
- package/dist/chunk-GIW4ZVDB.js +39 -0
- package/dist/{chunk-B2WLAWNJ.js → chunk-GUX3PTYM.js} +3 -3
- package/dist/{chunk-DPUYDDQG.js → chunk-GZY6RUZ6.js} +25 -3
- package/dist/chunk-H4VO6WG3.js +10 -0
- package/dist/{chunk-MMOSZPWJ.js → chunk-H5HBGNXU.js} +5 -4
- package/dist/chunk-H7KM7LZE.js +229 -0
- package/dist/{chunk-AA6YULYB.js → chunk-HNM2YQT2.js} +7 -7
- package/dist/{chunk-3C7EYRFZ.js → chunk-HYU5VLGA.js} +1 -1
- package/dist/{chunk-XY3P7JW7.js → chunk-IDKCWSM5.js} +1032 -172
- package/dist/chunk-IFKEI4SA.js +237 -0
- package/dist/{chunk-F7HYOUFF.js → chunk-IGOE6KPG.js} +67 -22
- package/dist/{chunk-TDD55CJH.js → chunk-IH2XURVQ.js} +6 -5
- package/dist/chunk-INQHESFB.js +38 -0
- package/dist/chunk-IP74LCOQ.js +57 -0
- package/dist/chunk-IPHHDDC6.js +45 -0
- package/dist/{chunk-T6AIP7H5.js → chunk-ISUAAMGS.js} +110 -153
- package/dist/{chunk-A7UPUQFY.js → chunk-IUPG3UKI.js} +624 -319
- package/dist/{chunk-L6SGQIR3.js → chunk-IVBOQAGB.js} +7 -3
- package/dist/{chunk-27NKUS3X.js → chunk-J2JAKCIW.js} +2205 -796
- package/dist/{chunk-V2YTAIQO.js → chunk-J3IOLXWM.js} +24 -7
- package/dist/chunk-JA5FI3QV.js +142 -0
- package/dist/chunk-JAVI7JSP.js +49 -0
- package/dist/{chunk-HLJAXMM4.js → chunk-JB5LINEM.js} +6 -2
- package/dist/{chunk-2VHF7OXM.js → chunk-JENSEMXF.js} +1 -1
- package/dist/{chunk-6BVONWJ7.js → chunk-JJF6HALY.js} +4 -3
- package/dist/chunk-JLUCKAEL.js +38 -0
- package/dist/chunk-JRBFANFE.js +221 -0
- package/dist/{chunk-R6XF6UR3.js → chunk-KDNTAPLX.js} +4 -4
- package/dist/chunk-KFAVQZSX.js +33 -0
- package/dist/chunk-KJXD4PNL.js +50 -0
- package/dist/chunk-KN5BXMWN.js +44 -0
- package/dist/{chunk-PCVDV3UZ.js → chunk-KQGURXFU.js} +9 -7
- package/dist/{chunk-WY6PP6AA.js → chunk-KXITGYLF.js} +40 -6
- package/dist/{chunk-66YVAGGM.js → chunk-L27SV425.js} +22 -20
- package/dist/{chunk-NE2W3OO7.js → chunk-LDLL7LB3.js} +24 -22
- package/dist/chunk-LFGTYX5U.js +379 -0
- package/dist/{chunk-EYWIDJFU.js → chunk-LGBMTVNT.js} +7 -5
- package/dist/{chunk-Q5AMFEWD.js → chunk-LGFL54FP.js} +3 -2
- package/dist/{chunk-6TACQN3N.js → chunk-LJXMYKZJ.js} +7 -5
- package/dist/{chunk-BKVWTZ6A.js → chunk-LKOR5UET.js} +29 -26
- package/dist/chunk-LNBQOP7D.js +294 -0
- package/dist/{chunk-O3WI5KWW.js → chunk-LO6P2VYG.js} +2 -2
- package/dist/chunk-LQJPN536.js +122 -0
- package/dist/{chunk-YEDDOYSC.js → chunk-LYBNHMVZ.js} +29 -5
- package/dist/{chunk-A3GY6SOA.js → chunk-LZ7NUC62.js} +20 -18
- package/dist/chunk-M32BLWDH.js +37 -0
- package/dist/{chunk-VYDBJ73M.js → chunk-M3NANSDZ.js} +17 -15
- package/dist/chunk-MFHL5URL.js +31 -0
- package/dist/chunk-MFR5OPBD.js +109 -0
- package/dist/{chunk-DE76JROX.js → chunk-MG4ZL5RW.js} +32 -20
- package/dist/{chunk-N7IXEHK3.js → chunk-MO6P2JZH.js} +10 -8
- package/dist/{chunk-65NYPGRC.js → chunk-MUWDB4R4.js} +1 -1
- package/dist/chunk-MZCGSXVR.js +34 -0
- package/dist/{chunk-MGYZM27B.js → chunk-N3XIYPU3.js} +51 -23
- package/dist/chunk-NDCF4R6S.js +172 -0
- package/dist/{chunk-DHPACDG7.js → chunk-NR2UJWOC.js} +10 -8
- package/dist/chunk-NXJ5URP6.js +51 -0
- package/dist/{chunk-UNM6ZOKP.js → chunk-NY2XSR5K.js} +147 -18
- package/dist/{chunk-5GDRCDQB.js → chunk-O45HFTFS.js} +3 -2
- package/dist/{chunk-ONLS5QA5.js → chunk-O4GXGGBX.js} +14 -12
- package/dist/chunk-O5PXQR67.js +249 -0
- package/dist/{chunk-PRPPGYZG.js → chunk-O66DM6DJ.js} +6 -4
- package/dist/{chunk-KEM4SDDP.js → chunk-O7FDLW7L.js} +11 -8
- package/dist/{chunk-T2UYZSCQ.js → chunk-O7XLYEFA.js} +169 -29
- package/dist/{chunk-FITWGOJ2.js → chunk-OHNCWBKF.js} +4 -4
- package/dist/{chunk-652QWTLZ.js → chunk-OHVTTOPS.js} +3 -3
- package/dist/chunk-OMI6FPPN.js +43 -0
- package/dist/chunk-ONUPY3H6.js +53 -0
- package/dist/chunk-OTLDSZDV.js +69 -0
- package/dist/chunk-OUBGGKDU.js +22 -0
- package/dist/chunk-OWNCM4ZN.js +330 -0
- package/dist/{chunk-YISXLPHN.js → chunk-P2V7QW4D.js} +235 -35
- package/dist/{chunk-CNUKCS2T.js → chunk-P32RUW3B.js} +1632 -93
- package/dist/{chunk-BWZ77RQT.js → chunk-PAQ2AS5E.js} +1 -1
- package/dist/{chunk-ZMAINWBW.js → chunk-PBPBMP2B.js} +4 -3
- package/dist/{chunk-ZVM6AKKM.js → chunk-PJSJPMJI.js} +3 -3
- package/dist/{chunk-EFHQ3TWP.js → chunk-PKBHS4AA.js} +233 -56
- package/dist/{chunk-GT4I4ZWM.js → chunk-PMUAJGLI.js} +20 -16
- package/dist/chunk-PPD7HTDP.js +152 -0
- package/dist/chunk-PSOFBQWB.js +42 -0
- package/dist/{chunk-S2A7YC3Q.js → chunk-Q2TECDIT.js} +10694 -8896
- package/dist/chunk-Q4K5WB2W.js +42 -0
- package/dist/{chunk-UGLN7QHV.js → chunk-Q6DFNVRJ.js} +14 -12
- package/dist/chunk-QA4O2GGC.js +265 -0
- package/dist/chunk-QAXW2N3B.js +1216 -0
- package/dist/chunk-QBNWF5ZU.js +19 -0
- package/dist/chunk-QFWA2DPH.js +224 -0
- package/dist/{chunk-23W7VWKR.js → chunk-QKUJMING.js} +1363 -114
- package/dist/{chunk-NXFPS2LR.js → chunk-R44CYFPV.js} +16 -13
- package/dist/{chunk-CKSITVS4.js → chunk-R7NYHMUU.js} +2687 -786
- package/dist/chunk-REWWDVQB.js +162 -0
- package/dist/{chunk-JMSCMUCA.js → chunk-RGERPOIV.js} +145 -21
- package/dist/{chunk-6JCPI55B.js → chunk-RLDGWLQ7.js} +49 -7
- package/dist/chunk-RUGXBPWI.js +384 -0
- package/dist/{chunk-CPA6HPVR.js → chunk-RXPJMEOW.js} +18 -12
- package/dist/{chunk-3HI6Z55Y.js → chunk-S4PMJU6H.js} +339 -43
- package/dist/chunk-S5LSDXV4.js +40 -0
- package/dist/chunk-S7FCV7S5.js +51 -0
- package/dist/{chunk-5GGOLAKC.js → chunk-SDKLKB6I.js} +28 -26
- package/dist/chunk-SFSPGFCV.js +62 -0
- package/dist/{chunk-ZNCEKR4J.js → chunk-SFUP7TTO.js} +12 -8
- package/dist/{chunk-64EQYWCA.js → chunk-SLXZOMA6.js} +69 -19
- package/dist/chunk-SQV37XO2.js +273 -0
- package/dist/{chunk-K65BJIMT.js → chunk-SU74NDMQ.js} +19 -17
- package/dist/chunk-SYV5LHML.js +165 -0
- package/dist/chunk-T4YPZIQN.js +36 -0
- package/dist/chunk-T6DQR5TV.js +323 -0
- package/dist/{chunk-JIITQXFB.js → chunk-THDMSZ3R.js} +3075 -802
- package/dist/{chunk-JGZCG5VM.js → chunk-TNR75OXT.js} +7 -7
- package/dist/{chunk-D3PO4DOZ.js → chunk-TUULXQRW.js} +174 -15
- package/dist/chunk-TYQBFTBR.js +516 -0
- package/dist/chunk-U76OWS3Q.js +49 -0
- package/dist/{chunk-YYQN46FY.js → chunk-UCROWG2D.js} +27 -24
- package/dist/{chunk-6M5NK3K3.js → chunk-UF4AZOZB.js} +50 -10
- package/dist/chunk-UF4GLFBX.js +345 -0
- package/dist/{chunk-OT2O76OS.js → chunk-UGUP3ZM6.js} +240 -39
- package/dist/chunk-UNAGJYET.js +45 -0
- package/dist/{chunk-5WG5YP4T.js → chunk-UOR2DTHH.js} +16 -14
- package/dist/{chunk-S3QNRWYR.js → chunk-UPOY4YSQ.js} +14 -12
- package/dist/{chunk-EPTBZ3GP.js → chunk-UPS2DGFC.js} +1 -1
- package/dist/{chunk-4AK7IBVP.js → chunk-UUU4CLJG.js} +4 -2
- package/dist/{chunk-W3BQAZ3Q.js → chunk-UWMJKX5U.js} +14 -12
- package/dist/{chunk-QZSX3F7C.js → chunk-UWOJLHFT.js} +27 -23
- package/dist/chunk-VBTP56CE.js +535 -0
- package/dist/chunk-VCTWPLAO.js +211 -0
- package/dist/chunk-VNU26RCO.js +1215 -0
- package/dist/{chunk-CSZ4C5N6.js → chunk-VTZMAJ3W.js} +93 -10
- package/dist/{chunk-TXLH6WHQ.js → chunk-VW62D6QE.js} +14 -12
- package/dist/{chunk-CAQZUNOH.js → chunk-VY72R2XZ.js} +610 -3
- package/dist/{chunk-2DIQQJCB.js → chunk-VZALIKIF.js} +18 -15
- package/dist/{chunk-TYAID7B7.js → chunk-W62H2XSO.js} +25 -23
- package/dist/{chunk-HVUPKCGJ.js → chunk-W7VWI2YH.js} +9 -6
- package/dist/{chunk-TANFV3MZ.js → chunk-WERM6KPJ.js} +7 -4
- package/dist/{chunk-BOHJZTEQ.js → chunk-WF7B67YE.js} +208 -87
- package/dist/{chunk-7FBGJFEE.js → chunk-WG5U3F5V.js} +14 -12
- package/dist/{chunk-4NDAAFQT.js → chunk-WJF2CS6M.js} +8 -5
- package/dist/{chunk-XAKWMCXI.js → chunk-WKUJ3KPV.js} +4 -4
- package/dist/chunk-WMTRHUI5.js +103 -0
- package/dist/chunk-WNKPRSGI.js +36 -0
- package/dist/chunk-WXFLMQSR.js +223 -0
- package/dist/{chunk-RRTKKSLQ.js → chunk-X3WY6MN3.js} +8 -6
- package/dist/{chunk-ZCJDOK2S.js → chunk-X4CXA2IL.js} +47 -23
- package/dist/{chunk-UBBC2XSG.js → chunk-X5F3Q5LV.js} +560 -105
- package/dist/{chunk-C6EKFH7J.js → chunk-XD75VZIH.js} +9 -7
- package/dist/chunk-XERYFDB5.js +297 -0
- package/dist/chunk-XI2LCCYQ.js +420 -0
- package/dist/chunk-Y2EQNWKV.js +933 -0
- package/dist/{chunk-LR3R6Z2A.js → chunk-YHCMZC2J.js} +7 -7
- package/dist/chunk-YYY3AZFE.js +122 -0
- package/dist/{chunk-GDLULHTC.js → chunk-Z5IA3WDR.js} +19 -31
- package/dist/{chunk-T6XQL73F.js → chunk-ZFFYNRIO.js} +63 -23
- package/dist/{chunk-EDS2L2LD.js → chunk-ZFL7NY4F.js} +56 -27
- package/dist/{chunk-YMZ3TNYB.js → chunk-ZGULQAPZ.js} +7 -4
- package/dist/{chunk-4SKZDI62.js → chunk-ZIUFM5HT.js} +3 -1
- package/dist/{chunk-DKJA76CJ.js → chunk-ZJFRMSJT.js} +15 -13
- package/dist/chunk-ZJXLNDH4.js +239 -0
- package/dist/chunk-ZQ3ON2VQ.js +252 -0
- package/dist/{chunk-HITVBIJS.js → chunk-ZQ7SKESZ.js} +150 -415
- package/dist/{chunk-6QSERWXH.js → chunk-ZQXZ2SES.js} +24 -21
- package/dist/chunk-ZX57KSEQ.js +39 -0
- package/dist/{chunk-I3E7CX4H.js → chunk-ZZK56BLP.js} +5 -3
- package/dist/files.json +664 -368
- package/dist/packages/naysayer/constitution/constitution.yaml +19 -0
- package/dist/packages/sdk/npm/index.js +6194 -2542
- package/dist/packages/ui/dist/assets/{elk-api-tma0MCuh.js → elk-api-CIf-0gz5.js} +2 -2
- package/dist/packages/ui/dist/assets/index-CoK_Dl0D.js +47 -0
- package/dist/packages/ui/dist/assets/index-Dw20IRhQ.css +1 -0
- package/dist/packages/ui/dist/index.html +3 -2
- package/package.json +5 -5
- 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-RUVFXE2L.js +0 -666
- package/dist/chunk-RVH5SUW5.js +0 -69
- package/dist/chunk-VN3DP4LQ.js +0 -43
- package/dist/chunk-W5BVQF44.js +0 -36
- package/dist/chunk-WVPJSRRJ.js +0 -52
- 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
|
@@ -3,79 +3,60 @@ import { fileURLToPath as __atticusFileURLToPath } from "node:url";
|
|
|
3
3
|
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
|
-
import {
|
|
7
|
-
generateTests,
|
|
8
|
-
matrixCsv,
|
|
9
|
-
matrixMarkdown,
|
|
10
|
-
traceMatrix,
|
|
11
|
-
writeTraceFindings
|
|
12
|
-
} from "./chunk-2ANOROX3.js";
|
|
13
|
-
import {
|
|
14
|
-
table
|
|
15
|
-
} from "./chunk-VOGCSYOI.js";
|
|
16
6
|
import {
|
|
17
7
|
readChangeFiles,
|
|
18
8
|
readDataChanges,
|
|
19
9
|
readHops,
|
|
20
10
|
reviewedGates
|
|
21
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-S4PMJU6H.js";
|
|
22
12
|
import {
|
|
23
13
|
assess,
|
|
24
14
|
changeFolder,
|
|
25
15
|
changeStore,
|
|
26
16
|
checkFindings,
|
|
27
|
-
loadChangeContext
|
|
28
|
-
|
|
17
|
+
loadChangeContext,
|
|
18
|
+
nothingToRelease,
|
|
19
|
+
staleReleasePrs
|
|
20
|
+
} from "./chunk-IDKCWSM5.js";
|
|
29
21
|
import {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
completeGlossaryDefinitions,
|
|
33
|
-
defineDecision,
|
|
34
|
-
linkDecision,
|
|
35
|
-
loadGlossary,
|
|
36
|
-
readCatalog,
|
|
37
|
-
resolveTermId,
|
|
38
|
-
scanGlossary,
|
|
39
|
-
writeDecisions
|
|
40
|
-
} from "./chunk-27NKUS3X.js";
|
|
22
|
+
readCatalog
|
|
23
|
+
} from "./chunk-J2JAKCIW.js";
|
|
41
24
|
import {
|
|
42
25
|
BUILT_IN_EXTRACTORS,
|
|
43
26
|
SHIPPED_DIALECTS_DIR,
|
|
44
27
|
dialectExtractor,
|
|
45
28
|
loadShippedDialects,
|
|
46
29
|
runDialectTests
|
|
47
|
-
} from "./chunk-
|
|
48
|
-
import {
|
|
49
|
-
baseClonePath,
|
|
50
|
-
checkoutState,
|
|
51
|
-
createGit,
|
|
52
|
-
readChangeRepos
|
|
53
|
-
} from "./chunk-EFHQ3TWP.js";
|
|
30
|
+
} from "./chunk-CQDGOPGH.js";
|
|
54
31
|
import {
|
|
55
32
|
DEFAULT_IGNORES,
|
|
56
33
|
fsRepo,
|
|
57
34
|
scanRepo
|
|
58
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-3NFFJL5D.js";
|
|
59
36
|
import {
|
|
60
|
-
|
|
61
|
-
|
|
37
|
+
baseClonePath,
|
|
38
|
+
checkoutState,
|
|
39
|
+
createGit,
|
|
40
|
+
readChangeRepos
|
|
41
|
+
} from "./chunk-PKBHS4AA.js";
|
|
62
42
|
import {
|
|
63
43
|
catalogDirOf,
|
|
44
|
+
effectiveComponentTypes,
|
|
64
45
|
external_exports,
|
|
46
|
+
factsDirOf,
|
|
65
47
|
loadOrgPack,
|
|
66
48
|
mergeCatalog,
|
|
67
49
|
normalizePath,
|
|
68
50
|
orgPackDirOf,
|
|
51
|
+
parseFacts
|
|
52
|
+
} from "./chunk-Q2TECDIT.js";
|
|
53
|
+
import {
|
|
69
54
|
require_dist
|
|
70
|
-
} from "./chunk-
|
|
55
|
+
} from "./chunk-BQGDB6ZL.js";
|
|
71
56
|
import {
|
|
72
57
|
__toESM
|
|
73
58
|
} from "./chunk-TV45EUGM.js";
|
|
74
59
|
|
|
75
|
-
// packages/cli/dist/quality-commands.js
|
|
76
|
-
import { appendFile, mkdir, writeFile } from "node:fs/promises";
|
|
77
|
-
import { dirname, join as join4 } from "node:path";
|
|
78
|
-
|
|
79
60
|
// packages/ci/dist/config.js
|
|
80
61
|
var import_yaml = __toESM(require_dist(), 1);
|
|
81
62
|
import { readFile } from "node:fs/promises";
|
|
@@ -501,6 +482,8 @@ async function repoDrift(o) {
|
|
|
501
482
|
const merged = mergeCatalog({
|
|
502
483
|
// A fetched copy of the catalog has no manifest, so no declared hosts: route by basepath.
|
|
503
484
|
...orgPackDir ? {} : { gatewayByBasepath: true },
|
|
485
|
+
// ADR 0180: the organisation's component types, as the scan merges with them (no false drift).
|
|
486
|
+
componentTypes: new Set(effectiveComponentTypes(op.componentTypes).map((t) => t.id)),
|
|
504
487
|
records: [...context, ...otherEnds(catalog.records, repoId, components), ...scan.records],
|
|
505
488
|
repos: manifest.map((r) => ({
|
|
506
489
|
id: r.id,
|
|
@@ -657,17 +640,17 @@ function driftMarkdown(r) {
|
|
|
657
640
|
const n = r.items.filter((i) => i.kind !== "planned").length;
|
|
658
641
|
const planned = r.counts.planned;
|
|
659
642
|
const head = !r.drift ? `No drift: ${r.repo} matches the catalog${planned ? ` (${planned} planned by approved changes)` : ""}.` : `${n} drift ${n === 1 ? "finding" : "findings"} in ${r.repo}${r.mode === "warn" ? " (warn-only: the pipeline passes)" : ""}.`;
|
|
660
|
-
const
|
|
643
|
+
const lines = [`## Atticus drift check: ${r.repo}`, "", head];
|
|
661
644
|
if (r.items.length) {
|
|
662
|
-
|
|
645
|
+
lines.push("", "| What | Kind | Id | Details |", "| --- | --- | --- | --- |");
|
|
663
646
|
for (const i of r.items)
|
|
664
|
-
|
|
647
|
+
lines.push(`| ${KIND_WORD[i.kind]} | ${i.subject} | ${cell(i.id)} | ${cell(i.summary)}${where(i).length ? ` (${where(i).join(", ")})` : ""} |`);
|
|
665
648
|
}
|
|
666
649
|
if (r.drift && r.mode === "block")
|
|
667
|
-
|
|
650
|
+
lines.push("", "Fix the code, or record the change in the catalog: plan it in an approved change's design, or rescan the estate once it is merged.");
|
|
668
651
|
if (r.problems.length)
|
|
669
|
-
|
|
670
|
-
return `${
|
|
652
|
+
lines.push("", "Problems:", ...r.problems.map((p) => `- ${p}`));
|
|
653
|
+
return `${lines.join("\n")}
|
|
671
654
|
`;
|
|
672
655
|
}
|
|
673
656
|
|
|
@@ -812,6 +795,34 @@ function pipelineSnippet(kind) {
|
|
|
812
795
|
import { existsSync as existsSync2 } from "node:fs";
|
|
813
796
|
import { readFile as readFile2 } from "node:fs/promises";
|
|
814
797
|
import { join as join3 } from "node:path";
|
|
798
|
+
var short = (c) => c.slice(0, 12);
|
|
799
|
+
var sameCommit = (a, b) => a.startsWith(b) || b.startsWith(a);
|
|
800
|
+
var plural = (n, one, many = `${one}s`) => `${n} ${n === 1 ? one : many}`;
|
|
801
|
+
async function factsAtMerge(root, r, merged, catalog) {
|
|
802
|
+
const where2 = `${short(merged)}, the commit its release merged into ${r.base}`;
|
|
803
|
+
const readAgain = `read it again (Map \u203A Trust \u203A Freshness: Read again, or atticus map ${r.id}), then atticus verify ${r.id} --write, so the catalog says what shipped.`;
|
|
804
|
+
const text = await readFile2(join3(factsDirOf(root), `${r.id}.jsonl`), "utf8").catch(() => "");
|
|
805
|
+
const parsed = text.trim() ? parseFacts(text) : void 0;
|
|
806
|
+
const facts = parsed?.ok ? parsed.facts : [];
|
|
807
|
+
if (!facts.length)
|
|
808
|
+
return {
|
|
809
|
+
code: "needs-reading",
|
|
810
|
+
message: `${r.id}: no facts were read at ${where2}: ${readAgain}`
|
|
811
|
+
};
|
|
812
|
+
const other = [...new Set(facts.map((f) => f.commit))].filter((c) => !sameCommit(c, merged));
|
|
813
|
+
if (other.length)
|
|
814
|
+
return {
|
|
815
|
+
code: "needs-reading",
|
|
816
|
+
message: `${r.id}: its facts were read at ${other.map(short).join(", ")}, not at ${where2}: ${readAgain}`
|
|
817
|
+
};
|
|
818
|
+
const stale = (await catalog()).filter((x) => x.evidence.some((e) => e.repo === r.id && e.commit && !sameCommit(e.commit, merged))).length;
|
|
819
|
+
if (stale)
|
|
820
|
+
return {
|
|
821
|
+
code: "catalog-stale",
|
|
822
|
+
message: `${r.id}: its facts are of the merged commit ${short(merged)}, but ${plural(stale, "catalog record")} still ${stale === 1 ? "cites" : "cite"} another commit: write them into the catalog (atticus verify ${r.id} --write, or Apply on the Map).`
|
|
823
|
+
};
|
|
824
|
+
return void 0;
|
|
825
|
+
}
|
|
815
826
|
async function archiveGate(root, changeId, o = {}) {
|
|
816
827
|
const change = await changeStore(root).read(changeId);
|
|
817
828
|
const blockers = [];
|
|
@@ -832,11 +843,26 @@ async function archiveGate(root, changeId, o = {}) {
|
|
|
832
843
|
for (const r of await checkFindings(root, change, gates))
|
|
833
844
|
blockers.push({ code: "finding", message: r.message });
|
|
834
845
|
const repos = (await readChangeRepos(root, change.id))?.repos ?? [];
|
|
846
|
+
const mustMerge = config.archive.requireMergedPrs;
|
|
847
|
+
const nothing = await nothingToRelease(root, change.id, o.git ? { git: o.git } : {});
|
|
848
|
+
const stale = await staleReleasePrs(root, change.id, o.git ? { git: o.git } : {});
|
|
835
849
|
for (const r of repos) {
|
|
836
|
-
if (r.pr &&
|
|
850
|
+
if (!r.pr && nothing.has(r.id))
|
|
851
|
+
continue;
|
|
852
|
+
if (mustMerge && (!r.pr || r.pr.state === "closed"))
|
|
853
|
+
blockers.push({
|
|
854
|
+
code: "pr-missing",
|
|
855
|
+
message: `${r.id}: ${r.pr ? `release PR #${r.pr.number} was closed without merging` : `no release PR from ${r.branch} into ${r.base} was raised`}, so the code never reached ${r.base}: raise the release PRs (Release \u203A Raise the release PRs, or atticus change release-prs ${change.id} --approve), and merge them on the Git host.`
|
|
856
|
+
});
|
|
857
|
+
else if (mustMerge && r.pr && r.pr.state !== "merged")
|
|
837
858
|
blockers.push({
|
|
838
859
|
code: "pr-open",
|
|
839
|
-
message: `${r.id}: PR #${r.pr.number} is ${r.pr.state};
|
|
860
|
+
message: `${r.id}: release PR #${r.pr.number} is ${r.pr.state}; a person merges it on the Git host before archiving.`
|
|
861
|
+
});
|
|
862
|
+
else if (mustMerge && r.pr?.state === "merged" && stale.has(r.id))
|
|
863
|
+
blockers.push({
|
|
864
|
+
code: "release-pr-stale",
|
|
865
|
+
message: `${r.id}: the change branch moved past release PR #${r.pr.number} after it merged, so the newer work isn't in ${r.base}: raise the release PRs again (atticus change release-prs ${change.id} --approve) and merge the new one.`
|
|
840
866
|
});
|
|
841
867
|
if (r.build.status === "failed")
|
|
842
868
|
blockers.push({
|
|
@@ -845,6 +871,8 @@ async function archiveGate(root, changeId, o = {}) {
|
|
|
845
871
|
});
|
|
846
872
|
else if (r.build.status === "running")
|
|
847
873
|
blockers.push({ code: "build-running", message: `${r.id}: the build is still running.` });
|
|
874
|
+
else if (r.build.status === "not-run" && r.pr?.state === "merged")
|
|
875
|
+
notes.push(`${r.id}: the Git host reported no checks on release PR #${r.pr.number}, so no build is recorded for what merged.`);
|
|
848
876
|
else if (r.build.status === "not-run" && r.pr)
|
|
849
877
|
blockers.push({
|
|
850
878
|
code: "build-not-run",
|
|
@@ -852,48 +880,77 @@ async function archiveGate(root, changeId, o = {}) {
|
|
|
852
880
|
});
|
|
853
881
|
}
|
|
854
882
|
const drift = [];
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
});
|
|
864
|
-
}
|
|
883
|
+
for (const f of o.driftReports ?? []) {
|
|
884
|
+
try {
|
|
885
|
+
drift.push(JSON.parse(await readFile2(f, "utf8")));
|
|
886
|
+
} catch (e) {
|
|
887
|
+
blockers.push({
|
|
888
|
+
code: "drift-error",
|
|
889
|
+
message: `Can't read the drift report ${f}: ${e.message.split("\n")[0]}.`
|
|
890
|
+
});
|
|
865
891
|
}
|
|
866
|
-
}
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
892
|
+
}
|
|
893
|
+
const git = o.git ?? createGit();
|
|
894
|
+
const readersDecide = /* @__PURE__ */ new Set();
|
|
895
|
+
let records;
|
|
896
|
+
const catalog = async () => records ??= (await readCatalog(join3(catalogDirOf(root), "generated"))).records;
|
|
897
|
+
for (const r of repos) {
|
|
898
|
+
if (!r.pr && nothing.has(r.id))
|
|
899
|
+
continue;
|
|
900
|
+
if (mustMerge && r.pr?.state !== "merged")
|
|
901
|
+
continue;
|
|
902
|
+
const report = drift.find((d) => d.repo === r.id);
|
|
903
|
+
const dir = o.repoDir?.(r.id) ?? baseClonePath(root, r.id);
|
|
904
|
+
const there = !!dir && existsSync2(dir);
|
|
905
|
+
const merged = o.commit ?? (report && !/^0+$/.test(report.scanned.commit) ? report.scanned.commit : void 0) ?? (there ? await git(["rev-parse", "HEAD"], dir).then((x) => x.stdout.trim() || void 0).catch(() => void 0) : void 0);
|
|
906
|
+
if (!merged) {
|
|
907
|
+
notes.push(`No clone of ${r.id} here to say which commit merged, so its facts weren't compared: sync the workspace (atticus workspace sync), or pass its pipeline's drift report.`);
|
|
908
|
+
continue;
|
|
909
|
+
}
|
|
910
|
+
if (r.pr?.state === "merged" && r.baseSha && sameCommit(merged, r.baseSha)) {
|
|
911
|
+
blockers.push({
|
|
912
|
+
code: "not-synced",
|
|
913
|
+
message: `${r.id}: the clone here is still at ${short(merged)}, where the change started, though release PR #${r.pr.number} merged: sync the workspace (atticus workspace sync), then read the repo again.`
|
|
914
|
+
});
|
|
915
|
+
continue;
|
|
916
|
+
}
|
|
917
|
+
const readByAssistant = existsSync2(join3(factsDirOf(root), `${r.id}.jsonl`)) || (await catalog()).some((x) => x.evidence.some((e) => e.repo === r.id && e.by === "assistant"));
|
|
918
|
+
if (readByAssistant) {
|
|
919
|
+
const b = await factsAtMerge(root, r, merged, catalog);
|
|
920
|
+
if (b)
|
|
921
|
+
blockers.push(b);
|
|
922
|
+
} else if (report)
|
|
923
|
+
readersDecide.add(r.id);
|
|
924
|
+
if (!report && there) {
|
|
873
925
|
try {
|
|
874
|
-
drift.push(await repoDrift({
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
repo: r.id,
|
|
878
|
-
...o.commit ? { commit: o.commit } : {}
|
|
879
|
-
}));
|
|
926
|
+
drift.push(await repoDrift({ repoDir: dir, catalog: root, repo: r.id, commit: merged }));
|
|
927
|
+
if (!readByAssistant)
|
|
928
|
+
readersDecide.add(r.id);
|
|
880
929
|
} catch (e) {
|
|
881
930
|
if (!(e instanceof DriftError))
|
|
882
931
|
throw e;
|
|
883
|
-
|
|
932
|
+
if (readByAssistant)
|
|
933
|
+
notes.push(`Cross-check only: the built-in readers couldn't read ${r.id}: ${e.message}`);
|
|
934
|
+
else
|
|
935
|
+
blockers.push({ code: "drift-error", message: `${r.id}: ${e.message}` });
|
|
884
936
|
}
|
|
885
|
-
}
|
|
886
|
-
|
|
887
|
-
notes.push("The change has no repos (repos.yaml), so there was no code to check for drift.");
|
|
937
|
+
} else if (!report && !readByAssistant)
|
|
938
|
+
notes.push(`No clone of ${r.id} here, so its drift wasn't checked; sync the workspace, or pass its pipeline's drift report.`);
|
|
888
939
|
}
|
|
940
|
+
if (!repos.length)
|
|
941
|
+
notes.push("The change has no repos (repos.yaml), so there was no code to check for drift.");
|
|
889
942
|
for (const d of drift) {
|
|
890
943
|
const items = d.items.filter((i) => i.kind !== "planned");
|
|
891
944
|
if (!items.length)
|
|
892
945
|
continue;
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
946
|
+
if (readersDecide.has(d.repo)) {
|
|
947
|
+
blockers.push({
|
|
948
|
+
code: "drift",
|
|
949
|
+
message: `${d.repo}: ${items.length} catalog drift ${items.length === 1 ? "finding" : "findings"} (${items.slice(0, 3).map((i) => i.summary.replace(/\.$/, "")).join("; ")}${items.length > 3 ? "; ..." : ""}).`
|
|
950
|
+
});
|
|
951
|
+
continue;
|
|
952
|
+
}
|
|
953
|
+
notes.push(`Cross-check only, not blocking: the built-in readers see ${plural(items.length, "difference")} in ${d.repo} (${items.slice(0, 3).map((i) => i.summary.replace(/\.$/, "")).join("; ")}${items.length > 3 ? "; ..." : ""}). The facts read and verified at the merged commit decide (ADR 0074).`);
|
|
897
954
|
}
|
|
898
955
|
const unique = [...new Map(blockers.map((b) => [b.message, b])).values()];
|
|
899
956
|
return {
|
|
@@ -906,342 +963,20 @@ async function archiveGate(root, changeId, o = {}) {
|
|
|
906
963
|
};
|
|
907
964
|
}
|
|
908
965
|
|
|
909
|
-
// packages/cli/dist/quality-commands.js
|
|
910
|
-
var KNOWN = /* @__PURE__ */ new Set([
|
|
911
|
-
"TestgenError",
|
|
912
|
-
"PlannerError",
|
|
913
|
-
"ChangeError",
|
|
914
|
-
"ChangeFileError",
|
|
915
|
-
"GlossaryError",
|
|
916
|
-
"RuntimeConfigError"
|
|
917
|
-
]);
|
|
918
|
-
function fail(io, e) {
|
|
919
|
-
if (e instanceof Error && KNOWN.has(e.name)) {
|
|
920
|
-
io.err(e.message);
|
|
921
|
-
return e.code === "invalid" ? 2 : 1;
|
|
922
|
-
}
|
|
923
|
-
throw e;
|
|
924
|
-
}
|
|
925
|
-
var iso = (d) => d.toISOString().replace(/\.\d{3}Z$/, "Z");
|
|
926
|
-
var lines = (io, text) => {
|
|
927
|
-
for (const l of text.trimEnd().split("\n"))
|
|
928
|
-
io.out(l);
|
|
929
|
-
};
|
|
930
|
-
var plural = (n, w) => `${n} ${w}${n === 1 ? "" : "s"}`;
|
|
931
|
-
async function runtimeOf(root, mode, deps) {
|
|
932
|
-
if (deps.runtime)
|
|
933
|
-
return deps.runtime;
|
|
934
|
-
if (!mode && !process.env.ATTICUS_RUNTIME)
|
|
935
|
-
return void 0;
|
|
936
|
-
return (await runtimeForCli(root, mode ? { mode } : {})).runtime;
|
|
937
|
-
}
|
|
938
|
-
async function testsGenerate(root, changeId, storyId, o, io, deps = {}) {
|
|
939
|
-
if (!changeId || !storyId) {
|
|
940
|
-
io.err("Usage: atticus tests generate <change> <story> [--framework <id>] [--force] [--check] [--mode <mode>] [--json]");
|
|
941
|
-
return 2;
|
|
942
|
-
}
|
|
943
|
-
try {
|
|
944
|
-
const runtime = await runtimeOf(root, o.mode, deps);
|
|
945
|
-
const r = await generateTests(root, changeId, storyId, {
|
|
946
|
-
...o.framework ? { framework: o.framework } : {},
|
|
947
|
-
...o.force ? { force: true } : {},
|
|
948
|
-
...o.check ? { check: true } : {},
|
|
949
|
-
...o.resume ? { resume: o.resume } : {},
|
|
950
|
-
...runtime ? { runtime } : {},
|
|
951
|
-
now: deps.now?.() ?? /* @__PURE__ */ new Date()
|
|
952
|
-
});
|
|
953
|
-
const kept = r.files.filter((f) => f.action === "kept-edited" || f.action === "kept-not-generated");
|
|
954
|
-
if (o.json) {
|
|
955
|
-
io.out(JSON.stringify({
|
|
956
|
-
change: r.change,
|
|
957
|
-
story: r.story,
|
|
958
|
-
strategy: r.model.strategy,
|
|
959
|
-
kinds: r.model.kinds,
|
|
960
|
-
names: r.names.by,
|
|
961
|
-
...r.names.waiting ? { waiting: r.names.waiting } : {},
|
|
962
|
-
files: r.files,
|
|
963
|
-
manifest: r.manifest,
|
|
964
|
-
notes: r.notes,
|
|
965
|
-
gaps: r.gaps
|
|
966
|
-
}, null, 2));
|
|
967
|
-
return kept.length ? 1 : 0;
|
|
968
|
-
}
|
|
969
|
-
const count = (a) => r.files.filter((f) => f.action === a).length;
|
|
970
|
-
const cases = r.model.repos.reduce((n, x) => n + x.cases.length, 0);
|
|
971
|
-
io.out(`${o.check ? "Would write" : "Generated"} ${plural(cases, "test case")} for ${r.story} in ${plural(r.files.length, "file")}: ${count("created")} new, ${count("updated")} updated, ${count("unchanged")} unchanged${kept.length ? `, ${kept.length} kept` : ""}.`);
|
|
972
|
-
for (const l of table(["ACTION", "REPO", "FRAMEWORK", "FILE"], r.files.map((f) => [f.action, f.repo || "-", f.generator, f.path])))
|
|
973
|
-
io.out(l);
|
|
974
|
-
for (const k of r.model.kinds.filter((x) => !x.generated))
|
|
975
|
-
io.out(`No ${k.type} tests: ${k.why}`);
|
|
976
|
-
for (const n of r.notes)
|
|
977
|
-
io.out(n);
|
|
978
|
-
for (const g of r.gaps)
|
|
979
|
-
io.out(`Gap: ${g}`);
|
|
980
|
-
if (r.names.waiting)
|
|
981
|
-
io.out(`The test writer is with your assistant (run ${r.names.waiting}); the files use plain names until you run: atticus tests generate ${changeId} ${storyId} --resume ${r.names.waiting}`);
|
|
982
|
-
if (!o.check)
|
|
983
|
-
io.out(`Manifest: ${r.manifest}`);
|
|
984
|
-
return kept.length ? 1 : 0;
|
|
985
|
-
} catch (e) {
|
|
986
|
-
return fail(io, e);
|
|
987
|
-
}
|
|
988
|
-
}
|
|
989
|
-
async function traceCommand(root, changeId, o, io, deps = {}) {
|
|
990
|
-
if (!changeId) {
|
|
991
|
-
io.err("Usage: atticus trace <change> [--json | --csv] [--no-write]");
|
|
992
|
-
return 2;
|
|
993
|
-
}
|
|
994
|
-
try {
|
|
995
|
-
const m = await traceMatrix(root, changeId, { git: deps.git ?? createGit() });
|
|
996
|
-
for (const p of m.problems)
|
|
997
|
-
io.err(p);
|
|
998
|
-
const w = o.write === false ? void 0 : await writeTraceFindings(root, m, iso(deps.now?.() ?? /* @__PURE__ */ new Date()));
|
|
999
|
-
if (o.json)
|
|
1000
|
-
io.out(JSON.stringify({ ...m, ...w ? { round: w.round ?? null } : {} }, null, 2));
|
|
1001
|
-
else if (o.csv)
|
|
1002
|
-
lines(io, matrixCsv(m));
|
|
1003
|
-
else {
|
|
1004
|
-
lines(io, matrixMarkdown(m));
|
|
1005
|
-
if (w)
|
|
1006
|
-
io.out(w.unchanged ? `Findings on the trace gate are unchanged (round ${w.round ?? "none"}).` : `Wrote ${plural(w.findings.length, "finding")} to review/trace/${w.round}/.`);
|
|
1007
|
-
}
|
|
1008
|
-
return m.gaps.some((g) => g.kind !== "test-without-requirement") ? 1 : 0;
|
|
1009
|
-
} catch (e) {
|
|
1010
|
-
return fail(io, e);
|
|
1011
|
-
}
|
|
1012
|
-
}
|
|
1013
|
-
async function ciDrift(repoDir, o, io, deps = {}) {
|
|
1014
|
-
if (!o.catalog) {
|
|
1015
|
-
io.err("Usage: atticus ci drift [repo-dir] --catalog <metarepo or catalog folder> [--repo <id>] [--json [file]] [--junit <file>] [--summary <file>] [--warn-only]");
|
|
1016
|
-
return 2;
|
|
1017
|
-
}
|
|
1018
|
-
try {
|
|
1019
|
-
const r = await repoDrift({
|
|
1020
|
-
repoDir,
|
|
1021
|
-
catalog: o.catalog,
|
|
1022
|
-
...o.repo ? { repo: o.repo } : {},
|
|
1023
|
-
...o.warnOnly ? { warnOnly: true } : {},
|
|
1024
|
-
...deps.commit ? { commit: deps.commit } : {},
|
|
1025
|
-
...deps.git ? { git: deps.git } : {}
|
|
1026
|
-
});
|
|
1027
|
-
const put = async (file, text) => {
|
|
1028
|
-
await mkdir(dirname(file), { recursive: true });
|
|
1029
|
-
await writeFile(file, text, "utf8");
|
|
1030
|
-
};
|
|
1031
|
-
if (typeof o.json === "string")
|
|
1032
|
-
await put(o.json, driftJson(r));
|
|
1033
|
-
if (o.junit)
|
|
1034
|
-
await put(o.junit, driftJUnit(r));
|
|
1035
|
-
if (o.summary) {
|
|
1036
|
-
await mkdir(dirname(o.summary), { recursive: true });
|
|
1037
|
-
await appendFile(o.summary, driftMarkdown(r), "utf8");
|
|
1038
|
-
}
|
|
1039
|
-
if (o.json === true)
|
|
1040
|
-
io.out(driftJson(r).trimEnd());
|
|
1041
|
-
else
|
|
1042
|
-
lines(io, driftMarkdown(r));
|
|
1043
|
-
return driftExitCode(r);
|
|
1044
|
-
} catch (e) {
|
|
1045
|
-
if (e instanceof DriftError) {
|
|
1046
|
-
io.err(e.message);
|
|
1047
|
-
return 2;
|
|
1048
|
-
}
|
|
1049
|
-
throw e;
|
|
1050
|
-
}
|
|
1051
|
-
}
|
|
1052
|
-
async function ciSnippet(kind, io, o = {}) {
|
|
1053
|
-
const s = kind ? pipelineSnippet(kind) : void 0;
|
|
1054
|
-
if (!s) {
|
|
1055
|
-
io.err(`Usage: atticus ci snippet <${SNIPPET_KINDS.join("|")}> [--write <repo-dir>]`);
|
|
1056
|
-
return 2;
|
|
1057
|
-
}
|
|
1058
|
-
if (o.write) {
|
|
1059
|
-
const file = join4(o.write, ...s.path.split("/"));
|
|
1060
|
-
await mkdir(dirname(file), { recursive: true });
|
|
1061
|
-
await writeFile(file, s.content, "utf8");
|
|
1062
|
-
io.out(`Wrote ${s.path}. Set the variables its first lines name, then commit it.`);
|
|
1063
|
-
return 0;
|
|
1064
|
-
}
|
|
1065
|
-
lines(io, s.content);
|
|
1066
|
-
return 0;
|
|
1067
|
-
}
|
|
1068
|
-
async function ciArchiveGate(root, changeId, o, io, deps = {}) {
|
|
1069
|
-
if (!changeId) {
|
|
1070
|
-
io.err("Usage: atticus ci archive-gate <change> [--drift <report.json>...] [--json]");
|
|
1071
|
-
return 2;
|
|
1072
|
-
}
|
|
1073
|
-
let r;
|
|
1074
|
-
try {
|
|
1075
|
-
r = await archiveGate(root, changeId, {
|
|
1076
|
-
...o.drift?.length ? { driftReports: o.drift } : {},
|
|
1077
|
-
...deps.commit ? { commit: deps.commit } : {}
|
|
1078
|
-
});
|
|
1079
|
-
} catch (e) {
|
|
1080
|
-
if (e instanceof Error && e.name === "ChangeFileError") {
|
|
1081
|
-
io.err(e.message);
|
|
1082
|
-
return 2;
|
|
1083
|
-
}
|
|
1084
|
-
throw e;
|
|
1085
|
-
}
|
|
1086
|
-
if (o.json)
|
|
1087
|
-
io.out(JSON.stringify(r, null, 2));
|
|
1088
|
-
else {
|
|
1089
|
-
io.out(r.pass ? `${changeId} may be archived: no blockers, builds passed and the catalog matches its repos.` : `${changeId} can't be archived yet (${plural(r.blockers.length, "blocker")}):`);
|
|
1090
|
-
for (const b of r.blockers)
|
|
1091
|
-
io.out(`- ${b.message}`);
|
|
1092
|
-
for (const n of r.notes)
|
|
1093
|
-
io.out(n);
|
|
1094
|
-
}
|
|
1095
|
-
return r.pass ? 0 : 1;
|
|
1096
|
-
}
|
|
1097
|
-
var short = (s, n = 70) => s.length <= n ? s : `${s.slice(0, n - 3)}...`;
|
|
1098
|
-
var sourceOf = (flags, confidence) => confidence === "asserted" ? "person" : flags?.includes("ai-proposed") ? "ai" : flags?.includes("undefined") ? "code" : "wiki";
|
|
1099
|
-
async function glossaryList(root, o, io) {
|
|
1100
|
-
const g = await loadGlossary(root);
|
|
1101
|
-
for (const p of g.problems)
|
|
1102
|
-
io.err(p);
|
|
1103
|
-
if (o.json) {
|
|
1104
|
-
io.out(JSON.stringify({
|
|
1105
|
-
terms: g.terms,
|
|
1106
|
-
conflicts: g.build.conflicts,
|
|
1107
|
-
hints: g.build.hints,
|
|
1108
|
-
synonyms: Object.fromEntries(g.build.entries.filter((e) => e.aliases.length).map((e) => [e.id, e.aliases]))
|
|
1109
|
-
}, null, 2));
|
|
1110
|
-
return 0;
|
|
1111
|
-
}
|
|
1112
|
-
if (!g.terms.length) {
|
|
1113
|
-
io.out("The glossary is empty: no wiki page defines a term and the catalog has no domain words yet.");
|
|
1114
|
-
return 0;
|
|
1115
|
-
}
|
|
1116
|
-
for (const l of table(["TERM", "ID", "FROM", "FLAGS", "DEFINITION"], g.terms.map((t) => [
|
|
1117
|
-
t.term,
|
|
1118
|
-
t.id,
|
|
1119
|
-
sourceOf(t.flags, t.confidence),
|
|
1120
|
-
(t.flags ?? []).join(","),
|
|
1121
|
-
short(t.definition)
|
|
1122
|
-
])))
|
|
1123
|
-
io.out(l);
|
|
1124
|
-
io.out(`${plural(g.terms.length, "term")}, ${plural(g.build.conflicts.filter((c) => !c.resolved).length, "conflict")}.`);
|
|
1125
|
-
return 0;
|
|
1126
|
-
}
|
|
1127
|
-
async function glossaryScan(root, o, io, deps = {}) {
|
|
1128
|
-
try {
|
|
1129
|
-
const runtime = await runtimeOf(root, o.mode, deps);
|
|
1130
|
-
const r = await scanGlossary(root, {
|
|
1131
|
-
...runtime ? { runtime } : {},
|
|
1132
|
-
...deps.now ? { now: deps.now() } : {}
|
|
1133
|
-
});
|
|
1134
|
-
if (o.json) {
|
|
1135
|
-
for (const p of r.problems)
|
|
1136
|
-
io.err(p);
|
|
1137
|
-
io.out(JSON.stringify({
|
|
1138
|
-
terms: r.terms.length,
|
|
1139
|
-
written: r.written,
|
|
1140
|
-
removed: r.removed,
|
|
1141
|
-
conflicts: r.build.conflicts,
|
|
1142
|
-
hints: r.build.hints,
|
|
1143
|
-
...r.propose ? { proposals: r.propose.proposals.length, discarded: r.propose.discarded } : {}
|
|
1144
|
-
}, null, 2));
|
|
1145
|
-
return 0;
|
|
1146
|
-
}
|
|
1147
|
-
printGlossaryScan(r, io);
|
|
1148
|
-
return 0;
|
|
1149
|
-
} catch (e) {
|
|
1150
|
-
return fail(io, e);
|
|
1151
|
-
}
|
|
1152
|
-
}
|
|
1153
|
-
function printGlossaryScan(r, io) {
|
|
1154
|
-
for (const p of r.problems)
|
|
1155
|
-
io.err(p);
|
|
1156
|
-
const open = r.build.conflicts.filter((c) => !c.resolved);
|
|
1157
|
-
io.out(`The glossary has ${plural(r.terms.length, "term")}; ${plural(r.written.length, "file")} written and ${plural(r.removed.length, "file")} removed in catalog/generated.`);
|
|
1158
|
-
if (r.propose)
|
|
1159
|
-
io.out(r.propose.waiting ? `The glossary definer is with your assistant (run ${r.propose.waiting}). When it is done, run: atticus handoff done ${r.propose.waiting}` : `The glossary definer proposed ${plural(r.propose.proposals.length, "definition")} (kept inferred until a person defines the term).`);
|
|
1160
|
-
for (const d of r.propose?.discarded ?? [])
|
|
1161
|
-
if (d.term && !r.propose?.waiting)
|
|
1162
|
-
io.err(`Discarded ${d.term}: ${d.reason}`);
|
|
1163
|
-
for (const c of open)
|
|
1164
|
-
io.out(`Conflict: ${c.message}`);
|
|
1165
|
-
for (const h of r.build.hints)
|
|
1166
|
-
io.out(`Naming: ${h.message}`);
|
|
1167
|
-
}
|
|
1168
|
-
async function completeGlossaryScan(root, run, io, deps = {}) {
|
|
1169
|
-
try {
|
|
1170
|
-
const r = await completeGlossaryDefinitions(root, run, deps.now ? { now: deps.now } : {});
|
|
1171
|
-
printGlossaryScan(r, io);
|
|
1172
|
-
return 0;
|
|
1173
|
-
} catch (e) {
|
|
1174
|
-
return fail(io, e);
|
|
1175
|
-
}
|
|
1176
|
-
}
|
|
1177
|
-
async function decide(root, io, make, said) {
|
|
1178
|
-
try {
|
|
1179
|
-
const g = await loadGlossary(root);
|
|
1180
|
-
const ds = make(g);
|
|
1181
|
-
const files = await writeDecisions(join4(g.catalogDir, "curated"), ds);
|
|
1182
|
-
await scanGlossary(root);
|
|
1183
|
-
io.out(`Wrote ${files.map((f) => `catalog/curated/${f}`).join(" and ")}: ${said}. Commit it so every scan keeps it.`);
|
|
1184
|
-
return 0;
|
|
1185
|
-
} catch (e) {
|
|
1186
|
-
if (e instanceof GlossaryError) {
|
|
1187
|
-
io.err(e.message);
|
|
1188
|
-
return e.code === "invalid" ? 2 : 1;
|
|
1189
|
-
}
|
|
1190
|
-
throw e;
|
|
1191
|
-
}
|
|
1192
|
-
}
|
|
1193
|
-
async function glossaryDefine(root, term, definition, o, io) {
|
|
1194
|
-
if (!term || !definition || !o.by) {
|
|
1195
|
-
io.err('Usage: atticus glossary define <term> "<definition>" [--by <handle>] [--owner <team>]');
|
|
1196
|
-
return 2;
|
|
1197
|
-
}
|
|
1198
|
-
return decide(root, io, (g) => {
|
|
1199
|
-
const existing = g.terms.find((t) => t.id === resolveTermId(term));
|
|
1200
|
-
return [
|
|
1201
|
-
defineDecision(term, definition, {
|
|
1202
|
-
by: o.by,
|
|
1203
|
-
...o.owner ? { owner: o.owner } : {},
|
|
1204
|
-
...existing ? { existing } : {}
|
|
1205
|
-
})
|
|
1206
|
-
];
|
|
1207
|
-
}, `${resolveTermId(term)} is defined and asserted`);
|
|
1208
|
-
}
|
|
1209
|
-
async function glossaryLink(root, term, recordId, o, io) {
|
|
1210
|
-
if (!term || !recordId || !o.by) {
|
|
1211
|
-
io.err("Usage: atticus glossary link <term> <record-id | schema#field> [--by <handle>]");
|
|
1212
|
-
return 2;
|
|
1213
|
-
}
|
|
1214
|
-
return decide(root, io, (g) => {
|
|
1215
|
-
const id = resolveTermId(term);
|
|
1216
|
-
const t = g.terms.find((x) => x.id === id);
|
|
1217
|
-
if (!t)
|
|
1218
|
-
throw new GlossaryError("not-found", `There is no term ${id}. Define it first: atticus glossary define`);
|
|
1219
|
-
return [linkDecision(t, recordId, g.base, { by: o.by })];
|
|
1220
|
-
}, `${recordId} is linked to ${resolveTermId(term)}`);
|
|
1221
|
-
}
|
|
1222
|
-
async function glossaryAlias(root, term, names, o, io) {
|
|
1223
|
-
if (!term || !names.length || !o.by) {
|
|
1224
|
-
io.err('Usage: atticus glossary alias <term> "<other name>"... [--by <handle>]');
|
|
1225
|
-
return 2;
|
|
1226
|
-
}
|
|
1227
|
-
return decide(root, io, (g) => {
|
|
1228
|
-
const id = resolveTermId(term);
|
|
1229
|
-
const before = g.build.entries.find((e) => e.id === id)?.aliases ?? [];
|
|
1230
|
-
return [aliasDecision(id, [...before, ...names], { by: o.by })];
|
|
1231
|
-
}, `${names.join(", ")} ${names.length === 1 ? "is another name" : "are other names"} for ${resolveTermId(term)}`);
|
|
1232
|
-
}
|
|
1233
|
-
|
|
1234
966
|
export {
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
967
|
+
CiConfig,
|
|
968
|
+
DEFAULT_CI_CONFIG,
|
|
969
|
+
loadCiConfig,
|
|
970
|
+
ignored,
|
|
971
|
+
DRIFT_SCHEMA_VERSION,
|
|
972
|
+
DriftError,
|
|
973
|
+
resolveCatalog,
|
|
974
|
+
repoDrift,
|
|
975
|
+
driftExitCode,
|
|
976
|
+
driftJson,
|
|
977
|
+
driftJUnit,
|
|
978
|
+
driftMarkdown,
|
|
979
|
+
SNIPPET_KINDS,
|
|
980
|
+
pipelineSnippet,
|
|
981
|
+
archiveGate
|
|
1247
982
|
};
|