@iowarp/clio-coder 0.4.0 → 0.4.2

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 (751) hide show
  1. package/CHANGELOG.md +131 -0
  2. package/CONTRIBUTING.md +59 -36
  3. package/README.md +407 -375
  4. package/SECURITY.md +2 -1
  5. package/dist/{acp-G5WJBNCT.js → acp-TMDQZDIG.js} +14 -14
  6. package/dist/{agents-FMV2Q5G4.js → agents-5N5NG3XG.js} +45 -34
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/{auth-3IDSJEIK.js → auth-Z5CCBXKQ.js} +22 -21
  9. package/dist/{builtins-XCZWXSC7.js → builtins-K6TNDT24.js} +6 -6
  10. package/dist/{chunk-GR5G2PVF.js → chunk-2HFQNRV3.js} +15 -10
  11. package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
  12. package/dist/{chunk-HJJTYUHX.js → chunk-2NHR3NAY.js} +168 -1406
  13. package/dist/chunk-2X4RYJTJ.js +39 -0
  14. package/dist/{chunk-UXMFQ54G.js → chunk-2Z2IKEXI.js} +39 -43
  15. package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
  16. package/dist/chunk-34BHNEE3.js +1846 -0
  17. package/dist/{chunk-YJX4SHTD.js → chunk-35MSIRKH.js} +9 -4
  18. package/dist/chunk-3EBYEESD.js +314 -0
  19. package/dist/{chunk-CTJ4RNAA.js → chunk-3F7VUY77.js} +2 -2
  20. package/dist/chunk-3KIPBMUA.js +308 -0
  21. package/dist/chunk-3M6DQK6S.js +362 -0
  22. package/dist/{chunk-BPKCPIL7.js → chunk-462T4EGZ.js} +3 -3
  23. package/dist/{chunk-QLFS5GO2.js → chunk-4JDLP6ZS.js} +44 -37
  24. package/dist/{chunk-LDQ2ZF2M.js → chunk-4O6MANBS.js} +6 -6
  25. package/dist/{chunk-O6TL7WWY.js → chunk-54ODD65L.js} +6 -6
  26. package/dist/{chunk-JDG2WCRO.js → chunk-5KW52TEP.js} +5 -5
  27. package/dist/{chunk-NHLBIGRH.js → chunk-5PFYMY2V.js} +41 -18
  28. package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
  29. package/dist/chunk-77QIVUZB.js +1334 -0
  30. package/dist/{chunk-HWHKMHUA.js → chunk-7BHIY2MW.js} +9 -15
  31. package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
  32. package/dist/{chunk-VAZSBTKF.js → chunk-AZ4WMN4W.js} +2 -2
  33. package/dist/{chunk-B7OBL7PK.js → chunk-B74PXLU7.js} +21 -11
  34. package/dist/{chunk-CY6FY24N.js → chunk-B7HM5Z7T.js} +15 -15
  35. package/dist/{chunk-ULC6OTWO.js → chunk-BO7Y52RY.js} +88 -27
  36. package/dist/chunk-BTK3SSSK.js +67 -0
  37. package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
  38. package/dist/{chunk-DQITNCXG.js → chunk-BYMNWQ7O.js} +149 -159
  39. package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
  40. package/dist/{chunk-Z4TXYIEG.js → chunk-CRFOIAX3.js} +10 -10
  41. package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
  42. package/dist/{chunk-3BT2XMV4.js → chunk-CYZW7JHJ.js} +53 -60
  43. package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
  44. package/dist/chunk-D7E7WCDF.js +27 -0
  45. package/dist/{chunk-X3YGUTOB.js → chunk-DYHAXKHD.js} +90 -62
  46. package/dist/{chunk-QBJA7R7N.js → chunk-DZAW46HP.js} +3 -3
  47. package/dist/{chunk-MLKNTWH2.js → chunk-DZEK6CJN.js} +22 -22
  48. package/dist/{chunk-K5C3NCBD.js → chunk-E7GT7O5N.js} +5 -5
  49. package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
  50. package/dist/chunk-F2I26BDK.js +66 -0
  51. package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
  52. package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
  53. package/dist/{chunk-32KWKNSF.js → chunk-FVDGR2ZL.js} +4 -4
  54. package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
  55. package/dist/{chunk-SJ5ZKQ4S.js → chunk-HIICAHCJ.js} +2 -2
  56. package/dist/chunk-HJWWJ6IL.js +184 -0
  57. package/dist/{chunk-WZR7K7ZX.js → chunk-HKMD33FO.js} +32 -83
  58. package/dist/chunk-HLAFFSEK.js +360 -0
  59. package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
  60. package/dist/{chunk-KFZI4NIL.js → chunk-I64IFBLB.js} +152 -31
  61. package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
  62. package/dist/{chunk-BUMFYQFY.js → chunk-I66ZTYNP.js} +543 -267
  63. package/dist/{chunk-2OQE55CK.js → chunk-I7XBWTYH.js} +2 -2
  64. package/dist/{chunk-GKF55TAZ.js → chunk-IDNA72AH.js} +104 -3
  65. package/dist/{chunk-GCSMB2KY.js → chunk-IKOZFYBN.js} +1 -1
  66. package/dist/{chunk-J4W7KFM7.js → chunk-IKSLQ4XV.js} +5439 -3475
  67. package/dist/{chunk-6DB53AJS.js → chunk-IMXMHHMQ.js} +171 -30
  68. package/dist/{chunk-AB44T6BB.js → chunk-JBCS7CRR.js} +8 -7
  69. package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
  70. package/dist/{chunk-SP2RXXYO.js → chunk-JWJGP5DQ.js} +10 -10
  71. package/dist/{chunk-HZHHCK24.js → chunk-KKOJXO6R.js} +527 -325
  72. package/dist/chunk-KPXDY6QF.js +47 -0
  73. package/dist/{chunk-LQ3DZAMX.js → chunk-LJID3DYZ.js} +8 -2
  74. package/dist/{chunk-7MCTRUCE.js → chunk-M2DAX4F6.js} +2 -2
  75. package/dist/{chunk-VEO4AP2K.js → chunk-M2WXEHER.js} +4 -3
  76. package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
  77. package/dist/{chunk-YDFRH54B.js → chunk-MCMZMDAC.js} +4 -4
  78. package/dist/{chunk-J5Q24KAG.js → chunk-MNJGS2IN.js} +5 -6
  79. package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
  80. package/dist/chunk-NDDGJUXD.js +81 -0
  81. package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
  82. package/dist/chunk-NMJXSHBJ.js +283 -0
  83. package/dist/{chunk-VYMXRQI6.js → chunk-O3YUNJZ2.js} +88 -100
  84. package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
  85. package/dist/{chunk-Z2RR6MAK.js → chunk-P75RZCJW.js} +28 -6
  86. package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
  87. package/dist/{chunk-DYJP44XW.js → chunk-PGF63K6I.js} +2 -2
  88. package/dist/chunk-PJX3WQUQ.js +42 -0
  89. package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
  90. package/dist/{chunk-2JDWVJND.js → chunk-Q4XWMHX6.js} +5 -7
  91. package/dist/{chunk-W5VSYASO.js → chunk-QQLGQY2A.js} +46 -87
  92. package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
  93. package/dist/{chunk-C2LTL2W6.js → chunk-RLYRBIYQ.js} +463 -180
  94. package/dist/{chunk-4ZG3XFUR.js → chunk-S66XZJOF.js} +14 -23
  95. package/dist/{chunk-I5VEOC6I.js → chunk-SSEYRH53.js} +13 -14
  96. package/dist/chunk-SZAA6XDG.js +30 -0
  97. package/dist/{chunk-CODPRO7Q.js → chunk-TPEQIQIE.js} +7 -7
  98. package/dist/{chunk-QLL7ILRG.js → chunk-UBRFI4HS.js} +1151 -614
  99. package/dist/{chunk-O4XIVISU.js → chunk-UH347SHR.js} +227 -47
  100. package/dist/{chunk-OQBA45DZ.js → chunk-UH632ZYL.js} +2 -2
  101. package/dist/chunk-UXCU4E3T.js +303 -0
  102. package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
  103. package/dist/{chunk-IQ7KR472.js → chunk-VIA6RFQZ.js} +8 -13
  104. package/dist/{chunk-V5DHCITQ.js → chunk-VKPAQYEB.js} +49 -19
  105. package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
  106. package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
  107. package/dist/{chunk-3XML7CDN.js → chunk-W4YEMFBX.js} +3 -3
  108. package/dist/{chunk-U77AMWDL.js → chunk-W6NIE6OW.js} +44 -23
  109. package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
  110. package/dist/{chunk-QREDIESB.js → chunk-X7IARSHT.js} +15 -9
  111. package/dist/{chunk-3URVFKWK.js → chunk-XE3PCIXH.js} +5 -5
  112. package/dist/{chunk-FEFIFZTL.js → chunk-XGDPUNND.js} +2 -2
  113. package/dist/{chunk-F4CKPOEQ.js → chunk-XOXV5GKE.js} +119 -38
  114. package/dist/chunk-XQRY4DTA.js +657 -0
  115. package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
  116. package/dist/{chunk-NQQH3YT7.js → chunk-YJISEZKC.js} +3 -3
  117. package/dist/{chunk-X75E3D2N.js → chunk-ZGNYYXQ6.js} +18 -16
  118. package/dist/{chunk-LY4S7GJC.js → chunk-ZNT2M6TG.js} +20 -18
  119. package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
  120. package/dist/{chunk-IBEBSCYA.js → chunk-ZW4HH5JJ.js} +43 -34
  121. package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
  122. package/dist/cli/index.js +38 -37
  123. package/dist/{clio-2JXHBBY5.js → clio-7VB377CC.js} +12 -13
  124. package/dist/{code-nav-3YYRMYNF.js → code-nav-YVLCYA7V.js} +86 -18
  125. package/dist/codewiki/build-worker.js +1 -1
  126. package/dist/{compile-cache-7FPE6PS3.js → compile-cache-OQAVB7Y5.js} +2 -4
  127. package/dist/{components-RYZV4JGP.js → components-UBWCQSRW.js} +4 -4
  128. package/dist/{config-QZPCMYSO.js → config-4HVOS65E.js} +112 -63
  129. package/dist/{configure-TEGEBYCA.js → configure-PIWO7B24.js} +25 -22
  130. package/dist/{context-E6H5RNMC.js → context-IYEHL3WQ.js} +53 -47
  131. package/dist/{context-GSXUE4CT.js → context-KQYIWPWT.js} +68 -42
  132. package/dist/{context-AV7OEZ4D.js → context-N6ZE3LGJ.js} +11 -11
  133. package/dist/{context-clear-SHIBYK6T.js → context-clear-G4OGZJDS.js} +53 -47
  134. package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-BWLF6LJP.js} +12 -11
  135. package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-2QQAITS3.js} +67 -58
  136. package/dist/{docs-23KQS3XK.js → docs-PD3EXDKU.js} +20 -25
  137. package/dist/doctor-LHBD36VU.js +773 -0
  138. package/dist/{eval-TFBYQH4H.js → eval-C45FYRJ6.js} +68 -49
  139. package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-6DEJPLBF.js} +7 -8
  140. package/dist/{evidence-ERGESKGN.js → evidence-6SHONYAF.js} +50 -44
  141. package/dist/{evolve-VDXTSYCJ.js → evolve-KRKMV72X.js} +49 -43
  142. package/dist/{extensions-7BGBHN57.js → extensions-KPZ2UHBB.js} +8 -6
  143. package/dist/{fleet-2RRVDF2V.js → fleet-IVTCKDHT.js} +93 -79
  144. package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EDWL3IT7.js} +10 -9
  145. package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-YP3YEFGK.js} +6 -6
  146. package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-ZFWKHY2M.js} +19 -15
  147. package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-FVUNCBML.js} +50 -45
  148. package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-UN5XED4R.js} +5 -9
  149. package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-XOWC4HSX.js} +22 -17
  150. package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-UN3SODEL.js} +48 -43
  151. package/dist/fleet-view-TWHJKCN6.js +96 -0
  152. package/dist/{init-DN2WWLFE.js → init-T2QORQ3Y.js} +72 -66
  153. package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
  154. package/dist/{interop-OZBKXAYL.js → interop-IN5I2A66.js} +13 -11
  155. package/dist/{library-YWZG7IMW.js → library-LSCATDLZ.js} +23 -18
  156. package/dist/{memory-I4C4HMLW.js → memory-HYOKAGGJ.js} +51 -45
  157. package/dist/{models-CEYXJBO6.js → models-2GPMFYCM.js} +42 -33
  158. package/dist/{monitor-NZ6GCI3P.js → monitor-E4ASVUJH.js} +56 -50
  159. package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-DDMPR3PY.js} +2676 -1507
  160. package/dist/{panes-KY6W3V2E.js → panes-E3RUXOW5.js} +5 -5
  161. package/dist/panes-IXKLOKA2.js +75 -0
  162. package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
  163. package/dist/{reset-DQ6FGCSH.js → reset-OAQP3W4O.js} +7 -8
  164. package/dist/{resources-BB3MVJMD.js → resources-OTRSN34L.js} +23 -17
  165. package/dist/{run-H2GQDUER.js → run-5DEYH5QK.js} +95 -84
  166. package/dist/{share-GTJN6A5O.js → share-IHWTLO3M.js} +26 -19
  167. package/dist/{skills-L55TEW6R.js → skills-IYMXMKW4.js} +25 -20
  168. package/dist/{skills-eval-XVXPH2JI.js → skills-eval-DROHSJAR.js} +63 -65
  169. package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-D7X4L4ZX.js} +21 -16
  170. package/dist/{slash-commands-ZSGASKJC.js → slash-commands-QBM7UZ3B.js} +38 -33
  171. package/dist/{steer-RZGSCY4R.js → steer-Z5DO23FJ.js} +3 -3
  172. package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
  173. package/dist/{targets-NCPZ644J.js → targets-P2FUC4IL.js} +64 -61
  174. package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-YREJ3JX2.js} +15 -10
  175. package/dist/{tools-DAF3DI3C.js → tools-5B7RO6MV.js} +10 -8
  176. package/dist/{trace-FYVW2MQA.js → trace-YMGMUM6A.js} +101 -8
  177. package/dist/{tui-primitives-2AKXQNZK.js → tui-primitives-K5PASC3O.js} +8 -4
  178. package/dist/{uninstall-DW2PNOIC.js → uninstall-N34PCTGJ.js} +4 -6
  179. package/dist/{upgrade-3XPP6OQL.js → upgrade-PXK3S2YM.js} +36 -61
  180. package/dist/{usage-3NLHGTU2.js → usage-ME5MPXGX.js} +58 -53
  181. package/dist/{verifiers-SSQONKRT.js → verifiers-BVZ7IWOO.js} +10 -9
  182. package/dist/{verify-3U6J7FZI.js → verify-5K7ZKQFC.js} +9 -8
  183. package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPARV2K7.js} +2 -3
  184. package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-F5W5QTYY.js} +74 -70
  185. package/dist/{with-panes-MKB46MPQ.js → with-panes-BYOJCLAM.js} +78 -246
  186. package/dist/worker/entry.js +83 -63
  187. package/docs/README.md +176 -81
  188. package/docs/{acp.md → architecture/acp.md} +36 -20
  189. package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
  190. package/docs/{architecture.md → architecture/architecture.md} +43 -22
  191. package/docs/{artifact-placement.md → architecture/artifact-placement.md} +26 -23
  192. package/docs/architecture/artifact-versions.md +90 -0
  193. package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
  194. package/docs/{context-engine.md → architecture/context-engine.md} +25 -25
  195. package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
  196. package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
  197. package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
  198. package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
  199. package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
  200. package/docs/{model-catalog.md → architecture/model-catalog.md} +40 -17
  201. package/docs/{observability.md → architecture/observability.md} +26 -13
  202. package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
  203. package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +55 -20
  204. package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +35 -24
  205. package/docs/{safety-model.md → architecture/safety-model.md} +20 -15
  206. package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
  207. package/docs/architecture/time-conventions.md +125 -0
  208. package/docs/{trace-store.md → architecture/trace-store.md} +26 -13
  209. package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
  210. package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
  211. package/docs/{built-in-agents.md → guide/built-in-agents.md} +70 -46
  212. package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +73 -62
  213. package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -444
  214. package/docs/guide/configuration-reference.md +1158 -0
  215. package/docs/{environment-variables.md → guide/environment-variables.md} +31 -27
  216. package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +8 -3
  217. package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
  218. package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +47 -49
  219. package/docs/{glossary.md → guide/glossary.md} +14 -11
  220. package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +45 -14
  221. package/docs/guide/panes-and-files.md +290 -0
  222. package/docs/{proactive-memory.md → guide/proactive-memory.md} +79 -66
  223. package/docs/{resource-library.md → guide/resource-library.md} +13 -4
  224. package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +7 -3
  225. package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
  226. package/docs/{troubleshooting.md → guide/troubleshooting.md} +10 -5
  227. package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +13 -10
  228. package/docs/history/release-cut-checklist.md +207 -0
  229. package/docs/{development-pipeline.md → process/development-pipeline.md} +24 -26
  230. package/docs/process/documentation-coverage.md +100 -0
  231. package/docs/process/documentation-guide.md +187 -0
  232. package/docs/{eval-runner.md → process/eval-runner.md} +41 -50
  233. package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
  234. package/docs/{evolution.md → process/evolution.md} +2 -2
  235. package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +17 -10
  236. package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
  237. package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
  238. package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
  239. package/evals/README.md +5 -0
  240. package/evals/behavioral-corpus-grader.mjs +103 -0
  241. package/evals/behavioral-machinery-baseline.json +2276 -0
  242. package/evals/behavioral-machinery-driver.ts +250 -0
  243. package/evals/behavioral-machinery-support.ts +253 -0
  244. package/evals/behavioral-machinery.yaml +614 -0
  245. package/evals/behavioral-model-negative-control.yaml +68 -0
  246. package/evals/behavioral-model.yaml +216 -0
  247. package/evals/fixtures/behavioral-facts.txt +3 -0
  248. package/evals/fixtures/behavioral-main.ts +7 -0
  249. package/evals/fixtures/decoy/note.txt +2 -0
  250. package/evals/fixtures/private/credentials.txt +1 -0
  251. package/evals/tracked-metrics-baseline.yaml +229 -0
  252. package/evals/tracked-metrics-grader.mjs +129 -0
  253. package/package.json +13 -21
  254. package/skills/README.md +51 -42
  255. package/skills/coding/ast-grep/SKILL.md +9 -3
  256. package/skills/coding/coding-standards/SKILL.md +9 -3
  257. package/skills/coding/prototype/SKILL.md +9 -3
  258. package/skills/coding/tdd/SKILL.md +9 -3
  259. package/skills/context/context-handoff/SKILL.md +13 -4
  260. package/skills/context/context-handoff/evals.md +3 -3
  261. package/skills/context/context-prime/SKILL.md +9 -3
  262. package/skills/context/context-prime/evals.md +2 -2
  263. package/skills/git/file-ticket/SKILL.md +10 -5
  264. package/skills/git/file-ticket/evals.md +2 -2
  265. package/skills/git/fix-issue/SKILL.md +12 -5
  266. package/skills/git/fix-issue/evals.md +4 -4
  267. package/skills/git/resolve-merge-conflicts/SKILL.md +9 -3
  268. package/skills/git/resolve-merge-conflicts/evals.md +2 -2
  269. package/skills/git/ship/SKILL.md +10 -4
  270. package/skills/git/ship/evals.md +4 -4
  271. package/skills/git/worktree-create/SKILL.md +8 -3
  272. package/skills/git/worktree-create/evals.md +6 -6
  273. package/skills/git/worktree-merge/SKILL.md +8 -3
  274. package/skills/git/worktree-merge/evals.md +6 -6
  275. package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +22 -12
  276. package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +5 -4
  277. package/skills/meta/clio-coder-test/SKILL.md +146 -0
  278. package/skills/meta/{clio-test → clio-coder-test}/evals.md +10 -5
  279. package/skills/meta/clio-coder-test/references/harness.md +102 -0
  280. package/skills/meta/clio-coder-test/references/test-map.md +96 -0
  281. package/skills/meta/credentials/SKILL.md +10 -3
  282. package/skills/meta/find-skills/SKILL.md +9 -3
  283. package/skills/meta/herdr/SKILL.md +9 -3
  284. package/skills/meta/skill-craft/SKILL.md +39 -16
  285. package/skills/planning/architecture/SKILL.md +9 -3
  286. package/skills/planning/backlog/SKILL.md +9 -3
  287. package/skills/planning/prd/SKILL.md +9 -3
  288. package/skills/planning/product-intent/SKILL.md +9 -3
  289. package/skills/planning/tech-spec/SKILL.md +9 -3
  290. package/skills/registry.yaml +66 -66
  291. package/skills/research/arxiv-literature/SKILL.md +9 -3
  292. package/skills/research/experiment-protocol/SKILL.md +10 -3
  293. package/skills/research/scientific-debugging/SKILL.md +10 -3
  294. package/skills/research/scientific-debugging/evals.md +2 -2
  295. package/skills/research/scientific-modernization/SKILL.md +10 -3
  296. package/skills/skill-marketplace.json +285 -66
  297. package/skills/workflow/cut-it/SKILL.md +11 -3
  298. package/skills/workflow/design-council/SKILL.md +12 -3
  299. package/skills/workflow/grill-me/SKILL.md +9 -3
  300. package/skills/workflow/workflow-distiller/SKILL.md +9 -3
  301. package/src/cli/acp.ts +2 -2
  302. package/src/cli/args.ts +2 -2
  303. package/src/cli/auth.ts +2 -2
  304. package/src/cli/bootstrap-generate.ts +6 -6
  305. package/src/cli/clio.ts +6 -1
  306. package/src/cli/config-inspect.ts +68 -15
  307. package/src/cli/configure-interop.ts +1 -1
  308. package/src/cli/configure.ts +27 -31
  309. package/src/cli/default-target.ts +1 -1
  310. package/src/cli/docs.ts +28 -20
  311. package/src/cli/doctor-naming.ts +323 -0
  312. package/src/cli/doctor-panes.ts +46 -14
  313. package/src/cli/doctor-toolchain.ts +31 -10
  314. package/src/cli/doctor.ts +15 -1
  315. package/src/cli/eval-inventory.ts +8 -8
  316. package/src/cli/eval.ts +1 -2
  317. package/src/cli/evidence-detail.ts +1 -1
  318. package/src/cli/evidence-inventory.ts +1 -1
  319. package/src/cli/extensions.ts +2 -1
  320. package/src/cli/fleet-decisions.ts +1 -1
  321. package/src/cli/fleet-inspect.ts +1 -1
  322. package/src/cli/fleet-preflight.ts +1 -1
  323. package/src/cli/fleet-verify.ts +1 -1
  324. package/src/cli/fleet-view.ts +40 -23
  325. package/src/cli/fleet.ts +9 -6
  326. package/src/cli/index.ts +2 -1
  327. package/src/cli/internal-dispatch.ts +3 -4
  328. package/src/cli/interop-inspect.ts +2 -2
  329. package/src/cli/models.ts +3 -3
  330. package/src/cli/modes/print.ts +1 -1
  331. package/src/cli/panes.ts +19 -5
  332. package/src/cli/reset.ts +1 -1
  333. package/src/cli/run.ts +13 -17
  334. package/src/cli/share.ts +6 -2
  335. package/src/cli/skills-eval.ts +14 -14
  336. package/src/cli/targets.ts +25 -30
  337. package/src/cli/trace-inspect.ts +1 -1
  338. package/src/cli/trace.ts +96 -4
  339. package/src/cli/uninstall.ts +2 -2
  340. package/src/cli/upgrade.ts +29 -34
  341. package/src/cli/usage.ts +2 -2
  342. package/src/cli/validate-model.ts +1 -1
  343. package/src/cli/verifiers-inspect.ts +1 -1
  344. package/src/cli/wiki-generate.ts +6 -6
  345. package/src/core/artifact-paths.ts +1 -1
  346. package/src/core/bash-exec.ts +132 -87
  347. package/src/core/boot-trace.ts +3 -3
  348. package/src/core/bus-events.ts +51 -6
  349. package/src/core/bus-trace.ts +2 -2
  350. package/src/core/compile-cache.ts +1 -1
  351. package/src/core/config.ts +1066 -886
  352. package/src/core/defaults.ts +326 -530
  353. package/src/core/dispatch-outcome.ts +16 -0
  354. package/src/core/domain-loader.ts +6 -4
  355. package/src/core/event-bus.ts +1 -1
  356. package/src/core/file-references.ts +78 -88
  357. package/src/core/git-commit-attribution.ts +3 -9
  358. package/src/core/guardrails.ts +33 -52
  359. package/src/core/naming-compat.ts +45 -0
  360. package/src/core/naming-events.ts +62 -0
  361. package/src/core/prompt-hint.ts +9 -0
  362. package/src/core/recent-models.ts +1 -7
  363. package/src/core/residency-protection.ts +4 -8
  364. package/src/core/resolve-config-value.ts +1 -1
  365. package/src/core/response-model-id.ts +0 -14
  366. package/src/core/session-routing.ts +84 -74
  367. package/src/core/skill-activation.ts +18 -0
  368. package/src/core/termination.ts +4 -4
  369. package/src/core/timers.ts +2 -12
  370. package/src/domains/agents/builtins/architect.md +2 -3
  371. package/src/domains/agents/builtins/coder.md +3 -2
  372. package/src/domains/agents/builtins/debugger.md +2 -2
  373. package/src/domains/agents/builtins/documenter.md +2 -2
  374. package/src/domains/agents/builtins/git-master.md +1 -1
  375. package/src/domains/agents/builtins/oracle.md +1 -1
  376. package/src/domains/agents/builtins/provenance.md +1 -1
  377. package/src/domains/agents/builtins/researcher.md +1 -1
  378. package/src/domains/agents/builtins/scout.md +1 -1
  379. package/src/domains/agents/builtins/tester.md +2 -2
  380. package/src/domains/agents/builtins/verifier.md +2 -2
  381. package/src/domains/agents/builtins/wiki-writer.md +1 -1
  382. package/src/domains/agents/catalog.ts +14 -26
  383. package/src/domains/agents/contract.ts +2 -0
  384. package/src/domains/agents/extension.ts +26 -4
  385. package/src/domains/agents/registry.ts +7 -7
  386. package/src/domains/agents/result-contract.ts +1 -1
  387. package/src/domains/agents/spec.ts +0 -11
  388. package/src/domains/config/classify.ts +35 -47
  389. package/src/domains/config/extension.ts +5 -5
  390. package/src/domains/config/keybindings.ts +56 -47
  391. package/src/domains/config/watcher.ts +1 -1
  392. package/src/domains/context/codewiki/indexer.ts +1 -1
  393. package/src/domains/context/extension.ts +3 -6
  394. package/src/domains/context/prompt-context.ts +1 -1
  395. package/src/domains/context/wiki/assemble.ts +2 -2
  396. package/src/domains/context/working-set/path-index.ts +1 -0
  397. package/src/domains/context/working-set/replay/metrics.ts +0 -4
  398. package/src/domains/context/working-set/replay/report.ts +1 -1
  399. package/src/domains/context/working-set/replay/synthetic.ts +2 -2
  400. package/src/domains/dispatch/active-route-planner.ts +2 -2
  401. package/src/domains/dispatch/agent-candidates.ts +1 -1
  402. package/src/domains/dispatch/agent-ledger-store.ts +1 -1
  403. package/src/domains/dispatch/agent-ledger.ts +1 -1
  404. package/src/domains/dispatch/assignment.ts +5 -5
  405. package/src/domains/dispatch/capability-match.ts +10 -0
  406. package/src/domains/dispatch/capacity-lease.ts +2 -5
  407. package/src/domains/dispatch/code-step.ts +1 -1
  408. package/src/domains/dispatch/contract.ts +2 -2
  409. package/src/domains/dispatch/extension.ts +169 -82
  410. package/src/domains/dispatch/fleet-node-prompt.ts +1 -1
  411. package/src/domains/dispatch/fleet-preflight.ts +8 -17
  412. package/src/domains/dispatch/fleet-run.ts +0 -7
  413. package/src/domains/dispatch/gate-decisions.ts +25 -14
  414. package/src/domains/dispatch/host-verification.ts +435 -39
  415. package/src/domains/dispatch/intent-requirements.ts +10 -0
  416. package/src/domains/dispatch/intent.ts +18 -1
  417. package/src/domains/dispatch/joint-route-resolver.ts +1 -1
  418. package/src/domains/dispatch/path-scope.ts +220 -70
  419. package/src/domains/dispatch/placement.ts +2 -2
  420. package/src/domains/dispatch/receipt-findings.ts +1 -1
  421. package/src/domains/dispatch/receipt-integrity.ts +20 -8
  422. package/src/domains/dispatch/reservation-store.ts +0 -23
  423. package/src/domains/dispatch/route-decision.ts +1 -1
  424. package/src/domains/dispatch/route-history.ts +1 -1
  425. package/src/domains/dispatch/route-policy.ts +1 -1
  426. package/src/domains/dispatch/route-readiness.ts +0 -28
  427. package/src/domains/dispatch/run-event-journal.ts +9 -19
  428. package/src/domains/dispatch/state.ts +2 -3
  429. package/src/domains/dispatch/tool-stats.ts +1 -1
  430. package/src/domains/dispatch/transport.ts +47 -40
  431. package/src/domains/dispatch/types.ts +58 -6
  432. package/src/domains/dispatch/worker-protocol.ts +2 -2
  433. package/src/domains/eval/artifacts/store.ts +10 -4
  434. package/src/domains/eval/compare/thresholds.ts +0 -8
  435. package/src/domains/eval/execution-provenance.ts +1 -1
  436. package/src/domains/eval/metrics/token-stream.ts +0 -7
  437. package/src/domains/eval/report.ts +1 -1
  438. package/src/domains/eval/runner.ts +1 -1
  439. package/src/domains/eval/runners/clio-run.ts +7 -6
  440. package/src/domains/eval/runners/external-command.ts +4 -3
  441. package/src/domains/eval/schema/artifact.ts +1 -1
  442. package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
  443. package/src/domains/eval/schema/behavioral.ts +7 -6
  444. package/src/domains/eval/schema/execution-envelope.ts +4 -2
  445. package/src/domains/eval/schema/naming.ts +10 -0
  446. package/src/domains/eval/schema/suite.ts +2 -2
  447. package/src/domains/eval/schema/validate.ts +9 -5
  448. package/src/domains/eval/schema/verdict.ts +4 -2
  449. package/src/domains/eval/store.ts +20 -3
  450. package/src/domains/eval/suites/run.ts +12 -6
  451. package/src/domains/eval/types.ts +1 -1
  452. package/src/domains/eval/workspaces/git.ts +1 -1
  453. package/src/domains/eval/workspaces/temp-copy.ts +1 -1
  454. package/src/domains/evidence/build.ts +13 -5
  455. package/src/domains/evidence/trust-status.ts +10 -1
  456. package/src/domains/extensions/contract.ts +15 -1
  457. package/src/domains/extensions/discovery.ts +238 -41
  458. package/src/domains/extensions/extension.ts +105 -6
  459. package/src/domains/extensions/index.ts +24 -0
  460. package/src/domains/extensions/integrity.ts +189 -0
  461. package/src/domains/extensions/manager.ts +17 -1
  462. package/src/domains/extensions/resource-path.ts +27 -0
  463. package/src/domains/extensions/resources.ts +18 -38
  464. package/src/domains/extensions/snapshot-store.ts +39 -0
  465. package/src/domains/extensions/snapshot.ts +180 -0
  466. package/src/domains/extensions/state.ts +385 -57
  467. package/src/domains/extensions/types.ts +118 -1
  468. package/src/domains/interop/consent.ts +7 -7
  469. package/src/domains/interop/extension.ts +1 -1
  470. package/src/domains/lifecycle/doctor.ts +27 -21
  471. package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
  472. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
  473. package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
  474. package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
  475. package/src/domains/lifecycle/migrations/index.ts +22 -1
  476. package/src/domains/lifecycle/naming-history.ts +153 -0
  477. package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
  478. package/src/domains/lifecycle/naming-resources.ts +276 -0
  479. package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
  480. package/src/domains/lifecycle/naming-yazi.ts +86 -0
  481. package/src/domains/lifecycle/upgrade-notice.ts +1 -1
  482. package/src/domains/memory/task-memory-handoff.ts +6 -3
  483. package/src/domains/middleware/contract.ts +26 -0
  484. package/src/domains/middleware/extension.ts +24 -24
  485. package/src/domains/middleware/hook-receipts.ts +27 -4
  486. package/src/domains/middleware/hooks-io.ts +65 -32
  487. package/src/domains/middleware/hooks.ts +64 -0
  488. package/src/domains/middleware/index.ts +35 -4
  489. package/src/domains/middleware/marketplace-offer.ts +339 -0
  490. package/src/domains/middleware/registrations.ts +326 -0
  491. package/src/domains/middleware/runtime.ts +30 -2
  492. package/src/domains/middleware/snapshot.ts +20 -7
  493. package/src/domains/mux/contract.ts +195 -25
  494. package/src/domains/mux/detect.ts +23 -6
  495. package/src/domains/mux/dock-controller.ts +365 -0
  496. package/src/domains/mux/extension.ts +7 -1
  497. package/src/domains/mux/index.ts +21 -1
  498. package/src/domains/mux/operations.ts +72 -5
  499. package/src/domains/mux/protocol.ts +19 -6
  500. package/src/domains/mux/socket-client.ts +167 -19
  501. package/src/domains/mux/types.ts +49 -6
  502. package/src/domains/mux/yazi/assets/yazi.toml +2 -2
  503. package/src/domains/mux/yazi/event-stream.ts +6 -4
  504. package/src/domains/mux/yazi/profile.ts +1 -1
  505. package/src/domains/mux/yazi/session.ts +79 -7
  506. package/src/domains/mux/yazi/theme.ts +117 -17
  507. package/src/domains/observability/contract.ts +10 -11
  508. package/src/domains/observability/extension.ts +12 -4
  509. package/src/domains/observability/out-of-turn-usage.ts +2 -2
  510. package/src/domains/observability/projection.ts +15 -91
  511. package/src/domains/observability/trace-store.ts +65 -19
  512. package/src/domains/prompts/compiler.ts +75 -55
  513. package/src/domains/prompts/contract.ts +15 -3
  514. package/src/domains/prompts/extension.ts +100 -12
  515. package/src/domains/prompts/fragments/identity/clio-worker.md +2 -4
  516. package/src/domains/prompts/fragments/identity/clio.md +6 -12
  517. package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
  518. package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
  519. package/src/domains/prompts/fragments/operating/contract.md +7 -15
  520. package/src/domains/prompts/fragments/operating/delegation.md +32 -34
  521. package/src/domains/prompts/fragments/operating/skills.md +11 -18
  522. package/src/domains/prompts/fragments/operating/worker.md +1 -8
  523. package/src/domains/providers/extension.ts +5 -5
  524. package/src/domains/providers/index.ts +1 -1
  525. package/src/domains/providers/knowledge-base-path.ts +1 -1
  526. package/src/domains/providers/model-runtime-capabilities.ts +99 -23
  527. package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
  528. package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +671 -106
  529. package/src/domains/providers/plugins.ts +1 -1
  530. package/src/domains/providers/resolver.ts +1 -1
  531. package/src/domains/providers/runtime-resolution.ts +31 -0
  532. package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
  533. package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
  534. package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
  535. package/src/domains/providers/runtimes/common/probe-helpers.ts +9 -4
  536. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  537. package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
  538. package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
  539. package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
  540. package/src/domains/providers/types/cost-provenance.ts +19 -0
  541. package/src/domains/providers/types/knowledge-base.ts +13 -0
  542. package/src/domains/providers/types/local-model-quirks.ts +87 -39
  543. package/src/domains/providers/types/target-descriptor.ts +3 -3
  544. package/src/domains/resources/extension.ts +1 -1
  545. package/src/domains/resources/library.ts +6 -6
  546. package/src/domains/resources/prompts/loader.ts +1 -1
  547. package/src/domains/resources/skills/content-hash.ts +7 -6
  548. package/src/domains/resources/skills/evals.ts +1 -1
  549. package/src/domains/resources/skills/install.ts +36 -12
  550. package/src/domains/resources/skills/loader.ts +41 -18
  551. package/src/domains/resources/skills/marketplace.ts +21 -2
  552. package/src/domains/resources/skills/promotion.ts +214 -0
  553. package/src/domains/safety/audit.ts +2 -2
  554. package/src/domains/safety/call-target.ts +1 -1
  555. package/src/domains/safety/finish-contract.ts +2 -1
  556. package/src/domains/safety/loop-detector.ts +7 -4
  557. package/src/domains/safety/run-effects.ts +1 -1
  558. package/src/domains/scheduling/extension.ts +4 -4
  559. package/src/domains/session/archive-readers.ts +9 -1
  560. package/src/domains/session/compaction/branch-summary.ts +4 -0
  561. package/src/domains/session/compaction/compact.ts +1 -1
  562. package/src/domains/session/compaction/tokens.ts +4 -0
  563. package/src/domains/session/context-accounting.ts +1 -1
  564. package/src/domains/session/decision-board.ts +1 -1
  565. package/src/domains/session/extension.ts +1 -1
  566. package/src/domains/session/handoff.ts +2 -2
  567. package/src/domains/session/prompt-manifest.ts +0 -5
  568. package/src/domains/session/protected-artifact-journal.ts +12 -6
  569. package/src/domains/session/retry.ts +1 -1
  570. package/src/domains/session/task-board.ts +10 -9
  571. package/src/domains/share/archive.ts +249 -43
  572. package/src/domains/toolchain/install.ts +1 -1
  573. package/src/engine/acp/adapter.ts +3 -3
  574. package/src/engine/acp/event-mapper.ts +3 -3
  575. package/src/engine/acp/server.ts +89 -35
  576. package/src/engine/acp/tool-mediator.ts +2 -2
  577. package/src/engine/acp/types.ts +1 -1
  578. package/src/engine/alcf-oauth.ts +5 -5
  579. package/src/engine/antigravity/subprocess-runtime.ts +2 -2
  580. package/src/engine/api-registry.ts +1 -1
  581. package/src/engine/apis/llamacpp-residency.ts +4 -23
  582. package/src/engine/apis/lmstudio.ts +4 -9
  583. package/src/engine/apis/ollama-native.ts +9 -9
  584. package/src/engine/apis/openai-completions.ts +30 -27
  585. package/src/engine/apis/output-budget.ts +8 -18
  586. package/src/engine/apis/residency.ts +10 -35
  587. package/src/engine/claude/sdk-module.ts +1 -12
  588. package/src/engine/claude/sdk-runtime.ts +6 -6
  589. package/src/engine/claude/subprocess-runtime.ts +1 -1
  590. package/src/engine/claude/tool-safety.ts +4 -4
  591. package/src/engine/gemma-channel-filter.ts +19 -0
  592. package/src/engine/loop-guard.ts +92 -17
  593. package/src/engine/session.ts +14 -7
  594. package/src/engine/tui-primitives.ts +1 -1
  595. package/src/engine/worker-events.ts +6 -6
  596. package/src/engine/worker-runtime.ts +54 -24
  597. package/src/engine/worker-tools.ts +3 -1
  598. package/src/entry/extension-hook-sources.ts +28 -0
  599. package/src/entry/extension-reload.ts +309 -0
  600. package/src/entry/orchestrator.ts +163 -120
  601. package/src/interactive/application-controller.ts +23 -22
  602. package/src/interactive/bus-notices.ts +10 -3
  603. package/src/interactive/chat-loop-messages.ts +3 -13
  604. package/src/interactive/chat-loop.ts +18 -9
  605. package/src/interactive/chat-panel.ts +37 -14
  606. package/src/interactive/chat-renderer.ts +71 -7
  607. package/src/interactive/clio-editor.ts +105 -1
  608. package/src/interactive/context-activity.ts +8 -6
  609. package/src/interactive/context-meter.ts +3 -6
  610. package/src/interactive/context-overlay.ts +1 -1
  611. package/src/interactive/cost-overlay.ts +1 -1
  612. package/src/interactive/council-grid.ts +2 -2
  613. package/src/interactive/dispatch-board.ts +36 -44
  614. package/src/interactive/editor-bash.ts +21 -0
  615. package/src/interactive/editor-steer.ts +9 -4
  616. package/src/interactive/editor-submit.ts +24 -18
  617. package/src/interactive/external-editor.ts +1 -1
  618. package/src/interactive/file-reference-completion.ts +360 -0
  619. package/src/interactive/footer/dashboard.ts +15 -17
  620. package/src/interactive/footer/notifications.ts +14 -8
  621. package/src/interactive/footer/widgets.ts +15 -44
  622. package/src/interactive/interactive-application.ts +116 -61
  623. package/src/interactive/interactive-event-projection.ts +1 -1
  624. package/src/interactive/interactive-input-runtime.ts +6 -2
  625. package/src/interactive/interactive-presentation.ts +22 -17
  626. package/src/interactive/interactive-shell.ts +2 -2
  627. package/src/interactive/interactive-slash-runtime.ts +65 -17
  628. package/src/interactive/interactive-subscriptions.ts +1 -1
  629. package/src/interactive/interactive-tickers.ts +1 -1
  630. package/src/interactive/keybinding-manager.ts +4 -4
  631. package/src/interactive/layout.ts +1 -1
  632. package/src/interactive/memory-overlay.ts +2 -2
  633. package/src/interactive/modal-marker.ts +2 -21
  634. package/src/interactive/mutation-preview.ts +1 -1
  635. package/src/interactive/overlay-frame.ts +4 -12
  636. package/src/interactive/overlay-general-openers.ts +6 -2
  637. package/src/interactive/overlay-key-routing.ts +7 -7
  638. package/src/interactive/overlay-lifecycle.ts +1 -1
  639. package/src/interactive/overlay-model-selectors.ts +3 -3
  640. package/src/interactive/overlays/agents.ts +2 -2
  641. package/src/interactive/overlays/ask-user.ts +25 -11
  642. package/src/interactive/overlays/context-reset.ts +28 -4
  643. package/src/interactive/overlays/cwd-fallback.ts +28 -4
  644. package/src/interactive/overlays/decisions.ts +4 -2
  645. package/src/interactive/overlays/extensions.ts +9 -1
  646. package/src/interactive/overlays/fleet-run-approval.ts +3 -3
  647. package/src/interactive/overlays/handoff-review.ts +2 -2
  648. package/src/interactive/overlays/help-reference.ts +13 -0
  649. package/src/interactive/overlays/interop.ts +1 -1
  650. package/src/interactive/overlays/library-install-confirm.ts +1 -1
  651. package/src/interactive/overlays/message-picker.ts +1 -1
  652. package/src/interactive/overlays/model-selector.ts +39 -31
  653. package/src/interactive/overlays/prompts.ts +10 -4
  654. package/src/interactive/overlays/session-selector.ts +2 -2
  655. package/src/interactive/overlays/settings.ts +360 -303
  656. package/src/interactive/overlays/side-question.ts +2 -2
  657. package/src/interactive/overlays/skills-hub.ts +8 -8
  658. package/src/interactive/overlays/tree-selector.ts +2 -2
  659. package/src/interactive/panes-runtime.ts +145 -43
  660. package/src/interactive/permission-overlay.ts +2 -2
  661. package/src/interactive/prompt-cache-identity.ts +88 -0
  662. package/src/interactive/renderers/retry-status.ts +12 -4
  663. package/src/interactive/renderers/tool-execution.ts +4 -4
  664. package/src/interactive/session-transcript.ts +3 -3
  665. package/src/interactive/slash-autocomplete.ts +454 -165
  666. package/src/interactive/slash-commands.ts +401 -190
  667. package/src/interactive/slash-spec.ts +160 -17
  668. package/src/interactive/status/controller.ts +2 -2
  669. package/src/interactive/stream-pacing-policy.ts +1 -24
  670. package/src/interactive/tasks-overlay.ts +20 -13
  671. package/src/interactive/terminal-lease.ts +6 -7
  672. package/src/interactive/turn-context.ts +41 -26
  673. package/src/interactive/turn-persistence.ts +2 -2
  674. package/src/interactive/turn-prewarm.ts +2 -2
  675. package/src/interactive/turn-runtime.ts +8 -8
  676. package/src/interactive/turn-state.ts +1 -1
  677. package/src/interactive/view/artifacts.ts +12 -9
  678. package/src/interactive/view/view-overlay.ts +13 -10
  679. package/src/interactive/watch-pane.ts +38 -10
  680. package/src/interactive/welcome-dashboard.ts +15 -15
  681. package/src/interactive/worker-progress.ts +4 -4
  682. package/src/interactive/worker-receipts.ts +1 -1
  683. package/src/interactive/worker-stream.ts +1 -4
  684. package/src/interactive/yazi-bridge.ts +72 -11
  685. package/src/tools/agent-tools.ts +30 -1
  686. package/src/tools/artifact.ts +2 -2
  687. package/src/tools/ask-user.ts +6 -6
  688. package/src/tools/bash.ts +2 -2
  689. package/src/tools/bootstrap.ts +4 -0
  690. package/src/tools/builtin-tool-catalog.ts +52 -22
  691. package/src/tools/codewiki/code-nav-surface.ts +6 -0
  692. package/src/tools/codewiki/code-nav.ts +99 -13
  693. package/src/tools/compete-worktrees.ts +27 -17
  694. package/src/tools/context/docs-engine.ts +20 -7
  695. package/src/tools/context/index.ts +44 -13
  696. package/src/tools/core-bootstrap.ts +28 -6
  697. package/src/tools/credential-present.ts +1 -2
  698. package/src/tools/dispatch-admission.ts +4 -2
  699. package/src/tools/dispatch-arguments.ts +6 -2
  700. package/src/tools/dispatch-plan.ts +48 -15
  701. package/src/tools/dispatch-run-events.ts +13 -11
  702. package/src/tools/dispatch-runner.ts +11 -6
  703. package/src/tools/dispatch-schema.ts +338 -0
  704. package/src/tools/dispatch-types.ts +3 -0
  705. package/src/tools/dispatch.ts +9 -254
  706. package/src/tools/find.ts +1 -6
  707. package/src/tools/ledger.ts +3 -5
  708. package/src/tools/monitor-surface.ts +5 -13
  709. package/src/tools/monitor.ts +4 -4
  710. package/src/tools/observation.ts +4 -5
  711. package/src/tools/observers.ts +0 -33
  712. package/src/tools/panes-surface.ts +4 -11
  713. package/src/tools/panes.ts +4 -2
  714. package/src/tools/policy.ts +15 -2
  715. package/src/tools/read.ts +5 -6
  716. package/src/tools/registry.ts +30 -7
  717. package/src/tools/result-shaping.ts +18 -14
  718. package/src/tools/steer-surface.ts +1 -1
  719. package/src/tools/task-worktree.ts +28 -7
  720. package/src/tools/tasks.ts +1 -1
  721. package/src/tools/truncate.ts +6 -5
  722. package/src/tools/verify/authoring.ts +3 -6
  723. package/src/tools/verify/frontend.ts +1 -1
  724. package/src/tools/verify/surface.ts +6 -12
  725. package/src/tools/web-fetch-surface.ts +1 -3
  726. package/src/tools/web-fetch.ts +1 -1
  727. package/src/worker/entry.ts +4 -3
  728. package/src/worker/protocol.ts +16 -14
  729. package/src/worker/spec-contract.ts +2 -2
  730. package/src/worker/stdin-demux.ts +2 -2
  731. package/dist/chunk-36EJLSQQ.js +0 -814
  732. package/dist/chunk-GXNLGKAB.js +0 -571
  733. package/dist/chunk-K7VKOLQQ.js +0 -15
  734. package/dist/chunk-PMZCIOCJ.js +0 -25
  735. package/dist/chunk-SUCTJL45.js +0 -45
  736. package/dist/chunk-SUW5DORT.js +0 -819
  737. package/dist/chunk-TZ3SGWZZ.js +0 -48
  738. package/dist/chunk-UOV2BYIW.js +0 -107
  739. package/dist/chunk-VFA6GDY5.js +0 -1625
  740. package/dist/doctor-QOA5FNY5.js +0 -313
  741. package/dist/fleet-view-ZCON35AG.js +0 -102
  742. package/dist/panes-HMABYVO4.js +0 -58
  743. package/docs/artifact-versions.md +0 -67
  744. package/docs/documentation-coverage.md +0 -46
  745. package/docs/documentation-guide.md +0 -167
  746. package/docs/release-cut-checklist.md +0 -193
  747. package/docs/time-conventions.md +0 -101
  748. package/skills/meta/clio-test/SKILL.md +0 -133
  749. package/skills/meta/clio-test/references/harness.md +0 -126
  750. package/skills/meta/clio-test/references/test-map.md +0 -69
  751. package/src/engine/apis/degraded-inference.ts +0 -95
@@ -0,0 +1,276 @@
1
+ import {
2
+ cpSync,
3
+ existsSync,
4
+ mkdirSync,
5
+ readdirSync,
6
+ readFileSync,
7
+ renameSync,
8
+ rmSync,
9
+ statSync,
10
+ writeFileSync,
11
+ } from "node:fs";
12
+ import { homedir } from "node:os";
13
+ import path from "node:path";
14
+
15
+ import { parse as parseYaml } from "yaml";
16
+ import { resolvePackageRoot } from "../../core/package-root.js";
17
+ import { fsyncDirectory } from "../../core/safe-resource-write.js";
18
+ import { resolveClioDirs } from "../../core/xdg.js";
19
+ import { INTEROP_AGENT_KINDS } from "../interop/registry.js";
20
+ import { normalizedSkillHash, stripProvenanceFrontmatter } from "../resources/skills/content-hash.js";
21
+
22
+ const LEGACY_SKILL_NAMES = [
23
+ ["clio-dev", "clio-coder-dev"],
24
+ ["clio-test", "clio-coder-test"],
25
+ ] as const;
26
+
27
+ export type NamingResourceStatus = "absent" | "canonical-present" | "modified" | "renamable" | "renamed";
28
+
29
+ export interface NamingResourceReport {
30
+ kind: "skill";
31
+ legacyPath: string;
32
+ canonicalPath: string;
33
+ status: NamingResourceStatus;
34
+ detail: string;
35
+ }
36
+
37
+ export interface NamingResourceOptions {
38
+ cwd?: string;
39
+ configDir?: string;
40
+ /** Home directory whose interop skill roots are inspected; defaults to the OS home. */
41
+ home?: string;
42
+ packageRoot?: string;
43
+ fix?: boolean;
44
+ }
45
+
46
+ function canonicalizeNamingText(text: string): string {
47
+ return text
48
+ .replaceAll("clio-dev", "clio-coder-dev")
49
+ .replaceAll("clio-test", "clio-coder-test")
50
+ .replace(/^clio:/gmu, "clio-coder:")
51
+ .replace(/^(\s*source:\s*)clio\s*$/gmu, "$1clio-coder");
52
+ }
53
+
54
+ function installedHash(raw: string): string | null {
55
+ const match = raw.match(/^\s*installed-hash:\s*["']?([0-9a-f]{64})["']?\s*$/mu);
56
+ return match?.[1] ?? null;
57
+ }
58
+
59
+ function regularFiles(root: string, current = root): string[] {
60
+ const out: string[] = [];
61
+ for (const entry of readdirSync(current, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
62
+ const full = path.join(current, entry.name);
63
+ if (entry.isDirectory()) out.push(...regularFiles(root, full));
64
+ else if (entry.isFile()) out.push(path.relative(root, full));
65
+ else return [];
66
+ }
67
+ return out;
68
+ }
69
+
70
+ function provesUnmodifiedShippedCopy(legacyDir: string, canonicalBundleDir: string): boolean {
71
+ let legacyFiles: string[];
72
+ let canonicalFiles: string[];
73
+ try {
74
+ legacyFiles = regularFiles(legacyDir);
75
+ canonicalFiles = regularFiles(canonicalBundleDir);
76
+ } catch {
77
+ return false;
78
+ }
79
+ if (legacyFiles.length === 0 || legacyFiles.join("\0") !== canonicalFiles.join("\0")) return false;
80
+ for (const relative of legacyFiles) {
81
+ const legacyRaw = readFileSync(path.join(legacyDir, relative), "utf8");
82
+ const canonicalRaw = readFileSync(path.join(canonicalBundleDir, relative), "utf8");
83
+ if (relative === "SKILL.md") {
84
+ const recordedHash = installedHash(legacyRaw);
85
+ if (recordedHash === null || recordedHash !== normalizedSkillHash(legacyRaw)) return false;
86
+ if (canonicalizeNamingText(stripProvenanceFrontmatter(legacyRaw)) !== stripProvenanceFrontmatter(canonicalRaw))
87
+ return false;
88
+ continue;
89
+ }
90
+ if (canonicalizeNamingText(legacyRaw) !== canonicalRaw) return false;
91
+ }
92
+ return true;
93
+ }
94
+
95
+ function rewriteStagedCopy(stage: string, canonicalBundleDir: string): void {
96
+ const canonicalSkillHash = normalizedSkillHash(readFileSync(path.join(canonicalBundleDir, "SKILL.md"), "utf8"));
97
+ for (const relative of regularFiles(stage)) {
98
+ const file = path.join(stage, relative);
99
+ let next = canonicalizeNamingText(readFileSync(file, "utf8"));
100
+ if (relative === "SKILL.md") {
101
+ next = next.replace(/^(\s*installed-hash:\s*).+$/mu, `$1"${canonicalSkillHash}"`);
102
+ }
103
+ writeFileSync(file, next, "utf8");
104
+ }
105
+ }
106
+
107
+ let resourceSwapSequence = 0;
108
+
109
+ function migrateProvenSkill(legacyDir: string, canonicalDir: string, canonicalBundleDir: string): void {
110
+ const suffix = `${process.pid}-${++resourceSwapSequence}`;
111
+ const stage = `${canonicalDir}.clio-coder-naming-stage-${suffix}`;
112
+ const backup = `${legacyDir}.clio-coder-naming-backup-${suffix}`;
113
+ mkdirSync(path.dirname(canonicalDir), { recursive: true });
114
+ cpSync(legacyDir, stage, { recursive: true });
115
+ try {
116
+ rewriteStagedCopy(stage, canonicalBundleDir);
117
+ renameSync(legacyDir, backup);
118
+ try {
119
+ renameSync(stage, canonicalDir);
120
+ } catch (error) {
121
+ renameSync(backup, legacyDir);
122
+ throw error;
123
+ }
124
+ rmSync(backup, { recursive: true, force: true });
125
+ fsyncDirectory(path.dirname(canonicalDir));
126
+ } catch (error) {
127
+ rmSync(stage, { recursive: true, force: true });
128
+ throw error;
129
+ }
130
+ }
131
+
132
+ function existingDirectory(candidate: string): boolean {
133
+ try {
134
+ return statSync(candidate).isDirectory();
135
+ } catch {
136
+ return false;
137
+ }
138
+ }
139
+
140
+ /** Inspect only the selected user root and current project; never scan arbitrary repositories. */
141
+ export function inspectInstalledNamingResources(options: NamingResourceOptions = {}): NamingResourceReport[] {
142
+ const cwd = options.cwd ?? process.cwd();
143
+ const configDir = options.configDir ?? resolveClioDirs().config;
144
+ const packageRoot = options.packageRoot ?? resolvePackageRoot();
145
+ const roots = [path.join(configDir, "skills"), path.join(cwd, ".clio-coder", "skills")];
146
+ const reports: NamingResourceReport[] = [];
147
+ for (const root of roots) {
148
+ for (const [legacyName, canonicalName] of LEGACY_SKILL_NAMES) {
149
+ const legacyPath = path.join(root, legacyName);
150
+ const canonicalPath = path.join(root, canonicalName);
151
+ if (!existingDirectory(legacyPath)) {
152
+ reports.push({ kind: "skill", legacyPath, canonicalPath, status: "absent", detail: "legacy skill absent" });
153
+ continue;
154
+ }
155
+ if (existsSync(canonicalPath)) {
156
+ reports.push({
157
+ kind: "skill",
158
+ legacyPath,
159
+ canonicalPath,
160
+ status: "canonical-present",
161
+ detail: "canonical skill already exists; legacy copy left untouched",
162
+ });
163
+ continue;
164
+ }
165
+ const canonicalBundleDir = path.join(packageRoot, "skills", "meta", canonicalName);
166
+ if (!existingDirectory(canonicalBundleDir) || !provesUnmodifiedShippedCopy(legacyPath, canonicalBundleDir)) {
167
+ reports.push({
168
+ kind: "skill",
169
+ legacyPath,
170
+ canonicalPath,
171
+ status: "modified",
172
+ detail: "frontmatter/provenance/hash do not prove an unmodified shipped copy; left untouched",
173
+ });
174
+ continue;
175
+ }
176
+ if (options.fix) migrateProvenSkill(legacyPath, canonicalPath, canonicalBundleDir);
177
+ reports.push({
178
+ kind: "skill",
179
+ legacyPath,
180
+ canonicalPath,
181
+ status: options.fix ? "renamed" : "renamable",
182
+ detail: options.fix
183
+ ? "proven unmodified shipped copy renamed and canonicalized"
184
+ : "proven unmodified shipped copy can be renamed by doctor --fix",
185
+ });
186
+ }
187
+ }
188
+ return reports;
189
+ }
190
+
191
+ export interface ModelOverlayNamingInspection {
192
+ path: string;
193
+ legacyFile: boolean;
194
+ legacyMetadataKeys: number;
195
+ }
196
+
197
+ export interface SkillMetadataNamingInspection {
198
+ path: string;
199
+ legacyMetadataKey: boolean;
200
+ }
201
+
202
+ function collectSkillFiles(root: string, current = root): string[] {
203
+ if (!existingDirectory(current)) return [];
204
+ const out: string[] = [];
205
+ for (const entry of readdirSync(current, { withFileTypes: true })) {
206
+ const full = path.join(current, entry.name);
207
+ if (entry.isDirectory()) out.push(...collectSkillFiles(root, full));
208
+ else if (entry.isFile() && entry.name === "SKILL.md") out.push(full);
209
+ }
210
+ return out;
211
+ }
212
+
213
+ /**
214
+ * Read-only inventory of released skill metadata keys in every root the skill
215
+ * loader reads: the Clio user and project roots plus each interop agent's
216
+ * user and project compatibility roots (`.claude/skills`, `.agents/skills`,
217
+ * ...). The loader warns for a legacy key in any of them, so the doctor has to
218
+ * look where the loader looks or it reports "canonical" while boot warns.
219
+ */
220
+ export function inspectSkillMetadataNaming(
221
+ options: Pick<NamingResourceOptions, "cwd" | "configDir" | "home"> = {},
222
+ ): SkillMetadataNamingInspection[] {
223
+ const cwd = options.cwd ?? process.cwd();
224
+ const configDir = options.configDir ?? resolveClioDirs().config;
225
+ const home = options.home ?? homedir();
226
+ const roots = new Set<string>([path.join(configDir, "skills"), path.join(cwd, ".clio-coder", "skills")]);
227
+ for (const kind of INTEROP_AGENT_KINDS) {
228
+ if (kind.userSkillRoot !== undefined) roots.add(path.join(home, kind.userSkillRoot));
229
+ if (kind.projectSkillRoot !== undefined) roots.add(path.join(cwd, kind.projectSkillRoot));
230
+ }
231
+ return [...roots].flatMap((root) =>
232
+ collectSkillFiles(root).map((file) => ({
233
+ path: file,
234
+ legacyMetadataKey: /^clio:\s*(?:#.*)?$/mu.test(readFileSync(file, "utf8")),
235
+ })),
236
+ );
237
+ }
238
+
239
+ function countLegacyModelMetadata(value: unknown): number {
240
+ if (Array.isArray(value)) return value.reduce((count, entry) => count + countLegacyModelMetadata(entry), 0);
241
+ if (typeof value !== "object" || value === null) return 0;
242
+ const record = value as Record<string, unknown>;
243
+ return (
244
+ (Object.hasOwn(record, "clio") ? 1 : 0) +
245
+ Object.values(record).reduce<number>((count, entry) => count + countLegacyModelMetadata(entry), 0)
246
+ );
247
+ }
248
+
249
+ /** Read-only overlay inventory. User catalog files are never silently rewritten. */
250
+ export function inspectModelOverlayNaming(
251
+ options: Pick<NamingResourceOptions, "cwd" | "configDir"> = {},
252
+ ): ModelOverlayNamingInspection[] {
253
+ const cwd = options.cwd ?? process.cwd();
254
+ const configDir = options.configDir ?? resolveClioDirs().config;
255
+ const roots = [path.join(configDir, "model-catalog.d"), path.join(cwd, ".clio-coder", "model-catalog.d")];
256
+ const inspections: ModelOverlayNamingInspection[] = [];
257
+ for (const root of roots) {
258
+ if (!existingDirectory(root)) continue;
259
+ for (const entry of readdirSync(root, { withFileTypes: true })) {
260
+ if (!entry.isFile() || (!entry.name.endsWith(".yaml") && !entry.name.endsWith(".yml"))) continue;
261
+ const file = path.join(root, entry.name);
262
+ let legacyMetadataKeys = 0;
263
+ try {
264
+ legacyMetadataKeys = countLegacyModelMetadata(parseYaml(readFileSync(file, "utf8")));
265
+ } catch {
266
+ // The catalog loader owns the parse diagnostic; naming still reports the filename.
267
+ }
268
+ inspections.push({
269
+ path: file,
270
+ legacyFile: entry.name === "clio-local-coding-targets.yaml",
271
+ legacyMetadataKeys,
272
+ });
273
+ }
274
+ }
275
+ return inspections;
276
+ }
@@ -0,0 +1,139 @@
1
+ import { existsSync, readdirSync, readFileSync, renameSync, rmSync } from "node:fs";
2
+ import { join } from "node:path";
3
+
4
+ import { fsyncDirectory } from "../../core/safe-resource-write.js";
5
+ import { resolveClioDirs } from "../../core/xdg.js";
6
+ import { findPinnedTool } from "../toolchain/registry.js";
7
+
8
+ export const LEGACY_TOOL_MARKER = "clio-install.json";
9
+ export const CANONICAL_TOOL_MARKER = "clio-coder-install.json";
10
+
11
+ interface ValidToolMarker {
12
+ id: string;
13
+ version: string;
14
+ sha256: string;
15
+ }
16
+
17
+ export type ToolMarkerNamingStatus =
18
+ | "renamable"
19
+ | "renamed"
20
+ | "invalid-legacy"
21
+ | "canonical-conflict"
22
+ | "agreeing-duplicate"
23
+ | "duplicate-removed";
24
+
25
+ export interface ToolMarkerNamingReport {
26
+ tool: string;
27
+ version: string;
28
+ legacyPath: string;
29
+ canonicalPath: string;
30
+ status: ToolMarkerNamingStatus;
31
+ detail: string;
32
+ }
33
+
34
+ export interface ToolMarkerNamingOptions {
35
+ dataDir?: string;
36
+ fix?: boolean;
37
+ }
38
+
39
+ function childDirectories(root: string): string[] {
40
+ try {
41
+ return readdirSync(root, { withFileTypes: true })
42
+ .filter((entry) => entry.isDirectory() && !entry.name.startsWith("."))
43
+ .map((entry) => entry.name)
44
+ .sort((left, right) => left.localeCompare(right));
45
+ } catch {
46
+ return [];
47
+ }
48
+ }
49
+
50
+ function readValidMarker(path: string, tool: string, version: string): ValidToolMarker | null {
51
+ try {
52
+ const value: unknown = JSON.parse(readFileSync(path, "utf8"));
53
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return null;
54
+ const marker = value as Record<string, unknown>;
55
+ if (marker.id !== tool || marker.version !== version) return null;
56
+ if (typeof marker.sha256 !== "string" || !/^[0-9a-f]{64}$/u.test(marker.sha256)) return null;
57
+ return { id: tool, version, sha256: marker.sha256 };
58
+ } catch {
59
+ return null;
60
+ }
61
+ }
62
+
63
+ function sameFacts(left: ValidToolMarker, right: ValidToolMarker): boolean {
64
+ return left.id === right.id && left.version === right.version && left.sha256 === right.sha256;
65
+ }
66
+
67
+ /**
68
+ * Inspect or migrate released tool markers only below known tool/version
69
+ * directories in the selected Clio Coder data root. Unknown tool roots and
70
+ * symlinks are never traversed.
71
+ */
72
+ export function inspectToolMarkerNaming(options: ToolMarkerNamingOptions = {}): ToolMarkerNamingReport[] {
73
+ const toolsRoot = join(options.dataDir ?? resolveClioDirs().data, "tools");
74
+ const reports: ToolMarkerNamingReport[] = [];
75
+ for (const tool of childDirectories(toolsRoot)) {
76
+ if (findPinnedTool(tool) === null) continue;
77
+ for (const version of childDirectories(join(toolsRoot, tool))) {
78
+ const dir = join(toolsRoot, tool, version);
79
+ const legacyPath = join(dir, LEGACY_TOOL_MARKER);
80
+ if (!existsSync(legacyPath)) continue;
81
+ const canonicalPath = join(dir, CANONICAL_TOOL_MARKER);
82
+ const legacy = readValidMarker(legacyPath, tool, version);
83
+ if (legacy === null) {
84
+ reports.push({
85
+ tool,
86
+ version,
87
+ legacyPath,
88
+ canonicalPath,
89
+ status: "invalid-legacy",
90
+ detail: "legacy marker does not match its known tool/version path and checksum shape; left untouched",
91
+ });
92
+ continue;
93
+ }
94
+ if (!existsSync(canonicalPath)) {
95
+ if (options.fix) {
96
+ renameSync(legacyPath, canonicalPath);
97
+ fsyncDirectory(dir);
98
+ }
99
+ reports.push({
100
+ tool,
101
+ version,
102
+ legacyPath,
103
+ canonicalPath,
104
+ status: options.fix ? "renamed" : "renamable",
105
+ detail: options.fix ? "validated legacy marker renamed atomically" : "validated legacy marker can be renamed",
106
+ });
107
+ continue;
108
+ }
109
+ const canonical = readValidMarker(canonicalPath, tool, version);
110
+ if (canonical === null || !sameFacts(legacy, canonical)) {
111
+ reports.push({
112
+ tool,
113
+ version,
114
+ legacyPath,
115
+ canonicalPath,
116
+ status: "canonical-conflict",
117
+ detail:
118
+ "canonical and legacy marker facts disagree or canonical is invalid; canonical wins and legacy is left untouched",
119
+ });
120
+ continue;
121
+ }
122
+ if (options.fix) {
123
+ rmSync(legacyPath);
124
+ fsyncDirectory(dir);
125
+ }
126
+ reports.push({
127
+ tool,
128
+ version,
129
+ legacyPath,
130
+ canonicalPath,
131
+ status: options.fix ? "duplicate-removed" : "agreeing-duplicate",
132
+ detail: options.fix
133
+ ? "validated agreeing legacy duplicate removed; canonical marker kept"
134
+ : "canonical and legacy facts agree; legacy duplicate can be removed",
135
+ });
136
+ }
137
+ }
138
+ return reports;
139
+ }
@@ -0,0 +1,86 @@
1
+ import { readFileSync, statSync } from "node:fs";
2
+ import { join } from "node:path";
3
+
4
+ import { resolveClioDirs } from "../../core/xdg.js";
5
+ import { ensureYaziProfile, resetYaziProfile, yaziProfileDir } from "../mux/yazi/profile.js";
6
+ import { resolveToolBinary } from "../toolchain/resolve.js";
7
+
8
+ export interface YaziNamingInspection {
9
+ profileDir: string;
10
+ present: boolean;
11
+ legacyEvents: number;
12
+ legacyEnvironmentNames: number;
13
+ }
14
+
15
+ export interface YaziNamingRegenerationReport extends YaziNamingInspection {
16
+ status: "absent" | "canonical" | "regenerated" | "removed-unresolved" | "regeneration-failed";
17
+ detail: string;
18
+ }
19
+
20
+ export interface YaziNamingOptions {
21
+ cacheDir?: string;
22
+ yaziPath?: string | null;
23
+ yaPath?: string | null;
24
+ }
25
+
26
+ function occurrences(text: string, pattern: RegExp): number {
27
+ return [...text.matchAll(pattern)].length;
28
+ }
29
+
30
+ /** Inspect only the generated keymap below the selected Clio Coder cache root. */
31
+ export function inspectYaziNaming(cacheDir: string = resolveClioDirs().cache): YaziNamingInspection {
32
+ const profileDir = yaziProfileDir(cacheDir);
33
+ const present = statSync(profileDir, { throwIfNoEntry: false })?.isDirectory() === true;
34
+ let keymap = "";
35
+ try {
36
+ keymap = readFileSync(join(profileDir, "keymap.toml"), "utf8");
37
+ } catch {
38
+ // Missing or unreadable generated material is handled as disposable cache.
39
+ }
40
+ return {
41
+ profileDir,
42
+ present,
43
+ legacyEvents: occurrences(keymap, /(?<!clio-coder-)clio-pick/gmu),
44
+ legacyEnvironmentNames: occurrences(keymap, /\$CLIO_YAZI_PICK_TOKEN\b/gmu),
45
+ };
46
+ }
47
+
48
+ /**
49
+ * Replace the disposable managed profile from current inputs. Resolution is
50
+ * performed before removal so the report can state why a profile could not be
51
+ * rebuilt, while deletion remains confined to `<cache>/yazi/profile`.
52
+ */
53
+ export function regenerateYaziNamingProfile(options: YaziNamingOptions = {}): YaziNamingRegenerationReport {
54
+ const cacheDir = options.cacheDir ?? resolveClioDirs().cache;
55
+ const before = inspectYaziNaming(cacheDir);
56
+ if (!before.present) {
57
+ return {
58
+ ...before,
59
+ status: "absent",
60
+ detail: "managed files pane profile is absent; next open writes canonical names",
61
+ };
62
+ }
63
+ if (before.legacyEvents === 0 && before.legacyEnvironmentNames === 0) {
64
+ return { ...before, status: "canonical", detail: "managed files pane profile already uses canonical names" };
65
+ }
66
+ const yaziPath = options.yaziPath === undefined ? resolveToolBinary("yazi").binaryPath : options.yaziPath;
67
+ const yaPath = options.yaPath === undefined ? resolveToolBinary("ya").binaryPath : options.yaPath;
68
+ resetYaziProfile(before.profileDir);
69
+ if (!yaziPath || !yaPath) {
70
+ return {
71
+ ...before,
72
+ status: "removed-unresolved",
73
+ detail:
74
+ "legacy managed profile removed; the files pane engine is unresolved, so the next managed open will regenerate it",
75
+ };
76
+ }
77
+ const profile = ensureYaziProfile({ yaziPath, yaPath, profileDir: before.profileDir });
78
+ if (!profile) {
79
+ return {
80
+ ...before,
81
+ status: "regeneration-failed",
82
+ detail: "legacy managed profile removed, but the files pane engine rejected the regenerated profile",
83
+ };
84
+ }
85
+ return { ...before, status: "regenerated", detail: "managed files pane profile regenerated with canonical names" };
86
+ }
@@ -27,7 +27,7 @@ const KEYBOARD_FACING_CHANGES: Readonly<Record<string, string>> = Object.freeze(
27
27
  */
28
28
  export function describeUpgradeNotice(transition: UpgradeTransition): string {
29
29
  const changes = KEYBOARD_FACING_CHANGES[transition.to];
30
- const head = `clio: upgraded ${transition.from} → ${transition.to}.`;
30
+ const head = `clio-coder: upgraded ${transition.from} → ${transition.to}.`;
31
31
  const tail = `Full notes: CHANGELOG.md, section ${transition.to}.`;
32
32
  return changes === undefined
33
33
  ? `${head} What changed is in CHANGELOG.md, section ${transition.to}.`
@@ -11,7 +11,8 @@ import {
11
11
  } from "./task-bank.js";
12
12
 
13
13
  export const TASK_MEMORY_HANDOFF_VERSION = 2;
14
- export const TASK_MEMORY_HANDOFF_LANGUAGE = "clio-task-memory";
14
+ export const TASK_MEMORY_HANDOFF_LANGUAGE = "clio-coder-task-memory";
15
+ const LEGACY_TASK_MEMORY_HANDOFF_LANGUAGE = "clio-task-memory";
15
16
  const HANDOFF_MAX_BYTES = 1_000_000;
16
17
 
17
18
  export interface TaskMemoryHandoffEntry {
@@ -134,8 +135,10 @@ export function renderTaskMemoryHandoffSource(
134
135
 
135
136
  export function parseTaskMemoryHandoffSnapshot(text: string): TaskMemoryHandoffSnapshot | null {
136
137
  if (typeof text !== "string" || text.length === 0 || text.length > HANDOFF_MAX_BYTES) return null;
137
- const escapedLanguage = TASK_MEMORY_HANDOFF_LANGUAGE.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&");
138
- const match = new RegExp(`(?:^|\\n)\\x60{3}${escapedLanguage}\\r?\\n([^\\r\\n]+)\\r?\\n\\x60{3}(?:$|\\n)`, "u").exec(
138
+ const languages = [TASK_MEMORY_HANDOFF_LANGUAGE, LEGACY_TASK_MEMORY_HANDOFF_LANGUAGE]
139
+ .map((language) => language.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&"))
140
+ .join("|");
141
+ const match = new RegExp(`(?:^|\\n)\\x60{3}(?:${languages})\\r?\\n([^\\r\\n]+)\\r?\\n\\x60{3}(?:$|\\n)`, "u").exec(
139
142
  text,
140
143
  );
141
144
  if (match?.[1] === undefined) return null;
@@ -1,3 +1,8 @@
1
+ import type {
2
+ MiddlewareRegistrationOwner,
3
+ PrepareRegistrationReplacementResult,
4
+ ReplaceRegistrationsReport,
5
+ } from "./registrations.js";
1
6
  import type { MiddlewareDiagnosticSink, MiddlewareHookRegistration } from "./runtime.js";
2
7
  import type {
3
8
  MiddlewareEffect,
@@ -32,4 +37,25 @@ export interface MiddlewareContract {
32
37
  * stderr writer default.
33
38
  */
34
39
  setDiagnosticSink(sink: MiddlewareDiagnosticSink): void;
40
+ /**
41
+ * Validate an owner's replacement registration set against the current
42
+ * builtin and host ids and build its evaluation list without publishing.
43
+ * Rejected when `generation` is not strictly greater than the owner's
44
+ * active generation. The returned replacement publishes with one reference
45
+ * assignment that cannot refuse or call out, so a composition root can publish it
46
+ * back-to-back with another domain's generation on the same stack.
47
+ */
48
+ prepareRegistrationReplacement(
49
+ owner: MiddlewareRegistrationOwner,
50
+ generation: number,
51
+ registrations: ReadonlyArray<MiddlewareHookRegistration>,
52
+ ): PrepareRegistrationReplacementResult;
53
+ /** Prepare, check currentness, publish, then emit any conflict diagnostics. */
54
+ replaceRegistrations(
55
+ owner: MiddlewareRegistrationOwner,
56
+ generation: number,
57
+ registrations: ReadonlyArray<MiddlewareHookRegistration>,
58
+ ): ReplaceRegistrationsReport;
59
+ /** Active generation for an owner; 0 when nothing was ever applied. */
60
+ ownedGeneration(owner: MiddlewareRegistrationOwner): number;
35
61
  }
@@ -6,6 +6,7 @@ import {
6
6
  resolveHookBudgetTunablesFromEnv,
7
7
  } from "./budget.js";
8
8
  import type { MiddlewareContract } from "./contract.js";
9
+ import { createMiddlewareRegistrationTable } from "./registrations.js";
9
10
  import { cloneMiddlewareRule, listMiddlewareRuleDefinitions } from "./rules.js";
10
11
  import {
11
12
  type MiddlewareDiagnosticSink,
@@ -14,6 +15,7 @@ import {
14
15
  registrationFromRuleDefinition,
15
16
  runMiddlewareAsyncRegistrations,
16
17
  runMiddlewareRegistrations,
18
+ writeMiddlewareDiagnosticToStderr,
17
19
  } from "./runtime.js";
18
20
  import { createMiddlewareSnapshot } from "./snapshot.js";
19
21
 
@@ -54,18 +56,28 @@ export interface MiddlewareBundleOptions {
54
56
 
55
57
  export function createMiddlewareBundle(options: MiddlewareBundleOptions = {}): DomainBundle<MiddlewareContract> {
56
58
  const ruleDefinitions = combineRuleDefinitions(listMiddlewareRuleDefinitions(), options.ruleDefinitions ?? []);
57
- const registrations = combineRegistrations(ruleDefinitions, options.registrations ?? []);
58
- const registeredIds = new Set(registrations.map((registration) => registration.id));
59
59
  let diagnosticSink = options.onDiagnostic;
60
+ // Declarative rules are the fixed tier; construction-time coded
61
+ // registrations are the first host entries, deduplicated first-wins across
62
+ // the shared id namespace exactly as before.
63
+ const table = createMiddlewareRegistrationTable({
64
+ fixed: ruleDefinitions.map(registrationFromRuleDefinition),
65
+ diagnosticSink: () => diagnosticSink ?? writeMiddlewareDiagnosticToStderr,
66
+ });
67
+ for (const registration of options.registrations ?? []) table.registerHook(registration);
60
68
  const budgetTracker = options.budgetTracker ?? createEnvHookBudgetTracker();
61
69
  const contract: MiddlewareContract = {
62
70
  runHook(input) {
71
+ // Capture the list once; a replacement published mid-evaluation
72
+ // takes effect for the next evaluation, never this one.
73
+ const registrations = table.list();
63
74
  return runMiddlewareRegistrations(input, registrations, {
64
75
  budgetTracker,
65
76
  ...(diagnosticSink !== undefined ? { onDiagnostic: diagnosticSink } : {}),
66
77
  });
67
78
  },
68
79
  runAsyncHook(input, priorEffects = []) {
80
+ const registrations = table.list();
69
81
  return runMiddlewareAsyncRegistrations(input, registrations, priorEffects, {
70
82
  ...(diagnosticSink !== undefined ? { onDiagnostic: diagnosticSink } : {}),
71
83
  });
@@ -77,13 +89,20 @@ export function createMiddlewareBundle(options: MiddlewareBundleOptions = {}): D
77
89
  return createMiddlewareSnapshot(ruleDefinitions.map((definition) => definition.rule));
78
90
  },
79
91
  registerHook(registration) {
80
- if (registeredIds.has(registration.id)) return;
81
- registeredIds.add(registration.id);
82
- registrations.push(registration);
92
+ table.registerHook(registration);
83
93
  },
84
94
  setDiagnosticSink(sink) {
85
95
  diagnosticSink = sink;
86
96
  },
97
+ prepareRegistrationReplacement(owner, generation, registrations) {
98
+ return table.prepareReplacement(owner, generation, registrations);
99
+ },
100
+ replaceRegistrations(owner, generation, registrations) {
101
+ return table.replaceRegistrations(owner, generation, registrations);
102
+ },
103
+ ownedGeneration(owner) {
104
+ return table.ownedGeneration(owner);
105
+ },
87
106
  };
88
107
  return {
89
108
  extension: {
@@ -108,22 +127,3 @@ function combineRuleDefinitions(
108
127
  }
109
128
  return combined;
110
129
  }
111
-
112
- /**
113
- * One ordered evaluation list: declarative rules first (builtin, then
114
- * composition-root), then coded registrations, deduplicated across the shared
115
- * id namespace with the earlier entry winning.
116
- */
117
- function combineRegistrations(
118
- ruleDefinitions: ReadonlyArray<MiddlewareRuleDefinition>,
119
- coded: ReadonlyArray<MiddlewareHookRegistration>,
120
- ): MiddlewareHookRegistration[] {
121
- const seen = new Set<string>(ruleDefinitions.map((definition) => definition.rule.id));
122
- const combined: MiddlewareHookRegistration[] = ruleDefinitions.map(registrationFromRuleDefinition);
123
- for (const registration of coded) {
124
- if (seen.has(registration.id)) continue;
125
- seen.add(registration.id);
126
- combined.push(registration);
127
- }
128
- return combined;
129
- }