@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.
Files changed (555) hide show
  1. package/CHANGELOG.md +92 -2
  2. package/CONTRIBUTING.md +25 -15
  3. package/README.md +340 -27
  4. package/dist/{acp-WNAYYF4F.js → acp-H3CU2HBQ.js} +25 -24
  5. package/dist/{agents-3OKXHLOI.js → agents-IXQQZ7BD.js} +77 -77
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-VKNNMGPU.js → auth-R7KYF7N3.js} +38 -38
  8. package/dist/builtins-CRFDQUVP.js +22 -0
  9. package/dist/{chunk-TQAHXW6Y.js → chunk-22PQ4TX4.js} +4 -4
  10. package/dist/{chunk-NEDJ26B5.js → chunk-2GPGAE5W.js} +6 -51
  11. package/dist/{chunk-IKCO5N3L.js → chunk-2QPI3TR3.js} +3 -3
  12. package/dist/{chunk-HRQMFLJP.js → chunk-32KJPXAM.js} +6 -6
  13. package/dist/{chunk-65DEGPJ6.js → chunk-3A3CUMKA.js} +6 -4
  14. package/dist/{chunk-JCI2ROMZ.js → chunk-3T4DXWP6.js} +7 -7
  15. package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
  16. package/dist/{chunk-6Q3CYFD3.js → chunk-4SVIVOMC.js} +184 -33
  17. package/dist/{chunk-W54I7H25.js → chunk-5A6XR3RJ.js} +44 -19
  18. package/dist/{chunk-YPC6ZR5L.js → chunk-5CMARGPF.js} +119 -5
  19. package/dist/{chunk-KXDSS5WJ.js → chunk-5CY4Q6QI.js} +4 -4
  20. package/dist/{chunk-I2DWJ4GM.js → chunk-5DDOTTG4.js} +54 -42
  21. package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
  22. package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
  23. package/dist/{chunk-3ODX73FK.js → chunk-5VTJP36Q.js} +4 -4
  24. package/dist/{chunk-54X7T7DK.js → chunk-5ZMXGW7P.js} +79 -7
  25. package/dist/chunk-5ZSZEYJK.js +119 -0
  26. package/dist/{chunk-IXIY2H4R.js → chunk-633EXGZA.js} +5 -5
  27. package/dist/{chunk-CUSRQKPU.js → chunk-6CDNRHWH.js} +299 -89
  28. package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
  29. package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
  30. package/dist/{chunk-JEIYHLOR.js → chunk-6SYEGZI3.js} +12 -12
  31. package/dist/{chunk-DQOVN6KV.js → chunk-6YA46L5A.js} +4 -4
  32. package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
  33. package/dist/{chunk-6PAZTBPA.js → chunk-7HBHHVCK.js} +15 -6
  34. package/dist/{chunk-25QBEXRS.js → chunk-7TKWWPD7.js} +5 -4
  35. package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
  36. package/dist/chunk-7WUZEB2M.js +165 -0
  37. package/dist/{chunk-3UUXNFEX.js → chunk-7YJWEF2L.js} +61 -34
  38. package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
  39. package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
  40. package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
  41. package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
  42. package/dist/{chunk-I5FWO7L5.js → chunk-B6UM3OZC.js} +2 -2
  43. package/dist/{chunk-2CU2H6KE.js → chunk-BBV5TKE6.js} +5 -5
  44. package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
  45. package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
  46. package/dist/{chunk-QZWQA4DE.js → chunk-CBSKDFWL.js} +3 -3
  47. package/dist/{chunk-2LEAKD4C.js → chunk-CKK25WN3.js} +3 -3
  48. package/dist/{chunk-BYP5D4HI.js → chunk-CTTI7G3T.js} +2 -2
  49. package/dist/{chunk-XAKHZX5N.js → chunk-CVDAFGPW.js} +4 -4
  50. package/dist/{chunk-RKKLTLYB.js → chunk-CXQ37WJH.js} +3 -3
  51. package/dist/{chunk-GTUD2WMY.js → chunk-DBREN25X.js} +44 -9
  52. package/dist/{chunk-YNFKXPEC.js → chunk-DIMRLNIC.js} +35 -66
  53. package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
  54. package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
  55. package/dist/{chunk-XULDXHTN.js → chunk-DRD2A54W.js} +102 -50
  56. package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
  57. package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
  58. package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
  59. package/dist/{chunk-IGLP3ODT.js → chunk-E3BQTQUP.js} +15 -15
  60. package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
  61. package/dist/{chunk-3R73A4XB.js → chunk-ECBHH7LU.js} +3 -3
  62. package/dist/chunk-ECOMVOHP.js +139 -0
  63. package/dist/chunk-EFSEIZE6.js +56 -0
  64. package/dist/{chunk-FEAXX7B6.js → chunk-EHCPSZJF.js} +4 -4
  65. package/dist/{chunk-4NSRCOYP.js → chunk-EHOSNVVM.js} +3 -2
  66. package/dist/{chunk-7UGL4MB5.js → chunk-EQEJJ53P.js} +10 -10
  67. package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
  68. package/dist/{chunk-6UINWWS6.js → chunk-F34AR6O3.js} +14 -14
  69. package/dist/{chunk-GHS5EBTQ.js → chunk-FKIOX6DS.js} +29 -20
  70. package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
  71. package/dist/{chunk-Y55JBDO5.js → chunk-FSTIBAGM.js} +38 -23
  72. package/dist/{chunk-ZTJUVLTU.js → chunk-FXFVDPWY.js} +2 -2
  73. package/dist/{chunk-XPLRXC72.js → chunk-GD55RTIW.js} +3 -3
  74. package/dist/{chunk-5B2AEOW5.js → chunk-GH5ZR6JP.js} +472 -472
  75. package/dist/{chunk-TOIVGRUX.js → chunk-GJ24ODAX.js} +5 -5
  76. package/dist/{chunk-QUFRYSWI.js → chunk-GNQRWTMY.js} +129 -48
  77. package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
  78. package/dist/{chunk-GX5WYQO4.js → chunk-GXCCHKN6.js} +6 -6
  79. package/dist/{chunk-K6T2ZAMZ.js → chunk-HGSLRG33.js} +6 -6
  80. package/dist/{chunk-26QSH3EJ.js → chunk-HHVJNVUJ.js} +5 -5
  81. package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
  82. package/dist/{chunk-JT2RFCC5.js → chunk-HR3HPQ76.js} +5 -5
  83. package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
  84. package/dist/{chunk-ELWDPP3Y.js → chunk-I7VLWRK2.js} +8 -8
  85. package/dist/{chunk-6OSVSQL5.js → chunk-ICO4TQ2F.js} +7 -5
  86. package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
  87. package/dist/{chunk-72YIHOZQ.js → chunk-ILJ7DWGE.js} +9 -9
  88. package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
  89. package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
  90. package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
  91. package/dist/{chunk-AUPNRN7C.js → chunk-K2HL3GBL.js} +4 -4
  92. package/dist/{chunk-2ASED4PZ.js → chunk-K6RDB7IA.js} +26 -26
  93. package/dist/{chunk-FFUPXJC4.js → chunk-KDWLXVMN.js} +23 -24
  94. package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
  95. package/dist/{chunk-6QOTUPRG.js → chunk-KF6GFW6O.js} +66 -18
  96. package/dist/{chunk-BTK3SSSK.js → chunk-KMF54VH3.js} +2 -2
  97. package/dist/chunk-KPRLAMP4.js +32 -0
  98. package/dist/{chunk-ECH6PKUQ.js → chunk-KQ6IDQIB.js} +2 -2
  99. package/dist/{chunk-3UNOLWNZ.js → chunk-KTFSFCVN.js} +20 -9
  100. package/dist/{chunk-57XXR6DR.js → chunk-KYKNBD4Y.js} +24 -23
  101. package/dist/{chunk-IRXAATOX.js → chunk-L4N3DWNW.js} +3 -3
  102. package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
  103. package/dist/{chunk-U6TMQNSI.js → chunk-LTR5QCLS.js} +4 -4
  104. package/dist/chunk-LUL5Z66S.js +221 -0
  105. package/dist/{chunk-ELZVTCGV.js → chunk-LVFANMOH.js} +151 -327
  106. package/dist/{chunk-H7IXIC72.js → chunk-LY4N4TTL.js} +17 -3
  107. package/dist/{chunk-VKPAQYEB.js → chunk-LZBMXNLP.js} +5 -5
  108. package/dist/{chunk-UL3WSD3F.js → chunk-M4KFUXS7.js} +2 -2
  109. package/dist/{chunk-NXYCB2VD.js → chunk-M6TAYK66.js} +6 -6
  110. package/dist/{chunk-NEKRRTYW.js → chunk-MC3JSVR6.js} +2 -2
  111. package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
  112. package/dist/{chunk-DXKJURES.js → chunk-MDU3C27C.js} +10 -7
  113. package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
  114. package/dist/{chunk-3GY4F45V.js → chunk-NC4KV7EL.js} +6 -6
  115. package/dist/{chunk-LLXSDWXS.js → chunk-NF3BK5WR.js} +5 -5
  116. package/dist/chunk-NTK3WTHM.js +141 -0
  117. package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
  118. package/dist/{chunk-RZDWV63N.js → chunk-NY6IWDVU.js} +6 -6
  119. package/dist/{chunk-XXYSBZIQ.js → chunk-O2RQ7LCK.js} +4 -4
  120. package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
  121. package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
  122. package/dist/{chunk-NXIMQY5W.js → chunk-ODUTYZIU.js} +5 -5
  123. package/dist/{chunk-LTIKRKFL.js → chunk-ONRTXOZY.js} +4 -4
  124. package/dist/{chunk-KFV5L5SK.js → chunk-OQM5IVJY.js} +118 -232
  125. package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
  126. package/dist/{chunk-R6Q67RJH.js → chunk-PECBKCDK.js} +34 -6
  127. package/dist/{chunk-33YXPOE3.js → chunk-PPEZJWUG.js} +2 -2
  128. package/dist/{chunk-RXTN6AKH.js → chunk-PWWSIB2A.js} +5 -5
  129. package/dist/{chunk-2STGEDFV.js → chunk-QEQISF75.js} +2 -2
  130. package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
  131. package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
  132. package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
  133. package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
  134. package/dist/{chunk-2DSOYNFC.js → chunk-R6MAYTMS.js} +7 -7
  135. package/dist/{chunk-JQLNNIKT.js → chunk-R6MICQYU.js} +6 -6
  136. package/dist/{chunk-NAI6ZFCY.js → chunk-RLTT5GVY.js} +122 -11
  137. package/dist/{chunk-DT3LWJOB.js → chunk-RXIOCVBZ.js} +24 -6
  138. package/dist/{chunk-N56KALIC.js → chunk-S32UQ5GL.js} +61 -34
  139. package/dist/{chunk-UEPWCCTY.js → chunk-SBZX6ARC.js} +12 -12
  140. package/dist/chunk-SD7SHNDW.js +15 -0
  141. package/dist/{chunk-NRO2BJRH.js → chunk-SDWNDICN.js} +10235 -4015
  142. package/dist/{chunk-UXCU4E3T.js → chunk-SE4ZKILO.js} +6 -6
  143. package/dist/chunk-SL2RDHKO.js +19 -0
  144. package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
  145. package/dist/{chunk-OMQNJVKW.js → chunk-SRZOW5L2.js} +43 -13
  146. package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
  147. package/dist/{chunk-V76WTFTW.js → chunk-T52TPHYC.js} +6 -6
  148. package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
  149. package/dist/{chunk-2ZSONWVL.js → chunk-T7FDXNRU.js} +13 -13
  150. package/dist/{chunk-JSD46VO2.js → chunk-TEG3RYVZ.js} +43 -36
  151. package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
  152. package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
  153. package/dist/{chunk-75W7L2E2.js → chunk-TZ7MFRG4.js} +1041 -162
  154. package/dist/{chunk-36CT5VVL.js → chunk-U2JOLB7O.js} +126 -77
  155. package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
  156. package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
  157. package/dist/{chunk-YECAMM3D.js → chunk-U7H5WRG5.js} +5 -5
  158. package/dist/{chunk-RQCKCSRL.js → chunk-U7VQ4NI4.js} +22 -22
  159. package/dist/{chunk-5TUB6SLS.js → chunk-UFYNOQK4.js} +7 -7
  160. package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
  161. package/dist/{chunk-USR47QNF.js → chunk-UL36QJX6.js} +14 -14
  162. package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
  163. package/dist/{chunk-RAY4OVGZ.js → chunk-URBGEOH3.js} +5 -5
  164. package/dist/chunk-USZA7GWL.js +341 -0
  165. package/dist/{chunk-YD5GIKET.js → chunk-UTUNT5QL.js} +48 -579
  166. package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
  167. package/dist/{chunk-23L32XTI.js → chunk-UXAC2FX4.js} +68 -39
  168. package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
  169. package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
  170. package/dist/{chunk-EXLD33WO.js → chunk-VLPTKCKT.js} +24 -9
  171. package/dist/{chunk-336NSSKI.js → chunk-VNBICSS2.js} +2 -2
  172. package/dist/{chunk-VAVR4IJY.js → chunk-VQD7NH7Z.js} +3 -3
  173. package/dist/{chunk-LBMZMYH2.js → chunk-W2RJEH6Q.js} +3 -3
  174. package/dist/{chunk-7CR24IG7.js → chunk-WDV62RKY.js} +2 -2
  175. package/dist/{chunk-S6PYF2XF.js → chunk-WFKDPU7U.js} +4 -4
  176. package/dist/{chunk-BJVFZO5U.js → chunk-WJIMKGD6.js} +7 -7
  177. package/dist/{chunk-5636DCO5.js → chunk-WLMSOT73.js} +59 -12
  178. package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
  179. package/dist/chunk-WXA2CFJO.js +23 -0
  180. package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
  181. package/dist/{chunk-4M6Z5QVF.js → chunk-XXBQKW32.js} +11 -11
  182. package/dist/{chunk-OEJSLEPW.js → chunk-YEJIG7LN.js} +332 -332
  183. package/dist/chunk-YGDMBK7O.js +567 -0
  184. package/dist/{chunk-4WR7VSYB.js → chunk-YYB3MC65.js} +23 -9
  185. package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
  186. package/dist/{chunk-Q4WO54TA.js → chunk-ZMZQEBKI.js} +14 -14
  187. package/dist/{chunk-6EJMN2Y3.js → chunk-ZTNFYMIO.js} +2 -2
  188. package/dist/{chunk-WEPFGWHJ.js → chunk-ZZFWWYLX.js} +2 -2
  189. package/dist/cli/index.js +44 -44
  190. package/dist/clio-5I2IBFYL.js +26 -0
  191. package/dist/{code-nav-IJR2DBPR.js → code-nav-YXIAEZVS.js} +48 -32
  192. package/dist/codewiki/build-worker.js +76 -29
  193. package/dist/{compile-cache-OQAVB7Y5.js → compile-cache-WJEPUZEJ.js} +4 -4
  194. package/dist/{components-2TGAI2RC.js → components-TNIKXCBH.js} +13 -13
  195. package/dist/{config-IUA6OYNS.js → config-Y2JDJ3JJ.js} +210 -124
  196. package/dist/configure-SML6UBZ5.js +55 -0
  197. package/dist/{context-4MPR7WKB.js → context-P5YSEO55.js} +125 -121
  198. package/dist/{context-2DKHWH2T.js → context-QQ53HSGJ.js} +91 -62
  199. package/dist/{context-BOYF5EJM.js → context-S2EEC3EJ.js} +62 -31
  200. package/dist/context-clear-TMEQCOTH.js +183 -0
  201. package/dist/{context-index-HNG3MOME.js → context-index-HP2JFUWA.js} +13 -11
  202. package/dist/{context-map-COB37XXN.js → context-map-INTXD54D.js} +71 -21
  203. package/dist/{context-working-set-3I3FYX6Y.js → context-working-set-CNLSQN5K.js} +31 -31
  204. package/dist/detail-5572VLBO.js +114 -0
  205. package/dist/{dispatch-runner-RJ5I2F2O.js → dispatch-runner-FRHD6P2O.js} +191 -116
  206. package/dist/{docs-SPOV3BAN.js → docs-BL7ROUFN.js} +4 -4
  207. package/dist/{doctor-DKICC2SN.js → doctor-N3LCM2LG.js} +58 -58
  208. package/dist/{eval-OQOQUDHK.js → eval-BUU3ZOUZ.js} +473 -168
  209. package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
  210. package/dist/evidence-DTGEN456.js +224 -0
  211. package/dist/{evidence-4DQ25GUQ.js → evidence-SQ5DNFEN.js} +110 -94
  212. package/dist/{evolve-GSS52E5J.js → evolve-IJNUFZDS.js} +107 -91
  213. package/dist/{extensions-G7MFLYHT.js → extensions-YVRHX6ZI.js} +16 -16
  214. package/dist/{fleet-Q37YHHAQ.js → fleet-ZNNVSYFO.js} +147 -147
  215. package/dist/{fleet-commands-G7E4N7SM.js → fleet-commands-5YE7NPJL.js} +27 -26
  216. package/dist/{fleet-decisions-O7M6QBA2.js → fleet-decisions-3SBSCTCW.js} +16 -15
  217. package/dist/{fleet-graph-TOUBW6OW.js → fleet-graph-6HHPWF5T.js} +39 -38
  218. package/dist/{fleet-inspect-SW33JJNI.js → fleet-inspect-JEYMGCGC.js} +107 -91
  219. package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
  220. package/dist/{fleet-preflight-CV2655TW.js → fleet-preflight-QRSHIIDE.js} +10 -9
  221. package/dist/{fleet-validate-KESZX2YH.js → fleet-validate-4PM4GDDL.js} +46 -42
  222. package/dist/{fleet-verify-UQPMTVE3.js → fleet-verify-NJDTHTO3.js} +105 -89
  223. package/dist/fleet-view-UP2BWQQY.js +117 -0
  224. package/dist/{init-PXEXQSBF.js → init-S3GZQ5ZF.js} +123 -123
  225. package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
  226. package/dist/{interop-ZG5T62U3.js → interop-YOTGXFJM.js} +25 -25
  227. package/dist/inventory-K2OZ36YJ.js +117 -0
  228. package/dist/{library-B2W4N74O.js → library-GJI6W6OK.js} +45 -44
  229. package/dist/{memory-YCANYS5A.js → memory-OQOXQGYD.js} +107 -93
  230. package/dist/{models-GERTU3YI.js → models-3IK2Y5WE.js} +63 -62
  231. package/dist/{monitor-CPNIUULB.js → monitor-FTJLTKCQ.js} +136 -107
  232. package/dist/{orchestrator-J4BSH4WQ.js → orchestrator-N47O7SFD.js} +1159 -697
  233. package/dist/{panes-BOHAEGYC.js → panes-7BTYH3XQ.js} +8 -8
  234. package/dist/{panes-NXSLDQZ2.js → panes-WPOMEMRH.js} +22 -22
  235. package/dist/{paths-VSUWNC22.js → paths-J3KN7UAO.js} +12 -12
  236. package/dist/preload-65U34NG6.js +115 -0
  237. package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
  238. package/dist/{reset-TNWTB5LU.js → reset-MUVQDLNL.js} +20 -20
  239. package/dist/{resources-4PXNMD5G.js → resources-LM76COAO.js} +41 -40
  240. package/dist/{run-D6XJ34CN.js → run-3VFZQ33N.js} +162 -156
  241. package/dist/{share-2NWMJJEE.js → share-4JUB4BL7.js} +43 -42
  242. package/dist/{skills-KR7WON5G.js → skills-S36AAJHU.js} +47 -46
  243. package/dist/{skills-eval-O2ZNOLDS.js → skills-eval-G6T57L7M.js} +127 -107
  244. package/dist/{skills-inventory-ZZOUBK7O.js → skills-inventory-WLM46PJH.js} +41 -40
  245. package/dist/slash-commands-GBARG3Y7.js +91 -0
  246. package/dist/{steer-XA25PSCS.js → steer-S7D7IKPU.js} +7 -7
  247. package/dist/{support-7EMVWYG2.js → support-5VAEC32W.js} +14 -14
  248. package/dist/{targets-OMH2XCSN.js → targets-N5REUETU.js} +145 -94
  249. package/dist/tasks-6BVY5YZF.js +36 -0
  250. package/dist/{terminal-lease-C2J3JYRE.js → terminal-lease-57UEOJKS.js} +12 -11
  251. package/dist/tools-6OCQ6SVB.js +28 -0
  252. package/dist/{trace-FXMXUZUF.js → trace-JHLXWUMN.js} +18 -17
  253. package/dist/{tree-sitter-HGKH6LG4.js → tree-sitter-AQUUOSYM.js} +6 -6
  254. package/dist/{tui-primitives-K5PASC3O.js → tui-primitives-RCY2HN7G.js} +3 -3
  255. package/dist/{uninstall-HALS6BLF.js → uninstall-FXYMFFRT.js} +17 -17
  256. package/dist/{upgrade-MS72RJEP.js → upgrade-4HD5HAIV.js} +40 -39
  257. package/dist/{usage-NHG6MCJM.js → usage-4GWM2WWP.js} +136 -105
  258. package/dist/{verifiers-7AUNVXDY.js → verifiers-GSKWKWVG.js} +28 -27
  259. package/dist/verify-3AS3ULCY.js +30 -0
  260. package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
  261. package/dist/{web-fetch-V4FKSDAV.js → web-fetch-MQN4FH3X.js} +169 -18
  262. package/dist/wiki-generate-7BV7XWIY.js +614 -0
  263. package/dist/{with-panes-BDQEWBRT.js → with-panes-OFTNAR4Y.js} +34 -20
  264. package/dist/worker/entry.js +99 -88
  265. package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
  266. package/docs/README.md +7 -6
  267. package/docs/architecture/acp.md +10 -0
  268. package/docs/architecture/architecture.md +5 -5
  269. package/docs/architecture/context-engine.md +44 -59
  270. package/docs/architecture/context-working-set.md +7 -9
  271. package/docs/architecture/dispatch-architecture-rationale.md +1 -1
  272. package/docs/architecture/evidence-and-memory.md +10 -0
  273. package/docs/architecture/pi-boundary.md +37 -7
  274. package/docs/architecture/prompt-envelope-and-tools.md +7 -7
  275. package/docs/architecture/session-lifecycle.md +4 -4
  276. package/docs/architecture/worker-dispatch-mechanics.md +4 -0
  277. package/docs/guide/commands-and-modes.md +49 -36
  278. package/docs/guide/configuration-and-targets.md +7 -2
  279. package/docs/guide/configuration-reference.md +13 -3
  280. package/docs/guide/environment-variables.md +6 -2
  281. package/docs/guide/fleet-dispatch.md +12 -0
  282. package/docs/guide/installation-and-lifecycle.md +35 -9
  283. package/docs/guide/proactive-memory.md +1 -1
  284. package/docs/guide/skills-marketplace.md +11 -3
  285. package/docs/guide/tool-usage.md +9 -2
  286. package/docs/process/development-pipeline.md +10 -10
  287. package/docs/process/documentation-guide.md +2 -2
  288. package/docs/process/eval-runner.md +15 -0
  289. package/docs/process/evals-internal.md +1 -1
  290. package/docs/process/release-cut-checklist.md +6 -6
  291. package/evals/README.md +4 -0
  292. package/evals/behavioral-corpus-grader.mjs +147 -14
  293. package/evals/behavioral-model-negative-control.yaml +1 -0
  294. package/evals/behavioral-model.yaml +266 -1
  295. package/evals/fixtures/docs-retrieval.json +102 -0
  296. package/evals/fixtures/scalar-decision.json +17 -0
  297. package/evals/fixtures/scout-citation-pipeline.json +55 -0
  298. package/evals/fixtures/source-explanation.json +74 -0
  299. package/evals/fixtures/tool-arguments.json +18 -0
  300. package/evals/fixtures/tool-surface/read.txt +4 -0
  301. package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
  302. package/evals/no-edit-memory-grader.mjs +149 -0
  303. package/evals/scalar-decision-grader.py +41 -0
  304. package/evals/scalar-decision-machinery.ts +145 -0
  305. package/evals/source-explanation-grader.mjs +118 -0
  306. package/evals/tool-surface-grader.mjs +53 -0
  307. package/evals/tool-surface-model.yaml +274 -0
  308. package/package.json +14 -14
  309. package/skills/README.md +6 -6
  310. package/skills/registry.yaml +1 -1
  311. package/skills/skill-marketplace.json +1 -1
  312. package/src/cli/bootstrap-generate.ts +6 -0
  313. package/src/cli/config-inspect.ts +24 -7
  314. package/src/cli/config-trust.ts +62 -0
  315. package/src/cli/config.ts +8 -0
  316. package/src/cli/context-map.ts +75 -14
  317. package/src/cli/context.ts +46 -17
  318. package/src/cli/eval.ts +17 -3
  319. package/src/cli/modes/print.ts +32 -4
  320. package/src/cli/run.ts +16 -14
  321. package/src/cli/skills-eval.ts +10 -8
  322. package/src/cli/steer-channel.ts +31 -18
  323. package/src/cli/targets.ts +83 -31
  324. package/src/cli/tasks.ts +10 -1
  325. package/src/cli/upgrade.ts +9 -6
  326. package/src/cli/usage.ts +24 -0
  327. package/src/cli/wiki-generate.ts +239 -96
  328. package/src/core/bash-exec.ts +43 -15
  329. package/src/core/bus-events.ts +15 -0
  330. package/src/core/config.ts +33 -14
  331. package/src/core/defaults.ts +5 -4
  332. package/src/core/file-references.ts +11 -1
  333. package/src/core/incomplete-installation.ts +3 -1
  334. package/src/core/settings-layers.ts +21 -5
  335. package/src/core/termination.ts +26 -9
  336. package/src/core/untrusted-content.ts +16 -0
  337. package/src/core/workspace-trust.ts +179 -0
  338. package/src/domains/agents/builtins/coder.md +4 -2
  339. package/src/domains/agents/builtins/context-bootstrap.md +3 -1
  340. package/src/domains/agents/builtins/documenter.md +7 -4
  341. package/src/domains/agents/builtins/researcher.md +1 -0
  342. package/src/domains/agents/builtins/scout.md +7 -1
  343. package/src/domains/agents/result-contract.ts +199 -26
  344. package/src/domains/context/bootstrap-prompt.ts +11 -9
  345. package/src/domains/context/bootstrap.ts +74 -39
  346. package/src/domains/context/clio-md.ts +88 -26
  347. package/src/domains/context/codewiki/build-operation.ts +121 -0
  348. package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
  349. package/src/domains/context/codewiki/build-worker.ts +3 -35
  350. package/src/domains/context/codewiki/coordinator.ts +36 -6
  351. package/src/domains/context/codewiki/indexer.ts +59 -19
  352. package/src/domains/context/contract.ts +6 -2
  353. package/src/domains/context/extension.ts +72 -10
  354. package/src/domains/context/fingerprint.ts +39 -34
  355. package/src/domains/context/index.ts +7 -1
  356. package/src/domains/context/prompt-context.ts +55 -14
  357. package/src/domains/context/refresh.ts +9 -57
  358. package/src/domains/context/wiki/assemble.ts +14 -10
  359. package/src/domains/context/wiki/evidence.ts +209 -0
  360. package/src/domains/context/wiki/generate.ts +201 -67
  361. package/src/domains/context/wiki/meta.ts +10 -2
  362. package/src/domains/context/wiki/plan-store.ts +70 -14
  363. package/src/domains/context/wiki/plan.ts +71 -14
  364. package/src/domains/context/wiki/prompts.ts +42 -1
  365. package/src/domains/context/wiki/source-content.ts +106 -0
  366. package/src/domains/context/wiki/staleness.ts +33 -22
  367. package/src/domains/context/working-set/contract.ts +8 -2
  368. package/src/domains/context/working-set/engine.ts +17 -4
  369. package/src/domains/context/working-set/fold.ts +15 -2
  370. package/src/domains/context/working-set/marker.ts +2 -1
  371. package/src/domains/context/working-set/project.ts +18 -7
  372. package/src/domains/context/working-set/recall.ts +82 -56
  373. package/src/domains/dispatch/active-route-planner.ts +6 -3
  374. package/src/domains/dispatch/admission-queue.ts +19 -7
  375. package/src/domains/dispatch/admission.ts +3 -3
  376. package/src/domains/dispatch/budget-envelope.ts +47 -82
  377. package/src/domains/dispatch/capacity-lease.ts +57 -19
  378. package/src/domains/dispatch/contract.ts +10 -2
  379. package/src/domains/dispatch/event-pump.ts +28 -7
  380. package/src/domains/dispatch/execution-role.ts +49 -2
  381. package/src/domains/dispatch/execution-scheduler.ts +2 -0
  382. package/src/domains/dispatch/extension.ts +190 -105
  383. package/src/domains/dispatch/fleet-run.ts +20 -0
  384. package/src/domains/dispatch/gate-role-prompts.ts +4 -2
  385. package/src/domains/dispatch/parallel-writers.ts +34 -0
  386. package/src/domains/dispatch/reservation-store.ts +8 -34
  387. package/src/domains/dispatch/route-approval.ts +3 -3
  388. package/src/domains/dispatch/route-observer.ts +4 -2
  389. package/src/domains/dispatch/route-quality.ts +6 -1
  390. package/src/domains/dispatch/types.ts +4 -3
  391. package/src/domains/dispatch/worker-spawn.ts +58 -21
  392. package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
  393. package/src/domains/eval/compare/behavioral.ts +81 -14
  394. package/src/domains/eval/compare/compare.ts +15 -5
  395. package/src/domains/eval/compare/envelope.ts +12 -5
  396. package/src/domains/eval/metrics/context.ts +24 -1
  397. package/src/domains/eval/metrics/tracked.ts +4 -28
  398. package/src/domains/eval/reports/comparison.ts +9 -9
  399. package/src/domains/eval/runners/clio-run.ts +5 -1
  400. package/src/domains/eval/schema/suite.ts +2 -0
  401. package/src/domains/eval/schema/validate.ts +1 -0
  402. package/src/domains/eval/suites/run.ts +189 -13
  403. package/src/domains/eval/verifiers/integrity.ts +39 -0
  404. package/src/domains/eval/verifiers/patch.ts +58 -2
  405. package/src/domains/eval/workspaces/temp-copy.ts +3 -0
  406. package/src/domains/evidence/build.ts +4 -2
  407. package/src/domains/interop/registry.ts +2 -2
  408. package/src/domains/middleware/hooks-io.ts +45 -26
  409. package/src/domains/middleware/hooks.ts +6 -0
  410. package/src/domains/middleware/injection-screen.ts +23 -0
  411. package/src/domains/middleware/rules.ts +5 -1
  412. package/src/domains/middleware/stalled-turn.ts +18 -3
  413. package/src/domains/middleware/task-board-reminder.ts +4 -2
  414. package/src/domains/middleware/task-nudge.ts +4 -1
  415. package/src/domains/mux/contract.ts +34 -1
  416. package/src/domains/mux/dock-controller.ts +8 -1
  417. package/src/domains/mux/index.ts +1 -0
  418. package/src/domains/mux/socket-client.ts +13 -3
  419. package/src/domains/observability/contract.ts +2 -2
  420. package/src/domains/observability/projection.ts +30 -9
  421. package/src/domains/prompts/compiler.ts +10 -2
  422. package/src/domains/prompts/contract.ts +7 -4
  423. package/src/domains/prompts/extension.ts +28 -64
  424. package/src/domains/prompts/fragments/identity/clio.md +23 -0
  425. package/src/domains/prompts/fragments/operating/contract.md +10 -0
  426. package/src/domains/prompts/fragments/operating/delegation.md +5 -0
  427. package/src/domains/prompts/fragments/wiki/page.md +28 -15
  428. package/src/domains/prompts/fragments/wiki/plan.md +4 -4
  429. package/src/domains/prompts/preload-prefix.ts +31 -0
  430. package/src/domains/prompts/preload.ts +135 -61
  431. package/src/domains/providers/auth/backend-file.ts +15 -11
  432. package/src/domains/providers/auth/storage.ts +3 -5
  433. package/src/domains/providers/catalog.ts +18 -3
  434. package/src/domains/providers/runtime-resolution.ts +11 -9
  435. package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
  436. package/src/domains/resources/skills/promotion.ts +8 -1
  437. package/src/domains/safety/action-classifier.ts +9 -0
  438. package/src/domains/safety/autonomy.ts +10 -1
  439. package/src/domains/safety/contract.ts +5 -1
  440. package/src/domains/safety/default-path-policy.ts +11 -0
  441. package/src/domains/safety/extension.ts +11 -2
  442. package/src/domains/safety/policy-engine.ts +189 -32
  443. package/src/domains/safety/project-policy.ts +7 -2
  444. package/src/domains/safety/workspace-trust.ts +43 -0
  445. package/src/domains/session/compaction/compact.ts +384 -21
  446. package/src/domains/session/compaction/cut-point.ts +42 -5
  447. package/src/domains/session/compaction/tokens.ts +9 -1
  448. package/src/domains/session/decision-board.ts +43 -33
  449. package/src/domains/session/entries.ts +169 -4
  450. package/src/domains/session/prompt-manifest.ts +47 -8
  451. package/src/domains/session/task-board.ts +21 -3
  452. package/src/domains/user-tasks/handoff.ts +16 -0
  453. package/src/engine/acp/adapter.ts +44 -12
  454. package/src/engine/acp/server.ts +1 -0
  455. package/src/engine/acp/transport.ts +2 -1
  456. package/src/engine/acp/types.ts +6 -1
  457. package/src/engine/antigravity/subprocess-runtime.ts +20 -4
  458. package/src/engine/api-registry.ts +19 -2
  459. package/src/engine/apis/openai-completions.ts +13 -6
  460. package/src/engine/apis/output-budget.ts +26 -10
  461. package/src/engine/claude/sdk-runtime.ts +4 -3
  462. package/src/engine/env-api-keys.ts +2 -1
  463. package/src/engine/external-subprocess.ts +14 -3
  464. package/src/engine/loop-guard.ts +19 -2
  465. package/src/engine/provider-diagnostics.ts +129 -0
  466. package/src/engine/provider-payload.ts +3 -1
  467. package/src/engine/worker-runtime.ts +13 -2
  468. package/src/engine/worker-tools.ts +5 -1
  469. package/src/entry/extension-reload.ts +1 -0
  470. package/src/entry/orchestrator.ts +53 -15
  471. package/src/interactive/chat-loop-messages.ts +12 -4
  472. package/src/interactive/chat-loop.ts +115 -45
  473. package/src/interactive/chat-renderer.ts +60 -0
  474. package/src/interactive/context-recall-command.ts +2 -1
  475. package/src/interactive/dispatch-board.ts +17 -2
  476. package/src/interactive/editor-submit.ts +13 -0
  477. package/src/interactive/interactive-application.ts +8 -2
  478. package/src/interactive/interactive-event-projection.ts +7 -1
  479. package/src/interactive/interactive-presentation.ts +15 -7
  480. package/src/interactive/interactive-slash-runtime.ts +2 -0
  481. package/src/interactive/layout.ts +2 -1
  482. package/src/interactive/model-session-replay.ts +2 -2
  483. package/src/interactive/overlay-frame.ts +1 -0
  484. package/src/interactive/overlay-general-openers.ts +3 -1
  485. package/src/interactive/overlay-session-lifecycle.ts +6 -0
  486. package/src/interactive/overlays/ask-user.ts +1 -0
  487. package/src/interactive/overlays/message-picker.ts +1 -1
  488. package/src/interactive/renderers/tool-execution.ts +17 -1
  489. package/src/interactive/renderers/worker-entry.ts +25 -10
  490. package/src/interactive/slash-commands.ts +9 -7
  491. package/src/interactive/turn-context.ts +221 -53
  492. package/src/interactive/turn-middleware.ts +3 -1
  493. package/src/interactive/turn-persistence.ts +3 -0
  494. package/src/interactive/turn-runtime.ts +11 -2
  495. package/src/interactive/turn-state.ts +10 -9
  496. package/src/interactive/watch-pane.ts +18 -4
  497. package/src/interactive/worker-stream.ts +7 -7
  498. package/src/tools/agent-tools.ts +6 -3
  499. package/src/tools/bash.ts +1 -1
  500. package/src/tools/builtin-tool-catalog.ts +9 -2
  501. package/src/tools/codewiki/code-nav.ts +4 -10
  502. package/src/tools/compete-judge-task.ts +71 -0
  503. package/src/tools/compete-worktrees.ts +34 -0
  504. package/src/tools/context/index.ts +32 -7
  505. package/src/tools/context/surface.ts +15 -4
  506. package/src/tools/decide.ts +1 -1
  507. package/src/tools/dispatch-admission.ts +12 -1
  508. package/src/tools/dispatch-arguments.ts +38 -1
  509. package/src/tools/dispatch-plan.ts +7 -7
  510. package/src/tools/dispatch-runner.ts +48 -32
  511. package/src/tools/dispatch-schema.ts +30 -23
  512. package/src/tools/dispatch-scout-admission.ts +10 -44
  513. package/src/tools/dispatch-scout.ts +2 -3
  514. package/src/tools/find.ts +13 -4
  515. package/src/tools/grep.ts +13 -1
  516. package/src/tools/ls.ts +7 -1
  517. package/src/tools/monitor.ts +26 -11
  518. package/src/tools/network-policy.ts +11 -24
  519. package/src/tools/observation.ts +39 -2
  520. package/src/tools/read.ts +112 -15
  521. package/src/tools/registry.ts +54 -17
  522. package/src/tools/result-shaping.ts +110 -2
  523. package/src/tools/tasks.ts +33 -7
  524. package/src/tools/verify/frontend.ts +67 -30
  525. package/src/tools/verify/numeric.ts +6 -1
  526. package/src/tools/web-fetch-network.ts +179 -0
  527. package/src/tools/web-fetch-surface.ts +2 -1
  528. package/src/tools/web-fetch.ts +15 -13
  529. package/src/tools/worker-evidence.ts +27 -0
  530. package/src/worker/spec-contract.ts +12 -8
  531. package/dist/builtins-WGALA46I.js +0 -22
  532. package/dist/chunk-2WZ546HR.js +0 -792
  533. package/dist/chunk-5PSMVOLM.js +0 -56
  534. package/dist/chunk-EL24TAU4.js +0 -1560
  535. package/dist/chunk-IZXGRF7P.js +0 -4048
  536. package/dist/chunk-JVCV3ICN.js +0 -47
  537. package/dist/chunk-MNJGS2IN.js +0 -33
  538. package/dist/chunk-O5CVSAG5.js +0 -122
  539. package/dist/chunk-ODGTEFFI.js +0 -50
  540. package/dist/chunk-OQE5J4C6.js +0 -73
  541. package/dist/chunk-UUVG37B4.js +0 -244
  542. package/dist/chunk-V6HJFQZE.js +0 -228
  543. package/dist/clio-QLICPCF5.js +0 -25
  544. package/dist/configure-VEPX4NMX.js +0 -55
  545. package/dist/context-clear-S4ZJCQUX.js +0 -182
  546. package/dist/detail-A7JAVSIG.js +0 -98
  547. package/dist/evidence-4F5USFKH.js +0 -208
  548. package/dist/fleet-view-MN2VG4MR.js +0 -101
  549. package/dist/inventory-C26CFDRR.js +0 -101
  550. package/dist/preload-P6DGH2PZ.js +0 -13
  551. package/dist/slash-commands-ZXPJD64J.js +0 -92
  552. package/dist/tasks-IPAGMEIX.js +0 -36
  553. package/dist/tools-EFFEAIDP.js +0 -28
  554. package/dist/verify-FWYGPKMR.js +0 -29
  555. 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
- `npm run skills:pin` writes two files. `registry.yaml` pins content hashes and
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. `npm run skills:check` fails if a skill's
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 `npm run
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, `npm run skills:check` fails on any
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
- `npm run skills:pin` enforces this contract structurally: it refuses to pin a
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. `npm run skills:check`
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
@@ -1,5 +1,5 @@
1
1
  # Pinned marketplace skill content hashes (provenance-stripped sha256).
2
- # Generated by `npm run skills:pin`. At activation, an installed skill
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:
@@ -1,5 +1,5 @@
1
1
  {
2
- "generatedBy": "npm run skills:pin",
2
+ "generatedBy": "pnpm run skills:pin",
3
3
  "skills": [
4
4
  {
5
5
  "name": "ast-grep",
@@ -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, readFileSync } from "node:fs";
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 { classifyProjectPreload } from "../domains/prompts/preload.js";
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 = classifyProjectPreload({ hasClioMd: promptContext.clioMd !== null, text: promptContext.text });
124
- for (const [index, file] of loaded.files.entries()) {
125
- const text = readFileSync(file.path, "utf8");
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: loaded.files.length === 1 ? "single" : "layer",
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: loaded.files.length,
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);
@@ -1,8 +1,10 @@
1
1
  import { execFileSync } from "node:child_process";
2
- import { mkdirSync, writeFileSync } from "node:fs";
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 { readCodewiki } from "../domains/context/codewiki/artifact.js";
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, and sources point at indexed files and lines.
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.length > 0 ? out : null;
34
+ return out;
32
35
  } catch {
33
36
  return null;
34
37
  }
35
38
  }
36
39
 
37
- /** The origin remote as an https URL and HEAD as a full sha, when git can say. */
38
- function repositoryFacts(cwd: string): { url: string; revision: string } | undefined {
39
- const remote = gitValue(cwd, ["remote", "get-url", "origin"]);
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
- if (!remote || !revision) return undefined;
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
- const codewiki = readCodewiki(cwd);
76
- if (!codewiki) {
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 seed = buildArchitectureSeed(codewiki, {
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: repositoryFacts(cwd),
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
- : "; no GitHub origin at a full revision, so no source citations"
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 ."
@@ -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.classifyProjectPreload({
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.stdout.write(
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.stdout.write(
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) throw new Error("report requires an eval id");
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 = await loadEvalArtifactV4(dataDir, parsed.evalId ?? "");
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) {