@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.
- package/CHANGELOG.md +39 -0
- package/README.md +116 -16
- package/dist/{acp-G5WJBNCT.js → acp-ZILU3AUO.js} +14 -14
- package/dist/{agents-FMV2Q5G4.js → agents-HYWGBGQR.js} +40 -29
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-3IDSJEIK.js → auth-N3QT7CBO.js} +21 -19
- package/dist/{builtins-XCZWXSC7.js → builtins-UJLMOVOV.js} +6 -6
- package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
- package/dist/{chunk-3BT2XMV4.js → chunk-2NM363SV.js} +50 -57
- package/dist/{chunk-J4W7KFM7.js → chunk-2VG7KLYV.js} +24 -279
- package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
- package/dist/{chunk-K5C3NCBD.js → chunk-3I5NY75V.js} +5 -5
- package/dist/{chunk-VAZSBTKF.js → chunk-3QSOM6PA.js} +2 -2
- package/dist/{chunk-TZ3SGWZZ.js → chunk-5QIAJV2D.js} +2 -2
- package/dist/{chunk-OQBA45DZ.js → chunk-5YHDIDBP.js} +2 -2
- package/dist/{chunk-NHLBIGRH.js → chunk-6CCS4G3W.js} +40 -17
- package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
- package/dist/{chunk-LDQ2ZF2M.js → chunk-6FN3E6KX.js} +5 -5
- package/dist/{chunk-X3YGUTOB.js → chunk-6HMJX2VU.js} +59 -59
- package/dist/{chunk-VEO4AP2K.js → chunk-6I5ILFOF.js} +3 -2
- package/dist/{chunk-B7OBL7PK.js → chunk-6NJQITNH.js} +18 -11
- package/dist/{chunk-IQ7KR472.js → chunk-6VC4OV3Z.js} +6 -3
- package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
- package/dist/{chunk-AB44T6BB.js → chunk-74YWRRU5.js} +8 -7
- package/dist/{chunk-SJ5ZKQ4S.js → chunk-7EPLI7VL.js} +2 -2
- package/dist/{chunk-HWHKMHUA.js → chunk-7OBGU7UB.js} +3 -3
- package/dist/{chunk-2OQE55CK.js → chunk-7PWAODYW.js} +2 -2
- package/dist/{chunk-IBEBSCYA.js → chunk-7RY5VZPH.js} +42 -33
- package/dist/{chunk-LQ3DZAMX.js → chunk-ABLSQ6JX.js} +2 -2
- package/dist/{chunk-QLFS5GO2.js → chunk-AFKWHWXF.js} +12 -22
- package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
- package/dist/{chunk-O6TL7WWY.js → chunk-AKB4GYDL.js} +4 -4
- package/dist/chunk-AP73CFDC.js +308 -0
- package/dist/{chunk-JDG2WCRO.js → chunk-BBTJOK6Y.js} +5 -5
- package/dist/{chunk-SP2RXXYO.js → chunk-BDPT6GTK.js} +10 -10
- package/dist/{chunk-NQQH3YT7.js → chunk-BJGUKIG4.js} +3 -3
- package/dist/{chunk-O4XIVISU.js → chunk-BTGG6BG2.js} +79 -38
- package/dist/chunk-BTK3SSSK.js +67 -0
- package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
- package/dist/chunk-BWW4HLO4.js +301 -0
- package/dist/{chunk-I5VEOC6I.js → chunk-C537JADH.js} +10 -10
- package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
- package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
- package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
- package/dist/chunk-D7E7WCDF.js +27 -0
- package/dist/{chunk-WZR7K7ZX.js → chunk-E67WX76H.js} +6 -6
- package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
- package/dist/chunk-EIMVLWB3.js +1842 -0
- package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
- package/dist/{chunk-MLKNTWH2.js → chunk-FYUN5KZ3.js} +21 -21
- package/dist/{chunk-YJX4SHTD.js → chunk-GIZNH63R.js} +1 -1
- package/dist/{chunk-X75E3D2N.js → chunk-GPPB3JBE.js} +18 -16
- package/dist/{chunk-GR5G2PVF.js → chunk-GVQJ5CCZ.js} +15 -10
- package/dist/chunk-HJWWJ6IL.js +184 -0
- package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
- package/dist/{chunk-VYMXRQI6.js → chunk-HUAS7ITX.js} +89 -93
- package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
- package/dist/{chunk-DYJP44XW.js → chunk-IG7BCQBA.js} +1 -1
- package/dist/{chunk-32KWKNSF.js → chunk-IXJT6DCX.js} +3 -3
- package/dist/{chunk-C2LTL2W6.js → chunk-J4HBWF6Y.js} +360 -172
- package/dist/chunk-J5LZHVIT.js +284 -0
- package/dist/{chunk-QLL7ILRG.js → chunk-JA5QWE4Z.js} +510 -202
- package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
- package/dist/{chunk-36EJLSQQ.js → chunk-JZWT5J3Y.js} +4 -4
- package/dist/{chunk-HZHHCK24.js → chunk-K6BF4U2H.js} +476 -322
- package/dist/{chunk-Z2RR6MAK.js → chunk-MA3H6DM5.js} +6 -6
- package/dist/{chunk-CODPRO7Q.js → chunk-MOPSG2X7.js} +6 -6
- package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
- package/dist/{chunk-YDFRH54B.js → chunk-N5UK64DP.js} +4 -4
- package/dist/chunk-NDDGJUXD.js +81 -0
- package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
- package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
- package/dist/{chunk-W5VSYASO.js → chunk-OJTRZGR3.js} +46 -87
- package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
- package/dist/{chunk-3URVFKWK.js → chunk-PJJ6MY27.js} +5 -5
- package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
- package/dist/{chunk-GKF55TAZ.js → chunk-PVAMAVBB.js} +3 -2
- package/dist/{chunk-6DB53AJS.js → chunk-QKIFBZKT.js} +7 -7
- package/dist/{chunk-HJJTYUHX.js → chunk-QMXC4JB7.js} +20 -20
- package/dist/chunk-QTFGO774.js +644 -0
- package/dist/{chunk-CY6FY24N.js → chunk-R23Z6K6I.js} +2 -2
- package/dist/{chunk-ULC6OTWO.js → chunk-R32CLGZ6.js} +13 -13
- package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
- package/dist/{chunk-F4CKPOEQ.js → chunk-SCYB3HA4.js} +72 -26
- package/dist/{chunk-LY4S7GJC.js → chunk-SINK3QR6.js} +18 -16
- package/dist/{chunk-U77AMWDL.js → chunk-TD3PGPQA.js} +43 -22
- package/dist/{chunk-QBJA7R7N.js → chunk-THYWACCR.js} +2 -2
- package/dist/{chunk-QREDIESB.js → chunk-TVH4ONAM.js} +14 -8
- package/dist/chunk-U2WB7TZS.js +271 -0
- package/dist/{chunk-KFZI4NIL.js → chunk-UAPGZHYC.js} +145 -31
- package/dist/{chunk-DQITNCXG.js → chunk-UEDMSP56.js} +29 -14
- package/dist/{chunk-3XML7CDN.js → chunk-UXN6JT4W.js} +2 -2
- package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
- package/dist/{chunk-BPKCPIL7.js → chunk-VEGN6WIQ.js} +2 -2
- package/dist/chunk-VKFQTNDV.js +66 -0
- package/dist/{chunk-7MCTRUCE.js → chunk-VKRH2TCS.js} +2 -2
- package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
- package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
- package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
- package/dist/{chunk-SUCTJL45.js → chunk-WR6U3OVP.js} +3 -3
- package/dist/{chunk-BUMFYQFY.js → chunk-XKA2ICR3.js} +124 -113
- package/dist/{chunk-UXMFQ54G.js → chunk-Y45G3AXC.js} +39 -39
- package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
- package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
- package/dist/{chunk-V5DHCITQ.js → chunk-ZAZB4JMW.js} +23 -12
- package/dist/{chunk-Z4TXYIEG.js → chunk-ZJLUDYFY.js} +9 -9
- package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
- package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
- package/dist/cli/index.js +36 -36
- package/dist/{clio-2JXHBBY5.js → clio-IT3G3VQH.js} +12 -13
- package/dist/{code-nav-3YYRMYNF.js → code-nav-RK6S7F6E.js} +5 -5
- package/dist/codewiki/build-worker.js +1 -1
- package/dist/{compile-cache-7FPE6PS3.js → compile-cache-OQAVB7Y5.js} +2 -4
- package/dist/{components-RYZV4JGP.js → components-UBWCQSRW.js} +4 -4
- package/dist/{config-QZPCMYSO.js → config-3QZRWZJF.js} +53 -49
- package/dist/{configure-TEGEBYCA.js → configure-FL7Y3KJF.js} +25 -22
- package/dist/{context-E6H5RNMC.js → context-5HE7ODYK.js} +47 -43
- package/dist/{context-AV7OEZ4D.js → context-KYQFRVDC.js} +11 -11
- package/dist/{context-GSXUE4CT.js → context-XNHL75JV.js} +32 -19
- package/dist/{context-clear-SHIBYK6T.js → context-clear-N545L53A.js} +47 -43
- package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-QHKXSV2F.js} +10 -9
- package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-RGIE5PCT.js} +56 -47
- package/dist/{docs-23KQS3XK.js → docs-5NAF6AU7.js} +5 -11
- package/dist/doctor-ZGPEGHIP.js +772 -0
- package/dist/{eval-TFBYQH4H.js → eval-GXLL44RD.js} +63 -45
- package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-HBWSWQOK.js} +7 -8
- package/dist/{evidence-ERGESKGN.js → evidence-HWLBRH3Q.js} +44 -40
- package/dist/{evolve-VDXTSYCJ.js → evolve-FTZBMNVW.js} +43 -39
- package/dist/{extensions-7BGBHN57.js → extensions-VHRBEID7.js} +4 -4
- package/dist/{fleet-2RRVDF2V.js → fleet-CKZHJWZJ.js} +86 -73
- package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EXDXBMV6.js} +10 -9
- package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-OTHB6KRL.js} +5 -5
- package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-YTEZUCUT.js} +13 -11
- package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-SS6YMDCK.js} +44 -41
- package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-PBY4VYOM.js} +5 -9
- package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-KMEM5L3S.js} +16 -13
- package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-QD5M7E7Q.js} +42 -39
- package/dist/{fleet-view-ZCON35AG.js → fleet-view-WAMJYNDT.js} +44 -52
- package/dist/{init-DN2WWLFE.js → init-5XQRBOFV.js} +63 -58
- package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
- package/dist/{interop-OZBKXAYL.js → interop-34TVO25M.js} +13 -11
- package/dist/{library-YWZG7IMW.js → library-3QY6KF57.js} +17 -14
- package/dist/{memory-I4C4HMLW.js → memory-L4UTIIIW.js} +45 -41
- package/dist/{models-CEYXJBO6.js → models-ZVX3QOWE.js} +39 -31
- package/dist/{monitor-NZ6GCI3P.js → monitor-CEKVSYTS.js} +50 -46
- package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-77BAP6BC.js} +1807 -1039
- package/dist/{panes-KY6W3V2E.js → panes-7STHOAUJ.js} +4 -4
- package/dist/{panes-HMABYVO4.js → panes-SHAUIRXY.js} +10 -8
- package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
- package/dist/{reset-DQ6FGCSH.js → reset-EOLM7GVE.js} +7 -8
- package/dist/{resources-BB3MVJMD.js → resources-74GKTLSF.js} +17 -13
- package/dist/{run-H2GQDUER.js → run-HBAUJNNZ.js} +86 -76
- package/dist/{share-GTJN6A5O.js → share-G3APVLVP.js} +17 -14
- package/dist/{skills-L55TEW6R.js → skills-35HHUKCR.js} +19 -16
- package/dist/{skills-eval-XVXPH2JI.js → skills-eval-QN4HSHDC.js} +55 -57
- package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-J357J34F.js} +15 -12
- package/dist/{slash-commands-ZSGASKJC.js → slash-commands-JZZCQA32.js} +31 -29
- package/dist/{steer-RZGSCY4R.js → steer-XAVHJM22.js} +3 -3
- package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
- package/dist/{targets-NCPZ644J.js → targets-DSM6CY3M.js} +59 -53
- package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-JOPFUVEM.js} +14 -9
- package/dist/{tools-DAF3DI3C.js → tools-MKNWVPBH.js} +10 -8
- package/dist/{trace-FYVW2MQA.js → trace-ECQ7TIYZ.js} +48 -3
- package/dist/{tui-primitives-2AKXQNZK.js → tui-primitives-K5PASC3O.js} +8 -4
- package/dist/{uninstall-DW2PNOIC.js → uninstall-N34PCTGJ.js} +4 -6
- package/dist/{upgrade-3XPP6OQL.js → upgrade-H7TOM7YL.js} +35 -62
- package/dist/{usage-3NLHGTU2.js → usage-X52N3IDJ.js} +51 -48
- package/dist/{verifiers-SSQONKRT.js → verifiers-EJTVVSMA.js} +10 -9
- package/dist/{verify-3U6J7FZI.js → verify-YJL6XET2.js} +9 -8
- package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPIFL3LL.js} +1 -2
- package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-4NDZTQ4B.js} +66 -63
- package/dist/{with-panes-MKB46MPQ.js → with-panes-OBOBFIIR.js} +62 -26
- package/dist/worker/entry.js +57 -52
- package/docs/acp.md +1 -1
- package/docs/built-in-agents.md +40 -32
- package/docs/commands-and-modes.md +9 -3
- package/docs/config-knobs-audit.md +3 -0
- package/docs/configuration-and-targets.md +105 -164
- package/docs/environment-variables.md +2 -1
- package/docs/exit-codes-and-output.md +2 -0
- package/docs/fleet-demo-runbook.md +6 -3
- package/docs/fleet-dispatch.md +8 -6
- package/docs/installation-and-lifecycle.md +1 -1
- package/docs/release-cut-checklist.md +164 -177
- package/docs/trace-store.md +15 -10
- package/docs/troubleshooting.md +1 -1
- package/evals/README.md +5 -0
- package/evals/behavioral-corpus-grader.mjs +103 -0
- package/evals/behavioral-machinery-baseline.json +2276 -0
- package/evals/behavioral-machinery-driver.ts +250 -0
- package/evals/behavioral-machinery-support.ts +253 -0
- package/evals/behavioral-machinery.yaml +614 -0
- package/evals/behavioral-model-negative-control.yaml +68 -0
- package/evals/behavioral-model.yaml +216 -0
- package/evals/fixtures/behavioral-facts.txt +3 -0
- package/evals/fixtures/behavioral-main.ts +7 -0
- package/evals/fixtures/decoy/note.txt +2 -0
- package/evals/fixtures/private/credentials.txt +1 -0
- package/evals/tracked-metrics-baseline.yaml +229 -0
- package/evals/tracked-metrics-grader.mjs +129 -0
- package/package.json +5 -15
- package/skills/README.md +6 -6
- package/skills/coding/ast-grep/SKILL.md +8 -2
- package/skills/coding/coding-standards/SKILL.md +8 -2
- package/skills/coding/prototype/SKILL.md +8 -2
- package/skills/coding/tdd/SKILL.md +8 -2
- package/skills/context/context-handoff/SKILL.md +12 -3
- package/skills/context/context-handoff/evals.md +3 -3
- package/skills/context/context-prime/SKILL.md +8 -2
- package/skills/context/context-prime/evals.md +2 -2
- package/skills/git/file-ticket/SKILL.md +9 -4
- package/skills/git/file-ticket/evals.md +2 -2
- package/skills/git/fix-issue/SKILL.md +12 -5
- package/skills/git/fix-issue/evals.md +4 -4
- package/skills/git/resolve-merge-conflicts/SKILL.md +8 -2
- package/skills/git/resolve-merge-conflicts/evals.md +2 -2
- package/skills/git/ship/SKILL.md +9 -3
- package/skills/git/ship/evals.md +4 -4
- package/skills/git/worktree-create/SKILL.md +7 -2
- package/skills/git/worktree-create/evals.md +6 -6
- package/skills/git/worktree-merge/SKILL.md +7 -2
- package/skills/git/worktree-merge/evals.md +6 -6
- package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
- package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
- package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
- package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
- package/skills/meta/credentials/SKILL.md +9 -2
- package/skills/meta/find-skills/SKILL.md +8 -2
- package/skills/meta/herdr/SKILL.md +8 -2
- package/skills/meta/skill-craft/SKILL.md +21 -4
- package/skills/planning/architecture/SKILL.md +9 -3
- package/skills/planning/backlog/SKILL.md +8 -2
- package/skills/planning/prd/SKILL.md +8 -2
- package/skills/planning/product-intent/SKILL.md +8 -2
- package/skills/planning/tech-spec/SKILL.md +9 -3
- package/skills/registry.yaml +66 -66
- package/skills/research/arxiv-literature/SKILL.md +8 -2
- package/skills/research/experiment-protocol/SKILL.md +9 -2
- package/skills/research/scientific-debugging/SKILL.md +9 -2
- package/skills/research/scientific-debugging/evals.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +9 -2
- package/skills/skill-marketplace.json +257 -38
- package/skills/workflow/cut-it/SKILL.md +10 -2
- package/skills/workflow/design-council/SKILL.md +11 -2
- package/skills/workflow/grill-me/SKILL.md +8 -2
- package/skills/workflow/workflow-distiller/SKILL.md +8 -2
- package/src/cli/acp.ts +2 -2
- package/src/cli/auth.ts +2 -2
- package/src/cli/bootstrap-generate.ts +5 -5
- package/src/cli/clio.ts +6 -1
- package/src/cli/config-inspect.ts +3 -3
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure.ts +27 -27
- package/src/cli/default-target.ts +1 -1
- package/src/cli/docs.ts +6 -6
- package/src/cli/doctor-naming.ts +323 -0
- package/src/cli/doctor-panes.ts +46 -14
- package/src/cli/doctor-toolchain.ts +29 -8
- package/src/cli/doctor.ts +15 -1
- package/src/cli/eval-inventory.ts +8 -8
- package/src/cli/evidence-detail.ts +1 -1
- package/src/cli/evidence-inventory.ts +1 -1
- package/src/cli/fleet-decisions.ts +1 -1
- package/src/cli/fleet-inspect.ts +1 -1
- package/src/cli/fleet-preflight.ts +1 -1
- package/src/cli/fleet-verify.ts +1 -1
- package/src/cli/fleet-view.ts +40 -23
- package/src/cli/fleet.ts +8 -5
- package/src/cli/interop-inspect.ts +2 -2
- package/src/cli/models.ts +3 -3
- package/src/cli/modes/print.ts +1 -1
- package/src/cli/reset.ts +1 -1
- package/src/cli/run.ts +11 -15
- package/src/cli/share.ts +1 -1
- package/src/cli/skills-eval.ts +11 -11
- package/src/cli/targets.ts +23 -24
- package/src/cli/trace-inspect.ts +1 -1
- package/src/cli/trace.ts +41 -0
- package/src/cli/uninstall.ts +2 -2
- package/src/cli/upgrade.ts +29 -34
- package/src/cli/usage.ts +2 -2
- package/src/cli/validate-model.ts +1 -1
- package/src/cli/verifiers-inspect.ts +1 -1
- package/src/cli/wiki-generate.ts +5 -5
- package/src/core/bash-exec.ts +1 -1
- package/src/core/boot-trace.ts +3 -3
- package/src/core/bus-trace.ts +2 -2
- package/src/core/compile-cache.ts +1 -1
- package/src/core/config.ts +1062 -886
- package/src/core/defaults.ts +321 -528
- package/src/core/domain-loader.ts +6 -4
- package/src/core/event-bus.ts +1 -1
- package/src/core/file-references.ts +78 -88
- package/src/core/git-commit-attribution.ts +3 -9
- package/src/core/guardrails.ts +24 -4
- package/src/core/naming-compat.ts +45 -0
- package/src/core/naming-events.ts +62 -0
- package/src/core/recent-models.ts +1 -7
- package/src/core/residency-protection.ts +4 -8
- package/src/core/resolve-config-value.ts +1 -1
- package/src/core/response-model-id.ts +0 -14
- package/src/core/session-routing.ts +84 -74
- package/src/core/skill-activation.ts +18 -0
- package/src/core/termination.ts +4 -4
- package/src/core/timers.ts +2 -12
- package/src/domains/agents/catalog.ts +2 -12
- package/src/domains/agents/extension.ts +3 -3
- package/src/domains/agents/registry.ts +7 -7
- package/src/domains/agents/result-contract.ts +1 -1
- package/src/domains/agents/spec.ts +0 -11
- package/src/domains/config/classify.ts +35 -47
- package/src/domains/config/extension.ts +5 -5
- package/src/domains/config/keybindings.ts +48 -47
- package/src/domains/config/watcher.ts +1 -1
- package/src/domains/context/codewiki/indexer.ts +1 -1
- package/src/domains/context/extension.ts +3 -3
- package/src/domains/context/prompt-context.ts +1 -1
- package/src/domains/context/wiki/assemble.ts +2 -2
- package/src/domains/context/working-set/replay/metrics.ts +0 -4
- package/src/domains/context/working-set/replay/report.ts +1 -1
- package/src/domains/context/working-set/replay/synthetic.ts +2 -2
- package/src/domains/dispatch/active-route-planner.ts +2 -2
- package/src/domains/dispatch/agent-candidates.ts +1 -1
- package/src/domains/dispatch/agent-ledger-store.ts +1 -1
- package/src/domains/dispatch/agent-ledger.ts +1 -1
- package/src/domains/dispatch/assignment.ts +5 -5
- package/src/domains/dispatch/capacity-lease.ts +2 -5
- package/src/domains/dispatch/code-step.ts +1 -1
- package/src/domains/dispatch/contract.ts +2 -2
- package/src/domains/dispatch/extension.ts +65 -61
- package/src/domains/dispatch/fleet-node-prompt.ts +1 -1
- package/src/domains/dispatch/fleet-preflight.ts +8 -17
- package/src/domains/dispatch/fleet-run.ts +0 -7
- package/src/domains/dispatch/gate-decisions.ts +25 -14
- package/src/domains/dispatch/joint-route-resolver.ts +1 -1
- package/src/domains/dispatch/path-scope.ts +0 -61
- package/src/domains/dispatch/placement.ts +2 -2
- package/src/domains/dispatch/receipt-findings.ts +1 -1
- package/src/domains/dispatch/receipt-integrity.ts +20 -8
- package/src/domains/dispatch/reservation-store.ts +0 -23
- package/src/domains/dispatch/route-decision.ts +1 -1
- package/src/domains/dispatch/route-history.ts +1 -1
- package/src/domains/dispatch/route-policy.ts +1 -1
- package/src/domains/dispatch/route-readiness.ts +0 -28
- package/src/domains/dispatch/run-event-journal.ts +6 -5
- package/src/domains/dispatch/tool-stats.ts +1 -1
- package/src/domains/dispatch/transport.ts +2 -19
- package/src/domains/dispatch/types.ts +3 -3
- package/src/domains/dispatch/worker-protocol.ts +2 -2
- package/src/domains/eval/artifacts/store.ts +5 -4
- package/src/domains/eval/compare/thresholds.ts +0 -8
- package/src/domains/eval/execution-provenance.ts +1 -1
- package/src/domains/eval/metrics/token-stream.ts +0 -7
- package/src/domains/eval/report.ts +1 -1
- package/src/domains/eval/runner.ts +1 -1
- package/src/domains/eval/runners/clio-run.ts +7 -6
- package/src/domains/eval/runners/external-command.ts +4 -3
- package/src/domains/eval/schema/artifact.ts +1 -1
- package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
- package/src/domains/eval/schema/behavioral.ts +7 -6
- package/src/domains/eval/schema/execution-envelope.ts +4 -2
- package/src/domains/eval/schema/naming.ts +10 -0
- package/src/domains/eval/schema/suite.ts +2 -2
- package/src/domains/eval/schema/validate.ts +9 -5
- package/src/domains/eval/schema/verdict.ts +4 -2
- package/src/domains/eval/store.ts +12 -2
- package/src/domains/eval/suites/run.ts +12 -6
- package/src/domains/eval/types.ts +1 -1
- package/src/domains/eval/workspaces/git.ts +1 -1
- package/src/domains/eval/workspaces/temp-copy.ts +1 -1
- package/src/domains/evidence/build.ts +13 -5
- package/src/domains/interop/consent.ts +7 -7
- package/src/domains/interop/extension.ts +1 -1
- package/src/domains/lifecycle/doctor.ts +27 -21
- package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
- package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
- package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
- package/src/domains/lifecycle/migrations/index.ts +20 -1
- package/src/domains/lifecycle/naming-history.ts +153 -0
- package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
- package/src/domains/lifecycle/naming-resources.ts +261 -0
- package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
- package/src/domains/lifecycle/naming-yazi.ts +81 -0
- package/src/domains/lifecycle/upgrade-notice.ts +1 -1
- package/src/domains/memory/task-memory-handoff.ts +6 -3
- package/src/domains/middleware/index.ts +7 -0
- package/src/domains/middleware/marketplace-offer.ts +339 -0
- package/src/domains/middleware/runtime.ts +2 -2
- package/src/domains/mux/contract.ts +157 -25
- package/src/domains/mux/detect.ts +29 -5
- package/src/domains/mux/dock-controller.ts +365 -0
- package/src/domains/mux/extension.ts +7 -1
- package/src/domains/mux/index.ts +20 -0
- package/src/domains/mux/operations.ts +28 -0
- package/src/domains/mux/protocol.ts +19 -6
- package/src/domains/mux/socket-client.ts +167 -19
- package/src/domains/mux/types.ts +49 -6
- package/src/domains/mux/yazi/event-stream.ts +6 -4
- package/src/domains/mux/yazi/profile.ts +1 -1
- package/src/domains/mux/yazi/session.ts +26 -3
- package/src/domains/observability/extension.ts +1 -1
- package/src/domains/observability/out-of-turn-usage.ts +2 -2
- package/src/domains/observability/projection.ts +1 -1
- package/src/domains/observability/trace-store.ts +22 -12
- package/src/domains/prompts/compiler.ts +2 -2
- package/src/domains/prompts/extension.ts +3 -3
- package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
- package/src/domains/prompts/fragments/operating/skills.md +25 -18
- package/src/domains/providers/extension.ts +5 -5
- package/src/domains/providers/knowledge-base-path.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +14 -2
- package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
- package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +4 -4
- package/src/domains/providers/plugins.ts +1 -1
- package/src/domains/providers/resolver.ts +1 -1
- package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
- package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
- package/src/domains/providers/runtimes/common/probe-helpers.ts +2 -2
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
- package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
- package/src/domains/providers/types/knowledge-base.ts +13 -0
- package/src/domains/providers/types/local-model-quirks.ts +2 -2
- package/src/domains/providers/types/target-descriptor.ts +3 -3
- package/src/domains/resources/extension.ts +1 -1
- package/src/domains/resources/library.ts +6 -6
- package/src/domains/resources/prompts/loader.ts +1 -1
- package/src/domains/resources/skills/content-hash.ts +7 -6
- package/src/domains/resources/skills/evals.ts +1 -1
- package/src/domains/resources/skills/install.ts +36 -12
- package/src/domains/resources/skills/loader.ts +39 -13
- package/src/domains/resources/skills/marketplace.ts +21 -2
- package/src/domains/resources/skills/promotion.ts +214 -0
- package/src/domains/safety/audit.ts +2 -2
- package/src/domains/safety/finish-contract.ts +2 -1
- package/src/domains/safety/run-effects.ts +1 -1
- package/src/domains/scheduling/extension.ts +4 -4
- package/src/domains/session/archive-readers.ts +9 -1
- package/src/domains/session/compaction/branch-summary.ts +4 -0
- package/src/domains/session/compaction/compact.ts +1 -1
- package/src/domains/session/compaction/tokens.ts +4 -0
- package/src/domains/session/context-accounting.ts +1 -1
- package/src/domains/session/decision-board.ts +1 -1
- package/src/domains/session/extension.ts +1 -1
- package/src/domains/session/handoff.ts +2 -2
- package/src/domains/session/prompt-manifest.ts +0 -5
- package/src/domains/session/protected-artifact-journal.ts +12 -6
- package/src/domains/session/retry.ts +1 -1
- package/src/domains/share/archive.ts +85 -36
- package/src/domains/toolchain/install.ts +1 -1
- package/src/engine/acp/adapter.ts +3 -3
- package/src/engine/acp/event-mapper.ts +3 -3
- package/src/engine/acp/server.ts +27 -26
- package/src/engine/acp/tool-mediator.ts +2 -2
- package/src/engine/acp/types.ts +1 -1
- package/src/engine/alcf-oauth.ts +5 -5
- package/src/engine/antigravity/subprocess-runtime.ts +2 -2
- package/src/engine/api-registry.ts +1 -1
- package/src/engine/apis/llamacpp-residency.ts +1 -19
- package/src/engine/apis/lmstudio.ts +1 -6
- package/src/engine/apis/ollama-native.ts +3 -3
- package/src/engine/apis/openai-completions.ts +2 -2
- package/src/engine/apis/residency.ts +3 -9
- package/src/engine/claude/sdk-module.ts +1 -12
- package/src/engine/claude/sdk-runtime.ts +6 -6
- package/src/engine/claude/subprocess-runtime.ts +1 -1
- package/src/engine/claude/tool-safety.ts +4 -4
- package/src/engine/loop-guard.ts +0 -5
- package/src/engine/session.ts +14 -7
- package/src/engine/tui-primitives.ts +1 -1
- package/src/engine/worker-events.ts +6 -6
- package/src/engine/worker-runtime.ts +14 -13
- package/src/entry/orchestrator.ts +107 -88
- package/src/interactive/application-controller.ts +21 -21
- package/src/interactive/bus-notices.ts +2 -2
- package/src/interactive/chat-loop.ts +8 -8
- package/src/interactive/chat-panel.ts +1 -1
- package/src/interactive/clio-editor.ts +105 -1
- package/src/interactive/context-activity.ts +8 -6
- package/src/interactive/context-meter.ts +3 -6
- package/src/interactive/context-overlay.ts +1 -1
- package/src/interactive/cost-overlay.ts +1 -1
- package/src/interactive/council-grid.ts +2 -2
- package/src/interactive/dispatch-board.ts +30 -33
- package/src/interactive/editor-bash.ts +21 -0
- package/src/interactive/editor-steer.ts +9 -4
- package/src/interactive/editor-submit.ts +24 -18
- package/src/interactive/external-editor.ts +1 -1
- package/src/interactive/file-reference-completion.ts +360 -0
- package/src/interactive/footer/dashboard.ts +15 -17
- package/src/interactive/footer/notifications.ts +14 -8
- package/src/interactive/footer/widgets.ts +2 -44
- package/src/interactive/interactive-application.ts +79 -59
- package/src/interactive/interactive-event-projection.ts +1 -1
- package/src/interactive/interactive-input-runtime.ts +2 -2
- package/src/interactive/interactive-presentation.ts +21 -16
- package/src/interactive/interactive-shell.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +63 -17
- package/src/interactive/interactive-subscriptions.ts +1 -1
- package/src/interactive/interactive-tickers.ts +1 -1
- package/src/interactive/keybinding-manager.ts +4 -4
- package/src/interactive/layout.ts +1 -1
- package/src/interactive/memory-overlay.ts +2 -2
- package/src/interactive/modal-marker.ts +2 -21
- package/src/interactive/mutation-preview.ts +1 -1
- package/src/interactive/overlay-frame.ts +4 -12
- package/src/interactive/overlay-general-openers.ts +6 -2
- package/src/interactive/overlay-key-routing.ts +7 -7
- package/src/interactive/overlay-lifecycle.ts +1 -1
- package/src/interactive/overlay-model-selectors.ts +3 -3
- package/src/interactive/overlays/agents.ts +2 -2
- package/src/interactive/overlays/ask-user.ts +25 -11
- package/src/interactive/overlays/context-reset.ts +28 -4
- package/src/interactive/overlays/cwd-fallback.ts +28 -4
- package/src/interactive/overlays/decisions.ts +4 -2
- package/src/interactive/overlays/fleet-run-approval.ts +3 -3
- package/src/interactive/overlays/handoff-review.ts +2 -2
- package/src/interactive/overlays/interop.ts +1 -1
- package/src/interactive/overlays/library-install-confirm.ts +1 -1
- package/src/interactive/overlays/message-picker.ts +1 -1
- package/src/interactive/overlays/model-selector.ts +39 -31
- package/src/interactive/overlays/prompts.ts +10 -4
- package/src/interactive/overlays/session-selector.ts +2 -2
- package/src/interactive/overlays/settings.ts +339 -293
- package/src/interactive/overlays/side-question.ts +2 -2
- package/src/interactive/overlays/skills-hub.ts +8 -8
- package/src/interactive/overlays/tree-selector.ts +2 -2
- package/src/interactive/panes-runtime.ts +36 -10
- package/src/interactive/permission-overlay.ts +2 -2
- package/src/interactive/renderers/retry-status.ts +12 -4
- package/src/interactive/renderers/tool-execution.ts +4 -4
- package/src/interactive/session-transcript.ts +3 -3
- package/src/interactive/slash-autocomplete.ts +454 -165
- package/src/interactive/slash-commands.ts +279 -183
- package/src/interactive/slash-spec.ts +160 -17
- package/src/interactive/status/controller.ts +2 -2
- package/src/interactive/stream-pacing-policy.ts +1 -1
- package/src/interactive/tasks-overlay.ts +20 -13
- package/src/interactive/terminal-lease.ts +6 -7
- package/src/interactive/turn-context.ts +11 -11
- package/src/interactive/turn-persistence.ts +2 -2
- package/src/interactive/turn-prewarm.ts +2 -2
- package/src/interactive/turn-runtime.ts +8 -8
- package/src/interactive/turn-state.ts +1 -1
- package/src/interactive/view/artifacts.ts +12 -9
- package/src/interactive/view/view-overlay.ts +13 -10
- package/src/interactive/watch-pane.ts +38 -10
- package/src/interactive/welcome-dashboard.ts +15 -15
- package/src/interactive/worker-progress.ts +4 -4
- package/src/interactive/worker-receipts.ts +1 -1
- package/src/interactive/worker-stream.ts +1 -4
- package/src/interactive/yazi-bridge.ts +12 -5
- package/src/tools/ask-user.ts +3 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/builtin-tool-catalog.ts +1 -1
- package/src/tools/compete-worktrees.ts +27 -17
- package/src/tools/context/index.ts +15 -1
- package/src/tools/dispatch-admission.ts +4 -2
- package/src/tools/dispatch-arguments.ts +1 -1
- package/src/tools/dispatch-plan.ts +0 -11
- package/src/tools/dispatch-run-events.ts +12 -10
- package/src/tools/dispatch-runner.ts +11 -6
- package/src/tools/dispatch.ts +1 -1
- package/src/tools/find.ts +1 -6
- package/src/tools/monitor.ts +4 -4
- package/src/tools/observers.ts +0 -33
- package/src/tools/task-worktree.ts +28 -7
- package/src/tools/verify/authoring.ts +3 -6
- package/src/tools/verify/frontend.ts +1 -1
- package/src/tools/web-fetch.ts +1 -1
- package/src/worker/entry.ts +4 -3
- package/src/worker/protocol.ts +16 -14
- package/src/worker/spec-contract.ts +2 -2
- package/src/worker/stdin-demux.ts +2 -2
- package/dist/chunk-GXNLGKAB.js +0 -571
- package/dist/chunk-VFA6GDY5.js +0 -1625
- package/dist/doctor-QOA5FNY5.js +0 -313
- package/src/engine/apis/degraded-inference.ts +0 -95
- /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
- /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.
|
|
108
|
-
? settings.targets.find((entry) => entry.id === settings.
|
|
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.
|
|
82
|
+
const profileName = settings.fleet.agentProfiles[agentId];
|
|
83
83
|
if (!profileName) continue;
|
|
84
|
-
const profile = settings.
|
|
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.
|
|
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 === "
|
|
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 === "
|
|
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
|
-
|
|
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.`);
|
package/src/cli/configure.ts
CHANGED
|
@@ -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.
|
|
489
|
-
settings.
|
|
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.
|
|
494
|
-
settings.
|
|
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.
|
|
505
|
-
settings.
|
|
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.
|
|
510
|
-
const role = settings.
|
|
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.
|
|
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.
|
|
611
|
-
if (settings.
|
|
612
|
-
if (settings.
|
|
613
|
-
for (const [name, profile] of Object.entries(settings.
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
1502
|
-
if (settings.
|
|
1503
|
-
if (settings.
|
|
1504
|
-
for (const profile of Object.values(settings.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
}
|