@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
@@ -24,7 +24,7 @@ export const SKILLS_REMINDER_REGISTRATION_ID = "observer.skills-reminder";
24
24
 
25
25
  export { SKILL_SUGGESTION_ANCHOR };
26
26
 
27
- export function skillsReminderMessage(installed: number, installable = 0): string {
27
+ export function skillsReminderMessage(installed: number, installable = 0, modelActivation = false): string {
28
28
  // Unconditional imperative, deliberately: the skill-mastery batteries
29
29
  // showed literal local models comply with "list and check" but never act
30
30
  // on wording that first asks them to classify the task as skill-shaped.
@@ -37,6 +37,17 @@ export function skillsReminderMessage(installed: number, installable = 0): strin
37
37
  // operator" as the whole job, spent a 40-second turn deliberating over the
38
38
  // suggestion, and ended without one repository read. The suggestion is one
39
39
  // line, the task continues in the same turn, and only the operator loads.
40
+ // At auto-edit and full-auto the model activates installed skills itself,
41
+ // so the reminder must not repeat "only the operator loads a skill": the
42
+ // literal models this line exists for act on it over the listing footer.
43
+ if (modelActivation) {
44
+ return (
45
+ `[Skills] ${counts}. Start this task by listing them with context(scope="skills") ` +
46
+ 'and checking for a match; if one matches, load it with context(scope="skills", name="<name>") and ' +
47
+ "continue the task in the same turn. A marketplace skill is not installed and is offered for install " +
48
+ "when the operator runs it. If none match, do not mention skills and continue with the task."
49
+ );
50
+ }
40
51
  return (
41
52
  `[Skills] ${counts}. Start this task by listing them with context(scope="skills") ` +
42
53
  "and checking for a match; if one matches, open your reply with the line " +
@@ -55,6 +66,12 @@ export interface SkillsReminderDeps {
55
66
  * zero. Either count above zero arms the reminder.
56
67
  */
57
68
  countInstallableSkills?(): number;
69
+ /**
70
+ * True when the session's autonomy level lets the model activate an
71
+ * installed skill itself. Absent reads as false, the operator-gated wording
72
+ * every surface taught before the level became the opt-in.
73
+ */
74
+ modelMayActivateSkills?(): boolean;
58
75
  }
59
76
 
60
77
  const NO_EFFECTS: ReadonlyArray<MiddlewareEffect> = [];
@@ -211,7 +228,19 @@ export function createSkillsReminderRegistration(deps: SkillsReminderDeps): Midd
211
228
  return NO_EFFECTS;
212
229
  }
213
230
  if (installed <= 0 && installable <= 0) return NO_EFFECTS;
214
- return [{ kind: "inject_reminder", severity: "info", message: skillsReminderMessage(installed, installable) }];
231
+ let modelActivation = false;
232
+ try {
233
+ modelActivation = deps.modelMayActivateSkills?.() ?? false;
234
+ } catch {
235
+ // An unreadable autonomy level falls back to the operator-gated wording.
236
+ }
237
+ return [
238
+ {
239
+ kind: "inject_reminder",
240
+ severity: "info",
241
+ message: skillsReminderMessage(installed, installable, modelActivation),
242
+ },
243
+ ];
215
244
  },
216
245
  };
217
246
  }
@@ -1,13 +1,14 @@
1
1
  import { createHookBudgetTracker, resolveHookBudgetsFromEnv, resolveHookBudgetTunablesFromEnv } from "./budget.js";
2
2
  import type { MiddlewareContract } from "./contract.js";
3
+ import { createMiddlewareRegistrationTable } from "./registrations.js";
3
4
  import { cloneMiddlewareRule, listMiddlewareRuleDefinitions, listMiddlewareRules } from "./rules.js";
4
5
  import {
5
6
  cloneMiddlewareEffect,
6
7
  type MiddlewareDiagnosticSink,
7
- type MiddlewareHookRegistration,
8
8
  type MiddlewareRuleDefinition,
9
9
  registrationFromRuleDefinition,
10
10
  runMiddlewareRegistrations,
11
+ writeMiddlewareDiagnosticToStderr,
11
12
  } from "./runtime.js";
12
13
  import type { MiddlewareRule, MiddlewareSnapshot } from "./types.js";
13
14
 
@@ -39,15 +40,20 @@ export function createMiddlewareContractFromSnapshot(snapshot: MiddlewareSnapsho
39
40
  if (builtin?.predicate !== undefined) definition.predicate = builtin.predicate;
40
41
  return definition;
41
42
  });
42
- const registrations: MiddlewareHookRegistration[] = definitions.map(registrationFromRuleDefinition);
43
- const registeredIds = new Set(registrations.map((registration) => registration.id));
43
+ let diagnosticSink: MiddlewareDiagnosticSink | undefined;
44
+ // Workers never receive owned registrations; the table exists so the
45
+ // worker contract satisfies the same interface with the same semantics.
46
+ const table = createMiddlewareRegistrationTable({
47
+ fixed: definitions.map(registrationFromRuleDefinition),
48
+ diagnosticSink: () => diagnosticSink ?? writeMiddlewareDiagnosticToStderr,
49
+ });
44
50
  const budgetTracker = createHookBudgetTracker({
45
51
  budgets: resolveHookBudgetsFromEnv(),
46
52
  ...resolveHookBudgetTunablesFromEnv(),
47
53
  });
48
- let diagnosticSink: MiddlewareDiagnosticSink | undefined;
49
54
  return {
50
55
  runHook(input) {
56
+ const registrations = table.list();
51
57
  return runMiddlewareRegistrations(input, registrations, {
52
58
  budgetTracker,
53
59
  ...(diagnosticSink !== undefined ? { onDiagnostic: diagnosticSink } : {}),
@@ -60,12 +66,19 @@ export function createMiddlewareContractFromSnapshot(snapshot: MiddlewareSnapsho
60
66
  return createMiddlewareSnapshot(definitions.map((definition) => definition.rule));
61
67
  },
62
68
  registerHook(registration) {
63
- if (registeredIds.has(registration.id)) return;
64
- registeredIds.add(registration.id);
65
- registrations.push(registration);
69
+ table.registerHook(registration);
66
70
  },
67
71
  setDiagnosticSink(sink) {
68
72
  diagnosticSink = sink;
69
73
  },
74
+ prepareRegistrationReplacement(owner, generation, registrations) {
75
+ return table.prepareReplacement(owner, generation, registrations);
76
+ },
77
+ replaceRegistrations(owner, generation, registrations) {
78
+ return table.replaceRegistrations(owner, generation, registrations);
79
+ },
80
+ ownedGeneration(owner) {
81
+ return table.ownedGeneration(owner);
82
+ },
70
83
  };
71
84
  }
@@ -119,6 +119,20 @@ export interface MuxContract extends DomainContract {
119
119
  focusPane(paneId: string): Promise<boolean>;
120
120
  /** Zoom one Clio-created pane on, off, or toggled. Zooming steals focus; same rule as focusPane. */
121
121
  zoomPane(paneId: string, mode: "on" | "off" | "toggle"): Promise<boolean>;
122
+ /**
123
+ * Bring keyboard focus back to Clio's own hosting pane. This is the return
124
+ * half of every explicit pane interaction: a pick in the files pane, a
125
+ * toggle that closed a pane the operator was looking at. False outside
126
+ * guest mode, without an anchor pane, or below the pane.focus floor.
127
+ */
128
+ focusSelf(): Promise<boolean>;
129
+ /**
130
+ * Leave zoom on the tab that hosts Clio, so a dock split from the anchor is
131
+ * visible again. A zoomed tab hides every pane but one; opening or focusing
132
+ * the files pane behind a zoom would report success for a pane the operator
133
+ * cannot see. False when nothing was zoomed or the tier is absent.
134
+ */
135
+ unzoomSelf(): Promise<boolean>;
122
136
  /** Set a dock's share of its axis. False when the slot has no dock or the tier is absent. */
123
137
  resizeDock(slot: DockSlot, share: number): Promise<boolean>;
124
138
  /** Live dock geometry states, for `/panes` status. */
@@ -425,6 +439,30 @@ export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
425
439
  );
426
440
  },
427
441
 
442
+ async focusSelf(): Promise<boolean> {
443
+ if (anchorPaneId === null || !muxSupportsMethod(detection.server, "pane.focus")) return false;
444
+ return await attempt(
445
+ "focusSelf",
446
+ async (live) => {
447
+ await live.paneFocus(anchorPaneId);
448
+ return true;
449
+ },
450
+ false,
451
+ );
452
+ },
453
+
454
+ async unzoomSelf(): Promise<boolean> {
455
+ if (anchorPaneId === null || !muxSupportsMethod(detection.server, "pane.zoom")) return false;
456
+ return await attempt(
457
+ "unzoomSelf",
458
+ async (live) => {
459
+ const result = await live.paneZoom(anchorPaneId, "off");
460
+ return result.changed;
461
+ },
462
+ false,
463
+ );
464
+ },
465
+
428
466
  async resizeDock(slot: DockSlot, share: number): Promise<boolean> {
429
467
  if (!docks) return false;
430
468
  return await attempt("resizeDock", () => docks.resize(slot, share), false);
@@ -126,19 +126,12 @@ export async function detectMux(options: DetectMuxOptions = {}): Promise<MuxDete
126
126
  return { detection: none("panes are turned off"), client: null };
127
127
  }
128
128
  if (enabled === "embedded") {
129
- // Phase 5 owns the session bootstrap. Until then the honest answer is that
130
- // Clio cannot provide panes, not that it failed to find them, and the
131
- // operator hears it: this degrade is marked a refusal so the boot says so
132
- // out loud rather than logging a debug line nobody reads. The reason also
133
- // names the rung that does work, because `embedded` costs guest mode too.
134
- return {
135
- detection: none(
136
- "embedded mode is not implemented yet; it ships in phase 5, so this session has no panes at all. Set panes.enabled=auto for guest mode inside a herdr session.",
137
- [],
138
- true,
139
- ),
140
- client: null,
141
- };
129
+ // Embedded mode (Clio owning the pane host) is not implemented yet. An
130
+ // operator who picked it wanted panes, so the rung degrades to guest
131
+ // detection instead of refusing everything; the notice below says which
132
+ // mode actually runs. When the guest ladder also fails, that failure is
133
+ // reported on its own terms.
134
+ log("info", "interface.panes.enabled=embedded is not implemented yet; detecting a guest pane host instead");
142
135
  }
143
136
  if (env.HERDR_ENV !== "1") {
144
137
  return { detection: none("HERDR_ENV is not 1, so Clio is not running inside a pane host"), client: null };
@@ -113,4 +113,4 @@ export {
113
113
  type YaziSessionOptions,
114
114
  type YaziSessionSnapshot,
115
115
  } from "./yazi/session.js";
116
- export { renderYaziTheme } from "./yazi/theme.js";
116
+ export { renderHerdrThemeBlock, renderYaziTheme } from "./yazi/theme.js";
@@ -14,13 +14,19 @@
14
14
  * shell-escape territory (spec 4.8, and the risk register's "tool misuse" row).
15
15
  */
16
16
 
17
- /** Utility pane presets, in the order `/panes open` lists them. */
17
+ /**
18
+ * Utility pane presets, in the order `/panes open` lists them.
19
+ *
20
+ * The files preset is a Clio Coder surface named for what it does; yazi is
21
+ * the engine behind it and shows up only in the install command, because
22
+ * that is the registry id an operator types.
23
+ */
18
24
  export const PANES_PRESETS = [
19
25
  {
20
- id: "yazi",
26
+ id: "files",
21
27
  /** Probed through the toolchain resolution ladder before the pane is split. */
22
28
  binary: "yazi",
23
- summary: "file manager rooted at the workspace",
29
+ summary: "file view rooted at the workspace; picks land in the composer",
24
30
  /** Printed verbatim when the probe finds nothing. */
25
31
  installHint: "clio-coder tools install yazi",
26
32
  },
@@ -42,10 +48,23 @@ export type PanesPresetId = (typeof PANES_PRESETS)[number]["id"];
42
48
 
43
49
  export const PANES_PRESET_IDS: ReadonlyArray<PanesPresetId> = PANES_PRESETS.map((preset) => preset.id);
44
50
 
45
- export function isPanesPresetId(value: string): value is PanesPresetId {
51
+ function isPanesPresetId(value: string): value is PanesPresetId {
46
52
  return PANES_PRESETS.some((preset) => preset.id === value);
47
53
  }
48
54
 
55
+ /**
56
+ * Retired preset spellings that still parse. The files preset shipped as
57
+ * `yazi` in 0.4.0 and 0.4.1, so an operator's muscle memory and any script
58
+ * that says `/panes open yazi` keeps working and lands on the same pane.
59
+ */
60
+ export const PANES_PRESET_ALIASES: Readonly<Record<string, PanesPresetId>> = { yazi: "files" };
61
+
62
+ /** The canonical preset id for an operator-typed name, or null when it is not a preset. */
63
+ export function resolvePanesPresetId(value: string): PanesPresetId | null {
64
+ if (isPanesPresetId(value)) return value;
65
+ return PANES_PRESET_ALIASES[value] ?? null;
66
+ }
67
+
49
68
  /** One pane Clio owns, flattened for display. */
50
69
  export interface PanesInventoryEntry {
51
70
  paneId: string;
@@ -135,7 +154,8 @@ export interface PanesWatchController {
135
154
  }
136
155
 
137
156
  export type PanesOpenResult =
138
- | { status: "opened"; label: string; paneId: string | null }
157
+ /** `existing` is true when the preset already had a live pane and it was focused instead of split again. */
158
+ | { status: "opened"; label: string; paneId: string | null; existing?: boolean }
139
159
  | { status: "missing-binary"; preset: string; binary: string; installHint: string; detail: string }
140
160
  | { status: "refused"; reason: string }
141
161
  | { status: "unavailable"; reason: string };
@@ -166,9 +186,21 @@ export interface PanesYaziController {
166
186
  | { status: "profile-error"; reason: string }
167
187
  | { status: "unavailable"; reason: string }
168
188
  >;
189
+ /** Close the files pane if it is open; false when nothing was open. */
190
+ close(): Promise<boolean>;
191
+ /** True while a files pane the host still reports is open. */
192
+ isOpen(): boolean;
169
193
  status(): Readonly<PanesYaziStatus>;
170
194
  }
171
195
 
196
+ /** What `/files` and the files keybinding settle to. */
197
+ export type PanesFilesResult =
198
+ | { status: "opened"; paneId: string | null; existing: boolean }
199
+ | { status: "closed" }
200
+ | { status: "missing-binary"; binary: string; installHint: string; detail: string }
201
+ | { status: "refused"; reason: string }
202
+ | { status: "unavailable"; reason: string };
203
+
172
204
  /**
173
205
  * The operations both callers drive. The tool sees a narrower door: its schema
174
206
  * has no argv field at all, and `open` refuses one even if a caller fabricates
@@ -185,6 +217,13 @@ export interface PanesOperations {
185
217
  */
186
218
  zoom(target: string): Promise<PanesZoomResult>;
187
219
  close(target: string): Promise<PanesCloseResult>;
220
+ /**
221
+ * The files pane as one operator verb. `toggle` opens it when closed and
222
+ * closes it when open, which is what a keybinding needs; `open` and
223
+ * `close` are the explicit halves; `pick` borrows the pane for one
224
+ * selection and closes it afterwards.
225
+ */
226
+ files(action: "toggle" | "open" | "close" | "pick"): Promise<PanesFilesResult>;
188
227
  /** Bind the composer-facing Yazi bridge without rebuilding this shared object. */
189
228
  attachYazi(controller: PanesYaziController): () => void;
190
229
  /** Bind the workers-view watch controller; `show` routes runs through it. */
@@ -1,5 +1,5 @@
1
- # Yazi config for orchestration TUI
2
- # Git status integration
1
+ # Clio Coder files pane: engine configuration. The pane host lists the pane by
2
+ # the label Clio sets ("files"); this file only shapes what the engine shows.
3
3
 
4
4
  [mgr]
5
5
  show_hidden = true
@@ -1,6 +1,6 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { randomUUID } from "node:crypto";
3
- import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
4
4
  import { join } from "node:path";
5
5
  import { namingCompatibilityEnvironment } from "../../../core/naming-compat.js";
6
6
  import { clioCacheDir } from "../../../core/xdg.js";
@@ -107,6 +107,37 @@ function readOptional(path: string): string {
107
107
  }
108
108
  }
109
109
 
110
+ /** Transport files older than this are leftovers of a process that never reached its cleanup. */
111
+ export const YAZI_STALE_TRANSPORT_MS = 24 * 60 * 60 * 1000;
112
+
113
+ /**
114
+ * Drop transport files no live session can own. A crash, a kill, or a
115
+ * release before cleanup existed leaves `.stream`, `.chooser`, and `.cwd`
116
+ * files behind; a day is long past any pane's life, so anything older goes.
117
+ */
118
+ export function sweepStaleTransportFiles(sessionsDir: string, now: number = Date.now()): number {
119
+ let removed = 0;
120
+ let entries: string[];
121
+ try {
122
+ entries = readdirSync(sessionsDir);
123
+ } catch {
124
+ return 0;
125
+ }
126
+ for (const name of entries) {
127
+ if (!/\.(stream|chooser|cwd)$/u.test(name)) continue;
128
+ const path = join(sessionsDir, name);
129
+ try {
130
+ if (now - statSync(path).mtimeMs > YAZI_STALE_TRANSPORT_MS) {
131
+ rmSync(path, { force: true });
132
+ removed += 1;
133
+ }
134
+ } catch {
135
+ // A file that vanished between readdir and stat was someone else's to remove.
136
+ }
137
+ }
138
+ return removed;
139
+ }
140
+
110
141
  /** Open one mux-hosted Yazi process and own its DDS or chooser-file transport. */
111
142
  export async function createYaziSession(options: YaziSessionOptions): Promise<YaziSessionOpenResult> {
112
143
  const binaries = (options.resolveBinaries ?? resolveYaziBinaries)();
@@ -125,6 +156,7 @@ export async function createYaziSession(options: YaziSessionOptions): Promise<Ya
125
156
  const sessionId = options.sessionId ?? randomUUID();
126
157
  const sessionsDir = join(cacheDir, "yazi", "sessions");
127
158
  mkdirSync(sessionsDir, { recursive: true });
159
+ sweepStaleTransportFiles(sessionsDir);
128
160
  const managedProfile =
129
161
  options.profileMode === "managed"
130
162
  ? (options.ensureProfile ?? ensureYaziProfile)({
@@ -163,10 +195,19 @@ export async function createYaziSession(options: YaziSessionOptions): Promise<Ya
163
195
  argv = [binaries.yaziPath, options.cwd, "--chooser-file", chooserPath, "--cwd-file", cwdPath];
164
196
  }
165
197
 
198
+ // Transport files are per session and worthless once it ends: a pick has
199
+ // already been consumed by the bridge, and a chooser file has been read.
200
+ // Removing them here is what keeps `<cache>/yazi/sessions` from growing by
201
+ // three files per open for the life of the install.
202
+ const removeTransportFiles = (): void => {
203
+ for (const path of [streamPath, chooserPath, cwdPath]) rmSync(path, { force: true });
204
+ };
205
+
166
206
  const pane = await options.mux.openUtilityPane({
167
207
  argv,
168
208
  cwd: options.cwd,
169
- label: "yazi",
209
+ label: "files",
210
+ title: "files",
170
211
  // The files dock: split down from the anchor at the configured share.
171
212
  // Degrades to a plain split inside the contract when the layout tier is
172
213
  // absent.
@@ -174,7 +215,10 @@ export async function createYaziSession(options: YaziSessionOptions): Promise<Ya
174
215
  ...(Object.keys(env).length > 0 ? { env } : {}),
175
216
  ...(stdoutPath ? { stdoutPath } : {}),
176
217
  });
177
- if (!pane) return { status: "unavailable", reason: "pane host refused to open yazi" };
218
+ if (!pane) {
219
+ removeTransportFiles();
220
+ return { status: "unavailable", reason: "the pane host refused to open the files pane" };
221
+ }
178
222
 
179
223
  let paneCwd = options.cwd;
180
224
  let instanceId: string | null = null;
@@ -188,6 +232,7 @@ export async function createYaziSession(options: YaziSessionOptions): Promise<Ya
188
232
  if (chooserTimer) clearInterval(chooserTimer);
189
233
  chooserTimer = null;
190
234
  options.onStopped?.(reason);
235
+ removeTransportFiles();
191
236
  };
192
237
 
193
238
  if (options.mode === "companion") {
@@ -204,7 +249,11 @@ export async function createYaziSession(options: YaziSessionOptions): Promise<Ya
204
249
  options.onEvent(event);
205
250
  },
206
251
  });
207
- void stream.done.then((reason) => stop(reason));
252
+ void stream.done.then((reason) => {
253
+ // A stream that ended on its own means the pane is gone or the file
254
+ // was lost; either way the session is over and says so.
255
+ stop(reason);
256
+ });
208
257
  } else {
209
258
  const pollChooser = (): void => {
210
259
  if (stopped || alive()) return;
@@ -1,30 +1,130 @@
1
1
  import { tokenHex } from "../../../core/theme-token-hex.js";
2
2
 
3
- /** Render the deliberately small Clio overlay on Yazi's pinned preset theme. */
3
+ /**
4
+ * Render the Clio overlay on Yazi's pinned preset theme.
5
+ *
6
+ * Every color comes from Clio's own token palette (`core/theme-token-hex.ts`),
7
+ * read when the managed profile is generated, which happens on the open that
8
+ * finds no current profile. The profile stamp carries this file's output hash,
9
+ * so a palette change regenerates the profile on the next open rather than
10
+ * leaving a pane in last release's colors. Only keys Yazi 26.8 documents are
11
+ * set; the rest of the preset stays, because a wrong key here is rejected by
12
+ * the validation open in `profile.ts` and would leave the operator with no
13
+ * files pane at all.
14
+ */
4
15
  export function renderYaziTheme(): string {
5
- return `# Generated by Clio Coder. Changes are replaced when the managed profile regenerates.
16
+ const accent = tokenHex("accent");
17
+ const action = tokenHex("action");
18
+ const success = tokenHex("success");
19
+ const warning = tokenHex("warning");
20
+ const error = tokenHex("error");
21
+ const info = tokenHex("info");
22
+ const dim = tokenHex("dim");
23
+ const muted = tokenHex("muted");
24
+ const frame = tokenHex("frame");
25
+ const frameStrong = tokenHex("frameStrong");
26
+ return `# Generated by Clio Coder from its theme tokens. Changes are replaced when the managed profile regenerates.
6
27
 
7
28
  [mgr]
8
- cwd = { fg = "${tokenHex("accent")}" }
9
- find_keyword = { fg = "${tokenHex("warning")}" }
10
- marker_selected = { fg = "${tokenHex("success")}", bg = "${tokenHex("success")}" }
11
- marker_copied = { fg = "${tokenHex("accent")}", bg = "${tokenHex("accent")}" }
12
- marker_cut = { fg = "${tokenHex("error")}", bg = "${tokenHex("error")}" }
13
- border_style = { fg = "${tokenHex("frame")}" }
29
+ cwd = { fg = "${accent}" }
30
+ hovered = { reversed = true }
31
+ preview_hovered = { underline = true }
32
+ find_keyword = { fg = "${warning}", bold = true }
33
+ find_position = { fg = "${action}", italic = true }
34
+ marker_selected = { fg = "${success}", bg = "${success}" }
35
+ marker_copied = { fg = "${accent}", bg = "${accent}" }
36
+ marker_cut = { fg = "${error}", bg = "${error}" }
37
+ marker_marked = { fg = "${info}", bg = "${info}" }
38
+ count_copied = { fg = "${accent}", bg = "${frame}" }
39
+ count_cut = { fg = "${error}", bg = "${frame}" }
40
+ count_selected = { fg = "${success}", bg = "${frame}" }
41
+ border_style = { fg = "${frame}" }
42
+ syntect_theme = ""
14
43
 
15
44
  [mode]
16
- normal_main = { bg = "${tokenHex("accent")}" }
17
- normal_alt = { fg = "${tokenHex("accent")}" }
18
- select_main = { bg = "${tokenHex("action")}" }
19
- select_alt = { fg = "${tokenHex("action")}" }
20
- unset_main = { bg = "${tokenHex("error")}" }
21
- unset_alt = { fg = "${tokenHex("error")}" }
45
+ normal_main = { bg = "${accent}", bold = true }
46
+ normal_alt = { fg = "${accent}" }
47
+ select_main = { bg = "${action}", bold = true }
48
+ select_alt = { fg = "${action}" }
49
+ unset_main = { bg = "${error}", bold = true }
50
+ unset_alt = { fg = "${error}" }
22
51
 
23
52
  [tabs]
24
- active = { bg = "${tokenHex("accent")}" }
25
- inactive = { fg = "${tokenHex("accent")}" }
53
+ active = { bg = "${accent}", bold = true }
54
+ inactive = { fg = "${accent}" }
26
55
 
27
56
  [status]
28
- perm_sep = { fg = "${tokenHex("dim")}" }
57
+ perm_type = { fg = "${accent}" }
58
+ perm_read = { fg = "${warning}" }
59
+ perm_write = { fg = "${error}" }
60
+ perm_exec = { fg = "${success}" }
61
+ perm_sep = { fg = "${dim}" }
62
+ progress_label = { bold = true }
63
+ progress_normal = { fg = "${accent}" }
64
+ progress_error = { fg = "${error}" }
65
+
66
+ [which]
67
+ cols = 3
68
+ mask = { bg = "${frame}" }
69
+ cand = { fg = "${accent}" }
70
+ rest = { fg = "${muted}" }
71
+ desc = { fg = "${action}" }
72
+ separator_style = { fg = "${dim}" }
73
+
74
+ [confirm]
75
+ border = { fg = "${frameStrong}" }
76
+ title = { fg = "${accent}" }
77
+ btn_yes = { reversed = true }
78
+ btn_no = {}
79
+
80
+ [pick]
81
+ border = { fg = "${frameStrong}" }
82
+ active = { fg = "${action}", bold = true }
83
+
84
+ [input]
85
+ border = { fg = "${frameStrong}" }
86
+ title = { fg = "${accent}" }
87
+ selected = { reversed = true }
88
+
89
+ [cmp]
90
+ border = { fg = "${frameStrong}" }
91
+ active = { reversed = true }
92
+
93
+ [tasks]
94
+ border = { fg = "${frameStrong}" }
95
+ title = { fg = "${accent}" }
96
+ hovered = { fg = "${action}", underline = true }
97
+
98
+ [help]
99
+ on = { fg = "${accent}" }
100
+ run = { fg = "${action}" }
101
+ footer = { fg = "${muted}" }
102
+
103
+ [notify]
104
+ title_info = { fg = "${info}" }
105
+ title_warn = { fg = "${warning}" }
106
+ title_error = { fg = "${error}" }
107
+ `;
108
+ }
109
+
110
+ /**
111
+ * The same palette as a herdr `[theme.custom]` block.
112
+ *
113
+ * herdr themes its chrome (sidebar, tab bar, borders, agent rows) from its own
114
+ * config.toml and has no per-pane styling on the wire, so Clio cannot color
115
+ * the panes it opens. What it can do is hand the operator the block that makes
116
+ * herdr's chrome match Clio, to paste into herdr's config; Clio never writes
117
+ * another program's configuration itself.
118
+ */
119
+ export function renderHerdrThemeBlock(): string {
120
+ return `# Clio Coder theme tokens for herdr. Paste into ~/.config/herdr/config.toml, then run \`herdr server reload-config\`.
121
+ [theme.custom]
122
+ accent = "${tokenHex("accent")}"
123
+ green = "${tokenHex("success")}"
124
+ blue = "${tokenHex("info")}"
125
+ red = "${tokenHex("error")}"
126
+ yellow = "${tokenHex("warning")}"
127
+ selection_bg = "${tokenHex("frame")}"
128
+ active_row_bg = "${tokenHex("frame")}"
29
129
  `;
30
130
  }