@iowarp/clio-coder 0.3.9 → 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 +92 -0
- package/NOTICE +33 -0
- package/README.md +121 -16
- package/dist/{acp-7LOELQFP.js → acp-ZILU3AUO.js} +19 -18
- package/dist/{agents-FIBG2SHA.js → agents-HYWGBGQR.js} +53 -39
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-OI4LIH2I.js → auth-N3QT7CBO.js} +24 -21
- package/dist/{builtins-AD25UL3C.js → builtins-UJLMOVOV.js} +6 -6
- package/dist/{chunk-I4HZDVNP.js → chunk-2LEAKD4C.js} +2 -3
- package/dist/{chunk-465CC7FK.js → chunk-2NM363SV.js} +60 -64
- package/dist/{chunk-4H6ULJ3H.js → chunk-2VG7KLYV.js} +1046 -1370
- package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
- package/dist/{chunk-NZU6YDNV.js → chunk-3I5NY75V.js} +5 -5
- package/dist/{chunk-47CMYGET.js → chunk-3QSOM6PA.js} +2 -2
- package/dist/chunk-42FMPA75.js +101 -0
- package/dist/{chunk-HAY4ZE2P.js → chunk-5PSMVOLM.js} +2 -2
- package/dist/{chunk-IHKBWSXF.js → chunk-5QIAJV2D.js} +3 -3
- package/dist/chunk-5YHDIDBP.js +97 -0
- package/dist/chunk-6CCS4G3W.js +1529 -0
- package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
- package/dist/{chunk-BVDVID7E.js → chunk-6FN3E6KX.js} +6 -6
- package/dist/{chunk-DG4M6ZUE.js → chunk-6HMJX2VU.js} +59 -59
- package/dist/{chunk-3MRC2YSQ.js → chunk-6I5ILFOF.js} +3 -2
- package/dist/chunk-6NJQITNH.js +1412 -0
- package/dist/chunk-6VC4OV3Z.js +365 -0
- package/dist/{chunk-LU7P4LHA.js → chunk-72GZI5EV.js} +2 -2
- package/dist/{chunk-5T7RBWN2.js → chunk-74YWRRU5.js} +9 -8
- package/dist/{chunk-VPTUJU4P.js → chunk-7EPLI7VL.js} +2 -2
- package/dist/{chunk-CA42X6KT.js → chunk-7OBGU7UB.js} +7 -7
- package/dist/{chunk-56KB5IJP.js → chunk-7PWAODYW.js} +3 -3
- package/dist/chunk-7RY5VZPH.js +573 -0
- package/dist/{chunk-OEDBCISO.js → chunk-ABLSQ6JX.js} +3 -3
- package/dist/{chunk-5HFBWUMU.js → chunk-AFKWHWXF.js} +13 -23
- package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
- package/dist/{chunk-WXCJ7VME.js → chunk-AKB4GYDL.js} +7 -7
- package/dist/chunk-AP73CFDC.js +308 -0
- package/dist/{chunk-4LJX2PUC.js → chunk-BBTJOK6Y.js} +5 -5
- package/dist/{chunk-QQ7EKM72.js → chunk-BDPT6GTK.js} +13 -61
- package/dist/chunk-BJGUKIG4.js +302 -0
- package/dist/chunk-BMS5RKQY.js +27 -0
- package/dist/{chunk-TD7UE2L5.js → chunk-BTGG6BG2.js} +81 -40
- 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-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
- package/dist/{chunk-HJB5IUKP.js → chunk-C537JADH.js} +18 -18
- package/dist/{chunk-774ILSRL.js → chunk-CDNVLKUX.js} +5 -4
- package/dist/{chunk-HPCTNZM2.js → chunk-CTJ4RNAA.js} +4 -4
- package/dist/{chunk-AEYBF3TB.js → chunk-CWVRRIEI.js} +2 -2
- package/dist/chunk-D4CJV46V.js +462 -0
- package/dist/chunk-D7E7WCDF.js +27 -0
- package/dist/{chunk-5PVQ4SRS.js → chunk-E67WX76H.js} +10 -126
- package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
- package/dist/chunk-EIMVLWB3.js +1842 -0
- package/dist/{chunk-AMKHQW3C.js → chunk-FEFIFZTL.js} +3 -3
- package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
- package/dist/{chunk-3DUR4WUA.js → chunk-FYUN5KZ3.js} +25 -25
- package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
- package/dist/chunk-GIZNH63R.js +40 -0
- package/dist/chunk-GPPB3JBE.js +688 -0
- package/dist/{chunk-B5XRQOLB.js → chunk-GVQJ5CCZ.js} +17 -11
- package/dist/chunk-HHV2GANA.js +88 -0
- package/dist/chunk-HJWWJ6IL.js +184 -0
- package/dist/{chunk-RKRLDWD3.js → chunk-HLW2MRKE.js} +1 -1
- package/dist/chunk-HRQMFLJP.js +75 -0
- package/dist/{chunk-AD7Y7STJ.js → chunk-HUAS7ITX.js} +107 -97
- package/dist/{chunk-O6I4CIEU.js → chunk-I66EAJFY.js} +6 -6
- package/dist/{chunk-S4COXYBG.js → chunk-IG7BCQBA.js} +129 -106
- package/dist/{chunk-N3PBVRTZ.js → chunk-IXJT6DCX.js} +9 -7
- package/dist/chunk-J4HBWF6Y.js +2635 -0
- package/dist/chunk-J5LZHVIT.js +284 -0
- package/dist/{chunk-GAYUJ7LE.js → chunk-JA5QWE4Z.js} +544 -227
- package/dist/{chunk-B5CSFE7B.js → chunk-JIEGK6UF.js} +6 -174
- package/dist/{chunk-VKBMFOYV.js → chunk-JZWT5J3Y.js} +23 -27
- package/dist/chunk-K6BF4U2H.js +1785 -0
- package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
- package/dist/{chunk-YSEHGPCT.js → chunk-MA3H6DM5.js} +6 -6
- package/dist/{chunk-EBOC7MT3.js → chunk-MOPSG2X7.js} +9 -9
- package/dist/{chunk-KV2AOLDF.js → chunk-MQXIVJ35.js} +18 -29
- package/dist/{chunk-P3JGPQFL.js → chunk-N5UK64DP.js} +4 -4
- package/dist/chunk-NDDGJUXD.js +81 -0
- package/dist/chunk-NEKRRTYW.js +56 -0
- package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
- package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
- package/dist/{chunk-T3Z6VAAF.js → chunk-OJTRZGR3.js} +53 -92
- package/dist/{chunk-5DQRIYDZ.js → chunk-PBP4B7XR.js} +3 -3
- package/dist/{chunk-NQ6UCCOD.js → chunk-PJJ6MY27.js} +8 -8
- package/dist/chunk-PMZCIOCJ.js +25 -0
- package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
- package/dist/{chunk-7C6RYZGQ.js → chunk-PVAMAVBB.js} +5 -4
- package/dist/chunk-QDC3K2U3.js +262 -0
- package/dist/{chunk-JEQQR47K.js → chunk-QKIFBZKT.js} +173 -14
- package/dist/{chunk-R7LNVMCS.js → chunk-QMXC4JB7.js} +70 -78
- package/dist/chunk-QSNYB6ZV.js +195 -0
- package/dist/chunk-QTFGO774.js +644 -0
- package/dist/{chunk-ODFEOB4F.js → chunk-R23Z6K6I.js} +27 -9
- package/dist/{chunk-3UUY7R3Z.js → chunk-R32CLGZ6.js} +14 -14
- package/dist/chunk-R346GLFC.js +31 -0
- package/dist/chunk-RKSR6VSF.js +132 -0
- package/dist/{chunk-N5XKWMDW.js → chunk-SCYB3HA4.js} +73 -27
- package/dist/{chunk-PZ4I4JE2.js → chunk-SINK3QR6.js} +135 -125
- package/dist/{chunk-5QKCQQ3E.js → chunk-SUW5DORT.js} +2 -2
- package/dist/chunk-T56WDKA5.js +183 -0
- package/dist/{chunk-ECUO3KDP.js → chunk-TD3PGPQA.js} +87 -26
- package/dist/{chunk-HKO36JWF.js → chunk-THYWACCR.js} +31 -3
- package/dist/{chunk-LXPJXFM5.js → chunk-TVH4ONAM.js} +18 -12
- package/dist/chunk-TVHHYFHE.js +255 -0
- package/dist/chunk-U2WB7TZS.js +271 -0
- package/dist/{chunk-NNNWO6F2.js → chunk-UAPGZHYC.js} +237 -33
- package/dist/{chunk-MIX5N5AC.js → chunk-UEDMSP56.js} +415 -160
- package/dist/{chunk-WIE7ZOSW.js → chunk-UXN6JT4W.js} +3 -3
- package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
- package/dist/{chunk-MV2VUEJC.js → chunk-VEGN6WIQ.js} +2 -2
- package/dist/chunk-VKFQTNDV.js +66 -0
- package/dist/{chunk-FALJGAWU.js → chunk-VKRH2TCS.js} +2 -2
- package/dist/{chunk-A2NJGIB3.js → chunk-VN3SHNBN.js} +2 -2
- package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
- package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
- package/dist/{chunk-EQ63NRB7.js → chunk-WNP7O5WZ.js} +3 -3
- package/dist/chunk-WR6U3OVP.js +45 -0
- package/dist/{chunk-TEO2TLVN.js → chunk-XKA2ICR3.js} +1051 -1196
- package/dist/{chunk-3V5AYSEQ.js → chunk-Y45G3AXC.js} +72 -65
- package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
- package/dist/chunk-YAKGTXEV.js +17 -0
- package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
- package/dist/{chunk-YW7UVM5V.js → chunk-ZAZB4JMW.js} +55 -11
- package/dist/{chunk-HCBCAYZU.js → chunk-ZJLUDYFY.js} +11 -11
- package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
- package/dist/{chunk-IFBNV6H6.js → chunk-ZW55JB7N.js} +3 -3
- package/dist/cli/index.js +48 -37
- package/dist/clio-IT3G3VQH.js +25 -0
- package/dist/{code-nav-LMW275PA.js → code-nav-RK6S7F6E.js} +8 -8
- package/dist/codewiki/build-worker.js +1 -1
- package/dist/{compile-cache-CVJMMODC.js → compile-cache-OQAVB7Y5.js} +3 -5
- package/dist/{components-ZFA3SAER.js → components-UBWCQSRW.js} +6 -6
- package/dist/{config-RXS5T3JT.js → config-3QZRWZJF.js} +73 -61
- package/dist/configure-FL7Y3KJF.js +54 -0
- package/dist/{context-MVOORGMF.js → context-5HE7ODYK.js} +61 -49
- package/dist/{context-I3BTOTCS.js → context-KYQFRVDC.js} +11 -11
- package/dist/{context-PALKKQYL.js → context-XNHL75JV.js} +43 -28
- package/dist/{context-clear-N2WOYZ2K.js → context-clear-N545L53A.js} +60 -48
- package/dist/{context-working-set-MIEVECVZ.js → context-working-set-QHKXSV2F.js} +15 -13
- package/dist/{dispatch-runner-VVA4SRRH.js → dispatch-runner-RGIE5PCT.js} +109 -72
- package/dist/{docs-7LQ23DLM.js → docs-5NAF6AU7.js} +7 -13
- package/dist/doctor-ZGPEGHIP.js +772 -0
- package/dist/{eval-IJ5VEZDJ.js → eval-GXLL44RD.js} +106 -86
- package/dist/eval-inventory-HBWSWQOK.js +315 -0
- package/dist/{evidence-L5APPXNV.js → evidence-HWLBRH3Q.js} +209 -51
- package/dist/{evolve-RGNKFJ52.js → evolve-FTZBMNVW.js} +57 -45
- package/dist/{extensions-7WYWUX5A.js → extensions-VHRBEID7.js} +7 -7
- package/dist/{fleet-6CNVBZZP.js → fleet-CKZHJWZJ.js} +215 -114
- package/dist/{fleet-commands-L2SXSYEI.js → fleet-commands-EXDXBMV6.js} +13 -12
- package/dist/fleet-decisions-OTHB6KRL.js +157 -0
- package/dist/{fleet-graph-2J3OOIPO.js → fleet-graph-YTEZUCUT.js} +20 -17
- package/dist/fleet-inspect-SS6YMDCK.js +445 -0
- package/dist/{fleet-preflight-CZRJ4JP5.js → fleet-preflight-PBY4VYOM.js} +6 -9
- package/dist/{fleet-validate-C5RI6DP7.js → fleet-validate-KMEM5L3S.js} +25 -20
- package/dist/fleet-verify-QD5M7E7Q.js +178 -0
- package/dist/fleet-view-WAMJYNDT.js +94 -0
- package/dist/{init-VBN2ACVA.js → init-5XQRBOFV.js} +79 -66
- package/dist/install-NKNG7KD4.js +13 -0
- package/dist/interop-34TVO25M.js +116 -0
- package/dist/{library-JHGUMLY2.js → library-3QY6KF57.js} +25 -21
- package/dist/{memory-K4OQIYWG.js → memory-L4UTIIIW.js} +59 -47
- package/dist/{models-2NCZUWDD.js → models-ZVX3QOWE.js} +47 -37
- package/dist/{monitor-MMVTJABD.js → monitor-CEKVSYTS.js} +67 -57
- package/dist/{orchestrator-ZKBPCHW6.js → orchestrator-77BAP6BC.js} +7633 -7699
- package/dist/panes-7STHOAUJ.js +103 -0
- package/dist/panes-SHAUIRXY.js +60 -0
- package/dist/{paths-DBXMZMDU.js → paths-L7LGY6RN.js} +6 -6
- package/dist/{reset-DD5JGOY3.js → reset-EOLM7GVE.js} +15 -14
- package/dist/resources-74GKTLSF.js +115 -0
- package/dist/{run-QEGNX7FL.js → run-HBAUJNNZ.js} +139 -98
- package/dist/{share-JKD3BQMW.js → share-G3APVLVP.js} +25 -21
- package/dist/{skills-LMQIKDOZ.js → skills-35HHUKCR.js} +37 -27
- package/dist/{skills-eval-I7X2774U.js → skills-eval-QN4HSHDC.js} +80 -73
- package/dist/skills-inventory-J357J34F.js +129 -0
- package/dist/slash-commands-JZZCQA32.js +79 -0
- package/dist/{steer-CF5TDANS.js → steer-XAVHJM22.js} +4 -4
- package/dist/{support-I7LOJLIF.js → support-U7QOWY26.js} +7 -7
- package/dist/{targets-RUSR6B5Z.js → targets-DSM6CY3M.js} +67 -59
- package/dist/{terminal-lease-QYVORFR4.js → terminal-lease-JOPFUVEM.js} +15 -10
- package/dist/tools-MKNWVPBH.js +29 -0
- package/dist/{trace-ODOQIVIW.js → trace-ECQ7TIYZ.js} +194 -7
- package/dist/tui-primitives-K5PASC3O.js +17 -0
- package/dist/{uninstall-ZJF5H5ZN.js → uninstall-N34PCTGJ.js} +6 -8
- package/dist/{upgrade-XANW3FXB.js → upgrade-H7TOM7YL.js} +37 -62
- package/dist/{usage-4H7ZRXQT.js → usage-X52N3IDJ.js} +70 -59
- package/dist/{verifiers-UZXNBZEB.js → verifiers-EJTVVSMA.js} +174 -14
- package/dist/{verify-BVKWTNDL.js → verify-YJL6XET2.js} +12 -11
- package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-MPIFL3LL.js} +3 -4
- package/dist/{wiki-generate-MY7WV2QI.js → wiki-generate-4NDZTQ4B.js} +86 -75
- package/dist/with-panes-OBOBFIIR.js +818 -0
- package/dist/worker/entry.js +131 -91
- package/docs/README.md +3 -2
- package/docs/acp.md +25 -4
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +2 -2
- package/docs/artifact-versions.md +4 -1
- package/docs/built-in-agents.md +40 -32
- package/docs/capacity-and-scheduling.md +43 -5
- package/docs/commands-and-modes.md +39 -4
- package/docs/config-knobs-audit.md +3 -0
- package/docs/configuration-and-targets.md +138 -167
- package/docs/context-engine.md +1 -1
- package/docs/development-pipeline.md +19 -0
- package/docs/dispatch-typed-intent.md +385 -0
- package/docs/documentation-coverage.md +2 -2
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +3 -1
- package/docs/eval-runner.md +1 -1
- package/docs/evals-internal.md +1 -1
- package/docs/evidence-and-memory.md +2 -2
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +3 -1
- package/docs/extensions-and-sharing.md +25 -1
- package/docs/fleet-demo-runbook.md +6 -3
- package/docs/fleet-dispatch.md +30 -7
- package/docs/installation-and-lifecycle.md +16 -3
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +10 -1
- package/docs/observability.md +3 -3
- package/docs/proactive-memory.md +1 -1
- package/docs/prompt-envelope-and-tools.md +1 -1
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +164 -177
- package/docs/safety-model.md +2 -2
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +1 -1
- package/docs/skills-marketplace.md +1 -1
- package/docs/tool-usage.md +18 -8
- package/docs/trace-store.md +16 -11
- package/docs/troubleshooting.md +2 -2
- package/docs/tui-design.md +1 -1
- package/docs/worker-dispatch-mechanics.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 +8 -16
- 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 +8 -4
- package/src/cli/argv.ts +25 -0
- 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 +50 -48
- 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 +156 -0
- package/src/cli/doctor-toolchain.ts +78 -0
- package/src/cli/doctor.ts +34 -1
- package/src/cli/eval-inventory.ts +436 -0
- package/src/cli/eval.ts +13 -0
- package/src/cli/evidence-detail.ts +88 -0
- package/src/cli/evidence-inventory.ts +183 -0
- package/src/cli/evidence.ts +30 -5
- package/src/cli/fleet-decisions.ts +69 -0
- package/src/cli/fleet-inspect.ts +334 -0
- package/src/cli/fleet-preflight.ts +1 -1
- package/src/cli/fleet-verify.ts +133 -0
- package/src/cli/fleet-view.ts +827 -0
- package/src/cli/fleet.ts +154 -40
- package/src/cli/index.ts +14 -2
- package/src/cli/interop-inspect.ts +128 -0
- package/src/cli/interop.ts +34 -0
- package/src/cli/models.ts +3 -3
- package/src/cli/modes/print.ts +1 -1
- package/src/cli/panes.ts +35 -0
- package/src/cli/reset.ts +6 -3
- package/src/cli/run.ts +67 -13
- package/src/cli/share.ts +1 -1
- package/src/cli/skills-eval.ts +11 -11
- package/src/cli/skills-inventory.ts +185 -0
- package/src/cli/skills.ts +16 -13
- package/src/cli/targets.ts +23 -24
- package/src/cli/tools.ts +321 -0
- package/src/cli/trace-inspect.ts +252 -0
- package/src/cli/trace.ts +64 -2
- 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 +347 -0
- package/src/cli/verifiers.ts +9 -0
- 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-events.ts +4 -0
- package/src/core/bus-trace.ts +2 -2
- package/src/core/compile-cache.ts +1 -1
- package/src/core/config.ts +1070 -845
- package/src/core/defaults.ts +342 -463
- 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/response-schema.ts +44 -4
- 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/theme-token-hex.ts +43 -0
- package/src/core/timers.ts +2 -12
- package/src/core/tool-names.ts +2 -1
- package/src/core/xdg.ts +1 -1
- package/src/domains/agents/catalog.ts +2 -12
- package/src/domains/agents/extension.ts +3 -3
- package/src/domains/agents/fleets/build-review.md +0 -3
- package/src/domains/agents/fleets/build-test.md +0 -3
- package/src/domains/agents/registry.ts +7 -7
- package/src/domains/agents/result-contract-filesystem.ts +32 -0
- package/src/domains/agents/result-contract.ts +165 -36
- package/src/domains/agents/spec.ts +0 -11
- package/src/domains/config/classify.ts +37 -46
- 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/admission-error.ts +9 -0
- package/src/domains/dispatch/admission.ts +22 -21
- 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 +23 -6
- package/src/domains/dispatch/code-step.ts +1 -1
- package/src/domains/dispatch/contract.ts +2 -2
- package/src/domains/dispatch/council-topology.ts +398 -0
- package/src/domains/dispatch/extension.ts +287 -111
- package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
- package/src/domains/dispatch/fleet-plan.ts +7 -2
- package/src/domains/dispatch/fleet-preflight.ts +8 -17
- package/src/domains/dispatch/fleet-run.ts +59 -3
- package/src/domains/dispatch/gate-decisions.ts +36 -15
- package/src/domains/dispatch/gate-role-prompts.ts +9 -0
- package/src/domains/dispatch/gate-topology.ts +289 -0
- package/src/domains/dispatch/index.ts +19 -0
- package/src/domains/dispatch/intent-compatibility.ts +330 -0
- package/src/domains/dispatch/intent.ts +85 -1
- 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 +24 -27
- 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-bridge.ts +149 -0
- package/src/domains/dispatch/run-event-journal.ts +599 -0
- package/src/domains/dispatch/state.ts +45 -1
- package/src/domains/dispatch/tool-stats.ts +1 -1
- package/src/domains/dispatch/transport.ts +2 -19
- package/src/domains/dispatch/types.ts +16 -3
- package/src/domains/dispatch/validation.ts +33 -8
- package/src/domains/dispatch/worker-protocol.ts +2 -2
- package/src/domains/eval/artifacts/store.ts +5 -4
- package/src/domains/eval/compare/compare.ts +3 -16
- package/src/domains/eval/compare/thresholds.ts +0 -8
- package/src/domains/eval/execution-provenance.ts +1 -1
- package/src/domains/eval/inventory.ts +113 -0
- 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/serving.ts +31 -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/evidence/store.ts +6 -0
- 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/index.ts +0 -1
- package/src/domains/memory/task-memory-handoff.ts +6 -3
- package/src/domains/memory/task-memory-policy.ts +6 -10
- package/src/domains/memory/task-memory-telemetry.ts +1 -0
- package/src/domains/middleware/index.ts +7 -0
- package/src/domains/middleware/marketplace-offer.ts +339 -0
- package/src/domains/middleware/memory-intervention.ts +33 -21
- package/src/domains/middleware/runtime.ts +2 -2
- package/src/domains/mux/contract.ts +566 -0
- package/src/domains/mux/detect.ts +182 -0
- package/src/domains/mux/dock-controller.ts +365 -0
- package/src/domains/mux/extension.ts +53 -0
- package/src/domains/mux/index.ts +116 -0
- package/src/domains/mux/manifest.ts +6 -0
- package/src/domains/mux/operations.ts +192 -0
- package/src/domains/mux/pane-registry.ts +90 -0
- package/src/domains/mux/protocol.ts +62 -0
- package/src/domains/mux/socket-client.ts +964 -0
- package/src/domains/mux/types.ts +265 -0
- package/src/domains/mux/viewer-command.ts +59 -0
- package/src/domains/mux/yazi/assets/init.lua +2 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
- package/src/domains/mux/yazi/assets/yazi.toml +17 -0
- package/src/domains/mux/yazi/event-stream.ts +182 -0
- package/src/domains/mux/yazi/profile.ts +299 -0
- package/src/domains/mux/yazi/session.ts +251 -0
- package/src/domains/mux/yazi/theme.ts +30 -0
- package/src/domains/observability/cost.ts +21 -0
- package/src/domains/observability/extension.ts +1 -1
- package/src/domains/observability/index.ts +2 -0
- 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 +63 -11
- 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/endpoint-capacity.ts +154 -22
- package/src/domains/providers/endpoint-slots-store.ts +189 -0
- package/src/domains/providers/extension.ts +25 -8
- package/src/domains/providers/index.ts +22 -0
- package/src/domains/providers/knowledge-base-path.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +46 -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/boot-manifest.ts +1 -0
- package/src/domains/providers/runtimes/builtins.ts +2 -0
- 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 +285 -0
- package/src/domains/providers/support.ts +1 -0
- package/src/domains/providers/target-model-cache.ts +124 -0
- 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/index.ts +3 -0
- 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 +72 -13
- package/src/domains/resources/skills/marketplace.ts +21 -2
- package/src/domains/resources/skills/promotion.ts +214 -0
- package/src/domains/safety/action-classifier.ts +6 -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/archive.ts +175 -0
- package/src/domains/toolchain/contract.ts +28 -0
- package/src/domains/toolchain/extension.ts +47 -0
- package/src/domains/toolchain/index.ts +39 -0
- package/src/domains/toolchain/install.ts +327 -0
- package/src/domains/toolchain/manifest.ts +8 -0
- package/src/domains/toolchain/paths.ts +34 -0
- package/src/domains/toolchain/registry.ts +265 -0
- package/src/domains/toolchain/remove.ts +218 -0
- package/src/domains/toolchain/resolve.ts +182 -0
- package/src/domains/toolchain/types.ts +113 -0
- package/src/domains/toolchain/version.ts +88 -0
- package/src/engine/acp/adapter.ts +3 -3
- package/src/engine/acp/event-mapper.ts +3 -3
- package/src/engine/acp/server.ts +440 -96
- package/src/engine/acp/tool-mediator.ts +2 -2
- package/src/engine/acp/types.ts +20 -2
- 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 +87 -0
- package/src/engine/claude/sdk-runtime.ts +25 -17
- 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 +21 -0
- package/src/engine/tui.ts +1 -0
- package/src/engine/worker-events.ts +6 -6
- package/src/engine/worker-runtime.ts +16 -26
- package/src/entry/boot-options.ts +2 -0
- package/src/entry/orchestrator.ts +207 -90
- package/src/entry/panes-activation.ts +31 -0
- package/src/entry/with-panes.ts +20 -0
- 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 +2 -1
- package/src/interactive/cost-overlay.ts +3 -1
- package/src/interactive/council-grid.ts +3 -5
- package/src/interactive/council.ts +11 -0
- package/src/interactive/dispatch-board.ts +56 -49
- 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 +229 -62
- package/src/interactive/interactive-event-projection.ts +1 -1
- package/src/interactive/interactive-input-runtime.ts +9 -2
- package/src/interactive/interactive-presentation.ts +21 -16
- package/src/interactive/interactive-shell.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +99 -23
- 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 +3 -2
- package/src/interactive/modal-marker.ts +151 -0
- package/src/interactive/mutation-preview.ts +1 -1
- package/src/interactive/mux-bridge.ts +214 -0
- package/src/interactive/overlay-frame.ts +62 -14
- package/src/interactive/overlay-general-openers.ts +7 -2
- package/src/interactive/overlay-key-routing.ts +21 -10
- package/src/interactive/overlay-lifecycle.ts +20 -4
- package/src/interactive/overlay-model-selectors.ts +43 -6
- package/src/interactive/overlay-permission-lifecycle.ts +90 -22
- package/src/interactive/overlay-transitions.ts +18 -4
- package/src/interactive/overlays/agents.ts +3 -2
- package/src/interactive/overlays/ask-user.ts +161 -41
- package/src/interactive/overlays/auth-dialog.ts +1 -0
- package/src/interactive/overlays/context-reset.ts +29 -4
- package/src/interactive/overlays/cwd-fallback.ts +29 -4
- package/src/interactive/overlays/decisions.ts +15 -13
- package/src/interactive/overlays/extensions.ts +1 -0
- package/src/interactive/overlays/fleet-run-approval.ts +4 -3
- package/src/interactive/overlays/handoff-review.ts +3 -2
- package/src/interactive/overlays/help-reference.ts +2 -0
- package/src/interactive/overlays/interop.ts +2 -1
- package/src/interactive/overlays/library-install-confirm.ts +2 -1
- package/src/interactive/overlays/library-tabs.ts +28 -0
- package/src/interactive/overlays/list-overlay.ts +10 -1
- package/src/interactive/overlays/message-picker.ts +2 -1
- package/src/interactive/overlays/model-scope.ts +86 -0
- package/src/interactive/overlays/model-selector.ts +40 -31
- package/src/interactive/overlays/prompts.ts +11 -4
- package/src/interactive/overlays/session-selector.ts +3 -2
- package/src/interactive/overlays/settings-sections.ts +30 -0
- package/src/interactive/overlays/settings.ts +849 -268
- package/src/interactive/overlays/side-question.ts +3 -2
- package/src/interactive/overlays/skills-hub.ts +11 -19
- package/src/interactive/overlays/tree-selector.ts +3 -2
- package/src/interactive/pane-policy.ts +46 -0
- package/src/interactive/panes-runtime.ts +318 -0
- package/src/interactive/permission-overlay.ts +2 -2
- package/src/interactive/renderers/compaction-summary.ts +29 -0
- package/src/interactive/renderers/retry-status.ts +12 -4
- package/src/interactive/renderers/tool-execution.ts +4 -4
- package/src/interactive/renderers/worker-entry.ts +122 -14
- package/src/interactive/session-transcript.ts +3 -3
- package/src/interactive/slash-autocomplete.ts +454 -165
- package/src/interactive/slash-commands.ts +521 -189
- 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 +21 -13
- package/src/interactive/terminal-lease.ts +6 -7
- package/src/interactive/theme/tokens.ts +3 -14
- package/src/interactive/turn-context.ts +58 -13
- 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 +120 -9
- package/src/interactive/view/view-overlay.ts +14 -10
- package/src/interactive/watch-pane.ts +180 -0
- package/src/interactive/welcome-dashboard.ts +15 -15
- package/src/interactive/worker-progress.ts +11 -5
- package/src/interactive/worker-receipts.ts +20 -2
- package/src/interactive/worker-stream.ts +6 -4
- package/src/interactive/yazi-bridge.ts +451 -0
- package/src/tools/ask-user.ts +3 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/bootstrap.ts +26 -2
- package/src/tools/builtin-tool-catalog.ts +16 -1
- package/src/tools/compete-worktrees.ts +108 -17
- package/src/tools/context/index.ts +15 -1
- package/src/tools/core-bootstrap.ts +2 -1
- package/src/tools/dispatch-admission.ts +18 -5
- package/src/tools/dispatch-arguments.ts +21 -21
- package/src/tools/dispatch-plan.ts +0 -11
- package/src/tools/dispatch-run-events.ts +145 -28
- package/src/tools/dispatch-runner.ts +40 -13
- package/src/tools/dispatch-types.ts +15 -3
- package/src/tools/dispatch.ts +2 -2
- package/src/tools/executables.ts +17 -14
- package/src/tools/find.ts +1 -6
- package/src/tools/monitor.ts +4 -4
- package/src/tools/observation.ts +54 -4
- package/src/tools/observers.ts +0 -33
- package/src/tools/panes-surface.ts +38 -0
- package/src/tools/panes.ts +112 -0
- package/src/tools/policy.ts +10 -1
- package/src/tools/presentation.ts +1 -0
- 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-D73KXYPF.js +0 -37
- package/dist/chunk-MLOK6ZOS.js +0 -2888
- package/dist/chunk-PNY46YEY.js +0 -1581
- package/dist/chunk-XDOQXGFO.js +0 -515
- package/dist/chunk-YKOFT37S.js +0 -279
- package/dist/clio-LT5V7SSZ.js +0 -26
- package/dist/configure-2WYWSCSD.js +0 -49
- package/dist/doctor-TWBWFK5V.js +0 -165
- 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
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { accessSync, constants } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { readSettings } from "../core/config.js";
|
|
4
|
+
import { resolveClioDirs } from "../core/xdg.js";
|
|
5
|
+
import type { DoctorFinding } from "../domains/lifecycle/doctor.js";
|
|
6
|
+
import { detectMux, MUX_METHOD_MIN_PROTOCOL, resolveSocketCandidates } from "../domains/mux/index.js";
|
|
7
|
+
import { describeResolution, findPinnedTool, toolStatus } from "../domains/toolchain/index.js";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The panes section of `clio-coder doctor`.
|
|
11
|
+
*
|
|
12
|
+
* Six rows, in the order an operator debugs them: what mode the pane layer
|
|
13
|
+
* resolved to, whether the socket answered, whether the server is new enough
|
|
14
|
+
* for the methods phase 3 uses, where the pane host binary resolves, what the
|
|
15
|
+
* boot layout composes, and whether the journal directory the viewer reads is
|
|
16
|
+
* writable.
|
|
17
|
+
*
|
|
18
|
+
* No row is an error. Panes are optional: an operator who never wanted them has
|
|
19
|
+
* a healthy install without them, and doctor's exit code answers "is this
|
|
20
|
+
* install healthy". The rows that would be errors elsewhere are warnings that
|
|
21
|
+
* name the next step instead.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
const PANE_HOST_TOOL_ID = "herdr";
|
|
25
|
+
|
|
26
|
+
/** Highest protocol any method Clio drives requires, for the version row. */
|
|
27
|
+
const REQUIRED_PROTOCOL = Math.max(...Object.values(MUX_METHOD_MIN_PROTOCOL));
|
|
28
|
+
|
|
29
|
+
function journalWritabilityFinding(root = join(resolveClioDirs().state, "runs")): DoctorFinding {
|
|
30
|
+
try {
|
|
31
|
+
accessSync(root, constants.W_OK);
|
|
32
|
+
return { ok: true, name: "panes journal dir", detail: `${root} is writable` };
|
|
33
|
+
} catch (error) {
|
|
34
|
+
return {
|
|
35
|
+
ok: true,
|
|
36
|
+
level: "warn",
|
|
37
|
+
name: "panes journal dir",
|
|
38
|
+
detail: `${root} is absent or not writable (${error instanceof Error ? error.message : String(error)}); \`clio-coder fleet view\` will have no transcript to follow`,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export async function panesFindings(env: NodeJS.ProcessEnv = process.env): Promise<DoctorFinding[]> {
|
|
44
|
+
let enabled: "auto" | "embedded" | "off" = "off";
|
|
45
|
+
let layoutRow: DoctorFinding = {
|
|
46
|
+
ok: true,
|
|
47
|
+
name: "panes layout",
|
|
48
|
+
detail: "off",
|
|
49
|
+
};
|
|
50
|
+
try {
|
|
51
|
+
const panes = readSettings().interface.panes;
|
|
52
|
+
enabled = panes.enabled;
|
|
53
|
+
if (panes.layout !== "off") {
|
|
54
|
+
layoutRow = {
|
|
55
|
+
ok: true,
|
|
56
|
+
name: "panes layout",
|
|
57
|
+
detail: `${panes.layout} at boot (workers dock ${(panes.workers.ratio * 100).toFixed(0)}%, files dock ${(panes.files.ratio * 100).toFixed(0)}%)`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
} catch {
|
|
61
|
+
// An unreadable settings file is already reported by the settings row;
|
|
62
|
+
// this section answers on the shipped default (off) rather than throwing.
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Inactive by choice is a different answer from unavailable. With the
|
|
66
|
+
// setting off, detection is skipped the same way the boot skips it, and the
|
|
67
|
+
// row names the two ways to turn the extension on instead of warning about
|
|
68
|
+
// a socket nobody asked for.
|
|
69
|
+
if (enabled === "off") {
|
|
70
|
+
return [
|
|
71
|
+
{
|
|
72
|
+
ok: true,
|
|
73
|
+
name: "panes mode",
|
|
74
|
+
detail: "off by choice",
|
|
75
|
+
},
|
|
76
|
+
layoutRow,
|
|
77
|
+
];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Detection is the same ladder the interactive boot runs, so this row is the
|
|
81
|
+
// answer that boot would get. It opens a socket and nothing else: no file is
|
|
82
|
+
// created and no pane is touched.
|
|
83
|
+
const { detection, client } = await detectMux({ enabled, env });
|
|
84
|
+
const snapshot = client ? await client.snapshot().catch(() => null) : null;
|
|
85
|
+
await client?.close().catch(() => undefined);
|
|
86
|
+
|
|
87
|
+
const candidates = detection.candidates.length > 0 ? detection.candidates : resolveSocketCandidates(env);
|
|
88
|
+
const findings: DoctorFinding[] = [
|
|
89
|
+
{
|
|
90
|
+
ok: true,
|
|
91
|
+
level: detection.mode === "none" ? "warn" : "ok",
|
|
92
|
+
name: "panes mode",
|
|
93
|
+
detail: `${detection.mode} (panes.enabled=${enabled}); ${detection.reason}`,
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
ok: true,
|
|
97
|
+
level: detection.socketPath === null ? "warn" : "ok",
|
|
98
|
+
name: "panes socket",
|
|
99
|
+
detail:
|
|
100
|
+
detection.socketPath === null
|
|
101
|
+
? `no socket answered; tried ${candidates.length > 0 ? candidates.join(", ") : "no candidates"}`
|
|
102
|
+
: `${detection.socketPath} answered a ping`,
|
|
103
|
+
},
|
|
104
|
+
];
|
|
105
|
+
|
|
106
|
+
const server = detection.server;
|
|
107
|
+
findings.push({
|
|
108
|
+
ok: true,
|
|
109
|
+
level: server === null || server.protocol < REQUIRED_PROTOCOL ? "warn" : "ok",
|
|
110
|
+
name: "panes protocol",
|
|
111
|
+
detail:
|
|
112
|
+
server === null
|
|
113
|
+
? `unknown; Clio's optional methods need protocol ${REQUIRED_PROTOCOL} or newer`
|
|
114
|
+
: `server ${server.version}, protocol ${server.protocol}; Clio's optional methods need ${REQUIRED_PROTOCOL} (${server.protocol >= REQUIRED_PROTOCOL ? "satisfied" : "toasts and agent focus fall back"})`,
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
const entry = findPinnedTool(PANE_HOST_TOOL_ID);
|
|
118
|
+
findings.push(
|
|
119
|
+
entry === null
|
|
120
|
+
? {
|
|
121
|
+
ok: true,
|
|
122
|
+
level: "warn",
|
|
123
|
+
name: "panes binary",
|
|
124
|
+
detail: `${PANE_HOST_TOOL_ID} is not in the pinned tool registry`,
|
|
125
|
+
}
|
|
126
|
+
: {
|
|
127
|
+
ok: true,
|
|
128
|
+
level: toolStatus(entry).resolution.source === "none" ? "warn" : "ok",
|
|
129
|
+
name: "panes binary",
|
|
130
|
+
detail: describeResolution(toolStatus(entry)),
|
|
131
|
+
},
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
findings.push(layoutRow);
|
|
135
|
+
const legacyOwnedPanes =
|
|
136
|
+
snapshot?.panes.filter(
|
|
137
|
+
(pane) => pane.tokens.clio_owner === "clio:mux" && pane.tokens.clio_coder_owner !== "clio-coder:mux",
|
|
138
|
+
).length ?? 0;
|
|
139
|
+
const staleWatchTitles =
|
|
140
|
+
snapshot?.panes.filter(
|
|
141
|
+
(pane) =>
|
|
142
|
+
(pane.title === "clio watch" || pane.label === "clio watch") &&
|
|
143
|
+
(pane.tokens.clio_coder_owner === "clio-coder:mux" || pane.tokens.clio_owner === "clio:mux"),
|
|
144
|
+
).length ?? 0;
|
|
145
|
+
findings.push({
|
|
146
|
+
ok: true,
|
|
147
|
+
level: legacyOwnedPanes > 0 || staleWatchTitles > 0 ? "warn" : "ok",
|
|
148
|
+
name: "naming panes",
|
|
149
|
+
detail:
|
|
150
|
+
legacyOwnedPanes > 0 || staleWatchTitles > 0
|
|
151
|
+
? `${legacyOwnedPanes} panes carry only the legacy clio_owner=clio:mux token; ${staleWatchTitles} owned panes retain the stale 'clio watch' title; quit/cleanup recognizes both token schemes`
|
|
152
|
+
: "no legacy Clio Coder pane ownership tokens or watch titles found",
|
|
153
|
+
});
|
|
154
|
+
findings.push(journalWritabilityFinding());
|
|
155
|
+
return findings;
|
|
156
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { DoctorFinding } from "../domains/lifecycle/doctor.js";
|
|
2
|
+
import {
|
|
3
|
+
describeYaziProfile,
|
|
4
|
+
inspectCurrentYaziProfile,
|
|
5
|
+
userYaziConfigDir,
|
|
6
|
+
yaziProfileDir,
|
|
7
|
+
} from "../domains/mux/index.js";
|
|
8
|
+
import { describeResolution, toolStatuses } from "../domains/toolchain/index.js";
|
|
9
|
+
|
|
10
|
+
export interface ToolchainFindingOptions {
|
|
11
|
+
panesEnabled?: boolean;
|
|
12
|
+
filesEnabled?: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function yaziProfileFinding(enabled: boolean): DoctorFinding {
|
|
16
|
+
if (!enabled) {
|
|
17
|
+
return {
|
|
18
|
+
ok: true,
|
|
19
|
+
name: "yazi managed profile",
|
|
20
|
+
detail: "disabled by settings",
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const profile = inspectCurrentYaziProfile();
|
|
25
|
+
return {
|
|
26
|
+
ok: true,
|
|
27
|
+
name: "yazi managed profile",
|
|
28
|
+
detail: describeYaziProfile(profile),
|
|
29
|
+
level: profile.state === "current" ? "ok" : "warn",
|
|
30
|
+
};
|
|
31
|
+
} catch (error) {
|
|
32
|
+
return {
|
|
33
|
+
ok: true,
|
|
34
|
+
name: "yazi managed profile",
|
|
35
|
+
level: "warn",
|
|
36
|
+
detail: `${yaziProfileDir()} could not be inspected (${error instanceof Error ? error.message : String(error)}); user config ${userYaziConfigDir()} is separate and untouched`,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* One row per pinned external tool: where it resolves, and how the version
|
|
43
|
+
* found compares to the pin.
|
|
44
|
+
*
|
|
45
|
+
* Every one of these tools is optional, so no row is ever an error. A missing
|
|
46
|
+
* tool is a WARN with the command that installs it, because doctor's exit code
|
|
47
|
+
* answers "is this Clio install healthy", and an operator who never wanted
|
|
48
|
+
* panes has a healthy install without them.
|
|
49
|
+
*
|
|
50
|
+
* A PATH copy Clio rejected for being below the registry floor is never
|
|
51
|
+
* reported as an absent one. The row says which binary was found, what version
|
|
52
|
+
* it reported, and which floor it missed, and adds the install command only
|
|
53
|
+
* when there is no vendored copy already answering for the tool. Doctor is the
|
|
54
|
+
* surface an operator reaches for when a tool they installed themselves is not
|
|
55
|
+
* being used, and a row that only said "not found" would send them looking for
|
|
56
|
+
* a binary that is right there on their PATH.
|
|
57
|
+
*/
|
|
58
|
+
export function toolchainFindings(options: ToolchainFindingOptions = {}): DoctorFinding[] {
|
|
59
|
+
const panesEnabled = options.panesEnabled ?? true;
|
|
60
|
+
const filesEnabled = options.filesEnabled ?? true;
|
|
61
|
+
const tools = toolStatuses().map((status) => ({
|
|
62
|
+
ok: true,
|
|
63
|
+
name: `external tool ${status.id}`,
|
|
64
|
+
// Active integrations share the tools-status resolution sentence. Disabled
|
|
65
|
+
// experimental integrations stay neutral and do not advertise setup work.
|
|
66
|
+
detail:
|
|
67
|
+
(status.id === "herdr" && !panesEnabled) || (status.id === "yazi" && !filesEnabled)
|
|
68
|
+
? "experimental integration disabled by settings"
|
|
69
|
+
: describeResolution(status),
|
|
70
|
+
level:
|
|
71
|
+
(status.id === "herdr" && !panesEnabled) || (status.id === "yazi" && !filesEnabled)
|
|
72
|
+
? ("ok" as const)
|
|
73
|
+
: status.resolution.source === "none"
|
|
74
|
+
? ("warn" as const)
|
|
75
|
+
: ("ok" as const),
|
|
76
|
+
}));
|
|
77
|
+
return [...tools, yaziProfileFinding(filesEnabled)];
|
|
78
|
+
}
|
package/src/cli/doctor.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { readSettings } from "../core/config.js";
|
|
1
2
|
import {
|
|
2
3
|
formatDoctorReport,
|
|
3
4
|
isUninitializedHome,
|
|
@@ -7,7 +8,10 @@ import {
|
|
|
7
8
|
runDoctorModelChecks,
|
|
8
9
|
runDoctorRuntimeChecks,
|
|
9
10
|
} from "../domains/lifecycle/doctor.js";
|
|
11
|
+
import { namingFootprintFindings } from "./doctor-naming.js";
|
|
12
|
+
import { panesFindings } from "./doctor-panes.js";
|
|
10
13
|
import { stateStorageFinding } from "./doctor-state-size.js";
|
|
14
|
+
import { toolchainFindings } from "./doctor-toolchain.js";
|
|
11
15
|
import { printError } from "./shared.js";
|
|
12
16
|
|
|
13
17
|
const HELP = `clio-coder doctor [--fix] [--json]
|
|
@@ -36,6 +40,16 @@ export async function runDoctorCommand(args: ReadonlyArray<string> = []): Promis
|
|
|
36
40
|
// gets every check on the home it just built.
|
|
37
41
|
const untouched = !fix && isUninitializedHome();
|
|
38
42
|
const findings = runDoctor({ fix });
|
|
43
|
+
let panesEnabled = false;
|
|
44
|
+
let filesEnabled = false;
|
|
45
|
+
try {
|
|
46
|
+
const panes = readSettings().interface.panes;
|
|
47
|
+
panesEnabled = panes.enabled !== "off";
|
|
48
|
+
filesEnabled = panesEnabled && panes.files.enabled;
|
|
49
|
+
} catch {
|
|
50
|
+
// The settings finding already reports an unreadable document. Optional
|
|
51
|
+
// integrations stay inactive rather than adding secondary warnings.
|
|
52
|
+
}
|
|
39
53
|
const storageChecks = untouched ? [] : [stateStorageFinding()];
|
|
40
54
|
const runtimeChecks = await runDoctorRuntimeChecks();
|
|
41
55
|
// Every model pointer is checked against what its target advertises, so a
|
|
@@ -49,7 +63,26 @@ export async function runDoctorCommand(args: ReadonlyArray<string> = []): Promis
|
|
|
49
63
|
// Fleet preflight probes each configured node over SSH and persists the
|
|
50
64
|
// per-node eligibility verdicts dispatch placement enforces.
|
|
51
65
|
const fleetChecks = untouched ? [] : await runDoctorFleetChecks();
|
|
52
|
-
|
|
66
|
+
// Resolution reads PATH and the vendor root and creates nothing, but on an
|
|
67
|
+
// untouched home there is no vendor root to look at and the answer would be
|
|
68
|
+
// "none" for every row regardless, so the sweep stays with the others.
|
|
69
|
+
const toolChecks = untouched ? [] : toolchainFindings({ panesEnabled, filesEnabled });
|
|
70
|
+
// The pane sweep pings a socket and reads PATH; it creates nothing except the
|
|
71
|
+
// journal directory it is asked about, which is inside the state root doctor
|
|
72
|
+
// has already agreed not to build on an untouched home.
|
|
73
|
+
const paneChecks = untouched ? [] : await panesFindings();
|
|
74
|
+
const namingChecks = namingFootprintFindings({ fix, yaziEnabled: filesEnabled });
|
|
75
|
+
const all = [
|
|
76
|
+
...findings,
|
|
77
|
+
...storageChecks,
|
|
78
|
+
...runtimeChecks,
|
|
79
|
+
...modelChecks,
|
|
80
|
+
...interopChecks,
|
|
81
|
+
...fleetChecks,
|
|
82
|
+
...toolChecks,
|
|
83
|
+
...paneChecks,
|
|
84
|
+
...namingChecks,
|
|
85
|
+
];
|
|
53
86
|
const ok = all.every((f) => f.ok);
|
|
54
87
|
if (json) {
|
|
55
88
|
process.stdout.write(`${JSON.stringify({ ok, fix, findings: all }, null, 2)}\n`);
|