@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
package/src/cli/docs.ts CHANGED
@@ -1,13 +1,13 @@
1
1
  import { spawn } from "node:child_process";
2
- import { createReadStream, readdirSync, statSync } from "node:fs";
2
+ import { createReadStream, readdirSync, realpathSync, statSync } from "node:fs";
3
3
  import { createServer, type IncomingMessage, type Server, type ServerResponse } from "node:http";
4
4
  import type { AddressInfo } from "node:net";
5
5
  import { relative, resolve } from "node:path";
6
6
  import chalk from "chalk";
7
7
  import { resolvePackageRoot } from "../core/package-root.js";
8
- import { printError, printHeader } from "./shared.js";
8
+ import { printError, printHeader } from "./argv.js";
9
9
 
10
- // Human-facing viewer over the bundled HTML blueprints. It binds an ephemeral
10
+ // Human-facing viewer over the source-checkout HTML blueprints. It binds an ephemeral
11
11
  // static file server to 127.0.0.1 only, serves docs/html/index.html as the
12
12
  // menu plus the blueprint pages, prints the URL, and runs until SIGINT. It
13
13
  // uses only Node's built-in http and fs: zero new dependencies, no daemon, no
@@ -21,7 +21,8 @@ const HELP = `clio-coder docs [topic] [--no-open]
21
21
 
22
22
  Serve Clio Coder's interactive HTML documentation locally and open it in a
23
23
  browser. The blueprints live in docs/html of a source checkout; the npm package
24
- ships the Markdown guides in docs/ only. The server binds an ephemeral port on
24
+ ships the categorized Markdown reference tree under docs/ and excludes HTML.
25
+ The server binds an ephemeral port on
25
26
  127.0.0.1, keeps no state, runs no daemon, and reaches no external network.
26
27
  Press Ctrl+C to stop it.
27
28
 
@@ -64,13 +65,13 @@ export interface DocsMenuEntry {
64
65
  label: string;
65
66
  }
66
67
 
67
- /** Resolve docs/html from the package root; present in a source checkout, absent from the npm package. */
68
- export function resolveDocsHtmlDir(): string {
68
+ /** Resolve the source-checkout HTML root. The npm package deliberately excludes it. */
69
+ function resolveDocsHtmlDir(): string {
69
70
  return resolve(resolvePackageRoot(), "docs", "html");
70
71
  }
71
72
 
72
73
  /** Content-type for a file path by extension. Pure. Defaults to octet-stream. */
73
- export function contentTypeFor(filePath: string): string {
74
+ function contentTypeFor(filePath: string): string {
74
75
  const dot = filePath.lastIndexOf(".");
75
76
  if (dot === -1) return "application/octet-stream";
76
77
  return CONTENT_TYPES[filePath.slice(dot).toLowerCase()] ?? "application/octet-stream";
@@ -82,7 +83,7 @@ export function contentTypeFor(filePath: string): string {
82
83
  * to `index.html`, and rejects any traversal segment so a request can never
83
84
  * escape the served directory.
84
85
  */
85
- export function resolveRequestPath(rawUrl: string): { ok: true; relative: string } | { ok: false; reason: string } {
86
+ function resolveRequestPath(rawUrl: string): { ok: true; relative: string } | { ok: false; reason: string } {
86
87
  const pathPart = (rawUrl.split(/[?#]/, 1)[0] ?? "").trim();
87
88
  let decoded: string;
88
89
  try {
@@ -112,7 +113,7 @@ function titleize(topic: string): string {
112
113
  * the file-name list, not the directory. `index.html` is the menu itself and is
113
114
  * excluded; a trailing `_blueprint` is stripped from the topic key.
114
115
  */
115
- export function synthesizeMenu(fileNames: ReadonlyArray<string>): DocsMenuEntry[] {
116
+ function synthesizeMenu(fileNames: ReadonlyArray<string>): DocsMenuEntry[] {
116
117
  const entries: DocsMenuEntry[] = [];
117
118
  for (const name of fileNames) {
118
119
  if (!name.toLowerCase().endsWith(".html")) continue;
@@ -129,7 +130,7 @@ export function synthesizeMenu(fileNames: ReadonlyArray<string>): DocsMenuEntry[
129
130
  * topic (`safety`), the blueprint file stem (`safety_blueprint`), or a full
130
131
  * `.html` name, case-insensitively. Returns null when nothing matches.
131
132
  */
132
- export function topicToFile(topic: string, fileNames: ReadonlyArray<string>): string | null {
133
+ function topicToFile(topic: string, fileNames: ReadonlyArray<string>): string | null {
133
134
  const wanted = topic
134
135
  .trim()
135
136
  .toLowerCase()
@@ -159,8 +160,8 @@ function listHtmlFiles(htmlDir: string): string[] {
159
160
  }
160
161
 
161
162
  /** Build the static request handler for one html root. */
162
- function createDocsRequestHandler(htmlDir: string): (req: IncomingMessage, res: ServerResponse) => void {
163
- const root = resolve(htmlDir);
163
+ export function createDocsRequestHandler(htmlDir: string): (req: IncomingMessage, res: ServerResponse) => void {
164
+ const root = realpathSync(resolve(htmlDir));
164
165
  return (req, res) => {
165
166
  if (req.method !== "GET" && req.method !== "HEAD") {
166
167
  res.writeHead(405, { "content-type": "text/plain; charset=utf-8", allow: "GET, HEAD" });
@@ -174,20 +175,27 @@ function createDocsRequestHandler(htmlDir: string): (req: IncomingMessage, res:
174
175
  res.end(resolved.reason);
175
176
  return;
176
177
  }
177
- const target = resolve(root, resolved.relative);
178
- if (!isWithin(target, root)) {
178
+ const requestedTarget = resolve(root, resolved.relative);
179
+ if (!isWithin(requestedTarget, root)) {
179
180
  res.writeHead(403, { "content-type": "text/plain; charset=utf-8" });
180
181
  res.end("forbidden");
181
182
  return;
182
183
  }
183
184
  let size: number | null = null;
185
+ let target: string | null = null;
184
186
  try {
187
+ target = realpathSync(requestedTarget);
188
+ if (!isWithin(target, root)) {
189
+ res.writeHead(403, { "content-type": "text/plain; charset=utf-8" });
190
+ res.end("forbidden");
191
+ return;
192
+ }
185
193
  const stat = statSync(target);
186
194
  if (stat.isFile()) size = stat.size;
187
195
  } catch {
188
196
  size = null;
189
197
  }
190
- if (size === null) {
198
+ if (size === null || target === null) {
191
199
  res.writeHead(404, { "content-type": "text/plain; charset=utf-8" });
192
200
  res.end("not found");
193
201
  return;
@@ -227,7 +235,7 @@ export interface StartDocsServerOptions {
227
235
  }
228
236
 
229
237
  /** Start the viewer bound to 127.0.0.1 on an ephemeral port. */
230
- export async function startDocsServer(options: StartDocsServerOptions): Promise<DocsServerHandle> {
238
+ async function startDocsServer(options: StartDocsServerOptions): Promise<DocsServerHandle> {
231
239
  const host = options.host ?? HOST;
232
240
  const server = createServer(createDocsRequestHandler(options.htmlDir));
233
241
  await new Promise<void>((resolveListen, rejectListen) => {
@@ -263,7 +271,7 @@ function openBrowser(url: string): void {
263
271
  }
264
272
  }
265
273
 
266
- function waitForShutdown(): Promise<void> {
274
+ export function waitForShutdown(): Promise<void> {
267
275
  return new Promise((resolveShutdown) => {
268
276
  const onSignal = (): void => {
269
277
  process.removeListener("SIGINT", onSignal);
@@ -304,14 +312,14 @@ export async function runDocsCommand(args: ReadonlyArray<string> = []): Promise<
304
312
  try {
305
313
  htmlDir = resolveDocsHtmlDir();
306
314
  } catch (err) {
307
- printError(`could not resolve bundled docs: ${err instanceof Error ? err.message : String(err)}`);
315
+ printError(`could not resolve the docs HTML root: ${err instanceof Error ? err.message : String(err)}`);
308
316
  return 1;
309
317
  }
310
318
  const files = listHtmlFiles(htmlDir);
311
319
  if (files.length === 0) {
312
320
  printError(`no HTML docs at ${htmlDir}`);
313
321
  process.stdout.write(
314
- ` the npm package ships the Markdown guides only: ${resolve(resolvePackageRoot(), "docs")}\n` +
322
+ ` the npm package ships only the categorized Markdown reference tree: ${resolve(resolvePackageRoot(), "docs")}\n` +
315
323
  " the interactive blueprints are in a source checkout and at https://github.com/iowarp/clio-coder/tree/main/docs/html\n",
316
324
  );
317
325
  return 1;
@@ -333,7 +341,7 @@ export async function runDocsCommand(args: ReadonlyArray<string> = []): Promise<
333
341
  const handle = await startDocsServer({ htmlDir });
334
342
  const landingUrl = landing === "index.html" ? handle.url : `${handle.url}${landing}`;
335
343
  printHeader("Clio docs viewer");
336
- process.stdout.write(` serving ${htmlDir}\n`);
344
+ process.stdout.write(` serving HTML root ${htmlDir}\n`);
337
345
  process.stdout.write(` open ${chalk.cyan(landingUrl)}\n`);
338
346
  process.stdout.write(" bound to 127.0.0.1 only: no external network, no daemon, no state.\n");
339
347
  process.stdout.write(" press Ctrl+C to stop.\n");
@@ -0,0 +1,323 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+
5
+ import { parse as parseYaml } from "yaml";
6
+ import { withSettingsLock } from "../core/config.js";
7
+ import { resolveClioDirs } from "../core/xdg.js";
8
+ import type { DoctorFinding } from "../domains/lifecycle/doctor.js";
9
+ import {
10
+ migrateNamingSettingsFile,
11
+ transformNamingSettingsDocument,
12
+ } from "../domains/lifecycle/migrations/2026-09-01-clio-coder-naming.js";
13
+ import { inspectNamingHistory } from "../domains/lifecycle/naming-history.js";
14
+ import {
15
+ inspectInstalledNamingResources,
16
+ inspectModelOverlayNaming,
17
+ inspectSkillMetadataNaming,
18
+ } from "../domains/lifecycle/naming-resources.js";
19
+ import { inspectToolMarkerNaming } from "../domains/lifecycle/naming-tool-markers.js";
20
+ import { inspectYaziNaming, regenerateYaziNamingProfile } from "../domains/lifecycle/naming-yazi.js";
21
+
22
+ export interface NamingDoctorOptions {
23
+ fix?: boolean;
24
+ cwd?: string;
25
+ yaziEnabled?: boolean;
26
+ }
27
+
28
+ interface SettingsNamingInspection {
29
+ path: string;
30
+ legacy: number;
31
+ conflicts: number;
32
+ error: string | null;
33
+ }
34
+
35
+ const LEGACY_ENVIRONMENT_NAMES = [
36
+ ["CLIO_EVAL_RUNNER_STDOUT_FILE", "CLIO_CODER_EVAL_RUNNER_STDOUT_FILE"],
37
+ ["CLIO_YAZI_PICK_TOKEN", "CLIO_CODER_YAZI_PICK_TOKEN"],
38
+ ] as const;
39
+
40
+ function namingEnvironmentFindings(
41
+ yaziEnabled: boolean,
42
+ environment: NodeJS.ProcessEnv = process.env,
43
+ ): DoctorFinding[] {
44
+ const present = LEGACY_ENVIRONMENT_NAMES.filter(
45
+ ([legacy]) => (yaziEnabled || legacy !== "CLIO_YAZI_PICK_TOKEN") && Boolean(environment[legacy]?.trim()),
46
+ );
47
+ if (present.length === 0) {
48
+ return [{ ok: true, name: "naming environment", detail: "no legacy Clio Coder environment variables are set" }];
49
+ }
50
+ return present.map(([legacy, canonical]) => ({
51
+ ok: true,
52
+ level: "warn",
53
+ name: "naming environment",
54
+ detail: `${legacy} is deprecated; use ${canonical} (compatibility ends in v0.7.0)`,
55
+ }));
56
+ }
57
+
58
+ function namingResourceFindings(options: NamingDoctorOptions): DoctorFinding[] {
59
+ try {
60
+ const resourceOptions = {
61
+ ...(options.cwd ? { cwd: options.cwd } : {}),
62
+ ...(options.fix !== undefined ? { fix: options.fix } : {}),
63
+ };
64
+ const resources = inspectInstalledNamingResources(resourceOptions);
65
+ const legacyResources = resources.filter((entry) => entry.status !== "absent");
66
+ const rootOptions = options.cwd ? { cwd: options.cwd } : {};
67
+ const skillMetadata = inspectSkillMetadataNaming(rootOptions).filter((entry) => entry.legacyMetadataKey);
68
+ const overlays = inspectModelOverlayNaming(rootOptions).filter(
69
+ (entry) => entry.legacyFile || entry.legacyMetadataKeys > 0,
70
+ );
71
+ if (legacyResources.length === 0 && skillMetadata.length === 0 && overlays.length === 0) {
72
+ return [{ ok: true, name: "naming resources", detail: "installed skills and model overlays use canonical names" }];
73
+ }
74
+ const renamed = legacyResources.filter((entry) => entry.status === "renamed").length;
75
+ const renamable = legacyResources.filter((entry) => entry.status === "renamable").length;
76
+ const conflicts = legacyResources.filter(
77
+ (entry) => entry.status === "modified" || entry.status === "canonical-present",
78
+ ).length;
79
+ return [
80
+ {
81
+ ok: true,
82
+ level:
83
+ renamed > 0 && renamable === 0 && conflicts === 0 && skillMetadata.length === 0 && overlays.length === 0
84
+ ? "ok"
85
+ : "warn",
86
+ name: "naming resources",
87
+ detail: [
88
+ `${renamed} proven skills renamed`,
89
+ `${renamable} proven skills await doctor --fix`,
90
+ `${conflicts} modified/conflicting skills left untouched`,
91
+ `${skillMetadata.length} legacy skill metadata keys${skillMetadata.length > 0 ? ` (rename \`clio:\` to \`clio-coder:\` in ${skillMetadata.map((entry) => entry.path).join(", ")})` : ""}`,
92
+ `${overlays.length} legacy model overlay files/metadata (manual migration required)`,
93
+ ].join("; "),
94
+ },
95
+ ];
96
+ } catch (error) {
97
+ return [
98
+ {
99
+ ok: false,
100
+ name: "naming resources",
101
+ detail: `resource naming inspection failed: ${error instanceof Error ? error.message : String(error)}`,
102
+ },
103
+ ];
104
+ }
105
+ }
106
+
107
+ function inspectSettingsNaming(path: string): SettingsNamingInspection {
108
+ if (!existsSync(path)) return { path, legacy: 0, conflicts: 0, error: null };
109
+ try {
110
+ const transformed = transformNamingSettingsDocument(parseYaml(readFileSync(path, "utf8")));
111
+ return {
112
+ path,
113
+ legacy: transformed.replacements.length,
114
+ conflicts: transformed.conflicts.length,
115
+ error: null,
116
+ };
117
+ } catch (error) {
118
+ return { path, legacy: 0, conflicts: 0, error: error instanceof Error ? error.message : String(error) };
119
+ }
120
+ }
121
+
122
+ function settingsFinding(label: string, inspection: SettingsNamingInspection, fixed: boolean): DoctorFinding {
123
+ if (inspection.error !== null) {
124
+ return {
125
+ ok: false,
126
+ name: `naming ${label}`,
127
+ detail: `${inspection.path} could not be inspected: ${inspection.error}`,
128
+ };
129
+ }
130
+ const count = inspection.legacy + inspection.conflicts;
131
+ if (count === 0) {
132
+ return { ok: true, name: `naming ${label}`, detail: `${inspection.path} has canonical settings identifiers` };
133
+ }
134
+ return {
135
+ ok: fixed,
136
+ level: fixed ? "ok" : "warn",
137
+ name: `naming ${label}`,
138
+ detail: fixed
139
+ ? `${inspection.path}: migrated ${inspection.legacy} aliases and resolved ${inspection.conflicts} canonical collisions; backup written beside the file`
140
+ : `${inspection.path}: ${inspection.legacy} legacy aliases and ${inspection.conflicts} canonical collisions (run \`clio-coder doctor --fix\`)`,
141
+ };
142
+ }
143
+
144
+ function yaziNamingFinding(fix: boolean, enabled: boolean): DoctorFinding {
145
+ if (!enabled) {
146
+ return {
147
+ ok: true,
148
+ name: "naming files profile",
149
+ detail: "disabled by settings",
150
+ };
151
+ }
152
+ const inspection = inspectYaziNaming();
153
+ const legacy = inspection.legacyEvents + inspection.legacyEnvironmentNames;
154
+ if (legacy === 0) {
155
+ return {
156
+ ok: true,
157
+ name: "naming files profile",
158
+ detail: inspection.present
159
+ ? `${inspection.profileDir} uses canonical event and environment identifiers`
160
+ : `${inspection.profileDir} is absent; the next managed open will generate canonical identifiers`,
161
+ };
162
+ }
163
+ if (!fix) {
164
+ return {
165
+ ok: true,
166
+ level: "warn",
167
+ name: "naming files profile",
168
+ detail: `${inspection.profileDir}: ${inspection.legacyEvents} legacy events and ${inspection.legacyEnvironmentNames} legacy environment names (run \`clio-coder doctor --fix\`)`,
169
+ };
170
+ }
171
+ const report = regenerateYaziNamingProfile();
172
+ return {
173
+ ok: report.status !== "regeneration-failed",
174
+ ...(report.status === "regeneration-failed" ? {} : { level: "ok" as const }),
175
+ name: "naming files profile",
176
+ detail: report.detail,
177
+ };
178
+ }
179
+
180
+ function toolMarkerNamingFinding(fix: boolean): DoctorFinding {
181
+ try {
182
+ const reports = inspectToolMarkerNaming({ fix });
183
+ if (reports.length === 0) {
184
+ return { ok: true, name: "naming tool markers", detail: "known tool versions use canonical install markers" };
185
+ }
186
+ const fixed = reports.filter((entry) => entry.status === "renamed" || entry.status === "duplicate-removed").length;
187
+ const fixable = reports.filter(
188
+ (entry) => entry.status === "renamable" || entry.status === "agreeing-duplicate",
189
+ ).length;
190
+ const manual = reports.length - fixed - fixable;
191
+ return {
192
+ ok: true,
193
+ level: fixed > 0 && fixable === 0 && manual === 0 ? "ok" : "warn",
194
+ name: "naming tool markers",
195
+ detail: `${fixed} validated markers fixed; ${fixable} await doctor --fix; ${manual} invalid/conflicting markers left untouched`,
196
+ };
197
+ } catch (error) {
198
+ return {
199
+ ok: false,
200
+ name: "naming tool markers",
201
+ detail: `tool marker inspection failed: ${error instanceof Error ? error.message : String(error)}`,
202
+ };
203
+ }
204
+ }
205
+
206
+ function immutableHistoryNamingFinding(): DoctorFinding {
207
+ const dirs = resolveClioDirs();
208
+ const counts = inspectNamingHistory({ stateDir: dirs.state, dataDir: dirs.data });
209
+ const errors = counts.filter((entry) => entry.error !== null);
210
+ if (errors.length > 0) {
211
+ return {
212
+ ok: false,
213
+ name: "naming immutable history",
214
+ detail: errors.map((entry) => `${entry.area}: ${entry.error}`).join("; "),
215
+ };
216
+ }
217
+ const legacy = counts.reduce((sum, entry) => sum + entry.legacyIdentifiers, 0);
218
+ return {
219
+ ok: true,
220
+ ...(legacy > 0 ? { level: "warn" as const } : {}),
221
+ name: "naming immutable history",
222
+ detail: `${counts.map((entry) => `${entry.area}=${entry.legacyIdentifiers}`).join("; ")} legacy identifiers; read-only retention, no rewrite`,
223
+ };
224
+ }
225
+
226
+ function legacyGitRefsFinding(cwd: string): DoctorFinding {
227
+ let refs: string[];
228
+ try {
229
+ refs = execFileSync(
230
+ "git",
231
+ ["-C", cwd, "for-each-ref", "--format=%(refname:short)", "refs/heads/clio/task", "refs/heads/clio/compete"],
232
+ { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"], timeout: 5_000 },
233
+ )
234
+ .split("\n")
235
+ .map((entry) => entry.trim())
236
+ .filter((entry) => /^clio\/(?:task|compete)\//u.test(entry))
237
+ .sort();
238
+ } catch {
239
+ refs = [];
240
+ }
241
+ if (refs.length === 0) {
242
+ return { ok: true, name: "naming git refs", detail: "no legacy Clio Coder task or compete refs found" };
243
+ }
244
+ const shown = refs.slice(0, 20);
245
+ return {
246
+ ok: true,
247
+ level: "warn",
248
+ name: "naming git refs",
249
+ detail: `${refs.length} legacy refs retained (never auto-renamed): ${shown.join(", ")}${refs.length > shown.length ? ", …" : ""}`,
250
+ };
251
+ }
252
+
253
+ function legacyWorktreeMarkerFinding(cwd: string): DoctorFinding {
254
+ const root = join(cwd, ".clio-coder", "worktrees");
255
+ let legacy = 0;
256
+ try {
257
+ for (const entry of readdirSync(root, { withFileTypes: true })) {
258
+ const candidates = entry.isFile()
259
+ ? entry.name.endsWith(".task-owner.json")
260
+ ? [join(root, entry.name)]
261
+ : []
262
+ : entry.isDirectory()
263
+ ? [join(root, entry.name, ".clio-coder-compete-owner.json")]
264
+ : [];
265
+ for (const path of candidates) {
266
+ if (!existsSync(path)) continue;
267
+ const parsed = JSON.parse(readFileSync(path, "utf8")) as Record<string, unknown>;
268
+ if (parsed.kind === "clio-task-worktree" || parsed.kind === "clio-compete-group") legacy += 1;
269
+ }
270
+ }
271
+ } catch {
272
+ // An absent or partially unreadable project-local worktree root is not a
273
+ // repair target. Proven markers remain the lifecycle readers' authority.
274
+ }
275
+ return {
276
+ ok: true,
277
+ ...(legacy > 0 ? { level: "warn" as const } : {}),
278
+ name: "naming worktree markers",
279
+ detail:
280
+ legacy === 0
281
+ ? "active worktree markers use canonical identifiers"
282
+ : `${legacy} active legacy worktree markers retained for cleanup compatibility; no automatic rewrite`,
283
+ };
284
+ }
285
+
286
+ /** Read-only naming-footprint settings sweep plus the sanctioned deterministic fixes. */
287
+ export function namingFootprintFindings(options: NamingDoctorOptions = {}): DoctorFinding[] {
288
+ const cwd = options.cwd ?? process.cwd();
289
+ const userSettingsPath = join(resolveClioDirs().config, "settings.yaml");
290
+ const candidates = [
291
+ { label: "settings user", path: userSettingsPath, lock: true },
292
+ { label: "settings project", path: join(cwd, ".clio-coder", "settings.yaml"), lock: false },
293
+ { label: "settings local", path: join(cwd, ".clio-coder", "settings.local.yaml"), lock: false },
294
+ ] as const;
295
+ const findings: DoctorFinding[] = [];
296
+ for (const candidate of candidates) {
297
+ const before = inspectSettingsNaming(candidate.path);
298
+ let fixed = false;
299
+ if (options.fix && before.error === null && before.legacy + before.conflicts > 0) {
300
+ try {
301
+ if (candidate.lock) withSettingsLock(() => migrateNamingSettingsFile(candidate.path));
302
+ else migrateNamingSettingsFile(candidate.path);
303
+ fixed = true;
304
+ } catch (error) {
305
+ findings.push({
306
+ ok: false,
307
+ name: `naming ${candidate.label}`,
308
+ detail: `--fix could not migrate ${candidate.path}: ${error instanceof Error ? error.message : String(error)}`,
309
+ });
310
+ continue;
311
+ }
312
+ }
313
+ findings.push(settingsFinding(candidate.label, before, fixed));
314
+ }
315
+ findings.push(...namingEnvironmentFindings(options.yaziEnabled ?? true));
316
+ findings.push(...namingResourceFindings({ ...options, cwd }));
317
+ findings.push(yaziNamingFinding(Boolean(options.fix), options.yaziEnabled ?? true));
318
+ findings.push(toolMarkerNamingFinding(Boolean(options.fix)));
319
+ findings.push(immutableHistoryNamingFinding());
320
+ findings.push(legacyGitRefsFinding(cwd));
321
+ findings.push(legacyWorktreeMarkerFinding(cwd));
322
+ return findings;
323
+ }
@@ -1,6 +1,7 @@
1
- import { accessSync, constants, mkdirSync } from "node:fs";
1
+ import { accessSync, constants } from "node:fs";
2
+ import { join } from "node:path";
2
3
  import { readSettings } from "../core/config.js";
3
- import { runEventJournalRoot } from "../domains/dispatch/run-event-journal.js";
4
+ import { resolveClioDirs } from "../core/xdg.js";
4
5
  import type { DoctorFinding } from "../domains/lifecycle/doctor.js";
5
6
  import { detectMux, MUX_METHOD_MIN_PROTOCOL, resolveSocketCandidates } from "../domains/mux/index.js";
6
7
  import { describeResolution, findPinnedTool, toolStatus } from "../domains/toolchain/index.js";
@@ -8,10 +9,11 @@ import { describeResolution, findPinnedTool, toolStatus } from "../domains/toolc
8
9
  /**
9
10
  * The panes section of `clio-coder doctor`.
10
11
  *
11
- * Five rows, in the order an operator debugs them: what mode the pane layer
12
+ * Six rows, in the order an operator debugs them: what mode the pane layer
12
13
  * resolved to, whether the socket answered, whether the server is new enough
13
- * for the methods phase 3 uses, where the pane host binary resolves, and
14
- * whether the journal directory the viewer reads is writable.
14
+ * for the methods phase 3 uses, where the pane host binary resolves, what the
15
+ * boot layout composes, and whether the journal directory the viewer reads is
16
+ * writable.
15
17
  *
16
18
  * No row is an error. Panes are optional: an operator who never wanted them has
17
19
  * a healthy install without them, and doctor's exit code answers "is this
@@ -24,11 +26,8 @@ const PANE_HOST_TOOL_ID = "herdr";
24
26
  /** Highest protocol any method Clio drives requires, for the version row. */
25
27
  const REQUIRED_PROTOCOL = Math.max(...Object.values(MUX_METHOD_MIN_PROTOCOL));
26
28
 
27
- function journalWritabilityFinding(root = runEventJournalRoot()): DoctorFinding {
29
+ function journalWritabilityFinding(root = join(resolveClioDirs().state, "runs")): DoctorFinding {
28
30
  try {
29
- // The viewer reads this tree and the journal writes it, so the useful
30
- // question is whether it can exist and be written, not whether it does.
31
- mkdirSync(root, { recursive: true });
32
31
  accessSync(root, constants.W_OK);
33
32
  return { ok: true, name: "panes journal dir", detail: `${root} is writable` };
34
33
  } catch (error) {
@@ -36,15 +35,28 @@ function journalWritabilityFinding(root = runEventJournalRoot()): DoctorFinding
36
35
  ok: true,
37
36
  level: "warn",
38
37
  name: "panes journal dir",
39
- detail: `${root} is not writable (${error instanceof Error ? error.message : String(error)}); \`clio-coder fleet view\` will have no transcript to follow`,
38
+ detail: `${root} is absent or not writable (${error instanceof Error ? error.message : String(error)}); \`clio-coder fleet view\` will have no transcript to follow`,
40
39
  };
41
40
  }
42
41
  }
43
42
 
44
43
  export async function panesFindings(env: NodeJS.ProcessEnv = process.env): Promise<DoctorFinding[]> {
45
44
  let enabled: "auto" | "embedded" | "off" = "off";
45
+ let layoutRow: DoctorFinding = {
46
+ ok: true,
47
+ name: "panes layout",
48
+ detail: "off",
49
+ };
46
50
  try {
47
- enabled = readSettings().panes.enabled;
51
+ const panes = readSettings().interface.panes;
52
+ enabled = panes.enabled;
53
+ if (panes.layout !== "off") {
54
+ layoutRow = {
55
+ ok: true,
56
+ name: "panes layout",
57
+ detail: `${panes.layout} at boot (workers dock ${(panes.workers.ratio * 100).toFixed(0)}%, files dock ${(panes.files.ratio * 100).toFixed(0)}%)`,
58
+ };
59
+ }
48
60
  } catch {
49
61
  // An unreadable settings file is already reported by the settings row;
50
62
  // this section answers on the shipped default (off) rather than throwing.
@@ -59,10 +71,9 @@ export async function panesFindings(env: NodeJS.ProcessEnv = process.env): Promi
59
71
  {
60
72
  ok: true,
61
73
  name: "panes mode",
62
- detail:
63
- "off by choice (panes.enabled=off); start `clio-coder --with-panes` for one session, or set panes.enabled=auto",
74
+ detail: "off by choice",
64
75
  },
65
- journalWritabilityFinding(),
76
+ layoutRow,
66
77
  ];
67
78
  }
68
79
 
@@ -70,6 +81,7 @@ export async function panesFindings(env: NodeJS.ProcessEnv = process.env): Promi
70
81
  // answer that boot would get. It opens a socket and nothing else: no file is
71
82
  // created and no pane is touched.
72
83
  const { detection, client } = await detectMux({ enabled, env });
84
+ const snapshot = client ? await client.snapshot().catch(() => null) : null;
73
85
  await client?.close().catch(() => undefined);
74
86
 
75
87
  const candidates = detection.candidates.length > 0 ? detection.candidates : resolveSocketCandidates(env);
@@ -119,6 +131,26 @@ export async function panesFindings(env: NodeJS.ProcessEnv = process.env): Promi
119
131
  },
120
132
  );
121
133
 
134
+ findings.push(layoutRow);
135
+ const legacyOwnedPanes =
136
+ snapshot?.panes.filter(
137
+ (pane) => pane.tokens.clio_owner === "clio:mux" && pane.tokens.clio_coder_owner !== "clio-coder:mux",
138
+ ).length ?? 0;
139
+ const staleWatchTitles =
140
+ snapshot?.panes.filter(
141
+ (pane) =>
142
+ (pane.title === "clio watch" || pane.label === "clio watch") &&
143
+ (pane.tokens.clio_coder_owner === "clio-coder:mux" || pane.tokens.clio_owner === "clio:mux"),
144
+ ).length ?? 0;
145
+ findings.push({
146
+ ok: true,
147
+ level: legacyOwnedPanes > 0 || staleWatchTitles > 0 ? "warn" : "ok",
148
+ name: "naming panes",
149
+ detail:
150
+ legacyOwnedPanes > 0 || staleWatchTitles > 0
151
+ ? `${legacyOwnedPanes} panes carry only the legacy clio_owner=clio:mux token; ${staleWatchTitles} owned panes retain the stale 'clio watch' title; quit/cleanup recognizes both token schemes`
152
+ : "no legacy Clio Coder pane ownership tokens or watch titles found",
153
+ });
122
154
  findings.push(journalWritabilityFinding());
123
155
  return findings;
124
156
  }
@@ -7,19 +7,31 @@ import {
7
7
  } from "../domains/mux/index.js";
8
8
  import { describeResolution, toolStatuses } from "../domains/toolchain/index.js";
9
9
 
10
- function yaziProfileFinding(): DoctorFinding {
10
+ export interface ToolchainFindingOptions {
11
+ panesEnabled?: boolean;
12
+ filesEnabled?: boolean;
13
+ }
14
+
15
+ function yaziProfileFinding(enabled: boolean): DoctorFinding {
16
+ if (!enabled) {
17
+ return {
18
+ ok: true,
19
+ name: "files pane profile",
20
+ detail: "disabled by settings",
21
+ };
22
+ }
11
23
  try {
12
24
  const profile = inspectCurrentYaziProfile();
13
25
  return {
14
26
  ok: true,
15
- name: "yazi managed profile",
27
+ name: "files pane profile",
16
28
  detail: describeYaziProfile(profile),
17
29
  level: profile.state === "current" ? "ok" : "warn",
18
30
  };
19
31
  } catch (error) {
20
32
  return {
21
33
  ok: true,
22
- name: "yazi managed profile",
34
+ name: "files pane profile",
23
35
  level: "warn",
24
36
  detail: `${yaziProfileDir()} could not be inspected (${error instanceof Error ? error.message : String(error)}); user config ${userYaziConfigDir()} is separate and untouched`,
25
37
  };
@@ -43,15 +55,24 @@ function yaziProfileFinding(): DoctorFinding {
43
55
  * being used, and a row that only said "not found" would send them looking for
44
56
  * a binary that is right there on their PATH.
45
57
  */
46
- export function toolchainFindings(): DoctorFinding[] {
58
+ export function toolchainFindings(options: ToolchainFindingOptions = {}): DoctorFinding[] {
59
+ const panesEnabled = options.panesEnabled ?? true;
60
+ const filesEnabled = options.filesEnabled ?? true;
47
61
  const tools = toolStatuses().map((status) => ({
48
62
  ok: true,
49
63
  name: `external tool ${status.id}`,
50
- // The rejection and the remedy both live inside the shared resolution
51
- // sentence, so this row and `clio-coder tools status` cannot describe the
52
- // same machine differently.
53
- detail: describeResolution(status),
54
- level: status.resolution.source === "none" ? ("warn" as const) : ("ok" as const),
64
+ // Active integrations share the tools-status resolution sentence. Disabled
65
+ // experimental integrations stay neutral and do not advertise setup work.
66
+ detail:
67
+ (status.id === "herdr" && !panesEnabled) || (status.id === "yazi" && !filesEnabled)
68
+ ? "experimental integration disabled by settings"
69
+ : describeResolution(status),
70
+ level:
71
+ (status.id === "herdr" && !panesEnabled) || (status.id === "yazi" && !filesEnabled)
72
+ ? ("ok" as const)
73
+ : status.resolution.source === "none"
74
+ ? ("warn" as const)
75
+ : ("ok" as const),
55
76
  }));
56
- return [...tools, yaziProfileFinding()];
77
+ return [...tools, yaziProfileFinding(filesEnabled)];
57
78
  }