@iowarp/clio-coder 0.3.9 → 0.4.1

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 (733) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/NOTICE +33 -0
  3. package/README.md +121 -16
  4. package/dist/{acp-7LOELQFP.js → acp-ZILU3AUO.js} +19 -18
  5. package/dist/{agents-FIBG2SHA.js → agents-HYWGBGQR.js} +53 -39
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-OI4LIH2I.js → auth-N3QT7CBO.js} +24 -21
  8. package/dist/{builtins-AD25UL3C.js → builtins-UJLMOVOV.js} +6 -6
  9. package/dist/{chunk-I4HZDVNP.js → chunk-2LEAKD4C.js} +2 -3
  10. package/dist/{chunk-465CC7FK.js → chunk-2NM363SV.js} +60 -64
  11. package/dist/{chunk-4H6ULJ3H.js → chunk-2VG7KLYV.js} +1046 -1370
  12. package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
  13. package/dist/{chunk-NZU6YDNV.js → chunk-3I5NY75V.js} +5 -5
  14. package/dist/{chunk-47CMYGET.js → chunk-3QSOM6PA.js} +2 -2
  15. package/dist/chunk-42FMPA75.js +101 -0
  16. package/dist/{chunk-HAY4ZE2P.js → chunk-5PSMVOLM.js} +2 -2
  17. package/dist/{chunk-IHKBWSXF.js → chunk-5QIAJV2D.js} +3 -3
  18. package/dist/chunk-5YHDIDBP.js +97 -0
  19. package/dist/chunk-6CCS4G3W.js +1529 -0
  20. package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
  21. package/dist/{chunk-BVDVID7E.js → chunk-6FN3E6KX.js} +6 -6
  22. package/dist/{chunk-DG4M6ZUE.js → chunk-6HMJX2VU.js} +59 -59
  23. package/dist/{chunk-3MRC2YSQ.js → chunk-6I5ILFOF.js} +3 -2
  24. package/dist/chunk-6NJQITNH.js +1412 -0
  25. package/dist/chunk-6VC4OV3Z.js +365 -0
  26. package/dist/{chunk-LU7P4LHA.js → chunk-72GZI5EV.js} +2 -2
  27. package/dist/{chunk-5T7RBWN2.js → chunk-74YWRRU5.js} +9 -8
  28. package/dist/{chunk-VPTUJU4P.js → chunk-7EPLI7VL.js} +2 -2
  29. package/dist/{chunk-CA42X6KT.js → chunk-7OBGU7UB.js} +7 -7
  30. package/dist/{chunk-56KB5IJP.js → chunk-7PWAODYW.js} +3 -3
  31. package/dist/chunk-7RY5VZPH.js +573 -0
  32. package/dist/{chunk-OEDBCISO.js → chunk-ABLSQ6JX.js} +3 -3
  33. package/dist/{chunk-5HFBWUMU.js → chunk-AFKWHWXF.js} +13 -23
  34. package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
  35. package/dist/{chunk-WXCJ7VME.js → chunk-AKB4GYDL.js} +7 -7
  36. package/dist/chunk-AP73CFDC.js +308 -0
  37. package/dist/{chunk-4LJX2PUC.js → chunk-BBTJOK6Y.js} +5 -5
  38. package/dist/{chunk-QQ7EKM72.js → chunk-BDPT6GTK.js} +13 -61
  39. package/dist/chunk-BJGUKIG4.js +302 -0
  40. package/dist/chunk-BMS5RKQY.js +27 -0
  41. package/dist/{chunk-TD7UE2L5.js → chunk-BTGG6BG2.js} +81 -40
  42. package/dist/chunk-BTK3SSSK.js +67 -0
  43. package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
  44. package/dist/chunk-BWW4HLO4.js +301 -0
  45. package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
  46. package/dist/{chunk-HJB5IUKP.js → chunk-C537JADH.js} +18 -18
  47. package/dist/{chunk-774ILSRL.js → chunk-CDNVLKUX.js} +5 -4
  48. package/dist/{chunk-HPCTNZM2.js → chunk-CTJ4RNAA.js} +4 -4
  49. package/dist/{chunk-AEYBF3TB.js → chunk-CWVRRIEI.js} +2 -2
  50. package/dist/chunk-D4CJV46V.js +462 -0
  51. package/dist/chunk-D7E7WCDF.js +27 -0
  52. package/dist/{chunk-5PVQ4SRS.js → chunk-E67WX76H.js} +10 -126
  53. package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
  54. package/dist/chunk-EIMVLWB3.js +1842 -0
  55. package/dist/{chunk-AMKHQW3C.js → chunk-FEFIFZTL.js} +3 -3
  56. package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
  57. package/dist/{chunk-3DUR4WUA.js → chunk-FYUN5KZ3.js} +25 -25
  58. package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
  59. package/dist/chunk-GIZNH63R.js +40 -0
  60. package/dist/chunk-GPPB3JBE.js +688 -0
  61. package/dist/{chunk-B5XRQOLB.js → chunk-GVQJ5CCZ.js} +17 -11
  62. package/dist/chunk-HHV2GANA.js +88 -0
  63. package/dist/chunk-HJWWJ6IL.js +184 -0
  64. package/dist/{chunk-RKRLDWD3.js → chunk-HLW2MRKE.js} +1 -1
  65. package/dist/chunk-HRQMFLJP.js +75 -0
  66. package/dist/{chunk-AD7Y7STJ.js → chunk-HUAS7ITX.js} +107 -97
  67. package/dist/{chunk-O6I4CIEU.js → chunk-I66EAJFY.js} +6 -6
  68. package/dist/{chunk-S4COXYBG.js → chunk-IG7BCQBA.js} +129 -106
  69. package/dist/{chunk-N3PBVRTZ.js → chunk-IXJT6DCX.js} +9 -7
  70. package/dist/chunk-J4HBWF6Y.js +2635 -0
  71. package/dist/chunk-J5LZHVIT.js +284 -0
  72. package/dist/{chunk-GAYUJ7LE.js → chunk-JA5QWE4Z.js} +544 -227
  73. package/dist/{chunk-B5CSFE7B.js → chunk-JIEGK6UF.js} +6 -174
  74. package/dist/{chunk-VKBMFOYV.js → chunk-JZWT5J3Y.js} +23 -27
  75. package/dist/chunk-K6BF4U2H.js +1785 -0
  76. package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
  77. package/dist/{chunk-YSEHGPCT.js → chunk-MA3H6DM5.js} +6 -6
  78. package/dist/{chunk-EBOC7MT3.js → chunk-MOPSG2X7.js} +9 -9
  79. package/dist/{chunk-KV2AOLDF.js → chunk-MQXIVJ35.js} +18 -29
  80. package/dist/{chunk-P3JGPQFL.js → chunk-N5UK64DP.js} +4 -4
  81. package/dist/chunk-NDDGJUXD.js +81 -0
  82. package/dist/chunk-NEKRRTYW.js +56 -0
  83. package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
  84. package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
  85. package/dist/{chunk-T3Z6VAAF.js → chunk-OJTRZGR3.js} +53 -92
  86. package/dist/{chunk-5DQRIYDZ.js → chunk-PBP4B7XR.js} +3 -3
  87. package/dist/{chunk-NQ6UCCOD.js → chunk-PJJ6MY27.js} +8 -8
  88. package/dist/chunk-PMZCIOCJ.js +25 -0
  89. package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
  90. package/dist/{chunk-7C6RYZGQ.js → chunk-PVAMAVBB.js} +5 -4
  91. package/dist/chunk-QDC3K2U3.js +262 -0
  92. package/dist/{chunk-JEQQR47K.js → chunk-QKIFBZKT.js} +173 -14
  93. package/dist/{chunk-R7LNVMCS.js → chunk-QMXC4JB7.js} +70 -78
  94. package/dist/chunk-QSNYB6ZV.js +195 -0
  95. package/dist/chunk-QTFGO774.js +644 -0
  96. package/dist/{chunk-ODFEOB4F.js → chunk-R23Z6K6I.js} +27 -9
  97. package/dist/{chunk-3UUY7R3Z.js → chunk-R32CLGZ6.js} +14 -14
  98. package/dist/chunk-R346GLFC.js +31 -0
  99. package/dist/chunk-RKSR6VSF.js +132 -0
  100. package/dist/{chunk-N5XKWMDW.js → chunk-SCYB3HA4.js} +73 -27
  101. package/dist/{chunk-PZ4I4JE2.js → chunk-SINK3QR6.js} +135 -125
  102. package/dist/{chunk-5QKCQQ3E.js → chunk-SUW5DORT.js} +2 -2
  103. package/dist/chunk-T56WDKA5.js +183 -0
  104. package/dist/{chunk-ECUO3KDP.js → chunk-TD3PGPQA.js} +87 -26
  105. package/dist/{chunk-HKO36JWF.js → chunk-THYWACCR.js} +31 -3
  106. package/dist/{chunk-LXPJXFM5.js → chunk-TVH4ONAM.js} +18 -12
  107. package/dist/chunk-TVHHYFHE.js +255 -0
  108. package/dist/chunk-U2WB7TZS.js +271 -0
  109. package/dist/{chunk-NNNWO6F2.js → chunk-UAPGZHYC.js} +237 -33
  110. package/dist/{chunk-MIX5N5AC.js → chunk-UEDMSP56.js} +415 -160
  111. package/dist/{chunk-WIE7ZOSW.js → chunk-UXN6JT4W.js} +3 -3
  112. package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
  113. package/dist/{chunk-MV2VUEJC.js → chunk-VEGN6WIQ.js} +2 -2
  114. package/dist/chunk-VKFQTNDV.js +66 -0
  115. package/dist/{chunk-FALJGAWU.js → chunk-VKRH2TCS.js} +2 -2
  116. package/dist/{chunk-A2NJGIB3.js → chunk-VN3SHNBN.js} +2 -2
  117. package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
  118. package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
  119. package/dist/{chunk-EQ63NRB7.js → chunk-WNP7O5WZ.js} +3 -3
  120. package/dist/chunk-WR6U3OVP.js +45 -0
  121. package/dist/{chunk-TEO2TLVN.js → chunk-XKA2ICR3.js} +1051 -1196
  122. package/dist/{chunk-3V5AYSEQ.js → chunk-Y45G3AXC.js} +72 -65
  123. package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
  124. package/dist/chunk-YAKGTXEV.js +17 -0
  125. package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
  126. package/dist/{chunk-YW7UVM5V.js → chunk-ZAZB4JMW.js} +55 -11
  127. package/dist/{chunk-HCBCAYZU.js → chunk-ZJLUDYFY.js} +11 -11
  128. package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
  129. package/dist/{chunk-IFBNV6H6.js → chunk-ZW55JB7N.js} +3 -3
  130. package/dist/cli/index.js +48 -37
  131. package/dist/clio-IT3G3VQH.js +25 -0
  132. package/dist/{code-nav-LMW275PA.js → code-nav-RK6S7F6E.js} +8 -8
  133. package/dist/codewiki/build-worker.js +1 -1
  134. package/dist/{compile-cache-CVJMMODC.js → compile-cache-OQAVB7Y5.js} +3 -5
  135. package/dist/{components-ZFA3SAER.js → components-UBWCQSRW.js} +6 -6
  136. package/dist/{config-RXS5T3JT.js → config-3QZRWZJF.js} +73 -61
  137. package/dist/configure-FL7Y3KJF.js +54 -0
  138. package/dist/{context-MVOORGMF.js → context-5HE7ODYK.js} +61 -49
  139. package/dist/{context-I3BTOTCS.js → context-KYQFRVDC.js} +11 -11
  140. package/dist/{context-PALKKQYL.js → context-XNHL75JV.js} +43 -28
  141. package/dist/{context-clear-N2WOYZ2K.js → context-clear-N545L53A.js} +60 -48
  142. package/dist/{context-working-set-MIEVECVZ.js → context-working-set-QHKXSV2F.js} +15 -13
  143. package/dist/{dispatch-runner-VVA4SRRH.js → dispatch-runner-RGIE5PCT.js} +109 -72
  144. package/dist/{docs-7LQ23DLM.js → docs-5NAF6AU7.js} +7 -13
  145. package/dist/doctor-ZGPEGHIP.js +772 -0
  146. package/dist/{eval-IJ5VEZDJ.js → eval-GXLL44RD.js} +106 -86
  147. package/dist/eval-inventory-HBWSWQOK.js +315 -0
  148. package/dist/{evidence-L5APPXNV.js → evidence-HWLBRH3Q.js} +209 -51
  149. package/dist/{evolve-RGNKFJ52.js → evolve-FTZBMNVW.js} +57 -45
  150. package/dist/{extensions-7WYWUX5A.js → extensions-VHRBEID7.js} +7 -7
  151. package/dist/{fleet-6CNVBZZP.js → fleet-CKZHJWZJ.js} +215 -114
  152. package/dist/{fleet-commands-L2SXSYEI.js → fleet-commands-EXDXBMV6.js} +13 -12
  153. package/dist/fleet-decisions-OTHB6KRL.js +157 -0
  154. package/dist/{fleet-graph-2J3OOIPO.js → fleet-graph-YTEZUCUT.js} +20 -17
  155. package/dist/fleet-inspect-SS6YMDCK.js +445 -0
  156. package/dist/{fleet-preflight-CZRJ4JP5.js → fleet-preflight-PBY4VYOM.js} +6 -9
  157. package/dist/{fleet-validate-C5RI6DP7.js → fleet-validate-KMEM5L3S.js} +25 -20
  158. package/dist/fleet-verify-QD5M7E7Q.js +178 -0
  159. package/dist/fleet-view-WAMJYNDT.js +94 -0
  160. package/dist/{init-VBN2ACVA.js → init-5XQRBOFV.js} +79 -66
  161. package/dist/install-NKNG7KD4.js +13 -0
  162. package/dist/interop-34TVO25M.js +116 -0
  163. package/dist/{library-JHGUMLY2.js → library-3QY6KF57.js} +25 -21
  164. package/dist/{memory-K4OQIYWG.js → memory-L4UTIIIW.js} +59 -47
  165. package/dist/{models-2NCZUWDD.js → models-ZVX3QOWE.js} +47 -37
  166. package/dist/{monitor-MMVTJABD.js → monitor-CEKVSYTS.js} +67 -57
  167. package/dist/{orchestrator-ZKBPCHW6.js → orchestrator-77BAP6BC.js} +7633 -7699
  168. package/dist/panes-7STHOAUJ.js +103 -0
  169. package/dist/panes-SHAUIRXY.js +60 -0
  170. package/dist/{paths-DBXMZMDU.js → paths-L7LGY6RN.js} +6 -6
  171. package/dist/{reset-DD5JGOY3.js → reset-EOLM7GVE.js} +15 -14
  172. package/dist/resources-74GKTLSF.js +115 -0
  173. package/dist/{run-QEGNX7FL.js → run-HBAUJNNZ.js} +139 -98
  174. package/dist/{share-JKD3BQMW.js → share-G3APVLVP.js} +25 -21
  175. package/dist/{skills-LMQIKDOZ.js → skills-35HHUKCR.js} +37 -27
  176. package/dist/{skills-eval-I7X2774U.js → skills-eval-QN4HSHDC.js} +80 -73
  177. package/dist/skills-inventory-J357J34F.js +129 -0
  178. package/dist/slash-commands-JZZCQA32.js +79 -0
  179. package/dist/{steer-CF5TDANS.js → steer-XAVHJM22.js} +4 -4
  180. package/dist/{support-I7LOJLIF.js → support-U7QOWY26.js} +7 -7
  181. package/dist/{targets-RUSR6B5Z.js → targets-DSM6CY3M.js} +67 -59
  182. package/dist/{terminal-lease-QYVORFR4.js → terminal-lease-JOPFUVEM.js} +15 -10
  183. package/dist/tools-MKNWVPBH.js +29 -0
  184. package/dist/{trace-ODOQIVIW.js → trace-ECQ7TIYZ.js} +194 -7
  185. package/dist/tui-primitives-K5PASC3O.js +17 -0
  186. package/dist/{uninstall-ZJF5H5ZN.js → uninstall-N34PCTGJ.js} +6 -8
  187. package/dist/{upgrade-XANW3FXB.js → upgrade-H7TOM7YL.js} +37 -62
  188. package/dist/{usage-4H7ZRXQT.js → usage-X52N3IDJ.js} +70 -59
  189. package/dist/{verifiers-UZXNBZEB.js → verifiers-EJTVVSMA.js} +174 -14
  190. package/dist/{verify-BVKWTNDL.js → verify-YJL6XET2.js} +12 -11
  191. package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-MPIFL3LL.js} +3 -4
  192. package/dist/{wiki-generate-MY7WV2QI.js → wiki-generate-4NDZTQ4B.js} +86 -75
  193. package/dist/with-panes-OBOBFIIR.js +818 -0
  194. package/dist/worker/entry.js +131 -91
  195. package/docs/README.md +3 -2
  196. package/docs/acp.md +25 -4
  197. package/docs/alcf-provider.md +1 -1
  198. package/docs/architecture.md +2 -2
  199. package/docs/artifact-versions.md +4 -1
  200. package/docs/built-in-agents.md +40 -32
  201. package/docs/capacity-and-scheduling.md +43 -5
  202. package/docs/commands-and-modes.md +39 -4
  203. package/docs/config-knobs-audit.md +3 -0
  204. package/docs/configuration-and-targets.md +138 -167
  205. package/docs/context-engine.md +1 -1
  206. package/docs/development-pipeline.md +19 -0
  207. package/docs/dispatch-typed-intent.md +385 -0
  208. package/docs/documentation-coverage.md +2 -2
  209. package/docs/documentation-guide.md +1 -1
  210. package/docs/environment-variables.md +3 -1
  211. package/docs/eval-runner.md +1 -1
  212. package/docs/evals-internal.md +1 -1
  213. package/docs/evidence-and-memory.md +2 -2
  214. package/docs/evolution.md +1 -1
  215. package/docs/exit-codes-and-output.md +3 -1
  216. package/docs/extensions-and-sharing.md +25 -1
  217. package/docs/fleet-demo-runbook.md +6 -3
  218. package/docs/fleet-dispatch.md +30 -7
  219. package/docs/installation-and-lifecycle.md +16 -3
  220. package/docs/middleware-and-components.md +1 -1
  221. package/docs/model-catalog.md +10 -1
  222. package/docs/observability.md +3 -3
  223. package/docs/proactive-memory.md +1 -1
  224. package/docs/prompt-envelope-and-tools.md +1 -1
  225. package/docs/provider-adapter-cookbook.md +1 -1
  226. package/docs/release-cut-checklist.md +164 -177
  227. package/docs/safety-model.md +2 -2
  228. package/docs/scientific-validation.md +3 -3
  229. package/docs/session-lifecycle.md +1 -1
  230. package/docs/skills-marketplace.md +1 -1
  231. package/docs/tool-usage.md +18 -8
  232. package/docs/trace-store.md +16 -11
  233. package/docs/troubleshooting.md +2 -2
  234. package/docs/tui-design.md +1 -1
  235. package/docs/worker-dispatch-mechanics.md +1 -1
  236. package/evals/README.md +5 -0
  237. package/evals/behavioral-corpus-grader.mjs +103 -0
  238. package/evals/behavioral-machinery-baseline.json +2276 -0
  239. package/evals/behavioral-machinery-driver.ts +250 -0
  240. package/evals/behavioral-machinery-support.ts +253 -0
  241. package/evals/behavioral-machinery.yaml +614 -0
  242. package/evals/behavioral-model-negative-control.yaml +68 -0
  243. package/evals/behavioral-model.yaml +216 -0
  244. package/evals/fixtures/behavioral-facts.txt +3 -0
  245. package/evals/fixtures/behavioral-main.ts +7 -0
  246. package/evals/fixtures/decoy/note.txt +2 -0
  247. package/evals/fixtures/private/credentials.txt +1 -0
  248. package/evals/tracked-metrics-baseline.yaml +229 -0
  249. package/evals/tracked-metrics-grader.mjs +129 -0
  250. package/package.json +8 -16
  251. package/skills/README.md +6 -6
  252. package/skills/coding/ast-grep/SKILL.md +8 -2
  253. package/skills/coding/coding-standards/SKILL.md +8 -2
  254. package/skills/coding/prototype/SKILL.md +8 -2
  255. package/skills/coding/tdd/SKILL.md +8 -2
  256. package/skills/context/context-handoff/SKILL.md +12 -3
  257. package/skills/context/context-handoff/evals.md +3 -3
  258. package/skills/context/context-prime/SKILL.md +8 -2
  259. package/skills/context/context-prime/evals.md +2 -2
  260. package/skills/git/file-ticket/SKILL.md +9 -4
  261. package/skills/git/file-ticket/evals.md +2 -2
  262. package/skills/git/fix-issue/SKILL.md +12 -5
  263. package/skills/git/fix-issue/evals.md +4 -4
  264. package/skills/git/resolve-merge-conflicts/SKILL.md +8 -2
  265. package/skills/git/resolve-merge-conflicts/evals.md +2 -2
  266. package/skills/git/ship/SKILL.md +9 -3
  267. package/skills/git/ship/evals.md +4 -4
  268. package/skills/git/worktree-create/SKILL.md +7 -2
  269. package/skills/git/worktree-create/evals.md +6 -6
  270. package/skills/git/worktree-merge/SKILL.md +7 -2
  271. package/skills/git/worktree-merge/evals.md +6 -6
  272. package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
  273. package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
  274. package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
  275. package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
  276. package/skills/meta/credentials/SKILL.md +9 -2
  277. package/skills/meta/find-skills/SKILL.md +8 -2
  278. package/skills/meta/herdr/SKILL.md +8 -2
  279. package/skills/meta/skill-craft/SKILL.md +21 -4
  280. package/skills/planning/architecture/SKILL.md +9 -3
  281. package/skills/planning/backlog/SKILL.md +8 -2
  282. package/skills/planning/prd/SKILL.md +8 -2
  283. package/skills/planning/product-intent/SKILL.md +8 -2
  284. package/skills/planning/tech-spec/SKILL.md +9 -3
  285. package/skills/registry.yaml +66 -66
  286. package/skills/research/arxiv-literature/SKILL.md +8 -2
  287. package/skills/research/experiment-protocol/SKILL.md +9 -2
  288. package/skills/research/scientific-debugging/SKILL.md +9 -2
  289. package/skills/research/scientific-debugging/evals.md +2 -2
  290. package/skills/research/scientific-modernization/SKILL.md +9 -2
  291. package/skills/skill-marketplace.json +257 -38
  292. package/skills/workflow/cut-it/SKILL.md +10 -2
  293. package/skills/workflow/design-council/SKILL.md +11 -2
  294. package/skills/workflow/grill-me/SKILL.md +8 -2
  295. package/skills/workflow/workflow-distiller/SKILL.md +8 -2
  296. package/src/cli/acp.ts +8 -4
  297. package/src/cli/argv.ts +25 -0
  298. package/src/cli/auth.ts +2 -2
  299. package/src/cli/bootstrap-generate.ts +5 -5
  300. package/src/cli/clio.ts +6 -1
  301. package/src/cli/config-inspect.ts +3 -3
  302. package/src/cli/configure-interop.ts +1 -1
  303. package/src/cli/configure.ts +50 -48
  304. package/src/cli/default-target.ts +1 -1
  305. package/src/cli/docs.ts +6 -6
  306. package/src/cli/doctor-naming.ts +323 -0
  307. package/src/cli/doctor-panes.ts +156 -0
  308. package/src/cli/doctor-toolchain.ts +78 -0
  309. package/src/cli/doctor.ts +34 -1
  310. package/src/cli/eval-inventory.ts +436 -0
  311. package/src/cli/eval.ts +13 -0
  312. package/src/cli/evidence-detail.ts +88 -0
  313. package/src/cli/evidence-inventory.ts +183 -0
  314. package/src/cli/evidence.ts +30 -5
  315. package/src/cli/fleet-decisions.ts +69 -0
  316. package/src/cli/fleet-inspect.ts +334 -0
  317. package/src/cli/fleet-preflight.ts +1 -1
  318. package/src/cli/fleet-verify.ts +133 -0
  319. package/src/cli/fleet-view.ts +827 -0
  320. package/src/cli/fleet.ts +154 -40
  321. package/src/cli/index.ts +14 -2
  322. package/src/cli/interop-inspect.ts +128 -0
  323. package/src/cli/interop.ts +34 -0
  324. package/src/cli/models.ts +3 -3
  325. package/src/cli/modes/print.ts +1 -1
  326. package/src/cli/panes.ts +35 -0
  327. package/src/cli/reset.ts +6 -3
  328. package/src/cli/run.ts +67 -13
  329. package/src/cli/share.ts +1 -1
  330. package/src/cli/skills-eval.ts +11 -11
  331. package/src/cli/skills-inventory.ts +185 -0
  332. package/src/cli/skills.ts +16 -13
  333. package/src/cli/targets.ts +23 -24
  334. package/src/cli/tools.ts +321 -0
  335. package/src/cli/trace-inspect.ts +252 -0
  336. package/src/cli/trace.ts +64 -2
  337. package/src/cli/uninstall.ts +2 -2
  338. package/src/cli/upgrade.ts +29 -34
  339. package/src/cli/usage.ts +2 -2
  340. package/src/cli/validate-model.ts +1 -1
  341. package/src/cli/verifiers-inspect.ts +347 -0
  342. package/src/cli/verifiers.ts +9 -0
  343. package/src/cli/wiki-generate.ts +5 -5
  344. package/src/core/bash-exec.ts +1 -1
  345. package/src/core/boot-trace.ts +3 -3
  346. package/src/core/bus-events.ts +4 -0
  347. package/src/core/bus-trace.ts +2 -2
  348. package/src/core/compile-cache.ts +1 -1
  349. package/src/core/config.ts +1070 -845
  350. package/src/core/defaults.ts +342 -463
  351. package/src/core/domain-loader.ts +6 -4
  352. package/src/core/event-bus.ts +1 -1
  353. package/src/core/file-references.ts +78 -88
  354. package/src/core/git-commit-attribution.ts +3 -9
  355. package/src/core/guardrails.ts +24 -4
  356. package/src/core/naming-compat.ts +45 -0
  357. package/src/core/naming-events.ts +62 -0
  358. package/src/core/recent-models.ts +1 -7
  359. package/src/core/residency-protection.ts +4 -8
  360. package/src/core/resolve-config-value.ts +1 -1
  361. package/src/core/response-model-id.ts +0 -14
  362. package/src/core/response-schema.ts +44 -4
  363. package/src/core/session-routing.ts +84 -74
  364. package/src/core/skill-activation.ts +18 -0
  365. package/src/core/termination.ts +4 -4
  366. package/src/core/theme-token-hex.ts +43 -0
  367. package/src/core/timers.ts +2 -12
  368. package/src/core/tool-names.ts +2 -1
  369. package/src/core/xdg.ts +1 -1
  370. package/src/domains/agents/catalog.ts +2 -12
  371. package/src/domains/agents/extension.ts +3 -3
  372. package/src/domains/agents/fleets/build-review.md +0 -3
  373. package/src/domains/agents/fleets/build-test.md +0 -3
  374. package/src/domains/agents/registry.ts +7 -7
  375. package/src/domains/agents/result-contract-filesystem.ts +32 -0
  376. package/src/domains/agents/result-contract.ts +165 -36
  377. package/src/domains/agents/spec.ts +0 -11
  378. package/src/domains/config/classify.ts +37 -46
  379. package/src/domains/config/extension.ts +5 -5
  380. package/src/domains/config/keybindings.ts +48 -47
  381. package/src/domains/config/watcher.ts +1 -1
  382. package/src/domains/context/codewiki/indexer.ts +1 -1
  383. package/src/domains/context/extension.ts +3 -3
  384. package/src/domains/context/prompt-context.ts +1 -1
  385. package/src/domains/context/wiki/assemble.ts +2 -2
  386. package/src/domains/context/working-set/replay/metrics.ts +0 -4
  387. package/src/domains/context/working-set/replay/report.ts +1 -1
  388. package/src/domains/context/working-set/replay/synthetic.ts +2 -2
  389. package/src/domains/dispatch/active-route-planner.ts +2 -2
  390. package/src/domains/dispatch/admission-error.ts +9 -0
  391. package/src/domains/dispatch/admission.ts +22 -21
  392. package/src/domains/dispatch/agent-candidates.ts +1 -1
  393. package/src/domains/dispatch/agent-ledger-store.ts +1 -1
  394. package/src/domains/dispatch/agent-ledger.ts +1 -1
  395. package/src/domains/dispatch/assignment.ts +5 -5
  396. package/src/domains/dispatch/capacity-lease.ts +23 -6
  397. package/src/domains/dispatch/code-step.ts +1 -1
  398. package/src/domains/dispatch/contract.ts +2 -2
  399. package/src/domains/dispatch/council-topology.ts +398 -0
  400. package/src/domains/dispatch/extension.ts +287 -111
  401. package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
  402. package/src/domains/dispatch/fleet-plan.ts +7 -2
  403. package/src/domains/dispatch/fleet-preflight.ts +8 -17
  404. package/src/domains/dispatch/fleet-run.ts +59 -3
  405. package/src/domains/dispatch/gate-decisions.ts +36 -15
  406. package/src/domains/dispatch/gate-role-prompts.ts +9 -0
  407. package/src/domains/dispatch/gate-topology.ts +289 -0
  408. package/src/domains/dispatch/index.ts +19 -0
  409. package/src/domains/dispatch/intent-compatibility.ts +330 -0
  410. package/src/domains/dispatch/intent.ts +85 -1
  411. package/src/domains/dispatch/joint-route-resolver.ts +1 -1
  412. package/src/domains/dispatch/path-scope.ts +0 -61
  413. package/src/domains/dispatch/placement.ts +2 -2
  414. package/src/domains/dispatch/receipt-findings.ts +1 -1
  415. package/src/domains/dispatch/receipt-integrity.ts +20 -8
  416. package/src/domains/dispatch/reservation-store.ts +24 -27
  417. package/src/domains/dispatch/route-decision.ts +1 -1
  418. package/src/domains/dispatch/route-history.ts +1 -1
  419. package/src/domains/dispatch/route-policy.ts +1 -1
  420. package/src/domains/dispatch/route-readiness.ts +0 -28
  421. package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
  422. package/src/domains/dispatch/run-event-journal.ts +599 -0
  423. package/src/domains/dispatch/state.ts +45 -1
  424. package/src/domains/dispatch/tool-stats.ts +1 -1
  425. package/src/domains/dispatch/transport.ts +2 -19
  426. package/src/domains/dispatch/types.ts +16 -3
  427. package/src/domains/dispatch/validation.ts +33 -8
  428. package/src/domains/dispatch/worker-protocol.ts +2 -2
  429. package/src/domains/eval/artifacts/store.ts +5 -4
  430. package/src/domains/eval/compare/compare.ts +3 -16
  431. package/src/domains/eval/compare/thresholds.ts +0 -8
  432. package/src/domains/eval/execution-provenance.ts +1 -1
  433. package/src/domains/eval/inventory.ts +113 -0
  434. package/src/domains/eval/metrics/token-stream.ts +0 -7
  435. package/src/domains/eval/report.ts +1 -1
  436. package/src/domains/eval/runner.ts +1 -1
  437. package/src/domains/eval/runners/clio-run.ts +7 -6
  438. package/src/domains/eval/runners/external-command.ts +4 -3
  439. package/src/domains/eval/schema/artifact.ts +1 -1
  440. package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
  441. package/src/domains/eval/schema/behavioral.ts +7 -6
  442. package/src/domains/eval/schema/execution-envelope.ts +4 -2
  443. package/src/domains/eval/schema/naming.ts +10 -0
  444. package/src/domains/eval/schema/serving.ts +31 -0
  445. package/src/domains/eval/schema/suite.ts +2 -2
  446. package/src/domains/eval/schema/validate.ts +9 -5
  447. package/src/domains/eval/schema/verdict.ts +4 -2
  448. package/src/domains/eval/store.ts +12 -2
  449. package/src/domains/eval/suites/run.ts +12 -6
  450. package/src/domains/eval/types.ts +1 -1
  451. package/src/domains/eval/workspaces/git.ts +1 -1
  452. package/src/domains/eval/workspaces/temp-copy.ts +1 -1
  453. package/src/domains/evidence/build.ts +13 -5
  454. package/src/domains/evidence/store.ts +6 -0
  455. package/src/domains/interop/consent.ts +7 -7
  456. package/src/domains/interop/extension.ts +1 -1
  457. package/src/domains/lifecycle/doctor.ts +27 -21
  458. package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
  459. package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
  460. package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
  461. package/src/domains/lifecycle/migrations/index.ts +20 -1
  462. package/src/domains/lifecycle/naming-history.ts +153 -0
  463. package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
  464. package/src/domains/lifecycle/naming-resources.ts +261 -0
  465. package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
  466. package/src/domains/lifecycle/naming-yazi.ts +81 -0
  467. package/src/domains/lifecycle/upgrade-notice.ts +1 -1
  468. package/src/domains/memory/index.ts +0 -1
  469. package/src/domains/memory/task-memory-handoff.ts +6 -3
  470. package/src/domains/memory/task-memory-policy.ts +6 -10
  471. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  472. package/src/domains/middleware/index.ts +7 -0
  473. package/src/domains/middleware/marketplace-offer.ts +339 -0
  474. package/src/domains/middleware/memory-intervention.ts +33 -21
  475. package/src/domains/middleware/runtime.ts +2 -2
  476. package/src/domains/mux/contract.ts +566 -0
  477. package/src/domains/mux/detect.ts +182 -0
  478. package/src/domains/mux/dock-controller.ts +365 -0
  479. package/src/domains/mux/extension.ts +53 -0
  480. package/src/domains/mux/index.ts +116 -0
  481. package/src/domains/mux/manifest.ts +6 -0
  482. package/src/domains/mux/operations.ts +192 -0
  483. package/src/domains/mux/pane-registry.ts +90 -0
  484. package/src/domains/mux/protocol.ts +62 -0
  485. package/src/domains/mux/socket-client.ts +964 -0
  486. package/src/domains/mux/types.ts +265 -0
  487. package/src/domains/mux/viewer-command.ts +59 -0
  488. package/src/domains/mux/yazi/assets/init.lua +2 -0
  489. package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
  490. package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
  491. package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
  492. package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
  493. package/src/domains/mux/yazi/assets/yazi.toml +17 -0
  494. package/src/domains/mux/yazi/event-stream.ts +182 -0
  495. package/src/domains/mux/yazi/profile.ts +299 -0
  496. package/src/domains/mux/yazi/session.ts +251 -0
  497. package/src/domains/mux/yazi/theme.ts +30 -0
  498. package/src/domains/observability/cost.ts +21 -0
  499. package/src/domains/observability/extension.ts +1 -1
  500. package/src/domains/observability/index.ts +2 -0
  501. package/src/domains/observability/out-of-turn-usage.ts +2 -2
  502. package/src/domains/observability/projection.ts +1 -1
  503. package/src/domains/observability/trace-store.ts +63 -11
  504. package/src/domains/prompts/compiler.ts +2 -2
  505. package/src/domains/prompts/extension.ts +3 -3
  506. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
  507. package/src/domains/prompts/fragments/operating/skills.md +25 -18
  508. package/src/domains/providers/endpoint-capacity.ts +154 -22
  509. package/src/domains/providers/endpoint-slots-store.ts +189 -0
  510. package/src/domains/providers/extension.ts +25 -8
  511. package/src/domains/providers/index.ts +22 -0
  512. package/src/domains/providers/knowledge-base-path.ts +1 -1
  513. package/src/domains/providers/model-runtime-capabilities.ts +46 -2
  514. package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
  515. package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +4 -4
  516. package/src/domains/providers/plugins.ts +1 -1
  517. package/src/domains/providers/resolver.ts +1 -1
  518. package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
  519. package/src/domains/providers/runtimes/builtins.ts +2 -0
  520. package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
  521. package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
  522. package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
  523. package/src/domains/providers/runtimes/common/probe-helpers.ts +2 -2
  524. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  525. package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
  526. package/src/domains/providers/runtimes/protocol/litellm.ts +285 -0
  527. package/src/domains/providers/support.ts +1 -0
  528. package/src/domains/providers/target-model-cache.ts +124 -0
  529. package/src/domains/providers/types/knowledge-base.ts +13 -0
  530. package/src/domains/providers/types/local-model-quirks.ts +2 -2
  531. package/src/domains/providers/types/target-descriptor.ts +3 -3
  532. package/src/domains/resources/extension.ts +1 -1
  533. package/src/domains/resources/index.ts +3 -0
  534. package/src/domains/resources/library.ts +6 -6
  535. package/src/domains/resources/prompts/loader.ts +1 -1
  536. package/src/domains/resources/skills/content-hash.ts +7 -6
  537. package/src/domains/resources/skills/evals.ts +1 -1
  538. package/src/domains/resources/skills/install.ts +36 -12
  539. package/src/domains/resources/skills/loader.ts +72 -13
  540. package/src/domains/resources/skills/marketplace.ts +21 -2
  541. package/src/domains/resources/skills/promotion.ts +214 -0
  542. package/src/domains/safety/action-classifier.ts +6 -0
  543. package/src/domains/safety/audit.ts +2 -2
  544. package/src/domains/safety/finish-contract.ts +2 -1
  545. package/src/domains/safety/run-effects.ts +1 -1
  546. package/src/domains/scheduling/extension.ts +4 -4
  547. package/src/domains/session/archive-readers.ts +9 -1
  548. package/src/domains/session/compaction/branch-summary.ts +4 -0
  549. package/src/domains/session/compaction/compact.ts +1 -1
  550. package/src/domains/session/compaction/tokens.ts +4 -0
  551. package/src/domains/session/context-accounting.ts +1 -1
  552. package/src/domains/session/decision-board.ts +1 -1
  553. package/src/domains/session/extension.ts +1 -1
  554. package/src/domains/session/handoff.ts +2 -2
  555. package/src/domains/session/prompt-manifest.ts +0 -5
  556. package/src/domains/session/protected-artifact-journal.ts +12 -6
  557. package/src/domains/session/retry.ts +1 -1
  558. package/src/domains/share/archive.ts +85 -36
  559. package/src/domains/toolchain/archive.ts +175 -0
  560. package/src/domains/toolchain/contract.ts +28 -0
  561. package/src/domains/toolchain/extension.ts +47 -0
  562. package/src/domains/toolchain/index.ts +39 -0
  563. package/src/domains/toolchain/install.ts +327 -0
  564. package/src/domains/toolchain/manifest.ts +8 -0
  565. package/src/domains/toolchain/paths.ts +34 -0
  566. package/src/domains/toolchain/registry.ts +265 -0
  567. package/src/domains/toolchain/remove.ts +218 -0
  568. package/src/domains/toolchain/resolve.ts +182 -0
  569. package/src/domains/toolchain/types.ts +113 -0
  570. package/src/domains/toolchain/version.ts +88 -0
  571. package/src/engine/acp/adapter.ts +3 -3
  572. package/src/engine/acp/event-mapper.ts +3 -3
  573. package/src/engine/acp/server.ts +440 -96
  574. package/src/engine/acp/tool-mediator.ts +2 -2
  575. package/src/engine/acp/types.ts +20 -2
  576. package/src/engine/alcf-oauth.ts +5 -5
  577. package/src/engine/antigravity/subprocess-runtime.ts +2 -2
  578. package/src/engine/api-registry.ts +1 -1
  579. package/src/engine/apis/llamacpp-residency.ts +1 -19
  580. package/src/engine/apis/lmstudio.ts +1 -6
  581. package/src/engine/apis/ollama-native.ts +3 -3
  582. package/src/engine/apis/openai-completions.ts +2 -2
  583. package/src/engine/apis/residency.ts +3 -9
  584. package/src/engine/claude/sdk-module.ts +87 -0
  585. package/src/engine/claude/sdk-runtime.ts +25 -17
  586. package/src/engine/claude/subprocess-runtime.ts +1 -1
  587. package/src/engine/claude/tool-safety.ts +4 -4
  588. package/src/engine/loop-guard.ts +0 -5
  589. package/src/engine/session.ts +14 -7
  590. package/src/engine/tui-primitives.ts +21 -0
  591. package/src/engine/tui.ts +1 -0
  592. package/src/engine/worker-events.ts +6 -6
  593. package/src/engine/worker-runtime.ts +16 -26
  594. package/src/entry/boot-options.ts +2 -0
  595. package/src/entry/orchestrator.ts +207 -90
  596. package/src/entry/panes-activation.ts +31 -0
  597. package/src/entry/with-panes.ts +20 -0
  598. package/src/interactive/application-controller.ts +21 -21
  599. package/src/interactive/bus-notices.ts +2 -2
  600. package/src/interactive/chat-loop.ts +8 -8
  601. package/src/interactive/chat-panel.ts +1 -1
  602. package/src/interactive/clio-editor.ts +105 -1
  603. package/src/interactive/context-activity.ts +8 -6
  604. package/src/interactive/context-meter.ts +3 -6
  605. package/src/interactive/context-overlay.ts +2 -1
  606. package/src/interactive/cost-overlay.ts +3 -1
  607. package/src/interactive/council-grid.ts +3 -5
  608. package/src/interactive/council.ts +11 -0
  609. package/src/interactive/dispatch-board.ts +56 -49
  610. package/src/interactive/editor-bash.ts +21 -0
  611. package/src/interactive/editor-steer.ts +9 -4
  612. package/src/interactive/editor-submit.ts +24 -18
  613. package/src/interactive/external-editor.ts +1 -1
  614. package/src/interactive/file-reference-completion.ts +360 -0
  615. package/src/interactive/footer/dashboard.ts +15 -17
  616. package/src/interactive/footer/notifications.ts +14 -8
  617. package/src/interactive/footer/widgets.ts +2 -44
  618. package/src/interactive/interactive-application.ts +229 -62
  619. package/src/interactive/interactive-event-projection.ts +1 -1
  620. package/src/interactive/interactive-input-runtime.ts +9 -2
  621. package/src/interactive/interactive-presentation.ts +21 -16
  622. package/src/interactive/interactive-shell.ts +2 -2
  623. package/src/interactive/interactive-slash-runtime.ts +99 -23
  624. package/src/interactive/interactive-subscriptions.ts +1 -1
  625. package/src/interactive/interactive-tickers.ts +1 -1
  626. package/src/interactive/keybinding-manager.ts +4 -4
  627. package/src/interactive/layout.ts +1 -1
  628. package/src/interactive/memory-overlay.ts +3 -2
  629. package/src/interactive/modal-marker.ts +151 -0
  630. package/src/interactive/mutation-preview.ts +1 -1
  631. package/src/interactive/mux-bridge.ts +214 -0
  632. package/src/interactive/overlay-frame.ts +62 -14
  633. package/src/interactive/overlay-general-openers.ts +7 -2
  634. package/src/interactive/overlay-key-routing.ts +21 -10
  635. package/src/interactive/overlay-lifecycle.ts +20 -4
  636. package/src/interactive/overlay-model-selectors.ts +43 -6
  637. package/src/interactive/overlay-permission-lifecycle.ts +90 -22
  638. package/src/interactive/overlay-transitions.ts +18 -4
  639. package/src/interactive/overlays/agents.ts +3 -2
  640. package/src/interactive/overlays/ask-user.ts +161 -41
  641. package/src/interactive/overlays/auth-dialog.ts +1 -0
  642. package/src/interactive/overlays/context-reset.ts +29 -4
  643. package/src/interactive/overlays/cwd-fallback.ts +29 -4
  644. package/src/interactive/overlays/decisions.ts +15 -13
  645. package/src/interactive/overlays/extensions.ts +1 -0
  646. package/src/interactive/overlays/fleet-run-approval.ts +4 -3
  647. package/src/interactive/overlays/handoff-review.ts +3 -2
  648. package/src/interactive/overlays/help-reference.ts +2 -0
  649. package/src/interactive/overlays/interop.ts +2 -1
  650. package/src/interactive/overlays/library-install-confirm.ts +2 -1
  651. package/src/interactive/overlays/library-tabs.ts +28 -0
  652. package/src/interactive/overlays/list-overlay.ts +10 -1
  653. package/src/interactive/overlays/message-picker.ts +2 -1
  654. package/src/interactive/overlays/model-scope.ts +86 -0
  655. package/src/interactive/overlays/model-selector.ts +40 -31
  656. package/src/interactive/overlays/prompts.ts +11 -4
  657. package/src/interactive/overlays/session-selector.ts +3 -2
  658. package/src/interactive/overlays/settings-sections.ts +30 -0
  659. package/src/interactive/overlays/settings.ts +849 -268
  660. package/src/interactive/overlays/side-question.ts +3 -2
  661. package/src/interactive/overlays/skills-hub.ts +11 -19
  662. package/src/interactive/overlays/tree-selector.ts +3 -2
  663. package/src/interactive/pane-policy.ts +46 -0
  664. package/src/interactive/panes-runtime.ts +318 -0
  665. package/src/interactive/permission-overlay.ts +2 -2
  666. package/src/interactive/renderers/compaction-summary.ts +29 -0
  667. package/src/interactive/renderers/retry-status.ts +12 -4
  668. package/src/interactive/renderers/tool-execution.ts +4 -4
  669. package/src/interactive/renderers/worker-entry.ts +122 -14
  670. package/src/interactive/session-transcript.ts +3 -3
  671. package/src/interactive/slash-autocomplete.ts +454 -165
  672. package/src/interactive/slash-commands.ts +521 -189
  673. package/src/interactive/slash-spec.ts +160 -17
  674. package/src/interactive/status/controller.ts +2 -2
  675. package/src/interactive/stream-pacing-policy.ts +1 -1
  676. package/src/interactive/tasks-overlay.ts +21 -13
  677. package/src/interactive/terminal-lease.ts +6 -7
  678. package/src/interactive/theme/tokens.ts +3 -14
  679. package/src/interactive/turn-context.ts +58 -13
  680. package/src/interactive/turn-persistence.ts +2 -2
  681. package/src/interactive/turn-prewarm.ts +2 -2
  682. package/src/interactive/turn-runtime.ts +8 -8
  683. package/src/interactive/turn-state.ts +1 -1
  684. package/src/interactive/view/artifacts.ts +120 -9
  685. package/src/interactive/view/view-overlay.ts +14 -10
  686. package/src/interactive/watch-pane.ts +180 -0
  687. package/src/interactive/welcome-dashboard.ts +15 -15
  688. package/src/interactive/worker-progress.ts +11 -5
  689. package/src/interactive/worker-receipts.ts +20 -2
  690. package/src/interactive/worker-stream.ts +6 -4
  691. package/src/interactive/yazi-bridge.ts +451 -0
  692. package/src/tools/ask-user.ts +3 -3
  693. package/src/tools/bash.ts +1 -1
  694. package/src/tools/bootstrap.ts +26 -2
  695. package/src/tools/builtin-tool-catalog.ts +16 -1
  696. package/src/tools/compete-worktrees.ts +108 -17
  697. package/src/tools/context/index.ts +15 -1
  698. package/src/tools/core-bootstrap.ts +2 -1
  699. package/src/tools/dispatch-admission.ts +18 -5
  700. package/src/tools/dispatch-arguments.ts +21 -21
  701. package/src/tools/dispatch-plan.ts +0 -11
  702. package/src/tools/dispatch-run-events.ts +145 -28
  703. package/src/tools/dispatch-runner.ts +40 -13
  704. package/src/tools/dispatch-types.ts +15 -3
  705. package/src/tools/dispatch.ts +2 -2
  706. package/src/tools/executables.ts +17 -14
  707. package/src/tools/find.ts +1 -6
  708. package/src/tools/monitor.ts +4 -4
  709. package/src/tools/observation.ts +54 -4
  710. package/src/tools/observers.ts +0 -33
  711. package/src/tools/panes-surface.ts +38 -0
  712. package/src/tools/panes.ts +112 -0
  713. package/src/tools/policy.ts +10 -1
  714. package/src/tools/presentation.ts +1 -0
  715. package/src/tools/task-worktree.ts +28 -7
  716. package/src/tools/verify/authoring.ts +3 -6
  717. package/src/tools/verify/frontend.ts +1 -1
  718. package/src/tools/web-fetch.ts +1 -1
  719. package/src/worker/entry.ts +4 -3
  720. package/src/worker/protocol.ts +16 -14
  721. package/src/worker/spec-contract.ts +2 -2
  722. package/src/worker/stdin-demux.ts +2 -2
  723. package/dist/chunk-D73KXYPF.js +0 -37
  724. package/dist/chunk-MLOK6ZOS.js +0 -2888
  725. package/dist/chunk-PNY46YEY.js +0 -1581
  726. package/dist/chunk-XDOQXGFO.js +0 -515
  727. package/dist/chunk-YKOFT37S.js +0 -279
  728. package/dist/clio-LT5V7SSZ.js +0 -26
  729. package/dist/configure-2WYWSCSD.js +0 -49
  730. package/dist/doctor-TWBWFK5V.js +0 -165
  731. package/src/engine/apis/degraded-inference.ts +0 -95
  732. /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
  733. /package/skills/meta/{clio-test → clio-coder-test}/references/test-map.md +0 -0
@@ -365,7 +365,7 @@ async function recordHeadlessMainAgentReceipt(input: {
365
365
  staticCompositionHash: snapshot.staticCompositionHash,
366
366
  promptSignature: snapshot.promptSignature,
367
367
  toolSignature: snapshot.toolSignature,
368
- clioVersion: readClioVersion(),
368
+ clioCoderVersion: readClioVersion(),
369
369
  piMonoVersion: readPiMonoVersion(),
370
370
  platform: process.platform,
371
371
  nodeVersion: process.version,
@@ -0,0 +1,35 @@
1
+ import { printError } from "./shared.js";
2
+ import { runToolsCommand } from "./tools.js";
3
+
4
+ const HELP = `clio-coder panes install [--force] [--json]
5
+
6
+ Install the pane multiplexer Clio drives. This is an alias for
7
+ \`clio-coder tools install herdr\`; the toolchain command is where every pinned
8
+ external program is managed, and \`clio-coder tools status herdr\` explains
9
+ which copy Clio would run.
10
+ `;
11
+
12
+ /**
13
+ * The user-facing verb for the pane layer's one setup step.
14
+ *
15
+ * Panes are the feature; herdr is the program behind it. Naming the program in
16
+ * a command an operator types is a leak, so the alias exists and routes to the
17
+ * generic installer rather than the reverse.
18
+ */
19
+ export async function runPanesCommand(argv: ReadonlyArray<string> = []): Promise<number> {
20
+ if (argv.includes("--help") || argv.includes("-h")) {
21
+ process.stdout.write(HELP);
22
+ return 0;
23
+ }
24
+ const [subcommand, ...rest] = argv;
25
+ if (subcommand === undefined) {
26
+ process.stdout.write(HELP);
27
+ return 2;
28
+ }
29
+ if (subcommand !== "install") {
30
+ printError(`unknown panes command: ${subcommand}`);
31
+ process.stderr.write(HELP);
32
+ return 2;
33
+ }
34
+ return runToolsCommand(["install", "herdr", ...rest]);
35
+ }
package/src/cli/reset.ts CHANGED
@@ -15,7 +15,7 @@ Each level clears exactly the root (or file) it names and nothing else.
15
15
  Levels (combinable except --all):
16
16
  --state state root only (default). Holds every session transcript, so a
17
17
  reset is the end of resume, /view, and the audit behind them.
18
- --data data root only: memory, evidence, evals (durable products)
18
+ --data data root only: memory, evidence, evals, vendored tools (durable products)
19
19
  --cache cache root only
20
20
  --auth credentials.yaml only
21
21
  --config settings.yaml only
@@ -42,7 +42,10 @@ Safety:
42
42
  const ROOT_NOTES: Readonly<Record<string, string>> = {
43
43
  state:
44
44
  "the state root holds every session transcript and the audit trail beside it; resume and /view lose their history",
45
- data: "the data root holds durable products (memory, evidence, evals)",
45
+ // Vendored tools are named because they are the one durable product a reset
46
+ // cannot regenerate from anything local: getting them back is a download.
47
+ data:
48
+ "the data root holds durable products (memory, evidence, evals, and any vendored external tools, which a reinstall re-downloads)",
46
49
  };
47
50
 
48
51
  interface ParsedResetArgs {
@@ -128,7 +131,7 @@ function report(label: string, path: string): void {
128
131
  * `scratch/`, and every dispatch artifact written since that sentence was
129
132
  * typed. A list nobody has to maintain cannot drift from what the removal takes.
130
133
  */
131
- export function rootContents(path: string): string[] {
134
+ function rootContents(path: string): string[] {
132
135
  let entries: Dirent[];
133
136
  try {
134
137
  entries = readdirSync(path, { withFileTypes: true });
package/src/cli/run.ts CHANGED
@@ -11,6 +11,7 @@ import { createContextDomainModule } from "../domains/context/runtime.js";
11
11
  import type { DispatchContract, DispatchRequest } from "../domains/dispatch/contract.js";
12
12
  import { agentRoleFactsResolver, requestExecutionRole } from "../domains/dispatch/execution-role.js";
13
13
  import { createDispatchDomainModule } from "../domains/dispatch/index.js";
14
+ import { configureRunEventJournal } from "../domains/dispatch/run-event-journal.js";
14
15
  import type { RunReceipt } from "../domains/dispatch/types.js";
15
16
  import { ensureClioState, LifecycleDomainModule } from "../domains/lifecycle/index.js";
16
17
  import {
@@ -147,7 +148,7 @@ async function assemblePrompt(parsed: RunCliArgs): Promise<{
147
148
  * path, not a skill package, or validation failure such as a missing
148
149
  * description). Exported for contracts tests.
149
150
  */
150
- export function explicitSkillPathErrors(skillPaths: ReadonlyArray<string>): string[] {
151
+ function explicitSkillPathErrors(skillPaths: ReadonlyArray<string>): string[] {
151
152
  const errors: string[] = [];
152
153
  for (const skillPath of skillPaths) {
153
154
  const list = loadSkills({ disableDiscovery: true, explicitSkillPaths: [skillPath] });
@@ -158,6 +159,45 @@ export function explicitSkillPathErrors(skillPaths: ReadonlyArray<string>): stri
158
159
  return errors;
159
160
  }
160
161
 
162
+ /**
163
+ * The TUI's verdict for a command-shaped token the registry does not own,
164
+ * applied to a headless task. Returns the refusal message, or null when the
165
+ * task is not an unknown command.
166
+ *
167
+ * `parseSlashCommand` is the canonical shape test and the canonical registry
168
+ * walk, so a token that is one word of letters, digits, hyphens, or colons and
169
+ * names no command lands here exactly as it does in the editor. Prose keeps
170
+ * reaching the model: an absolute path such as `/home/user/notes` carries a
171
+ * separator and is not one word, and `\/tmp is full` is the same escape the
172
+ * editor honors.
173
+ *
174
+ * A prompt template claims the token before the refusal does. Only membership
175
+ * is checked, not expansion: a template that exists but refuses (an untrusted
176
+ * project root, an unreadable body) has its own message, which the headless
177
+ * boot path already prints from the expansion itself. Deciding that here would
178
+ * duplicate the trust rules and put two refusals on one token.
179
+ *
180
+ * Both modules are imported lazily, so a task that does not start with a slash
181
+ * pays for neither. The laziness is a startup-cost choice and nothing more: for
182
+ * bundle partitioning a dynamic import is worse than a static one, because a
183
+ * dynamically imported module becomes a chunk split point by itself. What keeps
184
+ * this edge safe is the other end. `slash-commands.ts` is a declared CLI seam
185
+ * whose own imports stay off the interactive render graph, so reaching it does
186
+ * not make this file a second reacher of the chunk the instant shell's Stage 0
187
+ * closure sits on. Boundaries rule6 in `tests/boundaries/check-boundaries.ts`
188
+ * holds both halves of that.
189
+ */
190
+ async function unknownSlashCommandRefusal(task: string): Promise<string | null> {
191
+ if (!task.trim().startsWith("/")) return null;
192
+ const { parseSlashCommand } = await import("../interactive/slash-commands.js");
193
+ const command = parseSlashCommand(task);
194
+ if (command.kind !== "unknown-command") return null;
195
+ const { loadPromptTemplates } = await import("../domains/resources/index.js");
196
+ const templates = loadPromptTemplates({ cwd: process.cwd() });
197
+ if (templates.items.some((template) => template.name === command.token)) return null;
198
+ return `/${command.token} is not a command. Type /help for the list.`;
199
+ }
200
+
161
201
  export async function runClioRun(
162
202
  args: ReadonlyArray<string>,
163
203
  options: { apiKey?: string; noContextFiles?: boolean; noSkills?: boolean; skillPaths?: ReadonlyArray<string> } = {},
@@ -218,6 +258,15 @@ export async function runClioRun(
218
258
  if (!assembled) return 2;
219
259
 
220
260
  if (parsed.agentId === undefined) {
261
+ // A mistyped slash command is a usage error, not a task. Refusing it
262
+ // here keeps it from booting a session and spending a model turn on a
263
+ // command that was never run, which is what the TUI has always done
264
+ // and what docs/extensions-and-sharing.md documents for both surfaces.
265
+ const slashRefusal = await unknownSlashCommandRefusal(assembled.prompt);
266
+ if (slashRefusal !== null) {
267
+ process.stderr.write(`clio-coder run: ${slashRefusal}\n`);
268
+ return 2;
269
+ }
221
270
  // An explicit --target override is a one-run target; a missing id is an
222
271
  // operator config error, not an assistant response. Reject it before the
223
272
  // headless turn so the resolver diagnostic never streams to stdout as a
@@ -314,13 +363,22 @@ async function runDispatch(
314
363
  createDispatchDomainModule({
315
364
  getSettings: () => effectiveSettings,
316
365
  autonomyOverride: parsed.autonomy !== undefined,
366
+ // This path iterates `handle.events` itself and builds no dispatch
367
+ // event registry, so the domain is the only thing that can write the
368
+ // run's durable transcript.
369
+ journalRunEvents: true,
317
370
  }),
318
371
  LifecycleDomainModule,
319
372
  ]);
320
373
  const config = loaded.getContract<ConfigContract>("config");
321
374
  const baseSettings = config?.get() ?? readSettings();
322
- effectiveSettings =
323
- parsed.autonomy === undefined ? baseSettings : { ...structuredClone(baseSettings), autonomy: parsed.autonomy };
375
+ // Install `panes.journal` the same way the interactive composition root
376
+ // does. The journal never reads settings.yaml itself: it sits on the
377
+ // dispatch event path, where a settings read would be both a cost and a
378
+ // throw site.
379
+ configureRunEventJournal(baseSettings.fleet.history.journal);
380
+ effectiveSettings = structuredClone(baseSettings);
381
+ if (parsed.autonomy !== undefined) effectiveSettings.safety.autonomy = parsed.autonomy;
324
382
  const dispatch = loaded.getContract<DispatchContract>("dispatch");
325
383
  if (!dispatch) {
326
384
  process.stderr.write("dispatch domain unavailable\n");
@@ -336,19 +394,15 @@ async function runDispatch(
336
394
  return 1;
337
395
  }
338
396
  const settings = effectiveSettings;
339
- const profileTargetId = parsed.agentProfile ? settings.workers?.profiles?.[parsed.agentProfile]?.target : undefined;
397
+ const profileTargetId = parsed.agentProfile ? settings.fleet?.profiles?.[parsed.agentProfile]?.target : undefined;
340
398
  const runtimeByTarget = new Map(settings.targets.map((target) => [target.id, target.runtime] as const));
341
399
  const runtimeTargetId = parsed.agentRuntime
342
- ? [settings.workers?.default, ...Object.values(settings.workers?.profiles ?? {})].find(
400
+ ? [settings.fleet?.default, ...Object.values(settings.fleet?.profiles ?? {})].find(
343
401
  (profile) => profile?.target && runtimeByTarget.get(profile.target) === parsed.agentRuntime,
344
402
  )?.target
345
403
  : undefined;
346
404
  const targetId =
347
- parsed.target ??
348
- profileTargetId ??
349
- runtimeTargetId ??
350
- settings.workers?.default?.target ??
351
- settings.orchestrator?.target;
405
+ parsed.target ?? profileTargetId ?? runtimeTargetId ?? settings.fleet?.default?.target ?? settings.chat?.target;
352
406
  const target = targetId ? providers.getTarget(targetId) : null;
353
407
  const runtime = target ? providers.getRuntime(target.runtime) : null;
354
408
  if (!target || !runtime) {
@@ -383,7 +437,7 @@ async function runDispatch(
383
437
  if (skillPaths.length > 0) dispatchReq.skillPaths = skillPaths;
384
438
  try {
385
439
  const settings = effectiveSettings;
386
- if (settings.skills?.trustProjectCompatRoots) {
440
+ if (settings.integrations.projectResources?.trustProjectImports) {
387
441
  dispatchReq.trustProjectCompatRoots = true;
388
442
  }
389
443
  } catch {
@@ -393,8 +447,8 @@ async function runDispatch(
393
447
  let memorySection = "";
394
448
  try {
395
449
  const records = loadMemoryRecordsSync(clioDataDir());
396
- const boundProfileName = parsed.agentProfile ?? effectiveSettings.workers.agentBindings[parsed.agentId];
397
- const boundProfile = boundProfileName ? effectiveSettings.workers.profiles[boundProfileName] : undefined;
450
+ const boundProfileName = parsed.agentProfile ?? effectiveSettings.fleet.agentProfiles[parsed.agentId];
451
+ const boundProfile = boundProfileName ? effectiveSettings.fleet.profiles[boundProfileName] : undefined;
398
452
  const configuredRuntime = (targetId: string | null | undefined): string | undefined =>
399
453
  effectiveSettings.targets.find((target) => target.id === targetId)?.runtime;
400
454
  const profileRuntimeId = configuredRuntime(boundProfile?.target);
package/src/cli/share.ts CHANGED
@@ -233,7 +233,7 @@ export function runShareCommand(argv: ReadonlyArray<string>): number {
233
233
  const archive = plan.archive;
234
234
  if (archive) {
235
235
  process.stdout.write(
236
- `archive: ${archive.manifest.format} clio=${archive.manifest.clioVersion} files=${archive.files.length} created=${archive.manifest.createdAt}\n`,
236
+ `archive: ${archive.manifest.format} clio-coder=${archive.manifest.clioCoderVersion} files=${archive.files.length} created=${archive.manifest.createdAt}\n`,
237
237
  );
238
238
  }
239
239
  }
@@ -311,7 +311,7 @@ type EvalArm = "baseline" | "treatment" | "judge";
311
311
  *
312
312
  * @internal Exported for contract tests.
313
313
  */
314
- export function armRunArgs(
314
+ function armRunArgs(
315
315
  arm: EvalArm,
316
316
  prompt: string,
317
317
  options: { target?: string | undefined; skillBaseDir?: string | undefined } = {},
@@ -335,7 +335,7 @@ export function armRunArgs(
335
335
  *
336
336
  * @internal Exported for contract tests.
337
337
  */
338
- export function permissionWallReason(arm: EvalArm, run: CapturedRun): string | null {
338
+ function permissionWallReason(arm: EvalArm, run: CapturedRun): string | null {
339
339
  const haystack = `${run.transcript}\n${run.finalText}`;
340
340
  let blocked = 0;
341
341
  let at = haystack.indexOf(HEADLESS_PERMISSION_DENIED_MARKER);
@@ -360,7 +360,7 @@ function unmeasuredBullets(scenario: SkillEvalScenario, reason: string): ScoredB
360
360
  *
361
361
  * @internal Exported for contract tests.
362
362
  */
363
- export function evalChildEnv(allowNetwork: boolean, env: NodeJS.ProcessEnv = process.env): NodeJS.ProcessEnv {
363
+ function evalChildEnv(allowNetwork: boolean, env: NodeJS.ProcessEnv = process.env): NodeJS.ProcessEnv {
364
364
  const childEnv: NodeJS.ProcessEnv = { ...env };
365
365
  if (allowNetwork) Reflect.deleteProperty(childEnv, NO_NETWORK_TOOLS_ENV);
366
366
  else childEnv[NO_NETWORK_TOOLS_ENV] = "1";
@@ -378,7 +378,7 @@ export function evalChildEnv(allowNetwork: boolean, env: NodeJS.ProcessEnv = pro
378
378
  * the catalog answers only for a name no root installed, which is the skill
379
379
  * author's case in this repository.
380
380
  */
381
- export function resolveSkillBaseDir(
381
+ function resolveSkillBaseDir(
382
382
  nameOrPath: string,
383
383
  cwd: string,
384
384
  ): { baseDir: string | null; origin?: string; error?: string } {
@@ -442,7 +442,7 @@ async function runScenario(
442
442
  // Published per-scenario figure: monotonic so a clock correction during a
443
443
  // long sweep cannot land in one row's wall time.
444
444
  const scenarioStart = performance.now();
445
- const workspace = await mkdtemp(join(tmpdir(), "clio-skill-eval-seed-"));
445
+ const workspace = await mkdtemp(join(tmpdir(), "clio-coder-skill-eval-seed-"));
446
446
  let runWorkspaces: MaterializedSkillEvalWorkspaces | null = null;
447
447
  try {
448
448
  if (workspaceOverride !== null) await copyWorkspace(workspaceOverride, workspace);
@@ -570,7 +570,7 @@ export interface MaterializedSkillEvalWorkspaces {
570
570
  * cooperative model, not as an isolation guarantee.
571
571
  */
572
572
  async function armWorkspace(created: string[]): Promise<string> {
573
- const root = await mkdtemp(join(tmpdir(), "clio-skill-eval-"));
573
+ const root = await mkdtemp(join(tmpdir(), "clio-coder-skill-eval-"));
574
574
  created.push(root);
575
575
  const workspace = join(root, "workspace");
576
576
  await mkdir(workspace, { recursive: true });
@@ -578,7 +578,7 @@ async function armWorkspace(created: string[]): Promise<string> {
578
578
  }
579
579
 
580
580
  /** @internal Exported for contract tests. */
581
- export async function materializeSkillEvalWorkspaces(seedWorkspace: string): Promise<MaterializedSkillEvalWorkspaces> {
581
+ async function materializeSkillEvalWorkspaces(seedWorkspace: string): Promise<MaterializedSkillEvalWorkspaces> {
582
582
  const created: string[] = [];
583
583
  try {
584
584
  const baseline = await armWorkspace(created);
@@ -814,7 +814,7 @@ function loadsSkillBody(tool: string, args: unknown): boolean {
814
814
  }
815
815
 
816
816
  /** @internal Exported for contract tests. */
817
- export function parseRunStdout(stdout: string): { sessionId: string | null; transcript: string; finalText: string } {
817
+ function parseRunStdout(stdout: string): { sessionId: string | null; transcript: string; finalText: string } {
818
818
  let sessionId: string | null = null;
819
819
  const lines: string[] = [];
820
820
  let finalText = "";
@@ -938,7 +938,7 @@ function judgeVerdictAbsenceReason(judge: CapturedRun): string {
938
938
  }
939
939
 
940
940
  /** Exported for contracts tests. */
941
- export function parseJudgeVerdicts(scenario: SkillEvalScenario, judge: CapturedRun): ScoredBullet[] {
941
+ function parseJudgeVerdicts(scenario: SkillEvalScenario, judge: CapturedRun): ScoredBullet[] {
942
942
  const parsed = extractBulletsObject(judge.finalText) ?? extractBulletsObject(judge.transcript);
943
943
  // No verdict object anywhere in the judge run. The scenario was not scored,
944
944
  // which is a fact about the judge, so every bullet stays unmeasured rather
@@ -982,7 +982,7 @@ export function parseJudgeVerdicts(scenario: SkillEvalScenario, judge: CapturedR
982
982
  * content, so this walks candidate `{` openers around the first "bullets" key
983
983
  * and balance-scans to the matching close brace.
984
984
  */
985
- export function extractBulletsObject(text: string): Record<string, unknown> | null {
985
+ function extractBulletsObject(text: string): Record<string, unknown> | null {
986
986
  const stripped = text.replace(/```(?:json)?/g, "");
987
987
  const bulletsAt = stripped.indexOf('"bullets"');
988
988
  if (bulletsAt < 0) return null;
@@ -1085,7 +1085,7 @@ function synthesizeArtifact(
1085
1085
  evalId,
1086
1086
  taskFile: evalsPath,
1087
1087
  taskFileHash: contentHash,
1088
- clio: evalClioProvenance(),
1088
+ clioCoder: evalClioProvenance(),
1089
1089
  environment: evalEnvironmentProvenance(),
1090
1090
  target: target ?? null,
1091
1091
  model: null,
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Fixed machine-readable projection of this installation's installed skills.
3
+ *
4
+ * `skills list --json` already emits a machine-readable listing, and a GUI host
5
+ * reading it gets two things wrong. Without `--all` it sees only the skills the
6
+ * model may load, which is `trusted && !disableModelInvocation`, so a surface
7
+ * rendering trust and invocability off that payload prints "trusted" and
8
+ * "allowed" on every row and structurally cannot print anything else. And the
9
+ * rows it does get are the full loaded records, carrying the SKILL.md body, the
10
+ * file path, the base directory, and two content hashes, so every consumer has
11
+ * to re-derive the same redaction.
12
+ *
13
+ * This command answers both. It loads once, reports every installed skill
14
+ * whether or not the model can reach it, says which ones it can, and carries
15
+ * only fields that are safe by construction. It is a separate subcommand rather
16
+ * than a flag on `skills inspect`, because that one names a skill and a fixed
17
+ * read a host may run must take no identifier at all.
18
+ *
19
+ * Held back deliberately: the skill body, its file path, its base directory,
20
+ * both hashes, the install and registry URLs, and the free-text loader
21
+ * diagnostics. Whether a skill has an upstream to update from crosses; where
22
+ * that upstream is does not.
23
+ *
24
+ * Marketplace discovery is deliberately not here. `library list --json` already
25
+ * folds `discoverMarketplaceSkills` into its catalog, so every installable
26
+ * skill already crosses through that read, and a second one would report the
27
+ * same rows under a different name.
28
+ */
29
+
30
+ import {
31
+ loadSkills,
32
+ type ResourceDiagnostic,
33
+ type Skill,
34
+ type SkillCatalogInvalidReason,
35
+ skillCatalogValidity,
36
+ } from "../domains/resources/index.js";
37
+
38
+ /** Wire bound on the emitted skill list. */
39
+ const MAX_SKILLS_INVENTORY_SKILLS = 64;
40
+ /** Wire bound on each skill's declared tool policy. */
41
+ const MAX_SKILLS_INVENTORY_TOOLS = 32;
42
+
43
+ const TOOL_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:-]*$/;
44
+
45
+ type SkillAuditState = "pass" | "warn" | "fail" | "unknown" | "not-reported";
46
+
47
+ interface SkillsInventoryDiagnosticCounts {
48
+ readonly errors: number;
49
+ readonly warnings: number;
50
+ readonly collisions: number;
51
+ }
52
+
53
+ interface SkillsInventorySkill {
54
+ readonly name: string;
55
+ readonly description: string;
56
+ readonly scope: string;
57
+ readonly source: string;
58
+ /** Whether the skill's root is trusted enough for the model to see it at all. */
59
+ readonly trusted: boolean;
60
+ /** Whether the skill's own frontmatter permits model invocation. */
61
+ readonly modelInvocable: boolean;
62
+ /**
63
+ * The effective answer, which is both of the above.
64
+ *
65
+ * Reported rather than left to be inferred because it is the fact an
66
+ * operator is actually asking about, and because a listing filtered to it
67
+ * cannot state it.
68
+ */
69
+ readonly modelVisible: boolean;
70
+ readonly precedence: number;
71
+ readonly diagnostics: SkillsInventoryDiagnosticCounts;
72
+ /** Tools the skill narrows itself to. The harness intersects these with host policy. */
73
+ readonly allowedTools: readonly string[];
74
+ readonly disallowedTools: readonly string[];
75
+ /** True when a dispatched worker installed this, rather than the operator. */
76
+ readonly installedByWorker: boolean;
77
+ /** True when provenance records an upstream, so `skills update` has something to fetch. */
78
+ readonly updatable: boolean;
79
+ readonly audit: SkillAuditState;
80
+ readonly installedAt: string | null;
81
+ readonly updatedAt: string | null;
82
+ }
83
+
84
+ interface SkillsInventorySnapshot {
85
+ readonly version: 1;
86
+ readonly generatedAt: string;
87
+ /** The verdict `skills validate` reaches, from the rule both callers share. */
88
+ readonly valid: boolean;
89
+ readonly invalidReason: SkillCatalogInvalidReason | null;
90
+ /** Every installed skill the loader resolved, before the wire bound. */
91
+ readonly total: number;
92
+ /** How many of those the model may actually load by name. */
93
+ readonly modelVisible: number;
94
+ readonly diagnostics: SkillsInventoryDiagnosticCounts;
95
+ readonly skills: readonly SkillsInventorySkill[];
96
+ readonly skillsTruncated: boolean;
97
+ }
98
+
99
+ const AUDIT_STATES: ReadonlySet<string> = new Set(["pass", "warn", "fail", "unknown"]);
100
+
101
+ function countDiagnostics(diagnostics: ReadonlyArray<ResourceDiagnostic>): SkillsInventoryDiagnosticCounts {
102
+ let errors = 0;
103
+ let warnings = 0;
104
+ let collisions = 0;
105
+ for (const diag of diagnostics) {
106
+ if (diag.type === "error") errors += 1;
107
+ else if (diag.type === "collision") collisions += 1;
108
+ else warnings += 1;
109
+ }
110
+ return { errors, warnings, collisions };
111
+ }
112
+
113
+ /**
114
+ * Tool names are already-crossing identifiers: the agent catalog carries the
115
+ * same class. They are re-enforced structurally here anyway, because a skill's
116
+ * frontmatter is operator-authored and the loader does not hold it to a shape.
117
+ */
118
+ function toolPolicy(value: ReadonlyArray<string> | undefined): string[] {
119
+ if (value === undefined) return [];
120
+ const tools: string[] = [];
121
+ for (const tool of value) {
122
+ if (tools.length >= MAX_SKILLS_INVENTORY_TOOLS) break;
123
+ if (typeof tool !== "string" || tool.length > 64 || !TOOL_PATTERN.test(tool)) continue;
124
+ if (!tools.includes(tool)) tools.push(tool);
125
+ }
126
+ return tools;
127
+ }
128
+
129
+ function timestamp(value: string | undefined): string | null {
130
+ if (value === undefined) return null;
131
+ const parsed = Date.parse(value);
132
+ return Number.isFinite(parsed) ? new Date(parsed).toISOString() : null;
133
+ }
134
+
135
+ function projectSkill(skill: Skill): SkillsInventorySkill {
136
+ const provenance = skill.provenance;
137
+ const audit = provenance?.audit;
138
+ return {
139
+ name: skill.name,
140
+ description: skill.description,
141
+ scope: skill.scope,
142
+ source: skill.source,
143
+ trusted: skill.trusted,
144
+ modelInvocable: !skill.disableModelInvocation,
145
+ modelVisible: skill.trusted && !skill.disableModelInvocation,
146
+ precedence: skill.precedence,
147
+ diagnostics: countDiagnostics(skill.diagnostics),
148
+ allowedTools: toolPolicy(skill.allowedTools),
149
+ disallowedTools: toolPolicy(skill.disallowedTools),
150
+ installedByWorker: provenance?.installedBy === "worker",
151
+ // The URL itself is a host-side fact; that one exists is what tells the
152
+ // operator whether an update has anywhere to come from.
153
+ updatable: provenance?.installUrl !== undefined || provenance?.registryUrl !== undefined,
154
+ audit: audit !== undefined && AUDIT_STATES.has(audit) ? (audit as SkillAuditState) : "not-reported",
155
+ installedAt: timestamp(provenance?.installedAt),
156
+ updatedAt: timestamp(provenance?.updatedAt),
157
+ };
158
+ }
159
+
160
+ function skillsInventorySnapshot(now: () => number = Date.now, cwd: string = process.cwd()): SkillsInventorySnapshot {
161
+ const list = loadSkills({ cwd });
162
+ const validity = skillCatalogValidity(list);
163
+ const projected = list.items.map(projectSkill);
164
+ const skills = projected.slice(0, MAX_SKILLS_INVENTORY_SKILLS);
165
+ return {
166
+ version: 1,
167
+ generatedAt: new Date(now()).toISOString(),
168
+ valid: validity.ok,
169
+ invalidReason: validity.reason,
170
+ total: projected.length,
171
+ modelVisible: projected.filter((skill) => skill.modelVisible).length,
172
+ diagnostics: countDiagnostics(list.diagnostics),
173
+ skills,
174
+ skillsTruncated: skills.length < projected.length,
175
+ };
176
+ }
177
+
178
+ export function runSkillsInventory(args: ReadonlyArray<string>): number {
179
+ if (args.length !== 1 || args[0] !== "--json") {
180
+ process.stderr.write("clio-coder skills inventory: usage: clio-coder skills inventory --json\n");
181
+ return 2;
182
+ }
183
+ process.stdout.write(`${JSON.stringify(skillsInventorySnapshot(), null, 2)}\n`);
184
+ return 0;
185
+ }
package/src/cli/skills.ts CHANGED
@@ -8,6 +8,7 @@ import {
8
8
  type ResourceDiagnostic,
9
9
  type Skill,
10
10
  type SkillUpdateReport,
11
+ skillCatalogValidity,
11
12
  updateSkills,
12
13
  } from "../domains/resources/index.js";
13
14
  import { formatColumns, printError, printOk } from "./shared.js";
@@ -18,6 +19,7 @@ Manage local Clio and Agent Skills-compatible skills.
18
19
 
19
20
  Commands:
20
21
  clio-coder skills list [--json] [--all]
22
+ clio-coder skills inventory --json
21
23
  clio-coder skills search <query> [--json]
22
24
  clio-coder skills inspect <name> [--json]
23
25
  clio-coder skills validate [path] [--json]
@@ -27,6 +29,10 @@ Commands:
27
29
  clio-coder skills sync [--force]
28
30
  clio-coder skills eval <name|path> [--scenario <id>] [--target <id>] [--workspace <path>] [--timeout <seconds>] [--trust-fixtures] [--allow-network] [--json]
29
31
 
32
+ inventory is the fixed machine-readable read a GUI host may run. Unlike a bare
33
+ list it reports every installed skill, not only the ones the model may load, and
34
+ says which are which; it carries no body, path, hash, or install URL.
35
+
30
36
  search covers installed skills plus the local marketplace: CLIO_CODER_SKILL_CATALOG_DIR,
31
37
  a repo skills/ catalog, or the catalog and skill-marketplace.json index the
32
38
  installed clio-coder package carries. Installing from the shipped catalog copies
@@ -249,6 +255,12 @@ function validationLoad(pathArg: string | undefined): ReturnType<typeof loadSkil
249
255
  }
250
256
 
251
257
  export async function runSkillsCommand(argv: ReadonlyArray<string>): Promise<number> {
258
+ // Routed before the shared parser so the fixed read stays exactly fixed: no
259
+ // skills flag can reach it, and no flag it does not name can be spent on it.
260
+ if (argv[0] === "inventory") {
261
+ const { runSkillsInventory } = await import("./skills-inventory.js");
262
+ return runSkillsInventory(argv.slice(1));
263
+ }
252
264
  let parsed: Parsed;
253
265
  try {
254
266
  parsed = parse(argv);
@@ -365,19 +377,10 @@ export async function runSkillsCommand(argv: ReadonlyArray<string>): Promise<num
365
377
  return 2;
366
378
  }
367
379
  const list = validationLoad(pathArg);
368
- // A scanned file that produced no loaded skill is malformed, and a
369
- // collision drops a skill: both make the catalog invalid, as does any
370
- // hard error. Benign warnings (name/path mismatch, name format,
371
- // description length) attach to a file that still loaded, so their path
372
- // is among the loaded skills and they do not fail validation.
373
- const loadedPaths = new Set(list.items.map((skill) => skill.filePath));
374
- const hasInvalidDiagnostic = list.diagnostics.some(
375
- (diag) =>
376
- diag.type === "error" ||
377
- diag.type === "collision" ||
378
- (diag.type === "warning" && diag.path !== undefined && !loadedPaths.has(diag.path)),
379
- );
380
- const ok = list.items.length > 0 && !hasInvalidDiagnostic;
380
+ // The rule itself lives in the loader, because `skills inspect --json`
381
+ // reports the same verdict to a GUI host and a verdict that drifts
382
+ // between the terminal and the browser is worse than no verdict.
383
+ const { ok } = skillCatalogValidity(list);
381
384
  if (parsed.json) {
382
385
  process.stdout.write(`${JSON.stringify({ ok, skills: list.items, diagnostics: list.diagnostics }, null, 2)}\n`);
383
386
  } else {