@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
|
@@ -15,15 +15,20 @@ import { resolveSafeCwd, SAFE_EXEC_DEFAULT_TIMEOUT_MS } from "../../core/safe-ex
|
|
|
15
15
|
import { parseTomlDocument, tomlTableAt } from "../../core/toml.js";
|
|
16
16
|
import { isVerificationScriptName } from "../../core/verification-scripts.js";
|
|
17
17
|
import { compareCodepoints } from "../../domains/evidence/ordering.js";
|
|
18
|
+
import { loadValidationContract, VALIDATION_CONTRACT_MARKDOWN_PATH } from "../../domains/safety/validation-contract.js";
|
|
18
19
|
import type { ToolResult } from "../registry.js";
|
|
19
20
|
import {
|
|
20
21
|
type DeclaredCheck,
|
|
22
|
+
type DeclaredCheckKind,
|
|
23
|
+
type DeclaredNumericCompare,
|
|
24
|
+
type DeclaredPerfBudget,
|
|
21
25
|
PROJECT_VERIFIER_CATALOG_CAPS,
|
|
22
26
|
PROJECT_VERIFIER_CATALOG_RELATIVE_PATH,
|
|
23
27
|
PROJECT_VERIFIER_CATALOG_VERSION,
|
|
24
28
|
parseProjectVerifierCatalogText,
|
|
25
29
|
} from "./catalog.js";
|
|
26
30
|
import { verifyTool } from "./index.js";
|
|
31
|
+
import { type NumericTolerance, normalizeNumericTolerance } from "./numeric.js";
|
|
27
32
|
import { discoverDeclaredChecksAtRoot, discoverDeclaredProjectEntriesAtRoot } from "./scripts.js";
|
|
28
33
|
|
|
29
34
|
export type VerifierProposalAuthority = "project-declared" | "toolchain-defined";
|
|
@@ -54,12 +59,31 @@ export interface AuthoringCheck {
|
|
|
54
59
|
cwd: string;
|
|
55
60
|
timeoutMs: number;
|
|
56
61
|
tags: string[];
|
|
62
|
+
/** Absent means `command`. Written to the catalog only when it is not the default. */
|
|
63
|
+
kind?: DeclaredCheckKind;
|
|
64
|
+
numeric?: DeclaredNumericCompare;
|
|
65
|
+
perf?: DeclaredPerfBudget;
|
|
57
66
|
provenance: VerifierProvenance;
|
|
58
67
|
state: "active" | "existing" | "proposed" | "manual";
|
|
59
68
|
/** The id this check has in the on-disk catalog, so a rename still edits its node in place. */
|
|
60
69
|
catalogId?: string;
|
|
61
70
|
}
|
|
62
71
|
|
|
72
|
+
/**
|
|
73
|
+
* A numeric-compare check the validation contract implies but cannot make
|
|
74
|
+
* executable: the artifact declared tolerances, so the reference and the
|
|
75
|
+
* tolerance are known, and the command is the operator's to supply. It never
|
|
76
|
+
* enters the draft, so nothing about it runs until an explicit `add`.
|
|
77
|
+
*/
|
|
78
|
+
export interface NumericProposal {
|
|
79
|
+
id: string;
|
|
80
|
+
artifactPath: string;
|
|
81
|
+
reference: string;
|
|
82
|
+
tolerance: NumericTolerance;
|
|
83
|
+
/** The exact `clio-coder verifiers add` invocation with `--command` left to fill. */
|
|
84
|
+
addCommand: string;
|
|
85
|
+
}
|
|
86
|
+
|
|
63
87
|
export interface VerifierAuthoringDiscovery {
|
|
64
88
|
ok: true;
|
|
65
89
|
workspaceRoot: string;
|
|
@@ -67,6 +91,8 @@ export interface VerifierAuthoringDiscovery {
|
|
|
67
91
|
activeChecks: AuthoringCheck[];
|
|
68
92
|
existingChecks: AuthoringCheck[];
|
|
69
93
|
proposals: AuthoringCheck[];
|
|
94
|
+
/** Tolerance-bearing contract artifacts, each rendered as an incomplete numeric-compare check. */
|
|
95
|
+
numericProposals: NumericProposal[];
|
|
70
96
|
diagnostics: string[];
|
|
71
97
|
manualEntry: string;
|
|
72
98
|
/** The catalog file as found, when one exists; revisions are written into it in place. */
|
|
@@ -86,6 +112,8 @@ export interface VerifierDraft {
|
|
|
86
112
|
catalogPath: string;
|
|
87
113
|
activeChecks: AuthoringCheck[];
|
|
88
114
|
checks: AuthoringCheck[];
|
|
115
|
+
/** Rendered in the preview beneath the executable checks; never serialized. */
|
|
116
|
+
numericProposals: NumericProposal[];
|
|
89
117
|
diagnostics: string[];
|
|
90
118
|
manualEntry: string;
|
|
91
119
|
catalogText?: string;
|
|
@@ -96,7 +124,9 @@ export type VerifierRevision =
|
|
|
96
124
|
| {
|
|
97
125
|
kind: "edit";
|
|
98
126
|
id: string;
|
|
99
|
-
changes: Partial<
|
|
127
|
+
changes: Partial<
|
|
128
|
+
Pick<AuthoringCheck, "description" | "command" | "cwd" | "timeoutMs" | "tags" | "kind" | "numeric" | "perf">
|
|
129
|
+
>;
|
|
100
130
|
}
|
|
101
131
|
| { kind: "rename"; id: string; newId: string }
|
|
102
132
|
| { kind: "remove"; id: string };
|
|
@@ -168,12 +198,6 @@ interface RawProposal {
|
|
|
168
198
|
}
|
|
169
199
|
|
|
170
200
|
const DECLARED_FILE_CAP_BYTES = 1024 * 1024;
|
|
171
|
-
const VALIDATION_CONTRACT_PATHS = [
|
|
172
|
-
".clio-coder/validation.yaml",
|
|
173
|
-
".clio-coder/validation.yml",
|
|
174
|
-
"validation.yaml",
|
|
175
|
-
"validation.yml",
|
|
176
|
-
] as const;
|
|
177
201
|
|
|
178
202
|
function manualEntryInstruction(): string {
|
|
179
203
|
return (
|
|
@@ -187,10 +211,25 @@ function cloneCheck(check: AuthoringCheck): AuthoringCheck {
|
|
|
187
211
|
...check,
|
|
188
212
|
command: [...check.command],
|
|
189
213
|
tags: [...check.tags],
|
|
214
|
+
...(check.numeric !== undefined ? { numeric: structuredClone(check.numeric) } : {}),
|
|
215
|
+
...(check.perf !== undefined ? { perf: structuredClone(check.perf) } : {}),
|
|
190
216
|
provenance: { ...check.provenance },
|
|
191
217
|
};
|
|
192
218
|
}
|
|
193
219
|
|
|
220
|
+
/** The kind fields of a declared or authored check, absent for a plain command check. */
|
|
221
|
+
function kindFields(
|
|
222
|
+
check: Pick<DeclaredCheck, "kind" | "numeric" | "perf"> | Pick<AuthoringCheck, "kind" | "numeric" | "perf">,
|
|
223
|
+
): Pick<AuthoringCheck, "kind" | "numeric" | "perf"> {
|
|
224
|
+
const kind = check.kind ?? "command";
|
|
225
|
+
if (kind === "command") return {};
|
|
226
|
+
return {
|
|
227
|
+
kind,
|
|
228
|
+
...(check.numeric !== undefined ? { numeric: structuredClone(check.numeric) } : {}),
|
|
229
|
+
...(check.perf !== undefined ? { perf: structuredClone(check.perf) } : {}),
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
|
|
194
233
|
function relativePath(workspaceRoot: string, filePath: string): string {
|
|
195
234
|
const relative = path.relative(workspaceRoot, filePath);
|
|
196
235
|
return relative.length === 0 ? "." : relative.split(path.sep).join("/");
|
|
@@ -283,6 +322,7 @@ function projectedCheck(workspaceRoot: string, check: DeclaredCheck): AuthoringC
|
|
|
283
322
|
cwd: check.cwd,
|
|
284
323
|
timeoutMs: check.timeoutMs,
|
|
285
324
|
tags: [...check.tags],
|
|
325
|
+
...kindFields(check),
|
|
286
326
|
provenance: sourceProvenance(workspaceRoot, check),
|
|
287
327
|
state: check.source.kind === "package.json" ? "active" : "existing",
|
|
288
328
|
...(check.source.kind === "package.json" ? {} : { catalogId: check.id }),
|
|
@@ -626,18 +666,6 @@ function shellLikeArgv(command: string): string[] | Error {
|
|
|
626
666
|
return argv;
|
|
627
667
|
}
|
|
628
668
|
|
|
629
|
-
function validatorArgv(value: unknown): string[] | Error {
|
|
630
|
-
if (typeof value === "string") return shellLikeArgv(value);
|
|
631
|
-
if (
|
|
632
|
-
!Array.isArray(value) ||
|
|
633
|
-
value.length === 0 ||
|
|
634
|
-
value.some((entry) => typeof entry !== "string" || entry.length === 0)
|
|
635
|
-
) {
|
|
636
|
-
return new Error("validator must be a command string or a non-empty argv string array");
|
|
637
|
-
}
|
|
638
|
-
return [...(value as string[])];
|
|
639
|
-
}
|
|
640
|
-
|
|
641
669
|
function validationPreferredId(argv: ReadonlyArray<string>): string {
|
|
642
670
|
const executable = path.basename(argv[0] ?? "check").replace(/\.[^.]+$/u, "");
|
|
643
671
|
const script = argv.find((entry, index) => index > 0 && /\.(?:py|js|mjs|sh)$/u.test(entry));
|
|
@@ -647,87 +675,76 @@ function validationPreferredId(argv: ReadonlyArray<string>): string {
|
|
|
647
675
|
|
|
648
676
|
function validationContractProposals(workspaceRoot: string, diagnostics: string[]): RawProposal[] {
|
|
649
677
|
const proposals: RawProposal[] = [];
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
}
|
|
657
|
-
const document = parseDocument(text, { prettyErrors: false, strict: true, uniqueKeys: true });
|
|
658
|
-
if (document.errors.length > 0) {
|
|
659
|
-
diagnostics.push(`${relative}: invalid YAML; validation command discovery skipped.`);
|
|
660
|
-
continue;
|
|
661
|
-
}
|
|
662
|
-
let parsed: unknown;
|
|
663
|
-
try {
|
|
664
|
-
parsed = document.toJS({ maxAliasCount: 0 }) as unknown;
|
|
665
|
-
} catch (error) {
|
|
666
|
-
diagnostics.push(`${relative}: invalid YAML (${error instanceof Error ? error.message : String(error)}).`);
|
|
667
|
-
continue;
|
|
668
|
-
}
|
|
669
|
-
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) continue;
|
|
670
|
-
const validators = (parsed as Record<string, unknown>).validators;
|
|
671
|
-
if (!Array.isArray(validators)) continue;
|
|
672
|
-
for (const [index, validator] of validators.entries()) {
|
|
673
|
-
const record =
|
|
674
|
-
validator !== null && typeof validator === "object" && !Array.isArray(validator)
|
|
675
|
-
? (validator as Record<string, unknown>)
|
|
676
|
-
: null;
|
|
677
|
-
if (record !== null) {
|
|
678
|
-
const typedFields: ReadonlyArray<readonly [string, (value: unknown) => boolean]> = [
|
|
679
|
-
["id", (value: unknown) => typeof value === "string"],
|
|
680
|
-
["description", (value: unknown) => typeof value === "string"],
|
|
681
|
-
["cwd", (value: unknown) => typeof value === "string"],
|
|
682
|
-
["timeoutMs", (value: unknown) => typeof value === "number"],
|
|
683
|
-
["tags", (value: unknown) => Array.isArray(value) && value.every((tag) => typeof tag === "string")],
|
|
684
|
-
];
|
|
685
|
-
const invalidField = typedFields.find(([field, valid]) => Object.hasOwn(record, field) && !valid(record[field]));
|
|
686
|
-
if (invalidField !== undefined) {
|
|
687
|
-
diagnostics.push(
|
|
688
|
-
`${relative}: validators[${index}].${String(invalidField[0])} has an ambiguous type; use manual argv entry.`,
|
|
689
|
-
);
|
|
690
|
-
continue;
|
|
691
|
-
}
|
|
692
|
-
}
|
|
693
|
-
const commandValue = record === null ? validator : record.command;
|
|
694
|
-
const argv = validatorArgv(commandValue);
|
|
678
|
+
const loaded = loadValidationContract(workspaceRoot);
|
|
679
|
+
if (!loaded.ok) {
|
|
680
|
+
diagnostics.push(`${loaded.path}: ${loaded.reason}; validation command discovery skipped.`);
|
|
681
|
+
} else if (loaded.contract !== null) {
|
|
682
|
+
for (const [index, validator] of (loaded.contract.validators ?? []).entries()) {
|
|
683
|
+
const argv = shellLikeArgv(validator);
|
|
695
684
|
if (argv instanceof Error) {
|
|
696
|
-
diagnostics.push(`${
|
|
685
|
+
diagnostics.push(`${loaded.path}: validators[${index}] is ambiguous (${argv.message}); use manual argv entry.`);
|
|
697
686
|
continue;
|
|
698
687
|
}
|
|
699
|
-
const declaredId = typeof record?.id === "string" ? record.id : validationPreferredId(argv);
|
|
700
|
-
const description =
|
|
701
|
-
typeof record?.description === "string"
|
|
702
|
-
? record.description
|
|
703
|
-
: `Run validation contract command ${JSON.stringify(argv)}`;
|
|
704
|
-
const cwd = typeof record?.cwd === "string" ? record.cwd : ".";
|
|
705
|
-
const timeoutMs = typeof record?.timeoutMs === "number" ? record.timeoutMs : SAFE_EXEC_DEFAULT_TIMEOUT_MS;
|
|
706
|
-
const tags = Array.isArray(record?.tags) ? record.tags.filter((tag): tag is string => typeof tag === "string") : [];
|
|
707
688
|
proposals.push({
|
|
708
|
-
preferredId:
|
|
709
|
-
description
|
|
689
|
+
preferredId: validationPreferredId(argv),
|
|
690
|
+
description: `Run validation contract command ${JSON.stringify(argv)}`,
|
|
710
691
|
command: argv,
|
|
711
|
-
cwd,
|
|
712
|
-
timeoutMs,
|
|
713
|
-
tags:
|
|
692
|
+
cwd: ".",
|
|
693
|
+
timeoutMs: SAFE_EXEC_DEFAULT_TIMEOUT_MS,
|
|
694
|
+
tags: ["scientific", "validation"],
|
|
714
695
|
provenance: {
|
|
715
696
|
kind: "validation-contract",
|
|
716
|
-
path:
|
|
697
|
+
path: loaded.path,
|
|
717
698
|
detail: `validators[${index}]`,
|
|
718
699
|
authority: "project-declared",
|
|
719
700
|
},
|
|
720
701
|
});
|
|
721
702
|
}
|
|
722
703
|
}
|
|
723
|
-
if (existsSync(path.join(workspaceRoot,
|
|
704
|
+
if (existsSync(path.join(workspaceRoot, VALIDATION_CONTRACT_MARKDOWN_PATH))) {
|
|
724
705
|
diagnostics.push(
|
|
725
|
-
|
|
706
|
+
`${VALIDATION_CONTRACT_MARKDOWN_PATH} is advisory prose; enter an exact argv vector manually instead of inferring a command.`,
|
|
726
707
|
);
|
|
727
708
|
}
|
|
728
709
|
return proposals;
|
|
729
710
|
}
|
|
730
711
|
|
|
712
|
+
/**
|
|
713
|
+
* One incomplete numeric-compare check per contract artifact that declares
|
|
714
|
+
* `numerical_tolerances`. The reference path is the artifact's path with a
|
|
715
|
+
* `.reference.json` suffix, a suggestion the operator may change; the
|
|
716
|
+
* command is deliberately absent, so the proposal cannot become executable
|
|
717
|
+
* until the operator confirms an exact argv through `verifiers add`.
|
|
718
|
+
*/
|
|
719
|
+
function numericContractProposals(workspaceRoot: string): NumericProposal[] {
|
|
720
|
+
const loaded = loadValidationContract(workspaceRoot);
|
|
721
|
+
if (!loaded.ok || loaded.contract === null) return [];
|
|
722
|
+
const proposals: NumericProposal[] = [];
|
|
723
|
+
const seen = new Set<string>();
|
|
724
|
+
for (const artifact of loaded.contract.artifacts ?? []) {
|
|
725
|
+
if (artifact.numerical_tolerances === undefined) continue;
|
|
726
|
+
const tolerance = normalizeNumericTolerance(artifact.numerical_tolerances);
|
|
727
|
+
if (tolerance instanceof Error) continue;
|
|
728
|
+
const base = slug(path.basename(artifact.path).replace(/\.[^.]+$/u, ""), "artifact");
|
|
729
|
+
const preferred = boundedId(`numeric-${base}`);
|
|
730
|
+
let id = preferred;
|
|
731
|
+
for (let suffix = 2; seen.has(id); suffix += 1) id = `${boundedId(preferred, `-${suffix}`)}-${suffix}`;
|
|
732
|
+
seen.add(id);
|
|
733
|
+
const reference = `${artifact.path}.reference.json`;
|
|
734
|
+
proposals.push({
|
|
735
|
+
id,
|
|
736
|
+
artifactPath: artifact.path,
|
|
737
|
+
reference,
|
|
738
|
+
tolerance,
|
|
739
|
+
addCommand:
|
|
740
|
+
`clio-coder verifiers add --id ${id} --kind numeric-compare --reference ${JSON.stringify(reference)} ` +
|
|
741
|
+
`--tolerance '${JSON.stringify(tolerance)}' --description ${JSON.stringify(`Compare ${artifact.path} against its reference within tolerance`)} ` +
|
|
742
|
+
`--command '["<executable>","<arg>"]'`,
|
|
743
|
+
});
|
|
744
|
+
}
|
|
745
|
+
return proposals;
|
|
746
|
+
}
|
|
747
|
+
|
|
731
748
|
function deduplicatedRawProposals(proposals: RawProposal[], diagnostics: string[]): RawProposal[] {
|
|
732
749
|
const seen = new Map<string, RawProposal>();
|
|
733
750
|
for (const proposal of proposals.sort(rawProposalSort)) {
|
|
@@ -825,6 +842,7 @@ export function discoverVerifierAuthoring(workspaceRoot = process.cwd()): Verifi
|
|
|
825
842
|
activeChecks,
|
|
826
843
|
existingChecks,
|
|
827
844
|
proposals,
|
|
845
|
+
numericProposals: numericContractProposals(workspaceRoot),
|
|
828
846
|
diagnostics,
|
|
829
847
|
manualEntry,
|
|
830
848
|
...(typeof catalogText === "string" ? { catalogText } : {}),
|
|
@@ -842,14 +860,30 @@ export function createVerifierDraft(
|
|
|
842
860
|
checks: [...discovery.existingChecks, ...(options.includeProposals === false ? [] : discovery.proposals)]
|
|
843
861
|
.map(cloneCheck)
|
|
844
862
|
.sort((left, right) => compareCodepoints(left.id, right.id)),
|
|
863
|
+
numericProposals:
|
|
864
|
+
options.includeProposals === false ? [] : discovery.numericProposals.map((proposal) => ({ ...proposal })),
|
|
845
865
|
diagnostics: [...discovery.diagnostics],
|
|
846
866
|
manualEntry: discovery.manualEntry,
|
|
847
867
|
...(discovery.catalogText === undefined ? {} : { catalogText: discovery.catalogText }),
|
|
848
868
|
};
|
|
849
869
|
}
|
|
850
870
|
|
|
851
|
-
function catalogEntry(
|
|
852
|
-
|
|
871
|
+
function catalogEntry(check: AuthoringCheck): Record<string, unknown> {
|
|
872
|
+
const { id, description, command, cwd, timeoutMs, tags } = check;
|
|
873
|
+
const entry: Record<string, unknown> = { id, description, command: [...command], cwd, timeoutMs, tags: [...tags] };
|
|
874
|
+
const kind = check.kind ?? "command";
|
|
875
|
+
if (kind === "command") return entry;
|
|
876
|
+
entry.kind = kind;
|
|
877
|
+
if (check.numeric !== undefined) {
|
|
878
|
+
entry.reference = check.numeric.reference;
|
|
879
|
+
entry.tolerance = { ...check.numeric.tolerance };
|
|
880
|
+
}
|
|
881
|
+
if (check.perf !== undefined) {
|
|
882
|
+
if (check.perf.budget !== undefined) entry.budget = structuredClone(check.perf.budget);
|
|
883
|
+
if (check.perf.baseline !== undefined) entry.baseline = check.perf.baseline;
|
|
884
|
+
if (check.perf.tolerance !== undefined) entry.tolerance = { ...check.perf.tolerance };
|
|
885
|
+
}
|
|
886
|
+
return entry;
|
|
853
887
|
}
|
|
854
888
|
|
|
855
889
|
/**
|
|
@@ -885,8 +919,20 @@ function serializeVerifierDraft(draft: VerifierDraft): string {
|
|
|
885
919
|
node.set(field, value);
|
|
886
920
|
changed = true;
|
|
887
921
|
}
|
|
922
|
+
// A check that returned to a plain command drops the kind fields it no longer carries.
|
|
923
|
+
for (const field of ["kind", "reference", "tolerance", "budget", "baseline"]) {
|
|
924
|
+
if (Object.hasOwn(current, field) && !Object.hasOwn(entry, field)) {
|
|
925
|
+
node.delete(field);
|
|
926
|
+
changed = true;
|
|
927
|
+
}
|
|
928
|
+
}
|
|
888
929
|
}
|
|
889
930
|
if (!changed && appended.length === 0 && kept.size === sequence.items.length) return draft.catalogText as string;
|
|
931
|
+
// The edited file speaks this build's schema version: a version-1 file that
|
|
932
|
+
// gains a judged check would otherwise be rejected by its own version line.
|
|
933
|
+
if (document.get("version") !== PROJECT_VERIFIER_CATALOG_VERSION) {
|
|
934
|
+
document.set("version", PROJECT_VERIFIER_CATALOG_VERSION);
|
|
935
|
+
}
|
|
890
936
|
sequence.items = [...sequence.items.filter((node) => isMap(node) && kept.has(node)), ...appended];
|
|
891
937
|
return document.toString({ lineWidth: 0 });
|
|
892
938
|
}
|
|
@@ -919,6 +965,7 @@ function validateVerifierDraft(draft: VerifierDraft): VerifierDraftValidation {
|
|
|
919
965
|
cwd: check.cwd,
|
|
920
966
|
timeoutMs: check.timeoutMs,
|
|
921
967
|
tags: [...check.tags],
|
|
968
|
+
...kindFields(check),
|
|
922
969
|
provenance:
|
|
923
970
|
original?.provenance ??
|
|
924
971
|
({
|
|
@@ -939,6 +986,7 @@ function cloneDraft(draft: VerifierDraft): VerifierDraft {
|
|
|
939
986
|
...draft,
|
|
940
987
|
activeChecks: draft.activeChecks.map(cloneCheck),
|
|
941
988
|
checks: draft.checks.map(cloneCheck),
|
|
989
|
+
numericProposals: draft.numericProposals.map((proposal) => ({ ...proposal })),
|
|
942
990
|
diagnostics: [...draft.diagnostics],
|
|
943
991
|
};
|
|
944
992
|
}
|
|
@@ -1005,6 +1053,17 @@ function reviseVerifierDraft(draft: VerifierDraft, revisions: ReadonlyArray<Veri
|
|
|
1005
1053
|
if (revision.changes.cwd !== undefined) check.cwd = revision.changes.cwd;
|
|
1006
1054
|
if (revision.changes.timeoutMs !== undefined) check.timeoutMs = revision.changes.timeoutMs;
|
|
1007
1055
|
if (revision.changes.tags !== undefined) check.tags = [...revision.changes.tags];
|
|
1056
|
+
if (revision.changes.kind !== undefined) {
|
|
1057
|
+
const next = kindFields({
|
|
1058
|
+
kind: revision.changes.kind,
|
|
1059
|
+
...(revision.changes.numeric !== undefined ? { numeric: revision.changes.numeric } : {}),
|
|
1060
|
+
...(revision.changes.perf !== undefined ? { perf: revision.changes.perf } : {}),
|
|
1061
|
+
});
|
|
1062
|
+
delete check.kind;
|
|
1063
|
+
delete check.numeric;
|
|
1064
|
+
delete check.perf;
|
|
1065
|
+
Object.assign(check, next);
|
|
1066
|
+
}
|
|
1008
1067
|
diagnostics.push(`Edited check '${revision.id}' without changing its deterministic ID.`);
|
|
1009
1068
|
}
|
|
1010
1069
|
next.checks.sort((left, right) => compareCodepoints(left.id, right.id));
|
|
@@ -1034,10 +1093,26 @@ function renderCheck(check: AuthoringCheck, destinationPath: string): string[] {
|
|
|
1034
1093
|
` cwd: ${check.cwd}`,
|
|
1035
1094
|
` timeoutMs: ${check.timeoutMs}`,
|
|
1036
1095
|
` tags: ${JSON.stringify(check.tags)}`,
|
|
1096
|
+
...renderKind(check),
|
|
1037
1097
|
` effective execution authority: ${authorityDescription(check)}`,
|
|
1038
1098
|
];
|
|
1039
1099
|
}
|
|
1040
1100
|
|
|
1101
|
+
function renderKind(check: AuthoringCheck): string[] {
|
|
1102
|
+
const kind = check.kind ?? "command";
|
|
1103
|
+
if (kind === "command") return [];
|
|
1104
|
+
const lines = [` kind: ${kind}`];
|
|
1105
|
+
if (check.numeric !== undefined) {
|
|
1106
|
+
lines.push(` reference: ${check.numeric.reference}`, ` tolerance: ${JSON.stringify(check.numeric.tolerance)}`);
|
|
1107
|
+
}
|
|
1108
|
+
if (check.perf !== undefined) {
|
|
1109
|
+
if (check.perf.budget !== undefined) lines.push(` budget: ${JSON.stringify(check.perf.budget)}`);
|
|
1110
|
+
if (check.perf.baseline !== undefined) lines.push(` baseline: ${check.perf.baseline}`);
|
|
1111
|
+
if (check.perf.tolerance !== undefined) lines.push(` tolerance: ${JSON.stringify(check.perf.tolerance)}`);
|
|
1112
|
+
}
|
|
1113
|
+
return lines;
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1041
1116
|
export interface VerifierPreviewOptions {
|
|
1042
1117
|
/** Suppress the unconfirmed-preview footer once the write is authorized. */
|
|
1043
1118
|
confirmed?: boolean;
|
|
@@ -1058,6 +1133,18 @@ export function previewVerifierDraft(draft: VerifierDraft, options: VerifierPrev
|
|
|
1058
1133
|
lines.push("", "Catalog checks after confirmation:");
|
|
1059
1134
|
if (draft.checks.length === 0) lines.push("(none)");
|
|
1060
1135
|
else for (const check of draft.checks) lines.push(...renderCheck(check, draft.catalogPath));
|
|
1136
|
+
if (draft.numericProposals.length > 0) {
|
|
1137
|
+
lines.push("", "Numeric-compare checks the validation contract implies (command required before they can be added):");
|
|
1138
|
+
for (const proposal of draft.numericProposals) {
|
|
1139
|
+
lines.push(
|
|
1140
|
+
`- ${proposal.id}`,
|
|
1141
|
+
` artifact: ${proposal.artifactPath}`,
|
|
1142
|
+
` reference: ${proposal.reference}`,
|
|
1143
|
+
` tolerance: ${JSON.stringify(proposal.tolerance)}`,
|
|
1144
|
+
` add with: ${proposal.addCommand}`,
|
|
1145
|
+
);
|
|
1146
|
+
}
|
|
1147
|
+
}
|
|
1061
1148
|
if (draft.diagnostics.length > 0) {
|
|
1062
1149
|
lines.push("", "Diagnostics:");
|
|
1063
1150
|
for (const diagnostic of draft.diagnostics) lines.push(`- ${diagnostic}`);
|
|
@@ -4,9 +4,13 @@ import { parseDocument } from "yaml";
|
|
|
4
4
|
import { resolveSafeCwd, SAFE_EXEC_DEFAULT_TIMEOUT_MS } from "../../core/safe-exec.js";
|
|
5
5
|
import { isProjectVerifierCheckId } from "../../core/verification-scripts.js";
|
|
6
6
|
import { compareCodepoints } from "../../domains/evidence/ordering.js";
|
|
7
|
+
import { type NumericTolerance, normalizeNumericTolerance } from "./numeric.js";
|
|
8
|
+
import { normalizePerfBudget, normalizePerfTolerance, type PerfBudgetSpec } from "./perf.js";
|
|
7
9
|
|
|
8
10
|
export const PROJECT_VERIFIER_CATALOG_RELATIVE_PATH = ".clio-coder/verifiers.yaml";
|
|
9
|
-
|
|
11
|
+
/** The version this build writes. Version 1 files still load; every check there is `kind: command`. */
|
|
12
|
+
export const PROJECT_VERIFIER_CATALOG_VERSION = 2;
|
|
13
|
+
const SUPPORTED_CATALOG_VERSIONS: ReadonlyArray<number> = [1, PROJECT_VERIFIER_CATALOG_VERSION];
|
|
10
14
|
|
|
11
15
|
/** Public schema limits. Diagnostics cite these values instead of hiding policy. */
|
|
12
16
|
export const PROJECT_VERIFIER_CATALOG_CAPS = Object.freeze({
|
|
@@ -22,6 +26,31 @@ export const PROJECT_VERIFIER_CATALOG_CAPS = Object.freeze({
|
|
|
22
26
|
tagBytes: 32,
|
|
23
27
|
});
|
|
24
28
|
|
|
29
|
+
/**
|
|
30
|
+
* What a check proves. `command` reads the exit code. `numeric-compare` runs
|
|
31
|
+
* the command, parses its stdout as `string -> number | number[]`, and judges
|
|
32
|
+
* it against a reference file under a tolerance. `perf-budget` runs the
|
|
33
|
+
* command and judges its wall time against a budget or a recorded baseline.
|
|
34
|
+
*/
|
|
35
|
+
export type DeclaredCheckKind = "command" | "numeric-compare" | "perf-budget";
|
|
36
|
+
|
|
37
|
+
export const DECLARED_CHECK_KINDS: ReadonlyArray<DeclaredCheckKind> = ["command", "numeric-compare", "perf-budget"];
|
|
38
|
+
|
|
39
|
+
export interface DeclaredNumericCompare {
|
|
40
|
+
/** Repository-relative JSON file of the same shape as the command's stdout. */
|
|
41
|
+
reference: string;
|
|
42
|
+
tolerance: NumericTolerance;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface DeclaredPerfBudget {
|
|
46
|
+
/** Declared bound; exactly one of `budget` and `baseline` is present. */
|
|
47
|
+
budget?: PerfBudgetSpec;
|
|
48
|
+
/** Repository-relative JSON file written by `clio-coder verifiers baseline <id>`. */
|
|
49
|
+
baseline?: string;
|
|
50
|
+
/** Headroom over a recorded baseline; only with `baseline`. */
|
|
51
|
+
tolerance?: { relative?: number };
|
|
52
|
+
}
|
|
53
|
+
|
|
25
54
|
export type DeclaredCheckSourceKind = "package.json" | "project-catalog";
|
|
26
55
|
|
|
27
56
|
export interface DeclaredCheckSourceRef {
|
|
@@ -38,6 +67,9 @@ export interface DeclaredCheck {
|
|
|
38
67
|
timeoutMs: number;
|
|
39
68
|
tags: string[];
|
|
40
69
|
source: DeclaredCheckSourceRef;
|
|
70
|
+
kind: DeclaredCheckKind;
|
|
71
|
+
numeric?: DeclaredNumericCompare;
|
|
72
|
+
perf?: DeclaredPerfBudget;
|
|
41
73
|
}
|
|
42
74
|
|
|
43
75
|
export interface DeclaredCheckSource extends DeclaredCheckSourceRef {
|
|
@@ -48,6 +80,8 @@ export type ProjectCatalogLoadResult = { ok: true; source: DeclaredCheckSource |
|
|
|
48
80
|
|
|
49
81
|
const ROOT_FIELDS = new Set(["version", "checks"]);
|
|
50
82
|
const CHECK_FIELDS = new Set(["id", "description", "command", "cwd", "timeoutMs", "tags"]);
|
|
83
|
+
/** Version 2 adds the kind and its parameters; every one is optional and kind-gated. */
|
|
84
|
+
const CHECK_FIELDS_V2 = new Set([...CHECK_FIELDS, "kind", "reference", "tolerance", "budget", "baseline"]);
|
|
51
85
|
const TAG_PATTERN = /^[a-z0-9][a-z0-9._-]*$/;
|
|
52
86
|
const SHELL_EXECUTABLES = new Set([
|
|
53
87
|
"bash",
|
|
@@ -130,6 +164,85 @@ function safelyResolveCatalogCwd(
|
|
|
130
164
|
return { declared: relativeCwd(workspaceRoot, resolved), execution: realCwd };
|
|
131
165
|
}
|
|
132
166
|
|
|
167
|
+
/**
|
|
168
|
+
* A repository-relative file the check reads or writes at run time. It need
|
|
169
|
+
* not exist when the catalog loads (a baseline is written later), so only the
|
|
170
|
+
* shape is checked: relative, NUL-free, bounded, and unable to escape the root.
|
|
171
|
+
*/
|
|
172
|
+
function validateRepositoryFile(value: unknown, location: string): string | Error {
|
|
173
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
174
|
+
return new Error(`${location} must be a non-empty repository-relative path`);
|
|
175
|
+
}
|
|
176
|
+
if (value.includes("\0")) return new Error(`${location} must not contain a NUL byte`);
|
|
177
|
+
if (utf8Bytes(value) > PROJECT_VERIFIER_CATALOG_CAPS.cwdBytes) {
|
|
178
|
+
return new Error(`${location} exceeds the ${PROJECT_VERIFIER_CATALOG_CAPS.cwdBytes}-byte cap`);
|
|
179
|
+
}
|
|
180
|
+
if (path.isAbsolute(value) || path.win32.isAbsolute(value)) {
|
|
181
|
+
return new Error(`${location} must be repository-relative; absolute path '${value}' is not allowed`);
|
|
182
|
+
}
|
|
183
|
+
const normalized = path.posix.normalize(value.split(path.sep).join("/"));
|
|
184
|
+
if (normalized === ".." || normalized.startsWith("../")) {
|
|
185
|
+
return new Error(`${location} escapes the workspace root: '${value}'`);
|
|
186
|
+
}
|
|
187
|
+
return normalized;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* The kind-specific fields of one check. Version 1 admits no such field, so a
|
|
192
|
+
* version-1 check is always `command`. Under version 2 the kind gates which
|
|
193
|
+
* parameters may appear, and each kind requires its own.
|
|
194
|
+
*/
|
|
195
|
+
function validateCheckKind(
|
|
196
|
+
value: Record<string, unknown>,
|
|
197
|
+
location: string,
|
|
198
|
+
version: number,
|
|
199
|
+
): Pick<DeclaredCheck, "kind" | "numeric" | "perf"> | Error {
|
|
200
|
+
const kindValue = Object.hasOwn(value, "kind") ? value.kind : "command";
|
|
201
|
+
if (typeof kindValue !== "string" || !(DECLARED_CHECK_KINDS as ReadonlyArray<string>).includes(kindValue)) {
|
|
202
|
+
return new Error(`${location}.kind must be one of ${DECLARED_CHECK_KINDS.join(", ")}`);
|
|
203
|
+
}
|
|
204
|
+
const kind = kindValue as DeclaredCheckKind;
|
|
205
|
+
const present = (field: string): boolean => Object.hasOwn(value, field);
|
|
206
|
+
const accepted: Record<DeclaredCheckKind, ReadonlyArray<string>> = {
|
|
207
|
+
command: [],
|
|
208
|
+
"numeric-compare": ["reference", "tolerance"],
|
|
209
|
+
"perf-budget": ["budget", "baseline", "tolerance"],
|
|
210
|
+
};
|
|
211
|
+
const stray = ["reference", "tolerance", "budget", "baseline"].filter(
|
|
212
|
+
(field) => present(field) && !accepted[kind].includes(field),
|
|
213
|
+
);
|
|
214
|
+
if (stray.length > 0) return new Error(`${location} kind '${kind}' does not accept ${stray.join(", ")}`);
|
|
215
|
+
if (version === 1 && kind !== "command") return new Error(`${location}.kind requires catalog version 2`);
|
|
216
|
+
if (kind === "command") return { kind };
|
|
217
|
+
if (kind === "numeric-compare") {
|
|
218
|
+
if (!present("reference")) return new Error(`${location}.reference is required for kind numeric-compare`);
|
|
219
|
+
if (!present("tolerance")) return new Error(`${location}.tolerance is required for kind numeric-compare`);
|
|
220
|
+
const reference = validateRepositoryFile(value.reference, `${location}.reference`);
|
|
221
|
+
if (reference instanceof Error) return reference;
|
|
222
|
+
const tolerance = normalizeNumericTolerance(value.tolerance);
|
|
223
|
+
if (tolerance instanceof Error) return new Error(`${location}.${tolerance.message}`);
|
|
224
|
+
return { kind, numeric: { reference, tolerance } };
|
|
225
|
+
}
|
|
226
|
+
if (present("budget") === present("baseline")) {
|
|
227
|
+
return new Error(`${location} kind 'perf-budget' requires exactly one of budget or baseline`);
|
|
228
|
+
}
|
|
229
|
+
if (present("budget")) {
|
|
230
|
+
if (present("tolerance")) return new Error(`${location}.tolerance belongs inside budget when budget is given`);
|
|
231
|
+
const budget = normalizePerfBudget(value.budget);
|
|
232
|
+
if (budget instanceof Error) return new Error(`${location}.${budget.message}`);
|
|
233
|
+
return { kind, perf: { budget } };
|
|
234
|
+
}
|
|
235
|
+
const baseline = validateRepositoryFile(value.baseline, `${location}.baseline`);
|
|
236
|
+
if (baseline instanceof Error) return baseline;
|
|
237
|
+
const perf: DeclaredPerfBudget = { baseline };
|
|
238
|
+
if (present("tolerance")) {
|
|
239
|
+
const tolerance = normalizePerfTolerance(value.tolerance, `${location}.tolerance`);
|
|
240
|
+
if (tolerance instanceof Error) return tolerance;
|
|
241
|
+
perf.tolerance = tolerance;
|
|
242
|
+
}
|
|
243
|
+
return { kind, perf };
|
|
244
|
+
}
|
|
245
|
+
|
|
133
246
|
/** Revalidate a stored catalog cwd and return its canonical in-workspace execution path. */
|
|
134
247
|
export function resolveProjectVerifierExecutionCwd(rawCwd: string, workspaceRoot: string): string | Error {
|
|
135
248
|
const resolution = safelyResolveCatalogCwd(rawCwd, workspaceRoot, "project check cwd");
|
|
@@ -276,11 +389,12 @@ export function parseProjectVerifierCatalogText(
|
|
|
276
389
|
const rootUnknown = unknownFields(parsed, ROOT_FIELDS);
|
|
277
390
|
if (rootUnknown.length > 0) return catalogDiagnostic(`root has unknown field(s): ${rootUnknown.join(", ")}`);
|
|
278
391
|
if (!Object.hasOwn(parsed, "version")) return catalogDiagnostic("root.version is required");
|
|
279
|
-
if (parsed.version !==
|
|
392
|
+
if (typeof parsed.version !== "number" || !SUPPORTED_CATALOG_VERSIONS.includes(parsed.version)) {
|
|
280
393
|
return catalogDiagnostic(
|
|
281
|
-
`unsupported version ${JSON.stringify(parsed.version)}; supported
|
|
394
|
+
`unsupported version ${JSON.stringify(parsed.version)}; supported versions are ${SUPPORTED_CATALOG_VERSIONS.join(" and ")}`,
|
|
282
395
|
);
|
|
283
396
|
}
|
|
397
|
+
const version = parsed.version;
|
|
284
398
|
if (!Object.hasOwn(parsed, "checks")) return catalogDiagnostic("root.checks is required");
|
|
285
399
|
if (!Array.isArray(parsed.checks)) return catalogDiagnostic("root.checks must be an array");
|
|
286
400
|
if (parsed.checks.length > PROJECT_VERIFIER_CATALOG_CAPS.checks) {
|
|
@@ -293,7 +407,7 @@ export function parseProjectVerifierCatalogText(
|
|
|
293
407
|
for (const [index, value] of parsed.checks.entries()) {
|
|
294
408
|
const location = `checks[${index}]`;
|
|
295
409
|
if (!isRecord(value)) return catalogDiagnostic(`${location} must be an object`);
|
|
296
|
-
const checkUnknown = unknownFields(value, CHECK_FIELDS);
|
|
410
|
+
const checkUnknown = unknownFields(value, version === 1 ? CHECK_FIELDS : CHECK_FIELDS_V2);
|
|
297
411
|
if (checkUnknown.length > 0) {
|
|
298
412
|
return catalogDiagnostic(`${location} has unknown field(s): ${checkUnknown.join(", ")}`);
|
|
299
413
|
}
|
|
@@ -325,9 +439,11 @@ export function parseProjectVerifierCatalogText(
|
|
|
325
439
|
if (timeoutMs instanceof Error) return catalogDiagnostic(timeoutMs.message);
|
|
326
440
|
const tags = validateTags(value.tags, `${location}.tags`);
|
|
327
441
|
if (tags instanceof Error) return catalogDiagnostic(tags.message);
|
|
442
|
+
const kindFields = validateCheckKind(value, location, version);
|
|
443
|
+
if (kindFields instanceof Error) return catalogDiagnostic(kindFields.message);
|
|
328
444
|
|
|
329
445
|
ids.set(id, index);
|
|
330
|
-
checks.push({ id, description, command, cwd, timeoutMs, tags, source: { ...sourceRef } });
|
|
446
|
+
checks.push({ id, description, command, cwd, timeoutMs, tags, source: { ...sourceRef }, ...kindFields });
|
|
331
447
|
}
|
|
332
448
|
checks.sort((left, right) => compareCodepoints(left.id, right.id));
|
|
333
449
|
return { ok: true, source: { ...sourceRef, checks } };
|
|
@@ -342,5 +458,6 @@ export function packageDeclaredCheck(id: string, packagePath: string, cwd: strin
|
|
|
342
458
|
timeoutMs: SAFE_EXEC_DEFAULT_TIMEOUT_MS,
|
|
343
459
|
tags,
|
|
344
460
|
source: { kind: "package.json", path: packagePath },
|
|
461
|
+
kind: "command",
|
|
345
462
|
};
|
|
346
463
|
}
|