@iowarp/clio-coder 0.4.1 → 0.4.3

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 (604) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/CONTRIBUTING.md +142 -52
  3. package/README.md +434 -473
  4. package/SECURITY.md +2 -1
  5. package/dist/{acp-ZILU3AUO.js → acp-H2NGRPWO.js} +12 -12
  6. package/dist/{agents-HYWGBGQR.js → agents-TL5LLUQP.js} +56 -55
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/{auth-N3QT7CBO.js → auth-E5SW4HMS.js} +23 -21
  9. package/dist/builtins-IA7V7FUC.js +22 -0
  10. package/dist/{chunk-7RY5VZPH.js → chunk-2APPQIER.js} +8 -8
  11. package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
  12. package/dist/{chunk-JA5QWE4Z.js → chunk-2UG5F4C5.js} +1973 -1664
  13. package/dist/{chunk-5YHDIDBP.js → chunk-2UH2KFUP.js} +2 -2
  14. package/dist/{chunk-CTJ4RNAA.js → chunk-2VIKGWFZ.js} +2 -2
  15. package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
  16. package/dist/{chunk-GIZNH63R.js → chunk-35MSIRKH.js} +9 -4
  17. package/dist/chunk-3EBYEESD.js +314 -0
  18. package/dist/{chunk-J5LZHVIT.js → chunk-3M6DQK6S.js} +113 -35
  19. package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
  20. package/dist/{chunk-6FN3E6KX.js → chunk-4O6MANBS.js} +2 -2
  21. package/dist/chunk-4UVU7BJ5.js +39 -0
  22. package/dist/{chunk-VKRH2TCS.js → chunk-4WR7VSYB.js} +2 -2
  23. package/dist/{chunk-BBTJOK6Y.js → chunk-54CBCGIR.js} +5 -5
  24. package/dist/{chunk-AP73CFDC.js → chunk-5ICU3EUH.js} +2 -2
  25. package/dist/chunk-5MEZN6CB.js +1334 -0
  26. package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
  27. package/dist/{chunk-ABLSQ6JX.js → chunk-64I3JVYM.js} +8 -2
  28. package/dist/{chunk-AFKWHWXF.js → chunk-6PTFB5VS.js} +39 -22
  29. package/dist/{chunk-VN3SHNBN.js → chunk-7DICMOS6.js} +2 -2
  30. package/dist/chunk-7DRAWPTZ.js +360 -0
  31. package/dist/chunk-7E7I3WLS.js +3762 -0
  32. package/dist/{chunk-BJGUKIG4.js → chunk-7ZYNNDKC.js} +7 -7
  33. package/dist/{chunk-XKA2ICR3.js → chunk-AF4YM7Z4.js} +652 -252
  34. package/dist/{chunk-GVQJ5CCZ.js → chunk-AX2THNSA.js} +12 -12
  35. package/dist/{chunk-IG7BCQBA.js → chunk-B4OAX3SI.js} +65 -3
  36. package/dist/{chunk-TD3PGPQA.js → chunk-B4VEBZKF.js} +3 -3
  37. package/dist/{chunk-74YWRRU5.js → chunk-BEPZRGGU.js} +10 -10
  38. package/dist/{chunk-FEFIFZTL.js → chunk-CE5AX47J.js} +2 -2
  39. package/dist/{chunk-UAPGZHYC.js → chunk-DWUOQKRU.js} +25 -11
  40. package/dist/{chunk-THYWACCR.js → chunk-E3TPLWFX.js} +3 -3
  41. package/dist/{chunk-7EPLI7VL.js → chunk-EKCHAPYA.js} +2 -2
  42. package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
  43. package/dist/{chunk-PJJ6MY27.js → chunk-F5JHEYZM.js} +7 -7
  44. package/dist/{chunk-6CCS4G3W.js → chunk-FTMGRKEF.js} +3 -3
  45. package/dist/{chunk-SINK3QR6.js → chunk-G76U63X4.js} +17 -17
  46. package/dist/{chunk-EIMVLWB3.js → chunk-GHS5EBTQ.js} +64 -9
  47. package/dist/{chunk-QMXC4JB7.js → chunk-GI7YYQ3F.js} +187 -1419
  48. package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
  49. package/dist/{chunk-6HMJX2VU.js → chunk-GWZNEVM2.js} +44 -12
  50. package/dist/chunk-GYV6VZOC.js +26 -0
  51. package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
  52. package/dist/{chunk-UXN6JT4W.js → chunk-HEQY7ZFI.js} +3 -3
  53. package/dist/{chunk-7PWAODYW.js → chunk-I7XBWTYH.js} +2 -2
  54. package/dist/{chunk-GCSMB2KY.js → chunk-I7ZPNEJM.js} +145 -102
  55. package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
  56. package/dist/{chunk-QTFGO774.js → chunk-IGLP3ODT.js} +29 -16
  57. package/dist/chunk-IJNZMHLA.js +101 -0
  58. package/dist/{chunk-BDPT6GTK.js → chunk-INY6HTFL.js} +7 -7
  59. package/dist/{chunk-PBP4B7XR.js → chunk-IUE3Y34X.js} +2 -2
  60. package/dist/{chunk-6NJQITNH.js → chunk-IWT4SF4R.js} +6 -3
  61. package/dist/{chunk-R23Z6K6I.js → chunk-JDAY6FIL.js} +19 -19
  62. package/dist/chunk-JEQ3XTHC.js +42 -0
  63. package/dist/{chunk-FSP7CMNU.js → chunk-JGRC33J2.js} +50 -4
  64. package/dist/{chunk-TVH4ONAM.js → chunk-JKKCYP3C.js} +10 -10
  65. package/dist/{chunk-HJWWJ6IL.js → chunk-JSC3U7TI.js} +16 -4
  66. package/dist/{chunk-C537JADH.js → chunk-KK4JZPBQ.js} +19 -141
  67. package/dist/{chunk-K6BF4U2H.js → chunk-KKOJXO6R.js} +62 -14
  68. package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
  69. package/dist/{chunk-6DWBAZ5U.js → chunk-L47TF46W.js} +5 -7
  70. package/dist/{chunk-HUAS7ITX.js → chunk-LDJG7DW3.js} +91 -42
  71. package/dist/{chunk-CDNVLKUX.js → chunk-LLDJM5XK.js} +13 -7
  72. package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
  73. package/dist/{chunk-Y4CAGMM6.js → chunk-MNJGS2IN.js} +5 -6
  74. package/dist/{chunk-VKFQTNDV.js → chunk-MUW2BDDH.js} +4 -4
  75. package/dist/{chunk-E67WX76H.js → chunk-MWUZBSAQ.js} +104 -152
  76. package/dist/{chunk-OJTRZGR3.js → chunk-N2Z7HLVY.js} +21 -21
  77. package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
  78. package/dist/{chunk-FYUN5KZ3.js → chunk-NIQJ66N4.js} +21 -21
  79. package/dist/{chunk-U2WB7TZS.js → chunk-NMJXSHBJ.js} +97 -85
  80. package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
  81. package/dist/{chunk-VEGN6WIQ.js → chunk-O5CVSAG5.js} +3 -3
  82. package/dist/{chunk-MOPSG2X7.js → chunk-OML5D5V5.js} +8 -8
  83. package/dist/{chunk-2VG7KLYV.js → chunk-PAJQJ7BS.js} +5816 -3255
  84. package/dist/{chunk-ZW55JB7N.js → chunk-PUVDKJ2Y.js} +2 -2
  85. package/dist/{chunk-BTGG6BG2.js → chunk-QWGDJJYJ.js} +158 -19
  86. package/dist/chunk-R6Q67RJH.js +134 -0
  87. package/dist/{chunk-ZJLUDYFY.js → chunk-RRNP2ANY.js} +6 -6
  88. package/dist/{chunk-PVAMAVBB.js → chunk-RSJ25QSL.js} +102 -2
  89. package/dist/{chunk-NLFAQR7Z.js → chunk-S66XZJOF.js} +3 -23
  90. package/dist/chunk-SKHCAU7K.js +385 -0
  91. package/dist/chunk-SZAA6XDG.js +30 -0
  92. package/dist/{chunk-J4HBWF6Y.js → chunk-TM6LQDI3.js} +131 -28
  93. package/dist/chunk-UOIZ7DA4.js +41 -0
  94. package/dist/{chunk-MA3H6DM5.js → chunk-UPZU6GE4.js} +25 -3
  95. package/dist/{chunk-BWW4HLO4.js → chunk-UXCU4E3T.js} +8 -6
  96. package/dist/{chunk-N5UK64DP.js → chunk-V2ANDPVT.js} +4 -4
  97. package/dist/{chunk-AK5XEFVZ.js → chunk-VA5FNYMT.js} +26 -13
  98. package/dist/{chunk-6VC4OV3Z.js → chunk-VIA6RFQZ.js} +3 -11
  99. package/dist/{chunk-ZAZB4JMW.js → chunk-VKPAQYEB.js} +27 -8
  100. package/dist/{chunk-QKIFBZKT.js → chunk-VW6DOEDG.js} +497 -81
  101. package/dist/{chunk-SCYB3HA4.js → chunk-W6RRQCPQ.js} +63 -19
  102. package/dist/{chunk-2NM363SV.js → chunk-WBKFA554.js} +10 -10
  103. package/dist/{chunk-R32CLGZ6.js → chunk-WCXUNS7U.js} +82 -21
  104. package/dist/{chunk-GPPB3JBE.js → chunk-WRBAGUNF.js} +3 -3
  105. package/dist/{chunk-IXJT6DCX.js → chunk-XIVNBFZS.js} +85 -30
  106. package/dist/{chunk-UEDMSP56.js → chunk-XPWWI35G.js} +417 -201
  107. package/dist/chunk-XRZT5WY5.js +47 -0
  108. package/dist/{chunk-3QSOM6PA.js → chunk-Y3CBHOR6.js} +2 -2
  109. package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
  110. package/dist/{chunk-AKB4GYDL.js → chunk-YQWYVTMC.js} +5 -5
  111. package/dist/{chunk-6I5ILFOF.js → chunk-ZA4VCIGV.js} +3 -3
  112. package/dist/{chunk-7OBGU7UB.js → chunk-ZDN3Y73Y.js} +12 -18
  113. package/dist/{chunk-3I5NY75V.js → chunk-ZWPRK62N.js} +8 -5
  114. package/dist/cli/index.js +41 -39
  115. package/dist/{clio-IT3G3VQH.js → clio-CMMK4KRR.js} +9 -9
  116. package/dist/{code-nav-RK6S7F6E.js → code-nav-MDZNQS33.js} +89 -21
  117. package/dist/{components-UBWCQSRW.js → components-UCUQ4QXW.js} +4 -4
  118. package/dist/{config-3QZRWZJF.js → config-SVM5P5YI.js} +131 -84
  119. package/dist/{configure-FL7Y3KJF.js → configure-LE3IK2TJ.js} +28 -26
  120. package/dist/{context-5HE7ODYK.js → context-2OHRKS42.js} +69 -64
  121. package/dist/{context-KYQFRVDC.js → context-E3VC7RX5.js} +15 -11
  122. package/dist/{context-XNHL75JV.js → context-VNCR7KAG.js} +93 -65
  123. package/dist/{context-clear-N545L53A.js → context-clear-BW4O37TG.js} +64 -60
  124. package/dist/context-map-COB37XXN.js +505 -0
  125. package/dist/{context-working-set-QHKXSV2F.js → context-working-set-VDS25HXZ.js} +19 -18
  126. package/dist/{dispatch-runner-RGIE5PCT.js → dispatch-runner-5AHT53RF.js} +93 -82
  127. package/dist/{docs-5NAF6AU7.js → docs-PD3EXDKU.js} +21 -20
  128. package/dist/{doctor-ZGPEGHIP.js → doctor-WNNVO6FY.js} +48 -47
  129. package/dist/{eval-GXLL44RD.js → eval-7G7SGAYO.js} +287 -115
  130. package/dist/{eval-inventory-HBWSWQOK.js → eval-inventory-Y6QRFOH5.js} +4 -4
  131. package/dist/{evidence-HWLBRH3Q.js → evidence-VD6736FQ.js} +67 -64
  132. package/dist/{evolve-FTZBMNVW.js → evolve-AL3NGVRL.js} +65 -62
  133. package/dist/{extensions-VHRBEID7.js → extensions-MOVJ32NM.js} +9 -7
  134. package/dist/{fleet-CKZHJWZJ.js → fleet-QZHUMAGI.js} +114 -111
  135. package/dist/{fleet-commands-EXDXBMV6.js → fleet-commands-BAYT5FJZ.js} +10 -10
  136. package/dist/{fleet-decisions-OTHB6KRL.js → fleet-decisions-IREVMRU4.js} +7 -6
  137. package/dist/{fleet-graph-YTEZUCUT.js → fleet-graph-YCTT3HTI.js} +22 -19
  138. package/dist/{fleet-inspect-SS6YMDCK.js → fleet-inspect-QVJTDAVB.js} +58 -55
  139. package/dist/{fleet-preflight-PBY4VYOM.js → fleet-preflight-25QAFPK4.js} +4 -4
  140. package/dist/{fleet-validate-KMEM5L3S.js → fleet-validate-5O57AAJ7.js} +26 -23
  141. package/dist/{fleet-verify-QD5M7E7Q.js → fleet-verify-CPH2W2T6.js} +59 -56
  142. package/dist/{fleet-view-WAMJYNDT.js → fleet-view-SWBR3VGQ.js} +58 -55
  143. package/dist/{init-5XQRBOFV.js → init-J477LKZH.js} +82 -79
  144. package/dist/{interop-34TVO25M.js → interop-3FCM6XLG.js} +11 -11
  145. package/dist/{library-3QY6KF57.js → library-QUQEIUG6.js} +30 -27
  146. package/dist/{memory-L4UTIIIW.js → memory-SGGSEP65.js} +67 -64
  147. package/dist/{models-ZVX3QOWE.js → models-HEKUAXXK.js} +53 -46
  148. package/dist/{monitor-CEKVSYTS.js → monitor-HKU57TYQ.js} +63 -60
  149. package/dist/{orchestrator-77BAP6BC.js → orchestrator-VDFAEFAI.js} +1831 -1057
  150. package/dist/{panes-7STHOAUJ.js → panes-DN2SSFOH.js} +5 -5
  151. package/dist/{panes-SHAUIRXY.js → panes-TALGNPZT.js} +29 -14
  152. package/dist/{paths-L7LGY6RN.js → paths-NBMFAIEZ.js} +5 -5
  153. package/dist/reset-EAJFFJVB.js +344 -0
  154. package/dist/{resources-74GKTLSF.js → resources-OVKSEFVE.js} +29 -20
  155. package/dist/{run-HBAUJNNZ.js → run-7DP7ZF2J.js} +120 -115
  156. package/dist/{share-G3APVLVP.js → share-WML67FT3.js} +32 -27
  157. package/dist/{skills-35HHUKCR.js → skills-SG662R2K.js} +41 -31
  158. package/dist/{skills-eval-QN4HSHDC.js → skills-eval-VVZEUU46.js} +78 -77
  159. package/dist/{skills-inventory-J357J34F.js → skills-inventory-I2E23GET.js} +23 -20
  160. package/dist/{slash-commands-JZZCQA32.js → slash-commands-S7MBJDQK.js} +40 -36
  161. package/dist/{steer-XAVHJM22.js → steer-2LQOMCPB.js} +3 -3
  162. package/dist/{support-U7QOWY26.js → support-CC2UJBJ6.js} +6 -6
  163. package/dist/{targets-DSM6CY3M.js → targets-4QC3HIEW.js} +54 -54
  164. package/dist/{terminal-lease-JOPFUVEM.js → terminal-lease-TUHIJ6Y2.js} +5 -5
  165. package/dist/{tools-MKNWVPBH.js → tools-TFGJICCU.js} +10 -10
  166. package/dist/{trace-ECQ7TIYZ.js → trace-FXMXUZUF.js} +55 -7
  167. package/dist/uninstall-5PEVOE5B.js +408 -0
  168. package/dist/upgrade-M4WXY6KN.js +303 -0
  169. package/dist/{usage-X52N3IDJ.js → usage-N7ZNVLEM.js} +151 -104
  170. package/dist/{verifiers-EJTVVSMA.js → verifiers-DJTP4XX6.js} +15 -15
  171. package/dist/{verify-YJL6XET2.js → verify-RWE4PPEK.js} +9 -9
  172. package/dist/{web-fetch-MPIFL3LL.js → web-fetch-MPARV2K7.js} +2 -2
  173. package/dist/{wiki-generate-4NDZTQ4B.js → wiki-generate-C7IQOXSP.js} +89 -86
  174. package/dist/{with-panes-OBOBFIIR.js → with-panes-4GCGSL7J.js} +53 -257
  175. package/dist/worker/entry.js +90 -74
  176. package/docs/README.md +176 -81
  177. package/docs/{acp.md → architecture/acp.md} +36 -20
  178. package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
  179. package/docs/{architecture.md → architecture/architecture.md} +43 -22
  180. package/docs/{artifact-placement.md → architecture/artifact-placement.md} +27 -23
  181. package/docs/architecture/artifact-versions.md +90 -0
  182. package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
  183. package/docs/{context-engine.md → architecture/context-engine.md} +29 -25
  184. package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
  185. package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
  186. package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
  187. package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
  188. package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
  189. package/docs/{model-catalog.md → architecture/model-catalog.md} +61 -27
  190. package/docs/{observability.md → architecture/observability.md} +38 -14
  191. package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
  192. package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +57 -20
  193. package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +99 -25
  194. package/docs/{safety-model.md → architecture/safety-model.md} +35 -20
  195. package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
  196. package/docs/architecture/time-conventions.md +125 -0
  197. package/docs/{trace-store.md → architecture/trace-store.md} +13 -5
  198. package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
  199. package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
  200. package/docs/{built-in-agents.md → guide/built-in-agents.md} +65 -35
  201. package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +66 -61
  202. package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -297
  203. package/docs/guide/configuration-reference.md +1163 -0
  204. package/docs/{environment-variables.md → guide/environment-variables.md} +33 -28
  205. package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +6 -3
  206. package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
  207. package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +39 -43
  208. package/docs/{glossary.md → guide/glossary.md} +14 -11
  209. package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +81 -17
  210. package/docs/guide/panes-and-files.md +290 -0
  211. package/docs/{proactive-memory.md → guide/proactive-memory.md} +131 -107
  212. package/docs/{resource-library.md → guide/resource-library.md} +13 -4
  213. package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +25 -3
  214. package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
  215. package/docs/{troubleshooting.md → guide/troubleshooting.md} +9 -4
  216. package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +11 -11
  217. package/docs/{release-cut-checklist.md → history/release-cut-checklist.md} +29 -2
  218. package/docs/process/development-pipeline.md +152 -0
  219. package/docs/process/documentation-coverage.md +100 -0
  220. package/docs/process/documentation-guide.md +187 -0
  221. package/docs/{eval-runner.md → process/eval-runner.md} +108 -53
  222. package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
  223. package/docs/{evolution.md → process/evolution.md} +2 -2
  224. package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +11 -7
  225. package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
  226. package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
  227. package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
  228. package/evals/README.md +2 -2
  229. package/evals/behavioral-model.yaml +3 -2
  230. package/package.json +10 -8
  231. package/skills/README.md +52 -41
  232. package/skills/coding/ast-grep/SKILL.md +102 -31
  233. package/skills/coding/ast-grep/evals.md +26 -0
  234. package/skills/coding/coding-standards/SKILL.md +41 -6
  235. package/skills/coding/coding-standards/evals.md +23 -0
  236. package/skills/coding/prototype/SKILL.md +88 -29
  237. package/skills/coding/prototype/evals.md +19 -0
  238. package/skills/coding/tdd/SKILL.md +81 -54
  239. package/skills/coding/tdd/evals.md +20 -0
  240. package/skills/context/context-handoff/SKILL.md +44 -3
  241. package/skills/context/context-handoff/evals.md +44 -0
  242. package/skills/context/context-prime/SKILL.md +46 -16
  243. package/skills/context/context-prime/evals.md +45 -0
  244. package/skills/git/branch-closeout/SKILL.md +132 -0
  245. package/skills/git/branch-closeout/evals.md +133 -0
  246. package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
  247. package/skills/git/file-ticket/SKILL.md +78 -64
  248. package/skills/git/file-ticket/assets/issue-template.md +22 -0
  249. package/skills/git/file-ticket/evals.md +31 -26
  250. package/skills/git/file-ticket/references/issue-discovery.md +49 -0
  251. package/skills/git/fix-issue/SKILL.md +88 -65
  252. package/skills/git/fix-issue/evals.md +35 -31
  253. package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
  254. package/skills/git/resolve-merge-conflicts/SKILL.md +101 -52
  255. package/skills/git/resolve-merge-conflicts/evals.md +52 -25
  256. package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
  257. package/skills/git/ship/SKILL.md +103 -67
  258. package/skills/git/ship/assets/pr-template.md +21 -0
  259. package/skills/git/ship/evals.md +44 -28
  260. package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
  261. package/skills/git/worktree-create/SKILL.md +80 -50
  262. package/skills/git/worktree-create/evals.md +40 -33
  263. package/skills/git/worktree-create/references/worktree-setup.md +62 -66
  264. package/skills/git/worktree-merge/SKILL.md +112 -65
  265. package/skills/git/worktree-merge/evals.md +42 -34
  266. package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
  267. package/skills/meta/clio-coder-dev/SKILL.md +9 -5
  268. package/skills/meta/clio-coder-dev/evals.md +3 -2
  269. package/skills/meta/clio-coder-test/SKILL.md +102 -95
  270. package/skills/meta/clio-coder-test/evals.md +9 -4
  271. package/skills/meta/clio-coder-test/references/harness.md +100 -124
  272. package/skills/meta/clio-coder-test/references/test-map.md +77 -50
  273. package/skills/meta/credentials/SKILL.md +2 -2
  274. package/skills/meta/find-skills/SKILL.md +2 -2
  275. package/skills/meta/herdr/SKILL.md +2 -2
  276. package/skills/meta/skill-craft/SKILL.md +22 -16
  277. package/skills/planning/archify/SKILL.md +196 -0
  278. package/skills/planning/archify/evals.md +65 -0
  279. package/skills/planning/architecture/SKILL.md +62 -13
  280. package/skills/planning/architecture/evals.md +65 -0
  281. package/skills/planning/backlog/SKILL.md +131 -15
  282. package/skills/planning/backlog/evals.md +142 -0
  283. package/skills/planning/prd/SKILL.md +47 -7
  284. package/skills/planning/prd/evals.md +54 -0
  285. package/skills/planning/product-intent/SKILL.md +58 -3
  286. package/skills/planning/product-intent/evals.md +70 -0
  287. package/skills/planning/tech-spec/SKILL.md +54 -3
  288. package/skills/planning/tech-spec/evals.md +73 -0
  289. package/skills/registry.yaml +70 -62
  290. package/skills/remote.yaml +13 -0
  291. package/skills/research/arxiv-literature/SKILL.md +77 -19
  292. package/skills/research/arxiv-literature/evals.md +50 -0
  293. package/skills/research/experiment-protocol/SKILL.md +21 -2
  294. package/skills/research/experiment-protocol/evals.md +23 -0
  295. package/skills/research/scientific-debugging/SKILL.md +24 -2
  296. package/skills/research/scientific-debugging/evals.md +18 -0
  297. package/skills/research/scientific-modernization/SKILL.md +27 -2
  298. package/skills/research/scientific-modernization/evals.md +27 -0
  299. package/skills/skill-marketplace.json +97 -62
  300. package/skills/workflow/cut-it/SKILL.md +66 -6
  301. package/skills/workflow/cut-it/evals.md +101 -0
  302. package/skills/workflow/design-council/SKILL.md +118 -28
  303. package/skills/workflow/design-council/evals.md +161 -0
  304. package/skills/workflow/grill-me/SKILL.md +87 -11
  305. package/skills/workflow/grill-me/evals.md +153 -0
  306. package/skills/workflow/workflow-distiller/SKILL.md +77 -18
  307. package/skills/workflow/workflow-distiller/evals.md +118 -0
  308. package/src/cli/args.ts +2 -2
  309. package/src/cli/bootstrap-generate.ts +1 -1
  310. package/src/cli/config-inspect.ts +65 -12
  311. package/src/cli/configure-interop.ts +105 -13
  312. package/src/cli/configure-oauth.ts +57 -0
  313. package/src/cli/configure-onboarding.ts +980 -0
  314. package/src/cli/configure-target.ts +594 -0
  315. package/src/cli/configure.ts +1082 -532
  316. package/src/cli/context-map.ts +114 -0
  317. package/src/cli/context.ts +4 -0
  318. package/src/cli/docs.ts +22 -14
  319. package/src/cli/doctor-naming.ts +5 -5
  320. package/src/cli/doctor-toolchain.ts +3 -3
  321. package/src/cli/eval.ts +1 -2
  322. package/src/cli/extensions.ts +2 -1
  323. package/src/cli/fleet.ts +1 -1
  324. package/src/cli/index.ts +3 -1
  325. package/src/cli/internal-dispatch.ts +3 -4
  326. package/src/cli/lifecycle-presenter.ts +436 -0
  327. package/src/cli/models.ts +10 -2
  328. package/src/cli/modes/print.ts +5 -1
  329. package/src/cli/panes.ts +19 -5
  330. package/src/cli/reset.ts +228 -106
  331. package/src/cli/run.ts +9 -4
  332. package/src/cli/select.ts +664 -0
  333. package/src/cli/share.ts +5 -1
  334. package/src/cli/skills-eval.ts +3 -3
  335. package/src/cli/skills.ts +9 -2
  336. package/src/cli/targets.ts +5 -6
  337. package/src/cli/trace.ts +55 -4
  338. package/src/cli/uninstall.ts +233 -165
  339. package/src/cli/upgrade.ts +204 -149
  340. package/src/cli/usage.ts +86 -27
  341. package/src/cli/validate-model.ts +3 -3
  342. package/src/cli/wiki-generate.ts +1 -1
  343. package/src/core/artifact-paths.ts +1 -1
  344. package/src/core/bash-exec.ts +131 -86
  345. package/src/core/bus-events.ts +51 -6
  346. package/src/core/config.ts +61 -1
  347. package/src/core/defaults.ts +7 -4
  348. package/src/core/dispatch-outcome.ts +16 -0
  349. package/src/core/external-diagnostic.ts +44 -0
  350. package/src/core/gateway-routing.ts +157 -0
  351. package/src/core/guardrails.ts +10 -49
  352. package/src/core/prompt-hint.ts +9 -0
  353. package/src/core/safe-exec.ts +17 -2
  354. package/src/core/skill-activation.ts +89 -2
  355. package/src/domains/agents/builtins/architect.md +2 -3
  356. package/src/domains/agents/builtins/coder.md +3 -2
  357. package/src/domains/agents/builtins/debugger.md +2 -2
  358. package/src/domains/agents/builtins/documenter.md +2 -2
  359. package/src/domains/agents/builtins/git-master.md +1 -1
  360. package/src/domains/agents/builtins/oracle.md +1 -1
  361. package/src/domains/agents/builtins/provenance.md +1 -1
  362. package/src/domains/agents/builtins/researcher.md +1 -1
  363. package/src/domains/agents/builtins/scout.md +1 -1
  364. package/src/domains/agents/builtins/tester.md +2 -2
  365. package/src/domains/agents/builtins/verifier.md +2 -2
  366. package/src/domains/agents/builtins/wiki-writer.md +1 -1
  367. package/src/domains/agents/builtins/world-knowledge.md +31 -0
  368. package/src/domains/agents/catalog.ts +13 -15
  369. package/src/domains/agents/contract.ts +2 -0
  370. package/src/domains/agents/extension.ts +23 -1
  371. package/src/domains/agents/result-contract.ts +70 -0
  372. package/src/domains/config/keybindings.ts +8 -0
  373. package/src/domains/context/extension.ts +0 -3
  374. package/src/domains/context/wiki/map-seed.ts +589 -0
  375. package/src/domains/context/wiki/plan.ts +2 -2
  376. package/src/domains/context/working-set/path-index.ts +1 -0
  377. package/src/domains/dispatch/admission.ts +29 -0
  378. package/src/domains/dispatch/agent-candidates.ts +10 -0
  379. package/src/domains/dispatch/budget-envelope.ts +86 -1
  380. package/src/domains/dispatch/capability-match.ts +11 -0
  381. package/src/domains/dispatch/capacity-lease.ts +17 -0
  382. package/src/domains/dispatch/contract.ts +11 -1
  383. package/src/domains/dispatch/extension.ts +237 -49
  384. package/src/domains/dispatch/host-verification.ts +435 -39
  385. package/src/domains/dispatch/intent-requirements.ts +10 -0
  386. package/src/domains/dispatch/intent.ts +18 -1
  387. package/src/domains/dispatch/path-scope.ts +235 -24
  388. package/src/domains/dispatch/run-event-journal.ts +4 -15
  389. package/src/domains/dispatch/state.ts +2 -3
  390. package/src/domains/dispatch/transport.ts +45 -21
  391. package/src/domains/dispatch/types.ts +58 -3
  392. package/src/domains/dispatch/worker-model-metadata.ts +38 -0
  393. package/src/domains/eval/artifacts/store.ts +5 -0
  394. package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
  395. package/src/domains/eval/metrics/token-stream.ts +201 -31
  396. package/src/domains/eval/metrics/tracked.ts +40 -4
  397. package/src/domains/eval/runners/clio-run.ts +5 -2
  398. package/src/domains/eval/schema/suite.ts +28 -0
  399. package/src/domains/eval/schema/verdict.ts +2 -2
  400. package/src/domains/eval/store.ts +8 -1
  401. package/src/domains/eval/suites/resolve.ts +13 -1
  402. package/src/domains/eval/suites/run.ts +24 -3
  403. package/src/domains/evidence/trust-status.ts +10 -1
  404. package/src/domains/extensions/contract.ts +15 -1
  405. package/src/domains/extensions/discovery.ts +238 -41
  406. package/src/domains/extensions/extension.ts +105 -6
  407. package/src/domains/extensions/index.ts +24 -0
  408. package/src/domains/extensions/integrity.ts +189 -0
  409. package/src/domains/extensions/manager.ts +17 -1
  410. package/src/domains/extensions/resource-path.ts +27 -0
  411. package/src/domains/extensions/resources.ts +18 -38
  412. package/src/domains/extensions/snapshot-store.ts +39 -0
  413. package/src/domains/extensions/snapshot.ts +180 -0
  414. package/src/domains/extensions/state.ts +385 -57
  415. package/src/domains/extensions/types.ts +118 -1
  416. package/src/domains/interop/registry.ts +6 -2
  417. package/src/domains/interop/types.ts +4 -0
  418. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
  419. package/src/domains/lifecycle/migrations/index.ts +6 -0
  420. package/src/domains/lifecycle/naming-resources.ts +19 -4
  421. package/src/domains/lifecycle/naming-yazi.ts +10 -5
  422. package/src/domains/memory/task-memory-policy.ts +70 -26
  423. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  424. package/src/domains/middleware/contract.ts +26 -0
  425. package/src/domains/middleware/extension.ts +24 -24
  426. package/src/domains/middleware/hook-receipts.ts +27 -4
  427. package/src/domains/middleware/hooks-io.ts +65 -32
  428. package/src/domains/middleware/hooks.ts +64 -0
  429. package/src/domains/middleware/index.ts +28 -5
  430. package/src/domains/middleware/marketplace-offer.ts +3 -35
  431. package/src/domains/middleware/memory-intervention.ts +127 -32
  432. package/src/domains/middleware/memory-step-endpoint.ts +3 -2
  433. package/src/domains/middleware/registrations.ts +326 -0
  434. package/src/domains/middleware/runtime.ts +28 -0
  435. package/src/domains/middleware/skills-reminder.ts +31 -2
  436. package/src/domains/middleware/snapshot.ts +20 -7
  437. package/src/domains/mux/contract.ts +38 -0
  438. package/src/domains/mux/detect.ts +6 -13
  439. package/src/domains/mux/index.ts +1 -1
  440. package/src/domains/mux/operations.ts +44 -5
  441. package/src/domains/mux/yazi/assets/yazi.toml +2 -2
  442. package/src/domains/mux/yazi/session.ts +53 -4
  443. package/src/domains/mux/yazi/theme.ts +117 -17
  444. package/src/domains/observability/compaction-usage.ts +118 -0
  445. package/src/domains/observability/contract.ts +10 -11
  446. package/src/domains/observability/cost.ts +1 -1
  447. package/src/domains/observability/extension.ts +17 -4
  448. package/src/domains/observability/out-of-turn-usage.ts +52 -21
  449. package/src/domains/observability/projection.ts +14 -90
  450. package/src/domains/observability/trace-store.ts +43 -7
  451. package/src/domains/prompts/compiler.ts +73 -53
  452. package/src/domains/prompts/contract.ts +15 -3
  453. package/src/domains/prompts/extension.ts +97 -9
  454. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -3
  455. package/src/domains/prompts/fragments/identity/clio.md +6 -12
  456. package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
  457. package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
  458. package/src/domains/prompts/fragments/operating/contract.md +7 -15
  459. package/src/domains/prompts/fragments/operating/delegation.md +32 -34
  460. package/src/domains/prompts/fragments/operating/skills.md +10 -24
  461. package/src/domains/prompts/fragments/operating/worker.md +1 -8
  462. package/src/domains/providers/contract.ts +4 -1
  463. package/src/domains/providers/extension.ts +40 -9
  464. package/src/domains/providers/index.ts +1 -1
  465. package/src/domains/providers/model-capabilities.ts +9 -0
  466. package/src/domains/providers/model-discovery.ts +2 -0
  467. package/src/domains/providers/model-runtime-capabilities.ts +99 -25
  468. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +699 -114
  469. package/src/domains/providers/runtime-resolution.ts +31 -0
  470. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
  471. package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
  472. package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
  473. package/src/domains/providers/runtimes/common/probe-helpers.ts +7 -2
  474. package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
  475. package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
  476. package/src/domains/providers/support.ts +11 -5
  477. package/src/domains/providers/target-model-cache.ts +25 -2
  478. package/src/domains/providers/types/capability-flags.ts +2 -0
  479. package/src/domains/providers/types/cost-provenance.ts +19 -0
  480. package/src/domains/providers/types/local-model-quirks.ts +85 -37
  481. package/src/domains/providers/types/runtime-descriptor.ts +20 -1
  482. package/src/domains/providers/types/target-descriptor.ts +19 -0
  483. package/src/domains/resources/index.ts +3 -0
  484. package/src/domains/resources/skills/install.ts +72 -7
  485. package/src/domains/resources/skills/loader.ts +23 -19
  486. package/src/domains/resources/skills/marketplace.ts +63 -11
  487. package/src/domains/safety/autonomy.ts +15 -0
  488. package/src/domains/safety/call-target.ts +1 -1
  489. package/src/domains/safety/index.ts +1 -0
  490. package/src/domains/safety/loop-detector.ts +7 -4
  491. package/src/domains/safety/path-policy.ts +1 -1
  492. package/src/domains/safety/policy-engine.ts +34 -11
  493. package/src/domains/safety/protected-artifacts.ts +191 -88
  494. package/src/domains/safety/run-effects.ts +2 -22
  495. package/src/domains/safety/skill-authority.ts +55 -0
  496. package/src/domains/session/compaction/compact.ts +72 -22
  497. package/src/domains/session/entries.ts +6 -0
  498. package/src/domains/session/task-board.ts +10 -9
  499. package/src/domains/session/usage.ts +3 -3
  500. package/src/domains/share/archive.ts +164 -7
  501. package/src/engine/acp/server.ts +62 -9
  502. package/src/engine/agent.ts +13 -3
  503. package/src/engine/ai.ts +26 -8
  504. package/src/engine/antigravity/subprocess-runtime.ts +386 -120
  505. package/src/engine/api-registry.ts +3 -0
  506. package/src/engine/apis/llamacpp-residency.ts +3 -4
  507. package/src/engine/apis/lmstudio.ts +3 -3
  508. package/src/engine/apis/ollama-native.ts +6 -6
  509. package/src/engine/apis/openai-completions.ts +145 -39
  510. package/src/engine/apis/output-budget.ts +8 -18
  511. package/src/engine/apis/residency.ts +8 -27
  512. package/src/engine/external-subprocess.ts +114 -6
  513. package/src/engine/gemma-channel-filter.ts +19 -0
  514. package/src/engine/loop-guard.ts +92 -12
  515. package/src/engine/worker-runtime.ts +40 -11
  516. package/src/engine/worker-tools.ts +3 -1
  517. package/src/entry/background-model-metadata.ts +18 -0
  518. package/src/entry/compaction-prompt.ts +57 -0
  519. package/src/entry/extension-hook-sources.ts +28 -0
  520. package/src/entry/extension-reload.ts +309 -0
  521. package/src/entry/orchestrator.ts +464 -251
  522. package/src/entry/task-memory-lifecycle.ts +35 -0
  523. package/src/interactive/application-controller.ts +2 -1
  524. package/src/interactive/bus-notices.ts +8 -1
  525. package/src/interactive/chat-loop-messages.ts +16 -17
  526. package/src/interactive/chat-loop.ts +75 -3
  527. package/src/interactive/chat-panel.ts +36 -13
  528. package/src/interactive/chat-renderer.ts +72 -7
  529. package/src/interactive/cost-overlay.ts +26 -2
  530. package/src/interactive/dispatch-board.ts +6 -11
  531. package/src/interactive/footer/widgets.ts +13 -0
  532. package/src/interactive/interactive-application.ts +39 -4
  533. package/src/interactive/interactive-input-runtime.ts +4 -0
  534. package/src/interactive/interactive-presentation.ts +2 -2
  535. package/src/interactive/interactive-slash-runtime.ts +4 -1
  536. package/src/interactive/overlays/extensions.ts +9 -1
  537. package/src/interactive/overlays/help-reference.ts +13 -0
  538. package/src/interactive/overlays/settings.ts +27 -16
  539. package/src/interactive/panes-runtime.ts +111 -35
  540. package/src/interactive/prompt-cache-identity.ts +88 -0
  541. package/src/interactive/renderers/worker-entry.ts +32 -0
  542. package/src/interactive/slash-commands.ts +153 -20
  543. package/src/interactive/stream-pacing-policy.ts +0 -23
  544. package/src/interactive/theme/labels.ts +19 -13
  545. package/src/interactive/turn-context.ts +39 -20
  546. package/src/interactive/turn-recovery.ts +8 -0
  547. package/src/interactive/turn-runtime.ts +27 -11
  548. package/src/interactive/turn-state.ts +7 -0
  549. package/src/interactive/worker-receipts.ts +1 -0
  550. package/src/interactive/worker-stream.ts +6 -1
  551. package/src/interactive/yazi-bridge.ts +60 -6
  552. package/src/tools/agent-tools.ts +30 -1
  553. package/src/tools/artifact.ts +2 -2
  554. package/src/tools/ask-user.ts +3 -3
  555. package/src/tools/bash.ts +1 -1
  556. package/src/tools/bootstrap.ts +4 -0
  557. package/src/tools/builtin-tool-catalog.ts +52 -22
  558. package/src/tools/codewiki/code-nav-surface.ts +6 -0
  559. package/src/tools/codewiki/code-nav.ts +99 -13
  560. package/src/tools/context/docs-engine.ts +20 -7
  561. package/src/tools/context/index.ts +59 -21
  562. package/src/tools/core-bootstrap.ts +28 -6
  563. package/src/tools/credential-present.ts +1 -2
  564. package/src/tools/dispatch-arguments.ts +6 -1
  565. package/src/tools/dispatch-event-text.ts +10 -0
  566. package/src/tools/dispatch-plan.ts +49 -4
  567. package/src/tools/dispatch-run-events.ts +1 -1
  568. package/src/tools/dispatch-runner.ts +12 -0
  569. package/src/tools/dispatch-schema.ts +338 -0
  570. package/src/tools/dispatch-types.ts +3 -0
  571. package/src/tools/dispatch.ts +9 -254
  572. package/src/tools/ledger.ts +3 -5
  573. package/src/tools/monitor-surface.ts +5 -13
  574. package/src/tools/observation.ts +4 -5
  575. package/src/tools/panes-surface.ts +4 -11
  576. package/src/tools/panes.ts +4 -2
  577. package/src/tools/policy.ts +15 -2
  578. package/src/tools/read.ts +5 -6
  579. package/src/tools/registry.ts +41 -12
  580. package/src/tools/result-shaping.ts +18 -14
  581. package/src/tools/steer-surface.ts +1 -1
  582. package/src/tools/tasks.ts +1 -1
  583. package/src/tools/truncate.ts +6 -5
  584. package/src/tools/verify/surface.ts +6 -12
  585. package/src/tools/web-fetch-surface.ts +1 -3
  586. package/src/tools/worker-evidence.ts +3 -1
  587. package/src/worker/spec-contract.ts +4 -0
  588. package/dist/builtins-UJLMOVOV.js +0 -17
  589. package/dist/chunk-5QIAJV2D.js +0 -48
  590. package/dist/chunk-JZWT5J3Y.js +0 -814
  591. package/dist/chunk-K7VKOLQQ.js +0 -15
  592. package/dist/chunk-PMZCIOCJ.js +0 -25
  593. package/dist/chunk-SUW5DORT.js +0 -819
  594. package/dist/chunk-UOV2BYIW.js +0 -107
  595. package/dist/chunk-WR6U3OVP.js +0 -45
  596. package/dist/chunk-Y45G3AXC.js +0 -1558
  597. package/dist/reset-EOLM7GVE.js +0 -230
  598. package/dist/uninstall-N34PCTGJ.js +0 -331
  599. package/dist/upgrade-H7TOM7YL.js +0 -323
  600. package/docs/artifact-versions.md +0 -67
  601. package/docs/development-pipeline.md +0 -121
  602. package/docs/documentation-coverage.md +0 -46
  603. package/docs/documentation-guide.md +0 -167
  604. package/docs/time-conventions.md +0 -101
@@ -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
  }
@@ -217,20 +217,8 @@ function defaultPrecedenceForScope(scope: ResourceScope): number {
217
217
  * this gate with skills: both substitute another agent's project file into
218
218
  * Clio's context, so one opt-in covers both.
219
219
  */
220
- let warnedLegacyProjectTrustEnv = false;
221
-
222
220
  export function projectCompatTrusted(explicit?: boolean): boolean {
223
- if (explicit === true) return true;
224
- if (process.env.CLIO_CODER_TRUST_PROJECT_RESOURCES === "1") return true;
225
- if (process.env.CLIO_CODER_TRUST_PROJECT_SKILLS !== "1") return false;
226
- if (!warnedLegacyProjectTrustEnv) {
227
- warnedLegacyProjectTrustEnv = true;
228
- process.emitWarning("CLIO_CODER_TRUST_PROJECT_SKILLS is deprecated; use CLIO_CODER_TRUST_PROJECT_RESOURCES instead", {
229
- code: "CLIO_CODER_DEPRECATED_ENV",
230
- type: "DeprecationWarning",
231
- });
232
- }
233
- return true;
221
+ return explicit === true;
234
222
  }
235
223
 
236
224
  /**
@@ -453,7 +441,16 @@ function validateDescription(description: string | null): string[] {
453
441
  return [];
454
442
  }
455
443
 
456
- function extractMetadata(frontmatter: Record<string, unknown>): Record<string, unknown> {
444
+ /**
445
+ * The deprecation names the file: a bare "clio: skill metadata" warning at
446
+ * boot left the operator hunting across five compatibility roots for the
447
+ * SKILL.md that carried the key, and `doctor` scanned only two of them.
448
+ */
449
+ function warnLegacySkillMetadata(filePath: string): void {
450
+ warnLegacyNaming(`clio: skill metadata in ${filePath}`, "clio-coder: skill metadata");
451
+ }
452
+
453
+ function extractMetadata(frontmatter: Record<string, unknown>, filePath: string): Record<string, unknown> {
457
454
  const metadata: Record<string, unknown> = {};
458
455
  for (const [key, value] of Object.entries(frontmatter)) {
459
456
  if (CORE_FRONTMATTER_KEYS.has(key)) continue;
@@ -462,7 +459,7 @@ function extractMetadata(frontmatter: Record<string, unknown>): Record<string, u
462
459
  continue;
463
460
  }
464
461
  if (key === "clio") {
465
- warnLegacyNaming("clio: skill metadata", "clio-coder: skill metadata");
462
+ warnLegacySkillMetadata(filePath);
466
463
  if (!("clio-coder" in frontmatter)) metadata.clioCoder = value;
467
464
  continue;
468
465
  }
@@ -471,13 +468,13 @@ function extractMetadata(frontmatter: Record<string, unknown>): Record<string, u
471
468
  return metadata;
472
469
  }
473
470
 
474
- function extractProvenance(frontmatter: Record<string, unknown>): SkillProvenance | undefined {
471
+ function extractProvenance(frontmatter: Record<string, unknown>, filePath: string): SkillProvenance | undefined {
475
472
  // Provenance lives nested under the reserved `clio-coder:` block; the flat
476
473
  // top-level keys remain readable for already-installed copies stamped
477
474
  // before the nested form existed.
478
475
  const canonicalRaw = frontmatter["clio-coder"];
479
476
  const legacyRaw = frontmatter.clio;
480
- if (legacyRaw !== undefined) warnLegacyNaming("clio: skill metadata", "clio-coder: skill metadata");
477
+ if (legacyRaw !== undefined) warnLegacySkillMetadata(filePath);
481
478
  const clioCoderRaw = canonicalRaw ?? legacyRaw;
482
479
  const clioCoder =
483
480
  clioCoderRaw !== null && typeof clioCoderRaw === "object" && !Array.isArray(clioCoderRaw)
@@ -671,7 +668,7 @@ function loadSkillFile(
671
668
  scope,
672
669
  ...(root.origin ? { source: root.origin } : {}),
673
670
  };
674
- const provenance = extractProvenance(parsed.frontmatter);
671
+ const provenance = extractProvenance(parsed.frontmatter, filePath);
675
672
  const allowedTools = declaredToolSurface(parsed.frontmatter, "allowed-tools", filePath, diagnostics);
676
673
  const disallowedTools = declaredToolSurface(parsed.frontmatter, "disallowed-tools", filePath, diagnostics);
677
674
  const skill: Skill = {
@@ -691,7 +688,7 @@ function loadSkillFile(
691
688
  pathSubject,
692
689
  trusted: root.trusted ?? true,
693
690
  precedence: root.precedence ?? defaultPrecedenceForScope(scope),
694
- metadata: extractMetadata(parsed.frontmatter),
691
+ metadata: extractMetadata(parsed.frontmatter, filePath),
695
692
  diagnostics,
696
693
  ...(provenance ? { provenance } : {}),
697
694
  };
@@ -952,6 +949,13 @@ export function skillCatalogValidity(list: SkillList): SkillCatalogValidity {
952
949
  return { ok: true, reason: null };
953
950
  }
954
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
+
955
959
  export function parseSkillCommand(input: string): { name: string; args: string } | null {
956
960
  const trimmed = input.trim();
957
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
  }
@@ -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
@@ -168,7 +168,7 @@ const CALL_TARGET_FIELDS: Readonly<Record<string, ReadonlyArray<string>>> = {
168
168
  grep: ["pattern", "path", "mode", "glob", "ignore_case", "literal", "context", "limit", "include_ignored"],
169
169
  find: ["pattern", "path", "order", "limit", "include_ignored"],
170
170
  ls: ["path", "limit"],
171
- code_nav: ["mode", "query", "limit"],
171
+ code_nav: ["source", "mode", "query", "limit"],
172
172
  context: ["scope", "query", "name", "limit", "ref", "include_tree"],
173
173
  credential_present: ["name", "source", "file"],
174
174
  write: ["path"],
@@ -19,6 +19,7 @@ export {
19
19
  DEFAULT_AUTONOMY_LEVEL,
20
20
  isAutonomyLevel,
21
21
  mapAutonomy,
22
+ modelMayActivateSkills,
22
23
  } from "./autonomy.js";
23
24
  export type { SafetyContract, SafetyDecision } from "./contract.js";
24
25
  export type {
@@ -33,10 +33,12 @@ const DEFAULT_WINDOW_MS = 30_000;
33
33
  // stops them before they burn a turn. Callers that need a different cadence
34
34
  // pass `maxRepeats` explicitly.
35
35
  const DEFAULT_MAX_REPEATS = 3;
36
- // Sized so a consecutive or single-interleaved verbatim spiral still counts
37
- // its third repeat at any call latency, while an identical check separated by
38
- // two or more other calls (a fix-verify loop) stays below the threshold.
39
- const DEFAULT_KEEP_LAST_ATTEMPTS = 4;
36
+ // Sized so a batch-shaped spiral still counts its third repeat at any call
37
+ // latency: a model that re-emits the same parallel batch of up to sixteen
38
+ // calls three times has every key inside the retained tail. Fix-verify loops
39
+ // are not this detector's concern any more; the loop guard keys attempts by
40
+ // the turn's write/edit epoch, so a check rerun after a change is a new key.
41
+ const DEFAULT_KEEP_LAST_ATTEMPTS = 48;
40
42
 
41
43
  export function createLoopState(opts?: {
42
44
  windowMs?: number;
@@ -138,6 +140,7 @@ export function observe(state: LoopDetectorState, key: string, now: number): [Lo
138
140
  recent: next,
139
141
  windowMs: state.windowMs,
140
142
  maxRepeats: state.maxRepeats,
143
+ keepLastAttempts: keepLast,
141
144
  };
142
145
  return [newState, { looping, key, count }];
143
146
  }
@@ -41,7 +41,7 @@ export function isSameOrDescendant(candidatePath: string, policyPath: string): b
41
41
  const candidate = path.resolve(candidatePath);
42
42
  const policy = path.resolve(policyPath);
43
43
  const relative = path.relative(policy, candidate);
44
- return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
44
+ return relative === "" || (relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));
45
45
  }
46
46
 
47
47
  function expandTilde(rawPath: string): string {
@@ -25,10 +25,12 @@ import {
25
25
  extractCommandDeleteTargets,
26
26
  extractCommandWriteTargets,
27
27
  inlineShellScript,
28
- tokenizeShellLike,
28
+ invokesClioSkillMutation,
29
+ scanShellLike,
29
30
  } from "./protected-artifacts.js";
30
31
  import { formatRejection, type RejectionMessage } from "./rejection-feedback.js";
31
32
  import { getCachedDefaultRulePacks, type PackId, type RulePacks } from "./rule-pack-loader.js";
33
+ import { activeClioSkillRoots, skillMutationReason } from "./skill-authority.js";
32
34
 
33
35
  export type SafetyPolicySource =
34
36
  | "damage-control:base"
@@ -194,6 +196,7 @@ export function createSafetyPolicyEngine(options: SafetyPolicyEngineOptions = {}
194
196
  // cwd and roots to compare like against like (the design mandates no symlink chasing).
195
197
  const writeRootCwd = path.resolve(options.cwd ?? process.cwd());
196
198
  const writeRoots = (options.writeRoots ?? []).map((root) => resolvePathBoundary(writeRootCwd, root));
199
+ const skillRoots = activeClioSkillRoots(cwd);
197
200
  const packs = options.rulePacks ?? getCachedDefaultRulePacks();
198
201
  const projectPolicy = options.projectPolicy ?? loadProjectSafetyPolicy(cwd);
199
202
  const projectPolicyRoot =
@@ -308,6 +311,27 @@ export function createSafetyPolicyEngine(options: SafetyPolicyEngineOptions = {}
308
311
  return blockDecision(base, blockInput);
309
312
  }
310
313
 
314
+ // Editing active instructions is an operator privilege at every autonomy
315
+ // level, in both the coordinator and the shared worker safety contract.
316
+ const mutationCommand = call.tool === ToolNames.Bash ? command : catalogCommand;
317
+ const skillReason =
318
+ mutationCommand !== null && invokesClioSkillMutation(mutationCommand)
319
+ ? "skill installation and updates require the operator CLI or an explicit operator install choice; draft outside active skill roots"
320
+ : skillMutationReason(
321
+ skillRoots,
322
+ pathPolicyTargets(catalogCommand === null ? call : { tool: ToolNames.Bash, args: { command: catalogCommand } }),
323
+ callCwd,
324
+ mutationCommand,
325
+ );
326
+ if (skillReason !== null) {
327
+ return blockDecision(base, {
328
+ ruleId: "skill-authority",
329
+ reasonCode: "skill-authority",
330
+ reasons: [skillReason],
331
+ policySource: "builtin-classifier",
332
+ });
333
+ }
334
+
311
335
  // The path policy runs regardless of project policy validity. When
312
336
  // `.clio-coder/safety.yaml` is invalid, the loader has already dropped every
313
337
  // project-authored path entry and forced `disableDefaultPathPolicy`
@@ -488,10 +512,10 @@ function stripQuotes(token: string): string {
488
512
  */
489
513
  function bashPathTokenCandidates(command: string): string[] {
490
514
  const candidates: string[] = [];
491
- for (const token of tokenizeShellLike(command)) {
515
+ for (const scanned of scanShellLike(command)) {
516
+ if (scanned.operator) continue;
517
+ const token = scanned.value;
492
518
  if (token.length === 0) continue;
493
- if (token === ";" || token === "&&" || token === "||" || token === "|" || token === ">" || token === ">>") continue;
494
- if (token === "<" || token === "<<") continue;
495
519
  // A token containing whitespace came from a quoted string of prose, not
496
520
  // a path argument; and flags are not paths unless they embed one
497
521
  // (--file=~/.aws/credentials).
@@ -821,9 +845,6 @@ function matchingProjectCommand(
821
845
  return null;
822
846
  }
823
847
 
824
- /** Operators that end chain recognition; only `&&` keeps a chain readable. */
825
- const CHAIN_BREAKING_TOKENS: ReadonlySet<string> = new Set([";", "|", "||", ">", ">>", "<", "<<"]);
826
-
827
848
  /** Chain length ceiling. Real compound calls are two or three steps. */
828
849
  const CHAIN_MAX_SEGMENTS = 6;
829
850
 
@@ -856,14 +877,16 @@ function recognizeCommandChain(
856
877
  ): ChainRecognition | null {
857
878
  const segments: string[][] = [];
858
879
  let current: string[] = [];
859
- for (const token of tokenizeShellLike(command)) {
860
- if (token === "&&") {
880
+ for (const token of scanShellLike(command)) {
881
+ if (token.operator && token.value === "&&") {
861
882
  segments.push(current);
862
883
  current = [];
863
884
  continue;
864
885
  }
865
- if (CHAIN_BREAKING_TOKENS.has(token)) return null;
866
- current.push(token);
886
+ // Only an actual && operator joins recognizable commands. Quoted words
887
+ // remain argv and every other real operator makes this chain unrecognized.
888
+ if (token.operator) return null;
889
+ current.push(token.value);
867
890
  }
868
891
  segments.push(current);
869
892
  if (segments.length < 2 || segments.length > CHAIN_MAX_SEGMENTS) return null;