@iowarp/clio-coder 0.4.4 → 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 +92 -2
- package/CONTRIBUTING.md +25 -15
- package/README.md +340 -27
- package/dist/{acp-WNAYYF4F.js → acp-H3CU2HBQ.js} +25 -24
- package/dist/{agents-3OKXHLOI.js → agents-IXQQZ7BD.js} +77 -77
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-VKNNMGPU.js → auth-R7KYF7N3.js} +38 -38
- package/dist/builtins-CRFDQUVP.js +22 -0
- package/dist/{chunk-TQAHXW6Y.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-JCI2ROMZ.js → chunk-3T4DXWP6.js} +7 -7
- package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
- package/dist/{chunk-6Q3CYFD3.js → chunk-4SVIVOMC.js} +184 -33
- package/dist/{chunk-W54I7H25.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-I2DWJ4GM.js → chunk-5DDOTTG4.js} +54 -42
- package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
- package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
- package/dist/{chunk-3ODX73FK.js → chunk-5VTJP36Q.js} +4 -4
- package/dist/{chunk-54X7T7DK.js → chunk-5ZMXGW7P.js} +79 -7
- package/dist/chunk-5ZSZEYJK.js +119 -0
- package/dist/{chunk-IXIY2H4R.js → chunk-633EXGZA.js} +5 -5
- package/dist/{chunk-CUSRQKPU.js → chunk-6CDNRHWH.js} +299 -89
- package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
- package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
- package/dist/{chunk-JEIYHLOR.js → chunk-6SYEGZI3.js} +12 -12
- package/dist/{chunk-DQOVN6KV.js → chunk-6YA46L5A.js} +4 -4
- package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
- package/dist/{chunk-6PAZTBPA.js → chunk-7HBHHVCK.js} +15 -6
- package/dist/{chunk-25QBEXRS.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-3UUXNFEX.js → chunk-7YJWEF2L.js} +61 -34
- 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-I5FWO7L5.js → chunk-B6UM3OZC.js} +2 -2
- package/dist/{chunk-2CU2H6KE.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-QZWQA4DE.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-YNFKXPEC.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-XULDXHTN.js → chunk-DRD2A54W.js} +102 -50
- 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-FEAXX7B6.js → chunk-EHCPSZJF.js} +4 -4
- package/dist/{chunk-4NSRCOYP.js → chunk-EHOSNVVM.js} +3 -2
- package/dist/{chunk-7UGL4MB5.js → chunk-EQEJJ53P.js} +10 -10
- package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
- package/dist/{chunk-6UINWWS6.js → chunk-F34AR6O3.js} +14 -14
- package/dist/{chunk-GHS5EBTQ.js → chunk-FKIOX6DS.js} +29 -20
- package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
- package/dist/{chunk-Y55JBDO5.js → chunk-FSTIBAGM.js} +38 -23
- 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-TOIVGRUX.js → chunk-GJ24ODAX.js} +5 -5
- package/dist/{chunk-QUFRYSWI.js → chunk-GNQRWTMY.js} +129 -48
- package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
- package/dist/{chunk-GX5WYQO4.js → chunk-GXCCHKN6.js} +6 -6
- package/dist/{chunk-K6T2ZAMZ.js → chunk-HGSLRG33.js} +6 -6
- package/dist/{chunk-26QSH3EJ.js → chunk-HHVJNVUJ.js} +5 -5
- package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
- package/dist/{chunk-JT2RFCC5.js → chunk-HR3HPQ76.js} +5 -5
- package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
- package/dist/{chunk-ELWDPP3Y.js → chunk-I7VLWRK2.js} +8 -8
- package/dist/{chunk-6OSVSQL5.js → chunk-ICO4TQ2F.js} +7 -5
- package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
- package/dist/{chunk-72YIHOZQ.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-AUPNRN7C.js → chunk-K2HL3GBL.js} +4 -4
- package/dist/{chunk-2ASED4PZ.js → chunk-K6RDB7IA.js} +26 -26
- package/dist/{chunk-FFUPXJC4.js → chunk-KDWLXVMN.js} +23 -24
- package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
- package/dist/{chunk-6QOTUPRG.js → chunk-KF6GFW6O.js} +66 -18
- 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-3UNOLWNZ.js → chunk-KTFSFCVN.js} +20 -9
- package/dist/{chunk-57XXR6DR.js → chunk-KYKNBD4Y.js} +24 -23
- package/dist/{chunk-IRXAATOX.js → chunk-L4N3DWNW.js} +3 -3
- package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
- package/dist/{chunk-U6TMQNSI.js → chunk-LTR5QCLS.js} +4 -4
- package/dist/chunk-LUL5Z66S.js +221 -0
- package/dist/{chunk-ELZVTCGV.js → chunk-LVFANMOH.js} +151 -327
- 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-NXYCB2VD.js → chunk-M6TAYK66.js} +6 -6
- package/dist/{chunk-NEKRRTYW.js → chunk-MC3JSVR6.js} +2 -2
- package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
- package/dist/{chunk-DXKJURES.js → chunk-MDU3C27C.js} +10 -7
- package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
- package/dist/{chunk-3GY4F45V.js → chunk-NC4KV7EL.js} +6 -6
- package/dist/{chunk-LLXSDWXS.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-RZDWV63N.js → chunk-NY6IWDVU.js} +6 -6
- package/dist/{chunk-XXYSBZIQ.js → chunk-O2RQ7LCK.js} +4 -4
- package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
- package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
- package/dist/{chunk-NXIMQY5W.js → chunk-ODUTYZIU.js} +5 -5
- package/dist/{chunk-LTIKRKFL.js → chunk-ONRTXOZY.js} +4 -4
- package/dist/{chunk-KFV5L5SK.js → chunk-OQM5IVJY.js} +118 -232
- 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-RXTN6AKH.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-2DSOYNFC.js → chunk-R6MAYTMS.js} +7 -7
- package/dist/{chunk-JQLNNIKT.js → chunk-R6MICQYU.js} +6 -6
- package/dist/{chunk-NAI6ZFCY.js → chunk-RLTT5GVY.js} +122 -11
- package/dist/{chunk-DT3LWJOB.js → chunk-RXIOCVBZ.js} +24 -6
- package/dist/{chunk-N56KALIC.js → chunk-S32UQ5GL.js} +61 -34
- package/dist/{chunk-UEPWCCTY.js → chunk-SBZX6ARC.js} +12 -12
- package/dist/chunk-SD7SHNDW.js +15 -0
- package/dist/{chunk-NRO2BJRH.js → chunk-SDWNDICN.js} +10235 -4015
- 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-OMQNJVKW.js → chunk-SRZOW5L2.js} +43 -13
- package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
- package/dist/{chunk-V76WTFTW.js → chunk-T52TPHYC.js} +6 -6
- package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
- package/dist/{chunk-2ZSONWVL.js → chunk-T7FDXNRU.js} +13 -13
- package/dist/{chunk-JSD46VO2.js → chunk-TEG3RYVZ.js} +43 -36
- package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
- package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
- package/dist/{chunk-75W7L2E2.js → chunk-TZ7MFRG4.js} +1041 -162
- package/dist/{chunk-36CT5VVL.js → chunk-U2JOLB7O.js} +126 -77
- package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
- package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
- package/dist/{chunk-YECAMM3D.js → chunk-U7H5WRG5.js} +5 -5
- package/dist/{chunk-RQCKCSRL.js → chunk-U7VQ4NI4.js} +22 -22
- package/dist/{chunk-5TUB6SLS.js → chunk-UFYNOQK4.js} +7 -7
- package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
- package/dist/{chunk-USR47QNF.js → chunk-UL36QJX6.js} +14 -14
- package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
- package/dist/{chunk-RAY4OVGZ.js → chunk-URBGEOH3.js} +5 -5
- package/dist/chunk-USZA7GWL.js +341 -0
- package/dist/{chunk-YD5GIKET.js → chunk-UTUNT5QL.js} +48 -579
- package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
- package/dist/{chunk-23L32XTI.js → chunk-UXAC2FX4.js} +68 -39
- package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
- package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
- package/dist/{chunk-EXLD33WO.js → chunk-VLPTKCKT.js} +24 -9
- 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-S6PYF2XF.js → chunk-WFKDPU7U.js} +4 -4
- package/dist/{chunk-BJVFZO5U.js → chunk-WJIMKGD6.js} +7 -7
- package/dist/{chunk-5636DCO5.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-4M6Z5QVF.js → chunk-XXBQKW32.js} +11 -11
- package/dist/{chunk-OEJSLEPW.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-Q4WO54TA.js → chunk-ZMZQEBKI.js} +14 -14
- 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 +44 -44
- package/dist/clio-5I2IBFYL.js +26 -0
- package/dist/{code-nav-IJR2DBPR.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-2TGAI2RC.js → components-TNIKXCBH.js} +13 -13
- package/dist/{config-IUA6OYNS.js → config-Y2JDJ3JJ.js} +210 -124
- package/dist/configure-SML6UBZ5.js +55 -0
- package/dist/{context-4MPR7WKB.js → context-P5YSEO55.js} +125 -121
- package/dist/{context-2DKHWH2T.js → context-QQ53HSGJ.js} +91 -62
- package/dist/{context-BOYF5EJM.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-3I3FYX6Y.js → context-working-set-CNLSQN5K.js} +31 -31
- package/dist/detail-5572VLBO.js +114 -0
- package/dist/{dispatch-runner-RJ5I2F2O.js → dispatch-runner-FRHD6P2O.js} +191 -116
- package/dist/{docs-SPOV3BAN.js → docs-BL7ROUFN.js} +4 -4
- package/dist/{doctor-DKICC2SN.js → doctor-N3LCM2LG.js} +58 -58
- package/dist/{eval-OQOQUDHK.js → eval-BUU3ZOUZ.js} +473 -168
- package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
- package/dist/evidence-DTGEN456.js +224 -0
- package/dist/{evidence-4DQ25GUQ.js → evidence-SQ5DNFEN.js} +110 -94
- package/dist/{evolve-GSS52E5J.js → evolve-IJNUFZDS.js} +107 -91
- package/dist/{extensions-G7MFLYHT.js → extensions-YVRHX6ZI.js} +16 -16
- package/dist/{fleet-Q37YHHAQ.js → fleet-ZNNVSYFO.js} +147 -147
- package/dist/{fleet-commands-G7E4N7SM.js → fleet-commands-5YE7NPJL.js} +27 -26
- package/dist/{fleet-decisions-O7M6QBA2.js → fleet-decisions-3SBSCTCW.js} +16 -15
- package/dist/{fleet-graph-TOUBW6OW.js → fleet-graph-6HHPWF5T.js} +39 -38
- package/dist/{fleet-inspect-SW33JJNI.js → fleet-inspect-JEYMGCGC.js} +107 -91
- package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
- package/dist/{fleet-preflight-CV2655TW.js → fleet-preflight-QRSHIIDE.js} +10 -9
- package/dist/{fleet-validate-KESZX2YH.js → fleet-validate-4PM4GDDL.js} +46 -42
- package/dist/{fleet-verify-UQPMTVE3.js → fleet-verify-NJDTHTO3.js} +105 -89
- package/dist/fleet-view-UP2BWQQY.js +117 -0
- package/dist/{init-PXEXQSBF.js → init-S3GZQ5ZF.js} +123 -123
- package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
- package/dist/{interop-ZG5T62U3.js → interop-YOTGXFJM.js} +25 -25
- package/dist/inventory-K2OZ36YJ.js +117 -0
- package/dist/{library-B2W4N74O.js → library-GJI6W6OK.js} +45 -44
- package/dist/{memory-YCANYS5A.js → memory-OQOXQGYD.js} +107 -93
- package/dist/{models-GERTU3YI.js → models-3IK2Y5WE.js} +63 -62
- package/dist/{monitor-CPNIUULB.js → monitor-FTJLTKCQ.js} +136 -107
- package/dist/{orchestrator-J4BSH4WQ.js → orchestrator-N47O7SFD.js} +1159 -697
- package/dist/{panes-BOHAEGYC.js → panes-7BTYH3XQ.js} +8 -8
- package/dist/{panes-NXSLDQZ2.js → panes-WPOMEMRH.js} +22 -22
- package/dist/{paths-VSUWNC22.js → paths-J3KN7UAO.js} +12 -12
- package/dist/preload-65U34NG6.js +115 -0
- package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
- package/dist/{reset-TNWTB5LU.js → reset-MUVQDLNL.js} +20 -20
- package/dist/{resources-4PXNMD5G.js → resources-LM76COAO.js} +41 -40
- package/dist/{run-D6XJ34CN.js → run-3VFZQ33N.js} +162 -156
- package/dist/{share-2NWMJJEE.js → share-4JUB4BL7.js} +43 -42
- package/dist/{skills-KR7WON5G.js → skills-S36AAJHU.js} +47 -46
- package/dist/{skills-eval-O2ZNOLDS.js → skills-eval-G6T57L7M.js} +127 -107
- package/dist/{skills-inventory-ZZOUBK7O.js → skills-inventory-WLM46PJH.js} +41 -40
- package/dist/slash-commands-GBARG3Y7.js +91 -0
- package/dist/{steer-XA25PSCS.js → steer-S7D7IKPU.js} +7 -7
- package/dist/{support-7EMVWYG2.js → support-5VAEC32W.js} +14 -14
- package/dist/{targets-OMH2XCSN.js → targets-N5REUETU.js} +145 -94
- package/dist/tasks-6BVY5YZF.js +36 -0
- package/dist/{terminal-lease-C2J3JYRE.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-HALS6BLF.js → uninstall-FXYMFFRT.js} +17 -17
- package/dist/{upgrade-MS72RJEP.js → upgrade-4HD5HAIV.js} +40 -39
- package/dist/{usage-NHG6MCJM.js → usage-4GWM2WWP.js} +136 -105
- package/dist/{verifiers-7AUNVXDY.js → verifiers-GSKWKWVG.js} +28 -27
- package/dist/verify-3AS3ULCY.js +30 -0
- package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
- package/dist/{web-fetch-V4FKSDAV.js → web-fetch-MQN4FH3X.js} +169 -18
- package/dist/wiki-generate-7BV7XWIY.js +614 -0
- package/dist/{with-panes-BDQEWBRT.js → with-panes-OFTNAR4Y.js} +34 -20
- package/dist/worker/entry.js +99 -88
- package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
- package/docs/README.md +7 -6
- package/docs/architecture/acp.md +10 -0
- package/docs/architecture/architecture.md +5 -5
- 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/evidence-and-memory.md +10 -0
- package/docs/architecture/pi-boundary.md +37 -7
- package/docs/architecture/prompt-envelope-and-tools.md +7 -7
- package/docs/architecture/session-lifecycle.md +4 -4
- package/docs/architecture/worker-dispatch-mechanics.md +4 -0
- package/docs/guide/commands-and-modes.md +49 -36
- package/docs/guide/configuration-and-targets.md +7 -2
- package/docs/guide/configuration-reference.md +13 -3
- package/docs/guide/environment-variables.md +6 -2
- 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 +9 -2
- package/docs/process/development-pipeline.md +10 -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/release-cut-checklist.md +6 -6
- package/evals/README.md +4 -0
- package/evals/behavioral-corpus-grader.mjs +147 -14
- 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/registry.yaml +1 -1
- package/skills/skill-marketplace.json +1 -1
- 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/context-map.ts +75 -14
- package/src/cli/context.ts +46 -17
- package/src/cli/eval.ts +17 -3
- package/src/cli/modes/print.ts +32 -4
- package/src/cli/run.ts +16 -14
- package/src/cli/skills-eval.ts +10 -8
- package/src/cli/steer-channel.ts +31 -18
- package/src/cli/targets.ts +83 -31
- package/src/cli/tasks.ts +10 -1
- package/src/cli/upgrade.ts +9 -6
- package/src/cli/usage.ts +24 -0
- package/src/cli/wiki-generate.ts +239 -96
- package/src/core/bash-exec.ts +43 -15
- package/src/core/bus-events.ts +15 -0
- 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/incomplete-installation.ts +3 -1
- package/src/core/settings-layers.ts +21 -5
- package/src/core/termination.ts +26 -9
- package/src/core/untrusted-content.ts +16 -0
- package/src/core/workspace-trust.ts +179 -0
- package/src/domains/agents/builtins/coder.md +4 -2
- package/src/domains/agents/builtins/context-bootstrap.md +3 -1
- package/src/domains/agents/builtins/documenter.md +7 -4
- package/src/domains/agents/builtins/researcher.md +1 -0
- package/src/domains/agents/builtins/scout.md +7 -1
- 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 +72 -10
- 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 +9 -57
- package/src/domains/context/wiki/assemble.ts +14 -10
- package/src/domains/context/wiki/evidence.ts +209 -0
- package/src/domains/context/wiki/generate.ts +201 -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 +42 -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 +6 -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/contract.ts +10 -2
- 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 +2 -0
- package/src/domains/dispatch/extension.ts +190 -105
- package/src/domains/dispatch/fleet-run.ts +20 -0
- package/src/domains/dispatch/gate-role-prompts.ts +4 -2
- package/src/domains/dispatch/parallel-writers.ts +34 -0
- package/src/domains/dispatch/reservation-store.ts +8 -34
- 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/types.ts +4 -3
- 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 +5 -1
- 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 +4 -2
- 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/rules.ts +5 -1
- 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/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/contract.ts +2 -2
- package/src/domains/observability/projection.ts +30 -9
- 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 +10 -0
- package/src/domains/prompts/fragments/operating/delegation.md +5 -0
- package/src/domains/prompts/fragments/wiki/page.md +28 -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/runtime-resolution.ts +11 -9
- package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
- package/src/domains/resources/skills/promotion.ts +8 -1
- package/src/domains/safety/action-classifier.ts +9 -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 +11 -0
- package/src/domains/safety/extension.ts +11 -2
- package/src/domains/safety/policy-engine.ts +189 -32
- package/src/domains/safety/project-policy.ts +7 -2
- package/src/domains/safety/workspace-trust.ts +43 -0
- 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 +43 -33
- package/src/domains/session/entries.ts +169 -4
- package/src/domains/session/prompt-manifest.ts +47 -8
- package/src/domains/session/task-board.ts +21 -3
- package/src/domains/user-tasks/handoff.ts +16 -0
- package/src/engine/acp/adapter.ts +44 -12
- package/src/engine/acp/server.ts +1 -0
- package/src/engine/acp/transport.ts +2 -1
- package/src/engine/acp/types.ts +6 -1
- package/src/engine/antigravity/subprocess-runtime.ts +20 -4
- package/src/engine/api-registry.ts +19 -2
- 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/env-api-keys.ts +2 -1
- package/src/engine/external-subprocess.ts +14 -3
- 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 +53 -15
- 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 +17 -2
- package/src/interactive/editor-submit.ts +13 -0
- package/src/interactive/interactive-application.ts +8 -2
- package/src/interactive/interactive-event-projection.ts +7 -1
- package/src/interactive/interactive-presentation.ts +15 -7
- package/src/interactive/interactive-slash-runtime.ts +2 -0
- package/src/interactive/layout.ts +2 -1
- package/src/interactive/model-session-replay.ts +2 -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/message-picker.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-commands.ts +9 -7
- 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/watch-pane.ts +18 -4
- package/src/interactive/worker-stream.ts +7 -7
- package/src/tools/agent-tools.ts +6 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/builtin-tool-catalog.ts +9 -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 +34 -0
- package/src/tools/context/index.ts +32 -7
- package/src/tools/context/surface.ts +15 -4
- package/src/tools/decide.ts +1 -1
- package/src/tools/dispatch-admission.ts +12 -1
- package/src/tools/dispatch-arguments.ts +38 -1
- package/src/tools/dispatch-plan.ts +7 -7
- package/src/tools/dispatch-runner.ts +48 -32
- 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/find.ts +13 -4
- package/src/tools/grep.ts +13 -1
- 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/read.ts +112 -15
- package/src/tools/registry.ts +54 -17
- package/src/tools/result-shaping.ts +110 -2
- package/src/tools/tasks.ts +33 -7
- package/src/tools/verify/frontend.ts +67 -30
- package/src/tools/verify/numeric.ts +6 -1
- 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-WGALA46I.js +0 -22
- package/dist/chunk-2WZ546HR.js +0 -792
- package/dist/chunk-5PSMVOLM.js +0 -56
- package/dist/chunk-EL24TAU4.js +0 -1560
- package/dist/chunk-IZXGRF7P.js +0 -4048
- package/dist/chunk-JVCV3ICN.js +0 -47
- package/dist/chunk-MNJGS2IN.js +0 -33
- package/dist/chunk-O5CVSAG5.js +0 -122
- package/dist/chunk-ODGTEFFI.js +0 -50
- package/dist/chunk-OQE5J4C6.js +0 -73
- package/dist/chunk-UUVG37B4.js +0 -244
- package/dist/chunk-V6HJFQZE.js +0 -228
- package/dist/clio-QLICPCF5.js +0 -25
- package/dist/configure-VEPX4NMX.js +0 -55
- package/dist/context-clear-S4ZJCQUX.js +0 -182
- package/dist/detail-A7JAVSIG.js +0 -98
- package/dist/evidence-4F5USFKH.js +0 -208
- package/dist/fleet-view-MN2VG4MR.js +0 -101
- package/dist/inventory-C26CFDRR.js +0 -101
- package/dist/preload-P6DGH2PZ.js +0 -13
- package/dist/slash-commands-ZXPJD64J.js +0 -92
- package/dist/tasks-IPAGMEIX.js +0 -36
- package/dist/tools-EFFEAIDP.js +0 -28
- package/dist/verify-FWYGPKMR.js +0 -29
- package/dist/wiki-generate-743CIGJW.js +0 -476
package/skills/README.md
CHANGED
|
@@ -193,7 +193,7 @@ clio-coder skills install find-skills --project # strongest discovered project
|
|
|
193
193
|
|
|
194
194
|
## Publishing: the marketplace index
|
|
195
195
|
|
|
196
|
-
`
|
|
196
|
+
`pnpm run skills:pin` writes two files. `registry.yaml` pins content hashes and
|
|
197
197
|
is what drift is measured against. `skill-marketplace.json` is the published
|
|
198
198
|
index: one entry per skill with `name`, `description`, optional `triggers`,
|
|
199
199
|
`sourceUrl` (the skill's own `clio-coder.source-url`), `version`, `audit`, and
|
|
@@ -213,7 +213,7 @@ Install then clones the repository named in that entry's `sourceUrl` and copies
|
|
|
213
213
|
the skill out of it, so the index is only as live as the branch its URLs name.
|
|
214
214
|
The catalog's `source-url` values all point at `main`; until a release branch
|
|
215
215
|
lands there, an install through the index fails naming the repository, the
|
|
216
|
-
branch, and the missing path. `
|
|
216
|
+
branch, and the missing path. `pnpm run skills:check` fails if a skill's
|
|
217
217
|
`source-url` stops ending with its catalog path, which is how a skill moved
|
|
218
218
|
between categories cannot ship a stale pointer.
|
|
219
219
|
|
|
@@ -292,7 +292,7 @@ dependency warnings, and other harnesses ignore it like any unknown key.
|
|
|
292
292
|
|
|
293
293
|
The deprecated nested `clio:` mapping and legacy flat keys (`registry-id`,
|
|
294
294
|
`source-url`, `audit` at the top level) are still read as fallbacks for older
|
|
295
|
-
installed copies. The catalog itself must use `clio-coder:`, and `
|
|
295
|
+
installed copies. The catalog itself must use `clio-coder:`, and `pnpm run
|
|
296
296
|
skills:check` enforces that.
|
|
297
297
|
|
|
298
298
|
### Versioning policy
|
|
@@ -350,7 +350,7 @@ names rather than mapping them. Translating `bash` to `Bash` for
|
|
|
350
350
|
Claude-compatibility would not restrict anything; it would silently add `Bash`
|
|
351
351
|
to the always-allow rules of every session that loaded the skill. The same goes
|
|
352
352
|
for a `clio-coder skills export --for claude` lane, so there is no such lane. To keep
|
|
353
|
-
a well-meaning edit from introducing that, `
|
|
353
|
+
a well-meaning edit from introducing that, `pnpm run skills:check` fails on any
|
|
354
354
|
`allowed-tools` entry that is not a Clio tool name in canonical lowercase.
|
|
355
355
|
|
|
356
356
|
The rest of the surface, read from the same build:
|
|
@@ -401,10 +401,10 @@ observed writing outside its workspace. Eval numbers are evidence about a
|
|
|
401
401
|
cooperative model, not an isolation guarantee. Run campaigns with `CLIO_CODER_*`
|
|
402
402
|
pointed at throwaway directories.
|
|
403
403
|
|
|
404
|
-
`
|
|
404
|
+
`pnpm run skills:pin` enforces this contract structurally: it refuses to pin a
|
|
405
405
|
catalog where any skill is missing the required frontmatter, `audit: pass`, or
|
|
406
406
|
its `evals.md`, declares a tool name Clio does not have, or carries a
|
|
407
|
-
`source-url` that no longer ends with its catalog path. `
|
|
407
|
+
`source-url` that no longer ends with its catalog path. `pnpm run skills:check`
|
|
408
408
|
(run in CI) fails on any drift between the catalog and either generated file,
|
|
409
409
|
`registry.yaml` or `skill-marketplace.json`. Each pin covers the normalized
|
|
410
410
|
`SKILL.md`, not the whole skill directory. Install-lifecycle stamps such as
|
package/skills/registry.yaml
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Pinned marketplace skill content hashes (provenance-stripped sha256).
|
|
2
|
-
# Generated by `
|
|
2
|
+
# Generated by `pnpm run skills:pin`. At activation, an installed skill
|
|
3
3
|
# carrying registry-id provenance is compared against its pinned hash;
|
|
4
4
|
# a mismatch surfaces a drift warning.
|
|
5
5
|
skills:
|
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
} from "../domains/context/index.js";
|
|
23
23
|
import type { DispatchContract } from "../domains/dispatch/contract.js";
|
|
24
24
|
import { DispatchDomainModule } from "../domains/dispatch/index.js";
|
|
25
|
+
import { declaredScopeIntent } from "../domains/dispatch/intent.js";
|
|
25
26
|
import type { RunReceipt } from "../domains/dispatch/types.js";
|
|
26
27
|
import { MiddlewareDomainModule } from "../domains/middleware/index.js";
|
|
27
28
|
import { createObservabilityDomainModule } from "../domains/observability/index.js";
|
|
@@ -384,6 +385,10 @@ async function generateBootstrapWithModel(
|
|
|
384
385
|
route?: BootstrapRoute,
|
|
385
386
|
): Promise<BootstrapStructuredOutput> {
|
|
386
387
|
const prompt = buildBootstrapPrompt(input);
|
|
388
|
+
// The internal researcher reads this repository and returns JSON. Authored
|
|
389
|
+
// handbook text is evidence, not a source of inferred filesystem authority.
|
|
390
|
+
const scope = declaredScopeIntent({ readRoots: ["."] });
|
|
391
|
+
if (!scope.ok) throw new Error(`${scope.reason}: ${scope.message}`);
|
|
387
392
|
const startedAtClock = performance.now();
|
|
388
393
|
input.progress?.({
|
|
389
394
|
phase: "generate",
|
|
@@ -393,6 +398,7 @@ async function generateBootstrapWithModel(
|
|
|
393
398
|
});
|
|
394
399
|
const dispatchBootstrap = (nativeSchema: boolean) =>
|
|
395
400
|
dispatch.dispatch({
|
|
401
|
+
intent: scope.intent,
|
|
396
402
|
agentId: CONTEXT_BOOTSTRAP_AGENT_ID,
|
|
397
403
|
executionRole: "researcher",
|
|
398
404
|
task: prompt,
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* everything reports the same columns.
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
-
import { existsSync
|
|
14
|
+
import { existsSync } from "node:fs";
|
|
15
15
|
import { basename, join } from "node:path";
|
|
16
16
|
import type { ClioSettings } from "../core/config.js";
|
|
17
17
|
import { resolvePackageRoot } from "../core/package-root.js";
|
|
@@ -32,8 +32,9 @@ import {
|
|
|
32
32
|
readHookSources,
|
|
33
33
|
readPersistedHookReceipts,
|
|
34
34
|
} from "../domains/middleware/index.js";
|
|
35
|
-
import {
|
|
35
|
+
import { selectProjectPreload } from "../domains/prompts/preload.js";
|
|
36
36
|
import { defaultScopedResourceRoots } from "../domains/resources/common-loader.js";
|
|
37
|
+
import { createSafetyPolicyEngine } from "../domains/safety/policy-engine.js";
|
|
37
38
|
import { ceilChars } from "../domains/session/context-accounting.js";
|
|
38
39
|
import { capturedHookSourcesFor } from "../entry/extension-hook-sources.js";
|
|
39
40
|
|
|
@@ -120,9 +121,9 @@ function inspectClioMd(cwd: string, graph: CustomizationGraph): void {
|
|
|
120
121
|
if (loaded.files.length === 0) return;
|
|
121
122
|
try {
|
|
122
123
|
const promptContext = renderPromptContext(cwd);
|
|
123
|
-
const preload =
|
|
124
|
-
for (const [index, file] of
|
|
125
|
-
const text =
|
|
124
|
+
const preload = selectProjectPreload(promptContext, null).classification;
|
|
125
|
+
for (const [index, file] of promptContext.handbookSources.entries()) {
|
|
126
|
+
const text = file.source;
|
|
126
127
|
graph.entries.push({
|
|
127
128
|
category: "clio-md",
|
|
128
129
|
id: basename(file.path),
|
|
@@ -130,15 +131,19 @@ function inspectClioMd(cwd: string, graph: CustomizationGraph): void {
|
|
|
130
131
|
sourcePath: file.path,
|
|
131
132
|
hash: shortHash(text),
|
|
132
133
|
trust: "trusted",
|
|
133
|
-
precedence:
|
|
134
|
+
precedence: promptContext.handbookSources.length === 1 ? "single" : "layer",
|
|
134
135
|
reloadClass: "next-turn",
|
|
135
136
|
contextCostTokens: ceilChars(text.length),
|
|
136
137
|
detail: {
|
|
137
138
|
layer: index + 1,
|
|
138
|
-
layers:
|
|
139
|
+
layers: promptContext.handbookSources.length,
|
|
139
140
|
preload: preload.label,
|
|
140
141
|
preloadChars: preload.chars,
|
|
141
142
|
preloadLines: preload.lines,
|
|
143
|
+
preloadIncludedChars: preload.includedChars ?? 0,
|
|
144
|
+
preloadIncludedLines: preload.includedLines ?? 0,
|
|
145
|
+
preloadSourceIncludedChars: preload.sources?.[index]?.includedChars ?? 0,
|
|
146
|
+
preloadSourceHash: preload.sources?.[index]?.contentHash ?? "",
|
|
142
147
|
...(preload.nearLimit ? { preloadNearLimit: true } : {}),
|
|
143
148
|
},
|
|
144
149
|
});
|
|
@@ -367,6 +372,18 @@ function inspectResourceRoots(cwd: string, graph: CustomizationGraph): void {
|
|
|
367
372
|
function inspectSafetyAndMemory(cwd: string, graph: CustomizationGraph): void {
|
|
368
373
|
try {
|
|
369
374
|
const layered = readLayeredSettings(cwd);
|
|
375
|
+
const metadata = createSafetyPolicyEngine({ cwd }).metadata();
|
|
376
|
+
graph.entries.push({
|
|
377
|
+
category: "safety",
|
|
378
|
+
id: "safety.policy",
|
|
379
|
+
scope: "effective",
|
|
380
|
+
reloadClass: "next-turn",
|
|
381
|
+
trust: metadata.workspaceTrustVerdict === "trusted" ? "trusted" : "untrusted",
|
|
382
|
+
precedence: "single",
|
|
383
|
+
...(metadata.projectPolicyPath === null ? {} : { sourcePath: metadata.projectPolicyPath }),
|
|
384
|
+
detail: { ...metadata },
|
|
385
|
+
});
|
|
386
|
+
|
|
370
387
|
graph.entries.push({
|
|
371
388
|
category: "safety",
|
|
372
389
|
id: "safety.autonomy",
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import {
|
|
2
|
+
captureProjectSurface,
|
|
3
|
+
type ProjectTrustSurface,
|
|
4
|
+
recordProjectSurfaceTrust,
|
|
5
|
+
revokeProjectSurfaceTrust,
|
|
6
|
+
} from "../core/workspace-trust.js";
|
|
7
|
+
import { printError } from "./shared.js";
|
|
8
|
+
|
|
9
|
+
const SURFACES: ReadonlyArray<ProjectTrustSurface> = ["safety", "hooks", "settings"];
|
|
10
|
+
|
|
11
|
+
/** Review is read-only. Approval names the digest the operator reviewed, so edits cannot borrow stale consent. */
|
|
12
|
+
export function runConfigTrustCommand(args: ReadonlyArray<string>, cwd = process.cwd()): number {
|
|
13
|
+
const surface = args[0] as ProjectTrustSurface | undefined;
|
|
14
|
+
if (surface === undefined || !SURFACES.includes(surface)) {
|
|
15
|
+
printError("usage: clio-coder config trust safety|hooks|settings [--json | --hash SHA256 | --revoke]");
|
|
16
|
+
return 2;
|
|
17
|
+
}
|
|
18
|
+
const rest = args.slice(1);
|
|
19
|
+
const preview = rest.length === 0 || (rest.length === 1 && rest[0] === "--json");
|
|
20
|
+
const revoke = rest.length === 1 && rest[0] === "--revoke";
|
|
21
|
+
const approve = rest.length === 2 && rest[0] === "--hash" && /^[a-f0-9]{64}$/.test(rest[1] ?? "");
|
|
22
|
+
if (!preview && !revoke && !approve) {
|
|
23
|
+
printError("trust expects --json, --revoke, or --hash followed by the full reviewed SHA-256 digest");
|
|
24
|
+
return 2;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
if (revoke) {
|
|
28
|
+
revokeProjectSurfaceTrust(cwd, surface);
|
|
29
|
+
process.stdout.write(
|
|
30
|
+
`Project ${surface} trust revoked. Restart to reload settings and safety; project hooks stop before their next execution.\n`,
|
|
31
|
+
);
|
|
32
|
+
return 0;
|
|
33
|
+
}
|
|
34
|
+
const snapshot = captureProjectSurface(cwd, surface);
|
|
35
|
+
if (preview) {
|
|
36
|
+
// JSON escapes terminal control sequences in repository-controlled text.
|
|
37
|
+
process.stdout.write(`${JSON.stringify(snapshot, null, 2)}\n`);
|
|
38
|
+
if (rest[0] !== "--json" && snapshot.contentHash !== null && snapshot.files.some((file) => file.text !== null)) {
|
|
39
|
+
process.stdout.write(
|
|
40
|
+
`Review the captured files above. Approve exactly these bytes with:\nclio-coder config trust ${surface} --hash ${snapshot.contentHash}\n`,
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
return 0;
|
|
44
|
+
}
|
|
45
|
+
if (snapshot.contentHash === null || !snapshot.files.some((file) => file.text !== null)) {
|
|
46
|
+
printError(`no readable project ${surface} files to approve`);
|
|
47
|
+
return 1;
|
|
48
|
+
}
|
|
49
|
+
if (snapshot.contentHash !== rest[1]) {
|
|
50
|
+
printError(`project ${surface} changed since review; inspect it again before approving`);
|
|
51
|
+
return 1;
|
|
52
|
+
}
|
|
53
|
+
recordProjectSurfaceTrust(snapshot.workspaceRoot, surface, snapshot.contentHash);
|
|
54
|
+
process.stdout.write(
|
|
55
|
+
`Project ${surface} approved for ${snapshot.workspaceRoot} at ${snapshot.contentHash}. Restart to reload settings and safety; reload extensions to register newly approved hooks.\n`,
|
|
56
|
+
);
|
|
57
|
+
return 0;
|
|
58
|
+
} catch (error) {
|
|
59
|
+
printError(error instanceof Error ? error.message : String(error));
|
|
60
|
+
return 1;
|
|
61
|
+
}
|
|
62
|
+
}
|
package/src/cli/config.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { buildCustomizationGraph, type CustomizationEntry } from "./config-inspect.js";
|
|
2
|
+
import { runConfigTrustCommand } from "./config-trust.js";
|
|
2
3
|
import { printError } from "./shared.js";
|
|
3
4
|
|
|
4
5
|
const HELP = `clio-coder config inspect [--json]
|
|
6
|
+
clio-coder config trust safety|hooks|settings [--json | --hash SHA256 | --revoke]
|
|
5
7
|
|
|
6
8
|
Print the effective-customization graph: what settings, context files, rules,
|
|
7
9
|
skills, prompts, agents, fleets, extensions, safety, memory, hooks, and the operator
|
|
@@ -10,6 +12,10 @@ context cost. Read-only; nothing is created.
|
|
|
10
12
|
|
|
11
13
|
This is the "why is Clio behaving this way" surface. Parse the --json form in
|
|
12
14
|
scripts instead of the table.
|
|
15
|
+
|
|
16
|
+
Trust previews show the captured project files and their digest. Approve only
|
|
17
|
+
the reviewed digest with --hash, or remove a surface's approval with --revoke.
|
|
18
|
+
Settings and safety reload on restart; project hooks also check trust before execution.
|
|
13
19
|
`;
|
|
14
20
|
|
|
15
21
|
function renderText(cwd: string): string {
|
|
@@ -37,6 +43,7 @@ function renderText(cwd: string): string {
|
|
|
37
43
|
const precedence = entry.precedence ? `, ${entry.precedence}` : "";
|
|
38
44
|
out.push(` ${entry.id} [${entry.scope}${precedence}, reload:${entry.reloadClass}${hash}${cost}]`);
|
|
39
45
|
if (entry.sourcePath) out.push(` from ${entry.sourcePath}`);
|
|
46
|
+
if (entry.id === "safety.policy" && entry.detail !== undefined) out.push(` ${JSON.stringify(entry.detail)}`);
|
|
40
47
|
}
|
|
41
48
|
out.push("");
|
|
42
49
|
}
|
|
@@ -56,6 +63,7 @@ export function runConfigCommand(args: ReadonlyArray<string> = []): number {
|
|
|
56
63
|
}
|
|
57
64
|
const positional = args.filter((arg) => !arg.startsWith("-"));
|
|
58
65
|
const sub = positional[0] ?? "inspect";
|
|
66
|
+
if (sub === "trust") return runConfigTrustCommand(args.slice(1));
|
|
59
67
|
if (sub !== "inspect") {
|
|
60
68
|
printError(`unknown config subcommand: ${sub}`);
|
|
61
69
|
process.stderr.write(HELP);
|
package/src/cli/context-map.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { execFileSync } from "node:child_process";
|
|
2
|
-
import {
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
4
|
import path from "node:path";
|
|
4
5
|
import { CLIO_ARTIFACT_DIR } from "../core/artifact-paths.js";
|
|
5
|
-
import {
|
|
6
|
+
import { type CodewikiCoordinatedResult, coordinateCodewikiWrite } from "../domains/context/codewiki/coordinator.js";
|
|
7
|
+
import type { Codewiki } from "../domains/context/codewiki/schema.js";
|
|
6
8
|
import { buildArchitectureSeed, serializeArchitectureSeed } from "../domains/context/wiki/map-seed.js";
|
|
7
9
|
|
|
8
10
|
const HELP = `Usage:
|
|
@@ -11,7 +13,8 @@ const HELP = `Usage:
|
|
|
11
13
|
Write an archify architecture seed for the current repository from the codewiki
|
|
12
14
|
index, without model calls. The seed is the starting spec for the archify skill:
|
|
13
15
|
components are the largest directory areas, connections are collapsed import
|
|
14
|
-
edges
|
|
16
|
+
edges. The index is reconciled with current files before mapping; sources are
|
|
17
|
+
pinned only when clean Git evidence matches those files.
|
|
15
18
|
|
|
16
19
|
Options:
|
|
17
20
|
--out <path> where to write the seed (default: ${CLIO_ARTIFACT_DIR}/maps/<repo>.architecture.json)
|
|
@@ -28,21 +31,53 @@ function gitValue(cwd: string, args: string[]): string | null {
|
|
|
28
31
|
const out = execFileSync("git", args, { cwd, timeout: 5000, stdio: ["ignore", "pipe", "ignore"] })
|
|
29
32
|
.toString("utf8")
|
|
30
33
|
.trim();
|
|
31
|
-
return out
|
|
34
|
+
return out;
|
|
32
35
|
} catch {
|
|
33
36
|
return null;
|
|
34
37
|
}
|
|
35
38
|
}
|
|
36
39
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
+
type SourceState = "clean" | "dirty" | "unknown";
|
|
41
|
+
|
|
42
|
+
/** A successful empty status means clean; unavailable Git evidence never does. */
|
|
43
|
+
function repositoryFacts(
|
|
44
|
+
cwd: string,
|
|
45
|
+
codewiki: Codewiki,
|
|
46
|
+
indexedHead: string | null,
|
|
47
|
+
): { sourceState: SourceState; repository?: { url: string; revision: string } } {
|
|
40
48
|
const revision = gitValue(cwd, ["rev-parse", "--verify", "HEAD"]);
|
|
41
|
-
|
|
49
|
+
const status = gitValue(cwd, ["status", "--porcelain", "--untracked-files=normal"]);
|
|
50
|
+
if (!revision || status === null) return { sourceState: "unknown" };
|
|
51
|
+
if (status !== "" || revision !== indexedHead) return { sourceState: "dirty" };
|
|
52
|
+
// Source paths in the seed are workspace-relative. A nested workspace has
|
|
53
|
+
// no proven repository-relative path mapping, so cannot supply citations.
|
|
54
|
+
if (gitValue(cwd, ["rev-parse", "--show-prefix"]) !== "") return { sourceState: "unknown" };
|
|
55
|
+
const tree = gitValue(cwd, ["ls-tree", "-r", "-z", revision]);
|
|
56
|
+
if (tree === null) return { sourceState: "unknown" };
|
|
57
|
+
const blobs = new Map<string, string>();
|
|
58
|
+
for (const entry of tree.split("\0")) {
|
|
59
|
+
const match = /^100[0-7]{3} blob ([a-f0-9]{40})\t([\s\S]+)$/.exec(entry);
|
|
60
|
+
if (match) blobs.set(match[2] as string, match[1] as string);
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
for (const file of codewiki.files) {
|
|
64
|
+
const contents = readFileSync(path.join(cwd, file.path));
|
|
65
|
+
// Verify both parser input identity and immutable Git blob identity.
|
|
66
|
+
// This also catches ignored/untracked inputs and assume-unchanged files
|
|
67
|
+
// that a successful `git status` alone cannot certify.
|
|
68
|
+
const indexedHash = createHash("sha256").update(contents.toString("utf8")).digest("hex").slice(0, 16);
|
|
69
|
+
const blob = createHash("sha1").update(`blob ${contents.length}\0`).update(contents).digest("hex");
|
|
70
|
+
if (indexedHash !== file.hash || blobs.get(file.path) !== blob) return { sourceState: "dirty" };
|
|
71
|
+
}
|
|
72
|
+
} catch {
|
|
73
|
+
return { sourceState: "unknown" };
|
|
74
|
+
}
|
|
75
|
+
const remote = gitValue(cwd, ["remote", "get-url", "origin"]);
|
|
76
|
+
if (!remote) return { sourceState: "clean" };
|
|
42
77
|
let url = remote.endsWith(".git") ? remote.slice(0, -4) : remote;
|
|
43
78
|
const ssh = /^git@([^:]+):(.+)$/.exec(url);
|
|
44
79
|
if (ssh) url = `https://${ssh[1]}/${ssh[2]}`;
|
|
45
|
-
return { url, revision };
|
|
80
|
+
return { sourceState: "clean", repository: { url, revision } };
|
|
46
81
|
}
|
|
47
82
|
|
|
48
83
|
export async function runContextMapCommand(args: string[]): Promise<number> {
|
|
@@ -72,16 +107,40 @@ export async function runContextMapCommand(args: string[]): Promise<number> {
|
|
|
72
107
|
return 2;
|
|
73
108
|
}
|
|
74
109
|
const cwd = process.cwd();
|
|
75
|
-
|
|
76
|
-
|
|
110
|
+
let reconciled: CodewikiCoordinatedResult | null;
|
|
111
|
+
try {
|
|
112
|
+
reconciled = await coordinateCodewikiWrite(
|
|
113
|
+
cwd,
|
|
114
|
+
(current, workspace) =>
|
|
115
|
+
current
|
|
116
|
+
? {
|
|
117
|
+
kind: "ensure",
|
|
118
|
+
cwd: workspace,
|
|
119
|
+
current,
|
|
120
|
+
language: current.language,
|
|
121
|
+
// Map evidence must reconcile actual inputs, even if a state file
|
|
122
|
+
// happens to carry a matching fingerprint from another operation.
|
|
123
|
+
previous: null,
|
|
124
|
+
}
|
|
125
|
+
: null,
|
|
126
|
+
{ requireExisting: true },
|
|
127
|
+
);
|
|
128
|
+
} catch (error) {
|
|
129
|
+
process.stderr.write(
|
|
130
|
+
`clio-coder context map: index refresh failed: ${error instanceof Error ? error.message : String(error)}\n`,
|
|
131
|
+
);
|
|
132
|
+
return 1;
|
|
133
|
+
}
|
|
134
|
+
if (!reconciled) {
|
|
77
135
|
process.stderr.write(
|
|
78
136
|
"clio-coder context map: no codewiki index in .clio-coder/codewiki.json; run `clio-coder context index` first\n",
|
|
79
137
|
);
|
|
80
138
|
return 1;
|
|
81
139
|
}
|
|
82
|
-
const
|
|
140
|
+
const facts = repositoryFacts(cwd, reconciled.codewiki, reconciled.worker.fingerprint.gitHead);
|
|
141
|
+
const seed = buildArchitectureSeed(reconciled.codewiki, {
|
|
83
142
|
title: path.basename(cwd),
|
|
84
|
-
repository:
|
|
143
|
+
repository: facts.repository,
|
|
85
144
|
});
|
|
86
145
|
const target = out ? path.resolve(cwd, out) : defaultMapSeedPath(cwd);
|
|
87
146
|
mkdirSync(path.dirname(target), { recursive: true });
|
|
@@ -91,6 +150,8 @@ export async function runContextMapCommand(args: string[]): Promise<number> {
|
|
|
91
150
|
components: seed.components.length,
|
|
92
151
|
connections: seed.connections.length,
|
|
93
152
|
repository: seed.meta.repository ?? null,
|
|
153
|
+
index: "reconciled",
|
|
154
|
+
sourceState: facts.sourceState,
|
|
94
155
|
};
|
|
95
156
|
if (json) {
|
|
96
157
|
process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
|
|
@@ -102,7 +163,7 @@ export async function runContextMapCommand(args: string[]): Promise<number> {
|
|
|
102
163
|
` ${payload.components} components, ${payload.connections} connections${
|
|
103
164
|
payload.repository
|
|
104
165
|
? `, sources pinned at ${payload.repository.revision.slice(0, 12)}`
|
|
105
|
-
:
|
|
166
|
+
: `; no source citations (source state: ${payload.sourceState}; requires verified clean files and a GitHub origin at a full revision)`
|
|
106
167
|
}`,
|
|
107
168
|
payload.repository
|
|
108
169
|
? " next: validate and deliver it with the archify skill, passing --repo-root ."
|
package/src/cli/context.ts
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { join, resolve } from "node:path";
|
|
2
2
|
import type { BootstrapProgressEvent } from "../domains/context/index.js";
|
|
3
3
|
import type { BootstrapGenerationState } from "../domains/context/state.js";
|
|
4
|
+
import type { RunWikiGenerateResult } from "../domains/context/wiki/generate.js";
|
|
5
|
+
import type { WikiMeta } from "../domains/context/wiki/meta.js";
|
|
6
|
+
import { MAX_PAGE_ATTEMPTS } from "../domains/context/wiki/plan-store.js";
|
|
4
7
|
|
|
5
8
|
const HELP = `Usage:
|
|
6
9
|
clio-coder context
|
|
7
10
|
clio-coder context init [--yes] [--preview|--heuristic] [--adopt] [--propose|--apply|--rewrite]
|
|
8
11
|
clio-coder context refresh [--wiki]
|
|
9
|
-
clio-coder context wiki [--update] [--status] [--depth auto|simple|medium|detailed]
|
|
12
|
+
clio-coder context wiki [--update|--retry-pending] [--status] [--depth auto|simple|medium|detailed]
|
|
10
13
|
[--target <id>] [--model <id>] [--thinking off|low|medium|high]
|
|
11
14
|
clio-coder context reset [--all] [--yes]
|
|
12
15
|
clio-coder context index [--json]
|
|
@@ -32,6 +35,36 @@ function printWikiProgress(event: BootstrapProgressEvent): void {
|
|
|
32
35
|
process.stderr.write(`clio-coder context wiki: ${event.message}${detail}\n`);
|
|
33
36
|
}
|
|
34
37
|
|
|
38
|
+
function wikiRecoveryLines(meta: WikiMeta | null): string[] {
|
|
39
|
+
const pending = meta?.plan?.pages.filter((page) => page.status !== "written") ?? [];
|
|
40
|
+
if (pending.length === 0) return [];
|
|
41
|
+
const exhausted = pending.filter((page) => page.attempts >= MAX_PAGE_ATTEMPTS).length;
|
|
42
|
+
const failures = pending.filter((page) => page.lastFailure);
|
|
43
|
+
return [
|
|
44
|
+
`pending: ${pending.length} page(s)${exhausted > 0 ? `; ${exhausted} exhausted ordinary writer attempts` : ""}`,
|
|
45
|
+
...failures.slice(0, 8).map((page) => `${page.path}: ${page.lastFailure?.phase}: ${page.lastFailure?.detail}`),
|
|
46
|
+
...(failures.length > 8 ? [`${failures.length - 8} more page failures retained in wiki metadata`] : []),
|
|
47
|
+
"Run `clio-coder context wiki --retry-pending` to retry pending pages once, including exhausted pages, without replanning.",
|
|
48
|
+
];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function printWikiOutcome(prefix: string, result: RunWikiGenerateResult, meta: WikiMeta | null): void {
|
|
52
|
+
const pending = result.pending ?? meta?.plan?.pages.filter((page) => page.status !== "written").length ?? 0;
|
|
53
|
+
const complete = meta?.plan
|
|
54
|
+
? meta.plan.pages.filter((page) => page.status === "written").length
|
|
55
|
+
: (meta?.generation?.pagesWritten ?? Math.max(0, result.pages - pending));
|
|
56
|
+
const published = `${result.pages} published page${result.pages === 1 ? "" : "s"}`;
|
|
57
|
+
const progress = `${complete} complete, ${pending} pending`;
|
|
58
|
+
const outcome = pending > 0 ? "incomplete" : result.status === "noop" ? "unchanged" : "generated";
|
|
59
|
+
process.stdout.write(`${prefix}: ${outcome} (${published}; ${progress})\n`);
|
|
60
|
+
if (pending > 0) {
|
|
61
|
+
const recovery = wikiRecoveryLines(meta);
|
|
62
|
+
process.stdout.write(
|
|
63
|
+
`${recovery.length > 0 ? recovery.join("\n") : "Run `clio-coder context wiki --update` to continue pending pages."}\n`,
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
35
68
|
function compactMetric(value: number, suffix: string): string {
|
|
36
69
|
if (value < 1000) return `${value}${suffix}`;
|
|
37
70
|
return `${(value / 1000).toFixed(1)}k${suffix}`;
|
|
@@ -82,10 +115,7 @@ async function printContextStatus(): Promise<number> {
|
|
|
82
115
|
: "ok";
|
|
83
116
|
|
|
84
117
|
const prompt = context.renderPromptContext(cwd);
|
|
85
|
-
const preloadClass = preload.
|
|
86
|
-
hasClioMd: prompt.clioMd !== null,
|
|
87
|
-
text: prompt.text,
|
|
88
|
-
});
|
|
118
|
+
const preloadClass = preload.selectProjectPreload(prompt, null).classification;
|
|
89
119
|
|
|
90
120
|
const codewiki = context.readCodewiki(cwd);
|
|
91
121
|
const codewikiCount = codewiki ? context.codewikiEntries(codewiki).length : 0;
|
|
@@ -134,7 +164,7 @@ async function runRefreshCommand(args: string[]): Promise<number> {
|
|
|
134
164
|
return 2;
|
|
135
165
|
}
|
|
136
166
|
try {
|
|
137
|
-
const { runContextRefresh } = await import("../domains/context/index.js");
|
|
167
|
+
const { runContextRefresh, readWikiMeta } = await import("../domains/context/index.js");
|
|
138
168
|
const wikiEntry = updateWiki ? await import("./wiki-generate.js") : null;
|
|
139
169
|
const result = await runContextRefresh({
|
|
140
170
|
cwd: process.cwd(),
|
|
@@ -155,11 +185,7 @@ async function runRefreshCommand(args: string[]): Promise<number> {
|
|
|
155
185
|
);
|
|
156
186
|
return 1;
|
|
157
187
|
}
|
|
158
|
-
process.
|
|
159
|
-
result.wiki.status === "noop"
|
|
160
|
-
? `clio-coder context refresh: wiki unchanged (${result.wiki.pages} page${result.wiki.pages === 1 ? "" : "s"})\n`
|
|
161
|
-
: `clio-coder context refresh: wiki updated (${result.wiki.pages} page${result.wiki.pages === 1 ? "" : "s"})\n`,
|
|
162
|
-
);
|
|
188
|
+
printWikiOutcome("clio-coder context refresh: wiki", result.wiki, readWikiMeta(process.cwd()));
|
|
163
189
|
}
|
|
164
190
|
return 0;
|
|
165
191
|
} catch (err) {
|
|
@@ -189,10 +215,11 @@ async function runWikiStatusCommand(): Promise<number> {
|
|
|
189
215
|
`depth: ${depth} (requested ${requestedDepth}; ${sourceFiles} source files; ` +
|
|
190
216
|
`${pagesWritten}/${pagesPlanned} planned pages written)`,
|
|
191
217
|
);
|
|
192
|
-
if (pagesWritten < pagesPlanned) {
|
|
218
|
+
if (pagesWritten < pagesPlanned && !meta.plan) {
|
|
193
219
|
lines.push(`pending: ${pagesPlanned - pagesWritten} page(s); run \`clio-coder context wiki --update\` to finish`);
|
|
194
220
|
}
|
|
195
221
|
}
|
|
222
|
+
lines.push(...wikiRecoveryLines(meta));
|
|
196
223
|
if (currentHead !== meta.gitHead) {
|
|
197
224
|
lines.push(`staleness: gitHead differs from current HEAD (${currentHead ?? "none"})`);
|
|
198
225
|
}
|
|
@@ -215,6 +242,7 @@ function isThinkingLevel(value: unknown): value is WikiCliThinking {
|
|
|
215
242
|
|
|
216
243
|
async function runWikiCommand(args: string[]): Promise<number> {
|
|
217
244
|
let forceUpdate = false;
|
|
245
|
+
let retryPending = false;
|
|
218
246
|
let status = false;
|
|
219
247
|
let depth: WikiCliDepth = "auto";
|
|
220
248
|
let target: string | undefined;
|
|
@@ -230,6 +258,10 @@ async function runWikiCommand(args: string[]): Promise<number> {
|
|
|
230
258
|
forceUpdate = true;
|
|
231
259
|
continue;
|
|
232
260
|
}
|
|
261
|
+
if (arg === "--retry-pending") {
|
|
262
|
+
retryPending = true;
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
233
265
|
if (arg === "--status") {
|
|
234
266
|
status = true;
|
|
235
267
|
continue;
|
|
@@ -277,6 +309,7 @@ async function runWikiCommand(args: string[]): Promise<number> {
|
|
|
277
309
|
const result = await context.runWikiGenerate({
|
|
278
310
|
cwd: process.cwd(),
|
|
279
311
|
...(forceUpdate ? { mode: "update" as const } : {}),
|
|
312
|
+
...(retryPending ? { retryPending: true } : {}),
|
|
280
313
|
depth,
|
|
281
314
|
model: await resolveDocumenterModelId(route),
|
|
282
315
|
generate: modelWikiGenerate({ route }),
|
|
@@ -286,11 +319,7 @@ async function runWikiCommand(args: string[]): Promise<number> {
|
|
|
286
319
|
process.stderr.write(`clio-coder context wiki failed: ${(result.problems ?? ["unknown failure"]).join("; ")}\n`);
|
|
287
320
|
return 1;
|
|
288
321
|
}
|
|
289
|
-
process.
|
|
290
|
-
result.status === "noop"
|
|
291
|
-
? `clio-coder context wiki: unchanged (${result.pages} page${result.pages === 1 ? "" : "s"})\n`
|
|
292
|
-
: `clio-coder context wiki: generated ${result.pages} page${result.pages === 1 ? "" : "s"}\n`,
|
|
293
|
-
);
|
|
322
|
+
printWikiOutcome("clio-coder context wiki", result, context.readWikiMeta(process.cwd()));
|
|
294
323
|
return 0;
|
|
295
324
|
} catch (err) {
|
|
296
325
|
process.stderr.write(`clio-coder context wiki failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
package/src/cli/eval.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
1
2
|
import { resolve } from "node:path";
|
|
2
3
|
import { InvalidIdError } from "../core/safe-id.js";
|
|
4
|
+
import { shellQuote } from "../core/shell-quote.js";
|
|
3
5
|
import { clioDataDir } from "../core/xdg.js";
|
|
4
|
-
import { loadEvalArtifactV4, writeEvalArtifactV4 } from "../domains/eval/artifacts/store.js";
|
|
6
|
+
import { loadEvalArtifactV4, parseEvalArtifactV4, writeEvalArtifactV4 } from "../domains/eval/artifacts/store.js";
|
|
5
7
|
import { compareEvalArtifactsV4 } from "../domains/eval/compare/compare.js";
|
|
6
8
|
import { evaluateGate, renderGateFailure, renderInformationalBudget } from "../domains/eval/compare/gates.js";
|
|
7
9
|
import { loadThresholds } from "../domains/eval/compare/thresholds.js";
|
|
@@ -50,6 +52,7 @@ interface ParsedEvalArgs {
|
|
|
50
52
|
out?: string;
|
|
51
53
|
clioEntry?: string;
|
|
52
54
|
evalId?: string;
|
|
55
|
+
artifact?: string;
|
|
53
56
|
format: EvalReportFormat;
|
|
54
57
|
compareIds: string[];
|
|
55
58
|
metric?: string;
|
|
@@ -133,6 +136,11 @@ function parseEvalArgs(args: ReadonlyArray<string>): ParsedEvalArgs {
|
|
|
133
136
|
throw new Error(`unknown eval run argument: ${arg}`);
|
|
134
137
|
}
|
|
135
138
|
if (parsed.command === "report") {
|
|
139
|
+
if (arg === "--artifact") {
|
|
140
|
+
parsed.artifact = requiredValue(args, index, "--artifact");
|
|
141
|
+
index += 1;
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
136
144
|
if (arg === "--format") {
|
|
137
145
|
parsed.format = reportFormat(requiredValue(args, index, "--format"));
|
|
138
146
|
index += 1;
|
|
@@ -189,7 +197,9 @@ function parseEvalArgs(args: ReadonlyArray<string>): ParsedEvalArgs {
|
|
|
189
197
|
if (parsed.command === "run" && (parsed.suite === undefined) === (parsed.taskFile === undefined)) {
|
|
190
198
|
throw new Error("run requires exactly one of --suite or --task-file");
|
|
191
199
|
}
|
|
192
|
-
if (parsed.command === "report" && parsed.evalId === undefined)
|
|
200
|
+
if (parsed.command === "report" && (parsed.evalId === undefined) === (parsed.artifact === undefined)) {
|
|
201
|
+
throw new Error("report requires exactly one of an eval id or --artifact <path>");
|
|
202
|
+
}
|
|
193
203
|
if (parsed.command === "compare" && parsed.compareIds.length !== 2) {
|
|
194
204
|
throw new Error("compare requires <baselineEvalId> <candidateEvalId>");
|
|
195
205
|
}
|
|
@@ -259,6 +269,7 @@ async function runEvalRun(parsed: ParsedEvalArgs): Promise<number> {
|
|
|
259
269
|
);
|
|
260
270
|
const artifactPath = await writeEvalArtifactV4(clioDataDir(), artifact, parsed.out);
|
|
261
271
|
process.stdout.write(`${renderEvalTextReportV4(artifact)}artifact: ${artifactPath}\n`);
|
|
272
|
+
process.stdout.write(`report: clio-coder eval report --artifact ${shellQuote(resolve(artifactPath))} --format md\n`);
|
|
262
273
|
// A suite that declares thresholds is gated by them here, on the artifact
|
|
263
274
|
// it just produced. Declaring a gate that only a later `eval gate`
|
|
264
275
|
// invocation enforces means the run that broke it still exited zero.
|
|
@@ -280,7 +291,10 @@ async function runEvalRun(parsed: ParsedEvalArgs): Promise<number> {
|
|
|
280
291
|
async function runEvalReportCommand(parsed: ParsedEvalArgs): Promise<number> {
|
|
281
292
|
try {
|
|
282
293
|
const dataDir = clioDataDir();
|
|
283
|
-
const artifact =
|
|
294
|
+
const artifact =
|
|
295
|
+
parsed.artifact === undefined
|
|
296
|
+
? await loadEvalArtifactV4(dataDir, parsed.evalId ?? "")
|
|
297
|
+
: parseEvalArtifactV4(JSON.parse(await readFile(parsed.artifact, "utf8")) as unknown, parsed.artifact);
|
|
284
298
|
process.stdout.write(renderArtifactReport(artifact, parsed.format, dataDir));
|
|
285
299
|
return 0;
|
|
286
300
|
} catch (error) {
|