@iowarp/clio-coder 0.4.2 → 0.4.4

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 (523) hide show
  1. package/CHANGELOG.md +98 -0
  2. package/CONTRIBUTING.md +86 -19
  3. package/README.md +35 -6
  4. package/dist/{acp-TMDQZDIG.js → acp-WNAYYF4F.js} +12 -13
  5. package/dist/{agents-5N5NG3XG.js → agents-3OKXHLOI.js} +60 -57
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-Z5CCBXKQ.js → auth-VKNNMGPU.js} +21 -19
  8. package/dist/{builtins-K6TNDT24.js → builtins-WGALA46I.js} +9 -4
  9. package/dist/{chunk-XE3PCIXH.js → chunk-23L32XTI.js} +12 -9
  10. package/dist/{chunk-I64IFBLB.js → chunk-25QBEXRS.js} +18 -11
  11. package/dist/{chunk-CDNVLKUX.js → chunk-26QSH3EJ.js} +13 -7
  12. package/dist/{chunk-QQLGQY2A.js → chunk-2ASED4PZ.js} +22 -22
  13. package/dist/{chunk-MCEPRMZW.js → chunk-2CU2H6KE.js} +2 -2
  14. package/dist/chunk-2DSOYNFC.js +108 -0
  15. package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
  16. package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
  17. package/dist/{chunk-O3YUNJZ2.js → chunk-2ZSONWVL.js} +82 -25
  18. package/dist/{chunk-2NHR3NAY.js → chunk-36CT5VVL.js} +331 -42
  19. package/dist/{chunk-2X4RYJTJ.js → chunk-3GY4F45V.js} +3 -3
  20. package/dist/{chunk-ZW55JB7N.js → chunk-3ODX73FK.js} +4 -6
  21. package/dist/{chunk-PBP4B7XR.js → chunk-3UNOLWNZ.js} +3 -3
  22. package/dist/{chunk-4JDLP6ZS.js → chunk-3UUXNFEX.js} +14 -10
  23. package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
  24. package/dist/{chunk-ZW4HH5JJ.js → chunk-4M6Z5QVF.js} +6 -6
  25. package/dist/{chunk-K6BSR66V.js → chunk-4NSRCOYP.js} +4 -1
  26. package/dist/{chunk-M2DAX4F6.js → chunk-4WR7VSYB.js} +2 -2
  27. package/dist/{chunk-FSP7CMNU.js → chunk-54X7T7DK.js} +61 -6
  28. package/dist/{chunk-54ODD65L.js → chunk-5636DCO5.js} +4 -4
  29. package/dist/chunk-57XXR6DR.js +3763 -0
  30. package/dist/{chunk-3KIPBMUA.js → chunk-5ICU3EUH.js} +2 -2
  31. package/dist/{chunk-77QIVUZB.js → chunk-5MEZN6CB.js} +4 -4
  32. package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
  33. package/dist/{chunk-YJISEZKC.js → chunk-5TUB6SLS.js} +6 -6
  34. package/dist/{chunk-IMXMHHMQ.js → chunk-6OSVSQL5.js} +341 -57
  35. package/dist/{chunk-Q4XWMHX6.js → chunk-6PAZTBPA.js} +14 -2
  36. package/dist/{chunk-FVDGR2ZL.js → chunk-6Q3CYFD3.js} +112 -39
  37. package/dist/{chunk-IDNA72AH.js → chunk-6QOTUPRG.js} +155 -36
  38. package/dist/{chunk-X7IARSHT.js → chunk-6UINWWS6.js} +16 -10
  39. package/dist/{chunk-CYZW7JHJ.js → chunk-72YIHOZQ.js} +9 -9
  40. package/dist/{chunk-IKSLQ4XV.js → chunk-75W7L2E2.js} +752 -861
  41. package/dist/{chunk-CRFOIAX3.js → chunk-7UGL4MB5.js} +6 -6
  42. package/dist/{chunk-HIICAHCJ.js → chunk-AUPNRN7C.js} +2 -2
  43. package/dist/{chunk-7BHIY2MW.js → chunk-BJVFZO5U.js} +8 -50
  44. package/dist/{chunk-B74PXLU7.js → chunk-CUSRQKPU.js} +65 -3
  45. package/dist/chunk-DQOVN6KV.js +386 -0
  46. package/dist/{chunk-E7GT7O5N.js → chunk-DT3LWJOB.js} +7 -4
  47. package/dist/chunk-DXKJURES.js +671 -0
  48. package/dist/{chunk-JBCS7CRR.js → chunk-EL24TAU4.js} +10 -10
  49. package/dist/{chunk-TPEQIQIE.js → chunk-ELWDPP3Y.js} +8 -8
  50. package/dist/{chunk-NDINPTJ4.js → chunk-ELZVTCGV.js} +5 -4
  51. package/dist/chunk-EXLD33WO.js +381 -0
  52. package/dist/chunk-FEAXX7B6.js +101 -0
  53. package/dist/{chunk-RLYRBIYQ.js → chunk-FFUPXJC4.js} +90 -331
  54. package/dist/{chunk-5PFYMY2V.js → chunk-FTMGRKEF.js} +2 -2
  55. package/dist/{chunk-34BHNEE3.js → chunk-GHS5EBTQ.js} +58 -7
  56. package/dist/{chunk-DYHAXKHD.js → chunk-GWZNEVM2.js} +12 -8
  57. package/dist/chunk-GX5WYQO4.js +59 -0
  58. package/dist/chunk-GYV6VZOC.js +26 -0
  59. package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
  60. package/dist/chunk-I2DWJ4GM.js +390 -0
  61. package/dist/{chunk-TXOTCRLG.js → chunk-I5FWO7L5.js} +5 -5
  62. package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
  63. package/dist/{chunk-XQRY4DTA.js → chunk-IGLP3ODT.js} +10 -10
  64. package/dist/chunk-IRXAATOX.js +539 -0
  65. package/dist/chunk-IXIY2H4R.js +44 -0
  66. package/dist/{chunk-SSEYRH53.js → chunk-IZXGRF7P.js} +92 -147
  67. package/dist/{chunk-5TSRNF4G.js → chunk-JCI2ROMZ.js} +164 -6
  68. package/dist/{chunk-JWJGP5DQ.js → chunk-JEIYHLOR.js} +7 -7
  69. package/dist/{chunk-F2I26BDK.js → chunk-JQLNNIKT.js} +4 -4
  70. package/dist/{chunk-BYMNWQ7O.js → chunk-JSD46VO2.js} +315 -63
  71. package/dist/{chunk-AK5XEFVZ.js → chunk-JT2RFCC5.js} +64 -14
  72. package/dist/{chunk-MCMZMDAC.js → chunk-K6T2ZAMZ.js} +168 -6
  73. package/dist/{chunk-PGF63K6I.js → chunk-KFV5L5SK.js} +73 -4
  74. package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
  75. package/dist/{chunk-PJX3WQUQ.js → chunk-LLXSDWXS.js} +3 -3
  76. package/dist/{chunk-DZAW46HP.js → chunk-LTIKRKFL.js} +3 -3
  77. package/dist/{chunk-DZEK6CJN.js → chunk-N56KALIC.js} +21 -21
  78. package/dist/{chunk-B7HM5Z7T.js → chunk-NAI6ZFCY.js} +9 -5
  79. package/dist/{chunk-I66ZTYNP.js → chunk-NRO2BJRH.js} +2656 -2213
  80. package/dist/{chunk-ZGNYYXQ6.js → chunk-NXIMQY5W.js} +3 -3
  81. package/dist/{chunk-IKOZFYBN.js → chunk-NXYCB2VD.js} +149 -106
  82. package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
  83. package/dist/{chunk-462T4EGZ.js → chunk-O5CVSAG5.js} +2 -2
  84. package/dist/chunk-ODGTEFFI.js +50 -0
  85. package/dist/{chunk-3F7VUY77.js → chunk-OEJSLEPW.js} +2 -2
  86. package/dist/{chunk-KKOJXO6R.js → chunk-OMQNJVKW.js} +4 -2
  87. package/dist/{chunk-5KW52TEP.js → chunk-Q4WO54TA.js} +132 -77
  88. package/dist/{chunk-W6NIE6OW.js → chunk-QUFRYSWI.js} +13 -7
  89. package/dist/{chunk-42FMPA75.js → chunk-QZWQA4DE.js} +2 -2
  90. package/dist/chunk-R6Q67RJH.js +134 -0
  91. package/dist/{chunk-W4YEMFBX.js → chunk-RAY4OVGZ.js} +3 -3
  92. package/dist/{chunk-ZNT2M6TG.js → chunk-RQCKCSRL.js} +17 -17
  93. package/dist/{chunk-LJID3DYZ.js → chunk-RXTN6AKH.js} +3 -3
  94. package/dist/{chunk-P75RZCJW.js → chunk-RZDWV63N.js} +3 -3
  95. package/dist/{chunk-UH632ZYL.js → chunk-S6PYF2XF.js} +2 -2
  96. package/dist/{chunk-HJWWJ6IL.js → chunk-TOIVGRUX.js} +17 -5
  97. package/dist/{chunk-HLAFFSEK.js → chunk-TQAHXW6Y.js} +2 -2
  98. package/dist/{chunk-JIEGK6UF.js → chunk-U6TMQNSI.js} +48 -4
  99. package/dist/{chunk-2HFQNRV3.js → chunk-UEPWCCTY.js} +12 -12
  100. package/dist/chunk-UOIZ7DA4.js +41 -0
  101. package/dist/{chunk-UH347SHR.js → chunk-USR47QNF.js} +11 -11
  102. package/dist/{chunk-AZ4WMN4W.js → chunk-V6HJFQZE.js} +2 -2
  103. package/dist/chunk-V76WTFTW.js +318 -0
  104. package/dist/{chunk-NMJXSHBJ.js → chunk-W54I7H25.js} +2 -2
  105. package/dist/{chunk-KPXDY6QF.js → chunk-XRZT5WY5.js} +2 -2
  106. package/dist/{chunk-UBRFI4HS.js → chunk-XULDXHTN.js} +142 -50
  107. package/dist/chunk-XXYSBZIQ.js +283 -0
  108. package/dist/{chunk-HKMD33FO.js → chunk-Y55JBDO5.js} +405 -122
  109. package/dist/{chunk-XOXV5GKE.js → chunk-YD5GIKET.js} +17 -8
  110. package/dist/{chunk-XGDPUNND.js → chunk-YECAMM3D.js} +2 -2
  111. package/dist/{chunk-BO7Y52RY.js → chunk-YNFKXPEC.js} +7 -7
  112. package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
  113. package/dist/{chunk-M2WXEHER.js → chunk-ZA4VCIGV.js} +2 -2
  114. package/dist/cli/index.js +42 -40
  115. package/dist/{clio-7VB377CC.js → clio-QLICPCF5.js} +7 -7
  116. package/dist/{code-nav-YVLCYA7V.js → code-nav-IJR2DBPR.js} +9 -9
  117. package/dist/{components-UBWCQSRW.js → components-2TGAI2RC.js} +5 -6
  118. package/dist/{config-4HVOS65E.js → config-IUA6OYNS.js} +88 -81
  119. package/dist/{configure-PIWO7B24.js → configure-VEPX4NMX.js} +26 -25
  120. package/dist/{context-KQYIWPWT.js → context-2DKHWH2T.js} +60 -45
  121. package/dist/{context-IYEHL3WQ.js → context-4MPR7WKB.js} +78 -69
  122. package/dist/{context-N6ZE3LGJ.js → context-BOYF5EJM.js} +15 -11
  123. package/dist/{context-clear-G4OGZJDS.js → context-clear-S4ZJCQUX.js} +73 -65
  124. package/dist/context-map-COB37XXN.js +505 -0
  125. package/dist/{context-working-set-BWLF6LJP.js → context-working-set-3I3FYX6Y.js} +18 -17
  126. package/dist/detail-A7JAVSIG.js +98 -0
  127. package/dist/{dispatch-runner-2QQAITS3.js → dispatch-runner-RJ5I2F2O.js} +99 -75
  128. package/dist/{docs-PD3EXDKU.js → docs-SPOV3BAN.js} +3 -5
  129. package/dist/{doctor-LHBD36VU.js → doctor-DKICC2SN.js} +71 -48
  130. package/dist/{eval-C45FYRJ6.js → eval-OQOQUDHK.js} +308 -146
  131. package/dist/{eval-inventory-6DEJPLBF.js → eval-inventory-Y6QRFOH5.js} +4 -4
  132. package/dist/{evidence-6SHONYAF.js → evidence-4DQ25GUQ.js} +79 -175
  133. package/dist/evidence-4F5USFKH.js +208 -0
  134. package/dist/{evolve-KRKMV72X.js → evolve-GSS52E5J.js} +71 -67
  135. package/dist/{extensions-KPZ2UHBB.js → extensions-G7MFLYHT.js} +8 -9
  136. package/dist/{fleet-IVTCKDHT.js → fleet-Q37YHHAQ.js} +126 -118
  137. package/dist/{fleet-commands-EDWL3IT7.js → fleet-commands-G7E4N7SM.js} +16 -13
  138. package/dist/{fleet-decisions-YP3YEFGK.js → fleet-decisions-O7M6QBA2.js} +9 -8
  139. package/dist/{fleet-graph-ZFWKHY2M.js → fleet-graph-TOUBW6OW.js} +21 -20
  140. package/dist/{fleet-inspect-FVUNCBML.js → fleet-inspect-SW33JJNI.js} +65 -60
  141. package/dist/{fleet-preflight-UN5XED4R.js → fleet-preflight-CV2655TW.js} +4 -5
  142. package/dist/{fleet-validate-XOWC4HSX.js → fleet-validate-KESZX2YH.js} +25 -24
  143. package/dist/{fleet-verify-UN3SODEL.js → fleet-verify-UQPMTVE3.js} +66 -61
  144. package/dist/{fleet-view-TWHJKCN6.js → fleet-view-MN2VG4MR.js} +65 -60
  145. package/dist/{init-T2QORQ3Y.js → init-PXEXQSBF.js} +90 -82
  146. package/dist/{interop-IN5I2A66.js → interop-ZG5T62U3.js} +12 -13
  147. package/dist/inventory-C26CFDRR.js +101 -0
  148. package/dist/{library-LSCATDLZ.js → library-B2W4N74O.js} +29 -29
  149. package/dist/{memory-HYOKAGGJ.js → memory-YCANYS5A.js} +73 -69
  150. package/dist/{models-2GPMFYCM.js → models-GERTU3YI.js} +51 -47
  151. package/dist/{monitor-E4ASVUJH.js → monitor-CPNIUULB.js} +74 -67
  152. package/dist/{orchestrator-DDMPR3PY.js → orchestrator-J4BSH4WQ.js} +1288 -1606
  153. package/dist/{panes-E3RUXOW5.js → panes-BOHAEGYC.js} +4 -4
  154. package/dist/{panes-IXKLOKA2.js → panes-NXSLDQZ2.js} +10 -11
  155. package/dist/{paths-L7LGY6RN.js → paths-VSUWNC22.js} +6 -7
  156. package/dist/reset-TNWTB5LU.js +343 -0
  157. package/dist/{resources-OTRSN34L.js → resources-4PXNMD5G.js} +29 -22
  158. package/dist/{run-5DEYH5QK.js → run-D6XJ34CN.js} +132 -132
  159. package/dist/{share-IHWTLO3M.js → share-2NWMJJEE.js} +27 -27
  160. package/dist/{skills-IYMXMKW4.js → skills-KR7WON5G.js} +40 -33
  161. package/dist/{skills-eval-DROHSJAR.js → skills-eval-O2ZNOLDS.js} +81 -77
  162. package/dist/{skills-inventory-D7X4L4ZX.js → skills-inventory-ZZOUBK7O.js} +23 -22
  163. package/dist/{slash-commands-QBM7UZ3B.js → slash-commands-ZXPJD64J.js} +47 -37
  164. package/dist/{steer-Z5DO23FJ.js → steer-XA25PSCS.js} +4 -4
  165. package/dist/{support-U7QOWY26.js → support-7EMVWYG2.js} +6 -6
  166. package/dist/{targets-P2FUC4IL.js → targets-OMH2XCSN.js} +50 -49
  167. package/dist/tasks-IPAGMEIX.js +36 -0
  168. package/dist/{terminal-lease-YREJ3JX2.js → terminal-lease-C2J3JYRE.js} +4 -4
  169. package/dist/{tools-5B7RO6MV.js → tools-EFFEAIDP.js} +8 -9
  170. package/dist/{trace-YMGMUM6A.js → trace-FXMXUZUF.js} +7 -7
  171. package/dist/uninstall-HALS6BLF.js +407 -0
  172. package/dist/upgrade-MS72RJEP.js +306 -0
  173. package/dist/{usage-ME5MPXGX.js → usage-NHG6MCJM.js} +162 -108
  174. package/dist/{verifiers-BVZ7IWOO.js → verifiers-7AUNVXDY.js} +155 -22
  175. package/dist/{verify-5K7ZKQFC.js → verify-FWYGPKMR.js} +14 -12
  176. package/dist/{web-fetch-MPARV2K7.js → web-fetch-V4FKSDAV.js} +4 -4
  177. package/dist/{wiki-generate-F5W5QTYY.js → wiki-generate-743CIGJW.js} +99 -90
  178. package/dist/{with-panes-BYOJCLAM.js → with-panes-BDQEWBRT.js} +10 -10
  179. package/dist/worker/entry.js +72 -68
  180. package/docs/README.md +3 -2
  181. package/docs/architecture/acp.md +17 -0
  182. package/docs/architecture/artifact-placement.md +1 -0
  183. package/docs/architecture/artifact-versions.md +2 -2
  184. package/docs/architecture/context-engine.md +4 -0
  185. package/docs/architecture/dispatch-typed-intent.md +1 -1
  186. package/docs/architecture/evidence-and-memory.md +1 -1
  187. package/docs/architecture/middleware-and-components.md +1 -1
  188. package/docs/architecture/model-catalog.md +21 -10
  189. package/docs/architecture/observability.md +19 -2
  190. package/docs/architecture/prompt-envelope-and-tools.md +17 -5
  191. package/docs/architecture/provider-adapter-cookbook.md +63 -0
  192. package/docs/architecture/safety-model.md +25 -22
  193. package/docs/architecture/tui-design.md +1 -1
  194. package/docs/guide/built-in-agents.md +25 -11
  195. package/docs/guide/commands-and-modes.md +18 -3
  196. package/docs/guide/configuration-and-targets.md +100 -10
  197. package/docs/guide/configuration-reference.md +17 -7
  198. package/docs/guide/environment-variables.md +4 -2
  199. package/docs/guide/installation-and-lifecycle.md +37 -4
  200. package/docs/guide/proactive-memory.md +66 -55
  201. package/docs/guide/skills-marketplace.md +18 -0
  202. package/docs/guide/tool-usage.md +78 -3
  203. package/docs/history/config-knobs-audit.md +2 -2
  204. package/docs/process/development-pipeline.md +40 -2
  205. package/docs/process/eval-runner.md +67 -3
  206. package/docs/process/git-commit-provenance.md +15 -0
  207. package/docs/process/release-cut-checklist.md +207 -0
  208. package/docs/process/scientific-validation.md +18 -17
  209. package/evals/behavioral-machinery-support.ts +1 -0
  210. package/evals/behavioral-machinery.yaml +1 -1
  211. package/evals/behavioral-model.yaml +3 -2
  212. package/package.json +2 -2
  213. package/skills/README.md +7 -5
  214. package/skills/coding/ast-grep/SKILL.md +101 -30
  215. package/skills/coding/ast-grep/evals.md +26 -0
  216. package/skills/coding/coding-standards/SKILL.md +47 -2
  217. package/skills/coding/coding-standards/evals.md +23 -0
  218. package/skills/coding/prototype/SKILL.md +87 -28
  219. package/skills/coding/prototype/evals.md +19 -0
  220. package/skills/coding/tdd/SKILL.md +80 -53
  221. package/skills/coding/tdd/evals.md +20 -0
  222. package/skills/context/context-handoff/SKILL.md +43 -2
  223. package/skills/context/context-handoff/evals.md +44 -0
  224. package/skills/context/context-prime/SKILL.md +45 -15
  225. package/skills/context/context-prime/evals.md +45 -0
  226. package/skills/git/branch-closeout/SKILL.md +132 -0
  227. package/skills/git/branch-closeout/evals.md +133 -0
  228. package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
  229. package/skills/git/file-ticket/SKILL.md +77 -63
  230. package/skills/git/file-ticket/assets/issue-template.md +22 -0
  231. package/skills/git/file-ticket/evals.md +31 -26
  232. package/skills/git/file-ticket/references/issue-discovery.md +49 -0
  233. package/skills/git/fix-issue/SKILL.md +87 -64
  234. package/skills/git/fix-issue/evals.md +35 -31
  235. package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
  236. package/skills/git/resolve-merge-conflicts/SKILL.md +100 -51
  237. package/skills/git/resolve-merge-conflicts/evals.md +52 -25
  238. package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
  239. package/skills/git/ship/SKILL.md +103 -67
  240. package/skills/git/ship/assets/pr-template.md +21 -0
  241. package/skills/git/ship/evals.md +44 -28
  242. package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
  243. package/skills/git/worktree-create/SKILL.md +80 -50
  244. package/skills/git/worktree-create/evals.md +40 -33
  245. package/skills/git/worktree-create/references/worktree-setup.md +62 -66
  246. package/skills/git/worktree-merge/SKILL.md +112 -65
  247. package/skills/git/worktree-merge/evals.md +42 -34
  248. package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
  249. package/skills/planning/archify/SKILL.md +196 -0
  250. package/skills/planning/archify/evals.md +65 -0
  251. package/skills/planning/architecture/SKILL.md +61 -12
  252. package/skills/planning/architecture/evals.md +65 -0
  253. package/skills/planning/backlog/SKILL.md +130 -14
  254. package/skills/planning/backlog/evals.md +142 -0
  255. package/skills/planning/prd/SKILL.md +47 -6
  256. package/skills/planning/prd/evals.md +54 -0
  257. package/skills/planning/product-intent/SKILL.md +57 -2
  258. package/skills/planning/product-intent/evals.md +70 -0
  259. package/skills/planning/tech-spec/SKILL.md +53 -2
  260. package/skills/planning/tech-spec/evals.md +73 -0
  261. package/skills/registry.yaml +58 -50
  262. package/skills/remote.yaml +13 -0
  263. package/skills/research/arxiv-literature/SKILL.md +76 -18
  264. package/skills/research/arxiv-literature/evals.md +50 -0
  265. package/skills/research/experiment-protocol/SKILL.md +20 -1
  266. package/skills/research/experiment-protocol/evals.md +23 -0
  267. package/skills/research/scientific-debugging/SKILL.md +24 -1
  268. package/skills/research/scientific-debugging/evals.md +18 -0
  269. package/skills/research/scientific-modernization/SKILL.md +26 -1
  270. package/skills/research/scientific-modernization/evals.md +27 -0
  271. package/skills/skill-marketplace.json +63 -28
  272. package/skills/workflow/cut-it/SKILL.md +64 -5
  273. package/skills/workflow/cut-it/evals.md +101 -0
  274. package/skills/workflow/design-council/SKILL.md +112 -27
  275. package/skills/workflow/design-council/evals.md +161 -0
  276. package/skills/workflow/grill-me/SKILL.md +85 -10
  277. package/skills/workflow/grill-me/evals.md +153 -0
  278. package/skills/workflow/workflow-distiller/SKILL.md +76 -17
  279. package/skills/workflow/workflow-distiller/evals.md +118 -0
  280. package/src/cli/args.ts +0 -8
  281. package/src/cli/configure-interop.ts +105 -13
  282. package/src/cli/configure-oauth.ts +57 -0
  283. package/src/cli/configure-onboarding.ts +980 -0
  284. package/src/cli/configure-target.ts +594 -0
  285. package/src/cli/configure.ts +1084 -529
  286. package/src/cli/context-map.ts +114 -0
  287. package/src/cli/context.ts +4 -0
  288. package/src/cli/doctor-state-size.ts +1 -12
  289. package/src/cli/doctor-validation-contract.ts +28 -0
  290. package/src/cli/doctor.ts +5 -0
  291. package/src/cli/evidence-detail.ts +1 -75
  292. package/src/cli/evidence-inventory.ts +1 -167
  293. package/src/cli/index.ts +3 -0
  294. package/src/cli/lifecycle-presenter.ts +436 -0
  295. package/src/cli/models.ts +10 -2
  296. package/src/cli/modes/print.ts +5 -1
  297. package/src/cli/reset.ts +228 -106
  298. package/src/cli/run.ts +7 -4
  299. package/src/cli/select.ts +664 -0
  300. package/src/cli/skills.ts +9 -2
  301. package/src/cli/targets.ts +3 -0
  302. package/src/cli/tasks.ts +84 -0
  303. package/src/cli/uninstall.ts +233 -165
  304. package/src/cli/upgrade.ts +210 -150
  305. package/src/cli/usage.ts +92 -27
  306. package/src/cli/validate-model.ts +3 -3
  307. package/src/cli/verifiers.ts +147 -1
  308. package/src/cli/wiki-generate.ts +1 -0
  309. package/src/core/commit-attribution.ts +41 -1
  310. package/src/core/config.ts +56 -0
  311. package/src/core/external-diagnostic.ts +44 -0
  312. package/src/core/gateway-routing.ts +157 -0
  313. package/src/core/git-commit-attribution.ts +46 -3
  314. package/src/core/run-overrides.ts +0 -5
  315. package/src/core/safe-exec.ts +17 -2
  316. package/src/core/skill-activation.ts +92 -2
  317. package/src/core/tool-names.ts +5 -2
  318. package/src/domains/agents/builtins/architect.md +1 -1
  319. package/src/domains/agents/builtins/coder.md +1 -1
  320. package/src/domains/agents/builtins/documenter.md +1 -1
  321. package/src/domains/agents/builtins/git-master.md +1 -1
  322. package/src/domains/agents/builtins/provenance.md +7 -7
  323. package/src/domains/agents/builtins/tester.md +1 -1
  324. package/src/domains/agents/builtins/verifier.md +2 -2
  325. package/src/domains/agents/builtins/wiki-writer.md +4 -3
  326. package/src/domains/agents/builtins/world-knowledge.md +31 -0
  327. package/src/domains/agents/catalog.ts +1 -1
  328. package/src/domains/agents/result-contract.ts +70 -0
  329. package/src/domains/context/extension.ts +31 -7
  330. package/src/domains/context/refresh.ts +3 -0
  331. package/src/domains/context/wiki/frontmatter.ts +5 -2
  332. package/src/domains/context/wiki/generate.ts +6 -0
  333. package/src/domains/context/wiki/map-seed.ts +589 -0
  334. package/src/domains/context/wiki/plan.ts +2 -2
  335. package/src/domains/context/wiki/prompts.ts +43 -0
  336. package/src/domains/dispatch/active-route-planner.ts +4 -0
  337. package/src/domains/dispatch/admission.ts +29 -0
  338. package/src/domains/dispatch/agent-candidates.ts +10 -0
  339. package/src/domains/dispatch/budget-envelope.ts +86 -1
  340. package/src/domains/dispatch/capability-match.ts +1 -0
  341. package/src/domains/dispatch/capacity-lease.ts +17 -0
  342. package/src/domains/dispatch/code-step.ts +11 -4
  343. package/src/domains/dispatch/contract.ts +42 -8
  344. package/src/domains/dispatch/execution-scheduler.ts +2 -0
  345. package/src/domains/dispatch/extension.ts +184 -56
  346. package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
  347. package/src/domains/dispatch/fleet-run.ts +1 -0
  348. package/src/domains/dispatch/host-verification.ts +114 -13
  349. package/src/domains/dispatch/intent.ts +28 -18
  350. package/src/domains/dispatch/orphan-recovery.ts +2 -0
  351. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  352. package/src/domains/dispatch/reservation-store.ts +5 -3
  353. package/src/domains/dispatch/state.ts +15 -2
  354. package/src/domains/dispatch/types.ts +20 -2
  355. package/src/domains/dispatch/worker-model-metadata.ts +38 -0
  356. package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
  357. package/src/domains/eval/metrics/token-stream.ts +201 -31
  358. package/src/domains/eval/metrics/tracked.ts +40 -4
  359. package/src/domains/eval/runners/clio-run.ts +17 -11
  360. package/src/domains/eval/runners/context-index.ts +2 -7
  361. package/src/domains/eval/runners/context-init.ts +3 -6
  362. package/src/domains/eval/runners/external-command.ts +29 -11
  363. package/src/domains/eval/schema/suite.ts +28 -0
  364. package/src/domains/eval/schema/verdict.ts +2 -2
  365. package/src/domains/eval/suites/resolve.ts +13 -1
  366. package/src/domains/eval/suites/run.ts +24 -3
  367. package/src/domains/evidence/build.ts +102 -15
  368. package/src/domains/evidence/detail.ts +69 -0
  369. package/src/domains/evidence/eval.ts +13 -1
  370. package/src/domains/evidence/finish-contract-map.ts +5 -1
  371. package/src/domains/evidence/inventory.ts +167 -0
  372. package/src/domains/evidence/store.ts +16 -0
  373. package/src/domains/evidence/types.ts +12 -0
  374. package/src/domains/extensions/resources.ts +7 -0
  375. package/src/domains/interop/registry.ts +6 -2
  376. package/src/domains/interop/types.ts +4 -0
  377. package/src/domains/lifecycle/migrations/index.ts +4 -0
  378. package/src/domains/memory/task-memory-policy.ts +70 -26
  379. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  380. package/src/domains/middleware/index.ts +0 -1
  381. package/src/domains/middleware/marketplace-offer.ts +22 -35
  382. package/src/domains/middleware/memory-intervention.ts +127 -32
  383. package/src/domains/middleware/memory-step-endpoint.ts +3 -2
  384. package/src/domains/middleware/runtime.ts +7 -3
  385. package/src/domains/middleware/skills-reminder.ts +31 -2
  386. package/src/domains/mux/detect.ts +3 -6
  387. package/src/domains/observability/accountability.ts +15 -1
  388. package/src/domains/observability/compaction-usage.ts +118 -0
  389. package/src/domains/observability/contract.ts +52 -7
  390. package/src/domains/observability/cost.ts +1 -1
  391. package/src/domains/observability/evidence-index.ts +10 -0
  392. package/src/domains/observability/extension.ts +15 -6
  393. package/src/domains/observability/out-of-turn-usage.ts +52 -21
  394. package/src/domains/observability/projection.ts +394 -45
  395. package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
  396. package/src/domains/prompts/fragments/operating/contract.md +2 -0
  397. package/src/domains/prompts/fragments/wiki/page.md +8 -0
  398. package/src/domains/providers/contract.ts +4 -1
  399. package/src/domains/providers/extension.ts +40 -9
  400. package/src/domains/providers/model-capabilities.ts +9 -0
  401. package/src/domains/providers/model-discovery.ts +3 -4
  402. package/src/domains/providers/model-runtime-capabilities.ts +15 -5
  403. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +48 -26
  404. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
  405. package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
  406. package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
  407. package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
  408. package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
  409. package/src/domains/providers/support.ts +11 -5
  410. package/src/domains/providers/target-model-cache.ts +25 -2
  411. package/src/domains/providers/types/capability-flags.ts +2 -0
  412. package/src/domains/providers/types/runtime-descriptor.ts +20 -1
  413. package/src/domains/providers/types/target-descriptor.ts +19 -0
  414. package/src/domains/resources/index.ts +3 -0
  415. package/src/domains/resources/skills/install.ts +72 -7
  416. package/src/domains/resources/skills/loader.ts +7 -0
  417. package/src/domains/resources/skills/marketplace.ts +63 -11
  418. package/src/domains/safety/action-classifier.ts +7 -0
  419. package/src/domains/safety/autonomy.ts +15 -0
  420. package/src/domains/safety/default-path-policy.ts +2 -0
  421. package/src/domains/safety/finish-contract-registration.ts +29 -14
  422. package/src/domains/safety/finish-contract.ts +252 -40
  423. package/src/domains/safety/index.ts +21 -1
  424. package/src/domains/safety/path-policy.ts +1 -1
  425. package/src/domains/safety/policy-engine.ts +60 -17
  426. package/src/domains/safety/protected-artifacts.ts +191 -88
  427. package/src/domains/safety/rigor.ts +53 -39
  428. package/src/domains/safety/run-effects.ts +2 -22
  429. package/src/domains/safety/skill-authority.ts +55 -0
  430. package/src/domains/safety/validation-contract.ts +388 -0
  431. package/src/domains/session/archive-readers.ts +10 -1
  432. package/src/domains/session/compaction/compact.ts +72 -22
  433. package/src/domains/session/decision-board.ts +101 -2
  434. package/src/domains/session/entries.ts +50 -7
  435. package/src/domains/session/extension.ts +4 -4
  436. package/src/domains/session/handoff.ts +2 -1
  437. package/src/domains/session/manager.ts +2 -3
  438. package/src/domains/session/task-board.ts +14 -1
  439. package/src/domains/session/tree/fork.ts +1 -2
  440. package/src/domains/session/tree/navigator.ts +1 -1
  441. package/src/domains/session/usage.ts +3 -3
  442. package/src/domains/user-tasks/acceptance.ts +56 -0
  443. package/src/domains/user-tasks/active-acceptance.ts +40 -0
  444. package/src/domains/user-tasks/store.ts +34 -3
  445. package/src/engine/acp/adapter.ts +24 -6
  446. package/src/engine/acp/server.ts +21 -4
  447. package/src/engine/acp/transport.ts +53 -8
  448. package/src/engine/acp/types.ts +4 -0
  449. package/src/engine/agent.ts +13 -3
  450. package/src/engine/ai.ts +26 -8
  451. package/src/engine/antigravity/subprocess-runtime.ts +386 -120
  452. package/src/engine/api-registry.ts +3 -0
  453. package/src/engine/apis/ollama-native.ts +15 -0
  454. package/src/engine/apis/openai-completions.ts +117 -14
  455. package/src/engine/claude/subprocess-runtime.ts +107 -60
  456. package/src/engine/external-subprocess.ts +122 -6
  457. package/src/entry/background-model-metadata.ts +18 -0
  458. package/src/entry/compaction-prompt.ts +57 -0
  459. package/src/entry/orchestrator.ts +416 -218
  460. package/src/entry/task-memory-lifecycle.ts +35 -0
  461. package/src/interactive/chat-loop-messages.ts +13 -4
  462. package/src/interactive/chat-loop.ts +65 -2
  463. package/src/interactive/chat-renderer.ts +1 -0
  464. package/src/interactive/cost-overlay.ts +26 -2
  465. package/src/interactive/dispatch-board.ts +46 -717
  466. package/src/interactive/fleet-run-preview.ts +2 -1
  467. package/src/interactive/interactive-application.ts +3 -2
  468. package/src/interactive/interactive-presentation.ts +55 -12
  469. package/src/interactive/interactive-slash-runtime.ts +4 -2
  470. package/src/interactive/oracle.ts +5 -2
  471. package/src/interactive/overlays/fleet-run-approval.ts +3 -2
  472. package/src/interactive/overlays/message-picker.ts +2 -2
  473. package/src/interactive/overlays/settings.ts +2 -2
  474. package/src/interactive/overlays/tree-selector.ts +2 -2
  475. package/src/interactive/renderers/branch-summary.ts +1 -1
  476. package/src/interactive/renderers/worker-entry.ts +32 -0
  477. package/src/interactive/slash-autocomplete.ts +4 -6
  478. package/src/interactive/slash-commands.ts +49 -45
  479. package/src/interactive/slash-spec.ts +28 -0
  480. package/src/interactive/theme/labels.ts +19 -13
  481. package/src/interactive/turn-context.ts +9 -5
  482. package/src/interactive/turn-recovery.ts +8 -0
  483. package/src/interactive/turn-runtime.ts +27 -11
  484. package/src/interactive/turn-state.ts +7 -0
  485. package/src/interactive/view/artifacts.ts +2 -0
  486. package/src/interactive/worker-receipts.ts +1 -0
  487. package/src/interactive/worker-stream.ts +13 -4
  488. package/src/tools/bootstrap.ts +4 -0
  489. package/src/tools/builtin-tool-catalog.ts +31 -0
  490. package/src/tools/compete-worktrees.ts +7 -1
  491. package/src/tools/context/index.ts +30 -9
  492. package/src/tools/core-bootstrap.ts +16 -0
  493. package/src/tools/decide.ts +136 -0
  494. package/src/tools/dispatch-admission.ts +21 -0
  495. package/src/tools/dispatch-arguments.ts +1 -0
  496. package/src/tools/dispatch-event-text.ts +10 -0
  497. package/src/tools/dispatch-plan.ts +6 -2
  498. package/src/tools/dispatch-runner.ts +27 -1
  499. package/src/tools/dispatch-types.ts +6 -0
  500. package/src/tools/evidence.ts +96 -0
  501. package/src/tools/limitation.ts +76 -0
  502. package/src/tools/policy.ts +9 -0
  503. package/src/tools/presentation.ts +3 -0
  504. package/src/tools/registry.ts +11 -5
  505. package/src/tools/result-shaping.ts +17 -5
  506. package/src/tools/task-worktree.ts +13 -3
  507. package/src/tools/tasks.ts +10 -1
  508. package/src/tools/verify/authoring.ts +170 -83
  509. package/src/tools/verify/catalog.ts +122 -5
  510. package/src/tools/verify/index.ts +2 -1
  511. package/src/tools/verify/numeric.ts +298 -0
  512. package/src/tools/verify/perf.ts +143 -0
  513. package/src/tools/verify/scripts.ts +229 -2
  514. package/src/tools/worker-evidence.ts +3 -1
  515. package/src/worker/spec-contract.ts +4 -0
  516. package/dist/chunk-2Z2IKEXI.js +0 -1554
  517. package/dist/chunk-RVG5JXAL.js +0 -41
  518. package/dist/chunk-T56WDKA5.js +0 -183
  519. package/dist/chunk-VN3SHNBN.js +0 -313
  520. package/dist/chunk-VPKWYKEY.js +0 -169
  521. package/dist/reset-OAQP3W4O.js +0 -230
  522. package/dist/uninstall-N34PCTGJ.js +0 -331
  523. package/dist/upgrade-PXK3S2YM.js +0 -325
@@ -25,6 +25,7 @@ export interface TargetModelSnapshot {
25
25
  runtimeId: string;
26
26
  url: string | null;
27
27
  models: string[];
28
+ modelLabels?: Record<string, string>;
28
29
  observedAt: string;
29
30
  }
30
31
 
@@ -32,6 +33,7 @@ interface TargetModelCacheOptions {
32
33
  cacheDir?: string;
33
34
  nowMs?: number;
34
35
  ttlMs?: number;
36
+ modelLabels?: Readonly<Record<string, string>>;
35
37
  }
36
38
 
37
39
  function targetCacheKey(targetId: string): string {
@@ -55,6 +57,22 @@ function normalizedModels(models: ReadonlyArray<string>): string[] {
55
57
  return out;
56
58
  }
57
59
 
60
+ function normalizedLabels(models: ReadonlyArray<string>, labels: unknown): Record<string, string> | undefined {
61
+ if (typeof labels !== "object" || labels === null || Array.isArray(labels)) return undefined;
62
+ const source = labels as Record<string, unknown>;
63
+ const out: Record<string, string> = {};
64
+ for (const id of models) {
65
+ const label = source[id];
66
+ if (typeof label !== "string") continue;
67
+ const trimmed = label.trim();
68
+ if (trimmed.length === 0 || trimmed.length > TARGET_MODEL_CACHE_MAX_MODEL_ID_CHARS || /[\r\n\0]/u.test(trimmed)) {
69
+ continue;
70
+ }
71
+ out[id] = trimmed;
72
+ }
73
+ return Object.keys(out).length > 0 ? out : undefined;
74
+ }
75
+
58
76
  function parseSnapshot(value: unknown): TargetModelSnapshot | null {
59
77
  if (typeof value !== "object" || value === null || Array.isArray(value)) return null;
60
78
  const row = value as Partial<TargetModelSnapshot>;
@@ -66,7 +84,7 @@ function parseSnapshot(value: unknown): TargetModelSnapshot | null {
66
84
  if (typeof row.observedAt !== "string" || !Number.isFinite(Date.parse(row.observedAt))) return null;
67
85
  const models = normalizedModels(row.models);
68
86
  if (models.length !== row.models.length) return null;
69
- return {
87
+ const snapshot: TargetModelSnapshot = {
70
88
  version: TARGET_MODEL_CACHE_VERSION,
71
89
  targetId: row.targetId,
72
90
  runtimeId: row.runtimeId,
@@ -74,6 +92,9 @@ function parseSnapshot(value: unknown): TargetModelSnapshot | null {
74
92
  models,
75
93
  observedAt: row.observedAt,
76
94
  };
95
+ const modelLabels = normalizedLabels(models, row.modelLabels);
96
+ if (modelLabels !== undefined) snapshot.modelLabels = modelLabels;
97
+ return snapshot;
77
98
  }
78
99
 
79
100
  /** Read a fresh snapshot only when it still describes this target identity. */
@@ -102,7 +123,7 @@ export function readTargetModelSnapshot(
102
123
  export function recordTargetModelSnapshot(
103
124
  target: Pick<TargetDescriptor, "id" | "runtime" | "url">,
104
125
  models: ReadonlyArray<string>,
105
- options: Pick<TargetModelCacheOptions, "cacheDir" | "nowMs"> = {},
126
+ options: Pick<TargetModelCacheOptions, "cacheDir" | "nowMs" | "modelLabels"> = {},
106
127
  ): boolean {
107
128
  if (target.id.length === 0 || target.runtime.length === 0) return false;
108
129
  const snapshot: TargetModelSnapshot = {
@@ -113,6 +134,8 @@ export function recordTargetModelSnapshot(
113
134
  models: normalizedModels(models),
114
135
  observedAt: new Date(options.nowMs ?? Date.now()).toISOString(),
115
136
  };
137
+ const modelLabels = normalizedLabels(snapshot.models, options.modelLabels);
138
+ if (modelLabels !== undefined) snapshot.modelLabels = modelLabels;
116
139
  try {
117
140
  safeResourceWrite(targetModelSnapshotPath(target.id, options.cacheDir), `${JSON.stringify(snapshot, null, 2)}\n`, {
118
141
  encoding: "utf8",
@@ -20,6 +20,8 @@ export interface CapabilityFlags {
20
20
  toolCallFormat?: ToolCallFormat;
21
21
  reasoning: boolean;
22
22
  thinkingFormat?: ThinkingFormat;
23
+ /** Probe-declared upstream control dialect only; never changes gateway routing or residency. */
24
+ thinkingControlRuntime?: "lmstudio" | "llamacpp";
23
25
  structuredOutputs?: StructuredOutputMode;
24
26
  vision: boolean;
25
27
  audio: boolean;
@@ -22,7 +22,8 @@ export type RuntimeApiFamily =
22
22
  | "rerank-http"
23
23
  | "embeddings-http"
24
24
  | "claude-agent-sdk"
25
- | "claude-code-subprocess";
25
+ | "claude-code-subprocess"
26
+ | "external-agent-subprocess";
26
27
 
27
28
  export type RuntimeAuth = "api-key" | "oauth" | "aws-sdk" | "vertex-adc" | "claude-cli" | "none";
28
29
 
@@ -93,8 +94,14 @@ export interface ProbeResult {
93
94
  ok: boolean;
94
95
  latencyMs?: number;
95
96
  error?: string;
97
+ /** Set when `error` is specifically the server rejecting the credential, not a reachability failure. */
98
+ authFailed?: boolean;
96
99
  serverVersion?: string;
97
100
  models?: string[];
101
+ /** Human-readable labels keyed by the exact wire id returned in `models`. */
102
+ modelLabels?: Record<string, string>;
103
+ /** Stable cause class for setup UX; `error` remains the redacted human diagnostic. */
104
+ failureKind?: "missing" | "authentication" | "unsupported-feature" | "catalog-unavailable" | "cancelled" | "generic";
98
105
  /** Probe-only per-model load state when the runtime exposes it. */
99
106
  modelStates?: Record<string, ProbeModelStatus>;
100
107
  discoveredCapabilities?: Partial<CapabilityFlags>;
@@ -155,6 +162,18 @@ export interface RuntimeDescriptor {
155
162
  headlessCommand?: string;
156
163
  outputParser?: string;
157
164
  defaultCapabilities: CapabilityFlags;
165
+ /**
166
+ * Declares a black-box agent loop owned by an external executable. `tools`
167
+ * in CapabilityFlags stays false because Clio neither sends nor observes
168
+ * typed calls on this path; this field records the distinct external fact.
169
+ */
170
+ externalAgentLoop?: {
171
+ tools: "externally-governed-unobserved";
172
+ network: "externally-governed-unobserved";
173
+ budget: "external-one-shot";
174
+ generatingRetry: "forbidden" | "allowed";
175
+ modelCatalog: "live-authoritative" | "static";
176
+ };
158
177
  /**
159
178
  * When true, this id is a real, distinct runtime (e.g. `llamacpp-anthropic`,
160
179
  * the Anthropic Messages surface on llama.cpp, or the embed/rerank runtimes)
@@ -39,6 +39,24 @@ export interface LmStudioTargetSettings {
39
39
  request?: LmStudioRequestSettings;
40
40
  }
41
41
 
42
+ /** Per-request controls understood by a LiteLLM proxy. Values are optional so server policy remains authoritative by default. */
43
+ export interface LiteLLMRequestSettings {
44
+ /** Extra LiteLLM request tags. Clio always adds `clio-coder`. */
45
+ tags?: string[];
46
+ /** Forward Clio's stable session id as `x-litellm-session-id`. Defaults to true. */
47
+ sendSessionId?: boolean;
48
+ /** Override the proxy/upstream request timeout through `x-litellm-timeout`. */
49
+ timeoutSeconds?: number;
50
+ /** Override LiteLLM's streamed-response timeout through `x-litellm-stream-timeout`. */
51
+ streamTimeoutSeconds?: number;
52
+ /** Override LiteLLM router retries for this request; this does not enable client-side SDK retries. */
53
+ numRetries?: number;
54
+ }
55
+
56
+ export interface LiteLLMTargetSettings {
57
+ request?: LiteLLMRequestSettings;
58
+ }
59
+
42
60
  /**
43
61
  * Persisted target specification from settings.yaml (`targets:`). It binds a
44
62
  * user-facing target id to a RuntimeDescriptor id, target URL/auth metadata,
@@ -57,6 +75,7 @@ export interface TargetDescriptor {
57
75
  gateway?: boolean;
58
76
  pricing?: TargetPricing;
59
77
  lmstudio?: LmStudioTargetSettings;
78
+ litellm?: LiteLLMTargetSettings;
60
79
  /** Explicit request-slot limit for this inference endpoint. It overrides live discovery. */
61
80
  maxConcurrentRequests?: number;
62
81
  }
@@ -67,6 +67,7 @@ export {
67
67
  modelVisibleSkills,
68
68
  parsePendingSkillRequests,
69
69
  parseSkillCommand,
70
+ SKILL_SURFACE_CLEAR_ARG,
70
71
  type Skill,
71
72
  type SkillCatalogInvalidReason,
72
73
  type SkillCatalogValidity,
@@ -89,6 +90,8 @@ export {
89
90
  type MarketplaceSkill,
90
91
  type MarketplaceSkillOrigin,
91
92
  type MarketplaceStatus,
93
+ marketplaceInstallShaping,
94
+ resolveMarketplaceShaping,
92
95
  } from "./skills/marketplace.js";
93
96
  export {
94
97
  checkSkillDrift,
@@ -40,6 +40,20 @@ export interface InstallSkillInput {
40
40
  force?: boolean;
41
41
  /** Override the Clio config dir used for the user root (testing). */
42
42
  configDir?: string;
43
+ /**
44
+ * Absolute path of a local directory whose files are copied over the fetched
45
+ * source before the install lands. Its SKILL.md becomes the installed skill
46
+ * text, so the provenance stamps and the pinned hash describe the overlay.
47
+ */
48
+ overlay?: string;
49
+ /** Top-level names dropped from the fetched source before the overlay is applied. */
50
+ exclude?: string[];
51
+ }
52
+
53
+ /** The overlay and exclude list a marketplace entry attaches to a source URL. */
54
+ export interface SkillInstallShaping {
55
+ overlay?: string;
56
+ exclude?: string[];
43
57
  }
44
58
 
45
59
  export interface InstallSkillResult {
@@ -68,6 +82,12 @@ export interface UpdateSkillsInput {
68
82
  all?: boolean;
69
83
  /** Overwrite local modifications. */
70
84
  force?: boolean;
85
+ /**
86
+ * Recovers the overlay and exclude list an installed skill was shaped with,
87
+ * keyed by its name and recorded source URL. Without it an update of a
88
+ * remote-entry skill would refetch bare upstream and drop the wrapper.
89
+ */
90
+ resolveShaping?: (skill: { name: string; sourceUrl: string }) => SkillInstallShaping | undefined;
71
91
  }
72
92
 
73
93
  /**
@@ -252,17 +272,51 @@ function fetchSource(spec: SkillSourceSpec): FetchedSource {
252
272
  }
253
273
  }
254
274
 
255
- function copySkillDir(from: string, to: string): void {
275
+ function copySkillDir(from: string, to: string, exclude: ReadonlyArray<string> = []): void {
256
276
  mkdirSync(path.dirname(to), { recursive: true });
277
+ const excluded = new Set(exclude);
257
278
  cpSync(from, to, {
258
279
  recursive: true,
259
280
  filter: (source) => {
260
281
  const base = path.basename(source);
261
- return base !== ".git" && base !== "node_modules";
282
+ if (base === ".git" || base === "node_modules") return false;
283
+ // `exclude` names top-level members only, so a nested `test/` inside
284
+ // a renderer stays where the upstream package put it.
285
+ return !(excluded.size > 0 && path.dirname(source) === from && excluded.has(base));
262
286
  },
263
287
  });
264
288
  }
265
289
 
290
+ /**
291
+ * Shape a fetched source the way a marketplace remote entry asks: drop the
292
+ * excluded top-level members, then lay the overlay's files on top. The result
293
+ * is a fresh temporary tree so the fetched source (which may be an operator's
294
+ * own local directory) is never modified, and validation runs against what
295
+ * will actually be installed.
296
+ */
297
+ function shapeSource(fetched: FetchedSource, shaping: SkillInstallShaping): FetchedSource {
298
+ const exclude = shaping.exclude ?? [];
299
+ if (!shaping.overlay && exclude.length === 0) return fetched;
300
+ if (shaping.overlay && !existsSync(shaping.overlay)) {
301
+ fetched.cleanup();
302
+ throw new Error(`skill overlay directory does not exist: ${shaping.overlay}`);
303
+ }
304
+ const tmp = mkdtempSync(path.join(tmpdir(), "clio-coder-skill-shape-"));
305
+ const shaped = path.join(tmp, "skill");
306
+ const cleanup = (): void => {
307
+ rmSync(tmp, { recursive: true, force: true });
308
+ fetched.cleanup();
309
+ };
310
+ try {
311
+ copySkillDir(fetched.skillDir, shaped, exclude);
312
+ if (shaping.overlay) copySkillDir(shaping.overlay, shaped);
313
+ return { skillDir: resolveSkillDir(shaped), cleanup };
314
+ } catch (err) {
315
+ cleanup();
316
+ throw err instanceof Error ? err : new Error(String(err));
317
+ }
318
+ }
319
+
266
320
  let skillSwapSequence = 0;
267
321
 
268
322
  /**
@@ -328,7 +382,7 @@ export function installSkillFromSource(input: InstallSkillInput): InstallSkillRe
328
382
  const cwd = input.cwd ?? process.cwd();
329
383
  const scope = input.scope ?? "project";
330
384
 
331
- const fetched = fetchSource(spec);
385
+ const fetched = shapeSource(fetchSource(spec), input);
332
386
  try {
333
387
  const { skill, warnings } = validateSourceSkill(fetched.skillDir);
334
388
  const name = (input.name ?? skill.name).trim();
@@ -385,13 +439,18 @@ function managedSkills(cwd: string, configDir?: string): Skill[] {
385
439
  );
386
440
  }
387
441
 
388
- function updateOne(skill: Skill, force: boolean): SkillUpdateReport {
442
+ function updateOne(skill: Skill, force: boolean, shaping: SkillInstallShaping = {}): SkillUpdateReport {
389
443
  const sourceUrl = skill.provenance?.installUrl;
390
444
  if (!sourceUrl) return { name: skill.name, status: "no-source", detail: "no source-url provenance recorded" };
391
445
  const spec = parseSkillSourceSpec(sourceUrl);
392
446
  if (!spec) return { name: skill.name, status: "error", detail: `unsupported source-url: ${sourceUrl}` };
393
447
 
394
- const fetched = fetchSource(spec);
448
+ let fetched: FetchedSource;
449
+ try {
450
+ fetched = shapeSource(fetchSource(spec), shaping);
451
+ } catch (err) {
452
+ return { name: skill.name, status: "error", detail: err instanceof Error ? err.message : String(err) };
453
+ }
395
454
  try {
396
455
  // The same gate a fresh install passes. Upstream may have moved on to a
397
456
  // SKILL.md that no longer loads, and without this an update replaces a
@@ -441,11 +500,17 @@ function updateOne(skill: Skill, force: boolean): SkillUpdateReport {
441
500
  export function updateSkills(input: UpdateSkillsInput = {}): SkillUpdateReport[] {
442
501
  const cwd = input.cwd ?? process.cwd();
443
502
  const skills = managedSkills(cwd, input.configDir);
503
+ const shapingFor = (skill: Skill): SkillInstallShaping =>
504
+ (skill.provenance?.installUrl &&
505
+ input.resolveShaping?.({ name: skill.name, sourceUrl: skill.provenance.installUrl })) ||
506
+ {};
444
507
  if (input.name) {
445
508
  const skill = skills.find((entry) => entry.name === input.name);
446
509
  if (!skill) return [{ name: input.name, status: "error", detail: "not found in Clio-managed skill roots" }];
447
- return [updateOne(skill, input.force === true)];
510
+ return [updateOne(skill, input.force === true, shapingFor(skill))];
448
511
  }
449
512
  if (input.all !== true) throw new Error("updateSkills requires a name or all=true");
450
- return skills.filter((skill) => skill.provenance?.installUrl).map((skill) => updateOne(skill, input.force === true));
513
+ return skills
514
+ .filter((skill) => skill.provenance?.installUrl)
515
+ .map((skill) => updateOne(skill, input.force === true, shapingFor(skill)));
451
516
  }
@@ -949,6 +949,13 @@ export function skillCatalogValidity(list: SkillList): SkillCatalogValidity {
949
949
  return { ok: true, reason: null };
950
950
  }
951
951
 
952
+ /**
953
+ * The one argument `/skill` reserves for itself: `/skill off` clears the tool
954
+ * surface an activated skill armed for the session instead of loading a skill
955
+ * by that name.
956
+ */
957
+ export const SKILL_SURFACE_CLEAR_ARG = "off";
958
+
952
959
  export function parseSkillCommand(input: string): { name: string; args: string } | null {
953
960
  const trimmed = input.trim();
954
961
  if (!trimmed.startsWith("/skill ")) return null;
@@ -9,6 +9,7 @@ import {
9
9
  installSkillFromSource,
10
10
  isSkillName,
11
11
  parseSkillSourceSpec,
12
+ type SkillInstallShaping,
12
13
  } from "./install.js";
13
14
  import { loadSkills, type Skill } from "./loader.js";
14
15
 
@@ -60,6 +61,14 @@ export interface MarketplaceSkill {
60
61
  triggers?: string[];
61
62
  origin: MarketplaceSkillOrigin;
62
63
  requires?: LibraryRequirementRef[];
64
+ /**
65
+ * Remote entry: a package-root-relative directory whose files are copied
66
+ * over the fetched upstream tree at install. Clio owns only the overlay
67
+ * (typically a wrapper SKILL.md); the upstream renderer is never vendored.
68
+ */
69
+ overlay?: string;
70
+ /** Remote entry: top-level upstream members dropped at install. */
71
+ exclude?: string[];
63
72
  }
64
73
 
65
74
  export type MarketplaceStatus = "installed" | "installable" | "unavailable";
@@ -181,6 +190,12 @@ function parseMarketplaceIndex(indexPath: string, diagnostics: string[] = []): M
181
190
  const requires = Array.isArray(record.requires)
182
191
  ? record.requires.filter((entry): entry is LibraryRequirementRef => typeof entry === "string")
183
192
  : undefined;
193
+ const overlay = optionalString(record.overlay);
194
+ if (overlay && (path.isAbsolute(overlay) || overlay.split("/").includes(".."))) {
195
+ diagnostics.push(`skill marketplace index entry has an overlay outside the package: ${skill.name}`);
196
+ return [];
197
+ }
198
+ const exclude = optionalTriggerList(record.exclude);
184
199
  return [
185
200
  {
186
201
  kind,
@@ -192,6 +207,8 @@ function parseMarketplaceIndex(indexPath: string, diagnostics: string[] = []): M
192
207
  ...(category ? { category } : {}),
193
208
  ...(triggers ? { triggers } : {}),
194
209
  ...(requires ? { requires } : {}),
210
+ ...(overlay ? { overlay } : {}),
211
+ ...(exclude ? { exclude } : {}),
195
212
  origin: "index" as const,
196
213
  },
197
214
  ];
@@ -284,25 +301,32 @@ export function discoverMarketplaceSkills(options: DiscoverMarketplaceOptions =
284
301
  const skills: MarketplaceSkill[] = [];
285
302
  const seen = new Set<string>();
286
303
 
304
+ const indexPath =
305
+ options.indexPath === null ? null : (options.indexPath ?? process.env.CLIO_CODER_SKILL_MARKETPLACE_INDEX ?? null);
306
+ const resolvedIndexPath = indexPath ?? defaultIndexPath();
307
+ const indexSkills =
308
+ options.indexPath !== null && resolvedIndexPath && existsSync(resolvedIndexPath)
309
+ ? parseMarketplaceIndex(resolvedIndexPath, diagnostics)
310
+ : [];
311
+ // A remote entry's overlay folder is also a catalog package on disk, but
312
+ // installing that folder alone would land the wrapper without the upstream
313
+ // it wraps. The index entry that names the overlay is the whole skill.
314
+ const overlayNames = new Set(indexSkills.filter((skill) => skill.overlay).map((skill) => skill.name));
315
+
287
316
  // Catalog packages first: real local files beat index pointers on name collisions.
288
317
  const catalogDir = resolveCatalogDir(options);
289
318
  if (catalogDir) {
290
319
  for (const skill of catalogSkills(catalogDir, diagnostics)) {
291
- if (seen.has(skill.name)) continue;
320
+ if (seen.has(skill.name) || overlayNames.has(skill.name)) continue;
292
321
  seen.add(skill.name);
293
322
  skills.push(skill);
294
323
  }
295
324
  }
296
325
 
297
- const indexPath =
298
- options.indexPath === null ? null : (options.indexPath ?? process.env.CLIO_CODER_SKILL_MARKETPLACE_INDEX ?? null);
299
- const resolvedIndexPath = indexPath ?? defaultIndexPath();
300
- if (options.indexPath !== null && resolvedIndexPath && existsSync(resolvedIndexPath)) {
301
- for (const skill of parseMarketplaceIndex(resolvedIndexPath, diagnostics)) {
302
- if (seen.has(skill.name)) continue;
303
- seen.add(skill.name);
304
- skills.push(skill);
305
- }
326
+ for (const skill of indexSkills) {
327
+ if (seen.has(skill.name)) continue;
328
+ seen.add(skill.name);
329
+ skills.push(skill);
306
330
  }
307
331
 
308
332
  if (skills.length === 0 && diagnostics.length === 0) {
@@ -315,6 +339,34 @@ export function getMarketplaceSkills(options: DiscoverMarketplaceOptions = {}):
315
339
  return discoverMarketplaceSkills(options).skills;
316
340
  }
317
341
 
342
+ /**
343
+ * The install shaping a marketplace entry carries, with its overlay resolved
344
+ * to an absolute directory under the package root. An entry with neither
345
+ * field shapes nothing, so the caller can spread the result unconditionally.
346
+ */
347
+ export function marketplaceInstallShaping(skill: MarketplaceSkill): SkillInstallShaping {
348
+ const shaping: SkillInstallShaping = {};
349
+ if (skill.overlay) shaping.overlay = path.join(resolvePackageRoot(), skill.overlay);
350
+ if (skill.exclude && skill.exclude.length > 0) shaping.exclude = [...skill.exclude];
351
+ return shaping;
352
+ }
353
+
354
+ /**
355
+ * Recover the shaping for an installed skill by name and recorded source URL,
356
+ * for `updateSkills`. Only a marketplace entry that still points at the same
357
+ * upstream URL applies; a skill installed from a URL the index no longer
358
+ * carries updates bare, as it was installed.
359
+ */
360
+ export function resolveMarketplaceShaping(options: DiscoverMarketplaceOptions = {}) {
361
+ return (installed: { name: string; sourceUrl: string }): SkillInstallShaping | undefined => {
362
+ const entry = getMarketplaceSkills(options).find(
363
+ (skill) => skill.name === installed.name && skill.sourceUrl === installed.sourceUrl,
364
+ );
365
+ if (!entry || (!entry.overlay && !entry.exclude)) return undefined;
366
+ return marketplaceInstallShaping(entry);
367
+ };
368
+ }
369
+
318
370
  /**
319
371
  * The single install entry point for every frontend (headless CLI, TUI
320
372
  * pending-skill prompt, skills hub). Source resolution, in precedence order:
@@ -339,7 +391,7 @@ export function installSkill(input: InstallSkillInput): InstallSkillResult {
339
391
  if (!skill) {
340
392
  throw new Error(`"${source}" is neither an existing local path nor available in the local marketplace`);
341
393
  }
342
- return installSkillFromSource({ ...input, source: skill.sourceUrl });
394
+ return installSkillFromSource({ ...input, ...marketplaceInstallShaping(skill), source: skill.sourceUrl });
343
395
  }
344
396
  return installSkillFromSource({ ...input, source });
345
397
  }
@@ -84,6 +84,7 @@ function isUnderPrefix(abs: string, prefix: string): boolean {
84
84
 
85
85
  function baseClassify(tool: string): ActionClass | null {
86
86
  switch (tool) {
87
+ case ToolNames.Evidence:
87
88
  case ToolNames.Read:
88
89
  case ToolNames.Grep:
89
90
  case ToolNames.Find:
@@ -110,6 +111,12 @@ function baseClassify(tool: string): ActionClass | null {
110
111
  // or survives the session, so it is reversible, local, and never gated
111
112
  // behind a confirmation.
112
113
  case ToolNames.Panes:
114
+ // limitation appends a typed receipt to the session ledger and touches
115
+ // nothing else, so it is never gated behind a confirmation.
116
+ case ToolNames.Limitation:
117
+ // decide appends the model's own design decision to the session
118
+ // decision board. One ledger append, no workspace effect, never gated.
119
+ case ToolNames.Decide:
113
120
  return "read";
114
121
  case ToolNames.Write:
115
122
  case ToolNames.Edit:
@@ -68,6 +68,21 @@ export interface AutonomyMappingOptions {
68
68
  exposure?: AutonomyExposure;
69
69
  }
70
70
 
71
+ /**
72
+ * Whether the model may activate an installed skill itself rather than
73
+ * emitting the suggestion anchor and waiting for the operator to type
74
+ * `/skill <name>`.
75
+ *
76
+ * At `read-only` and `suggest` the operator asked to be consulted before the
77
+ * agent acts, and activation is an action. At `auto-edit` and `full-auto` they
78
+ * already said otherwise, and a skill can only narrow the tool surface, never
79
+ * widen it, so the gate buys no safety there. The level is the opt-in; there is
80
+ * no per-skill frontmatter flag for this.
81
+ */
82
+ export function modelMayActivateSkills(level: AutonomyLevel): boolean {
83
+ return level === "auto-edit" || level === "full-auto";
84
+ }
85
+
71
86
  /**
72
87
  * The §2.3 level-dependent matrix. `git_destructive` never reaches this
73
88
  * mapping in practice (the safety net blocks it first); it maps to deny
@@ -67,8 +67,10 @@ export const DEFAULT_DAMAGE_CONTROL_PATH_POLICY: PathPolicyInput = {
67
67
  // widen its own permissions in two tool calls. Both are authored by the
68
68
  // operator through the CLI (`clio-coder verifiers author` lands nothing
69
69
  // before `--yes`), so model-side writes and deletes are refused.
70
+ // Skills also refuse model-side writes and deletes; installs go through `clio-coder skills install`.
70
71
  ".clio-coder/safety.yaml",
71
72
  ".clio-coder/verifiers.yaml",
73
+ ".clio-coder/skills/",
72
74
  "/etc/",
73
75
  "/usr/",
74
76
  "/bin/",
@@ -4,16 +4,22 @@
4
4
  * The chat-loop fires `turn_end` with the final assistant text and this
5
5
  * registration emits an advisory `inject_reminder` (severity "warn") when the
6
6
  * turn mutated workspace state but recorded no validation evidence and no
7
- * explicit limitation. The trigger is the observed mutation, not the wording of
8
- * the assistant's text. The chat-loop's generic effect application renders the
7
+ * `limitation` receipt. The trigger is the observed mutation, not the wording
8
+ * of the assistant's text, and the text never enters the assessment. The chat-loop's generic effect application renders the
9
9
  * notice, persists the session entry, and flushes the reminder into the next
10
10
  * model request. Every decision is also written to the audit ledger.
11
11
  */
12
12
 
13
13
  import { VERIFICATION_SCRIPT_FAMILY_HINT } from "../../core/verification-scripts.js";
14
14
  import type { MiddlewareEffect, MiddlewareHookInput, MiddlewareHookRegistration } from "../middleware/index.js";
15
+ import type { UserTaskAcceptance } from "../user-tasks/acceptance.js";
15
16
  import type { CompletionContractAuditInput } from "./audit.js";
16
- import { assessFinishContract, type FinishContractAssessment } from "./finish-contract.js";
17
+ import {
18
+ assessFinishContract,
19
+ DEFAULT_RECENT_ENTRY_LIMIT,
20
+ type FinishContractAssessment,
21
+ recentEntries,
22
+ } from "./finish-contract.js";
17
23
  import type { Rigor } from "./rigor.js";
18
24
 
19
25
  export const FINISH_CONTRACT_REGISTRATION_ID = "assessor.finish-contract";
@@ -21,15 +27,15 @@ export const FINISH_CONTRACT_REGISTRATION_ID = "assessor.finish-contract";
21
27
  /**
22
28
  * High-rigor re-prompt directive. Injected dynamically via effects (never added
23
29
  * to the static system prompt) so the prompt prefix stays byte-stable. It tells
24
- * the model to validate with a verification-family command or to state what
25
- * could not be verified before claiming done. The command hint mirrors the
30
+ * the model to validate with a verification-family command or to record a
31
+ * `limitation` receipt before claiming done. The command hint mirrors the
26
32
  * vocabulary `detectValidationCommand` and `isVerificationScriptName` accept.
27
33
  */
28
34
  export const HIGH_RIGOR_REVALIDATION_MESSAGE =
29
35
  `[Clio Coder] high-rigor finish gate: this completion claim has no validation evidence. ` +
30
36
  `Before claiming done, run a verification command (the ${VERIFICATION_SCRIPT_FAMILY_HINT} family, ` +
31
- `e.g. "npm run test", "npm run lint", "npm run build") or explicitly state what could not be verified ` +
32
- `and why. Do not end the turn until you have validated or recorded the limitation.`;
37
+ `e.g. "npm run test", "npm run lint", "npm run build") or call the limitation tool with the scope ` +
38
+ `and reason of what could not be verified. Do not end the turn until you have validated or recorded the limitation.`;
33
39
 
34
40
  export interface CreateFinishContractRegistrationOptions {
35
41
  /**
@@ -45,6 +51,7 @@ export interface CreateFinishContractRegistrationOptions {
45
51
  * limitation instead of merely warning.
46
52
  */
47
53
  resolveRigor?: () => Rigor;
54
+ readActiveAcceptance?: (window: ReadonlyArray<unknown>) => UserTaskAcceptance | undefined;
48
55
  /**
49
56
  * Record the contract's decision to the audit ledger. Optional; when wired
50
57
  * (production passes the safety audit sink), every turn_end decision — each
@@ -59,7 +66,7 @@ export function createFinishContractRegistration(
59
66
  ): MiddlewareHookRegistration {
60
67
  return {
61
68
  id: FINISH_CONTRACT_REGISTRATION_ID,
62
- description: "advise when a turn mutated files without validation evidence or an explicit limitation",
69
+ description: "advise when a turn mutated files without validation evidence or a limitation receipt",
63
70
  hooks: ["turn_end"],
64
71
  evaluate(input: MiddlewareHookInput, context): ReadonlyArray<MiddlewareEffect> {
65
72
  if (input.hook !== "turn_end") return [];
@@ -70,8 +77,9 @@ export function createFinishContractRegistration(
70
77
  // finalAssistantStopMessage.
71
78
  const stopReason = input.metadata?.stopReason;
72
79
  if (stopReason !== undefined && stopReason !== "stop") return [];
73
- const assistantText = input.text?.trim() ?? "";
74
- if (assistantText.length === 0) return [];
80
+ // An empty final text is not a completion claim. The assessor reads
81
+ // only ledger receipts, so the text is otherwise unused here.
82
+ if ((input.text?.trim() ?? "").length === 0) return [];
75
83
  let entries: ReadonlyArray<unknown> | null;
76
84
  try {
77
85
  entries = options.readSessionEntries();
@@ -79,21 +87,28 @@ export function createFinishContractRegistration(
79
87
  return [];
80
88
  }
81
89
  if (entries === null) return [];
90
+ const rigor = options.resolveRigor?.() ?? "normal";
91
+ const activeAcceptance =
92
+ rigor === "high"
93
+ ? options.readActiveAcceptance?.(recentEntries(entries, input.turnId ?? null, DEFAULT_RECENT_ENTRY_LIMIT))
94
+ : undefined;
82
95
  const assessment = assessFinishContract({
83
- assistantText,
84
96
  sessionEntries: entries,
97
+ workspaceRoot: process.cwd(),
98
+ rigor,
99
+ ...(activeAcceptance ? { activeAcceptance } : {}),
85
100
  assistantTurnId: input.turnId ?? null,
86
101
  });
87
- const rigor = options.resolveRigor?.() ?? "normal";
88
102
  recordDecision(options, input.turnId ?? null, assessment, rigor);
89
103
  if (assessment.kind !== "engage") return [];
90
104
  if (rigor === "high") {
91
105
  // Withhold the completion and force a re-prompt: a continuation
92
106
  // request carries the turn onward, and the paired reminder gives
93
107
  // the directive its own visible system-reminder line.
108
+ const message = activeAcceptance?.verification.length ? assessment.message : HIGH_RIGOR_REVALIDATION_MESSAGE;
94
109
  return [
95
- { kind: "request_continuation", message: HIGH_RIGOR_REVALIDATION_MESSAGE },
96
- { kind: "inject_reminder", message: HIGH_RIGOR_REVALIDATION_MESSAGE, severity: "warn" },
110
+ { kind: "request_continuation", message },
111
+ { kind: "inject_reminder", message, severity: "warn" },
97
112
  ];
98
113
  }
99
114
  return [{ kind: "inject_reminder", message: assessment.message, severity: "warn" }];