@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.
Files changed (284) hide show
  1. package/dist/bin.js +8 -4
  2. package/dist/chunk-23XVSEV5.js +49 -0
  3. package/dist/{chunk-ZDPAS56H.js → chunk-24OXGB3P.js} +8 -2
  4. package/dist/{chunk-7EOBHUMC.js → chunk-24XLDU72.js} +4 -3
  5. package/dist/{chunk-CR3MTH32.js → chunk-2F4CYZKJ.js} +86 -11
  6. package/dist/{chunk-6IU67AEK.js → chunk-2GF7OLF3.js} +23 -15
  7. package/dist/chunk-2IIMFOPM.js +41 -0
  8. package/dist/chunk-2LGRMVCA.js +617 -0
  9. package/dist/{chunk-XPCM366L.js → chunk-2MMCFP5C.js} +10 -8
  10. package/dist/{chunk-JBTK5OP2.js → chunk-2Q56PQPS.js} +6 -4
  11. package/dist/{chunk-Z6LF7HQN.js → chunk-2Q5EDGEO.js} +7 -5
  12. package/dist/{chunk-3USYZGRF.js → chunk-2RLKFUUL.js} +38 -27
  13. package/dist/chunk-2SKB4O2E.js +59 -0
  14. package/dist/{chunk-SP2I63OO.js → chunk-34S2WGOB.js} +87 -4
  15. package/dist/{chunk-GQ4N4WKF.js → chunk-3NFFJL5D.js} +33 -27
  16. package/dist/{chunk-SJRGMG6A.js → chunk-3NWDLGG6.js} +28 -25
  17. package/dist/{chunk-4WBVUHXN.js → chunk-3RM4UK6W.js} +20 -18
  18. package/dist/chunk-42SIDKEU.js +583 -0
  19. package/dist/{chunk-GLUX4EEP.js → chunk-4EURQWQD.js} +20 -15
  20. package/dist/chunk-4U276ICE.js +39 -0
  21. package/dist/{chunk-ZMFPW66A.js → chunk-53T4O55J.js} +4 -3
  22. package/dist/{chunk-6J5OKA4Y.js → chunk-57TDNMI3.js} +17 -15
  23. package/dist/chunk-5BD2KYLE.js +57 -0
  24. package/dist/{chunk-7EFILTCI.js → chunk-5F7GFN2F.js} +28 -0
  25. package/dist/chunk-5NMKONLP.js +95 -0
  26. package/dist/{chunk-7ZUIMTOU.js → chunk-5SJZW52K.js} +26 -24
  27. package/dist/{chunk-4RS5KZQD.js → chunk-63YRMR6J.js} +6 -5
  28. package/dist/chunk-66PPNOON.js +62 -0
  29. package/dist/chunk-6H3Z5JHH.js +64 -0
  30. package/dist/{chunk-CEXSU4S6.js → chunk-6MUGR4LS.js} +775 -89
  31. package/dist/{chunk-QSXK2RGH.js → chunk-6OJQOPUN.js} +5 -3
  32. package/dist/{chunk-MVZVGYXH.js → chunk-6PPOWY5E.js} +84 -14
  33. package/dist/{chunk-7EKXJZ2Y.js → chunk-6ZGLAACW.js} +299 -38
  34. package/dist/chunk-6ZJ5A7AF.js +222 -0
  35. package/dist/{chunk-L24C55VN.js → chunk-745DAZ4L.js} +142 -30
  36. package/dist/{chunk-Q4D5X7QB.js → chunk-7ASNL4Q4.js} +46 -24
  37. package/dist/chunk-7BR7IPOH.js +35 -0
  38. package/dist/{chunk-7WD63HU2.js → chunk-7DOR27HL.js} +6 -6
  39. package/dist/chunk-7FTTA3HD.js +341 -0
  40. package/dist/{chunk-OLQJTJJU.js → chunk-7GJS6DNX.js} +12 -3
  41. package/dist/{chunk-7JUKDRSZ.js → chunk-7IGKHZ4Z.js} +347 -226
  42. package/dist/{chunk-G2B4ZQGH.js → chunk-7IOWA5D5.js} +11 -6
  43. package/dist/{chunk-EBEW3XXQ.js → chunk-7JITZFJC.js} +7 -5
  44. package/dist/chunk-7MJSQTL5.js +174 -0
  45. package/dist/{chunk-I4JRCD6M.js → chunk-7UOMVMFG.js} +25 -17
  46. package/dist/{chunk-YY6ZQQBP.js → chunk-AFWUDXEM.js} +19 -7
  47. package/dist/chunk-AFZ3QA6W.js +47 -0
  48. package/dist/chunk-AJQ72EBM.js +420 -0
  49. package/dist/chunk-AJYXNTNZ.js +317 -0
  50. package/dist/chunk-AVTBS4OW.js +49 -0
  51. package/dist/{chunk-FHH4I4ZV.js → chunk-BDKC6H5P.js} +12 -6
  52. package/dist/{chunk-IPKHE5D6.js → chunk-BEVTIBRH.js} +1526 -875
  53. package/dist/chunk-BHT7QK4G.js +162 -0
  54. package/dist/{chunk-6JUBZBMW.js → chunk-BIGDQDHD.js} +6 -4
  55. package/dist/{chunk-2BFCZ3RK.js → chunk-BO4KX37X.js} +20 -18
  56. package/dist/chunk-BPK5P77O.js +115 -0
  57. package/dist/chunk-BQ4SQQC6.js +59 -0
  58. package/dist/chunk-BQGDB6ZL.js +7342 -0
  59. package/dist/{chunk-2ANOROX3.js → chunk-BTGPE6CR.js} +11 -9
  60. package/dist/chunk-BTY3HZBO.js +93 -0
  61. package/dist/{chunk-DPZHZQKE.js → chunk-BXYMYEJ4.js} +44 -10
  62. package/dist/{chunk-2RMYG36Q.js → chunk-C3RY6KU6.js} +309 -346
  63. package/dist/chunk-C4R4JLHE.js +40 -0
  64. package/dist/chunk-CADWLE2T.js +18 -0
  65. package/dist/chunk-CBGGOQWU.js +82 -0
  66. package/dist/chunk-CMDXGQTS.js +47 -0
  67. package/dist/{chunk-MC3H7736.js → chunk-CQDGOPGH.js} +58 -18
  68. package/dist/{chunk-HFQCFSJR.js → chunk-CX4RZ2KS.js} +4 -3
  69. package/dist/{chunk-PAMPPUR6.js → chunk-CXJ6FUKN.js} +1852 -207
  70. package/dist/{chunk-ABWHYWNI.js → chunk-D73UEXYW.js} +3 -3
  71. package/dist/chunk-DCZWQLYT.js +1205 -0
  72. package/dist/chunk-DLOBCJL6.js +48 -0
  73. package/dist/{chunk-4BN53TG3.js → chunk-DOBQKHIF.js} +31 -23
  74. package/dist/chunk-E3ISYXO3.js +423 -0
  75. package/dist/{chunk-7SW2QWLU.js → chunk-E6ZIEVOI.js} +16 -13
  76. package/dist/chunk-EBL2R3YG.js +43 -0
  77. package/dist/{chunk-AIOQPLA5.js → chunk-EGQRREQH.js} +41 -15
  78. package/dist/chunk-EHA7RMZ3.js +58 -0
  79. package/dist/{chunk-M766ZJ6W.js → chunk-EIPTLPFC.js} +38 -27
  80. package/dist/chunk-EMRIQUND.js +517 -0
  81. package/dist/{chunk-DFBCSHVT.js → chunk-EPCJQQWD.js} +6 -4
  82. package/dist/{chunk-RZPYKDWS.js → chunk-F3P7N7SF.js} +1 -1
  83. package/dist/{chunk-R77KLRB3.js → chunk-FFLNS6VP.js} +21 -18
  84. package/dist/chunk-FFTRTL6R.js +26 -0
  85. package/dist/{chunk-IHMLFRVV.js → chunk-FPJPLKDW.js} +62 -16
  86. package/dist/{chunk-JCZIKA4C.js → chunk-FSMSFDLD.js} +5 -4
  87. package/dist/{chunk-AVJDSJ2F.js → chunk-FUJM6RTF.js} +8 -7
  88. package/dist/chunk-FZOJFH7Q.js +132 -0
  89. package/dist/{chunk-QRAOANID.js → chunk-G6X77UJZ.js} +23 -21
  90. package/dist/{chunk-3ALD2W2A.js → chunk-GCWRWSU7.js} +10 -4
  91. package/dist/chunk-GIW4ZVDB.js +39 -0
  92. package/dist/{chunk-B2WLAWNJ.js → chunk-GUX3PTYM.js} +3 -3
  93. package/dist/{chunk-DPUYDDQG.js → chunk-GZY6RUZ6.js} +25 -3
  94. package/dist/chunk-H4VO6WG3.js +10 -0
  95. package/dist/{chunk-MMOSZPWJ.js → chunk-H5HBGNXU.js} +5 -4
  96. package/dist/chunk-H7KM7LZE.js +229 -0
  97. package/dist/{chunk-AA6YULYB.js → chunk-HNM2YQT2.js} +7 -7
  98. package/dist/{chunk-3C7EYRFZ.js → chunk-HYU5VLGA.js} +1 -1
  99. package/dist/{chunk-XY3P7JW7.js → chunk-IDKCWSM5.js} +1032 -172
  100. package/dist/chunk-IFKEI4SA.js +237 -0
  101. package/dist/{chunk-F7HYOUFF.js → chunk-IGOE6KPG.js} +67 -22
  102. package/dist/{chunk-TDD55CJH.js → chunk-IH2XURVQ.js} +6 -5
  103. package/dist/chunk-INQHESFB.js +38 -0
  104. package/dist/chunk-IP74LCOQ.js +57 -0
  105. package/dist/chunk-IPHHDDC6.js +45 -0
  106. package/dist/{chunk-T6AIP7H5.js → chunk-ISUAAMGS.js} +110 -153
  107. package/dist/{chunk-A7UPUQFY.js → chunk-IUPG3UKI.js} +624 -319
  108. package/dist/{chunk-L6SGQIR3.js → chunk-IVBOQAGB.js} +7 -3
  109. package/dist/{chunk-27NKUS3X.js → chunk-J2JAKCIW.js} +2205 -796
  110. package/dist/{chunk-V2YTAIQO.js → chunk-J3IOLXWM.js} +24 -7
  111. package/dist/chunk-JA5FI3QV.js +142 -0
  112. package/dist/chunk-JAVI7JSP.js +49 -0
  113. package/dist/{chunk-HLJAXMM4.js → chunk-JB5LINEM.js} +6 -2
  114. package/dist/{chunk-2VHF7OXM.js → chunk-JENSEMXF.js} +1 -1
  115. package/dist/{chunk-6BVONWJ7.js → chunk-JJF6HALY.js} +4 -3
  116. package/dist/chunk-JLUCKAEL.js +38 -0
  117. package/dist/chunk-JRBFANFE.js +221 -0
  118. package/dist/{chunk-R6XF6UR3.js → chunk-KDNTAPLX.js} +4 -4
  119. package/dist/chunk-KFAVQZSX.js +33 -0
  120. package/dist/chunk-KJXD4PNL.js +50 -0
  121. package/dist/chunk-KN5BXMWN.js +44 -0
  122. package/dist/{chunk-PCVDV3UZ.js → chunk-KQGURXFU.js} +9 -7
  123. package/dist/{chunk-WY6PP6AA.js → chunk-KXITGYLF.js} +40 -6
  124. package/dist/{chunk-66YVAGGM.js → chunk-L27SV425.js} +22 -20
  125. package/dist/{chunk-NE2W3OO7.js → chunk-LDLL7LB3.js} +24 -22
  126. package/dist/chunk-LFGTYX5U.js +379 -0
  127. package/dist/{chunk-EYWIDJFU.js → chunk-LGBMTVNT.js} +7 -5
  128. package/dist/{chunk-Q5AMFEWD.js → chunk-LGFL54FP.js} +3 -2
  129. package/dist/{chunk-6TACQN3N.js → chunk-LJXMYKZJ.js} +7 -5
  130. package/dist/{chunk-BKVWTZ6A.js → chunk-LKOR5UET.js} +29 -26
  131. package/dist/chunk-LNBQOP7D.js +294 -0
  132. package/dist/{chunk-O3WI5KWW.js → chunk-LO6P2VYG.js} +2 -2
  133. package/dist/chunk-LQJPN536.js +122 -0
  134. package/dist/{chunk-YEDDOYSC.js → chunk-LYBNHMVZ.js} +29 -5
  135. package/dist/{chunk-A3GY6SOA.js → chunk-LZ7NUC62.js} +20 -18
  136. package/dist/chunk-M32BLWDH.js +37 -0
  137. package/dist/{chunk-VYDBJ73M.js → chunk-M3NANSDZ.js} +17 -15
  138. package/dist/chunk-MFHL5URL.js +31 -0
  139. package/dist/chunk-MFR5OPBD.js +109 -0
  140. package/dist/{chunk-DE76JROX.js → chunk-MG4ZL5RW.js} +32 -20
  141. package/dist/{chunk-N7IXEHK3.js → chunk-MO6P2JZH.js} +10 -8
  142. package/dist/{chunk-65NYPGRC.js → chunk-MUWDB4R4.js} +1 -1
  143. package/dist/chunk-MZCGSXVR.js +34 -0
  144. package/dist/{chunk-MGYZM27B.js → chunk-N3XIYPU3.js} +51 -23
  145. package/dist/chunk-NDCF4R6S.js +172 -0
  146. package/dist/{chunk-DHPACDG7.js → chunk-NR2UJWOC.js} +10 -8
  147. package/dist/chunk-NXJ5URP6.js +51 -0
  148. package/dist/{chunk-UNM6ZOKP.js → chunk-NY2XSR5K.js} +147 -18
  149. package/dist/{chunk-5GDRCDQB.js → chunk-O45HFTFS.js} +3 -2
  150. package/dist/{chunk-ONLS5QA5.js → chunk-O4GXGGBX.js} +14 -12
  151. package/dist/chunk-O5PXQR67.js +249 -0
  152. package/dist/{chunk-PRPPGYZG.js → chunk-O66DM6DJ.js} +6 -4
  153. package/dist/{chunk-KEM4SDDP.js → chunk-O7FDLW7L.js} +11 -8
  154. package/dist/{chunk-T2UYZSCQ.js → chunk-O7XLYEFA.js} +169 -29
  155. package/dist/{chunk-FITWGOJ2.js → chunk-OHNCWBKF.js} +4 -4
  156. package/dist/{chunk-652QWTLZ.js → chunk-OHVTTOPS.js} +3 -3
  157. package/dist/chunk-OMI6FPPN.js +43 -0
  158. package/dist/chunk-ONUPY3H6.js +53 -0
  159. package/dist/chunk-OTLDSZDV.js +69 -0
  160. package/dist/chunk-OUBGGKDU.js +22 -0
  161. package/dist/chunk-OWNCM4ZN.js +330 -0
  162. package/dist/{chunk-YISXLPHN.js → chunk-P2V7QW4D.js} +235 -35
  163. package/dist/{chunk-CNUKCS2T.js → chunk-P32RUW3B.js} +1632 -93
  164. package/dist/{chunk-BWZ77RQT.js → chunk-PAQ2AS5E.js} +1 -1
  165. package/dist/{chunk-ZMAINWBW.js → chunk-PBPBMP2B.js} +4 -3
  166. package/dist/{chunk-ZVM6AKKM.js → chunk-PJSJPMJI.js} +3 -3
  167. package/dist/{chunk-EFHQ3TWP.js → chunk-PKBHS4AA.js} +233 -56
  168. package/dist/{chunk-GT4I4ZWM.js → chunk-PMUAJGLI.js} +20 -16
  169. package/dist/chunk-PPD7HTDP.js +152 -0
  170. package/dist/chunk-PSOFBQWB.js +42 -0
  171. package/dist/{chunk-S2A7YC3Q.js → chunk-Q2TECDIT.js} +10694 -8896
  172. package/dist/chunk-Q4K5WB2W.js +42 -0
  173. package/dist/{chunk-UGLN7QHV.js → chunk-Q6DFNVRJ.js} +14 -12
  174. package/dist/chunk-QA4O2GGC.js +265 -0
  175. package/dist/chunk-QAXW2N3B.js +1216 -0
  176. package/dist/chunk-QBNWF5ZU.js +19 -0
  177. package/dist/chunk-QFWA2DPH.js +224 -0
  178. package/dist/{chunk-23W7VWKR.js → chunk-QKUJMING.js} +1363 -114
  179. package/dist/{chunk-NXFPS2LR.js → chunk-R44CYFPV.js} +16 -13
  180. package/dist/{chunk-CKSITVS4.js → chunk-R7NYHMUU.js} +2687 -786
  181. package/dist/chunk-REWWDVQB.js +162 -0
  182. package/dist/{chunk-JMSCMUCA.js → chunk-RGERPOIV.js} +145 -21
  183. package/dist/{chunk-6JCPI55B.js → chunk-RLDGWLQ7.js} +49 -7
  184. package/dist/chunk-RUGXBPWI.js +384 -0
  185. package/dist/{chunk-CPA6HPVR.js → chunk-RXPJMEOW.js} +18 -12
  186. package/dist/{chunk-3HI6Z55Y.js → chunk-S4PMJU6H.js} +339 -43
  187. package/dist/chunk-S5LSDXV4.js +40 -0
  188. package/dist/chunk-S7FCV7S5.js +51 -0
  189. package/dist/{chunk-5GGOLAKC.js → chunk-SDKLKB6I.js} +28 -26
  190. package/dist/chunk-SFSPGFCV.js +62 -0
  191. package/dist/{chunk-ZNCEKR4J.js → chunk-SFUP7TTO.js} +12 -8
  192. package/dist/{chunk-64EQYWCA.js → chunk-SLXZOMA6.js} +69 -19
  193. package/dist/chunk-SQV37XO2.js +273 -0
  194. package/dist/{chunk-K65BJIMT.js → chunk-SU74NDMQ.js} +19 -17
  195. package/dist/chunk-SYV5LHML.js +165 -0
  196. package/dist/chunk-T4YPZIQN.js +36 -0
  197. package/dist/chunk-T6DQR5TV.js +323 -0
  198. package/dist/{chunk-JIITQXFB.js → chunk-THDMSZ3R.js} +3075 -802
  199. package/dist/{chunk-JGZCG5VM.js → chunk-TNR75OXT.js} +7 -7
  200. package/dist/{chunk-D3PO4DOZ.js → chunk-TUULXQRW.js} +174 -15
  201. package/dist/chunk-TYQBFTBR.js +516 -0
  202. package/dist/chunk-U76OWS3Q.js +49 -0
  203. package/dist/{chunk-YYQN46FY.js → chunk-UCROWG2D.js} +27 -24
  204. package/dist/{chunk-6M5NK3K3.js → chunk-UF4AZOZB.js} +50 -10
  205. package/dist/chunk-UF4GLFBX.js +345 -0
  206. package/dist/{chunk-OT2O76OS.js → chunk-UGUP3ZM6.js} +240 -39
  207. package/dist/chunk-UNAGJYET.js +45 -0
  208. package/dist/{chunk-5WG5YP4T.js → chunk-UOR2DTHH.js} +16 -14
  209. package/dist/{chunk-S3QNRWYR.js → chunk-UPOY4YSQ.js} +14 -12
  210. package/dist/{chunk-EPTBZ3GP.js → chunk-UPS2DGFC.js} +1 -1
  211. package/dist/{chunk-4AK7IBVP.js → chunk-UUU4CLJG.js} +4 -2
  212. package/dist/{chunk-W3BQAZ3Q.js → chunk-UWMJKX5U.js} +14 -12
  213. package/dist/{chunk-QZSX3F7C.js → chunk-UWOJLHFT.js} +27 -23
  214. package/dist/chunk-VBTP56CE.js +535 -0
  215. package/dist/chunk-VCTWPLAO.js +211 -0
  216. package/dist/chunk-VNU26RCO.js +1215 -0
  217. package/dist/{chunk-CSZ4C5N6.js → chunk-VTZMAJ3W.js} +93 -10
  218. package/dist/{chunk-TXLH6WHQ.js → chunk-VW62D6QE.js} +14 -12
  219. package/dist/{chunk-CAQZUNOH.js → chunk-VY72R2XZ.js} +610 -3
  220. package/dist/{chunk-2DIQQJCB.js → chunk-VZALIKIF.js} +18 -15
  221. package/dist/{chunk-TYAID7B7.js → chunk-W62H2XSO.js} +25 -23
  222. package/dist/{chunk-HVUPKCGJ.js → chunk-W7VWI2YH.js} +9 -6
  223. package/dist/{chunk-TANFV3MZ.js → chunk-WERM6KPJ.js} +7 -4
  224. package/dist/{chunk-BOHJZTEQ.js → chunk-WF7B67YE.js} +208 -87
  225. package/dist/{chunk-7FBGJFEE.js → chunk-WG5U3F5V.js} +14 -12
  226. package/dist/{chunk-4NDAAFQT.js → chunk-WJF2CS6M.js} +8 -5
  227. package/dist/{chunk-XAKWMCXI.js → chunk-WKUJ3KPV.js} +4 -4
  228. package/dist/chunk-WMTRHUI5.js +103 -0
  229. package/dist/chunk-WNKPRSGI.js +36 -0
  230. package/dist/chunk-WXFLMQSR.js +223 -0
  231. package/dist/{chunk-RRTKKSLQ.js → chunk-X3WY6MN3.js} +8 -6
  232. package/dist/{chunk-ZCJDOK2S.js → chunk-X4CXA2IL.js} +47 -23
  233. package/dist/{chunk-UBBC2XSG.js → chunk-X5F3Q5LV.js} +560 -105
  234. package/dist/{chunk-C6EKFH7J.js → chunk-XD75VZIH.js} +9 -7
  235. package/dist/chunk-XERYFDB5.js +297 -0
  236. package/dist/chunk-XI2LCCYQ.js +420 -0
  237. package/dist/chunk-Y2EQNWKV.js +933 -0
  238. package/dist/{chunk-LR3R6Z2A.js → chunk-YHCMZC2J.js} +7 -7
  239. package/dist/chunk-YYY3AZFE.js +122 -0
  240. package/dist/{chunk-GDLULHTC.js → chunk-Z5IA3WDR.js} +19 -31
  241. package/dist/{chunk-T6XQL73F.js → chunk-ZFFYNRIO.js} +63 -23
  242. package/dist/{chunk-EDS2L2LD.js → chunk-ZFL7NY4F.js} +56 -27
  243. package/dist/{chunk-YMZ3TNYB.js → chunk-ZGULQAPZ.js} +7 -4
  244. package/dist/{chunk-4SKZDI62.js → chunk-ZIUFM5HT.js} +3 -1
  245. package/dist/{chunk-DKJA76CJ.js → chunk-ZJFRMSJT.js} +15 -13
  246. package/dist/chunk-ZJXLNDH4.js +239 -0
  247. package/dist/chunk-ZQ3ON2VQ.js +252 -0
  248. package/dist/{chunk-HITVBIJS.js → chunk-ZQ7SKESZ.js} +150 -415
  249. package/dist/{chunk-6QSERWXH.js → chunk-ZQXZ2SES.js} +24 -21
  250. package/dist/chunk-ZX57KSEQ.js +39 -0
  251. package/dist/{chunk-I3E7CX4H.js → chunk-ZZK56BLP.js} +5 -3
  252. package/dist/files.json +664 -368
  253. package/dist/packages/naysayer/constitution/constitution.yaml +19 -0
  254. package/dist/packages/sdk/npm/index.js +6194 -2542
  255. package/dist/packages/ui/dist/assets/{elk-api-tma0MCuh.js → elk-api-CIf-0gz5.js} +2 -2
  256. package/dist/packages/ui/dist/assets/index-CoK_Dl0D.js +47 -0
  257. package/dist/packages/ui/dist/assets/index-Dw20IRhQ.css +1 -0
  258. package/dist/packages/ui/dist/index.html +3 -2
  259. package/package.json +5 -5
  260. package/dist/chunk-2BF2EYJV.js +0 -174
  261. package/dist/chunk-42EVSKME.js +0 -37
  262. package/dist/chunk-4BKGMUIK.js +0 -53
  263. package/dist/chunk-5KLGBXG5.js +0 -48
  264. package/dist/chunk-6BNC6EQ4.js +0 -41
  265. package/dist/chunk-6D2CQ5II.js +0 -41
  266. package/dist/chunk-7AVHLZGD.js +0 -45
  267. package/dist/chunk-D46WUV3T.js +0 -33
  268. package/dist/chunk-E36QOJMD.js +0 -47
  269. package/dist/chunk-FQXYPF7E.js +0 -147
  270. package/dist/chunk-GBRFVT63.js +0 -45
  271. package/dist/chunk-ICY36XCH.js +0 -34
  272. package/dist/chunk-J4K3KVLD.js +0 -131
  273. package/dist/chunk-JZU3H6UQ.js +0 -54
  274. package/dist/chunk-NN2ZQEB4.js +0 -38
  275. package/dist/chunk-PCOCACY3.js +0 -385
  276. package/dist/chunk-RTEYOSJY.js +0 -29
  277. package/dist/chunk-RUVFXE2L.js +0 -666
  278. package/dist/chunk-RVH5SUW5.js +0 -69
  279. package/dist/chunk-VN3DP4LQ.js +0 -43
  280. package/dist/chunk-W5BVQF44.js +0 -36
  281. package/dist/chunk-WVPJSRRJ.js +0 -52
  282. package/dist/chunk-XPTOBS2D.js +0 -48
  283. package/dist/packages/ui/dist/assets/index-B54fm9FQ.js +0 -29
  284. 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-3HI6Z55Y.js";
11
+ } from "./chunk-S4PMJU6H.js";
22
12
  import {
23
13
  assess,
24
14
  changeFolder,
25
15
  changeStore,
26
16
  checkFindings,
27
- loadChangeContext
28
- } from "./chunk-XY3P7JW7.js";
17
+ loadChangeContext,
18
+ nothingToRelease,
19
+ staleReleasePrs
20
+ } from "./chunk-IDKCWSM5.js";
29
21
  import {
30
- GlossaryError,
31
- aliasDecision,
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-MC3H7736.js";
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-GQ4N4WKF.js";
35
+ } from "./chunk-3NFFJL5D.js";
59
36
  import {
60
- runtimeForCli
61
- } from "./chunk-CNUKCS2T.js";
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-S2A7YC3Q.js";
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 lines2 = [`## Atticus drift check: ${r.repo}`, "", head];
643
+ const lines = [`## Atticus drift check: ${r.repo}`, "", head];
661
644
  if (r.items.length) {
662
- lines2.push("", "| What | Kind | Id | Details |", "| --- | --- | --- | --- |");
645
+ lines.push("", "| What | Kind | Id | Details |", "| --- | --- | --- | --- |");
663
646
  for (const i of r.items)
664
- lines2.push(`| ${KIND_WORD[i.kind]} | ${i.subject} | ${cell(i.id)} | ${cell(i.summary)}${where(i).length ? ` (${where(i).join(", ")})` : ""} |`);
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
- lines2.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.");
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
- lines2.push("", "Problems:", ...r.problems.map((p) => `- ${p}`));
670
- return `${lines2.join("\n")}
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 && config.archive.requireMergedPrs && r.pr.state !== "merged" && r.pr.state !== "closed")
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}; merge it before archiving.`
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
- if (o.driftReports?.length) {
856
- for (const f of o.driftReports) {
857
- try {
858
- drift.push(JSON.parse(await readFile2(f, "utf8")));
859
- } catch (e) {
860
- blockers.push({
861
- code: "drift-error",
862
- message: `Can't read the drift report ${f}: ${e.message.split("\n")[0]}.`
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
- } else {
867
- for (const r of repos) {
868
- const dir = o.repoDir?.(r.id) ?? [join3(root, r.worktree), baseClonePath(root, r.id)].find((d) => existsSync2(d));
869
- if (!dir || !existsSync2(dir)) {
870
- notes.push(`No checkout of ${r.id} here, so its drift wasn't checked; pass its pipeline's drift report.`);
871
- continue;
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
- repoDir: dir,
876
- catalog: root,
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
- blockers.push({ code: "drift-error", message: `${r.id}: ${e.message}` });
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
- if (!repos.length)
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
- blockers.push({
894
- code: "drift",
895
- 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 ? "; ..." : ""}).`
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
- archiveGate,
1236
- testsGenerate,
1237
- traceCommand,
1238
- ciDrift,
1239
- ciSnippet,
1240
- ciArchiveGate,
1241
- glossaryList,
1242
- glossaryScan,
1243
- completeGlossaryScan,
1244
- glossaryDefine,
1245
- glossaryLink,
1246
- glossaryAlias
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
  };