@iowarp/clio-coder 0.4.3 → 0.4.5
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/CHANGELOG.md +153 -0
- package/CONTRIBUTING.md +25 -15
- package/README.md +340 -27
- package/dist/{acp-H2NGRPWO.js → acp-H3CU2HBQ.js} +25 -25
- package/dist/{agents-TL5LLUQP.js → agents-IXQQZ7BD.js} +77 -75
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-E5SW4HMS.js → auth-R7KYF7N3.js} +38 -39
- package/dist/builtins-CRFDQUVP.js +22 -0
- package/dist/{chunk-7DRAWPTZ.js → chunk-22PQ4TX4.js} +4 -4
- package/dist/{chunk-NEDJ26B5.js → chunk-2GPGAE5W.js} +6 -51
- package/dist/{chunk-IKCO5N3L.js → chunk-2QPI3TR3.js} +3 -3
- package/dist/{chunk-HRQMFLJP.js → chunk-32KJPXAM.js} +6 -6
- package/dist/{chunk-65DEGPJ6.js → chunk-3A3CUMKA.js} +6 -4
- package/dist/{chunk-5TSRNF4G.js → chunk-3T4DXWP6.js} +170 -12
- package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
- package/dist/{chunk-XIVNBFZS.js → chunk-4SVIVOMC.js} +208 -39
- package/dist/{chunk-NMJXSHBJ.js → chunk-5A6XR3RJ.js} +44 -19
- package/dist/{chunk-YPC6ZR5L.js → chunk-5CMARGPF.js} +119 -5
- package/dist/{chunk-KXDSS5WJ.js → chunk-5CY4Q6QI.js} +4 -4
- package/dist/chunk-5DDOTTG4.js +402 -0
- package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
- package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
- package/dist/{chunk-PUVDKJ2Y.js → chunk-5VTJP36Q.js} +5 -7
- package/dist/{chunk-JGRC33J2.js → chunk-5ZMXGW7P.js} +90 -9
- package/dist/chunk-5ZSZEYJK.js +119 -0
- package/dist/chunk-633EXGZA.js +44 -0
- package/dist/{chunk-IWT4SF4R.js → chunk-6CDNRHWH.js} +361 -89
- package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
- package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
- package/dist/{chunk-INY6HTFL.js → chunk-6SYEGZI3.js} +12 -12
- package/dist/{chunk-SKHCAU7K.js → chunk-6YA46L5A.js} +5 -4
- package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
- package/dist/{chunk-L47TF46W.js → chunk-7HBHHVCK.js} +24 -3
- package/dist/{chunk-DWUOQKRU.js → chunk-7TKWWPD7.js} +5 -4
- package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
- package/dist/chunk-7WUZEB2M.js +165 -0
- package/dist/{chunk-6PTFB5VS.js → chunk-7YJWEF2L.js} +59 -28
- package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
- package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
- package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
- package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
- package/dist/chunk-B6UM3OZC.js +15 -0
- package/dist/{chunk-MCEPRMZW.js → chunk-BBV5TKE6.js} +5 -5
- package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
- package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
- package/dist/{chunk-42FMPA75.js → chunk-CBSKDFWL.js} +3 -3
- package/dist/{chunk-2LEAKD4C.js → chunk-CKK25WN3.js} +3 -3
- package/dist/{chunk-BYP5D4HI.js → chunk-CTTI7G3T.js} +2 -2
- package/dist/{chunk-XAKHZX5N.js → chunk-CVDAFGPW.js} +4 -4
- package/dist/{chunk-RKKLTLYB.js → chunk-CXQ37WJH.js} +3 -3
- package/dist/{chunk-GTUD2WMY.js → chunk-DBREN25X.js} +44 -9
- package/dist/{chunk-WCXUNS7U.js → chunk-DIMRLNIC.js} +35 -66
- package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
- package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
- package/dist/{chunk-2UG5F4C5.js → chunk-DRD2A54W.js} +116 -52
- package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
- package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
- package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
- package/dist/{chunk-IGLP3ODT.js → chunk-E3BQTQUP.js} +15 -15
- package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
- package/dist/{chunk-3R73A4XB.js → chunk-ECBHH7LU.js} +3 -3
- package/dist/chunk-ECOMVOHP.js +139 -0
- package/dist/chunk-EFSEIZE6.js +56 -0
- package/dist/{chunk-IJNZMHLA.js → chunk-EHCPSZJF.js} +4 -4
- package/dist/{chunk-K6BSR66V.js → chunk-EHOSNVVM.js} +6 -2
- package/dist/{chunk-RRNP2ANY.js → chunk-EQEJJ53P.js} +10 -10
- package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
- package/dist/{chunk-JKKCYP3C.js → chunk-F34AR6O3.js} +21 -15
- package/dist/{chunk-GHS5EBTQ.js → chunk-FKIOX6DS.js} +29 -20
- package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
- package/dist/{chunk-MWUZBSAQ.js → chunk-FSTIBAGM.js} +358 -63
- package/dist/{chunk-ZTJUVLTU.js → chunk-FXFVDPWY.js} +2 -2
- package/dist/{chunk-XPLRXC72.js → chunk-GD55RTIW.js} +3 -3
- package/dist/{chunk-5B2AEOW5.js → chunk-GH5ZR6JP.js} +472 -472
- package/dist/{chunk-JSC3U7TI.js → chunk-GJ24ODAX.js} +5 -5
- package/dist/{chunk-B4VEBZKF.js → chunk-GNQRWTMY.js} +139 -52
- package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
- package/dist/chunk-GXCCHKN6.js +59 -0
- package/dist/{chunk-V2ANDPVT.js → chunk-HGSLRG33.js} +170 -8
- package/dist/{chunk-LLDJM5XK.js → chunk-HHVJNVUJ.js} +6 -6
- package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
- package/dist/{chunk-VA5FNYMT.js → chunk-HR3HPQ76.js} +42 -5
- package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
- package/dist/{chunk-OML5D5V5.js → chunk-I7VLWRK2.js} +8 -8
- package/dist/{chunk-VW6DOEDG.js → chunk-ICO4TQ2F.js} +16 -5
- package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
- package/dist/{chunk-WBKFA554.js → chunk-ILJ7DWGE.js} +9 -9
- package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
- package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
- package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
- package/dist/{chunk-EKCHAPYA.js → chunk-K2HL3GBL.js} +4 -4
- package/dist/{chunk-N2Z7HLVY.js → chunk-K6RDB7IA.js} +28 -28
- package/dist/{chunk-TM6LQDI3.js → chunk-KDWLXVMN.js} +85 -335
- package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
- package/dist/{chunk-RSJ25QSL.js → chunk-KF6GFW6O.js} +217 -50
- package/dist/{chunk-BTK3SSSK.js → chunk-KMF54VH3.js} +2 -2
- package/dist/chunk-KPRLAMP4.js +32 -0
- package/dist/{chunk-ECH6PKUQ.js → chunk-KQ6IDQIB.js} +2 -2
- package/dist/{chunk-IUE3Y34X.js → chunk-KTFSFCVN.js} +20 -9
- package/dist/{chunk-7E7I3WLS.js → chunk-KYKNBD4Y.js} +36 -34
- package/dist/chunk-L4N3DWNW.js +539 -0
- package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
- package/dist/{chunk-JIEGK6UF.js → chunk-LTR5QCLS.js} +51 -7
- package/dist/chunk-LUL5Z66S.js +221 -0
- package/dist/chunk-LVFANMOH.js +466 -0
- package/dist/{chunk-H7IXIC72.js → chunk-LY4N4TTL.js} +17 -3
- package/dist/{chunk-VKPAQYEB.js → chunk-LZBMXNLP.js} +5 -5
- package/dist/{chunk-UL3WSD3F.js → chunk-M4KFUXS7.js} +2 -2
- package/dist/{chunk-I7ZPNEJM.js → chunk-M6TAYK66.js} +8 -8
- package/dist/{chunk-NEKRRTYW.js → chunk-MC3JSVR6.js} +2 -2
- package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
- package/dist/chunk-MDU3C27C.js +674 -0
- package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
- package/dist/{chunk-4UVU7BJ5.js → chunk-NC4KV7EL.js} +6 -6
- package/dist/{chunk-JEQ3XTHC.js → chunk-NF3BK5WR.js} +5 -5
- package/dist/chunk-NTK3WTHM.js +141 -0
- package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
- package/dist/{chunk-UPZU6GE4.js → chunk-NY6IWDVU.js} +6 -6
- package/dist/chunk-O2RQ7LCK.js +283 -0
- package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
- package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
- package/dist/{chunk-WRBAGUNF.js → chunk-ODUTYZIU.js} +5 -5
- package/dist/{chunk-E3TPLWFX.js → chunk-ONRTXOZY.js} +4 -4
- package/dist/{chunk-B4OAX3SI.js → chunk-OQM5IVJY.js} +118 -225
- package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
- package/dist/{chunk-R6Q67RJH.js → chunk-PECBKCDK.js} +34 -6
- package/dist/{chunk-33YXPOE3.js → chunk-PPEZJWUG.js} +2 -2
- package/dist/{chunk-64I3JVYM.js → chunk-PWWSIB2A.js} +5 -5
- package/dist/{chunk-2STGEDFV.js → chunk-QEQISF75.js} +2 -2
- package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
- package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
- package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
- package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
- package/dist/chunk-R6MAYTMS.js +108 -0
- package/dist/{chunk-MUW2BDDH.js → chunk-R6MICQYU.js} +6 -6
- package/dist/{chunk-JDAY6FIL.js → chunk-RLTT5GVY.js} +132 -17
- package/dist/{chunk-ZWPRK62N.js → chunk-RXIOCVBZ.js} +24 -6
- package/dist/{chunk-NIQJ66N4.js → chunk-S32UQ5GL.js} +62 -35
- package/dist/{chunk-AX2THNSA.js → chunk-SBZX6ARC.js} +12 -12
- package/dist/{chunk-TXOTCRLG.js → chunk-SD7SHNDW.js} +2 -2
- package/dist/{chunk-AF4YM7Z4.js → chunk-SDWNDICN.js} +10284 -3756
- package/dist/{chunk-UXCU4E3T.js → chunk-SE4ZKILO.js} +6 -6
- package/dist/chunk-SL2RDHKO.js +19 -0
- package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
- package/dist/{chunk-KKOJXO6R.js → chunk-SRZOW5L2.js} +46 -14
- package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
- package/dist/chunk-T52TPHYC.js +318 -0
- package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
- package/dist/{chunk-LDJG7DW3.js → chunk-T7FDXNRU.js} +13 -13
- package/dist/{chunk-XPWWI35G.js → chunk-TEG3RYVZ.js} +59 -41
- package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
- package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
- package/dist/{chunk-PAJQJ7BS.js → chunk-TZ7MFRG4.js} +1263 -835
- package/dist/{chunk-GI7YYQ3F.js → chunk-U2JOLB7O.js} +415 -83
- package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
- package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
- package/dist/{chunk-CE5AX47J.js → chunk-U7H5WRG5.js} +5 -5
- package/dist/{chunk-G76U63X4.js → chunk-U7VQ4NI4.js} +22 -22
- package/dist/{chunk-7ZYNNDKC.js → chunk-UFYNOQK4.js} +7 -7
- package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
- package/dist/{chunk-QWGDJJYJ.js → chunk-UL36QJX6.js} +14 -14
- package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
- package/dist/{chunk-HEQY7ZFI.js → chunk-URBGEOH3.js} +5 -5
- package/dist/chunk-USZA7GWL.js +341 -0
- package/dist/{chunk-W6RRQCPQ.js → chunk-UTUNT5QL.js} +48 -579
- package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
- package/dist/{chunk-F5JHEYZM.js → chunk-UXAC2FX4.js} +73 -41
- package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
- package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
- package/dist/chunk-VLPTKCKT.js +396 -0
- package/dist/{chunk-336NSSKI.js → chunk-VNBICSS2.js} +2 -2
- package/dist/{chunk-VAVR4IJY.js → chunk-VQD7NH7Z.js} +3 -3
- package/dist/{chunk-LBMZMYH2.js → chunk-W2RJEH6Q.js} +3 -3
- package/dist/{chunk-7CR24IG7.js → chunk-WDV62RKY.js} +2 -2
- package/dist/{chunk-2UH2KFUP.js → chunk-WFKDPU7U.js} +4 -4
- package/dist/{chunk-ZDN3Y73Y.js → chunk-WJIMKGD6.js} +9 -51
- package/dist/{chunk-YQWYVTMC.js → chunk-WLMSOT73.js} +59 -12
- package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
- package/dist/chunk-WXA2CFJO.js +23 -0
- package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
- package/dist/{chunk-2APPQIER.js → chunk-XXBQKW32.js} +11 -11
- package/dist/{chunk-2VIKGWFZ.js → chunk-YEJIG7LN.js} +332 -332
- package/dist/chunk-YGDMBK7O.js +567 -0
- package/dist/{chunk-4WR7VSYB.js → chunk-YYB3MC65.js} +23 -9
- package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
- package/dist/{chunk-54CBCGIR.js → chunk-ZMZQEBKI.js} +136 -81
- package/dist/{chunk-6EJMN2Y3.js → chunk-ZTNFYMIO.js} +2 -2
- package/dist/{chunk-WEPFGWHJ.js → chunk-ZZFWWYLX.js} +2 -2
- package/dist/cli/index.js +45 -44
- package/dist/clio-5I2IBFYL.js +26 -0
- package/dist/{code-nav-MDZNQS33.js → code-nav-YXIAEZVS.js} +48 -32
- package/dist/codewiki/build-worker.js +76 -29
- package/dist/{compile-cache-OQAVB7Y5.js → compile-cache-WJEPUZEJ.js} +4 -4
- package/dist/{components-UCUQ4QXW.js → components-TNIKXCBH.js} +13 -14
- package/dist/{config-SVM5P5YI.js → config-Y2JDJ3JJ.js} +210 -119
- package/dist/configure-SML6UBZ5.js +55 -0
- package/dist/{context-2OHRKS42.js → context-P5YSEO55.js} +125 -115
- package/dist/{context-VNCR7KAG.js → context-QQ53HSGJ.js} +91 -62
- package/dist/{context-E3VC7RX5.js → context-S2EEC3EJ.js} +62 -31
- package/dist/context-clear-TMEQCOTH.js +183 -0
- package/dist/{context-index-HNG3MOME.js → context-index-HP2JFUWA.js} +13 -11
- package/dist/{context-map-COB37XXN.js → context-map-INTXD54D.js} +71 -21
- package/dist/{context-working-set-VDS25HXZ.js → context-working-set-CNLSQN5K.js} +31 -31
- package/dist/detail-5572VLBO.js +114 -0
- package/dist/{dispatch-runner-5AHT53RF.js → dispatch-runner-FRHD6P2O.js} +214 -126
- package/dist/{docs-PD3EXDKU.js → docs-BL7ROUFN.js} +5 -7
- package/dist/{doctor-WNNVO6FY.js → doctor-N3LCM2LG.js} +89 -66
- package/dist/{eval-7G7SGAYO.js → eval-BUU3ZOUZ.js} +493 -197
- package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
- package/dist/evidence-DTGEN456.js +224 -0
- package/dist/{evidence-VD6736FQ.js → evidence-SQ5DNFEN.js} +114 -195
- package/dist/{evolve-AL3NGVRL.js → evolve-IJNUFZDS.js} +107 -88
- package/dist/{extensions-MOVJ32NM.js → extensions-YVRHX6ZI.js} +16 -17
- package/dist/{fleet-QZHUMAGI.js → fleet-ZNNVSYFO.js} +147 -141
- package/dist/{fleet-commands-BAYT5FJZ.js → fleet-commands-5YE7NPJL.js} +27 -23
- package/dist/{fleet-decisions-IREVMRU4.js → fleet-decisions-3SBSCTCW.js} +16 -15
- package/dist/{fleet-graph-YCTT3HTI.js → fleet-graph-6HHPWF5T.js} +39 -38
- package/dist/{fleet-inspect-QVJTDAVB.js → fleet-inspect-JEYMGCGC.js} +107 -87
- package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
- package/dist/{fleet-preflight-25QAFPK4.js → fleet-preflight-QRSHIIDE.js} +10 -10
- package/dist/{fleet-validate-5O57AAJ7.js → fleet-validate-4PM4GDDL.js} +46 -42
- package/dist/{fleet-verify-CPH2W2T6.js → fleet-verify-NJDTHTO3.js} +105 -85
- package/dist/fleet-view-UP2BWQQY.js +117 -0
- package/dist/{init-J477LKZH.js → init-S3GZQ5ZF.js} +123 -117
- package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
- package/dist/{interop-3FCM6XLG.js → interop-YOTGXFJM.js} +25 -26
- package/dist/inventory-K2OZ36YJ.js +117 -0
- package/dist/{library-QUQEIUG6.js → library-GJI6W6OK.js} +45 -45
- package/dist/{memory-SGGSEP65.js → memory-OQOXQGYD.js} +107 -90
- package/dist/{models-HEKUAXXK.js → models-3IK2Y5WE.js} +64 -65
- package/dist/{monitor-HKU57TYQ.js → monitor-FTJLTKCQ.js} +136 -101
- package/dist/{orchestrator-VDFAEFAI.js → orchestrator-N47O7SFD.js} +1442 -1671
- package/dist/{panes-DN2SSFOH.js → panes-7BTYH3XQ.js} +8 -8
- package/dist/{panes-TALGNPZT.js → panes-WPOMEMRH.js} +22 -23
- package/dist/{paths-NBMFAIEZ.js → paths-J3KN7UAO.js} +12 -13
- package/dist/preload-65U34NG6.js +115 -0
- package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
- package/dist/{reset-EAJFFJVB.js → reset-MUVQDLNL.js} +20 -21
- package/dist/{resources-OVKSEFVE.js → resources-LM76COAO.js} +41 -40
- package/dist/{run-7DP7ZF2J.js → run-3VFZQ33N.js} +168 -166
- package/dist/{share-WML67FT3.js → share-4JUB4BL7.js} +43 -43
- package/dist/{skills-SG662R2K.js → skills-S36AAJHU.js} +47 -47
- package/dist/{skills-eval-VVZEUU46.js → skills-eval-G6T57L7M.js} +127 -104
- package/dist/{skills-inventory-I2E23GET.js → skills-inventory-WLM46PJH.js} +41 -40
- package/dist/slash-commands-GBARG3Y7.js +91 -0
- package/dist/{steer-2LQOMCPB.js → steer-S7D7IKPU.js} +7 -7
- package/dist/{support-CC2UJBJ6.js → support-5VAEC32W.js} +14 -14
- package/dist/{targets-4QC3HIEW.js → targets-N5REUETU.js} +147 -98
- package/dist/tasks-6BVY5YZF.js +36 -0
- package/dist/{terminal-lease-TUHIJ6Y2.js → terminal-lease-57UEOJKS.js} +12 -11
- package/dist/tools-6OCQ6SVB.js +28 -0
- package/dist/{trace-FXMXUZUF.js → trace-JHLXWUMN.js} +18 -17
- package/dist/{tree-sitter-HGKH6LG4.js → tree-sitter-AQUUOSYM.js} +6 -6
- package/dist/{tui-primitives-K5PASC3O.js → tui-primitives-RCY2HN7G.js} +3 -3
- package/dist/{uninstall-5PEVOE5B.js → uninstall-FXYMFFRT.js} +19 -20
- package/dist/{upgrade-M4WXY6KN.js → upgrade-4HD5HAIV.js} +49 -45
- package/dist/{usage-N7ZNVLEM.js → usage-4GWM2WWP.js} +143 -103
- package/dist/{verifiers-DJTP4XX6.js → verifiers-GSKWKWVG.js} +162 -28
- package/dist/verify-3AS3ULCY.js +30 -0
- package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
- package/dist/{web-fetch-MPARV2K7.js → web-fetch-MQN4FH3X.js} +169 -18
- package/dist/wiki-generate-7BV7XWIY.js +614 -0
- package/dist/{with-panes-4GCGSL7J.js → with-panes-OFTNAR4Y.js} +34 -20
- package/dist/worker/entry.js +99 -85
- package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
- package/docs/README.md +10 -8
- package/docs/architecture/acp.md +27 -0
- package/docs/architecture/architecture.md +5 -5
- package/docs/architecture/artifact-versions.md +1 -1
- package/docs/architecture/context-engine.md +44 -59
- package/docs/architecture/context-working-set.md +7 -9
- package/docs/architecture/dispatch-architecture-rationale.md +1 -1
- package/docs/architecture/dispatch-typed-intent.md +1 -1
- package/docs/architecture/evidence-and-memory.md +11 -1
- package/docs/architecture/observability.md +7 -1
- package/docs/architecture/pi-boundary.md +37 -7
- package/docs/architecture/prompt-envelope-and-tools.md +22 -12
- package/docs/architecture/safety-model.md +10 -17
- package/docs/architecture/session-lifecycle.md +4 -4
- package/docs/architecture/tui-design.md +1 -1
- package/docs/architecture/worker-dispatch-mechanics.md +4 -0
- package/docs/guide/built-in-agents.md +8 -8
- package/docs/guide/commands-and-modes.md +66 -38
- package/docs/guide/configuration-and-targets.md +10 -3
- package/docs/guide/configuration-reference.md +23 -8
- package/docs/guide/environment-variables.md +8 -4
- package/docs/guide/fleet-dispatch.md +12 -0
- package/docs/guide/installation-and-lifecycle.md +35 -9
- package/docs/guide/proactive-memory.md +1 -1
- package/docs/guide/skills-marketplace.md +11 -3
- package/docs/guide/tool-usage.md +87 -5
- package/docs/history/config-knobs-audit.md +2 -2
- package/docs/process/development-pipeline.md +15 -10
- package/docs/process/documentation-guide.md +2 -2
- package/docs/process/eval-runner.md +15 -0
- package/docs/process/evals-internal.md +1 -1
- package/docs/process/git-commit-provenance.md +15 -0
- package/docs/process/release-cut-checklist.md +207 -0
- package/docs/process/scientific-validation.md +18 -17
- package/evals/README.md +4 -0
- package/evals/behavioral-corpus-grader.mjs +147 -14
- package/evals/behavioral-machinery-support.ts +1 -0
- package/evals/behavioral-machinery.yaml +1 -1
- package/evals/behavioral-model-negative-control.yaml +1 -0
- package/evals/behavioral-model.yaml +266 -1
- package/evals/fixtures/docs-retrieval.json +102 -0
- package/evals/fixtures/scalar-decision.json +17 -0
- package/evals/fixtures/scout-citation-pipeline.json +55 -0
- package/evals/fixtures/source-explanation.json +74 -0
- package/evals/fixtures/tool-arguments.json +18 -0
- package/evals/fixtures/tool-surface/read.txt +4 -0
- package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
- package/evals/no-edit-memory-grader.mjs +149 -0
- package/evals/scalar-decision-grader.py +41 -0
- package/evals/scalar-decision-machinery.ts +145 -0
- package/evals/source-explanation-grader.mjs +118 -0
- package/evals/tool-surface-grader.mjs +53 -0
- package/evals/tool-surface-model.yaml +274 -0
- package/package.json +14 -14
- package/skills/README.md +6 -6
- package/skills/coding/coding-standards/SKILL.md +14 -4
- package/skills/context/context-handoff/SKILL.md +3 -3
- package/skills/context/context-prime/SKILL.md +3 -3
- package/skills/planning/architecture/SKILL.md +5 -5
- package/skills/planning/backlog/SKILL.md +4 -4
- package/skills/planning/prd/SKILL.md +4 -3
- package/skills/planning/product-intent/SKILL.md +8 -8
- package/skills/planning/tech-spec/SKILL.md +4 -4
- package/skills/registry.yaml +33 -33
- package/skills/research/arxiv-literature/SKILL.md +3 -3
- package/skills/research/experiment-protocol/SKILL.md +3 -3
- package/skills/research/scientific-debugging/SKILL.md +3 -2
- package/skills/research/scientific-modernization/SKILL.md +3 -3
- package/skills/skill-marketplace.json +17 -17
- package/skills/workflow/cut-it/SKILL.md +3 -4
- package/skills/workflow/design-council/SKILL.md +5 -10
- package/skills/workflow/grill-me/SKILL.md +14 -15
- package/skills/workflow/workflow-distiller/SKILL.md +4 -4
- package/src/cli/args.ts +0 -8
- package/src/cli/bootstrap-generate.ts +6 -0
- package/src/cli/config-inspect.ts +24 -7
- package/src/cli/config-trust.ts +62 -0
- package/src/cli/config.ts +8 -0
- package/src/cli/configure.ts +2 -1
- package/src/cli/context-map.ts +75 -14
- package/src/cli/context.ts +46 -17
- package/src/cli/doctor-state-size.ts +1 -12
- package/src/cli/doctor-validation-contract.ts +28 -0
- package/src/cli/doctor.ts +5 -0
- package/src/cli/eval.ts +17 -3
- package/src/cli/evidence-detail.ts +1 -75
- package/src/cli/evidence-inventory.ts +1 -167
- package/src/cli/index.ts +2 -0
- package/src/cli/modes/print.ts +32 -4
- package/src/cli/run.ts +16 -16
- package/src/cli/skills-eval.ts +10 -8
- package/src/cli/steer-channel.ts +31 -18
- package/src/cli/targets.ts +84 -32
- package/src/cli/tasks.ts +93 -0
- package/src/cli/upgrade.ts +19 -11
- package/src/cli/usage.ts +30 -0
- package/src/cli/verifiers.ts +147 -1
- package/src/cli/wiki-generate.ts +240 -96
- package/src/core/bash-exec.ts +43 -15
- package/src/core/bus-events.ts +15 -0
- package/src/core/commit-attribution.ts +41 -1
- package/src/core/config.ts +33 -14
- package/src/core/defaults.ts +5 -4
- package/src/core/file-references.ts +11 -1
- package/src/core/git-commit-attribution.ts +46 -3
- package/src/core/incomplete-installation.ts +3 -1
- package/src/core/run-overrides.ts +0 -5
- package/src/core/settings-layers.ts +21 -5
- package/src/core/skill-activation.ts +3 -0
- package/src/core/termination.ts +26 -9
- package/src/core/tool-names.ts +5 -2
- package/src/core/untrusted-content.ts +16 -0
- package/src/core/workspace-trust.ts +179 -0
- package/src/domains/agents/builtins/architect.md +1 -1
- package/src/domains/agents/builtins/coder.md +5 -3
- package/src/domains/agents/builtins/context-bootstrap.md +3 -1
- package/src/domains/agents/builtins/documenter.md +8 -5
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/provenance.md +7 -7
- package/src/domains/agents/builtins/researcher.md +1 -0
- package/src/domains/agents/builtins/scout.md +7 -1
- package/src/domains/agents/builtins/tester.md +1 -1
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +4 -3
- package/src/domains/agents/result-contract.ts +199 -26
- package/src/domains/context/bootstrap-prompt.ts +11 -9
- package/src/domains/context/bootstrap.ts +74 -39
- package/src/domains/context/clio-md.ts +88 -26
- package/src/domains/context/codewiki/build-operation.ts +121 -0
- package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
- package/src/domains/context/codewiki/build-worker.ts +3 -35
- package/src/domains/context/codewiki/coordinator.ts +36 -6
- package/src/domains/context/codewiki/indexer.ts +59 -19
- package/src/domains/context/contract.ts +6 -2
- package/src/domains/context/extension.ts +97 -11
- package/src/domains/context/fingerprint.ts +39 -34
- package/src/domains/context/index.ts +7 -1
- package/src/domains/context/prompt-context.ts +55 -14
- package/src/domains/context/refresh.ts +12 -57
- package/src/domains/context/wiki/assemble.ts +14 -10
- package/src/domains/context/wiki/evidence.ts +209 -0
- package/src/domains/context/wiki/frontmatter.ts +5 -2
- package/src/domains/context/wiki/generate.ts +207 -67
- package/src/domains/context/wiki/meta.ts +10 -2
- package/src/domains/context/wiki/plan-store.ts +70 -14
- package/src/domains/context/wiki/plan.ts +71 -14
- package/src/domains/context/wiki/prompts.ts +85 -1
- package/src/domains/context/wiki/source-content.ts +106 -0
- package/src/domains/context/wiki/staleness.ts +33 -22
- package/src/domains/context/working-set/contract.ts +8 -2
- package/src/domains/context/working-set/engine.ts +17 -4
- package/src/domains/context/working-set/fold.ts +15 -2
- package/src/domains/context/working-set/marker.ts +2 -1
- package/src/domains/context/working-set/project.ts +18 -7
- package/src/domains/context/working-set/recall.ts +82 -56
- package/src/domains/dispatch/active-route-planner.ts +10 -3
- package/src/domains/dispatch/admission-queue.ts +19 -7
- package/src/domains/dispatch/admission.ts +3 -3
- package/src/domains/dispatch/budget-envelope.ts +47 -82
- package/src/domains/dispatch/capacity-lease.ts +57 -19
- package/src/domains/dispatch/code-step.ts +11 -4
- package/src/domains/dispatch/contract.ts +41 -9
- package/src/domains/dispatch/event-pump.ts +28 -7
- package/src/domains/dispatch/execution-role.ts +49 -2
- package/src/domains/dispatch/execution-scheduler.ts +4 -0
- package/src/domains/dispatch/extension.ts +240 -132
- package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
- package/src/domains/dispatch/fleet-run.ts +21 -0
- package/src/domains/dispatch/gate-role-prompts.ts +4 -2
- package/src/domains/dispatch/host-verification.ts +114 -13
- package/src/domains/dispatch/intent.ts +28 -18
- package/src/domains/dispatch/orphan-recovery.ts +2 -0
- package/src/domains/dispatch/parallel-writers.ts +34 -0
- package/src/domains/dispatch/receipt-integrity.ts +4 -0
- package/src/domains/dispatch/reservation-store.ts +13 -37
- package/src/domains/dispatch/route-approval.ts +3 -3
- package/src/domains/dispatch/route-observer.ts +4 -2
- package/src/domains/dispatch/route-quality.ts +6 -1
- package/src/domains/dispatch/state.ts +15 -2
- package/src/domains/dispatch/types.ts +21 -5
- package/src/domains/dispatch/worker-spawn.ts +58 -21
- package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
- package/src/domains/eval/compare/behavioral.ts +81 -14
- package/src/domains/eval/compare/compare.ts +15 -5
- package/src/domains/eval/compare/envelope.ts +12 -5
- package/src/domains/eval/metrics/context.ts +24 -1
- package/src/domains/eval/metrics/tracked.ts +4 -28
- package/src/domains/eval/reports/comparison.ts +9 -9
- package/src/domains/eval/runners/clio-run.ts +17 -10
- package/src/domains/eval/runners/context-index.ts +2 -7
- package/src/domains/eval/runners/context-init.ts +3 -6
- package/src/domains/eval/runners/external-command.ts +29 -11
- package/src/domains/eval/schema/suite.ts +2 -0
- package/src/domains/eval/schema/validate.ts +1 -0
- package/src/domains/eval/suites/run.ts +189 -13
- package/src/domains/eval/verifiers/integrity.ts +39 -0
- package/src/domains/eval/verifiers/patch.ts +58 -2
- package/src/domains/eval/workspaces/temp-copy.ts +3 -0
- package/src/domains/evidence/build.ts +106 -17
- package/src/domains/evidence/detail.ts +69 -0
- package/src/domains/evidence/eval.ts +13 -1
- package/src/domains/evidence/finish-contract-map.ts +5 -1
- package/src/domains/evidence/inventory.ts +167 -0
- package/src/domains/evidence/store.ts +16 -0
- package/src/domains/evidence/types.ts +12 -0
- package/src/domains/extensions/resources.ts +7 -0
- package/src/domains/interop/registry.ts +2 -2
- package/src/domains/middleware/hooks-io.ts +45 -26
- package/src/domains/middleware/hooks.ts +6 -0
- package/src/domains/middleware/injection-screen.ts +23 -0
- package/src/domains/middleware/marketplace-offer.ts +20 -1
- package/src/domains/middleware/rules.ts +5 -1
- package/src/domains/middleware/runtime.ts +7 -3
- package/src/domains/middleware/stalled-turn.ts +18 -3
- package/src/domains/middleware/task-board-reminder.ts +4 -2
- package/src/domains/middleware/task-nudge.ts +4 -1
- package/src/domains/mux/contract.ts +34 -1
- package/src/domains/mux/detect.ts +3 -6
- package/src/domains/mux/dock-controller.ts +8 -1
- package/src/domains/mux/index.ts +1 -0
- package/src/domains/mux/socket-client.ts +13 -3
- package/src/domains/observability/accountability.ts +15 -1
- package/src/domains/observability/contract.ts +54 -9
- package/src/domains/observability/evidence-index.ts +10 -0
- package/src/domains/observability/extension.ts +9 -5
- package/src/domains/observability/projection.ts +423 -53
- package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
- package/src/domains/prompts/compiler.ts +10 -2
- package/src/domains/prompts/contract.ts +7 -4
- package/src/domains/prompts/extension.ts +28 -64
- package/src/domains/prompts/fragments/identity/clio.md +23 -0
- package/src/domains/prompts/fragments/operating/contract.md +12 -0
- package/src/domains/prompts/fragments/operating/delegation.md +5 -0
- package/src/domains/prompts/fragments/wiki/page.md +36 -15
- package/src/domains/prompts/fragments/wiki/plan.md +4 -4
- package/src/domains/prompts/preload-prefix.ts +31 -0
- package/src/domains/prompts/preload.ts +135 -61
- package/src/domains/providers/auth/backend-file.ts +15 -11
- package/src/domains/providers/auth/storage.ts +3 -5
- package/src/domains/providers/catalog.ts +18 -3
- package/src/domains/providers/model-discovery.ts +1 -4
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +16 -14
- package/src/domains/providers/runtime-resolution.ts +11 -9
- package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
- package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
- package/src/domains/providers/support.ts +1 -1
- package/src/domains/providers/types/runtime-descriptor.ts +1 -1
- package/src/domains/resources/skills/promotion.ts +8 -1
- package/src/domains/safety/action-classifier.ts +16 -0
- package/src/domains/safety/autonomy.ts +10 -1
- package/src/domains/safety/contract.ts +5 -1
- package/src/domains/safety/default-path-policy.ts +13 -0
- package/src/domains/safety/extension.ts +11 -2
- package/src/domains/safety/finish-contract-registration.ts +29 -14
- package/src/domains/safety/finish-contract.ts +252 -40
- package/src/domains/safety/index.ts +20 -1
- package/src/domains/safety/policy-engine.ts +211 -34
- package/src/domains/safety/project-policy.ts +7 -2
- package/src/domains/safety/rigor.ts +53 -39
- package/src/domains/safety/validation-contract.ts +388 -0
- package/src/domains/safety/workspace-trust.ts +43 -0
- package/src/domains/session/archive-readers.ts +10 -1
- package/src/domains/session/compaction/compact.ts +384 -21
- package/src/domains/session/compaction/cut-point.ts +42 -5
- package/src/domains/session/compaction/tokens.ts +9 -1
- package/src/domains/session/decision-board.ts +137 -28
- package/src/domains/session/entries.ts +213 -11
- package/src/domains/session/extension.ts +4 -4
- package/src/domains/session/handoff.ts +2 -1
- package/src/domains/session/manager.ts +2 -3
- package/src/domains/session/prompt-manifest.ts +47 -8
- package/src/domains/session/task-board.ts +32 -1
- package/src/domains/session/tree/fork.ts +1 -2
- package/src/domains/session/tree/navigator.ts +1 -1
- package/src/domains/user-tasks/acceptance.ts +56 -0
- package/src/domains/user-tasks/active-acceptance.ts +40 -0
- package/src/domains/user-tasks/handoff.ts +16 -0
- package/src/domains/user-tasks/store.ts +34 -3
- package/src/engine/acp/adapter.ts +60 -10
- package/src/engine/acp/server.ts +22 -4
- package/src/engine/acp/transport.ts +55 -9
- package/src/engine/acp/types.ts +9 -0
- package/src/engine/antigravity/subprocess-runtime.ts +20 -4
- package/src/engine/api-registry.ts +19 -2
- package/src/engine/apis/ollama-native.ts +15 -0
- package/src/engine/apis/openai-completions.ts +13 -6
- package/src/engine/apis/output-budget.ts +26 -10
- package/src/engine/claude/sdk-runtime.ts +4 -3
- package/src/engine/claude/subprocess-runtime.ts +107 -60
- package/src/engine/env-api-keys.ts +2 -1
- package/src/engine/external-subprocess.ts +26 -7
- package/src/engine/loop-guard.ts +19 -2
- package/src/engine/provider-diagnostics.ts +129 -0
- package/src/engine/provider-payload.ts +3 -1
- package/src/engine/worker-runtime.ts +13 -2
- package/src/engine/worker-tools.ts +5 -1
- package/src/entry/extension-reload.ts +1 -0
- package/src/entry/orchestrator.ts +64 -17
- package/src/interactive/chat-loop-messages.ts +12 -4
- package/src/interactive/chat-loop.ts +115 -45
- package/src/interactive/chat-renderer.ts +60 -0
- package/src/interactive/context-recall-command.ts +2 -1
- package/src/interactive/dispatch-board.ts +58 -714
- package/src/interactive/editor-submit.ts +13 -0
- package/src/interactive/fleet-run-preview.ts +2 -1
- package/src/interactive/interactive-application.ts +11 -4
- package/src/interactive/interactive-event-projection.ts +7 -1
- package/src/interactive/interactive-presentation.ts +63 -12
- package/src/interactive/interactive-slash-runtime.ts +4 -1
- package/src/interactive/layout.ts +2 -1
- package/src/interactive/model-session-replay.ts +2 -2
- package/src/interactive/oracle.ts +5 -2
- package/src/interactive/overlay-frame.ts +1 -0
- package/src/interactive/overlay-general-openers.ts +3 -1
- package/src/interactive/overlay-session-lifecycle.ts +6 -0
- package/src/interactive/overlays/ask-user.ts +1 -0
- package/src/interactive/overlays/fleet-run-approval.ts +3 -2
- package/src/interactive/overlays/message-picker.ts +3 -3
- package/src/interactive/overlays/settings.ts +2 -2
- package/src/interactive/overlays/tree-selector.ts +2 -2
- package/src/interactive/renderers/branch-summary.ts +1 -1
- package/src/interactive/renderers/tool-execution.ts +17 -1
- package/src/interactive/renderers/worker-entry.ts +25 -10
- package/src/interactive/slash-autocomplete.ts +4 -6
- package/src/interactive/slash-commands.ts +31 -43
- package/src/interactive/slash-spec.ts +28 -0
- package/src/interactive/turn-context.ts +221 -53
- package/src/interactive/turn-middleware.ts +3 -1
- package/src/interactive/turn-persistence.ts +3 -0
- package/src/interactive/turn-runtime.ts +11 -2
- package/src/interactive/turn-state.ts +10 -9
- package/src/interactive/view/artifacts.ts +2 -0
- package/src/interactive/watch-pane.ts +18 -4
- package/src/interactive/worker-stream.ts +14 -10
- package/src/tools/agent-tools.ts +6 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +40 -2
- package/src/tools/codewiki/code-nav.ts +4 -10
- package/src/tools/compete-judge-task.ts +71 -0
- package/src/tools/compete-worktrees.ts +41 -1
- package/src/tools/context/index.ts +32 -7
- package/src/tools/context/surface.ts +15 -4
- package/src/tools/core-bootstrap.ts +16 -0
- package/src/tools/decide.ts +136 -0
- package/src/tools/dispatch-admission.ts +33 -1
- package/src/tools/dispatch-arguments.ts +38 -1
- package/src/tools/dispatch-plan.ts +12 -9
- package/src/tools/dispatch-runner.ts +63 -33
- package/src/tools/dispatch-schema.ts +30 -23
- package/src/tools/dispatch-scout-admission.ts +10 -44
- package/src/tools/dispatch-scout.ts +2 -3
- package/src/tools/dispatch-types.ts +6 -0
- package/src/tools/evidence.ts +96 -0
- package/src/tools/find.ts +13 -4
- package/src/tools/grep.ts +13 -1
- package/src/tools/limitation.ts +76 -0
- package/src/tools/ls.ts +7 -1
- package/src/tools/monitor.ts +26 -11
- package/src/tools/network-policy.ts +11 -24
- package/src/tools/observation.ts +39 -2
- package/src/tools/policy.ts +9 -0
- package/src/tools/presentation.ts +3 -0
- package/src/tools/read.ts +112 -15
- package/src/tools/registry.ts +55 -18
- package/src/tools/result-shaping.ts +127 -7
- package/src/tools/task-worktree.ts +13 -3
- package/src/tools/tasks.ts +40 -5
- package/src/tools/verify/authoring.ts +170 -83
- package/src/tools/verify/catalog.ts +122 -5
- package/src/tools/verify/frontend.ts +67 -30
- package/src/tools/verify/index.ts +2 -1
- package/src/tools/verify/numeric.ts +303 -0
- package/src/tools/verify/perf.ts +143 -0
- package/src/tools/verify/scripts.ts +229 -2
- package/src/tools/web-fetch-network.ts +179 -0
- package/src/tools/web-fetch-surface.ts +2 -1
- package/src/tools/web-fetch.ts +15 -13
- package/src/tools/worker-evidence.ts +27 -0
- package/src/worker/spec-contract.ts +12 -8
- package/dist/builtins-IA7V7FUC.js +0 -22
- package/dist/chunk-2WZ546HR.js +0 -792
- package/dist/chunk-5PSMVOLM.js +0 -56
- package/dist/chunk-7DICMOS6.js +0 -313
- package/dist/chunk-BEPZRGGU.js +0 -1560
- package/dist/chunk-JVCV3ICN.js +0 -47
- package/dist/chunk-KK4JZPBQ.js +0 -3982
- package/dist/chunk-MNJGS2IN.js +0 -33
- package/dist/chunk-NDINPTJ4.js +0 -641
- package/dist/chunk-O5CVSAG5.js +0 -122
- package/dist/chunk-OQE5J4C6.js +0 -73
- package/dist/chunk-RVG5JXAL.js +0 -41
- package/dist/chunk-T56WDKA5.js +0 -183
- package/dist/chunk-UUVG37B4.js +0 -244
- package/dist/chunk-VPKWYKEY.js +0 -169
- package/dist/chunk-Y3CBHOR6.js +0 -228
- package/dist/clio-CMMK4KRR.js +0 -25
- package/dist/configure-LE3IK2TJ.js +0 -56
- package/dist/context-clear-BW4O37TG.js +0 -176
- package/dist/fleet-view-SWBR3VGQ.js +0 -97
- package/dist/preload-P6DGH2PZ.js +0 -13
- package/dist/slash-commands-S7MBJDQK.js +0 -83
- package/dist/tools-TFGJICCU.js +0 -29
- package/dist/verify-RWE4PPEK.js +0 -27
- package/dist/wiki-generate-C7IQOXSP.js +0 -469
|
@@ -0,0 +1,674 @@
|
|
|
1
|
+
import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
isProjectVerifierCheckId
|
|
4
|
+
} from "./chunk-M4KFUXS7.js";
|
|
5
|
+
import {
|
|
6
|
+
compareCodepoints
|
|
7
|
+
} from "./chunk-B6UM3OZC.js";
|
|
8
|
+
import {
|
|
9
|
+
SAFE_EXEC_DEFAULT_TIMEOUT_MS,
|
|
10
|
+
resolveSafeCwd
|
|
11
|
+
} from "./chunk-GJ24ODAX.js";
|
|
12
|
+
import {
|
|
13
|
+
require_dist
|
|
14
|
+
} from "./chunk-B5GGDIHT.js";
|
|
15
|
+
import {
|
|
16
|
+
__toESM,
|
|
17
|
+
init_esm_shims
|
|
18
|
+
} from "./chunk-ECBHH7LU.js";
|
|
19
|
+
|
|
20
|
+
// src/tools/verify/numeric.ts
|
|
21
|
+
init_esm_shims();
|
|
22
|
+
var NUMERIC_PAYLOAD_CAPS = Object.freeze({
|
|
23
|
+
keys: 4096,
|
|
24
|
+
elements: 1e6
|
|
25
|
+
});
|
|
26
|
+
function normalizeNumericTolerance(value) {
|
|
27
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
28
|
+
return new Error("tolerance must be an object with relative, absolute, or ulp");
|
|
29
|
+
}
|
|
30
|
+
const record = value;
|
|
31
|
+
const unknown = Object.keys(record).filter((key) => key !== "relative" && key !== "absolute" && key !== "ulp");
|
|
32
|
+
if (unknown.length > 0) return new Error(`tolerance has unknown field(s): ${unknown.sort().join(", ")}`);
|
|
33
|
+
const tolerance = {};
|
|
34
|
+
for (const kind of ["relative", "absolute"]) {
|
|
35
|
+
if (!Object.hasOwn(record, kind)) continue;
|
|
36
|
+
const bound = record[kind];
|
|
37
|
+
if (typeof bound !== "number" || !Number.isFinite(bound) || bound < 0) {
|
|
38
|
+
return new Error(`tolerance.${kind} must be a finite non-negative number`);
|
|
39
|
+
}
|
|
40
|
+
tolerance[kind] = bound;
|
|
41
|
+
}
|
|
42
|
+
if (Object.hasOwn(record, "ulp")) {
|
|
43
|
+
const bound = record.ulp;
|
|
44
|
+
if (typeof bound !== "number" || !Number.isInteger(bound) || bound < 0) {
|
|
45
|
+
return new Error("tolerance.ulp must be a non-negative integer");
|
|
46
|
+
}
|
|
47
|
+
tolerance.ulp = bound;
|
|
48
|
+
}
|
|
49
|
+
if (tolerance.relative === void 0 && tolerance.absolute === void 0 && tolerance.ulp === void 0) {
|
|
50
|
+
return new Error("tolerance must name at least one of relative, absolute, or ulp");
|
|
51
|
+
}
|
|
52
|
+
return tolerance;
|
|
53
|
+
}
|
|
54
|
+
var ORDERED_VIEW = new DataView(new ArrayBuffer(8));
|
|
55
|
+
function orderedBits(value) {
|
|
56
|
+
ORDERED_VIEW.setFloat64(0, value);
|
|
57
|
+
const bits = ORDERED_VIEW.getBigInt64(0);
|
|
58
|
+
return bits < 0n ? -(bits & 0x7fffffffffffffffn) : bits;
|
|
59
|
+
}
|
|
60
|
+
function ulpDistance(actual, expected) {
|
|
61
|
+
if (!Number.isFinite(actual) || !Number.isFinite(expected)) return Number.POSITIVE_INFINITY;
|
|
62
|
+
const distance = orderedBits(actual) - orderedBits(expected);
|
|
63
|
+
const magnitude = distance < 0n ? -distance : distance;
|
|
64
|
+
return magnitude > BigInt(Number.MAX_SAFE_INTEGER) ? Number.POSITIVE_INFINITY : Number(magnitude);
|
|
65
|
+
}
|
|
66
|
+
function parseNumericPayload(text, label) {
|
|
67
|
+
let parsed;
|
|
68
|
+
try {
|
|
69
|
+
parsed = JSON.parse(text);
|
|
70
|
+
} catch (error) {
|
|
71
|
+
return new Error(`${label} is not valid JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
72
|
+
}
|
|
73
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
74
|
+
return new Error(`${label} must be a JSON object of string -> number | number[]`);
|
|
75
|
+
}
|
|
76
|
+
const record = parsed;
|
|
77
|
+
const keys = Object.keys(record);
|
|
78
|
+
if (keys.length > NUMERIC_PAYLOAD_CAPS.keys)
|
|
79
|
+
return new Error(`${label} exceeds the ${NUMERIC_PAYLOAD_CAPS.keys}-key cap`);
|
|
80
|
+
const payload = {};
|
|
81
|
+
let elements = 0;
|
|
82
|
+
for (const key of keys) {
|
|
83
|
+
const value = record[key];
|
|
84
|
+
if (typeof value === "number") {
|
|
85
|
+
payload[key] = value;
|
|
86
|
+
elements += 1;
|
|
87
|
+
} else if (Array.isArray(value) && value.every((entry) => typeof entry === "number")) {
|
|
88
|
+
payload[key] = [...value];
|
|
89
|
+
elements += value.length;
|
|
90
|
+
} else {
|
|
91
|
+
return new Error(`${label}.${key} must be a number or an array of numbers`);
|
|
92
|
+
}
|
|
93
|
+
if (elements > NUMERIC_PAYLOAD_CAPS.elements) {
|
|
94
|
+
return new Error(`${label} exceeds the ${NUMERIC_PAYLOAD_CAPS.elements}-element cap`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return payload;
|
|
98
|
+
}
|
|
99
|
+
function deviation(actual, expected, index) {
|
|
100
|
+
const finite = Number.isFinite(actual) && Number.isFinite(expected);
|
|
101
|
+
const absolute = finite ? Math.abs(actual - expected) : Number.POSITIVE_INFINITY;
|
|
102
|
+
let relative = !finite ? null : expected === 0 ? absolute === 0 ? 0 : null : absolute / Math.abs(expected);
|
|
103
|
+
if (finite && !Number.isFinite(absolute)) {
|
|
104
|
+
relative = Math.abs(actual / expected - 1);
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
...index !== void 0 ? { index } : {},
|
|
108
|
+
actual,
|
|
109
|
+
expected,
|
|
110
|
+
absolute,
|
|
111
|
+
relative,
|
|
112
|
+
ulp: finite ? ulpDistance(actual, expected) : null
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function violatedTolerances(item, tolerance) {
|
|
116
|
+
const failed = [];
|
|
117
|
+
if (tolerance.relative !== void 0 && (item.relative === null || item.relative > tolerance.relative)) {
|
|
118
|
+
failed.push("relative");
|
|
119
|
+
}
|
|
120
|
+
if (tolerance.absolute !== void 0 && item.absolute > tolerance.absolute) failed.push("absolute");
|
|
121
|
+
if (tolerance.ulp !== void 0 && (item.ulp === null || item.ulp > tolerance.ulp)) failed.push("ulp");
|
|
122
|
+
return failed;
|
|
123
|
+
}
|
|
124
|
+
function formatNumber(value) {
|
|
125
|
+
return Number.isFinite(value) ? value.toPrecision(6).replace(/\.?0+(e|$)/u, "$1") : String(value);
|
|
126
|
+
}
|
|
127
|
+
function describeDeviation(item) {
|
|
128
|
+
const where = item.index === void 0 ? "" : `[${item.index}]`;
|
|
129
|
+
const relative = item.relative === null ? "undefined" : formatNumber(item.relative);
|
|
130
|
+
const ulp = item.ulp === null ? "undefined" : String(item.ulp);
|
|
131
|
+
return `${where} actual=${formatNumber(item.actual)} expected=${formatNumber(item.expected)} abs=${formatNumber(item.absolute)} rel=${relative} ulp=${ulp}`;
|
|
132
|
+
}
|
|
133
|
+
function compareElements(key, actual, expected, tolerance) {
|
|
134
|
+
let worst;
|
|
135
|
+
let worstFailed = [];
|
|
136
|
+
for (let index = 0; index < expected.length; index += 1) {
|
|
137
|
+
const item = deviation(
|
|
138
|
+
actual[index],
|
|
139
|
+
expected[index],
|
|
140
|
+
expected.length === 1 && actual.length === 1 ? void 0 : index
|
|
141
|
+
);
|
|
142
|
+
const failed = !Number.isFinite(item.actual) || !Number.isFinite(item.expected) ? ["not-finite"] : violatedTolerances(item, tolerance);
|
|
143
|
+
const worse = worst === void 0 || failed.length > 0 && worstFailed.length === 0 || failed.length > 0 === worstFailed.length > 0 && item.absolute > worst.absolute;
|
|
144
|
+
if (worse) {
|
|
145
|
+
worst = item;
|
|
146
|
+
worstFailed = failed;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (worst === void 0) return { key, passed: true, failed: [], detail: `${key}: empty array matches` };
|
|
150
|
+
const passed = worstFailed.length === 0;
|
|
151
|
+
return {
|
|
152
|
+
key,
|
|
153
|
+
passed,
|
|
154
|
+
failed: worstFailed,
|
|
155
|
+
worst,
|
|
156
|
+
detail: passed ? `${key}: within tolerance, worst${describeDeviation(worst)}` : `${key}: failed ${worstFailed.join(", ")} at worst${describeDeviation(worst)}`
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
function compareNumeric(actual, reference, tolerance) {
|
|
160
|
+
const keys = [.../* @__PURE__ */ new Set([...Object.keys(reference), ...Object.keys(actual)])].sort();
|
|
161
|
+
const reports = [];
|
|
162
|
+
for (const key of keys) {
|
|
163
|
+
const got = actual[key];
|
|
164
|
+
const want = reference[key];
|
|
165
|
+
if (got === void 0) {
|
|
166
|
+
reports.push({ key, passed: false, failed: ["missing-actual"], detail: `${key}: missing from the command output` });
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (want === void 0) {
|
|
170
|
+
reports.push({ key, passed: false, failed: ["missing-reference"], detail: `${key}: missing from the reference` });
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (Array.isArray(got) !== Array.isArray(want)) {
|
|
174
|
+
reports.push({
|
|
175
|
+
key,
|
|
176
|
+
passed: false,
|
|
177
|
+
failed: ["shape-mismatch"],
|
|
178
|
+
detail: `${key}: ${Array.isArray(got) ? "array" : "scalar"} in the command output but ${Array.isArray(want) ? "array" : "scalar"} in the reference`
|
|
179
|
+
});
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
const gotList = Array.isArray(got) ? got : [got];
|
|
183
|
+
const wantList = Array.isArray(want) ? want : [want];
|
|
184
|
+
if (gotList.length !== wantList.length) {
|
|
185
|
+
reports.push({
|
|
186
|
+
key,
|
|
187
|
+
passed: false,
|
|
188
|
+
failed: ["length-mismatch"],
|
|
189
|
+
detail: `${key}: ${gotList.length} element(s) in the command output but ${wantList.length} in the reference`
|
|
190
|
+
});
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
reports.push(compareElements(key, gotList, wantList, tolerance));
|
|
194
|
+
}
|
|
195
|
+
const failedKeys = reports.filter((report) => !report.passed).map((report) => report.key);
|
|
196
|
+
const passed = failedKeys.length === 0;
|
|
197
|
+
return {
|
|
198
|
+
kind: "numeric-compare",
|
|
199
|
+
passed,
|
|
200
|
+
tolerance: { ...tolerance },
|
|
201
|
+
keys: reports,
|
|
202
|
+
failedKeys,
|
|
203
|
+
summary: passed ? `numeric-compare passed: ${reports.length} key(s) within tolerance` : `numeric-compare failed: ${failedKeys.length} of ${reports.length} key(s) out of tolerance (${failedKeys.join(", ")})`
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
function renderNumericReport(report) {
|
|
207
|
+
const lines = [report.summary, `tolerance: ${JSON.stringify(report.tolerance)}`];
|
|
208
|
+
for (const key of report.keys) lines.push(`- ${key.detail}`);
|
|
209
|
+
return lines.join("\n");
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// src/tools/verify/catalog.ts
|
|
213
|
+
init_esm_shims();
|
|
214
|
+
var import_yaml = __toESM(require_dist(), 1);
|
|
215
|
+
import { existsSync, readFileSync, realpathSync, statSync } from "node:fs";
|
|
216
|
+
import path from "node:path";
|
|
217
|
+
|
|
218
|
+
// src/tools/verify/perf.ts
|
|
219
|
+
init_esm_shims();
|
|
220
|
+
var PERF_BASELINE_VERSION = 1;
|
|
221
|
+
function normalizePerfBudget(value) {
|
|
222
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
223
|
+
return new Error("budget must be an object with wallTimeMs");
|
|
224
|
+
}
|
|
225
|
+
const record = value;
|
|
226
|
+
const unknown = Object.keys(record).filter((key) => key !== "wallTimeMs" && key !== "tolerance");
|
|
227
|
+
if (unknown.length > 0) return new Error(`budget has unknown field(s): ${unknown.sort().join(", ")}`);
|
|
228
|
+
if (typeof record.wallTimeMs !== "number" || !Number.isFinite(record.wallTimeMs) || record.wallTimeMs <= 0) {
|
|
229
|
+
return new Error("budget.wallTimeMs must be a positive number of milliseconds");
|
|
230
|
+
}
|
|
231
|
+
const spec = { wallTimeMs: record.wallTimeMs };
|
|
232
|
+
if (Object.hasOwn(record, "tolerance")) {
|
|
233
|
+
const tolerance = normalizePerfTolerance(record.tolerance, "budget.tolerance");
|
|
234
|
+
if (tolerance instanceof Error) return tolerance;
|
|
235
|
+
spec.tolerance = tolerance;
|
|
236
|
+
}
|
|
237
|
+
return spec;
|
|
238
|
+
}
|
|
239
|
+
function normalizePerfTolerance(value, location) {
|
|
240
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
241
|
+
return new Error(`${location} must be an object with relative`);
|
|
242
|
+
}
|
|
243
|
+
const record = value;
|
|
244
|
+
const unknown = Object.keys(record).filter((key) => key !== "relative");
|
|
245
|
+
if (unknown.length > 0) return new Error(`${location} has unknown field(s): ${unknown.sort().join(", ")}`);
|
|
246
|
+
if (!Object.hasOwn(record, "relative")) return {};
|
|
247
|
+
if (typeof record.relative !== "number" || !Number.isFinite(record.relative) || record.relative < 0) {
|
|
248
|
+
return new Error(`${location}.relative must be a finite non-negative number`);
|
|
249
|
+
}
|
|
250
|
+
return { relative: record.relative };
|
|
251
|
+
}
|
|
252
|
+
function parsePerfBaseline(text, label) {
|
|
253
|
+
let parsed;
|
|
254
|
+
try {
|
|
255
|
+
parsed = JSON.parse(text);
|
|
256
|
+
} catch (error) {
|
|
257
|
+
return new Error(`${label} is not valid JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
258
|
+
}
|
|
259
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
260
|
+
return new Error(`${label} must be a JSON object with wallTimeMs`);
|
|
261
|
+
}
|
|
262
|
+
const record = parsed;
|
|
263
|
+
if (typeof record.wallTimeMs !== "number" || !Number.isFinite(record.wallTimeMs) || record.wallTimeMs <= 0) {
|
|
264
|
+
return new Error(`${label}.wallTimeMs must be a positive number of milliseconds`);
|
|
265
|
+
}
|
|
266
|
+
const baseline = { wallTimeMs: record.wallTimeMs };
|
|
267
|
+
if (typeof record.recordedAt === "string") baseline.recordedAt = record.recordedAt;
|
|
268
|
+
if (typeof record.check === "string") baseline.check = record.check;
|
|
269
|
+
return baseline;
|
|
270
|
+
}
|
|
271
|
+
function renderPerfBaseline(input) {
|
|
272
|
+
return `${JSON.stringify(
|
|
273
|
+
{ version: PERF_BASELINE_VERSION, check: input.check, wallTimeMs: input.wallTimeMs, recordedAt: input.recordedAt },
|
|
274
|
+
null,
|
|
275
|
+
2
|
|
276
|
+
)}
|
|
277
|
+
`;
|
|
278
|
+
}
|
|
279
|
+
function evaluatePerfBudget(measuredMs, spec) {
|
|
280
|
+
if (!Number.isFinite(measuredMs) || measuredMs < 0)
|
|
281
|
+
return new Error("measured wall time must be a non-negative number");
|
|
282
|
+
let source;
|
|
283
|
+
let referenceMs;
|
|
284
|
+
let relative;
|
|
285
|
+
if (spec.budget !== void 0) {
|
|
286
|
+
source = "budget";
|
|
287
|
+
referenceMs = spec.budget.wallTimeMs;
|
|
288
|
+
relative = spec.budget.tolerance?.relative ?? 0;
|
|
289
|
+
} else if (spec.baseline !== void 0) {
|
|
290
|
+
source = "baseline";
|
|
291
|
+
referenceMs = spec.baseline.wallTimeMs;
|
|
292
|
+
relative = spec.relative ?? 0;
|
|
293
|
+
} else {
|
|
294
|
+
return new Error("perf-budget needs a budget or a recorded baseline");
|
|
295
|
+
}
|
|
296
|
+
const budgetMs = referenceMs * (1 + relative);
|
|
297
|
+
const ratio = Math.round(measuredMs / budgetMs * 1e3) / 1e3;
|
|
298
|
+
const passed = measuredMs <= budgetMs;
|
|
299
|
+
const bound = `${Math.round(budgetMs)}ms (${source} ${Math.round(referenceMs)}ms${relative > 0 ? ` +${Math.round(relative * 100)}%` : ""})`;
|
|
300
|
+
return {
|
|
301
|
+
kind: "perf-budget",
|
|
302
|
+
passed,
|
|
303
|
+
measuredMs,
|
|
304
|
+
budgetMs,
|
|
305
|
+
ratio,
|
|
306
|
+
source,
|
|
307
|
+
referenceMs,
|
|
308
|
+
relative,
|
|
309
|
+
summary: passed ? `perf-budget passed: measured ${Math.round(measuredMs)}ms within ${bound}, ratio ${ratio}` : `perf-budget failed: measured ${Math.round(measuredMs)}ms exceeds ${bound}, ratio ${ratio}`
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// src/tools/verify/catalog.ts
|
|
314
|
+
var PROJECT_VERIFIER_CATALOG_RELATIVE_PATH = ".clio-coder/verifiers.yaml";
|
|
315
|
+
var PROJECT_VERIFIER_CATALOG_VERSION = 2;
|
|
316
|
+
var SUPPORTED_CATALOG_VERSIONS = [1, PROJECT_VERIFIER_CATALOG_VERSION];
|
|
317
|
+
var PROJECT_VERIFIER_CATALOG_CAPS = Object.freeze({
|
|
318
|
+
fileBytes: 256 * 1024,
|
|
319
|
+
checks: 128,
|
|
320
|
+
idBytes: 64,
|
|
321
|
+
descriptionBytes: 512,
|
|
322
|
+
argvEntries: 64,
|
|
323
|
+
argumentBytes: 4096,
|
|
324
|
+
cwdBytes: 512,
|
|
325
|
+
timeoutMs: 9e5,
|
|
326
|
+
tags: 16,
|
|
327
|
+
tagBytes: 32
|
|
328
|
+
});
|
|
329
|
+
var DECLARED_CHECK_KINDS = ["command", "numeric-compare", "perf-budget"];
|
|
330
|
+
var ROOT_FIELDS = /* @__PURE__ */ new Set(["version", "checks"]);
|
|
331
|
+
var CHECK_FIELDS = /* @__PURE__ */ new Set(["id", "description", "command", "cwd", "timeoutMs", "tags"]);
|
|
332
|
+
var CHECK_FIELDS_V2 = /* @__PURE__ */ new Set([...CHECK_FIELDS, "kind", "reference", "tolerance", "budget", "baseline"]);
|
|
333
|
+
var TAG_PATTERN = /^[a-z0-9][a-z0-9._-]*$/;
|
|
334
|
+
var SHELL_EXECUTABLES = /* @__PURE__ */ new Set([
|
|
335
|
+
"bash",
|
|
336
|
+
"cmd",
|
|
337
|
+
"command.com",
|
|
338
|
+
"dash",
|
|
339
|
+
"fish",
|
|
340
|
+
"ksh",
|
|
341
|
+
"powershell",
|
|
342
|
+
"pwsh",
|
|
343
|
+
"sh",
|
|
344
|
+
"tcsh",
|
|
345
|
+
"zsh"
|
|
346
|
+
]);
|
|
347
|
+
function isRecord(value) {
|
|
348
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
349
|
+
}
|
|
350
|
+
function utf8Bytes(value) {
|
|
351
|
+
return Buffer.byteLength(value, "utf8");
|
|
352
|
+
}
|
|
353
|
+
function hasControlCharacter(value) {
|
|
354
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
355
|
+
const code = value.charCodeAt(index);
|
|
356
|
+
if (code <= 31 || code === 127) return true;
|
|
357
|
+
}
|
|
358
|
+
return false;
|
|
359
|
+
}
|
|
360
|
+
function catalogDiagnostic(message) {
|
|
361
|
+
return { ok: false, reason: `${PROJECT_VERIFIER_CATALOG_RELATIVE_PATH}: ${message}` };
|
|
362
|
+
}
|
|
363
|
+
function unknownFields(record, allowed) {
|
|
364
|
+
return Object.keys(record).filter((key) => !allowed.has(key)).sort(compareCodepoints);
|
|
365
|
+
}
|
|
366
|
+
function relativeCwd(workspaceRoot, resolved) {
|
|
367
|
+
const relative = path.relative(workspaceRoot, resolved);
|
|
368
|
+
return relative.length === 0 ? "." : relative.split(path.sep).join("/");
|
|
369
|
+
}
|
|
370
|
+
function safelyResolveCatalogCwd(rawCwd, workspaceRoot, location) {
|
|
371
|
+
if (path.isAbsolute(rawCwd) || path.win32.isAbsolute(rawCwd)) {
|
|
372
|
+
return new Error(`${location} must be repository-relative; absolute cwd '${rawCwd}' is not allowed`);
|
|
373
|
+
}
|
|
374
|
+
let resolved;
|
|
375
|
+
try {
|
|
376
|
+
resolved = resolveSafeCwd(rawCwd, workspaceRoot);
|
|
377
|
+
} catch {
|
|
378
|
+
return new Error(`${location} escapes the workspace root: '${rawCwd}'`);
|
|
379
|
+
}
|
|
380
|
+
let realCwd;
|
|
381
|
+
try {
|
|
382
|
+
const cwdStat = statSync(resolved);
|
|
383
|
+
if (!cwdStat.isDirectory()) return new Error(`${location} is not a directory: '${rawCwd}'`);
|
|
384
|
+
const realRoot = realpathSync(workspaceRoot);
|
|
385
|
+
realCwd = realpathSync(resolved);
|
|
386
|
+
resolveSafeCwd(realCwd, realRoot);
|
|
387
|
+
} catch (error) {
|
|
388
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
389
|
+
if (message.includes("escapes workspace root")) {
|
|
390
|
+
return new Error(`${location} escapes the workspace root through a symbolic link: '${rawCwd}'`);
|
|
391
|
+
}
|
|
392
|
+
return new Error(`${location} cannot be resolved as a repository directory: '${rawCwd}' (${message})`);
|
|
393
|
+
}
|
|
394
|
+
return { declared: relativeCwd(workspaceRoot, resolved), execution: realCwd };
|
|
395
|
+
}
|
|
396
|
+
function validateRepositoryFile(value, location) {
|
|
397
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
398
|
+
return new Error(`${location} must be a non-empty repository-relative path`);
|
|
399
|
+
}
|
|
400
|
+
if (value.includes("\0")) return new Error(`${location} must not contain a NUL byte`);
|
|
401
|
+
if (utf8Bytes(value) > PROJECT_VERIFIER_CATALOG_CAPS.cwdBytes) {
|
|
402
|
+
return new Error(`${location} exceeds the ${PROJECT_VERIFIER_CATALOG_CAPS.cwdBytes}-byte cap`);
|
|
403
|
+
}
|
|
404
|
+
if (path.isAbsolute(value) || path.win32.isAbsolute(value)) {
|
|
405
|
+
return new Error(`${location} must be repository-relative; absolute path '${value}' is not allowed`);
|
|
406
|
+
}
|
|
407
|
+
const normalized = path.posix.normalize(value.split(path.sep).join("/"));
|
|
408
|
+
if (normalized === ".." || normalized.startsWith("../")) {
|
|
409
|
+
return new Error(`${location} escapes the workspace root: '${value}'`);
|
|
410
|
+
}
|
|
411
|
+
return normalized;
|
|
412
|
+
}
|
|
413
|
+
function validateCheckKind(value, location, version) {
|
|
414
|
+
const kindValue = Object.hasOwn(value, "kind") ? value.kind : "command";
|
|
415
|
+
if (typeof kindValue !== "string" || !DECLARED_CHECK_KINDS.includes(kindValue)) {
|
|
416
|
+
return new Error(`${location}.kind must be one of ${DECLARED_CHECK_KINDS.join(", ")}`);
|
|
417
|
+
}
|
|
418
|
+
const kind = kindValue;
|
|
419
|
+
const present = (field) => Object.hasOwn(value, field);
|
|
420
|
+
const accepted = {
|
|
421
|
+
command: [],
|
|
422
|
+
"numeric-compare": ["reference", "tolerance"],
|
|
423
|
+
"perf-budget": ["budget", "baseline", "tolerance"]
|
|
424
|
+
};
|
|
425
|
+
const stray = ["reference", "tolerance", "budget", "baseline"].filter(
|
|
426
|
+
(field) => present(field) && !accepted[kind].includes(field)
|
|
427
|
+
);
|
|
428
|
+
if (stray.length > 0) return new Error(`${location} kind '${kind}' does not accept ${stray.join(", ")}`);
|
|
429
|
+
if (version === 1 && kind !== "command") return new Error(`${location}.kind requires catalog version 2`);
|
|
430
|
+
if (kind === "command") return { kind };
|
|
431
|
+
if (kind === "numeric-compare") {
|
|
432
|
+
if (!present("reference")) return new Error(`${location}.reference is required for kind numeric-compare`);
|
|
433
|
+
if (!present("tolerance")) return new Error(`${location}.tolerance is required for kind numeric-compare`);
|
|
434
|
+
const reference = validateRepositoryFile(value.reference, `${location}.reference`);
|
|
435
|
+
if (reference instanceof Error) return reference;
|
|
436
|
+
const tolerance = normalizeNumericTolerance(value.tolerance);
|
|
437
|
+
if (tolerance instanceof Error) return new Error(`${location}.${tolerance.message}`);
|
|
438
|
+
return { kind, numeric: { reference, tolerance } };
|
|
439
|
+
}
|
|
440
|
+
if (present("budget") === present("baseline")) {
|
|
441
|
+
return new Error(`${location} kind 'perf-budget' requires exactly one of budget or baseline`);
|
|
442
|
+
}
|
|
443
|
+
if (present("budget")) {
|
|
444
|
+
if (present("tolerance")) return new Error(`${location}.tolerance belongs inside budget when budget is given`);
|
|
445
|
+
const budget = normalizePerfBudget(value.budget);
|
|
446
|
+
if (budget instanceof Error) return new Error(`${location}.${budget.message}`);
|
|
447
|
+
return { kind, perf: { budget } };
|
|
448
|
+
}
|
|
449
|
+
const baseline = validateRepositoryFile(value.baseline, `${location}.baseline`);
|
|
450
|
+
if (baseline instanceof Error) return baseline;
|
|
451
|
+
const perf = { baseline };
|
|
452
|
+
if (present("tolerance")) {
|
|
453
|
+
const tolerance = normalizePerfTolerance(value.tolerance, `${location}.tolerance`);
|
|
454
|
+
if (tolerance instanceof Error) return tolerance;
|
|
455
|
+
perf.tolerance = tolerance;
|
|
456
|
+
}
|
|
457
|
+
return { kind, perf };
|
|
458
|
+
}
|
|
459
|
+
function resolveProjectVerifierExecutionCwd(rawCwd, workspaceRoot) {
|
|
460
|
+
const resolution = safelyResolveCatalogCwd(rawCwd, workspaceRoot, "project check cwd");
|
|
461
|
+
return resolution instanceof Error ? resolution : resolution.execution;
|
|
462
|
+
}
|
|
463
|
+
function validateId(value, location) {
|
|
464
|
+
if (typeof value !== "string" || value.length === 0) return new Error(`${location} must be a non-empty string`);
|
|
465
|
+
if (utf8Bytes(value) > PROJECT_VERIFIER_CATALOG_CAPS.idBytes) {
|
|
466
|
+
return new Error(`${location} exceeds the ${PROJECT_VERIFIER_CATALOG_CAPS.idBytes}-byte cap`);
|
|
467
|
+
}
|
|
468
|
+
if (!isProjectVerifierCheckId(value)) {
|
|
469
|
+
return new Error(`${location} must match /^[a-z0-9][a-z0-9._:-]*$/`);
|
|
470
|
+
}
|
|
471
|
+
if (value === "frontend") return new Error(`${location} uses reserved built-in check id 'frontend'`);
|
|
472
|
+
return value;
|
|
473
|
+
}
|
|
474
|
+
function validateDescription(value, location) {
|
|
475
|
+
if (typeof value !== "string" || value.length === 0) return new Error(`${location} must be a non-empty string`);
|
|
476
|
+
if (value.trim() !== value || hasControlCharacter(value)) {
|
|
477
|
+
return new Error(`${location} must be trimmed, single-line text without control characters`);
|
|
478
|
+
}
|
|
479
|
+
if (utf8Bytes(value) > PROJECT_VERIFIER_CATALOG_CAPS.descriptionBytes) {
|
|
480
|
+
return new Error(`${location} exceeds the ${PROJECT_VERIFIER_CATALOG_CAPS.descriptionBytes}-byte cap`);
|
|
481
|
+
}
|
|
482
|
+
return value;
|
|
483
|
+
}
|
|
484
|
+
function validateCommand(value, location) {
|
|
485
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
486
|
+
return new Error(`${location} must be a non-empty argv string array; shell command strings are not allowed`);
|
|
487
|
+
}
|
|
488
|
+
if (value.length > PROJECT_VERIFIER_CATALOG_CAPS.argvEntries) {
|
|
489
|
+
return new Error(`${location} exceeds the ${PROJECT_VERIFIER_CATALOG_CAPS.argvEntries}-entry cap`);
|
|
490
|
+
}
|
|
491
|
+
const command = [];
|
|
492
|
+
for (const [index, entry] of value.entries()) {
|
|
493
|
+
const entryLocation = `${location}[${index}]`;
|
|
494
|
+
if (typeof entry !== "string" || entry.length === 0) {
|
|
495
|
+
return new Error(`${entryLocation} must be a non-empty string`);
|
|
496
|
+
}
|
|
497
|
+
if (entry.includes("\0")) return new Error(`${entryLocation} must not contain a NUL byte`);
|
|
498
|
+
if (utf8Bytes(entry) > PROJECT_VERIFIER_CATALOG_CAPS.argumentBytes) {
|
|
499
|
+
return new Error(`${entryLocation} exceeds the ${PROJECT_VERIFIER_CATALOG_CAPS.argumentBytes}-byte cap`);
|
|
500
|
+
}
|
|
501
|
+
command.push(entry);
|
|
502
|
+
}
|
|
503
|
+
const executable = command[0] ?? "";
|
|
504
|
+
if (/\s/u.test(executable)) {
|
|
505
|
+
return new Error(`${location}[0] must be one executable token, not a shell command string`);
|
|
506
|
+
}
|
|
507
|
+
const executableName = path.basename(executable).toLowerCase().replace(/\.exe$/u, "");
|
|
508
|
+
if (SHELL_EXECUTABLES.has(executableName)) {
|
|
509
|
+
return new Error(`${location}[0] may not invoke shell executable '${executable}'`);
|
|
510
|
+
}
|
|
511
|
+
return command;
|
|
512
|
+
}
|
|
513
|
+
function validateTimeout(value, location) {
|
|
514
|
+
if (!Number.isInteger(value) || typeof value !== "number" || value <= 0) {
|
|
515
|
+
return new Error(`${location} must be a positive integer number of milliseconds`);
|
|
516
|
+
}
|
|
517
|
+
if (value > PROJECT_VERIFIER_CATALOG_CAPS.timeoutMs) {
|
|
518
|
+
return new Error(`${location} exceeds the ${PROJECT_VERIFIER_CATALOG_CAPS.timeoutMs}ms cap`);
|
|
519
|
+
}
|
|
520
|
+
return value;
|
|
521
|
+
}
|
|
522
|
+
function validateTags(value, location) {
|
|
523
|
+
if (!Array.isArray(value)) return new Error(`${location} must be an array of bounded tag strings`);
|
|
524
|
+
if (value.length > PROJECT_VERIFIER_CATALOG_CAPS.tags) {
|
|
525
|
+
return new Error(`${location} exceeds the ${PROJECT_VERIFIER_CATALOG_CAPS.tags}-tag cap`);
|
|
526
|
+
}
|
|
527
|
+
const tags = [];
|
|
528
|
+
const seen = /* @__PURE__ */ new Set();
|
|
529
|
+
for (const [index, entry] of value.entries()) {
|
|
530
|
+
const entryLocation = `${location}[${index}]`;
|
|
531
|
+
if (typeof entry !== "string" || entry.length === 0) {
|
|
532
|
+
return new Error(`${entryLocation} must be a non-empty string`);
|
|
533
|
+
}
|
|
534
|
+
if (utf8Bytes(entry) > PROJECT_VERIFIER_CATALOG_CAPS.tagBytes) {
|
|
535
|
+
return new Error(`${entryLocation} exceeds the ${PROJECT_VERIFIER_CATALOG_CAPS.tagBytes}-byte cap`);
|
|
536
|
+
}
|
|
537
|
+
if (!TAG_PATTERN.test(entry)) return new Error(`${entryLocation} must match /^[a-z0-9][a-z0-9._-]*$/`);
|
|
538
|
+
if (seen.has(entry)) return new Error(`${location} contains duplicate tag '${entry}'`);
|
|
539
|
+
seen.add(entry);
|
|
540
|
+
tags.push(entry);
|
|
541
|
+
}
|
|
542
|
+
return tags;
|
|
543
|
+
}
|
|
544
|
+
function sourcePathInsideWorkspace(catalogPath, workspaceRoot) {
|
|
545
|
+
try {
|
|
546
|
+
const realRoot = realpathSync(workspaceRoot);
|
|
547
|
+
const realCatalogPath = realpathSync(catalogPath);
|
|
548
|
+
resolveSafeCwd(realCatalogPath, realRoot);
|
|
549
|
+
return realCatalogPath;
|
|
550
|
+
} catch (error) {
|
|
551
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
552
|
+
return new Error(`catalog file must resolve inside the workspace root (${message})`);
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
function loadProjectVerifierCatalog(workspaceRoot) {
|
|
556
|
+
const catalogPath = path.join(workspaceRoot, PROJECT_VERIFIER_CATALOG_RELATIVE_PATH);
|
|
557
|
+
if (!existsSync(catalogPath)) return { ok: true, source: null };
|
|
558
|
+
const safeSourcePath = sourcePathInsideWorkspace(catalogPath, workspaceRoot);
|
|
559
|
+
if (safeSourcePath instanceof Error) return catalogDiagnostic(safeSourcePath.message);
|
|
560
|
+
let text;
|
|
561
|
+
try {
|
|
562
|
+
const stats = statSync(safeSourcePath);
|
|
563
|
+
if (!stats.isFile()) return catalogDiagnostic("catalog path must be a regular file");
|
|
564
|
+
if (stats.size > PROJECT_VERIFIER_CATALOG_CAPS.fileBytes) {
|
|
565
|
+
return catalogDiagnostic(`file exceeds the ${PROJECT_VERIFIER_CATALOG_CAPS.fileBytes}-byte cap`);
|
|
566
|
+
}
|
|
567
|
+
text = readFileSync(safeSourcePath, "utf8");
|
|
568
|
+
} catch (error) {
|
|
569
|
+
return catalogDiagnostic(`cannot read catalog (${error instanceof Error ? error.message : String(error)})`);
|
|
570
|
+
}
|
|
571
|
+
return parseProjectVerifierCatalogText(text, workspaceRoot, catalogPath);
|
|
572
|
+
}
|
|
573
|
+
function parseProjectVerifierCatalogText(text, workspaceRoot, catalogPath = path.join(workspaceRoot, PROJECT_VERIFIER_CATALOG_RELATIVE_PATH)) {
|
|
574
|
+
const document = (0, import_yaml.parseDocument)(text, { prettyErrors: false, strict: true, uniqueKeys: true });
|
|
575
|
+
if (document.errors.length > 0) {
|
|
576
|
+
return catalogDiagnostic(`invalid YAML: ${document.errors.map((error) => error.message).join("; ")}`);
|
|
577
|
+
}
|
|
578
|
+
let parsed;
|
|
579
|
+
try {
|
|
580
|
+
parsed = document.toJS({ maxAliasCount: 0 });
|
|
581
|
+
} catch (error) {
|
|
582
|
+
return catalogDiagnostic(`invalid YAML: ${error instanceof Error ? error.message : String(error)}`);
|
|
583
|
+
}
|
|
584
|
+
if (!isRecord(parsed)) return catalogDiagnostic("root must be an object with version and checks fields");
|
|
585
|
+
const rootUnknown = unknownFields(parsed, ROOT_FIELDS);
|
|
586
|
+
if (rootUnknown.length > 0) return catalogDiagnostic(`root has unknown field(s): ${rootUnknown.join(", ")}`);
|
|
587
|
+
if (!Object.hasOwn(parsed, "version")) return catalogDiagnostic("root.version is required");
|
|
588
|
+
if (typeof parsed.version !== "number" || !SUPPORTED_CATALOG_VERSIONS.includes(parsed.version)) {
|
|
589
|
+
return catalogDiagnostic(
|
|
590
|
+
`unsupported version ${JSON.stringify(parsed.version)}; supported versions are ${SUPPORTED_CATALOG_VERSIONS.join(" and ")}`
|
|
591
|
+
);
|
|
592
|
+
}
|
|
593
|
+
const version = parsed.version;
|
|
594
|
+
if (!Object.hasOwn(parsed, "checks")) return catalogDiagnostic("root.checks is required");
|
|
595
|
+
if (!Array.isArray(parsed.checks)) return catalogDiagnostic("root.checks must be an array");
|
|
596
|
+
if (parsed.checks.length > PROJECT_VERIFIER_CATALOG_CAPS.checks) {
|
|
597
|
+
return catalogDiagnostic(`root.checks exceeds the ${PROJECT_VERIFIER_CATALOG_CAPS.checks}-check cap`);
|
|
598
|
+
}
|
|
599
|
+
const sourceRef = { kind: "project-catalog", path: catalogPath };
|
|
600
|
+
const checks = [];
|
|
601
|
+
const ids = /* @__PURE__ */ new Map();
|
|
602
|
+
for (const [index, value] of parsed.checks.entries()) {
|
|
603
|
+
const location = `checks[${index}]`;
|
|
604
|
+
if (!isRecord(value)) return catalogDiagnostic(`${location} must be an object`);
|
|
605
|
+
const checkUnknown = unknownFields(value, version === 1 ? CHECK_FIELDS : CHECK_FIELDS_V2);
|
|
606
|
+
if (checkUnknown.length > 0) {
|
|
607
|
+
return catalogDiagnostic(`${location} has unknown field(s): ${checkUnknown.join(", ")}`);
|
|
608
|
+
}
|
|
609
|
+
for (const field of CHECK_FIELDS) {
|
|
610
|
+
if (!Object.hasOwn(value, field)) return catalogDiagnostic(`${location}.${field} is required`);
|
|
611
|
+
}
|
|
612
|
+
const id = validateId(value.id, `${location}.id`);
|
|
613
|
+
if (id instanceof Error) return catalogDiagnostic(id.message);
|
|
614
|
+
const duplicateIndex = ids.get(id);
|
|
615
|
+
if (duplicateIndex !== void 0) {
|
|
616
|
+
return catalogDiagnostic(`${location}.id duplicates '${id}' from checks[${duplicateIndex}].id`);
|
|
617
|
+
}
|
|
618
|
+
const description = validateDescription(value.description, `${location}.description`);
|
|
619
|
+
if (description instanceof Error) return catalogDiagnostic(description.message);
|
|
620
|
+
const command = validateCommand(value.command, `${location}.command`);
|
|
621
|
+
if (command instanceof Error) return catalogDiagnostic(command.message);
|
|
622
|
+
if (typeof value.cwd !== "string" || value.cwd.length === 0) {
|
|
623
|
+
return catalogDiagnostic(`${location}.cwd must be a non-empty repository-relative string`);
|
|
624
|
+
}
|
|
625
|
+
if (value.cwd.includes("\0")) return catalogDiagnostic(`${location}.cwd must not contain a NUL byte`);
|
|
626
|
+
if (utf8Bytes(value.cwd) > PROJECT_VERIFIER_CATALOG_CAPS.cwdBytes) {
|
|
627
|
+
return catalogDiagnostic(`${location}.cwd exceeds the ${PROJECT_VERIFIER_CATALOG_CAPS.cwdBytes}-byte cap`);
|
|
628
|
+
}
|
|
629
|
+
const cwdResolution = safelyResolveCatalogCwd(value.cwd, workspaceRoot, `${location}.cwd`);
|
|
630
|
+
if (cwdResolution instanceof Error) return catalogDiagnostic(cwdResolution.message);
|
|
631
|
+
const cwd = cwdResolution.declared;
|
|
632
|
+
const timeoutMs = validateTimeout(value.timeoutMs, `${location}.timeoutMs`);
|
|
633
|
+
if (timeoutMs instanceof Error) return catalogDiagnostic(timeoutMs.message);
|
|
634
|
+
const tags = validateTags(value.tags, `${location}.tags`);
|
|
635
|
+
if (tags instanceof Error) return catalogDiagnostic(tags.message);
|
|
636
|
+
const kindFields = validateCheckKind(value, location, version);
|
|
637
|
+
if (kindFields instanceof Error) return catalogDiagnostic(kindFields.message);
|
|
638
|
+
ids.set(id, index);
|
|
639
|
+
checks.push({ id, description, command, cwd, timeoutMs, tags, source: { ...sourceRef }, ...kindFields });
|
|
640
|
+
}
|
|
641
|
+
checks.sort((left, right) => compareCodepoints(left.id, right.id));
|
|
642
|
+
return { ok: true, source: { ...sourceRef, checks } };
|
|
643
|
+
}
|
|
644
|
+
function packageDeclaredCheck(id, packagePath, cwd, tags) {
|
|
645
|
+
return {
|
|
646
|
+
id,
|
|
647
|
+
description: `Run package.json script '${id}'.`,
|
|
648
|
+
command: ["npm", "run", id],
|
|
649
|
+
cwd,
|
|
650
|
+
timeoutMs: SAFE_EXEC_DEFAULT_TIMEOUT_MS,
|
|
651
|
+
tags,
|
|
652
|
+
source: { kind: "package.json", path: packagePath },
|
|
653
|
+
kind: "command"
|
|
654
|
+
};
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
export {
|
|
658
|
+
normalizeNumericTolerance,
|
|
659
|
+
parseNumericPayload,
|
|
660
|
+
compareNumeric,
|
|
661
|
+
renderNumericReport,
|
|
662
|
+
parsePerfBaseline,
|
|
663
|
+
renderPerfBaseline,
|
|
664
|
+
evaluatePerfBudget,
|
|
665
|
+
PROJECT_VERIFIER_CATALOG_RELATIVE_PATH,
|
|
666
|
+
PROJECT_VERIFIER_CATALOG_VERSION,
|
|
667
|
+
PROJECT_VERIFIER_CATALOG_CAPS,
|
|
668
|
+
DECLARED_CHECK_KINDS,
|
|
669
|
+
resolveProjectVerifierExecutionCwd,
|
|
670
|
+
loadProjectVerifierCatalog,
|
|
671
|
+
parseProjectVerifierCatalogText,
|
|
672
|
+
packageDeclaredCheck
|
|
673
|
+
};
|
|
674
|
+
//# sourceMappingURL=chunk-MDU3C27C.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
init_esm_shims
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-ECBHH7LU.js";
|
|
5
5
|
|
|
6
6
|
// src/tools/truncate-utf8.ts
|
|
7
7
|
init_esm_shims();
|
|
@@ -24,4 +24,4 @@ export {
|
|
|
24
24
|
truncateUtf8,
|
|
25
25
|
byteLength
|
|
26
26
|
};
|
|
27
|
-
//# sourceMappingURL=chunk-
|
|
27
|
+
//# sourceMappingURL=chunk-MYI32N4R.js.map
|