@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,59 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
|
|
3
|
+
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
4
|
+
import { settingsPath, withSettingsLock } from "../../../core/config.js";
|
|
5
|
+
import { safeResourceWrite } from "../../../core/safe-resource-write.js";
|
|
6
|
+
import type { Migration } from "./index.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* `panes.agents` and `panes.keepFailed` are retired, and the schema refuses
|
|
10
|
+
* them by name rather than ignoring them. That refusal is right for a file
|
|
11
|
+
* written today and wrong as an upgrade experience: an operator whose settings
|
|
12
|
+
* predate 0.4.0 did nothing but keep a key two releases honored, and the first
|
|
13
|
+
* thing the new version would do is refuse to start.
|
|
14
|
+
*
|
|
15
|
+
* This is the sanctioned exception the settings lock exists for. It cannot go
|
|
16
|
+
* through `readSettings` or `updateSettings`, because those run the strict
|
|
17
|
+
* validator that rejects exactly the keys being removed, so it reads and writes
|
|
18
|
+
* the raw document under the same lock every other writer takes.
|
|
19
|
+
*/
|
|
20
|
+
const RETIRED_PANE_KEYS = ["agents", "keepFailed"] as const;
|
|
21
|
+
|
|
22
|
+
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
23
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const migration: Migration = {
|
|
27
|
+
id: "2026-09-01-retire-panes-knobs",
|
|
28
|
+
async up(): Promise<void> {
|
|
29
|
+
withSettingsLock(() => {
|
|
30
|
+
const path = settingsPath();
|
|
31
|
+
if (!existsSync(path)) return;
|
|
32
|
+
let parsed: unknown;
|
|
33
|
+
try {
|
|
34
|
+
parsed = parseYaml(readFileSync(path, "utf8"));
|
|
35
|
+
} catch {
|
|
36
|
+
// A document this cannot parse is one it must not rewrite: writing a
|
|
37
|
+
// re-serialized guess over an operator's malformed or transiently
|
|
38
|
+
// unreadable file would destroy the original they still have to fix.
|
|
39
|
+
// The strict reader already names the syntax error on the next boot.
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (!isPlainObject(parsed)) return;
|
|
43
|
+
const panes = parsed.panes;
|
|
44
|
+
if (!isPlainObject(panes)) return;
|
|
45
|
+
const present = RETIRED_PANE_KEYS.filter((key) => key in panes);
|
|
46
|
+
// Rewriting is not free: the document is re-serialized from the parse, so
|
|
47
|
+
// comments and formatting the operator wrote do not survive. A file that
|
|
48
|
+
// never named these keys must therefore never be touched.
|
|
49
|
+
if (present.length === 0) return;
|
|
50
|
+
for (const key of present) delete panes[key];
|
|
51
|
+
// A `panes` map that held nothing but the retired knobs is left naming no
|
|
52
|
+
// setting at all, so it goes with them rather than staying as `panes: {}`.
|
|
53
|
+
if (Object.keys(panes).length === 0) delete parsed.panes;
|
|
54
|
+
safeResourceWrite(path, stringifyYaml(parsed), { encoding: "utf8", mode: 0o644 });
|
|
55
|
+
});
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export default migration;
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
|
|
4
|
+
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
5
|
+
import { SettingsValidationError, settingsPath, validateSettings, withSettingsLock } from "../../../core/config.js";
|
|
6
|
+
import { safeResourceWrite } from "../../../core/safe-resource-write.js";
|
|
7
|
+
import type { Migration } from "./index.js";
|
|
8
|
+
|
|
9
|
+
export const SETTINGS_V2_MIGRATION_ID = "2026-09-01-settings-v2";
|
|
10
|
+
|
|
11
|
+
export interface SettingsV2MigrationReport {
|
|
12
|
+
fromVersion: 1;
|
|
13
|
+
toVersion: 2;
|
|
14
|
+
backupPath: string;
|
|
15
|
+
moved: string[];
|
|
16
|
+
dropped: string[];
|
|
17
|
+
notes: string[];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export class SettingsV2CollisionError extends Error {
|
|
21
|
+
readonly collisions: ReadonlyArray<string>;
|
|
22
|
+
|
|
23
|
+
constructor(collisions: ReadonlyArray<string>) {
|
|
24
|
+
super(
|
|
25
|
+
"settings v1 to v2 migration refused source/destination collisions:\n" +
|
|
26
|
+
collisions.map((collision) => ` ${collision}`).join("\n") +
|
|
27
|
+
"\nThe original settings.yaml was left untouched. Remove either each v1 source or its v2 destination, then re-run `clio-coder upgrade`.",
|
|
28
|
+
);
|
|
29
|
+
this.name = "SettingsV2CollisionError";
|
|
30
|
+
this.collisions = collisions;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
35
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function cloneValue<T>(value: T): T {
|
|
39
|
+
return structuredClone(value);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function segments(path: string): string[] {
|
|
43
|
+
return path.split(".");
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function hasPath(root: Record<string, unknown>, path: string): boolean {
|
|
47
|
+
let current: unknown = root;
|
|
48
|
+
for (const segment of segments(path)) {
|
|
49
|
+
if (!isPlainObject(current) || !(segment in current)) return false;
|
|
50
|
+
current = current[segment];
|
|
51
|
+
}
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function getPath(root: Record<string, unknown>, path: string): unknown {
|
|
56
|
+
let current: unknown = root;
|
|
57
|
+
for (const segment of segments(path)) {
|
|
58
|
+
if (!isPlainObject(current)) return undefined;
|
|
59
|
+
current = current[segment];
|
|
60
|
+
}
|
|
61
|
+
return current;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function setPath(root: Record<string, unknown>, path: string, value: unknown): void {
|
|
65
|
+
const parts = segments(path);
|
|
66
|
+
let current = root;
|
|
67
|
+
for (const segment of parts.slice(0, -1)) {
|
|
68
|
+
const child = current[segment];
|
|
69
|
+
if (isPlainObject(child)) current = child;
|
|
70
|
+
else {
|
|
71
|
+
const created: Record<string, unknown> = {};
|
|
72
|
+
current[segment] = created;
|
|
73
|
+
current = created;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const leaf = parts.at(-1);
|
|
77
|
+
if (leaf !== undefined) current[leaf] = value;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function deletePath(root: Record<string, unknown>, path: string): boolean {
|
|
81
|
+
const parts = segments(path);
|
|
82
|
+
const parents: Array<{ parent: Record<string, unknown>; key: string }> = [];
|
|
83
|
+
let current = root;
|
|
84
|
+
for (const segment of parts.slice(0, -1)) {
|
|
85
|
+
const child = current[segment];
|
|
86
|
+
if (!isPlainObject(child)) return false;
|
|
87
|
+
parents.push({ parent: current, key: segment });
|
|
88
|
+
current = child;
|
|
89
|
+
}
|
|
90
|
+
const leaf = parts.at(-1);
|
|
91
|
+
if (leaf === undefined || !(leaf in current)) return false;
|
|
92
|
+
delete current[leaf];
|
|
93
|
+
for (let index = parents.length - 1; index >= 0; index -= 1) {
|
|
94
|
+
const entry = parents[index];
|
|
95
|
+
if (entry === undefined) continue;
|
|
96
|
+
const child = entry.parent[entry.key];
|
|
97
|
+
if (isPlainObject(child) && Object.keys(child).length === 0) delete entry.parent[entry.key];
|
|
98
|
+
else break;
|
|
99
|
+
}
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export interface SettingsV2DocumentTransform {
|
|
104
|
+
document: Record<string, unknown>;
|
|
105
|
+
moved: string[];
|
|
106
|
+
dropped: string[];
|
|
107
|
+
notes: string[];
|
|
108
|
+
collisions: string[];
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
type ValueTransform = (value: unknown, transform: SettingsV2DocumentTransform) => unknown;
|
|
112
|
+
|
|
113
|
+
function destinationConflict(root: Record<string, unknown>, path: string): string | null {
|
|
114
|
+
const parts = segments(path);
|
|
115
|
+
let current: Record<string, unknown> = root;
|
|
116
|
+
let traversed = "";
|
|
117
|
+
for (let index = 0; index < parts.length; index += 1) {
|
|
118
|
+
const segment = parts[index];
|
|
119
|
+
if (segment === undefined) return null;
|
|
120
|
+
traversed = traversed ? `${traversed}.${segment}` : segment;
|
|
121
|
+
if (!(segment in current)) return null;
|
|
122
|
+
const child = current[segment];
|
|
123
|
+
if (index === parts.length - 1) return traversed;
|
|
124
|
+
if (!isPlainObject(child)) return traversed;
|
|
125
|
+
current = child;
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function move(
|
|
131
|
+
transform: SettingsV2DocumentTransform,
|
|
132
|
+
from: string,
|
|
133
|
+
to: string,
|
|
134
|
+
valueTransform: ValueTransform = cloneValue,
|
|
135
|
+
): void {
|
|
136
|
+
if (!hasPath(transform.document, from)) return;
|
|
137
|
+
const conflict = destinationConflict(transform.document, to);
|
|
138
|
+
if (conflict !== null) {
|
|
139
|
+
transform.collisions.push(`${from} collides with ${conflict}`);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
setPath(transform.document, to, valueTransform(getPath(transform.document, from), transform));
|
|
143
|
+
deletePath(transform.document, from);
|
|
144
|
+
transform.moved.push(`${from} -> ${to}`);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function drop(transform: SettingsV2DocumentTransform, path: string, reason: string): void {
|
|
148
|
+
if (!deletePath(transform.document, path)) return;
|
|
149
|
+
transform.dropped.push(`${path}: ${reason}`);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function migrateRosters(value: unknown, transform: SettingsV2DocumentTransform): unknown {
|
|
153
|
+
const rosters = cloneValue(value);
|
|
154
|
+
if (!isPlainObject(rosters)) return rosters;
|
|
155
|
+
for (const [rosterName, roster] of Object.entries(rosters)) {
|
|
156
|
+
if (!isPlainObject(roster) || !Array.isArray(roster.members)) continue;
|
|
157
|
+
for (let index = 0; index < roster.members.length; index += 1) {
|
|
158
|
+
const member = roster.members[index];
|
|
159
|
+
if (!isPlainObject(member) || !("thinking" in member)) continue;
|
|
160
|
+
const from = `workers.rosters.${rosterName}.members[${index}].thinking`;
|
|
161
|
+
const to = `fleet.rosters.${rosterName}.members[${index}].thinkingLevel`;
|
|
162
|
+
if ("thinkingLevel" in member) {
|
|
163
|
+
transform.collisions.push(`${from} collides with ${to}`);
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
member.thinkingLevel = member.thinking;
|
|
167
|
+
delete member.thinking;
|
|
168
|
+
transform.moved.push(`${from} -> ${to}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return rosters;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function migrateFleetNodeAliases(transform: SettingsV2DocumentTransform): void {
|
|
175
|
+
const nodes = getPath(transform.document, "fleet.nodes");
|
|
176
|
+
if (!Array.isArray(nodes)) return;
|
|
177
|
+
for (let index = 0; index < nodes.length; index += 1) {
|
|
178
|
+
const node = nodes[index];
|
|
179
|
+
if (!isPlainObject(node) || !("clioEntry" in node)) continue;
|
|
180
|
+
const from = `fleet.nodes[${index}].clioEntry`;
|
|
181
|
+
const to = `fleet.nodes[${index}].clioCoderEntry`;
|
|
182
|
+
if ("clioCoderEntry" in node) {
|
|
183
|
+
delete node.clioEntry;
|
|
184
|
+
transform.dropped.push(`${from}: discarded because canonical ${to} was also present and wins`);
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
node.clioCoderEntry = node.clioEntry;
|
|
188
|
+
delete node.clioEntry;
|
|
189
|
+
transform.moved.push(`${from} -> ${to}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/** Pure in-memory transformation used by the lifecycle migration and archive import. */
|
|
194
|
+
export function migrateSettingsV1Document(raw: unknown): SettingsV2DocumentTransform {
|
|
195
|
+
if (!isPlainObject(raw)) throw new Error("settings v1 to v2 migration expected a YAML map at the document root");
|
|
196
|
+
const version = raw.version;
|
|
197
|
+
if (version !== undefined && version !== 1) {
|
|
198
|
+
throw new Error(`settings v1 to v2 migration expected version 1, got ${String(version)}`);
|
|
199
|
+
}
|
|
200
|
+
const transform: SettingsV2DocumentTransform = {
|
|
201
|
+
document: cloneValue(raw),
|
|
202
|
+
moved: [],
|
|
203
|
+
dropped: [],
|
|
204
|
+
notes: version === undefined ? ["version was absent; interpreted using the pre-v2 schema"] : [],
|
|
205
|
+
collisions: [],
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
const moves: ReadonlyArray<readonly [string, string, ValueTransform?]> = [
|
|
209
|
+
["autonomy", "safety.autonomy"],
|
|
210
|
+
["orchestrator.target", "chat.target"],
|
|
211
|
+
["orchestrator.model", "chat.model"],
|
|
212
|
+
["orchestrator.thinkingLevel", "chat.thinkingLevel"],
|
|
213
|
+
["scope", "chat.modelPicker.cycleSet"],
|
|
214
|
+
["modelSelector.favorites", "chat.modelPicker.favorites"],
|
|
215
|
+
["modelSelector.recentLimit", "chat.modelPicker.recentLimit"],
|
|
216
|
+
["defaults.maxTokens", "chat.maxOutputTokens"],
|
|
217
|
+
["prewarm.enabled", "chat.prewarm"],
|
|
218
|
+
["retry", "chat.retry"],
|
|
219
|
+
["workers.default", "fleet.default"],
|
|
220
|
+
["workers.profiles", "fleet.profiles"],
|
|
221
|
+
["workers.rosters", "fleet.rosters", migrateRosters],
|
|
222
|
+
["workers.agentBindings", "fleet.agentProfiles"],
|
|
223
|
+
["routing.activeRoles", "fleet.adaptiveRouting.roles"],
|
|
224
|
+
["routing.activePostures", "fleet.adaptiveRouting.postures"],
|
|
225
|
+
["routing.agentAutomation.activeAgentRoles", "fleet.adaptiveRouting.agentRoles"],
|
|
226
|
+
["budget.concurrency", "fleet.concurrency"],
|
|
227
|
+
["workers.maxRetries", "fleet.retry.maxRetries"],
|
|
228
|
+
["workers.resilienceCooldownMs", "fleet.retry.routeCooldownMs"],
|
|
229
|
+
["workers.onPermission", "fleet.permissions.mode"],
|
|
230
|
+
["workers.escalation", "fleet.permissions.escalation"],
|
|
231
|
+
["guardrails.workerToolCallCap", "fleet.limits.toolCallsPerRun"],
|
|
232
|
+
["guardrails.internalDispatchTimeoutMs", "fleet.limits.internalRunTimeoutMs"],
|
|
233
|
+
["guardrails.maxDispatchRuns", "fleet.history.maxRuns"],
|
|
234
|
+
["compaction.auto", "context.compaction.auto"],
|
|
235
|
+
["compaction.threshold", "context.compaction.threshold"],
|
|
236
|
+
["compaction.model", "context.compaction.model"],
|
|
237
|
+
["compaction.systemPrompt", "context.compaction.systemPrompt"],
|
|
238
|
+
["background.target", "context.memory.target"],
|
|
239
|
+
["background.model", "context.memory.model"],
|
|
240
|
+
["memory.intervention.enabled", "context.memory.enabled"],
|
|
241
|
+
["memory.intervention.everyNTools", "context.memory.cadenceToolCalls"],
|
|
242
|
+
["memory.intervention.windowSteps", "context.memory.trajectorySteps"],
|
|
243
|
+
["memory.intervention.maxTokens", "context.memory.maxOutputTokens"],
|
|
244
|
+
["memory.intervention.timeoutMs", "context.memory.timeoutMs"],
|
|
245
|
+
["budget.sessionCeilingUsd", "safety.limits.sessionCostUsd"],
|
|
246
|
+
["guardrails.turnToolCallBudget", "safety.limits.chatToolCallsPerTurn"],
|
|
247
|
+
["guardrails.readMaxBytes", "safety.limits.readBytesPerCall"],
|
|
248
|
+
["guardrails.observationTurnBudgetBytes", "safety.limits.observationBytesPerTurn"],
|
|
249
|
+
["watchdog", "safety.review"],
|
|
250
|
+
["terminal.outputVerbosity", "interface.outputDetail"],
|
|
251
|
+
["terminal.smoothStreaming", "interface.smoothStreaming"],
|
|
252
|
+
["terminal.tuiMode", "interface.mode"],
|
|
253
|
+
["terminal.fullscreenScrollbar", "interface.fullscreenScrollbar"],
|
|
254
|
+
["terminal.showTerminalProgress", "interface.terminalProgress"],
|
|
255
|
+
["terminal.notify", "interface.desktopNotifications"],
|
|
256
|
+
["panes.enabled", "interface.panes.enabled"],
|
|
257
|
+
["panes.notifications", "interface.panes.notifications"],
|
|
258
|
+
["panes.journal", "fleet.history.journal"],
|
|
259
|
+
["panes.yazi.enabled", "interface.panes.files.enabled"],
|
|
260
|
+
["panes.yazi.mode", "interface.panes.files.mode"],
|
|
261
|
+
["panes.yazi.profile", "interface.panes.files.profile"],
|
|
262
|
+
["panes.yazi.followCwd", "interface.panes.files.followCwd"],
|
|
263
|
+
["keybindings", "interface.keybindings"],
|
|
264
|
+
["skills.trustProjectCompatRoots", "integrations.projectResources.trustProjectImports"],
|
|
265
|
+
["delegation.defaults", "integrations.externalAgents.defaults"],
|
|
266
|
+
["delegation.agents", "integrations.externalAgents.entries"],
|
|
267
|
+
["runtimePlugins", "integrations.runtimePlugins"],
|
|
268
|
+
["library", "integrations.library"],
|
|
269
|
+
["attribution.gitCommits", "integrations.git.commitAttribution"],
|
|
270
|
+
];
|
|
271
|
+
for (const [from, to, valueTransform] of moves) move(transform, from, to, valueTransform);
|
|
272
|
+
|
|
273
|
+
drop(transform, "identity", "accepted and ignored; no behavior was lost");
|
|
274
|
+
drop(transform, "background.thinkingLevel", "unused; proactive memory always resolves thinking off");
|
|
275
|
+
drop(transform, "theme", "inactive; runtime rendering did not read it");
|
|
276
|
+
drop(transform, "compaction.excludeLastTurns", "legacy-mask only; context.workingSet.protectLastTurns remains");
|
|
277
|
+
// The keys v0.4.0 shipped moved above; what can remain under `panes` is the
|
|
278
|
+
// retired agents/keepFailed pair (normally already stripped by the
|
|
279
|
+
// retire-panes-knobs migration, which runs first) or unknown keys, none of
|
|
280
|
+
// which has a v2 home.
|
|
281
|
+
drop(
|
|
282
|
+
transform,
|
|
283
|
+
"panes",
|
|
284
|
+
"remaining panes keys have no v2 successor; the shipped keys moved to interface.panes.* and fleet.history.journal",
|
|
285
|
+
);
|
|
286
|
+
migrateFleetNodeAliases(transform);
|
|
287
|
+
|
|
288
|
+
if (transform.collisions.length > 0) throw new SettingsV2CollisionError(transform.collisions);
|
|
289
|
+
transform.document.version = 2;
|
|
290
|
+
const validated = validateSettings(transform.document);
|
|
291
|
+
if (validated.issues.length > 0) throw new SettingsValidationError(validated.issues);
|
|
292
|
+
return transform;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
function reportPath(stateDir: string): string {
|
|
296
|
+
return join(stateDir, "migration-reports", `${SETTINGS_V2_MIGRATION_ID}.json`);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const migration: Migration = {
|
|
300
|
+
id: SETTINGS_V2_MIGRATION_ID,
|
|
301
|
+
async up(stateDir: string): Promise<void> {
|
|
302
|
+
withSettingsLock(() => {
|
|
303
|
+
const path = settingsPath();
|
|
304
|
+
if (!existsSync(path)) return;
|
|
305
|
+
let rawText: string;
|
|
306
|
+
let parsed: unknown;
|
|
307
|
+
try {
|
|
308
|
+
rawText = readFileSync(path, "utf8");
|
|
309
|
+
parsed = parseYaml(rawText);
|
|
310
|
+
} catch (error) {
|
|
311
|
+
throw new Error(
|
|
312
|
+
`settings v1 to v2 migration could not read and parse ${path}: ${error instanceof Error ? error.message : String(error)}`,
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
if (isPlainObject(parsed) && parsed.version === 2) return;
|
|
316
|
+
const transformed = migrateSettingsV1Document(parsed);
|
|
317
|
+
const backupPath = `${path}.v1.bak`;
|
|
318
|
+
safeResourceWrite(path, stringifyYaml(transformed.document), {
|
|
319
|
+
encoding: "utf8",
|
|
320
|
+
mode: 0o644,
|
|
321
|
+
backup: { path: backupPath },
|
|
322
|
+
});
|
|
323
|
+
const report: SettingsV2MigrationReport = {
|
|
324
|
+
fromVersion: 1,
|
|
325
|
+
toVersion: 2,
|
|
326
|
+
backupPath,
|
|
327
|
+
moved: transformed.moved,
|
|
328
|
+
dropped: transformed.dropped,
|
|
329
|
+
notes: transformed.notes,
|
|
330
|
+
};
|
|
331
|
+
const target = reportPath(stateDir);
|
|
332
|
+
mkdirSync(join(stateDir, "migration-reports"), { recursive: true });
|
|
333
|
+
safeResourceWrite(target, `${JSON.stringify(report, null, 2)}\n`, { encoding: "utf8", mode: 0o644 });
|
|
334
|
+
});
|
|
335
|
+
},
|
|
336
|
+
};
|
|
337
|
+
|
|
338
|
+
export default migration;
|
|
@@ -20,12 +20,22 @@
|
|
|
20
20
|
* (core/safe-resource-write.ts) so readers never see a partial file.
|
|
21
21
|
* 2. Migrations are authored against the shapes the code has on the day they
|
|
22
22
|
* are needed, never against stale pre-release shapes.
|
|
23
|
+
* 3. A migration that repairs settings.yaml into a shape the strict reader
|
|
24
|
+
* accepts runs before any migration that reads settings through
|
|
25
|
+
* `readSettings`, because that reader throws on the very document the
|
|
26
|
+
* repair exists to fix. The registry order below is that order, and it is
|
|
27
|
+
* deliberately not the id order: ids are stable identifiers, and the
|
|
28
|
+
* manifest replays by id membership rather than by position, so a home that
|
|
29
|
+
* already applied one of these is unaffected by where the other sits.
|
|
23
30
|
*/
|
|
24
31
|
|
|
25
32
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
26
33
|
import { join } from "node:path";
|
|
27
34
|
|
|
28
35
|
import lmStudioRuntimeId from "./2026-08-18-lmstudio-runtime-id.js";
|
|
36
|
+
import clioCoderNaming from "./2026-09-01-clio-coder-naming.js";
|
|
37
|
+
import retirePanesKnobs from "./2026-09-01-retire-panes-knobs.js";
|
|
38
|
+
import settingsV2 from "./2026-09-01-settings-v2.js";
|
|
29
39
|
|
|
30
40
|
export interface Migration {
|
|
31
41
|
id: string;
|
|
@@ -45,7 +55,16 @@ export interface MigrationRunResult {
|
|
|
45
55
|
available: string[];
|
|
46
56
|
}
|
|
47
57
|
|
|
48
|
-
|
|
58
|
+
// Settings v2 owns the complete v1 rewrite, including the already-retired pane
|
|
59
|
+
// keys, and must run before either older migration reaches the strict v2 reader.
|
|
60
|
+
// `retirePanesKnobs` remains registered for homes that already recorded the v2
|
|
61
|
+
// migration independently and for manifest continuity; it is a no-op on v2.
|
|
62
|
+
const REGISTRY: ReadonlyArray<Migration> = Object.freeze([
|
|
63
|
+
settingsV2,
|
|
64
|
+
clioCoderNaming,
|
|
65
|
+
retirePanesKnobs,
|
|
66
|
+
lmStudioRuntimeId,
|
|
67
|
+
]);
|
|
49
68
|
|
|
50
69
|
export function listMigrations(): ReadonlyArray<Migration> {
|
|
51
70
|
return REGISTRY;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { existsSync, lstatSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
|
|
4
|
+
import { TraceReader } from "../observability/trace-store.js";
|
|
5
|
+
|
|
6
|
+
const HISTORY_FILE_LIMIT = 10_000;
|
|
7
|
+
const HISTORY_FILE_BYTE_LIMIT = 8 * 1024 * 1024;
|
|
8
|
+
const HISTORY_SUFFIXES = [".json", ".jsonl", ".ndjson"] as const;
|
|
9
|
+
const LEGACY_EVENT_TYPES = [
|
|
10
|
+
"clio_permission_escalated",
|
|
11
|
+
"clio_permission_resolved",
|
|
12
|
+
"clio_plan_update",
|
|
13
|
+
"clio_run_outcome",
|
|
14
|
+
"clio_safety_decision",
|
|
15
|
+
"clio_skill_activation",
|
|
16
|
+
"clio_steer_received",
|
|
17
|
+
"clio_tool_activity",
|
|
18
|
+
"clio_tool_finish",
|
|
19
|
+
"clio_tool_start",
|
|
20
|
+
"clio_usage",
|
|
21
|
+
"clio_verification",
|
|
22
|
+
"clio_write_record_downgraded",
|
|
23
|
+
] as const;
|
|
24
|
+
const LEGACY_HISTORY_LITERALS = [
|
|
25
|
+
...LEGACY_EVENT_TYPES,
|
|
26
|
+
"clio.eval.",
|
|
27
|
+
'"clio-run"',
|
|
28
|
+
"clio.runReceipt.integrity",
|
|
29
|
+
"clio.gateDecision.integrity",
|
|
30
|
+
"clio.gateDecision.pending",
|
|
31
|
+
"clio.protectedArtifact.pending",
|
|
32
|
+
"clio.ask_user.interview.v1",
|
|
33
|
+
"clio.share.v1",
|
|
34
|
+
"clio-context-replay-v2",
|
|
35
|
+
"identity.clio-worker",
|
|
36
|
+
] as const;
|
|
37
|
+
|
|
38
|
+
export type NamingHistoryArea = "trace" | "sessions" | "evals" | "evidence" | "receipts";
|
|
39
|
+
|
|
40
|
+
export interface NamingHistoryCount {
|
|
41
|
+
area: NamingHistoryArea;
|
|
42
|
+
legacyIdentifiers: number;
|
|
43
|
+
filesInspected: number;
|
|
44
|
+
filesSkipped: number;
|
|
45
|
+
error: string | null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface InspectNamingHistoryOptions {
|
|
49
|
+
stateDir: string;
|
|
50
|
+
dataDir: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function countLegacyHistoryText(text: string): number {
|
|
54
|
+
let count = 0;
|
|
55
|
+
for (const literal of LEGACY_HISTORY_LITERALS) {
|
|
56
|
+
let offset = 0;
|
|
57
|
+
for (;;) {
|
|
58
|
+
const found = text.indexOf(literal, offset);
|
|
59
|
+
if (found === -1) break;
|
|
60
|
+
count += 1;
|
|
61
|
+
offset = found + literal.length;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
count += text.match(/"clio"\s*:/gu)?.length ?? 0;
|
|
65
|
+
count += text.match(/"clioVersion"\s*:/gu)?.length ?? 0;
|
|
66
|
+
count += text.match(/"clioCommit"\s*:/gu)?.length ?? 0;
|
|
67
|
+
return count;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function inspectTextTree(area: Exclude<NamingHistoryArea, "trace">, root: string): NamingHistoryCount {
|
|
71
|
+
const result: NamingHistoryCount = {
|
|
72
|
+
area,
|
|
73
|
+
legacyIdentifiers: 0,
|
|
74
|
+
filesInspected: 0,
|
|
75
|
+
filesSkipped: 0,
|
|
76
|
+
error: null,
|
|
77
|
+
};
|
|
78
|
+
if (!existsSync(root)) return result;
|
|
79
|
+
const pending = [root];
|
|
80
|
+
try {
|
|
81
|
+
while (pending.length > 0 && result.filesInspected + result.filesSkipped < HISTORY_FILE_LIMIT) {
|
|
82
|
+
const directory = pending.pop();
|
|
83
|
+
if (directory === undefined) break;
|
|
84
|
+
for (const entry of readdirSync(directory, { withFileTypes: true }).sort((left, right) =>
|
|
85
|
+
left.name.localeCompare(right.name),
|
|
86
|
+
)) {
|
|
87
|
+
const path = join(directory, entry.name);
|
|
88
|
+
if (entry.isSymbolicLink()) {
|
|
89
|
+
result.filesSkipped += 1;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (entry.isDirectory()) {
|
|
93
|
+
pending.push(path);
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (!entry.isFile() || !HISTORY_SUFFIXES.some((suffix) => entry.name.endsWith(suffix))) continue;
|
|
97
|
+
const stats = lstatSync(path);
|
|
98
|
+
if (!stats.isFile() || stats.size > HISTORY_FILE_BYTE_LIMIT) {
|
|
99
|
+
result.filesSkipped += 1;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
result.legacyIdentifiers += countLegacyHistoryText(readFileSync(path, "utf8"));
|
|
103
|
+
result.filesInspected += 1;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (pending.length > 0) result.filesSkipped += pending.length;
|
|
107
|
+
} catch (error) {
|
|
108
|
+
result.error = error instanceof Error ? error.message : String(error);
|
|
109
|
+
}
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function inspectTrace(path: string): NamingHistoryCount {
|
|
114
|
+
const result: NamingHistoryCount = {
|
|
115
|
+
area: "trace",
|
|
116
|
+
legacyIdentifiers: 0,
|
|
117
|
+
filesInspected: 0,
|
|
118
|
+
filesSkipped: 0,
|
|
119
|
+
error: null,
|
|
120
|
+
};
|
|
121
|
+
if (!existsSync(path)) return result;
|
|
122
|
+
try {
|
|
123
|
+
if (!statSync(path).isFile()) {
|
|
124
|
+
result.filesSkipped = 1;
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
const reader = new TraceReader(path);
|
|
128
|
+
try {
|
|
129
|
+
const placeholders = LEGACY_EVENT_TYPES.map(() => "?").join(",");
|
|
130
|
+
const row = reader.db
|
|
131
|
+
.prepare(`SELECT COUNT(*) AS count FROM events WHERE type IN (${placeholders})`)
|
|
132
|
+
.get(...LEGACY_EVENT_TYPES) as { count: number | bigint };
|
|
133
|
+
result.legacyIdentifiers = Number(row.count);
|
|
134
|
+
result.filesInspected = 1;
|
|
135
|
+
} finally {
|
|
136
|
+
reader.close();
|
|
137
|
+
}
|
|
138
|
+
} catch (error) {
|
|
139
|
+
result.error = error instanceof Error ? error.message : String(error);
|
|
140
|
+
}
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** Count released legacy identifiers without mutating immutable or sealed history. */
|
|
145
|
+
export function inspectNamingHistory(options: InspectNamingHistoryOptions): NamingHistoryCount[] {
|
|
146
|
+
return [
|
|
147
|
+
inspectTrace(join(options.stateDir, "trace.sqlite")),
|
|
148
|
+
inspectTextTree("sessions", join(options.stateDir, "sessions")),
|
|
149
|
+
inspectTextTree("evals", join(options.dataDir, "evals")),
|
|
150
|
+
inspectTextTree("evidence", join(options.dataDir, "evidence")),
|
|
151
|
+
inspectTextTree("receipts", join(options.stateDir, "receipts")),
|
|
152
|
+
];
|
|
153
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
|
|
4
|
+
import { safeResourceWrite } from "../../core/safe-resource-write.js";
|
|
5
|
+
|
|
6
|
+
export const MUTABLE_NAMING_BACKUP_SUFFIX = ".pre-clio-coder-naming.bak";
|
|
7
|
+
|
|
8
|
+
const MUTABLE_STATE_FILES = [
|
|
9
|
+
"dispatch-admission.json",
|
|
10
|
+
"dispatch-verification-memo.json",
|
|
11
|
+
"endpoint-slots.json",
|
|
12
|
+
"fleet-preflight.json",
|
|
13
|
+
"interop.json",
|
|
14
|
+
] as const;
|
|
15
|
+
|
|
16
|
+
export interface MutableNamingCounts {
|
|
17
|
+
lifecycle: number;
|
|
18
|
+
toolGovernance: number;
|
|
19
|
+
source: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface MutableNamingStateReport {
|
|
23
|
+
path: string;
|
|
24
|
+
changed: boolean;
|
|
25
|
+
backupPath: string | null;
|
|
26
|
+
counts: MutableNamingCounts;
|
|
27
|
+
error: string | null;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
31
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Field-aware transform: user text and unknown string values are never searched or replaced. */
|
|
35
|
+
function transformMutableNamingState(value: unknown): { value: unknown; counts: MutableNamingCounts } {
|
|
36
|
+
const next = structuredClone(value);
|
|
37
|
+
const counts: MutableNamingCounts = { lifecycle: 0, toolGovernance: 0, source: 0 };
|
|
38
|
+
const visit = (current: unknown): void => {
|
|
39
|
+
if (Array.isArray(current)) {
|
|
40
|
+
for (const entry of current) visit(entry);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (!isRecord(current)) return;
|
|
44
|
+
for (const [key, entry] of Object.entries(current)) {
|
|
45
|
+
if (key === "lifecycle" && entry === "clio-managed") {
|
|
46
|
+
current[key] = "clio-coder-managed";
|
|
47
|
+
counts.lifecycle += 1;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
if (key === "toolGovernance" && entry === "clio-policy") {
|
|
51
|
+
current[key] = "clio-coder-policy";
|
|
52
|
+
counts.toolGovernance += 1;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (key === "source" && entry === "clio") {
|
|
56
|
+
current[key] = "clio-coder";
|
|
57
|
+
counts.source += 1;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
visit(entry);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
visit(next);
|
|
64
|
+
return { value: next, counts };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function total(counts: MutableNamingCounts): number {
|
|
68
|
+
return counts.lifecycle + counts.toolGovernance + counts.source;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Rewrite only the audited mutable, unsealed JSON allowlist. Run/session
|
|
73
|
+
* ledgers, receipts, evidence, evals, trace, gate decisions, protected
|
|
74
|
+
* artifacts, and exported archives are deliberately unreachable here.
|
|
75
|
+
*/
|
|
76
|
+
export function migrateMutableNamingState(stateDir: string): MutableNamingStateReport[] {
|
|
77
|
+
const reports: MutableNamingStateReport[] = [];
|
|
78
|
+
for (const name of MUTABLE_STATE_FILES) {
|
|
79
|
+
const path = join(stateDir, name);
|
|
80
|
+
if (!existsSync(path)) continue;
|
|
81
|
+
try {
|
|
82
|
+
const parsed: unknown = JSON.parse(readFileSync(path, "utf8"));
|
|
83
|
+
const transformed = transformMutableNamingState(parsed);
|
|
84
|
+
const changed = total(transformed.counts) > 0;
|
|
85
|
+
const backupPath = changed ? `${path}${MUTABLE_NAMING_BACKUP_SUFFIX}` : null;
|
|
86
|
+
if (changed) {
|
|
87
|
+
safeResourceWrite(path, `${JSON.stringify(transformed.value, null, 2)}\n`, {
|
|
88
|
+
encoding: "utf8",
|
|
89
|
+
backup: { path: backupPath as string },
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
reports.push({ path, changed, backupPath, counts: transformed.counts, error: null });
|
|
93
|
+
} catch (error) {
|
|
94
|
+
reports.push({
|
|
95
|
+
path,
|
|
96
|
+
changed: false,
|
|
97
|
+
backupPath: null,
|
|
98
|
+
counts: { lifecycle: 0, toolGovernance: 0, source: 0 },
|
|
99
|
+
error: error instanceof Error ? error.message : String(error),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return reports;
|
|
104
|
+
}
|