@iowarp/clio-coder 0.4.0 → 0.4.1

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 (581) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +116 -16
  3. package/dist/{acp-G5WJBNCT.js → acp-ZILU3AUO.js} +14 -14
  4. package/dist/{agents-FMV2Q5G4.js → agents-HYWGBGQR.js} +40 -29
  5. package/dist/assets/codewiki.json +1 -1
  6. package/dist/{auth-3IDSJEIK.js → auth-N3QT7CBO.js} +21 -19
  7. package/dist/{builtins-XCZWXSC7.js → builtins-UJLMOVOV.js} +6 -6
  8. package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
  9. package/dist/{chunk-3BT2XMV4.js → chunk-2NM363SV.js} +50 -57
  10. package/dist/{chunk-J4W7KFM7.js → chunk-2VG7KLYV.js} +24 -279
  11. package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
  12. package/dist/{chunk-K5C3NCBD.js → chunk-3I5NY75V.js} +5 -5
  13. package/dist/{chunk-VAZSBTKF.js → chunk-3QSOM6PA.js} +2 -2
  14. package/dist/{chunk-TZ3SGWZZ.js → chunk-5QIAJV2D.js} +2 -2
  15. package/dist/{chunk-OQBA45DZ.js → chunk-5YHDIDBP.js} +2 -2
  16. package/dist/{chunk-NHLBIGRH.js → chunk-6CCS4G3W.js} +40 -17
  17. package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
  18. package/dist/{chunk-LDQ2ZF2M.js → chunk-6FN3E6KX.js} +5 -5
  19. package/dist/{chunk-X3YGUTOB.js → chunk-6HMJX2VU.js} +59 -59
  20. package/dist/{chunk-VEO4AP2K.js → chunk-6I5ILFOF.js} +3 -2
  21. package/dist/{chunk-B7OBL7PK.js → chunk-6NJQITNH.js} +18 -11
  22. package/dist/{chunk-IQ7KR472.js → chunk-6VC4OV3Z.js} +6 -3
  23. package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
  24. package/dist/{chunk-AB44T6BB.js → chunk-74YWRRU5.js} +8 -7
  25. package/dist/{chunk-SJ5ZKQ4S.js → chunk-7EPLI7VL.js} +2 -2
  26. package/dist/{chunk-HWHKMHUA.js → chunk-7OBGU7UB.js} +3 -3
  27. package/dist/{chunk-2OQE55CK.js → chunk-7PWAODYW.js} +2 -2
  28. package/dist/{chunk-IBEBSCYA.js → chunk-7RY5VZPH.js} +42 -33
  29. package/dist/{chunk-LQ3DZAMX.js → chunk-ABLSQ6JX.js} +2 -2
  30. package/dist/{chunk-QLFS5GO2.js → chunk-AFKWHWXF.js} +12 -22
  31. package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
  32. package/dist/{chunk-O6TL7WWY.js → chunk-AKB4GYDL.js} +4 -4
  33. package/dist/chunk-AP73CFDC.js +308 -0
  34. package/dist/{chunk-JDG2WCRO.js → chunk-BBTJOK6Y.js} +5 -5
  35. package/dist/{chunk-SP2RXXYO.js → chunk-BDPT6GTK.js} +10 -10
  36. package/dist/{chunk-NQQH3YT7.js → chunk-BJGUKIG4.js} +3 -3
  37. package/dist/{chunk-O4XIVISU.js → chunk-BTGG6BG2.js} +79 -38
  38. package/dist/chunk-BTK3SSSK.js +67 -0
  39. package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
  40. package/dist/chunk-BWW4HLO4.js +301 -0
  41. package/dist/{chunk-I5VEOC6I.js → chunk-C537JADH.js} +10 -10
  42. package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
  43. package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
  44. package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
  45. package/dist/chunk-D7E7WCDF.js +27 -0
  46. package/dist/{chunk-WZR7K7ZX.js → chunk-E67WX76H.js} +6 -6
  47. package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
  48. package/dist/chunk-EIMVLWB3.js +1842 -0
  49. package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
  50. package/dist/{chunk-MLKNTWH2.js → chunk-FYUN5KZ3.js} +21 -21
  51. package/dist/{chunk-YJX4SHTD.js → chunk-GIZNH63R.js} +1 -1
  52. package/dist/{chunk-X75E3D2N.js → chunk-GPPB3JBE.js} +18 -16
  53. package/dist/{chunk-GR5G2PVF.js → chunk-GVQJ5CCZ.js} +15 -10
  54. package/dist/chunk-HJWWJ6IL.js +184 -0
  55. package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
  56. package/dist/{chunk-VYMXRQI6.js → chunk-HUAS7ITX.js} +89 -93
  57. package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
  58. package/dist/{chunk-DYJP44XW.js → chunk-IG7BCQBA.js} +1 -1
  59. package/dist/{chunk-32KWKNSF.js → chunk-IXJT6DCX.js} +3 -3
  60. package/dist/{chunk-C2LTL2W6.js → chunk-J4HBWF6Y.js} +360 -172
  61. package/dist/chunk-J5LZHVIT.js +284 -0
  62. package/dist/{chunk-QLL7ILRG.js → chunk-JA5QWE4Z.js} +510 -202
  63. package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
  64. package/dist/{chunk-36EJLSQQ.js → chunk-JZWT5J3Y.js} +4 -4
  65. package/dist/{chunk-HZHHCK24.js → chunk-K6BF4U2H.js} +476 -322
  66. package/dist/{chunk-Z2RR6MAK.js → chunk-MA3H6DM5.js} +6 -6
  67. package/dist/{chunk-CODPRO7Q.js → chunk-MOPSG2X7.js} +6 -6
  68. package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
  69. package/dist/{chunk-YDFRH54B.js → chunk-N5UK64DP.js} +4 -4
  70. package/dist/chunk-NDDGJUXD.js +81 -0
  71. package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
  72. package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
  73. package/dist/{chunk-W5VSYASO.js → chunk-OJTRZGR3.js} +46 -87
  74. package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
  75. package/dist/{chunk-3URVFKWK.js → chunk-PJJ6MY27.js} +5 -5
  76. package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
  77. package/dist/{chunk-GKF55TAZ.js → chunk-PVAMAVBB.js} +3 -2
  78. package/dist/{chunk-6DB53AJS.js → chunk-QKIFBZKT.js} +7 -7
  79. package/dist/{chunk-HJJTYUHX.js → chunk-QMXC4JB7.js} +20 -20
  80. package/dist/chunk-QTFGO774.js +644 -0
  81. package/dist/{chunk-CY6FY24N.js → chunk-R23Z6K6I.js} +2 -2
  82. package/dist/{chunk-ULC6OTWO.js → chunk-R32CLGZ6.js} +13 -13
  83. package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
  84. package/dist/{chunk-F4CKPOEQ.js → chunk-SCYB3HA4.js} +72 -26
  85. package/dist/{chunk-LY4S7GJC.js → chunk-SINK3QR6.js} +18 -16
  86. package/dist/{chunk-U77AMWDL.js → chunk-TD3PGPQA.js} +43 -22
  87. package/dist/{chunk-QBJA7R7N.js → chunk-THYWACCR.js} +2 -2
  88. package/dist/{chunk-QREDIESB.js → chunk-TVH4ONAM.js} +14 -8
  89. package/dist/chunk-U2WB7TZS.js +271 -0
  90. package/dist/{chunk-KFZI4NIL.js → chunk-UAPGZHYC.js} +145 -31
  91. package/dist/{chunk-DQITNCXG.js → chunk-UEDMSP56.js} +29 -14
  92. package/dist/{chunk-3XML7CDN.js → chunk-UXN6JT4W.js} +2 -2
  93. package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
  94. package/dist/{chunk-BPKCPIL7.js → chunk-VEGN6WIQ.js} +2 -2
  95. package/dist/chunk-VKFQTNDV.js +66 -0
  96. package/dist/{chunk-7MCTRUCE.js → chunk-VKRH2TCS.js} +2 -2
  97. package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
  98. package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
  99. package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
  100. package/dist/{chunk-SUCTJL45.js → chunk-WR6U3OVP.js} +3 -3
  101. package/dist/{chunk-BUMFYQFY.js → chunk-XKA2ICR3.js} +124 -113
  102. package/dist/{chunk-UXMFQ54G.js → chunk-Y45G3AXC.js} +39 -39
  103. package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
  104. package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
  105. package/dist/{chunk-V5DHCITQ.js → chunk-ZAZB4JMW.js} +23 -12
  106. package/dist/{chunk-Z4TXYIEG.js → chunk-ZJLUDYFY.js} +9 -9
  107. package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
  108. package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
  109. package/dist/cli/index.js +36 -36
  110. package/dist/{clio-2JXHBBY5.js → clio-IT3G3VQH.js} +12 -13
  111. package/dist/{code-nav-3YYRMYNF.js → code-nav-RK6S7F6E.js} +5 -5
  112. package/dist/codewiki/build-worker.js +1 -1
  113. package/dist/{compile-cache-7FPE6PS3.js → compile-cache-OQAVB7Y5.js} +2 -4
  114. package/dist/{components-RYZV4JGP.js → components-UBWCQSRW.js} +4 -4
  115. package/dist/{config-QZPCMYSO.js → config-3QZRWZJF.js} +53 -49
  116. package/dist/{configure-TEGEBYCA.js → configure-FL7Y3KJF.js} +25 -22
  117. package/dist/{context-E6H5RNMC.js → context-5HE7ODYK.js} +47 -43
  118. package/dist/{context-AV7OEZ4D.js → context-KYQFRVDC.js} +11 -11
  119. package/dist/{context-GSXUE4CT.js → context-XNHL75JV.js} +32 -19
  120. package/dist/{context-clear-SHIBYK6T.js → context-clear-N545L53A.js} +47 -43
  121. package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-QHKXSV2F.js} +10 -9
  122. package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-RGIE5PCT.js} +56 -47
  123. package/dist/{docs-23KQS3XK.js → docs-5NAF6AU7.js} +5 -11
  124. package/dist/doctor-ZGPEGHIP.js +772 -0
  125. package/dist/{eval-TFBYQH4H.js → eval-GXLL44RD.js} +63 -45
  126. package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-HBWSWQOK.js} +7 -8
  127. package/dist/{evidence-ERGESKGN.js → evidence-HWLBRH3Q.js} +44 -40
  128. package/dist/{evolve-VDXTSYCJ.js → evolve-FTZBMNVW.js} +43 -39
  129. package/dist/{extensions-7BGBHN57.js → extensions-VHRBEID7.js} +4 -4
  130. package/dist/{fleet-2RRVDF2V.js → fleet-CKZHJWZJ.js} +86 -73
  131. package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EXDXBMV6.js} +10 -9
  132. package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-OTHB6KRL.js} +5 -5
  133. package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-YTEZUCUT.js} +13 -11
  134. package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-SS6YMDCK.js} +44 -41
  135. package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-PBY4VYOM.js} +5 -9
  136. package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-KMEM5L3S.js} +16 -13
  137. package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-QD5M7E7Q.js} +42 -39
  138. package/dist/{fleet-view-ZCON35AG.js → fleet-view-WAMJYNDT.js} +44 -52
  139. package/dist/{init-DN2WWLFE.js → init-5XQRBOFV.js} +63 -58
  140. package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
  141. package/dist/{interop-OZBKXAYL.js → interop-34TVO25M.js} +13 -11
  142. package/dist/{library-YWZG7IMW.js → library-3QY6KF57.js} +17 -14
  143. package/dist/{memory-I4C4HMLW.js → memory-L4UTIIIW.js} +45 -41
  144. package/dist/{models-CEYXJBO6.js → models-ZVX3QOWE.js} +39 -31
  145. package/dist/{monitor-NZ6GCI3P.js → monitor-CEKVSYTS.js} +50 -46
  146. package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-77BAP6BC.js} +1807 -1039
  147. package/dist/{panes-KY6W3V2E.js → panes-7STHOAUJ.js} +4 -4
  148. package/dist/{panes-HMABYVO4.js → panes-SHAUIRXY.js} +10 -8
  149. package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
  150. package/dist/{reset-DQ6FGCSH.js → reset-EOLM7GVE.js} +7 -8
  151. package/dist/{resources-BB3MVJMD.js → resources-74GKTLSF.js} +17 -13
  152. package/dist/{run-H2GQDUER.js → run-HBAUJNNZ.js} +86 -76
  153. package/dist/{share-GTJN6A5O.js → share-G3APVLVP.js} +17 -14
  154. package/dist/{skills-L55TEW6R.js → skills-35HHUKCR.js} +19 -16
  155. package/dist/{skills-eval-XVXPH2JI.js → skills-eval-QN4HSHDC.js} +55 -57
  156. package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-J357J34F.js} +15 -12
  157. package/dist/{slash-commands-ZSGASKJC.js → slash-commands-JZZCQA32.js} +31 -29
  158. package/dist/{steer-RZGSCY4R.js → steer-XAVHJM22.js} +3 -3
  159. package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
  160. package/dist/{targets-NCPZ644J.js → targets-DSM6CY3M.js} +59 -53
  161. package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-JOPFUVEM.js} +14 -9
  162. package/dist/{tools-DAF3DI3C.js → tools-MKNWVPBH.js} +10 -8
  163. package/dist/{trace-FYVW2MQA.js → trace-ECQ7TIYZ.js} +48 -3
  164. package/dist/{tui-primitives-2AKXQNZK.js → tui-primitives-K5PASC3O.js} +8 -4
  165. package/dist/{uninstall-DW2PNOIC.js → uninstall-N34PCTGJ.js} +4 -6
  166. package/dist/{upgrade-3XPP6OQL.js → upgrade-H7TOM7YL.js} +35 -62
  167. package/dist/{usage-3NLHGTU2.js → usage-X52N3IDJ.js} +51 -48
  168. package/dist/{verifiers-SSQONKRT.js → verifiers-EJTVVSMA.js} +10 -9
  169. package/dist/{verify-3U6J7FZI.js → verify-YJL6XET2.js} +9 -8
  170. package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPIFL3LL.js} +1 -2
  171. package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-4NDZTQ4B.js} +66 -63
  172. package/dist/{with-panes-MKB46MPQ.js → with-panes-OBOBFIIR.js} +62 -26
  173. package/dist/worker/entry.js +57 -52
  174. package/docs/acp.md +1 -1
  175. package/docs/built-in-agents.md +40 -32
  176. package/docs/commands-and-modes.md +9 -3
  177. package/docs/config-knobs-audit.md +3 -0
  178. package/docs/configuration-and-targets.md +105 -164
  179. package/docs/environment-variables.md +2 -1
  180. package/docs/exit-codes-and-output.md +2 -0
  181. package/docs/fleet-demo-runbook.md +6 -3
  182. package/docs/fleet-dispatch.md +8 -6
  183. package/docs/installation-and-lifecycle.md +1 -1
  184. package/docs/release-cut-checklist.md +164 -177
  185. package/docs/trace-store.md +15 -10
  186. package/docs/troubleshooting.md +1 -1
  187. package/evals/README.md +5 -0
  188. package/evals/behavioral-corpus-grader.mjs +103 -0
  189. package/evals/behavioral-machinery-baseline.json +2276 -0
  190. package/evals/behavioral-machinery-driver.ts +250 -0
  191. package/evals/behavioral-machinery-support.ts +253 -0
  192. package/evals/behavioral-machinery.yaml +614 -0
  193. package/evals/behavioral-model-negative-control.yaml +68 -0
  194. package/evals/behavioral-model.yaml +216 -0
  195. package/evals/fixtures/behavioral-facts.txt +3 -0
  196. package/evals/fixtures/behavioral-main.ts +7 -0
  197. package/evals/fixtures/decoy/note.txt +2 -0
  198. package/evals/fixtures/private/credentials.txt +1 -0
  199. package/evals/tracked-metrics-baseline.yaml +229 -0
  200. package/evals/tracked-metrics-grader.mjs +129 -0
  201. package/package.json +5 -15
  202. package/skills/README.md +6 -6
  203. package/skills/coding/ast-grep/SKILL.md +8 -2
  204. package/skills/coding/coding-standards/SKILL.md +8 -2
  205. package/skills/coding/prototype/SKILL.md +8 -2
  206. package/skills/coding/tdd/SKILL.md +8 -2
  207. package/skills/context/context-handoff/SKILL.md +12 -3
  208. package/skills/context/context-handoff/evals.md +3 -3
  209. package/skills/context/context-prime/SKILL.md +8 -2
  210. package/skills/context/context-prime/evals.md +2 -2
  211. package/skills/git/file-ticket/SKILL.md +9 -4
  212. package/skills/git/file-ticket/evals.md +2 -2
  213. package/skills/git/fix-issue/SKILL.md +12 -5
  214. package/skills/git/fix-issue/evals.md +4 -4
  215. package/skills/git/resolve-merge-conflicts/SKILL.md +8 -2
  216. package/skills/git/resolve-merge-conflicts/evals.md +2 -2
  217. package/skills/git/ship/SKILL.md +9 -3
  218. package/skills/git/ship/evals.md +4 -4
  219. package/skills/git/worktree-create/SKILL.md +7 -2
  220. package/skills/git/worktree-create/evals.md +6 -6
  221. package/skills/git/worktree-merge/SKILL.md +7 -2
  222. package/skills/git/worktree-merge/evals.md +6 -6
  223. package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
  224. package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
  225. package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
  226. package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
  227. package/skills/meta/credentials/SKILL.md +9 -2
  228. package/skills/meta/find-skills/SKILL.md +8 -2
  229. package/skills/meta/herdr/SKILL.md +8 -2
  230. package/skills/meta/skill-craft/SKILL.md +21 -4
  231. package/skills/planning/architecture/SKILL.md +9 -3
  232. package/skills/planning/backlog/SKILL.md +8 -2
  233. package/skills/planning/prd/SKILL.md +8 -2
  234. package/skills/planning/product-intent/SKILL.md +8 -2
  235. package/skills/planning/tech-spec/SKILL.md +9 -3
  236. package/skills/registry.yaml +66 -66
  237. package/skills/research/arxiv-literature/SKILL.md +8 -2
  238. package/skills/research/experiment-protocol/SKILL.md +9 -2
  239. package/skills/research/scientific-debugging/SKILL.md +9 -2
  240. package/skills/research/scientific-debugging/evals.md +2 -2
  241. package/skills/research/scientific-modernization/SKILL.md +9 -2
  242. package/skills/skill-marketplace.json +257 -38
  243. package/skills/workflow/cut-it/SKILL.md +10 -2
  244. package/skills/workflow/design-council/SKILL.md +11 -2
  245. package/skills/workflow/grill-me/SKILL.md +8 -2
  246. package/skills/workflow/workflow-distiller/SKILL.md +8 -2
  247. package/src/cli/acp.ts +2 -2
  248. package/src/cli/auth.ts +2 -2
  249. package/src/cli/bootstrap-generate.ts +5 -5
  250. package/src/cli/clio.ts +6 -1
  251. package/src/cli/config-inspect.ts +3 -3
  252. package/src/cli/configure-interop.ts +1 -1
  253. package/src/cli/configure.ts +27 -27
  254. package/src/cli/default-target.ts +1 -1
  255. package/src/cli/docs.ts +6 -6
  256. package/src/cli/doctor-naming.ts +323 -0
  257. package/src/cli/doctor-panes.ts +46 -14
  258. package/src/cli/doctor-toolchain.ts +29 -8
  259. package/src/cli/doctor.ts +15 -1
  260. package/src/cli/eval-inventory.ts +8 -8
  261. package/src/cli/evidence-detail.ts +1 -1
  262. package/src/cli/evidence-inventory.ts +1 -1
  263. package/src/cli/fleet-decisions.ts +1 -1
  264. package/src/cli/fleet-inspect.ts +1 -1
  265. package/src/cli/fleet-preflight.ts +1 -1
  266. package/src/cli/fleet-verify.ts +1 -1
  267. package/src/cli/fleet-view.ts +40 -23
  268. package/src/cli/fleet.ts +8 -5
  269. package/src/cli/interop-inspect.ts +2 -2
  270. package/src/cli/models.ts +3 -3
  271. package/src/cli/modes/print.ts +1 -1
  272. package/src/cli/reset.ts +1 -1
  273. package/src/cli/run.ts +11 -15
  274. package/src/cli/share.ts +1 -1
  275. package/src/cli/skills-eval.ts +11 -11
  276. package/src/cli/targets.ts +23 -24
  277. package/src/cli/trace-inspect.ts +1 -1
  278. package/src/cli/trace.ts +41 -0
  279. package/src/cli/uninstall.ts +2 -2
  280. package/src/cli/upgrade.ts +29 -34
  281. package/src/cli/usage.ts +2 -2
  282. package/src/cli/validate-model.ts +1 -1
  283. package/src/cli/verifiers-inspect.ts +1 -1
  284. package/src/cli/wiki-generate.ts +5 -5
  285. package/src/core/bash-exec.ts +1 -1
  286. package/src/core/boot-trace.ts +3 -3
  287. package/src/core/bus-trace.ts +2 -2
  288. package/src/core/compile-cache.ts +1 -1
  289. package/src/core/config.ts +1062 -886
  290. package/src/core/defaults.ts +321 -528
  291. package/src/core/domain-loader.ts +6 -4
  292. package/src/core/event-bus.ts +1 -1
  293. package/src/core/file-references.ts +78 -88
  294. package/src/core/git-commit-attribution.ts +3 -9
  295. package/src/core/guardrails.ts +24 -4
  296. package/src/core/naming-compat.ts +45 -0
  297. package/src/core/naming-events.ts +62 -0
  298. package/src/core/recent-models.ts +1 -7
  299. package/src/core/residency-protection.ts +4 -8
  300. package/src/core/resolve-config-value.ts +1 -1
  301. package/src/core/response-model-id.ts +0 -14
  302. package/src/core/session-routing.ts +84 -74
  303. package/src/core/skill-activation.ts +18 -0
  304. package/src/core/termination.ts +4 -4
  305. package/src/core/timers.ts +2 -12
  306. package/src/domains/agents/catalog.ts +2 -12
  307. package/src/domains/agents/extension.ts +3 -3
  308. package/src/domains/agents/registry.ts +7 -7
  309. package/src/domains/agents/result-contract.ts +1 -1
  310. package/src/domains/agents/spec.ts +0 -11
  311. package/src/domains/config/classify.ts +35 -47
  312. package/src/domains/config/extension.ts +5 -5
  313. package/src/domains/config/keybindings.ts +48 -47
  314. package/src/domains/config/watcher.ts +1 -1
  315. package/src/domains/context/codewiki/indexer.ts +1 -1
  316. package/src/domains/context/extension.ts +3 -3
  317. package/src/domains/context/prompt-context.ts +1 -1
  318. package/src/domains/context/wiki/assemble.ts +2 -2
  319. package/src/domains/context/working-set/replay/metrics.ts +0 -4
  320. package/src/domains/context/working-set/replay/report.ts +1 -1
  321. package/src/domains/context/working-set/replay/synthetic.ts +2 -2
  322. package/src/domains/dispatch/active-route-planner.ts +2 -2
  323. package/src/domains/dispatch/agent-candidates.ts +1 -1
  324. package/src/domains/dispatch/agent-ledger-store.ts +1 -1
  325. package/src/domains/dispatch/agent-ledger.ts +1 -1
  326. package/src/domains/dispatch/assignment.ts +5 -5
  327. package/src/domains/dispatch/capacity-lease.ts +2 -5
  328. package/src/domains/dispatch/code-step.ts +1 -1
  329. package/src/domains/dispatch/contract.ts +2 -2
  330. package/src/domains/dispatch/extension.ts +65 -61
  331. package/src/domains/dispatch/fleet-node-prompt.ts +1 -1
  332. package/src/domains/dispatch/fleet-preflight.ts +8 -17
  333. package/src/domains/dispatch/fleet-run.ts +0 -7
  334. package/src/domains/dispatch/gate-decisions.ts +25 -14
  335. package/src/domains/dispatch/joint-route-resolver.ts +1 -1
  336. package/src/domains/dispatch/path-scope.ts +0 -61
  337. package/src/domains/dispatch/placement.ts +2 -2
  338. package/src/domains/dispatch/receipt-findings.ts +1 -1
  339. package/src/domains/dispatch/receipt-integrity.ts +20 -8
  340. package/src/domains/dispatch/reservation-store.ts +0 -23
  341. package/src/domains/dispatch/route-decision.ts +1 -1
  342. package/src/domains/dispatch/route-history.ts +1 -1
  343. package/src/domains/dispatch/route-policy.ts +1 -1
  344. package/src/domains/dispatch/route-readiness.ts +0 -28
  345. package/src/domains/dispatch/run-event-journal.ts +6 -5
  346. package/src/domains/dispatch/tool-stats.ts +1 -1
  347. package/src/domains/dispatch/transport.ts +2 -19
  348. package/src/domains/dispatch/types.ts +3 -3
  349. package/src/domains/dispatch/worker-protocol.ts +2 -2
  350. package/src/domains/eval/artifacts/store.ts +5 -4
  351. package/src/domains/eval/compare/thresholds.ts +0 -8
  352. package/src/domains/eval/execution-provenance.ts +1 -1
  353. package/src/domains/eval/metrics/token-stream.ts +0 -7
  354. package/src/domains/eval/report.ts +1 -1
  355. package/src/domains/eval/runner.ts +1 -1
  356. package/src/domains/eval/runners/clio-run.ts +7 -6
  357. package/src/domains/eval/runners/external-command.ts +4 -3
  358. package/src/domains/eval/schema/artifact.ts +1 -1
  359. package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
  360. package/src/domains/eval/schema/behavioral.ts +7 -6
  361. package/src/domains/eval/schema/execution-envelope.ts +4 -2
  362. package/src/domains/eval/schema/naming.ts +10 -0
  363. package/src/domains/eval/schema/suite.ts +2 -2
  364. package/src/domains/eval/schema/validate.ts +9 -5
  365. package/src/domains/eval/schema/verdict.ts +4 -2
  366. package/src/domains/eval/store.ts +12 -2
  367. package/src/domains/eval/suites/run.ts +12 -6
  368. package/src/domains/eval/types.ts +1 -1
  369. package/src/domains/eval/workspaces/git.ts +1 -1
  370. package/src/domains/eval/workspaces/temp-copy.ts +1 -1
  371. package/src/domains/evidence/build.ts +13 -5
  372. package/src/domains/interop/consent.ts +7 -7
  373. package/src/domains/interop/extension.ts +1 -1
  374. package/src/domains/lifecycle/doctor.ts +27 -21
  375. package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
  376. package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
  377. package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
  378. package/src/domains/lifecycle/migrations/index.ts +20 -1
  379. package/src/domains/lifecycle/naming-history.ts +153 -0
  380. package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
  381. package/src/domains/lifecycle/naming-resources.ts +261 -0
  382. package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
  383. package/src/domains/lifecycle/naming-yazi.ts +81 -0
  384. package/src/domains/lifecycle/upgrade-notice.ts +1 -1
  385. package/src/domains/memory/task-memory-handoff.ts +6 -3
  386. package/src/domains/middleware/index.ts +7 -0
  387. package/src/domains/middleware/marketplace-offer.ts +339 -0
  388. package/src/domains/middleware/runtime.ts +2 -2
  389. package/src/domains/mux/contract.ts +157 -25
  390. package/src/domains/mux/detect.ts +29 -5
  391. package/src/domains/mux/dock-controller.ts +365 -0
  392. package/src/domains/mux/extension.ts +7 -1
  393. package/src/domains/mux/index.ts +20 -0
  394. package/src/domains/mux/operations.ts +28 -0
  395. package/src/domains/mux/protocol.ts +19 -6
  396. package/src/domains/mux/socket-client.ts +167 -19
  397. package/src/domains/mux/types.ts +49 -6
  398. package/src/domains/mux/yazi/event-stream.ts +6 -4
  399. package/src/domains/mux/yazi/profile.ts +1 -1
  400. package/src/domains/mux/yazi/session.ts +26 -3
  401. package/src/domains/observability/extension.ts +1 -1
  402. package/src/domains/observability/out-of-turn-usage.ts +2 -2
  403. package/src/domains/observability/projection.ts +1 -1
  404. package/src/domains/observability/trace-store.ts +22 -12
  405. package/src/domains/prompts/compiler.ts +2 -2
  406. package/src/domains/prompts/extension.ts +3 -3
  407. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
  408. package/src/domains/prompts/fragments/operating/skills.md +25 -18
  409. package/src/domains/providers/extension.ts +5 -5
  410. package/src/domains/providers/knowledge-base-path.ts +1 -1
  411. package/src/domains/providers/model-runtime-capabilities.ts +14 -2
  412. package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
  413. package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +4 -4
  414. package/src/domains/providers/plugins.ts +1 -1
  415. package/src/domains/providers/resolver.ts +1 -1
  416. package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
  417. package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
  418. package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
  419. package/src/domains/providers/runtimes/common/probe-helpers.ts +2 -2
  420. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  421. package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
  422. package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
  423. package/src/domains/providers/types/knowledge-base.ts +13 -0
  424. package/src/domains/providers/types/local-model-quirks.ts +2 -2
  425. package/src/domains/providers/types/target-descriptor.ts +3 -3
  426. package/src/domains/resources/extension.ts +1 -1
  427. package/src/domains/resources/library.ts +6 -6
  428. package/src/domains/resources/prompts/loader.ts +1 -1
  429. package/src/domains/resources/skills/content-hash.ts +7 -6
  430. package/src/domains/resources/skills/evals.ts +1 -1
  431. package/src/domains/resources/skills/install.ts +36 -12
  432. package/src/domains/resources/skills/loader.ts +39 -13
  433. package/src/domains/resources/skills/marketplace.ts +21 -2
  434. package/src/domains/resources/skills/promotion.ts +214 -0
  435. package/src/domains/safety/audit.ts +2 -2
  436. package/src/domains/safety/finish-contract.ts +2 -1
  437. package/src/domains/safety/run-effects.ts +1 -1
  438. package/src/domains/scheduling/extension.ts +4 -4
  439. package/src/domains/session/archive-readers.ts +9 -1
  440. package/src/domains/session/compaction/branch-summary.ts +4 -0
  441. package/src/domains/session/compaction/compact.ts +1 -1
  442. package/src/domains/session/compaction/tokens.ts +4 -0
  443. package/src/domains/session/context-accounting.ts +1 -1
  444. package/src/domains/session/decision-board.ts +1 -1
  445. package/src/domains/session/extension.ts +1 -1
  446. package/src/domains/session/handoff.ts +2 -2
  447. package/src/domains/session/prompt-manifest.ts +0 -5
  448. package/src/domains/session/protected-artifact-journal.ts +12 -6
  449. package/src/domains/session/retry.ts +1 -1
  450. package/src/domains/share/archive.ts +85 -36
  451. package/src/domains/toolchain/install.ts +1 -1
  452. package/src/engine/acp/adapter.ts +3 -3
  453. package/src/engine/acp/event-mapper.ts +3 -3
  454. package/src/engine/acp/server.ts +27 -26
  455. package/src/engine/acp/tool-mediator.ts +2 -2
  456. package/src/engine/acp/types.ts +1 -1
  457. package/src/engine/alcf-oauth.ts +5 -5
  458. package/src/engine/antigravity/subprocess-runtime.ts +2 -2
  459. package/src/engine/api-registry.ts +1 -1
  460. package/src/engine/apis/llamacpp-residency.ts +1 -19
  461. package/src/engine/apis/lmstudio.ts +1 -6
  462. package/src/engine/apis/ollama-native.ts +3 -3
  463. package/src/engine/apis/openai-completions.ts +2 -2
  464. package/src/engine/apis/residency.ts +3 -9
  465. package/src/engine/claude/sdk-module.ts +1 -12
  466. package/src/engine/claude/sdk-runtime.ts +6 -6
  467. package/src/engine/claude/subprocess-runtime.ts +1 -1
  468. package/src/engine/claude/tool-safety.ts +4 -4
  469. package/src/engine/loop-guard.ts +0 -5
  470. package/src/engine/session.ts +14 -7
  471. package/src/engine/tui-primitives.ts +1 -1
  472. package/src/engine/worker-events.ts +6 -6
  473. package/src/engine/worker-runtime.ts +14 -13
  474. package/src/entry/orchestrator.ts +107 -88
  475. package/src/interactive/application-controller.ts +21 -21
  476. package/src/interactive/bus-notices.ts +2 -2
  477. package/src/interactive/chat-loop.ts +8 -8
  478. package/src/interactive/chat-panel.ts +1 -1
  479. package/src/interactive/clio-editor.ts +105 -1
  480. package/src/interactive/context-activity.ts +8 -6
  481. package/src/interactive/context-meter.ts +3 -6
  482. package/src/interactive/context-overlay.ts +1 -1
  483. package/src/interactive/cost-overlay.ts +1 -1
  484. package/src/interactive/council-grid.ts +2 -2
  485. package/src/interactive/dispatch-board.ts +30 -33
  486. package/src/interactive/editor-bash.ts +21 -0
  487. package/src/interactive/editor-steer.ts +9 -4
  488. package/src/interactive/editor-submit.ts +24 -18
  489. package/src/interactive/external-editor.ts +1 -1
  490. package/src/interactive/file-reference-completion.ts +360 -0
  491. package/src/interactive/footer/dashboard.ts +15 -17
  492. package/src/interactive/footer/notifications.ts +14 -8
  493. package/src/interactive/footer/widgets.ts +2 -44
  494. package/src/interactive/interactive-application.ts +79 -59
  495. package/src/interactive/interactive-event-projection.ts +1 -1
  496. package/src/interactive/interactive-input-runtime.ts +2 -2
  497. package/src/interactive/interactive-presentation.ts +21 -16
  498. package/src/interactive/interactive-shell.ts +2 -2
  499. package/src/interactive/interactive-slash-runtime.ts +63 -17
  500. package/src/interactive/interactive-subscriptions.ts +1 -1
  501. package/src/interactive/interactive-tickers.ts +1 -1
  502. package/src/interactive/keybinding-manager.ts +4 -4
  503. package/src/interactive/layout.ts +1 -1
  504. package/src/interactive/memory-overlay.ts +2 -2
  505. package/src/interactive/modal-marker.ts +2 -21
  506. package/src/interactive/mutation-preview.ts +1 -1
  507. package/src/interactive/overlay-frame.ts +4 -12
  508. package/src/interactive/overlay-general-openers.ts +6 -2
  509. package/src/interactive/overlay-key-routing.ts +7 -7
  510. package/src/interactive/overlay-lifecycle.ts +1 -1
  511. package/src/interactive/overlay-model-selectors.ts +3 -3
  512. package/src/interactive/overlays/agents.ts +2 -2
  513. package/src/interactive/overlays/ask-user.ts +25 -11
  514. package/src/interactive/overlays/context-reset.ts +28 -4
  515. package/src/interactive/overlays/cwd-fallback.ts +28 -4
  516. package/src/interactive/overlays/decisions.ts +4 -2
  517. package/src/interactive/overlays/fleet-run-approval.ts +3 -3
  518. package/src/interactive/overlays/handoff-review.ts +2 -2
  519. package/src/interactive/overlays/interop.ts +1 -1
  520. package/src/interactive/overlays/library-install-confirm.ts +1 -1
  521. package/src/interactive/overlays/message-picker.ts +1 -1
  522. package/src/interactive/overlays/model-selector.ts +39 -31
  523. package/src/interactive/overlays/prompts.ts +10 -4
  524. package/src/interactive/overlays/session-selector.ts +2 -2
  525. package/src/interactive/overlays/settings.ts +339 -293
  526. package/src/interactive/overlays/side-question.ts +2 -2
  527. package/src/interactive/overlays/skills-hub.ts +8 -8
  528. package/src/interactive/overlays/tree-selector.ts +2 -2
  529. package/src/interactive/panes-runtime.ts +36 -10
  530. package/src/interactive/permission-overlay.ts +2 -2
  531. package/src/interactive/renderers/retry-status.ts +12 -4
  532. package/src/interactive/renderers/tool-execution.ts +4 -4
  533. package/src/interactive/session-transcript.ts +3 -3
  534. package/src/interactive/slash-autocomplete.ts +454 -165
  535. package/src/interactive/slash-commands.ts +279 -183
  536. package/src/interactive/slash-spec.ts +160 -17
  537. package/src/interactive/status/controller.ts +2 -2
  538. package/src/interactive/stream-pacing-policy.ts +1 -1
  539. package/src/interactive/tasks-overlay.ts +20 -13
  540. package/src/interactive/terminal-lease.ts +6 -7
  541. package/src/interactive/turn-context.ts +11 -11
  542. package/src/interactive/turn-persistence.ts +2 -2
  543. package/src/interactive/turn-prewarm.ts +2 -2
  544. package/src/interactive/turn-runtime.ts +8 -8
  545. package/src/interactive/turn-state.ts +1 -1
  546. package/src/interactive/view/artifacts.ts +12 -9
  547. package/src/interactive/view/view-overlay.ts +13 -10
  548. package/src/interactive/watch-pane.ts +38 -10
  549. package/src/interactive/welcome-dashboard.ts +15 -15
  550. package/src/interactive/worker-progress.ts +4 -4
  551. package/src/interactive/worker-receipts.ts +1 -1
  552. package/src/interactive/worker-stream.ts +1 -4
  553. package/src/interactive/yazi-bridge.ts +12 -5
  554. package/src/tools/ask-user.ts +3 -3
  555. package/src/tools/bash.ts +1 -1
  556. package/src/tools/builtin-tool-catalog.ts +1 -1
  557. package/src/tools/compete-worktrees.ts +27 -17
  558. package/src/tools/context/index.ts +15 -1
  559. package/src/tools/dispatch-admission.ts +4 -2
  560. package/src/tools/dispatch-arguments.ts +1 -1
  561. package/src/tools/dispatch-plan.ts +0 -11
  562. package/src/tools/dispatch-run-events.ts +12 -10
  563. package/src/tools/dispatch-runner.ts +11 -6
  564. package/src/tools/dispatch.ts +1 -1
  565. package/src/tools/find.ts +1 -6
  566. package/src/tools/monitor.ts +4 -4
  567. package/src/tools/observers.ts +0 -33
  568. package/src/tools/task-worktree.ts +28 -7
  569. package/src/tools/verify/authoring.ts +3 -6
  570. package/src/tools/verify/frontend.ts +1 -1
  571. package/src/tools/web-fetch.ts +1 -1
  572. package/src/worker/entry.ts +4 -3
  573. package/src/worker/protocol.ts +16 -14
  574. package/src/worker/spec-contract.ts +2 -2
  575. package/src/worker/stdin-demux.ts +2 -2
  576. package/dist/chunk-GXNLGKAB.js +0 -571
  577. package/dist/chunk-VFA6GDY5.js +0 -1625
  578. package/dist/doctor-QOA5FNY5.js +0 -313
  579. package/src/engine/apis/degraded-inference.ts +0 -95
  580. /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
  581. /package/skills/meta/{clio-test → clio-coder-test}/references/test-map.md +0 -0
package/src/cli/auth.ts CHANGED
@@ -104,8 +104,8 @@ function renderStatusRows(rows: ReadonlyArray<ConnectableProviderRow>): string {
104
104
 
105
105
  function defaultAuthTarget(rows: ReadonlyArray<ConnectableProviderRow>): string | undefined {
106
106
  const settings = readSettings();
107
- const activeTarget = settings.orchestrator.target
108
- ? settings.targets.find((entry) => entry.id === settings.orchestrator.target)
107
+ const activeTarget = settings.chat.target
108
+ ? settings.targets.find((entry) => entry.id === settings.chat.target)
109
109
  : undefined;
110
110
  if (activeTarget && rows.some((row) => row.entry.runtimeId === activeTarget.runtime)) {
111
111
  return activeTarget.runtime;
@@ -79,9 +79,9 @@ export interface BootstrapRoute {
79
79
  */
80
80
  export function resolveBootstrapRoute(settings: Readonly<ClioSettings>): BootstrapRoute {
81
81
  for (const agentId of [CONTEXT_BOOTSTRAP_AGENT_ID, "scout"]) {
82
- const profileName = settings.workers.agentBindings[agentId];
82
+ const profileName = settings.fleet.agentProfiles[agentId];
83
83
  if (!profileName) continue;
84
- const profile = settings.workers.profiles[profileName];
84
+ const profile = settings.fleet.profiles[profileName];
85
85
  if (!profile) throw new Error(`bootstrap profile '${profileName}' is not configured (bound to '${agentId}')`);
86
86
  if (!profile.target) throw new Error(`bootstrap profile '${profileName}' has no target (bound to '${agentId}')`);
87
87
  return {
@@ -90,7 +90,7 @@ export function resolveBootstrapRoute(settings: Readonly<ClioSettings>): Bootstr
90
90
  ...(profile.thinkingLevel ? { thinkingLevel: profile.thinkingLevel } : {}),
91
91
  };
92
92
  }
93
- const fallback = settings.workers.default;
93
+ const fallback = settings.fleet.default;
94
94
  if (!fallback?.target) {
95
95
  throw new Error(
96
96
  `bootstrap has no route: workers.agentBindings.${CONTEXT_BOOTSTRAP_AGENT_ID} is unbound and ` +
@@ -233,7 +233,7 @@ async function collectDispatchAssistantText(
233
233
  message: "bootstrap agent started repository exploration",
234
234
  });
235
235
  }
236
- if (isRecord(event) && event.type === "clio_tool_start") {
236
+ if (isRecord(event) && event.type === "clio_coder_tool_start") {
237
237
  const tool = toolNameFromEvent(event);
238
238
  if (tool) {
239
239
  input.progress?.({
@@ -244,7 +244,7 @@ async function collectDispatchAssistantText(
244
244
  });
245
245
  }
246
246
  }
247
- if (isRecord(event) && event.type === "clio_tool_finish") {
247
+ if (isRecord(event) && event.type === "clio_coder_tool_finish") {
248
248
  const tool = toolNameFromEvent(event);
249
249
  const outcome = toolOutcomeFromEvent(event) ?? "done";
250
250
  if (tool) {
package/src/cli/clio.ts CHANGED
@@ -6,7 +6,7 @@ import { classifyDefaultTarget, describeVerdict } from "./default-target.js";
6
6
 
7
7
  /** Headless and ACP keep their established non-TUI transports even when an
8
8
  * embedding process leaves the interactive marker in the environment. */
9
- export function terminalLeaseEligible(
9
+ function terminalLeaseEligible(
10
10
  options: Pick<BootOptions, "headless" | "acp">,
11
11
  env: Readonly<Record<string, string | undefined>> = process.env,
12
12
  ): boolean {
@@ -44,6 +44,11 @@ export async function runClioCommand(options: BootOptions = {}): Promise<number>
44
44
  const configured = await runConfigureCommand([]);
45
45
  if (configured !== 0) return configured;
46
46
  startupSettings = readStrictLayeredSettings(process.cwd()).settings;
47
+ const configuredVerdict = classifyDefaultTarget(startupSettings);
48
+ if (configuredVerdict.kind !== "usable" && configuredVerdict.kind !== "missing-credential") {
49
+ process.stderr.write(`${describeVerdict(configuredVerdict)} Configuration did not complete; startup cancelled.\n`);
50
+ return 2;
51
+ }
47
52
  }
48
53
  }
49
54
  let terminalLease: import("../interactive/terminal-lease.js").TerminalLease | undefined;
@@ -317,12 +317,12 @@ function inspectSafetyAndMemory(cwd: string, graph: CustomizationGraph): void {
317
317
  const layered = readLayeredSettings(cwd);
318
318
  graph.entries.push({
319
319
  category: "safety",
320
- id: "autonomy",
321
- scope: settingsSourceFor(layered.sources, "autonomy"),
320
+ id: "safety.autonomy",
321
+ scope: settingsSourceFor(layered.sources, "safety.autonomy"),
322
322
  reloadClass: "hot",
323
323
  trust: "n/a",
324
324
  precedence: "single",
325
- detail: { autonomy: layered.settings.autonomy ?? "auto-edit" },
325
+ detail: { autonomy: layered.settings.safety.autonomy ?? "auto-edit" },
326
326
  });
327
327
  } catch (err) {
328
328
  graph.issues.push(`safety: ${err instanceof Error ? err.message : String(err)}`);
@@ -22,7 +22,7 @@ function describe(proposal: InteropProposal): string {
22
22
  renderProposalEntry(proposal),
23
23
  "",
24
24
  `projectContext stays ${INHERITED_PROJECT_CONTEXT}: this agent receives your task text, never the project projection.`,
25
- `toolGovernance is clio-policy: its tool calls are gated by Clio safety.`,
25
+ `toolGovernance is clio-coder-policy: its tool calls are gated by Clio safety.`,
26
26
  ];
27
27
  if (proposal.needsNetworkInstall) {
28
28
  lines.push(`The ACP adapter is not installed locally; npx fetches it the first time you delegate.`);
@@ -80,7 +80,7 @@ Non-interactive flags:
80
80
  --force save a model outside the runtime catalog, or one the
81
81
  target does not advertise, without refusing
82
82
  --gateway mark the target as a gateway
83
- --lifecycle <user-managed|clio-managed>
83
+ --lifecycle <user-managed|clio-coder-managed>
84
84
  resident model lifecycle policy
85
85
  --set-orchestrator use this target for chat
86
86
  --set-background use this target for proactive task memory
@@ -225,8 +225,8 @@ function parseSetupArgs(argv: ReadonlyArray<string>): ParsedArgs {
225
225
  break;
226
226
  case "--lifecycle": {
227
227
  const v = need();
228
- if (v !== "user-managed" && v !== "clio-managed") {
229
- throw new Error("--lifecycle must be user-managed or clio-managed");
228
+ if (v !== "user-managed" && v !== "clio-coder-managed") {
229
+ throw new Error("--lifecycle must be user-managed or clio-coder-managed");
230
230
  }
231
231
  out.lifecycle = v;
232
232
  break;
@@ -485,13 +485,13 @@ function setOrchestratorPointer(settings: ClioSettings, descriptor: TargetDescri
485
485
  `cannot use target '${descriptor.id}' as orchestrator target because runtime '${runtime.id}' is not an HTTP/native runtime`,
486
486
  );
487
487
  }
488
- settings.orchestrator.target = descriptor.id;
489
- settings.orchestrator.model = model ?? descriptor.defaultModel ?? null;
488
+ settings.chat.target = descriptor.id;
489
+ settings.chat.model = model ?? descriptor.defaultModel ?? null;
490
490
  }
491
491
 
492
492
  function setWorkerDefaultPointer(settings: ClioSettings, descriptor: TargetDescriptor, model?: string | null): void {
493
- settings.workers.default.target = descriptor.id;
494
- settings.workers.default.model = model ?? descriptor.defaultModel ?? null;
493
+ settings.fleet.default.target = descriptor.id;
494
+ settings.fleet.default.model = model ?? descriptor.defaultModel ?? null;
495
495
  }
496
496
 
497
497
  function setBackgroundPointer(settings: ClioSettings, descriptor: TargetDescriptor, model?: string | null): void {
@@ -501,13 +501,13 @@ function setBackgroundPointer(settings: ClioSettings, descriptor: TargetDescript
501
501
  `cannot use target '${descriptor.id}' as background target because runtime '${descriptor.runtime}' is not an HTTP/native runtime`,
502
502
  );
503
503
  }
504
- settings.background.target = descriptor.id;
505
- settings.background.model = model ?? descriptor.defaultModel ?? null;
504
+ settings.context.memory.target = descriptor.id;
505
+ settings.context.memory.model = model ?? descriptor.defaultModel ?? null;
506
506
  }
507
507
 
508
508
  function assertOrchestratorReplacementEligible(settings: ClioSettings, descriptor: TargetDescriptor): void {
509
- if (settings.orchestrator.target !== descriptor.id && settings.background.target !== descriptor.id) return;
510
- const role = settings.orchestrator.target === descriptor.id ? "orchestrator" : "background";
509
+ if (settings.chat.target !== descriptor.id && settings.context.memory.target !== descriptor.id) return;
510
+ const role = settings.chat.target === descriptor.id ? "orchestrator" : "background";
511
511
  const runtime = getRuntimeRegistry().get(descriptor.runtime);
512
512
  if (!runtime) {
513
513
  throw new Error(
@@ -527,7 +527,7 @@ function setWorkerProfilePointer(
527
527
  ): void {
528
528
  const trimmed = name.trim();
529
529
  if (trimmed.length === 0) throw new Error("fleet profile name must be non-empty");
530
- settings.workers.profiles[trimmed] = {
530
+ settings.fleet.profiles[trimmed] = {
531
531
  target: descriptor.id,
532
532
  model: model ?? descriptor.defaultModel ?? null,
533
533
  thinkingLevel: "off",
@@ -607,10 +607,10 @@ function printSummary(settings: ClioSettings, descriptor: TargetDescriptor, prob
607
607
  for (const line of probeLines(descriptor, probe)) process.stdout.write(` ${line}\n`);
608
608
  }
609
609
  warnUndiscoveredContextWindow(descriptor, probe);
610
- if (settings.orchestrator.target === descriptor.id) process.stdout.write(" orchestrator target\n");
611
- if (settings.background.target === descriptor.id) process.stdout.write(" background memory target\n");
612
- if (settings.workers.default.target === descriptor.id) process.stdout.write(" fleet default\n");
613
- for (const [name, profile] of Object.entries(settings.workers.profiles)) {
610
+ if (settings.chat.target === descriptor.id) process.stdout.write(" orchestrator target\n");
611
+ if (settings.context.memory.target === descriptor.id) process.stdout.write(" background memory target\n");
612
+ if (settings.fleet.default.target === descriptor.id) process.stdout.write(" fleet default\n");
613
+ for (const [name, profile] of Object.entries(settings.fleet.profiles)) {
614
614
  if (profile.target === descriptor.id) process.stdout.write(` fleet profile ${name}\n`);
615
615
  }
616
616
  process.stdout.write(`\nsettings written to ${settingsPath()}\n`);
@@ -1155,7 +1155,7 @@ async function runInteractive(
1155
1155
  let runtime = preselectedRuntime ?? (await pickRuntimeViaCategory(rl));
1156
1156
  if (!runtime) {
1157
1157
  printError("configuration cancelled");
1158
- return 0;
1158
+ return 130;
1159
1159
  }
1160
1160
  const auth = openAuthStorage();
1161
1161
  const settings = readSettings();
@@ -1413,10 +1413,10 @@ async function runInteractive(
1413
1413
  ? false
1414
1414
  : defaults.setOrchestrator
1415
1415
  ? true
1416
- : await askYesNo(rl, "use as orchestrator (chat) target?", !settings.orchestrator.target);
1416
+ : await askYesNo(rl, "use as orchestrator (chat) target?", !settings.chat.target);
1417
1417
  const setWorkerDefault = defaults.setWorkerDefault
1418
1418
  ? true
1419
- : await askYesNo(rl, "use as fleet default?", !settings.workers.default.target);
1419
+ : await askYesNo(rl, "use as fleet default?", !settings.fleet.default.target);
1420
1420
  const setBackground = !isOrchestratorEligibleRuntime(runtime)
1421
1421
  ? false
1422
1422
  : defaults.setBackground
@@ -1428,7 +1428,7 @@ async function runInteractive(
1428
1428
  rl,
1429
1429
  "Orchestrator model",
1430
1430
  wireModels,
1431
- settings.orchestrator.target === targetId ? (settings.orchestrator.model ?? model) : model,
1431
+ settings.chat.target === targetId ? (settings.chat.model ?? model) : model,
1432
1432
  )))
1433
1433
  : undefined;
1434
1434
  if (orchestratorModel === null) return 0;
@@ -1438,7 +1438,7 @@ async function runInteractive(
1438
1438
  rl,
1439
1439
  "Fleet model",
1440
1440
  wireModels,
1441
- settings.workers.default.target === targetId ? (settings.workers.default.model ?? model) : model,
1441
+ settings.fleet.default.target === targetId ? (settings.fleet.default.model ?? model) : model,
1442
1442
  )))
1443
1443
  : undefined;
1444
1444
  if (workerModel === null) return 0;
@@ -1448,7 +1448,7 @@ async function runInteractive(
1448
1448
  rl,
1449
1449
  "Background memory model",
1450
1450
  wireModels,
1451
- settings.background.target === targetId ? (settings.background.model ?? model) : model,
1451
+ settings.context.memory.target === targetId ? (settings.context.memory.model ?? model) : model,
1452
1452
  )))
1453
1453
  : undefined;
1454
1454
  if (backgroundModel === null) return 0;
@@ -1498,13 +1498,13 @@ export function runTargetRename(oldId: string, newId: string): number {
1498
1498
  const target = settings.targets.find((e) => e.id === oldId);
1499
1499
  if (!target) return;
1500
1500
  target.id = newId;
1501
- if (settings.orchestrator.target === oldId) settings.orchestrator.target = newId;
1502
- if (settings.background.target === oldId) settings.background.target = newId;
1503
- if (settings.workers.default.target === oldId) settings.workers.default.target = newId;
1504
- for (const profile of Object.values(settings.workers.profiles)) {
1501
+ if (settings.chat.target === oldId) settings.chat.target = newId;
1502
+ if (settings.context.memory.target === oldId) settings.context.memory.target = newId;
1503
+ if (settings.fleet.default.target === oldId) settings.fleet.default.target = newId;
1504
+ for (const profile of Object.values(settings.fleet.profiles)) {
1505
1505
  if (profile.target === oldId) profile.target = newId;
1506
1506
  }
1507
- settings.scope = settings.scope.map((entry) => {
1507
+ settings.chat.modelPicker.cycleSet = settings.chat.modelPicker.cycleSet.map((entry) => {
1508
1508
  const [head, ...rest] = entry.split("/");
1509
1509
  if (head !== oldId) return entry;
1510
1510
  return rest.length === 0 ? newId : `${newId}/${rest.join("/")}`;
@@ -24,7 +24,7 @@ export type DefaultTargetVerdict =
24
24
  | { kind: "missing-credential"; targetId: string; store: string };
25
25
 
26
26
  export function classifyDefaultTarget(settings: Readonly<ClioSettings> = readSettings()): DefaultTargetVerdict {
27
- const targetId = settings.orchestrator.target;
27
+ const targetId = settings.chat.target;
28
28
  if (!targetId) return { kind: "no-target" };
29
29
  // A chat target naming an id that is not in `targets` cannot arrive here:
30
30
  // the schema normalizes dangling routing references to null so that
package/src/cli/docs.ts CHANGED
@@ -65,12 +65,12 @@ export interface DocsMenuEntry {
65
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
+ function resolveDocsHtmlDir(): string {
69
69
  return resolve(resolvePackageRoot(), "docs", "html");
70
70
  }
71
71
 
72
72
  /** Content-type for a file path by extension. Pure. Defaults to octet-stream. */
73
- export function contentTypeFor(filePath: string): string {
73
+ function contentTypeFor(filePath: string): string {
74
74
  const dot = filePath.lastIndexOf(".");
75
75
  if (dot === -1) return "application/octet-stream";
76
76
  return CONTENT_TYPES[filePath.slice(dot).toLowerCase()] ?? "application/octet-stream";
@@ -82,7 +82,7 @@ export function contentTypeFor(filePath: string): string {
82
82
  * to `index.html`, and rejects any traversal segment so a request can never
83
83
  * escape the served directory.
84
84
  */
85
- export function resolveRequestPath(rawUrl: string): { ok: true; relative: string } | { ok: false; reason: string } {
85
+ function resolveRequestPath(rawUrl: string): { ok: true; relative: string } | { ok: false; reason: string } {
86
86
  const pathPart = (rawUrl.split(/[?#]/, 1)[0] ?? "").trim();
87
87
  let decoded: string;
88
88
  try {
@@ -112,7 +112,7 @@ function titleize(topic: string): string {
112
112
  * the file-name list, not the directory. `index.html` is the menu itself and is
113
113
  * excluded; a trailing `_blueprint` is stripped from the topic key.
114
114
  */
115
- export function synthesizeMenu(fileNames: ReadonlyArray<string>): DocsMenuEntry[] {
115
+ function synthesizeMenu(fileNames: ReadonlyArray<string>): DocsMenuEntry[] {
116
116
  const entries: DocsMenuEntry[] = [];
117
117
  for (const name of fileNames) {
118
118
  if (!name.toLowerCase().endsWith(".html")) continue;
@@ -129,7 +129,7 @@ export function synthesizeMenu(fileNames: ReadonlyArray<string>): DocsMenuEntry[
129
129
  * topic (`safety`), the blueprint file stem (`safety_blueprint`), or a full
130
130
  * `.html` name, case-insensitively. Returns null when nothing matches.
131
131
  */
132
- export function topicToFile(topic: string, fileNames: ReadonlyArray<string>): string | null {
132
+ function topicToFile(topic: string, fileNames: ReadonlyArray<string>): string | null {
133
133
  const wanted = topic
134
134
  .trim()
135
135
  .toLowerCase()
@@ -227,7 +227,7 @@ export interface StartDocsServerOptions {
227
227
  }
228
228
 
229
229
  /** Start the viewer bound to 127.0.0.1 on an ephemeral port. */
230
- export async function startDocsServer(options: StartDocsServerOptions): Promise<DocsServerHandle> {
230
+ async function startDocsServer(options: StartDocsServerOptions): Promise<DocsServerHandle> {
231
231
  const host = options.host ?? HOST;
232
232
  const server = createServer(createDocsRequestHandler(options.htmlDir));
233
233
  await new Promise<void>((resolveListen, rejectListen) => {
@@ -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`,
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 yazi 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 yazi 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 yazi 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 yazi 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
+ }