@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
@@ -74,8 +74,18 @@ interface NormalizedArtifact {
74
74
  artifact: ProtectedArtifact;
75
75
  }
76
76
 
77
- const COMMAND_SEPARATORS = new Set([";", "&&", "||", "|"]);
77
+ const COMMAND_SEPARATORS = new Set([";", "&", "&&", "||", "|"]);
78
78
  const SHELL_WRAPPERS = new Set(["command", "builtin", "sudo", "doas"]);
79
+ const SHELL_REDIRECTIONS = new Set([">", ">>", "<", "<<", "<<<", "<&", ">&", "<>", ">|", "&>", "&>>"]);
80
+ const SHELL_WRITE_REDIRECTIONS = new Set([">", ">>", ">&", "<>", ">|", "&>", "&>>"]);
81
+
82
+ export interface ShellToken {
83
+ value: string;
84
+ operator: boolean;
85
+ quoted: boolean;
86
+ start: number;
87
+ end: number;
88
+ }
79
89
 
80
90
  /**
81
91
  * Paths a tool call would mutate, derived from the tool's path argument.
@@ -149,9 +159,9 @@ function classifyDestructiveCommand(
149
159
  const artifacts = normalizedArtifacts(protectedArtifacts);
150
160
  if (artifacts.length === 0) return { kind: "benign", matches: [] };
151
161
 
152
- const tokens = tokenizeShellLike(command);
153
- for (const segment of splitSegments(tokens)) {
154
- const redirect = classifyRedirect(segment, artifacts);
162
+ for (const tokens of splitSegments(scanShellLike(command))) {
163
+ const segment = shellCommandArguments(tokens);
164
+ const redirect = classifyRedirect(tokens, artifacts);
155
165
  if (redirect.kind === "destructive") return redirect;
156
166
 
157
167
  const commandIndex = commandTokenIndex(segment);
@@ -217,8 +227,8 @@ export function detectValidationCommand(
217
227
  command: string,
218
228
  scope: ValidationCommandScope = "finish-contract",
219
229
  ): ValidationCommandDetection {
220
- const tokens = tokenizeShellLike(command);
221
- for (const segment of splitSegments(tokens)) {
230
+ for (const tokens of splitSegments(scanShellLike(command))) {
231
+ const segment = shellCommandArguments(tokens);
222
232
  const commandIndex = commandTokenIndex(segment);
223
233
  if (commandIndex === null) continue;
224
234
  const executable = basenameToken(segment[commandIndex]);
@@ -248,10 +258,11 @@ export function detectValidationCommand(
248
258
  */
249
259
  export function extractCommandWriteTargets(command: string): string[] {
250
260
  const targets: string[] = [];
251
- for (const segment of expandedSegments(command)) {
261
+ for (const segment of expandedShellSegments(command)) {
252
262
  collectRedirectTargets(segment, targets);
253
- collectInvokedWriteTargets(segment, targets);
254
- collectInPlaceEditTargets(segment, targets);
263
+ const argv = shellCommandArguments(segment);
264
+ collectInvokedWriteTargets(argv, targets);
265
+ collectInPlaceEditTargets(argv, targets);
255
266
  }
256
267
  return targets.filter(isInterestingWriteTarget);
257
268
  }
@@ -295,14 +306,14 @@ function segmentShellScript(segment: ReadonlyArray<string>): string | null {
295
306
  * segments of the script it runs. The wrapper segment itself is kept: a
296
307
  * scanner that reads its operands (`cp`, `tee`) must still see them.
297
308
  */
298
- function expandedSegments(command: string, depth = 0): string[][] {
299
- const segments = splitSegments(tokenizeShellLike(command));
309
+ function expandedShellSegments(command: string, depth = 0): ShellToken[][] {
310
+ const segments = splitSegments(scanShellLike(command));
300
311
  if (depth >= INNER_SHELL_MAX_DEPTH) return segments;
301
- const out: string[][] = [];
312
+ const out: ShellToken[][] = [];
302
313
  for (const segment of segments) {
303
314
  out.push(segment);
304
- const script = segmentShellScript(segment);
305
- if (script !== null) out.push(...expandedSegments(script, depth + 1));
315
+ const script = segmentShellScript(shellCommandArguments(segment));
316
+ if (script !== null) out.push(...expandedShellSegments(script, depth + 1));
306
317
  }
307
318
  return out;
308
319
  }
@@ -313,11 +324,11 @@ function expandedSegments(command: string, depth = 0): string[][] {
313
324
  * script rather than treating `sh` as an unrecognized executable.
314
325
  */
315
326
  export function inlineShellScript(command: string): string | null {
316
- const segments = splitSegments(tokenizeShellLike(command));
327
+ const segments = splitSegments(scanShellLike(command));
317
328
  if (segments.length !== 1) return null;
318
329
  const segment = segments[0];
319
330
  if (segment === undefined) return null;
320
- return segmentShellScript(segment);
331
+ return segmentShellScript(shellCommandArguments(segment));
321
332
  }
322
333
 
323
334
  /**
@@ -331,7 +342,8 @@ export function inlineShellScript(command: string): string | null {
331
342
  */
332
343
  export function extractCommandCdTargets(command: string): string[] {
333
344
  const targets: string[] = [];
334
- for (const segment of expandedSegments(command)) {
345
+ for (const tokens of expandedShellSegments(command)) {
346
+ const segment = shellCommandArguments(tokens);
335
347
  const commandIndex = commandTokenIndex(segment);
336
348
  if (commandIndex === null) continue;
337
349
  const executable = basenameToken(segment[commandIndex]);
@@ -349,7 +361,8 @@ export function extractCommandCdTargets(command: string): string[] {
349
361
  */
350
362
  export function extractCommandDeleteTargets(command: string): string[] {
351
363
  const targets: string[] = [];
352
- for (const segment of expandedSegments(command)) {
364
+ for (const tokens of expandedShellSegments(command)) {
365
+ const segment = shellCommandArguments(tokens);
353
366
  const commandIndex = commandTokenIndex(segment);
354
367
  if (commandIndex === null) continue;
355
368
  const executable = basenameToken(segment[commandIndex]);
@@ -369,17 +382,108 @@ export function extractCommandDeleteTargets(command: string): string[] {
369
382
  return targets.filter(isInterestingWriteTarget);
370
383
  }
371
384
 
385
+ /** Recognizable operator CLI installation paths invoked through a model shell.
386
+ * This is command inspection, not confinement of arbitrary scripts or aliases.
387
+ */
388
+ export function invokesClioSkillMutation(command: string): boolean {
389
+ for (const segment of expandedShellSegments(command)) {
390
+ const argv = shellCommandArguments(segment);
391
+ const index = commandTokenIndex(argv);
392
+ if (index === null) continue;
393
+ let args = argv.slice(index);
394
+ const executable = basenameToken(args[0]);
395
+ if (executable === "npx" || (executable === "npm" && args[1] === "exec")) {
396
+ args = args.slice(executable === "npm" ? 2 : 1);
397
+ while (args[0]?.startsWith("-")) args = args.slice(1);
398
+ }
399
+ const program = args[0] ?? "";
400
+ if (basenameToken(program) === "node" || basenameToken(program) === "tsx") {
401
+ // The checked-in and built entry points are also operator CLIs.
402
+ if (!/(?:^|\/)(?:src|dist)\/cli\/index\.(?:js|ts)$/.test(args[1] ?? "")) continue;
403
+ args = args.slice(2);
404
+ } else if (/^(?:@iowarp\/)?clio-coder(?:@[^/]+)?$/.test(program) || basenameToken(program) === "clio-coder") {
405
+ args = args.slice(1);
406
+ } else continue;
407
+ if (args.includes("--version") || args.includes("-v")) continue;
408
+ let rootHelp = false;
409
+ let firstRootFlag: string | undefined;
410
+ while (args[0]?.startsWith("-")) {
411
+ const flag = args[0];
412
+ // Startup flags are consumed before dispatch. Help is terminal only
413
+ // when it is the first flag left in the root dispatcher's argv.
414
+ if (flag === "--all" || flag === "--help" || flag === "-h") firstRootFlag ??= flag;
415
+ rootHelp = firstRootFlag === "--help" || firstRootFlag === "-h";
416
+ args = args.slice(flag === "--skill" || flag === "--api-key" ? 2 : 1);
417
+ }
418
+ if (rootHelp) continue;
419
+ if (args[0] !== "skills" && args[0] !== "library") continue;
420
+ if (resourceCliMutatesSkills(args[0], args.slice(1))) return true;
421
+ }
422
+ return false;
423
+ }
424
+
425
+ function shellCommandArguments(segment: ReadonlyArray<ShellToken>): string[] {
426
+ const args: ShellToken[] = [];
427
+ for (let index = 0; index < segment.length; index += 1) {
428
+ const token = segment[index];
429
+ if (token === undefined) continue;
430
+ if (token.operator && SHELL_REDIRECTIONS.has(token.value)) {
431
+ // A redirection target is consumed by the shell, not passed to Clio.
432
+ // Only an adjacent, unquoted number is its optional file descriptor.
433
+ const previous = args.at(-1);
434
+ if (previous && previous.end === token.start && !previous.quoted && /^\d+$/.test(previous.value)) args.pop();
435
+ if (segment[index + 1]?.operator === false) index += 1;
436
+ continue;
437
+ }
438
+ args.push(token);
439
+ }
440
+ return args.map((token) => token.value);
441
+ }
442
+
443
+ function resourceCliMutatesSkills(resource: "skills" | "library", args: ReadonlyArray<string>): boolean {
444
+ // Both resource parsers accept flags before the verb. Consume their value
445
+ // options so a catalog path called --yes or --help is not treated as a flag.
446
+ const valueOptions =
447
+ resource === "skills"
448
+ ? ["--name", "--category", "--scenario", "--target", "--workspace", "--timeout"]
449
+ : ["--kind", "--from"];
450
+ let verb: string | undefined;
451
+ let confirmed = false;
452
+ for (let index = 0; index < args.length; index += 1) {
453
+ const arg = args[index];
454
+ if (arg === undefined) continue;
455
+ if (valueOptions.includes(arg)) {
456
+ index += 1;
457
+ continue;
458
+ }
459
+ if (arg === "--help" || arg === "-h") return false;
460
+ if (arg === "--yes") confirmed = true;
461
+ if (!arg.startsWith("-")) verb ??= arg;
462
+ }
463
+ if (resource === "skills") return verb === "install" || verb === "update" || verb === "sync";
464
+ // Unconfirmed library add only prints a plan. A confirmed add can install
465
+ // skill dependencies of any resource kind, or resolve an untyped skill ref.
466
+ return verb === "add" && confirmed;
467
+ }
468
+
372
469
  const STANDARD_DEV_TARGETS = new Set(["/dev/null", "/dev/stdout", "/dev/stderr", "/dev/tty", "/dev/zero"]);
373
470
 
374
- function collectRedirectTargets(segment: ReadonlyArray<string>, out: string[]): void {
471
+ function collectRedirectTargets(segment: ReadonlyArray<ShellToken>, out: string[]): void {
375
472
  for (let index = 0; index < segment.length - 1; index += 1) {
376
- const token = segment[index];
377
- if (token !== ">" && token !== ">>") continue;
378
- const target = segment[index + 1];
379
- if (target !== undefined) out.push(target);
473
+ const target = redirectWriteTarget(segment[index], segment[index + 1]);
474
+ if (target !== null) out.push(target);
380
475
  }
381
476
  }
382
477
 
478
+ function redirectWriteTarget(operator: ShellToken | undefined, target: ShellToken | undefined): string | null {
479
+ if (!operator?.operator || target === undefined || target.operator || !SHELL_WRITE_REDIRECTIONS.has(operator.value))
480
+ return null;
481
+ // >& duplicates or closes a descriptor when its operand is a number or -;
482
+ // Bash also accepts a filename here, redirecting stdout and stderr to it.
483
+ if (operator.value === ">&" && /^(?:\d+-?|-)$/u.test(target.value)) return null;
484
+ return target.value;
485
+ }
486
+
383
487
  function collectInvokedWriteTargets(segment: ReadonlyArray<string>, out: string[]): void {
384
488
  const cmdIndex = commandTokenIndex(segment);
385
489
  if (cmdIndex === null) return;
@@ -430,7 +534,6 @@ function hasSedInPlaceFlag(segment: ReadonlyArray<string>, cmdIndex: number): bo
430
534
  for (let index = cmdIndex + 1; index < segment.length; index += 1) {
431
535
  const token = segment[index];
432
536
  if (token === undefined) continue;
433
- if (COMMAND_SEPARATORS.has(token)) break;
434
537
  if (token === "--") break;
435
538
  if (token === "--in-place" || token.startsWith("--in-place=")) return true;
436
539
  if (token.startsWith("--")) continue;
@@ -453,7 +556,6 @@ function sedFileOperands(segment: ReadonlyArray<string>, cmdIndex: number): stri
453
556
  for (let index = cmdIndex + 1; index < segment.length; index += 1) {
454
557
  const token = segment[index];
455
558
  if (token === undefined) continue;
456
- if (COMMAND_SEPARATORS.has(token)) break;
457
559
  if (!endOfOptions && token === "--") {
458
560
  endOfOptions = true;
459
561
  continue;
@@ -487,20 +589,20 @@ function sedFileOperands(segment: ReadonlyArray<string>, cmdIndex: number): stri
487
589
 
488
590
  function isInterestingWriteTarget(target: string): boolean {
489
591
  if (target.length === 0) return false;
490
- if (target.startsWith("&")) return false;
491
592
  if (STANDARD_DEV_TARGETS.has(target)) return false;
492
593
  if (target.startsWith("/dev/fd/")) return false;
493
594
  return true;
494
595
  }
495
596
 
496
597
  function classifyRedirect(
497
- segment: ReadonlyArray<string>,
598
+ segment: ReadonlyArray<ShellToken>,
498
599
  artifacts: ReadonlyArray<NormalizedArtifact>,
499
600
  ): DestructiveCommandClassification {
500
601
  for (let index = 0; index < segment.length; index += 1) {
501
- if (segment[index] !== ">") continue;
502
- const target = segment[index + 1];
503
- if (target === undefined) continue;
602
+ // Keep the existing distinction between overwriting and appending here.
603
+ if (segment[index]?.value === ">>" || segment[index]?.value === "&>>") continue;
604
+ const target = redirectWriteTarget(segment[index], segment[index + 1]);
605
+ if (target === null) continue;
504
606
  const matches = matchesForPaths([target], artifacts, "target", "redirect can overwrite protected artifacts");
505
607
  if (matches.length > 0) {
506
608
  return {
@@ -738,36 +840,47 @@ function isPythonExecutable(executable: string): boolean {
738
840
  return executable === "python" || executable === "python3" || /^python3\.\d+$/.test(executable);
739
841
  }
740
842
 
843
+ /** Input is one command's argv. Literal words must never be reparsed as shell syntax. */
741
844
  function pathArgs(segment: ReadonlyArray<string>, commandIndex: number): string[] {
742
845
  const args: string[] = [];
743
846
  let endOfOptions = false;
744
847
  for (let index = commandIndex + 1; index < segment.length; index += 1) {
745
848
  const token = segment[index];
746
849
  if (token === undefined) continue;
747
- if (COMMAND_SEPARATORS.has(token)) break;
748
850
  if (!endOfOptions && token === "--") {
749
851
  endOfOptions = true;
750
852
  continue;
751
853
  }
752
854
  if (!endOfOptions && token.startsWith("-")) continue;
753
- if (token === ">" || token === ">>" || token === "<" || token === "<<") {
754
- index += 1;
755
- continue;
756
- }
757
855
  args.push(token);
758
856
  }
759
857
  return args;
760
858
  }
761
859
 
860
+ /** Flat compatibility values; use scanShellLike when operator identity matters. */
762
861
  export function tokenizeShellLike(command: string): string[] {
763
- const tokens: string[] = [];
862
+ return scanShellLike(command).map((token) => token.value);
863
+ }
864
+
865
+ /** Literal argv by command, with actual operators and redirections removed. */
866
+ export function commandArgumentSegments(command: string): string[][] {
867
+ return splitSegments(scanShellLike(command)).map(shellCommandArguments);
868
+ }
869
+
870
+ /** Literal shell words and operators only; no expansion or script execution. */
871
+ export function scanShellLike(command: string): ShellToken[] {
872
+ const tokens: ShellToken[] = [];
764
873
  let current = "";
874
+ let wordStart: number | null = null;
875
+ let quoted = false;
765
876
  let quote: "'" | '"' | null = null;
766
877
 
767
- const pushCurrent = (): void => {
768
- if (current.length === 0) return;
769
- tokens.push(current);
878
+ const pushCurrent = (end: number): void => {
879
+ if (wordStart === null) return;
880
+ tokens.push({ value: current, operator: false, quoted, start: wordStart, end });
770
881
  current = "";
882
+ wordStart = null;
883
+ quoted = false;
771
884
  };
772
885
 
773
886
  for (let index = 0; index < command.length; index += 1) {
@@ -779,80 +892,70 @@ export function tokenizeShellLike(command: string): string[] {
779
892
  continue;
780
893
  }
781
894
  if (quote === '"' && char === "\\" && index + 1 < command.length) {
782
- index += 1;
783
- current += command[index] ?? "";
784
- continue;
895
+ const next = command[index + 1] ?? "";
896
+ if (next === "\n" || '$`"\\'.includes(next)) {
897
+ index += 1;
898
+ if (next !== "\n") current += next;
899
+ continue;
900
+ }
785
901
  }
786
902
  current += char;
787
903
  continue;
788
904
  }
789
905
 
790
906
  if (char === "'" || char === '"') {
907
+ wordStart ??= index;
908
+ quoted = true;
791
909
  quote = char;
792
910
  continue;
793
911
  }
794
912
  if (char === "\\" && index + 1 < command.length) {
795
- index += 1;
796
- current += command[index] ?? "";
797
- continue;
798
- }
799
- if (/\s/.test(char)) {
800
- pushCurrent();
801
- if (char === "\n") tokens.push(";");
802
- continue;
803
- }
804
- if (char === ";") {
805
- pushCurrent();
806
- tokens.push(";");
807
- continue;
808
- }
809
- if (char === "&" && command[index + 1] === "&") {
810
- pushCurrent();
811
- tokens.push("&&");
913
+ // Backslash-newline joins lines before tokenization, even between words.
914
+ if (command[index + 1] !== "\n") {
915
+ wordStart ??= index;
916
+ quoted = true;
917
+ current += command[index + 1] ?? "";
918
+ }
812
919
  index += 1;
813
920
  continue;
814
921
  }
815
- if (char === "|") {
816
- pushCurrent();
817
- if (command[index + 1] === "|") {
818
- tokens.push("||");
819
- index += 1;
820
- } else {
821
- tokens.push("|");
822
- }
922
+ if (char === "#" && wordStart === null) {
923
+ // A comment starts only at an unquoted word boundary. Leave its newline
924
+ // for normal separation so a following command is still inspected.
925
+ while (index + 1 < command.length && command[index + 1] !== "\n") index += 1;
823
926
  continue;
824
927
  }
825
- if (char === ">") {
826
- pushCurrent();
827
- if (command[index + 1] === ">") {
828
- tokens.push(">>");
829
- index += 1;
830
- } else {
831
- tokens.push(">");
832
- }
928
+ if (/\s/.test(char)) {
929
+ pushCurrent(index);
930
+ if (char === "\n") tokens.push({ value: ";", operator: true, quoted: false, start: index, end: index + 1 });
833
931
  continue;
834
932
  }
835
- if (char === "<") {
836
- pushCurrent();
837
- if (command[index + 1] === "<") {
838
- tokens.push("<<");
839
- index += 1;
840
- } else {
841
- tokens.push("<");
842
- }
933
+ if (";&|><".includes(char)) {
934
+ pushCurrent(index);
935
+ const three = command.slice(index, index + 3);
936
+ const two = command.slice(index, index + 2);
937
+ const value =
938
+ SHELL_REDIRECTIONS.has(three) || COMMAND_SEPARATORS.has(three)
939
+ ? three
940
+ : SHELL_REDIRECTIONS.has(two) || COMMAND_SEPARATORS.has(two)
941
+ ? two
942
+ : char;
943
+ tokens.push({ value, operator: true, quoted: false, start: index, end: index + value.length });
944
+ index += value.length - 1;
843
945
  continue;
844
946
  }
947
+ wordStart ??= index;
845
948
  current += char;
846
949
  }
847
- pushCurrent();
950
+ pushCurrent(command.length);
848
951
  return tokens;
849
952
  }
850
953
 
851
- function splitSegments(tokens: ReadonlyArray<string>): string[][] {
852
- const segments: string[][] = [];
853
- let current: string[] = [];
954
+ function splitSegments(tokens: ReadonlyArray<ShellToken>): ShellToken[][] {
955
+ const segments: ShellToken[][] = [];
956
+ let current: ShellToken[] = [];
854
957
  for (const token of tokens) {
855
- if (COMMAND_SEPARATORS.has(token)) {
958
+ if (token.operator && COMMAND_SEPARATORS.has(token.value)) {
856
959
  if (current.length > 0) segments.push(current);
857
960
  current = [];
858
961
  continue;
@@ -3,10 +3,10 @@ import { ToolNames } from "../../core/tool-names.js";
3
3
  import { classify } from "./action-classifier.js";
4
4
  import { typedValidationSummary } from "./finish-contract.js";
5
5
  import {
6
+ commandArgumentSegments,
6
7
  detectValidationCommand,
7
8
  extractCommandDeleteTargets,
8
9
  extractCommandWriteTargets,
9
- tokenizeShellLike,
10
10
  toolMutationPaths,
11
11
  type ValidationCommandScope,
12
12
  } from "./protected-artifacts.js";
@@ -155,7 +155,7 @@ const GIT_PATH_MUTATIONS: ReadonlySet<string> = new Set(["mv", "rm"]);
155
155
 
156
156
  function gitPathOperands(command: string): string[] {
157
157
  const targets: string[] = [];
158
- for (const segment of splitCommandSegments(command)) {
158
+ for (const segment of commandArgumentSegments(command)) {
159
159
  if (segment[0] !== "git") continue;
160
160
  const subcommand = segment[1];
161
161
  if (subcommand === undefined || !GIT_PATH_MUTATIONS.has(subcommand)) continue;
@@ -167,26 +167,6 @@ function gitPathOperands(command: string): string[] {
167
167
  return targets;
168
168
  }
169
169
 
170
- /**
171
- * Split the shared tokenizer's output on command separators. Only the
172
- * git-operand scan above needs segments, and it needs them after tokenization
173
- * rather than off the raw string.
174
- */
175
- function splitCommandSegments(command: string): string[][] {
176
- const segments: string[][] = [];
177
- let current: string[] = [];
178
- for (const token of tokenizeShellLike(command)) {
179
- if (token === ";" || token === "&&" || token === "||" || token === "|") {
180
- if (current.length > 0) segments.push(current);
181
- current = [];
182
- continue;
183
- }
184
- current.push(token);
185
- }
186
- if (current.length > 0) segments.push(current);
187
- return segments;
188
- }
189
-
190
170
  function commandOf(args: Record<string, unknown> | undefined): string | null {
191
171
  const command = args?.command;
192
172
  return typeof command === "string" && command.length > 0 ? command : null;
@@ -0,0 +1,55 @@
1
+ import { homedir } from "node:os";
2
+ import path from "node:path";
3
+ import { canonicalizeExistingPath } from "../../core/path-canonical.js";
4
+ import { clioConfigDir } from "../../core/xdg.js";
5
+ import { isSameOrDescendant, type PathPolicyOperation } from "./path-policy.js";
6
+ import { extractCommandCdTargets } from "./protected-artifacts.js";
7
+
8
+ /** Active Clio skill trees are operator-owned, independently of optional path
9
+ * defaults. Keep lexical roots and resolve them again at admission: an operator
10
+ * may install or replace a symlink after the session starts. Reads stay allowed.
11
+ */
12
+ export function activeClioSkillRoots(cwd: string): string[] {
13
+ return [path.join(cwd, ".clio-coder", "skills"), path.join(clioConfigDir(), "skills")];
14
+ }
15
+
16
+ export function skillMutationReason(
17
+ roots: ReadonlyArray<string>,
18
+ targets: ReadonlyArray<{ operation: PathPolicyOperation; path: string }>,
19
+ cwd: string,
20
+ command: string | null,
21
+ ): string | null {
22
+ const workingDirs = [cwd];
23
+ // Existing shell inspection extracts literal path-bearing operations. Include
24
+ // their possible cd bases so a visible cd cannot hide the protected target.
25
+ // This deliberately cannot interpret arbitrary programs, variables or aliases.
26
+ if (command !== null) {
27
+ for (const destination of extractCommandCdTargets(command)) {
28
+ workingDirs.push(path.resolve(workingDirs.at(-1) ?? cwd, expandHome(destination)));
29
+ }
30
+ }
31
+ for (const target of targets) {
32
+ if (target.operation === "read") continue;
33
+ for (const directory of workingDirs) {
34
+ const lexical = path.resolve(directory, expandHome(target.path));
35
+ const resolved = canonicalizeExistingPath(lexical);
36
+ for (const root of roots) {
37
+ for (const boundary of [root, canonicalizeExistingPath(root)]) {
38
+ for (const candidate of [lexical, resolved]) {
39
+ if (
40
+ isSameOrDescendant(candidate, boundary) ||
41
+ (target.operation === "delete" && isSameOrDescendant(boundary, candidate))
42
+ ) {
43
+ return `active skill tree ${root} is operator-owned; draft changes outside active skill roots and ask the operator to install or update them`;
44
+ }
45
+ }
46
+ }
47
+ }
48
+ }
49
+ }
50
+ return null;
51
+ }
52
+
53
+ function expandHome(value: string): string {
54
+ return value === "~" ? homedir() : value.startsWith("~/") ? path.join(homedir(), value.slice(2)) : value;
55
+ }