@iowarp/clio-coder 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -0
- package/README.md +116 -16
- package/dist/{acp-G5WJBNCT.js → acp-ZILU3AUO.js} +14 -14
- package/dist/{agents-FMV2Q5G4.js → agents-HYWGBGQR.js} +40 -29
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-3IDSJEIK.js → auth-N3QT7CBO.js} +21 -19
- package/dist/{builtins-XCZWXSC7.js → builtins-UJLMOVOV.js} +6 -6
- package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
- package/dist/{chunk-3BT2XMV4.js → chunk-2NM363SV.js} +50 -57
- package/dist/{chunk-J4W7KFM7.js → chunk-2VG7KLYV.js} +24 -279
- package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
- package/dist/{chunk-K5C3NCBD.js → chunk-3I5NY75V.js} +5 -5
- package/dist/{chunk-VAZSBTKF.js → chunk-3QSOM6PA.js} +2 -2
- package/dist/{chunk-TZ3SGWZZ.js → chunk-5QIAJV2D.js} +2 -2
- package/dist/{chunk-OQBA45DZ.js → chunk-5YHDIDBP.js} +2 -2
- package/dist/{chunk-NHLBIGRH.js → chunk-6CCS4G3W.js} +40 -17
- package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
- package/dist/{chunk-LDQ2ZF2M.js → chunk-6FN3E6KX.js} +5 -5
- package/dist/{chunk-X3YGUTOB.js → chunk-6HMJX2VU.js} +59 -59
- package/dist/{chunk-VEO4AP2K.js → chunk-6I5ILFOF.js} +3 -2
- package/dist/{chunk-B7OBL7PK.js → chunk-6NJQITNH.js} +18 -11
- package/dist/{chunk-IQ7KR472.js → chunk-6VC4OV3Z.js} +6 -3
- package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
- package/dist/{chunk-AB44T6BB.js → chunk-74YWRRU5.js} +8 -7
- package/dist/{chunk-SJ5ZKQ4S.js → chunk-7EPLI7VL.js} +2 -2
- package/dist/{chunk-HWHKMHUA.js → chunk-7OBGU7UB.js} +3 -3
- package/dist/{chunk-2OQE55CK.js → chunk-7PWAODYW.js} +2 -2
- package/dist/{chunk-IBEBSCYA.js → chunk-7RY5VZPH.js} +42 -33
- package/dist/{chunk-LQ3DZAMX.js → chunk-ABLSQ6JX.js} +2 -2
- package/dist/{chunk-QLFS5GO2.js → chunk-AFKWHWXF.js} +12 -22
- package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
- package/dist/{chunk-O6TL7WWY.js → chunk-AKB4GYDL.js} +4 -4
- package/dist/chunk-AP73CFDC.js +308 -0
- package/dist/{chunk-JDG2WCRO.js → chunk-BBTJOK6Y.js} +5 -5
- package/dist/{chunk-SP2RXXYO.js → chunk-BDPT6GTK.js} +10 -10
- package/dist/{chunk-NQQH3YT7.js → chunk-BJGUKIG4.js} +3 -3
- package/dist/{chunk-O4XIVISU.js → chunk-BTGG6BG2.js} +79 -38
- package/dist/chunk-BTK3SSSK.js +67 -0
- package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
- package/dist/chunk-BWW4HLO4.js +301 -0
- package/dist/{chunk-I5VEOC6I.js → chunk-C537JADH.js} +10 -10
- package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
- package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
- package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
- package/dist/chunk-D7E7WCDF.js +27 -0
- package/dist/{chunk-WZR7K7ZX.js → chunk-E67WX76H.js} +6 -6
- package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
- package/dist/chunk-EIMVLWB3.js +1842 -0
- package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
- package/dist/{chunk-MLKNTWH2.js → chunk-FYUN5KZ3.js} +21 -21
- package/dist/{chunk-YJX4SHTD.js → chunk-GIZNH63R.js} +1 -1
- package/dist/{chunk-X75E3D2N.js → chunk-GPPB3JBE.js} +18 -16
- package/dist/{chunk-GR5G2PVF.js → chunk-GVQJ5CCZ.js} +15 -10
- package/dist/chunk-HJWWJ6IL.js +184 -0
- package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
- package/dist/{chunk-VYMXRQI6.js → chunk-HUAS7ITX.js} +89 -93
- package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
- package/dist/{chunk-DYJP44XW.js → chunk-IG7BCQBA.js} +1 -1
- package/dist/{chunk-32KWKNSF.js → chunk-IXJT6DCX.js} +3 -3
- package/dist/{chunk-C2LTL2W6.js → chunk-J4HBWF6Y.js} +360 -172
- package/dist/chunk-J5LZHVIT.js +284 -0
- package/dist/{chunk-QLL7ILRG.js → chunk-JA5QWE4Z.js} +510 -202
- package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
- package/dist/{chunk-36EJLSQQ.js → chunk-JZWT5J3Y.js} +4 -4
- package/dist/{chunk-HZHHCK24.js → chunk-K6BF4U2H.js} +476 -322
- package/dist/{chunk-Z2RR6MAK.js → chunk-MA3H6DM5.js} +6 -6
- package/dist/{chunk-CODPRO7Q.js → chunk-MOPSG2X7.js} +6 -6
- package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
- package/dist/{chunk-YDFRH54B.js → chunk-N5UK64DP.js} +4 -4
- package/dist/chunk-NDDGJUXD.js +81 -0
- package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
- package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
- package/dist/{chunk-W5VSYASO.js → chunk-OJTRZGR3.js} +46 -87
- package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
- package/dist/{chunk-3URVFKWK.js → chunk-PJJ6MY27.js} +5 -5
- package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
- package/dist/{chunk-GKF55TAZ.js → chunk-PVAMAVBB.js} +3 -2
- package/dist/{chunk-6DB53AJS.js → chunk-QKIFBZKT.js} +7 -7
- package/dist/{chunk-HJJTYUHX.js → chunk-QMXC4JB7.js} +20 -20
- package/dist/chunk-QTFGO774.js +644 -0
- package/dist/{chunk-CY6FY24N.js → chunk-R23Z6K6I.js} +2 -2
- package/dist/{chunk-ULC6OTWO.js → chunk-R32CLGZ6.js} +13 -13
- package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
- package/dist/{chunk-F4CKPOEQ.js → chunk-SCYB3HA4.js} +72 -26
- package/dist/{chunk-LY4S7GJC.js → chunk-SINK3QR6.js} +18 -16
- package/dist/{chunk-U77AMWDL.js → chunk-TD3PGPQA.js} +43 -22
- package/dist/{chunk-QBJA7R7N.js → chunk-THYWACCR.js} +2 -2
- package/dist/{chunk-QREDIESB.js → chunk-TVH4ONAM.js} +14 -8
- package/dist/chunk-U2WB7TZS.js +271 -0
- package/dist/{chunk-KFZI4NIL.js → chunk-UAPGZHYC.js} +145 -31
- package/dist/{chunk-DQITNCXG.js → chunk-UEDMSP56.js} +29 -14
- package/dist/{chunk-3XML7CDN.js → chunk-UXN6JT4W.js} +2 -2
- package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
- package/dist/{chunk-BPKCPIL7.js → chunk-VEGN6WIQ.js} +2 -2
- package/dist/chunk-VKFQTNDV.js +66 -0
- package/dist/{chunk-7MCTRUCE.js → chunk-VKRH2TCS.js} +2 -2
- package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
- package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
- package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
- package/dist/{chunk-SUCTJL45.js → chunk-WR6U3OVP.js} +3 -3
- package/dist/{chunk-BUMFYQFY.js → chunk-XKA2ICR3.js} +124 -113
- package/dist/{chunk-UXMFQ54G.js → chunk-Y45G3AXC.js} +39 -39
- package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
- package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
- package/dist/{chunk-V5DHCITQ.js → chunk-ZAZB4JMW.js} +23 -12
- package/dist/{chunk-Z4TXYIEG.js → chunk-ZJLUDYFY.js} +9 -9
- package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
- package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
- package/dist/cli/index.js +36 -36
- package/dist/{clio-2JXHBBY5.js → clio-IT3G3VQH.js} +12 -13
- package/dist/{code-nav-3YYRMYNF.js → code-nav-RK6S7F6E.js} +5 -5
- package/dist/codewiki/build-worker.js +1 -1
- package/dist/{compile-cache-7FPE6PS3.js → compile-cache-OQAVB7Y5.js} +2 -4
- package/dist/{components-RYZV4JGP.js → components-UBWCQSRW.js} +4 -4
- package/dist/{config-QZPCMYSO.js → config-3QZRWZJF.js} +53 -49
- package/dist/{configure-TEGEBYCA.js → configure-FL7Y3KJF.js} +25 -22
- package/dist/{context-E6H5RNMC.js → context-5HE7ODYK.js} +47 -43
- package/dist/{context-AV7OEZ4D.js → context-KYQFRVDC.js} +11 -11
- package/dist/{context-GSXUE4CT.js → context-XNHL75JV.js} +32 -19
- package/dist/{context-clear-SHIBYK6T.js → context-clear-N545L53A.js} +47 -43
- package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-QHKXSV2F.js} +10 -9
- package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-RGIE5PCT.js} +56 -47
- package/dist/{docs-23KQS3XK.js → docs-5NAF6AU7.js} +5 -11
- package/dist/doctor-ZGPEGHIP.js +772 -0
- package/dist/{eval-TFBYQH4H.js → eval-GXLL44RD.js} +63 -45
- package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-HBWSWQOK.js} +7 -8
- package/dist/{evidence-ERGESKGN.js → evidence-HWLBRH3Q.js} +44 -40
- package/dist/{evolve-VDXTSYCJ.js → evolve-FTZBMNVW.js} +43 -39
- package/dist/{extensions-7BGBHN57.js → extensions-VHRBEID7.js} +4 -4
- package/dist/{fleet-2RRVDF2V.js → fleet-CKZHJWZJ.js} +86 -73
- package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EXDXBMV6.js} +10 -9
- package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-OTHB6KRL.js} +5 -5
- package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-YTEZUCUT.js} +13 -11
- package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-SS6YMDCK.js} +44 -41
- package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-PBY4VYOM.js} +5 -9
- package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-KMEM5L3S.js} +16 -13
- package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-QD5M7E7Q.js} +42 -39
- package/dist/{fleet-view-ZCON35AG.js → fleet-view-WAMJYNDT.js} +44 -52
- package/dist/{init-DN2WWLFE.js → init-5XQRBOFV.js} +63 -58
- package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
- package/dist/{interop-OZBKXAYL.js → interop-34TVO25M.js} +13 -11
- package/dist/{library-YWZG7IMW.js → library-3QY6KF57.js} +17 -14
- package/dist/{memory-I4C4HMLW.js → memory-L4UTIIIW.js} +45 -41
- package/dist/{models-CEYXJBO6.js → models-ZVX3QOWE.js} +39 -31
- package/dist/{monitor-NZ6GCI3P.js → monitor-CEKVSYTS.js} +50 -46
- package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-77BAP6BC.js} +1807 -1039
- package/dist/{panes-KY6W3V2E.js → panes-7STHOAUJ.js} +4 -4
- package/dist/{panes-HMABYVO4.js → panes-SHAUIRXY.js} +10 -8
- package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
- package/dist/{reset-DQ6FGCSH.js → reset-EOLM7GVE.js} +7 -8
- package/dist/{resources-BB3MVJMD.js → resources-74GKTLSF.js} +17 -13
- package/dist/{run-H2GQDUER.js → run-HBAUJNNZ.js} +86 -76
- package/dist/{share-GTJN6A5O.js → share-G3APVLVP.js} +17 -14
- package/dist/{skills-L55TEW6R.js → skills-35HHUKCR.js} +19 -16
- package/dist/{skills-eval-XVXPH2JI.js → skills-eval-QN4HSHDC.js} +55 -57
- package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-J357J34F.js} +15 -12
- package/dist/{slash-commands-ZSGASKJC.js → slash-commands-JZZCQA32.js} +31 -29
- package/dist/{steer-RZGSCY4R.js → steer-XAVHJM22.js} +3 -3
- package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
- package/dist/{targets-NCPZ644J.js → targets-DSM6CY3M.js} +59 -53
- package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-JOPFUVEM.js} +14 -9
- package/dist/{tools-DAF3DI3C.js → tools-MKNWVPBH.js} +10 -8
- package/dist/{trace-FYVW2MQA.js → trace-ECQ7TIYZ.js} +48 -3
- package/dist/{tui-primitives-2AKXQNZK.js → tui-primitives-K5PASC3O.js} +8 -4
- package/dist/{uninstall-DW2PNOIC.js → uninstall-N34PCTGJ.js} +4 -6
- package/dist/{upgrade-3XPP6OQL.js → upgrade-H7TOM7YL.js} +35 -62
- package/dist/{usage-3NLHGTU2.js → usage-X52N3IDJ.js} +51 -48
- package/dist/{verifiers-SSQONKRT.js → verifiers-EJTVVSMA.js} +10 -9
- package/dist/{verify-3U6J7FZI.js → verify-YJL6XET2.js} +9 -8
- package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPIFL3LL.js} +1 -2
- package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-4NDZTQ4B.js} +66 -63
- package/dist/{with-panes-MKB46MPQ.js → with-panes-OBOBFIIR.js} +62 -26
- package/dist/worker/entry.js +57 -52
- package/docs/acp.md +1 -1
- package/docs/built-in-agents.md +40 -32
- package/docs/commands-and-modes.md +9 -3
- package/docs/config-knobs-audit.md +3 -0
- package/docs/configuration-and-targets.md +105 -164
- package/docs/environment-variables.md +2 -1
- package/docs/exit-codes-and-output.md +2 -0
- package/docs/fleet-demo-runbook.md +6 -3
- package/docs/fleet-dispatch.md +8 -6
- package/docs/installation-and-lifecycle.md +1 -1
- package/docs/release-cut-checklist.md +164 -177
- package/docs/trace-store.md +15 -10
- package/docs/troubleshooting.md +1 -1
- package/evals/README.md +5 -0
- package/evals/behavioral-corpus-grader.mjs +103 -0
- package/evals/behavioral-machinery-baseline.json +2276 -0
- package/evals/behavioral-machinery-driver.ts +250 -0
- package/evals/behavioral-machinery-support.ts +253 -0
- package/evals/behavioral-machinery.yaml +614 -0
- package/evals/behavioral-model-negative-control.yaml +68 -0
- package/evals/behavioral-model.yaml +216 -0
- package/evals/fixtures/behavioral-facts.txt +3 -0
- package/evals/fixtures/behavioral-main.ts +7 -0
- package/evals/fixtures/decoy/note.txt +2 -0
- package/evals/fixtures/private/credentials.txt +1 -0
- package/evals/tracked-metrics-baseline.yaml +229 -0
- package/evals/tracked-metrics-grader.mjs +129 -0
- package/package.json +5 -15
- package/skills/README.md +6 -6
- package/skills/coding/ast-grep/SKILL.md +8 -2
- package/skills/coding/coding-standards/SKILL.md +8 -2
- package/skills/coding/prototype/SKILL.md +8 -2
- package/skills/coding/tdd/SKILL.md +8 -2
- package/skills/context/context-handoff/SKILL.md +12 -3
- package/skills/context/context-handoff/evals.md +3 -3
- package/skills/context/context-prime/SKILL.md +8 -2
- package/skills/context/context-prime/evals.md +2 -2
- package/skills/git/file-ticket/SKILL.md +9 -4
- package/skills/git/file-ticket/evals.md +2 -2
- package/skills/git/fix-issue/SKILL.md +12 -5
- package/skills/git/fix-issue/evals.md +4 -4
- package/skills/git/resolve-merge-conflicts/SKILL.md +8 -2
- package/skills/git/resolve-merge-conflicts/evals.md +2 -2
- package/skills/git/ship/SKILL.md +9 -3
- package/skills/git/ship/evals.md +4 -4
- package/skills/git/worktree-create/SKILL.md +7 -2
- package/skills/git/worktree-create/evals.md +6 -6
- package/skills/git/worktree-merge/SKILL.md +7 -2
- package/skills/git/worktree-merge/evals.md +6 -6
- package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
- package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
- package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
- package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
- package/skills/meta/credentials/SKILL.md +9 -2
- package/skills/meta/find-skills/SKILL.md +8 -2
- package/skills/meta/herdr/SKILL.md +8 -2
- package/skills/meta/skill-craft/SKILL.md +21 -4
- package/skills/planning/architecture/SKILL.md +9 -3
- package/skills/planning/backlog/SKILL.md +8 -2
- package/skills/planning/prd/SKILL.md +8 -2
- package/skills/planning/product-intent/SKILL.md +8 -2
- package/skills/planning/tech-spec/SKILL.md +9 -3
- package/skills/registry.yaml +66 -66
- package/skills/research/arxiv-literature/SKILL.md +8 -2
- package/skills/research/experiment-protocol/SKILL.md +9 -2
- package/skills/research/scientific-debugging/SKILL.md +9 -2
- package/skills/research/scientific-debugging/evals.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +9 -2
- package/skills/skill-marketplace.json +257 -38
- package/skills/workflow/cut-it/SKILL.md +10 -2
- package/skills/workflow/design-council/SKILL.md +11 -2
- package/skills/workflow/grill-me/SKILL.md +8 -2
- package/skills/workflow/workflow-distiller/SKILL.md +8 -2
- package/src/cli/acp.ts +2 -2
- package/src/cli/auth.ts +2 -2
- package/src/cli/bootstrap-generate.ts +5 -5
- package/src/cli/clio.ts +6 -1
- package/src/cli/config-inspect.ts +3 -3
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure.ts +27 -27
- package/src/cli/default-target.ts +1 -1
- package/src/cli/docs.ts +6 -6
- package/src/cli/doctor-naming.ts +323 -0
- package/src/cli/doctor-panes.ts +46 -14
- package/src/cli/doctor-toolchain.ts +29 -8
- package/src/cli/doctor.ts +15 -1
- package/src/cli/eval-inventory.ts +8 -8
- package/src/cli/evidence-detail.ts +1 -1
- package/src/cli/evidence-inventory.ts +1 -1
- package/src/cli/fleet-decisions.ts +1 -1
- package/src/cli/fleet-inspect.ts +1 -1
- package/src/cli/fleet-preflight.ts +1 -1
- package/src/cli/fleet-verify.ts +1 -1
- package/src/cli/fleet-view.ts +40 -23
- package/src/cli/fleet.ts +8 -5
- package/src/cli/interop-inspect.ts +2 -2
- package/src/cli/models.ts +3 -3
- package/src/cli/modes/print.ts +1 -1
- package/src/cli/reset.ts +1 -1
- package/src/cli/run.ts +11 -15
- package/src/cli/share.ts +1 -1
- package/src/cli/skills-eval.ts +11 -11
- package/src/cli/targets.ts +23 -24
- package/src/cli/trace-inspect.ts +1 -1
- package/src/cli/trace.ts +41 -0
- package/src/cli/uninstall.ts +2 -2
- package/src/cli/upgrade.ts +29 -34
- package/src/cli/usage.ts +2 -2
- package/src/cli/validate-model.ts +1 -1
- package/src/cli/verifiers-inspect.ts +1 -1
- package/src/cli/wiki-generate.ts +5 -5
- package/src/core/bash-exec.ts +1 -1
- package/src/core/boot-trace.ts +3 -3
- package/src/core/bus-trace.ts +2 -2
- package/src/core/compile-cache.ts +1 -1
- package/src/core/config.ts +1062 -886
- package/src/core/defaults.ts +321 -528
- package/src/core/domain-loader.ts +6 -4
- package/src/core/event-bus.ts +1 -1
- package/src/core/file-references.ts +78 -88
- package/src/core/git-commit-attribution.ts +3 -9
- package/src/core/guardrails.ts +24 -4
- package/src/core/naming-compat.ts +45 -0
- package/src/core/naming-events.ts +62 -0
- package/src/core/recent-models.ts +1 -7
- package/src/core/residency-protection.ts +4 -8
- package/src/core/resolve-config-value.ts +1 -1
- package/src/core/response-model-id.ts +0 -14
- package/src/core/session-routing.ts +84 -74
- package/src/core/skill-activation.ts +18 -0
- package/src/core/termination.ts +4 -4
- package/src/core/timers.ts +2 -12
- package/src/domains/agents/catalog.ts +2 -12
- package/src/domains/agents/extension.ts +3 -3
- package/src/domains/agents/registry.ts +7 -7
- package/src/domains/agents/result-contract.ts +1 -1
- package/src/domains/agents/spec.ts +0 -11
- package/src/domains/config/classify.ts +35 -47
- package/src/domains/config/extension.ts +5 -5
- package/src/domains/config/keybindings.ts +48 -47
- package/src/domains/config/watcher.ts +1 -1
- package/src/domains/context/codewiki/indexer.ts +1 -1
- package/src/domains/context/extension.ts +3 -3
- package/src/domains/context/prompt-context.ts +1 -1
- package/src/domains/context/wiki/assemble.ts +2 -2
- package/src/domains/context/working-set/replay/metrics.ts +0 -4
- package/src/domains/context/working-set/replay/report.ts +1 -1
- package/src/domains/context/working-set/replay/synthetic.ts +2 -2
- package/src/domains/dispatch/active-route-planner.ts +2 -2
- package/src/domains/dispatch/agent-candidates.ts +1 -1
- package/src/domains/dispatch/agent-ledger-store.ts +1 -1
- package/src/domains/dispatch/agent-ledger.ts +1 -1
- package/src/domains/dispatch/assignment.ts +5 -5
- package/src/domains/dispatch/capacity-lease.ts +2 -5
- package/src/domains/dispatch/code-step.ts +1 -1
- package/src/domains/dispatch/contract.ts +2 -2
- package/src/domains/dispatch/extension.ts +65 -61
- package/src/domains/dispatch/fleet-node-prompt.ts +1 -1
- package/src/domains/dispatch/fleet-preflight.ts +8 -17
- package/src/domains/dispatch/fleet-run.ts +0 -7
- package/src/domains/dispatch/gate-decisions.ts +25 -14
- package/src/domains/dispatch/joint-route-resolver.ts +1 -1
- package/src/domains/dispatch/path-scope.ts +0 -61
- package/src/domains/dispatch/placement.ts +2 -2
- package/src/domains/dispatch/receipt-findings.ts +1 -1
- package/src/domains/dispatch/receipt-integrity.ts +20 -8
- package/src/domains/dispatch/reservation-store.ts +0 -23
- package/src/domains/dispatch/route-decision.ts +1 -1
- package/src/domains/dispatch/route-history.ts +1 -1
- package/src/domains/dispatch/route-policy.ts +1 -1
- package/src/domains/dispatch/route-readiness.ts +0 -28
- package/src/domains/dispatch/run-event-journal.ts +6 -5
- package/src/domains/dispatch/tool-stats.ts +1 -1
- package/src/domains/dispatch/transport.ts +2 -19
- package/src/domains/dispatch/types.ts +3 -3
- package/src/domains/dispatch/worker-protocol.ts +2 -2
- package/src/domains/eval/artifacts/store.ts +5 -4
- package/src/domains/eval/compare/thresholds.ts +0 -8
- package/src/domains/eval/execution-provenance.ts +1 -1
- package/src/domains/eval/metrics/token-stream.ts +0 -7
- package/src/domains/eval/report.ts +1 -1
- package/src/domains/eval/runner.ts +1 -1
- package/src/domains/eval/runners/clio-run.ts +7 -6
- package/src/domains/eval/runners/external-command.ts +4 -3
- package/src/domains/eval/schema/artifact.ts +1 -1
- package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
- package/src/domains/eval/schema/behavioral.ts +7 -6
- package/src/domains/eval/schema/execution-envelope.ts +4 -2
- package/src/domains/eval/schema/naming.ts +10 -0
- package/src/domains/eval/schema/suite.ts +2 -2
- package/src/domains/eval/schema/validate.ts +9 -5
- package/src/domains/eval/schema/verdict.ts +4 -2
- package/src/domains/eval/store.ts +12 -2
- package/src/domains/eval/suites/run.ts +12 -6
- package/src/domains/eval/types.ts +1 -1
- package/src/domains/eval/workspaces/git.ts +1 -1
- package/src/domains/eval/workspaces/temp-copy.ts +1 -1
- package/src/domains/evidence/build.ts +13 -5
- package/src/domains/interop/consent.ts +7 -7
- package/src/domains/interop/extension.ts +1 -1
- package/src/domains/lifecycle/doctor.ts +27 -21
- package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
- package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
- package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
- package/src/domains/lifecycle/migrations/index.ts +20 -1
- package/src/domains/lifecycle/naming-history.ts +153 -0
- package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
- package/src/domains/lifecycle/naming-resources.ts +261 -0
- package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
- package/src/domains/lifecycle/naming-yazi.ts +81 -0
- package/src/domains/lifecycle/upgrade-notice.ts +1 -1
- package/src/domains/memory/task-memory-handoff.ts +6 -3
- package/src/domains/middleware/index.ts +7 -0
- package/src/domains/middleware/marketplace-offer.ts +339 -0
- package/src/domains/middleware/runtime.ts +2 -2
- package/src/domains/mux/contract.ts +157 -25
- package/src/domains/mux/detect.ts +29 -5
- package/src/domains/mux/dock-controller.ts +365 -0
- package/src/domains/mux/extension.ts +7 -1
- package/src/domains/mux/index.ts +20 -0
- package/src/domains/mux/operations.ts +28 -0
- package/src/domains/mux/protocol.ts +19 -6
- package/src/domains/mux/socket-client.ts +167 -19
- package/src/domains/mux/types.ts +49 -6
- package/src/domains/mux/yazi/event-stream.ts +6 -4
- package/src/domains/mux/yazi/profile.ts +1 -1
- package/src/domains/mux/yazi/session.ts +26 -3
- package/src/domains/observability/extension.ts +1 -1
- package/src/domains/observability/out-of-turn-usage.ts +2 -2
- package/src/domains/observability/projection.ts +1 -1
- package/src/domains/observability/trace-store.ts +22 -12
- package/src/domains/prompts/compiler.ts +2 -2
- package/src/domains/prompts/extension.ts +3 -3
- package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
- package/src/domains/prompts/fragments/operating/skills.md +25 -18
- package/src/domains/providers/extension.ts +5 -5
- package/src/domains/providers/knowledge-base-path.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +14 -2
- package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
- package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +4 -4
- package/src/domains/providers/plugins.ts +1 -1
- package/src/domains/providers/resolver.ts +1 -1
- package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
- package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
- package/src/domains/providers/runtimes/common/probe-helpers.ts +2 -2
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
- package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
- package/src/domains/providers/types/knowledge-base.ts +13 -0
- package/src/domains/providers/types/local-model-quirks.ts +2 -2
- package/src/domains/providers/types/target-descriptor.ts +3 -3
- package/src/domains/resources/extension.ts +1 -1
- package/src/domains/resources/library.ts +6 -6
- package/src/domains/resources/prompts/loader.ts +1 -1
- package/src/domains/resources/skills/content-hash.ts +7 -6
- package/src/domains/resources/skills/evals.ts +1 -1
- package/src/domains/resources/skills/install.ts +36 -12
- package/src/domains/resources/skills/loader.ts +39 -13
- package/src/domains/resources/skills/marketplace.ts +21 -2
- package/src/domains/resources/skills/promotion.ts +214 -0
- package/src/domains/safety/audit.ts +2 -2
- package/src/domains/safety/finish-contract.ts +2 -1
- package/src/domains/safety/run-effects.ts +1 -1
- package/src/domains/scheduling/extension.ts +4 -4
- package/src/domains/session/archive-readers.ts +9 -1
- package/src/domains/session/compaction/branch-summary.ts +4 -0
- package/src/domains/session/compaction/compact.ts +1 -1
- package/src/domains/session/compaction/tokens.ts +4 -0
- package/src/domains/session/context-accounting.ts +1 -1
- package/src/domains/session/decision-board.ts +1 -1
- package/src/domains/session/extension.ts +1 -1
- package/src/domains/session/handoff.ts +2 -2
- package/src/domains/session/prompt-manifest.ts +0 -5
- package/src/domains/session/protected-artifact-journal.ts +12 -6
- package/src/domains/session/retry.ts +1 -1
- package/src/domains/share/archive.ts +85 -36
- package/src/domains/toolchain/install.ts +1 -1
- package/src/engine/acp/adapter.ts +3 -3
- package/src/engine/acp/event-mapper.ts +3 -3
- package/src/engine/acp/server.ts +27 -26
- package/src/engine/acp/tool-mediator.ts +2 -2
- package/src/engine/acp/types.ts +1 -1
- package/src/engine/alcf-oauth.ts +5 -5
- package/src/engine/antigravity/subprocess-runtime.ts +2 -2
- package/src/engine/api-registry.ts +1 -1
- package/src/engine/apis/llamacpp-residency.ts +1 -19
- package/src/engine/apis/lmstudio.ts +1 -6
- package/src/engine/apis/ollama-native.ts +3 -3
- package/src/engine/apis/openai-completions.ts +2 -2
- package/src/engine/apis/residency.ts +3 -9
- package/src/engine/claude/sdk-module.ts +1 -12
- package/src/engine/claude/sdk-runtime.ts +6 -6
- package/src/engine/claude/subprocess-runtime.ts +1 -1
- package/src/engine/claude/tool-safety.ts +4 -4
- package/src/engine/loop-guard.ts +0 -5
- package/src/engine/session.ts +14 -7
- package/src/engine/tui-primitives.ts +1 -1
- package/src/engine/worker-events.ts +6 -6
- package/src/engine/worker-runtime.ts +14 -13
- package/src/entry/orchestrator.ts +107 -88
- package/src/interactive/application-controller.ts +21 -21
- package/src/interactive/bus-notices.ts +2 -2
- package/src/interactive/chat-loop.ts +8 -8
- package/src/interactive/chat-panel.ts +1 -1
- package/src/interactive/clio-editor.ts +105 -1
- package/src/interactive/context-activity.ts +8 -6
- package/src/interactive/context-meter.ts +3 -6
- package/src/interactive/context-overlay.ts +1 -1
- package/src/interactive/cost-overlay.ts +1 -1
- package/src/interactive/council-grid.ts +2 -2
- package/src/interactive/dispatch-board.ts +30 -33
- package/src/interactive/editor-bash.ts +21 -0
- package/src/interactive/editor-steer.ts +9 -4
- package/src/interactive/editor-submit.ts +24 -18
- package/src/interactive/external-editor.ts +1 -1
- package/src/interactive/file-reference-completion.ts +360 -0
- package/src/interactive/footer/dashboard.ts +15 -17
- package/src/interactive/footer/notifications.ts +14 -8
- package/src/interactive/footer/widgets.ts +2 -44
- package/src/interactive/interactive-application.ts +79 -59
- package/src/interactive/interactive-event-projection.ts +1 -1
- package/src/interactive/interactive-input-runtime.ts +2 -2
- package/src/interactive/interactive-presentation.ts +21 -16
- package/src/interactive/interactive-shell.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +63 -17
- package/src/interactive/interactive-subscriptions.ts +1 -1
- package/src/interactive/interactive-tickers.ts +1 -1
- package/src/interactive/keybinding-manager.ts +4 -4
- package/src/interactive/layout.ts +1 -1
- package/src/interactive/memory-overlay.ts +2 -2
- package/src/interactive/modal-marker.ts +2 -21
- package/src/interactive/mutation-preview.ts +1 -1
- package/src/interactive/overlay-frame.ts +4 -12
- package/src/interactive/overlay-general-openers.ts +6 -2
- package/src/interactive/overlay-key-routing.ts +7 -7
- package/src/interactive/overlay-lifecycle.ts +1 -1
- package/src/interactive/overlay-model-selectors.ts +3 -3
- package/src/interactive/overlays/agents.ts +2 -2
- package/src/interactive/overlays/ask-user.ts +25 -11
- package/src/interactive/overlays/context-reset.ts +28 -4
- package/src/interactive/overlays/cwd-fallback.ts +28 -4
- package/src/interactive/overlays/decisions.ts +4 -2
- package/src/interactive/overlays/fleet-run-approval.ts +3 -3
- package/src/interactive/overlays/handoff-review.ts +2 -2
- package/src/interactive/overlays/interop.ts +1 -1
- package/src/interactive/overlays/library-install-confirm.ts +1 -1
- package/src/interactive/overlays/message-picker.ts +1 -1
- package/src/interactive/overlays/model-selector.ts +39 -31
- package/src/interactive/overlays/prompts.ts +10 -4
- package/src/interactive/overlays/session-selector.ts +2 -2
- package/src/interactive/overlays/settings.ts +339 -293
- package/src/interactive/overlays/side-question.ts +2 -2
- package/src/interactive/overlays/skills-hub.ts +8 -8
- package/src/interactive/overlays/tree-selector.ts +2 -2
- package/src/interactive/panes-runtime.ts +36 -10
- package/src/interactive/permission-overlay.ts +2 -2
- package/src/interactive/renderers/retry-status.ts +12 -4
- package/src/interactive/renderers/tool-execution.ts +4 -4
- package/src/interactive/session-transcript.ts +3 -3
- package/src/interactive/slash-autocomplete.ts +454 -165
- package/src/interactive/slash-commands.ts +279 -183
- package/src/interactive/slash-spec.ts +160 -17
- package/src/interactive/status/controller.ts +2 -2
- package/src/interactive/stream-pacing-policy.ts +1 -1
- package/src/interactive/tasks-overlay.ts +20 -13
- package/src/interactive/terminal-lease.ts +6 -7
- package/src/interactive/turn-context.ts +11 -11
- package/src/interactive/turn-persistence.ts +2 -2
- package/src/interactive/turn-prewarm.ts +2 -2
- package/src/interactive/turn-runtime.ts +8 -8
- package/src/interactive/turn-state.ts +1 -1
- package/src/interactive/view/artifacts.ts +12 -9
- package/src/interactive/view/view-overlay.ts +13 -10
- package/src/interactive/watch-pane.ts +38 -10
- package/src/interactive/welcome-dashboard.ts +15 -15
- package/src/interactive/worker-progress.ts +4 -4
- package/src/interactive/worker-receipts.ts +1 -1
- package/src/interactive/worker-stream.ts +1 -4
- package/src/interactive/yazi-bridge.ts +12 -5
- package/src/tools/ask-user.ts +3 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/builtin-tool-catalog.ts +1 -1
- package/src/tools/compete-worktrees.ts +27 -17
- package/src/tools/context/index.ts +15 -1
- package/src/tools/dispatch-admission.ts +4 -2
- package/src/tools/dispatch-arguments.ts +1 -1
- package/src/tools/dispatch-plan.ts +0 -11
- package/src/tools/dispatch-run-events.ts +12 -10
- package/src/tools/dispatch-runner.ts +11 -6
- package/src/tools/dispatch.ts +1 -1
- package/src/tools/find.ts +1 -6
- package/src/tools/monitor.ts +4 -4
- package/src/tools/observers.ts +0 -33
- package/src/tools/task-worktree.ts +28 -7
- package/src/tools/verify/authoring.ts +3 -6
- package/src/tools/verify/frontend.ts +1 -1
- package/src/tools/web-fetch.ts +1 -1
- package/src/worker/entry.ts +4 -3
- package/src/worker/protocol.ts +16 -14
- package/src/worker/spec-contract.ts +2 -2
- package/src/worker/stdin-demux.ts +2 -2
- package/dist/chunk-GXNLGKAB.js +0 -571
- package/dist/chunk-VFA6GDY5.js +0 -1625
- package/dist/doctor-QOA5FNY5.js +0 -313
- package/src/engine/apis/degraded-inference.ts +0 -95
- /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
- /package/skills/meta/{clio-test → clio-coder-test}/references/test-map.md +0 -0
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
+
import { normalizeEvalSchemaId } from "./naming.js";
|
|
2
3
|
import { EVAL_VERDICT_SCHEMA_V1, type EvalVerdictEnvelopeV1 } from "./verdict.js";
|
|
3
4
|
|
|
4
|
-
export const EVAL_BEHAVIOR_SCENARIO_SCHEMA_V1 = "clio.eval.scenario.v1" as const;
|
|
5
|
-
export const EVAL_BEHAVIOR_SCHEMA_V1 = "clio.eval.behavior.v1" as const;
|
|
5
|
+
export const EVAL_BEHAVIOR_SCENARIO_SCHEMA_V1 = "clio-coder.eval.scenario.v1" as const;
|
|
6
|
+
export const EVAL_BEHAVIOR_SCHEMA_V1 = "clio-coder.eval.behavior.v1" as const;
|
|
6
7
|
|
|
7
8
|
export const EVAL_BEHAVIOR_CATEGORIES = [
|
|
8
9
|
"tool_choice",
|
|
@@ -102,7 +103,7 @@ export interface EvalBehaviorVerdictV1 {
|
|
|
102
103
|
|
|
103
104
|
export function parseEvalBehaviorScenarioV1(value: unknown, source = "behavioral scenario"): EvalBehaviorScenarioV1 {
|
|
104
105
|
const record = asRecord(value, source);
|
|
105
|
-
if (record.schema !== EVAL_BEHAVIOR_SCENARIO_SCHEMA_V1) {
|
|
106
|
+
if (normalizeEvalSchemaId(record.schema) !== EVAL_BEHAVIOR_SCENARIO_SCHEMA_V1) {
|
|
106
107
|
throw new Error(`${source}.schema: expected ${EVAL_BEHAVIOR_SCENARIO_SCHEMA_V1}`);
|
|
107
108
|
}
|
|
108
109
|
const corpus = asRecord(record.corpus, `${source}.corpus`);
|
|
@@ -153,7 +154,7 @@ export function parseEvalBehaviorScenarioV1(value: unknown, source = "behavioral
|
|
|
153
154
|
};
|
|
154
155
|
}
|
|
155
156
|
|
|
156
|
-
|
|
157
|
+
function canonicalizeEvalBehaviorJudgeInputV1(
|
|
157
158
|
value: unknown,
|
|
158
159
|
scenario: EvalBehaviorScenarioV1,
|
|
159
160
|
source = "behavioral judge input",
|
|
@@ -221,10 +222,10 @@ export function judgeEvalBehaviorV1(
|
|
|
221
222
|
|
|
222
223
|
export function parseEvalBehaviorVerdictV1(value: unknown, source = "behavioral verdict"): EvalBehaviorVerdictV1 {
|
|
223
224
|
const record = asRecord(value, source);
|
|
224
|
-
if (record.schema !== EVAL_BEHAVIOR_SCHEMA_V1)
|
|
225
|
+
if (normalizeEvalSchemaId(record.schema) !== EVAL_BEHAVIOR_SCHEMA_V1)
|
|
225
226
|
throw new Error(`${source}.schema: expected ${EVAL_BEHAVIOR_SCHEMA_V1}`);
|
|
226
227
|
const verdictRef = asRecord(record.verdictRef, `${source}.verdictRef`);
|
|
227
|
-
if (verdictRef.schema !== EVAL_VERDICT_SCHEMA_V1) {
|
|
228
|
+
if (normalizeEvalSchemaId(verdictRef.schema) !== EVAL_VERDICT_SCHEMA_V1) {
|
|
228
229
|
throw new Error(`${source}.verdictRef.schema: expected ${EVAL_VERDICT_SCHEMA_V1}`);
|
|
229
230
|
}
|
|
230
231
|
const corpus = asRecord(record.corpus, `${source}.corpus`);
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import { normalizeEvalSchemaId } from "./naming.js";
|
|
2
|
+
|
|
3
|
+
export const EVAL_EXECUTION_ENVELOPE_SCHEMA_V1 = "clio-coder.eval.execution-envelope.v1" as const;
|
|
2
4
|
|
|
3
5
|
export const EVAL_EXECUTION_MATRIX_DIMENSIONS_V1 = [
|
|
4
6
|
"prompt",
|
|
@@ -56,7 +58,7 @@ export interface EvalExecutionEnvelopeV1 {
|
|
|
56
58
|
|
|
57
59
|
export function parseEvalExecutionEnvelopeV1(value: unknown, source = "execution envelope"): EvalExecutionEnvelopeV1 {
|
|
58
60
|
const record = asRecord(value, source);
|
|
59
|
-
if (record.schema !== EVAL_EXECUTION_ENVELOPE_SCHEMA_V1) {
|
|
61
|
+
if (normalizeEvalSchemaId(record.schema) !== EVAL_EXECUTION_ENVELOPE_SCHEMA_V1) {
|
|
60
62
|
throw new Error(`${source}.schema: expected ${EVAL_EXECUTION_ENVELOPE_SCHEMA_V1}`);
|
|
61
63
|
}
|
|
62
64
|
const prompt = asRecord(record.prompt, `${source}.prompt`);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Legacy eval identifiers are normalized only after decoding; writers use canonical schema constants. */
|
|
2
|
+
export function normalizeEvalSchemaId(value: unknown): unknown {
|
|
3
|
+
return typeof value === "string" && value.startsWith("clio.eval.")
|
|
4
|
+
? `clio-coder.eval.${value.slice("clio.eval.".length)}`
|
|
5
|
+
: value;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function normalizeEvalRunnerKind(value: unknown): unknown {
|
|
9
|
+
return value === "clio-run" ? "clio-coder-run" : value;
|
|
10
|
+
}
|
|
@@ -129,7 +129,7 @@ export const CANONICAL_METRIC_PREFIXES = ["tools.calls.", "tools.blocked."] as c
|
|
|
129
129
|
|
|
130
130
|
export type EvalMetricName = (typeof CANONICAL_METRICS)[number];
|
|
131
131
|
export type EvalAssertionOp = "lt" | "lte" | "gt" | "gte" | "eq" | "neq";
|
|
132
|
-
export type EvalRunnerKind = "clio-run" | "context-index" | "context-init" | "external-command";
|
|
132
|
+
export type EvalRunnerKind = "clio-coder-run" | "context-index" | "context-init" | "external-command";
|
|
133
133
|
export type EvalWorkspaceKind = "local" | "git" | "temp-copy";
|
|
134
134
|
|
|
135
135
|
export interface EvalMetricAssertion {
|
|
@@ -189,7 +189,7 @@ export interface EvalRunnerV2 {
|
|
|
189
189
|
/** One-run headless authority used to exercise allow and deny recovery. */
|
|
190
190
|
autonomy?: "read-only" | "suggest" | "auto-edit" | "full-auto";
|
|
191
191
|
/**
|
|
192
|
-
* Fleet agent recipe id for the clio-run runner. When set the runner
|
|
192
|
+
* Fleet agent recipe id for the clio-coder-run runner. When set the runner
|
|
193
193
|
* invokes `clio-coder run --agent <id> --json`, whose stream ends with the full
|
|
194
194
|
* sealed RunReceipt, so receipt-derived evidence metrics resolve. Without
|
|
195
195
|
* it the main-agent headless path runs and emits no receipt.
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { parseEvalBehaviorScenarioV1 } from "./behavioral.js";
|
|
2
2
|
import { parseEvalExecutionMatrixDimensionsV1 } from "./execution-envelope.js";
|
|
3
|
+
import { normalizeEvalRunnerKind } from "./naming.js";
|
|
3
4
|
import {
|
|
4
5
|
EVAL_SUITE_V2_VERSION,
|
|
5
6
|
type EvalAssertionOp,
|
|
@@ -10,7 +11,7 @@ import {
|
|
|
10
11
|
type EvalWorkspaceKind,
|
|
11
12
|
} from "./suite.js";
|
|
12
13
|
|
|
13
|
-
const RUNNER_KINDS = new Set<EvalRunnerKind>(["clio-run", "context-index", "context-init", "external-command"]);
|
|
14
|
+
const RUNNER_KINDS = new Set<EvalRunnerKind>(["clio-coder-run", "context-index", "context-init", "external-command"]);
|
|
14
15
|
const WORKSPACE_KINDS = new Set<EvalWorkspaceKind>(["local", "git", "temp-copy"]);
|
|
15
16
|
const OPS = new Set<EvalAssertionOp>(["lt", "lte", "gt", "gte", "eq", "neq"]);
|
|
16
17
|
|
|
@@ -203,9 +204,12 @@ function readRunner(
|
|
|
203
204
|
issues.push({ path, message: "expected object" });
|
|
204
205
|
return null;
|
|
205
206
|
}
|
|
206
|
-
const kind = value.kind;
|
|
207
|
+
const kind = normalizeEvalRunnerKind(value.kind);
|
|
207
208
|
if (typeof kind !== "string" || !RUNNER_KINDS.has(kind as EvalRunnerKind)) {
|
|
208
|
-
issues.push({
|
|
209
|
+
issues.push({
|
|
210
|
+
path: `${path}.kind`,
|
|
211
|
+
message: "expected clio-coder-run, context-index, context-init, or external-command",
|
|
212
|
+
});
|
|
209
213
|
return null;
|
|
210
214
|
}
|
|
211
215
|
const prompt = optionalString(value, "prompt");
|
|
@@ -214,8 +218,8 @@ function readRunner(
|
|
|
214
218
|
if (autonomy !== undefined && !["read-only", "suggest", "auto-edit", "full-auto"].includes(autonomy)) {
|
|
215
219
|
issues.push({ path: `${path}.autonomy`, message: "expected read-only, suggest, auto-edit, or full-auto" });
|
|
216
220
|
}
|
|
217
|
-
if (agent !== undefined && kind !== "clio-run") {
|
|
218
|
-
issues.push({ path: `${path}.agent`, message: "agent is only valid on the clio-run runner" });
|
|
221
|
+
if (agent !== undefined && kind !== "clio-coder-run") {
|
|
222
|
+
issues.push({ path: `${path}.agent`, message: "agent is only valid on the clio-coder-run runner" });
|
|
219
223
|
}
|
|
220
224
|
const command = optionalString(value, "command");
|
|
221
225
|
return {
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import { normalizeEvalSchemaId } from "./naming.js";
|
|
2
|
+
|
|
3
|
+
export const EVAL_VERDICT_SCHEMA_V1 = "clio-coder.eval.verdict.v1" as const;
|
|
2
4
|
|
|
3
5
|
export const EVAL_TRACKED_METRIC_NAMES = [
|
|
4
6
|
"modelCalls",
|
|
@@ -68,7 +70,7 @@ export type EvalVerdictParseResult = { ok: true; verdict: EvalVerdictEnvelopeV1
|
|
|
68
70
|
/** Parse the v1 verdict and reject contradictions that could publish a false pass. */
|
|
69
71
|
export function parseEvalVerdictEnvelopeV1(value: unknown, source = "verdict"): EvalVerdictEnvelopeV1 {
|
|
70
72
|
const record = asRecord(value, source);
|
|
71
|
-
if (record.schema !== EVAL_VERDICT_SCHEMA_V1) {
|
|
73
|
+
if (normalizeEvalSchemaId(record.schema) !== EVAL_VERDICT_SCHEMA_V1) {
|
|
72
74
|
throw new Error(`${source}.schema: expected ${EVAL_VERDICT_SCHEMA_V1}`);
|
|
73
75
|
}
|
|
74
76
|
const scenarioId = readNonEmptyString(record, source, "scenarioId");
|
|
@@ -118,7 +118,7 @@ function parseArtifact(value: unknown, source: string): EvalRunArtifact {
|
|
|
118
118
|
evalId: readString(value, source, "evalId"),
|
|
119
119
|
taskFile: readString(value, source, "taskFile"),
|
|
120
120
|
taskFileHash: readString(value, source, "taskFileHash"),
|
|
121
|
-
|
|
121
|
+
clioCoder: parseClioProvenance(readEvalProvenance(value, source), `${source}.clioCoder`),
|
|
122
122
|
environment: parseEnvironmentProvenance(
|
|
123
123
|
readRequiredArtifactField(value, source, "environment"),
|
|
124
124
|
`${source}.environment`,
|
|
@@ -235,7 +235,7 @@ function parseRunPaths(value: unknown, source: string): EvalRunPaths {
|
|
|
235
235
|
function readRequiredArtifactField(
|
|
236
236
|
record: Record<string, unknown>,
|
|
237
237
|
source: string,
|
|
238
|
-
field: "
|
|
238
|
+
field: "environment" | "paths",
|
|
239
239
|
): unknown {
|
|
240
240
|
const value = record[field];
|
|
241
241
|
if (value === undefined) {
|
|
@@ -246,6 +246,16 @@ function readRequiredArtifactField(
|
|
|
246
246
|
return value;
|
|
247
247
|
}
|
|
248
248
|
|
|
249
|
+
function readEvalProvenance(record: Record<string, unknown>, source: string): unknown {
|
|
250
|
+
const value = record.clioCoder ?? record.clio;
|
|
251
|
+
if (value === undefined) {
|
|
252
|
+
throw new Error(
|
|
253
|
+
`eval artifact has an invalid schema: missing required field 'clioCoder' in ${source}. Re-run the evaluation suite to generate a complete artifact.`,
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
return value;
|
|
257
|
+
}
|
|
258
|
+
|
|
249
259
|
function parseHarnessMetrics(value: unknown, source: string): EvalHarnessMetrics {
|
|
250
260
|
if (!isRecord(value)) throw new Error(`${source}: expected object`);
|
|
251
261
|
return {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
2
2
|
import { tmpdir } from "node:os";
|
|
3
3
|
import { resolve } from "node:path";
|
|
4
|
+
import { namingCompatibilityEnvironment } from "../../../core/naming-compat.js";
|
|
4
5
|
import { resolveMetricAssertion } from "../compare/thresholds.js";
|
|
5
6
|
import { buildEvalExecutionEnvelopeV1, type EvalExecutionObservationV1 } from "../execution-provenance.js";
|
|
6
7
|
import { aggregateEvalVerdicts } from "../metrics/aggregate.js";
|
|
@@ -32,6 +33,7 @@ import { type EvalRunnerOutput, runExternalCommandRunner } from "../runners/exte
|
|
|
32
33
|
import { adaptSuiteV2ResultToBehaviorV1, adaptSuiteV2ResultToVerdictV1 } from "../schema/adapter.js";
|
|
33
34
|
import type { EvalArtifactResultV4, EvalArtifactV4 } from "../schema/artifact.js";
|
|
34
35
|
import { buildEvalBehaviorMetricsV1 } from "../schema/behavioral-metrics.js";
|
|
36
|
+
import { normalizeEvalSchemaId } from "../schema/naming.js";
|
|
35
37
|
import type { EvalServingConfigurationV1 } from "../schema/serving.js";
|
|
36
38
|
import type { EvalMetricAssertion, EvalSuiteTargetV2, LoadedEvalSuiteV2 } from "../schema/suite.js";
|
|
37
39
|
import { createEvalId } from "../store.js";
|
|
@@ -102,7 +104,7 @@ export async function runEvalSuiteV2(
|
|
|
102
104
|
}
|
|
103
105
|
|
|
104
106
|
/** Known receipt cost of one finished matrix item; unpriced runs count zero. */
|
|
105
|
-
|
|
107
|
+
function resultCostUsd(result: Pick<EvalArtifactResultV4, "metrics">): number {
|
|
106
108
|
const value = result.metrics["cost.usd"];
|
|
107
109
|
return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : 0;
|
|
108
110
|
}
|
|
@@ -156,7 +158,7 @@ async function runMatrixItem(
|
|
|
156
158
|
// state directory would mix sibling processes' runs and yesterday's sessions
|
|
157
159
|
// into the reading; pinning it here also means an item leaves nothing behind
|
|
158
160
|
// in the operator's own state.
|
|
159
|
-
const stateDir = await mkdtemp(resolve(tempCopy?.tempRoot ?? tmpdir(), "clio-eval-state-"));
|
|
161
|
+
const stateDir = await mkdtemp(resolve(tempCopy?.tempRoot ?? tmpdir(), "clio-coder-eval-state-"));
|
|
160
162
|
try {
|
|
161
163
|
workspace = await prepareWorkspace(loaded.baseDir, task, freshWorkspace, tempCopy);
|
|
162
164
|
const setup = await runCommandVerifiers(task.workspace.setup ?? [], workspace.dir, task.timeoutMs);
|
|
@@ -178,7 +180,11 @@ async function runMatrixItem(
|
|
|
178
180
|
// the workers it attested are still running.
|
|
179
181
|
const journalMetrics = invariantMetrics(stateDir, receiptExitCode);
|
|
180
182
|
const measurement = await measureTaskOutcome(task, workspace.dir, {
|
|
181
|
-
|
|
183
|
+
...namingCompatibilityEnvironment(
|
|
184
|
+
"CLIO_CODER_EVAL_RUNNER_STDOUT_FILE",
|
|
185
|
+
"CLIO_EVAL_RUNNER_STDOUT_FILE",
|
|
186
|
+
runnerStdoutFile,
|
|
187
|
+
),
|
|
182
188
|
});
|
|
183
189
|
executionObservation = measurement.executionObservation;
|
|
184
190
|
const metrics: Record<string, number | string | boolean | null> = {
|
|
@@ -407,13 +413,13 @@ function graderBehaviorMeasurement(stdout: string): {
|
|
|
407
413
|
continue;
|
|
408
414
|
}
|
|
409
415
|
if (!isRecord(value)) continue;
|
|
410
|
-
if (value.schema === "clio.eval.measure.v1" && isRecord(value.metrics)) {
|
|
416
|
+
if (normalizeEvalSchemaId(value.schema) === "clio-coder.eval.measure.v1" && isRecord(value.metrics)) {
|
|
411
417
|
for (const [key, metric] of Object.entries(value.metrics)) {
|
|
412
418
|
if (key !== "claims.unsupported" && key !== "completion.reported") continue;
|
|
413
419
|
if (typeof metric === "boolean" || (typeof metric === "number" && Number.isFinite(metric))) metrics[key] = metric;
|
|
414
420
|
}
|
|
415
421
|
}
|
|
416
|
-
if (value.schema === "clio.eval.execution-observation.v1") {
|
|
422
|
+
if (normalizeEvalSchemaId(value.schema) === "clio-coder.eval.execution-observation.v1") {
|
|
417
423
|
executionObservation = parseExecutionObservation(value);
|
|
418
424
|
}
|
|
419
425
|
}
|
|
@@ -503,7 +509,7 @@ function buildArtifact(
|
|
|
503
509
|
version: 4,
|
|
504
510
|
evalId,
|
|
505
511
|
suite: { id: loaded.suite.suite.id, hash: loaded.hash },
|
|
506
|
-
|
|
512
|
+
clioCoder: evalClioProvenance({ entry: clioEntry }),
|
|
507
513
|
environment: evalEnvironmentProvenance(),
|
|
508
514
|
matrix: {
|
|
509
515
|
...artifactMatrixIdentity(loaded.suite.matrix.targets),
|
|
@@ -126,7 +126,7 @@ export interface EvalRunArtifact {
|
|
|
126
126
|
evalId: string;
|
|
127
127
|
taskFile: string;
|
|
128
128
|
taskFileHash: string;
|
|
129
|
-
|
|
129
|
+
clioCoder: EvalClioProvenance;
|
|
130
130
|
environment: EvalEnvironmentProvenance;
|
|
131
131
|
target: string | null;
|
|
132
132
|
model: string | null;
|
|
@@ -7,7 +7,7 @@ import type { PreparedEvalWorkspace } from "./local.js";
|
|
|
7
7
|
|
|
8
8
|
export async function prepareGitWorkspace(workspace: EvalWorkspaceV2): Promise<PreparedEvalWorkspace> {
|
|
9
9
|
if (workspace.url === undefined) throw new Error("git workspace requires url");
|
|
10
|
-
const dest = await mkdtemp(resolve(tmpdir(), "clio-eval-git-"));
|
|
10
|
+
const dest = await mkdtemp(resolve(tmpdir(), "clio-coder-eval-git-"));
|
|
11
11
|
try {
|
|
12
12
|
await runGit(["clone", "--quiet", workspace.url, dest], process.cwd());
|
|
13
13
|
const ref = workspace.checkout ?? workspace.commit;
|
|
@@ -33,7 +33,7 @@ export async function prepareTempCopyWorkspace(
|
|
|
33
33
|
options: PrepareTempCopyWorkspaceOptions = {},
|
|
34
34
|
): Promise<PreparedEvalWorkspace> {
|
|
35
35
|
const source = resolve(baseDir, workspace.path ?? ".");
|
|
36
|
-
const dest = await mkdtemp(resolve(options.tempRoot ?? tmpdir(), "clio-eval-workspace-"));
|
|
36
|
+
const dest = await mkdtemp(resolve(options.tempRoot ?? tmpdir(), "clio-coder-eval-workspace-"));
|
|
37
37
|
try {
|
|
38
38
|
const selection = await gitCopySelection(source);
|
|
39
39
|
const excludes = workspace.excludes ?? [];
|
|
@@ -56,6 +56,7 @@ const MAX_TASK_CHARS = 500;
|
|
|
56
56
|
const TRANSCRIPT_TEXT_MAX_CHARS = 500;
|
|
57
57
|
const TOOL_PREVIEW_MAX_CHARS = 240;
|
|
58
58
|
const TASK_LEDGER_ROW_LIMIT = 200;
|
|
59
|
+
const MODEL_PRIVATE_MARKER = "[not sent to model]";
|
|
59
60
|
|
|
60
61
|
export interface BuildEvidenceOptions {
|
|
61
62
|
/** Evidence bundles are written under <dataDir>/evidence/. */
|
|
@@ -892,6 +893,7 @@ function sessionToolEvents(entries: ReadonlyArray<LinkedSessionEntry>): Evidence
|
|
|
892
893
|
for (const linked of entries) {
|
|
893
894
|
const entry = linked.entry;
|
|
894
895
|
if (entry.kind === "bashExecution") {
|
|
896
|
+
const contextMarker = entry.excludeFromContext === true ? `${MODEL_PRIVATE_MARKER} ` : "";
|
|
895
897
|
events.push({
|
|
896
898
|
source: "session-entry",
|
|
897
899
|
runId: linked.link.runId,
|
|
@@ -906,8 +908,8 @@ function sessionToolEvents(entries: ReadonlyArray<LinkedSessionEntry>): Evidence
|
|
|
906
908
|
timestamp: entry.timestamp,
|
|
907
909
|
linkKind: "session-bash-execution",
|
|
908
910
|
confidence: "exact",
|
|
909
|
-
argsPreview: truncateText(entry.command
|
|
910
|
-
resultPreview: truncateText(entry.output
|
|
911
|
+
argsPreview: truncateText(`${contextMarker}${entry.command}`, TOOL_PREVIEW_MAX_CHARS),
|
|
912
|
+
resultPreview: truncateText(`${contextMarker}${entry.output}`, TOOL_PREVIEW_MAX_CHARS),
|
|
911
913
|
});
|
|
912
914
|
continue;
|
|
913
915
|
}
|
|
@@ -1354,9 +1356,10 @@ function renderSessionTranscriptEntry(linked: LinkedSessionEntry): string[] {
|
|
|
1354
1356
|
}
|
|
1355
1357
|
if (entry.kind === "bashExecution") {
|
|
1356
1358
|
const status = entry.cancelled ? "cancelled" : entry.exitCode === null ? "exit=?" : `exit=${entry.exitCode}`;
|
|
1359
|
+
const contextMarker = entry.excludeFromContext === true ? ` ${MODEL_PRIVATE_MARKER}` : "";
|
|
1357
1360
|
return [
|
|
1358
|
-
`${prefix} bash ${status}: $ ${truncateText(entry.command, TRANSCRIPT_TEXT_MAX_CHARS)}`,
|
|
1359
|
-
` output: ${previewUnknown(entry.output)}`,
|
|
1361
|
+
`${prefix} bash ${status}${contextMarker}: $ ${truncateText(entry.command, TRANSCRIPT_TEXT_MAX_CHARS)}`,
|
|
1362
|
+
` output${contextMarker}: ${previewUnknown(entry.output)}`,
|
|
1360
1363
|
];
|
|
1361
1364
|
}
|
|
1362
1365
|
if (entry.kind === "branchSummary")
|
|
@@ -1625,7 +1628,7 @@ function parseRunReceipt(value: unknown, source: string): RunReceipt {
|
|
|
1625
1628
|
costUsd: readNumber(value, source, "costUsd"),
|
|
1626
1629
|
compiledPromptHash: readNullableString(value, source, "compiledPromptHash"),
|
|
1627
1630
|
staticCompositionHash: readNullableString(value, source, "staticCompositionHash"),
|
|
1628
|
-
|
|
1631
|
+
clioCoderVersion: readReceiptVersion(value, source),
|
|
1629
1632
|
piMonoVersion: readString(value, source, "piMonoVersion"),
|
|
1630
1633
|
platform: readString(value, source, "platform"),
|
|
1631
1634
|
nodeVersion: readString(value, source, "nodeVersion"),
|
|
@@ -1640,6 +1643,11 @@ function parseRunReceipt(value: unknown, source: string): RunReceipt {
|
|
|
1640
1643
|
};
|
|
1641
1644
|
}
|
|
1642
1645
|
|
|
1646
|
+
function readReceiptVersion(value: Record<string, unknown>, source: string): string {
|
|
1647
|
+
if (typeof value.clioCoderVersion === "string") return value.clioCoderVersion;
|
|
1648
|
+
return readString(value, source, "clioVersion");
|
|
1649
|
+
}
|
|
1650
|
+
|
|
1643
1651
|
function readToolStats(record: Record<string, unknown>, source: string, field: string): ToolCallStat[] {
|
|
1644
1652
|
const value = record[field];
|
|
1645
1653
|
if (!Array.isArray(value)) throw new Error(`${source}.${field}: expected array`);
|
|
@@ -24,7 +24,7 @@ export const INHERITED_PROJECT_CONTEXT = "none";
|
|
|
24
24
|
/** The delegation entry a given agent kind would be wired as. */
|
|
25
25
|
export function delegationEntryForKind(
|
|
26
26
|
kind: InteropAgentKind,
|
|
27
|
-
defaults: ClioSettings["
|
|
27
|
+
defaults: ClioSettings["integrations"]["externalAgents"]["defaults"],
|
|
28
28
|
): DelegationAgentConfig {
|
|
29
29
|
const recipe = kind.acp;
|
|
30
30
|
if (recipe === undefined) throw new Error(`interop kind ${kind.id} has no ACP recipe`);
|
|
@@ -35,7 +35,7 @@ export function delegationEntryForKind(
|
|
|
35
35
|
connectTimeoutMs: defaults.connectTimeoutMs,
|
|
36
36
|
turnTimeoutMs: defaults.turnTimeoutMs,
|
|
37
37
|
permissionTimeoutMs: defaults.permissionTimeoutMs,
|
|
38
|
-
toolGovernance: "clio-policy",
|
|
38
|
+
toolGovernance: "clio-coder-policy",
|
|
39
39
|
};
|
|
40
40
|
}
|
|
41
41
|
|
|
@@ -45,7 +45,7 @@ export function delegationEntryForKind(
|
|
|
45
45
|
* declined agent whose binary or version moved comes back as a fresh proposal.
|
|
46
46
|
*/
|
|
47
47
|
export function interopProposals(report: InteropReport, settings: ClioSettings): ReadonlyArray<InteropProposal> {
|
|
48
|
-
const configured = new Set(settings.
|
|
48
|
+
const configured = new Set(settings.integrations.externalAgents.entries.map((agent) => agent.id));
|
|
49
49
|
const proposals: InteropProposal[] = [];
|
|
50
50
|
for (const record of report.agents) {
|
|
51
51
|
const kind = interopAgentKind(record.kind);
|
|
@@ -57,7 +57,7 @@ export function interopProposals(report: InteropReport, settings: ClioSettings):
|
|
|
57
57
|
kind: kind.id,
|
|
58
58
|
label: kind.label,
|
|
59
59
|
fingerprint: record.fingerprint,
|
|
60
|
-
entry: delegationEntryForKind(kind, settings.
|
|
60
|
+
entry: delegationEntryForKind(kind, settings.integrations.externalAgents.defaults),
|
|
61
61
|
needsNetworkInstall: record.adapter !== "present",
|
|
62
62
|
});
|
|
63
63
|
}
|
|
@@ -149,7 +149,7 @@ export function interopBootHint(report: InteropReport, settings: ClioSettings):
|
|
|
149
149
|
(record) => ({ ...record, hintedFingerprint: record.fingerprint }),
|
|
150
150
|
);
|
|
151
151
|
const names = fresh.map((proposal) => proposal.entry.id).join(", ");
|
|
152
|
-
return `clio: ${names} detected on PATH and not configured. Run /interop to review.`;
|
|
152
|
+
return `clio-coder: ${names} detected on PATH and not configured. Run /interop to review.`;
|
|
153
153
|
}
|
|
154
154
|
|
|
155
155
|
/**
|
|
@@ -167,8 +167,8 @@ export function acceptInteropAgents(ids: ReadonlyArray<InteropAgentId>, report:
|
|
|
167
167
|
const wired: string[] = [];
|
|
168
168
|
updateSettings((settings) => {
|
|
169
169
|
for (const proposal of proposals) {
|
|
170
|
-
if (settings.
|
|
171
|
-
settings.
|
|
170
|
+
if (settings.integrations.externalAgents.entries.some((agent) => agent.id === proposal.entry.id)) continue;
|
|
171
|
+
settings.integrations.externalAgents.entries.push({ ...proposal.entry, args: [...proposal.entry.args] });
|
|
172
172
|
wired.push(proposal.entry.id);
|
|
173
173
|
}
|
|
174
174
|
});
|
|
@@ -39,7 +39,7 @@ export function createInteropBundle(_context: DomainContext): DomainBundle<Inter
|
|
|
39
39
|
// from the proposals, which read the file, and not yet in the configured
|
|
40
40
|
// list, which read the snapshot, so it was in neither until a reopen.
|
|
41
41
|
configured() {
|
|
42
|
-
return readSettings().
|
|
42
|
+
return readSettings().integrations.externalAgents.entries;
|
|
43
43
|
},
|
|
44
44
|
accept(ids) {
|
|
45
45
|
const result = acceptInteropAgents(ids, detected ?? readInteropReport() ?? EMPTY_REPORT);
|
|
@@ -491,7 +491,7 @@ export async function runDoctorFleetChecks(projectRoot: string = process.cwd()):
|
|
|
491
491
|
}
|
|
492
492
|
const nodes = settings.fleet?.nodes ?? [];
|
|
493
493
|
if (nodes.length === 0) return [];
|
|
494
|
-
const {
|
|
494
|
+
const { runFleetNodePreflight } = await import("../dispatch/fleet-preflight.js");
|
|
495
495
|
// Endpoint facts are per node. Every configured target is probed from every
|
|
496
496
|
// node, because a `localhost` URL names a different machine on each one and
|
|
497
497
|
// an orchestrator-side probe would describe none of them.
|
|
@@ -502,12 +502,6 @@ export async function runDoctorFleetChecks(projectRoot: string = process.cwd()):
|
|
|
502
502
|
...(target.defaultModel !== undefined ? { wireModelId: target.defaultModel } : {}),
|
|
503
503
|
}));
|
|
504
504
|
const records = await Promise.all(nodes.map((node) => runFleetNodePreflight(node, projectRoot, { targets })));
|
|
505
|
-
try {
|
|
506
|
-
recordFleetPreflight(records);
|
|
507
|
-
} catch {
|
|
508
|
-
// The findings below still tell the operator what happened; a store
|
|
509
|
-
// write failure just means placement will keep denying these nodes.
|
|
510
|
-
}
|
|
511
505
|
return records.map((record) => ({
|
|
512
506
|
ok: true,
|
|
513
507
|
level: record.ok ? "ok" : "warn",
|
|
@@ -533,14 +527,26 @@ export async function runDoctorInteropChecks(projectRoot: string = process.cwd()
|
|
|
533
527
|
} catch {
|
|
534
528
|
return [];
|
|
535
529
|
}
|
|
536
|
-
const
|
|
530
|
+
const configDir = resolveClioDirs().config;
|
|
531
|
+
// Extension discovery resolves through the ensuring config accessor. With no
|
|
532
|
+
// config root there cannot be user Clio extensions or skills to inspect, so
|
|
533
|
+
// keep the broken partial home untouched and retain the binary checks below.
|
|
534
|
+
const skills = existsSync(configDir) ? loadSkills({ cwd: projectRoot, configDir }) : { items: [], diagnostics: [] };
|
|
537
535
|
const foreign = skills.items.filter((skill) => FOREIGN_SKILL_SOURCES.has(skill.source));
|
|
538
|
-
const report = await detectInteropAgents(
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
536
|
+
const report = await detectInteropAgents(
|
|
537
|
+
{
|
|
538
|
+
cwd: projectRoot,
|
|
539
|
+
// Version probes use the shared command runner, which prepares managed Git
|
|
540
|
+
// hooks before spawning. Doctor promises observation only, so PATH presence
|
|
541
|
+
// is the strongest safe fact here.
|
|
542
|
+
probeVersion: false,
|
|
543
|
+
skillSources: skills.items.map((skill) => skill.source),
|
|
544
|
+
},
|
|
545
|
+
// Reading the prior report resolves through the ensuring state accessor.
|
|
546
|
+
// Existing decisions are irrelevant to doctor's presence-only projection.
|
|
547
|
+
[],
|
|
548
|
+
);
|
|
549
|
+
const configured = new Set(settings.integrations.externalAgents.entries.map((agent) => agent.id));
|
|
544
550
|
const findings: DoctorFinding[] = report.agents.map((agent) => {
|
|
545
551
|
const kind = interopAgentKind(agent.kind);
|
|
546
552
|
const status = configured.has(agent.kind)
|
|
@@ -557,7 +563,7 @@ export async function runDoctorInteropChecks(projectRoot: string = process.cwd()
|
|
|
557
563
|
: "";
|
|
558
564
|
return { ok: true, level: "ok", name: `interop ${agent.kind}`, detail: `${head} (${status})${where}` };
|
|
559
565
|
});
|
|
560
|
-
for (const agent of settings.
|
|
566
|
+
for (const agent of settings.integrations.externalAgents.entries) {
|
|
561
567
|
if (resolveOnPath([agent.command]).presence === "present") continue;
|
|
562
568
|
findings.push({
|
|
563
569
|
ok: true,
|
|
@@ -618,14 +624,14 @@ function configuredModelRoles(
|
|
|
618
624
|
): ConfiguredModelRole[] {
|
|
619
625
|
const roles: ConfiguredModelRole[] = [];
|
|
620
626
|
if (target.defaultModel) roles.push({ role: "defaultModel", model: target.defaultModel });
|
|
621
|
-
if (settings.
|
|
622
|
-
roles.push({ role: "orchestrator.model", model: settings.
|
|
627
|
+
if (settings.chat.target === target.id && settings.chat.model) {
|
|
628
|
+
roles.push({ role: "orchestrator.model", model: settings.chat.model });
|
|
623
629
|
}
|
|
624
|
-
if (settings.
|
|
625
|
-
roles.push({ role: "background.model", model: settings.
|
|
630
|
+
if (settings.context.memory.target === target.id && settings.context.memory.model) {
|
|
631
|
+
roles.push({ role: "background.model", model: settings.context.memory.model });
|
|
626
632
|
}
|
|
627
|
-
if (settings.
|
|
628
|
-
roles.push({ role: "workers.default.model", model: settings.
|
|
633
|
+
if (settings.fleet.default.target === target.id && settings.fleet.default.model) {
|
|
634
|
+
roles.push({ role: "workers.default.model", model: settings.fleet.default.model });
|
|
629
635
|
}
|
|
630
636
|
return roles;
|
|
631
637
|
}
|
|
@@ -0,0 +1,155 @@
|
|
|
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 { settingsPath, withSettingsLock } from "../../../core/config.js";
|
|
6
|
+
import { safeResourceWrite } from "../../../core/safe-resource-write.js";
|
|
7
|
+
import { type MutableNamingStateReport, migrateMutableNamingState } from "../naming-mutable-state.js";
|
|
8
|
+
import { inspectInstalledNamingResources, type NamingResourceReport } from "../naming-resources.js";
|
|
9
|
+
import { inspectToolMarkerNaming, type ToolMarkerNamingReport } from "../naming-tool-markers.js";
|
|
10
|
+
import { regenerateYaziNamingProfile, type YaziNamingRegenerationReport } from "../naming-yazi.js";
|
|
11
|
+
import type { Migration } from "./index.js";
|
|
12
|
+
|
|
13
|
+
export const CLIO_CODER_NAMING_MIGRATION_ID = "2026-09-01-clio-coder-naming";
|
|
14
|
+
export const CLIO_CODER_NAMING_SETTINGS_BACKUP_SUFFIX = ".pre-clio-coder-naming.bak";
|
|
15
|
+
|
|
16
|
+
export interface NamingSettingsTransform {
|
|
17
|
+
document: Record<string, unknown>;
|
|
18
|
+
replacements: string[];
|
|
19
|
+
conflicts: string[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface NamingSettingsFileReport {
|
|
23
|
+
path: string;
|
|
24
|
+
changed: boolean;
|
|
25
|
+
backupPath: string | null;
|
|
26
|
+
replacements: string[];
|
|
27
|
+
conflicts: string[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface ClioCoderNamingMigrationReport {
|
|
31
|
+
migrationId: typeof CLIO_CODER_NAMING_MIGRATION_ID;
|
|
32
|
+
version: 1;
|
|
33
|
+
settings: NamingSettingsFileReport[];
|
|
34
|
+
toolMarkers: ToolMarkerNamingReport[];
|
|
35
|
+
resources: NamingResourceReport[];
|
|
36
|
+
yazi: YaziNamingRegenerationReport[];
|
|
37
|
+
mutableState: MutableNamingStateReport[];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
41
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function visitNamingValues(value: unknown, path: string, replacements: string[], conflicts: string[]): void {
|
|
45
|
+
if (Array.isArray(value)) {
|
|
46
|
+
for (const [index, entry] of value.entries()) visitNamingValues(entry, `${path}[${index}]`, replacements, conflicts);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (!isPlainObject(value)) return;
|
|
50
|
+
|
|
51
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
52
|
+
const entryPath = path ? `${path}.${key}` : key;
|
|
53
|
+
if (key === "lifecycle" && entry === "clio-managed") {
|
|
54
|
+
value[key] = "clio-coder-managed";
|
|
55
|
+
replacements.push(`${entryPath}: clio-managed -> clio-coder-managed`);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (key === "toolGovernance" && entry === "clio-policy") {
|
|
59
|
+
value[key] = "clio-coder-policy";
|
|
60
|
+
replacements.push(`${entryPath}: clio-policy -> clio-coder-policy`);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (key === "keybindings" && isPlainObject(entry)) {
|
|
64
|
+
for (const legacyKey of Object.keys(entry).filter((name) => name.startsWith("clio."))) {
|
|
65
|
+
const canonicalKey = `clio-coder.${legacyKey.slice("clio.".length)}`;
|
|
66
|
+
const legacyPath = `${entryPath}.${legacyKey}`;
|
|
67
|
+
if (Object.hasOwn(entry, canonicalKey)) {
|
|
68
|
+
delete entry[legacyKey];
|
|
69
|
+
conflicts.push(`${legacyPath}: discarded because canonical ${entryPath}.${canonicalKey} wins`);
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
entry[canonicalKey] = entry[legacyKey];
|
|
73
|
+
delete entry[legacyKey];
|
|
74
|
+
replacements.push(`${legacyPath} -> ${entryPath}.${canonicalKey}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
visitNamingValues(entry, entryPath, replacements, conflicts);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Pure deterministic settings transform shared by upgrade and doctor --fix. */
|
|
82
|
+
export function transformNamingSettingsDocument(raw: unknown): NamingSettingsTransform {
|
|
83
|
+
if (!isPlainObject(raw)) throw new Error("Clio Coder naming migration expected a YAML map at the document root");
|
|
84
|
+
const document = structuredClone(raw);
|
|
85
|
+
const replacements: string[] = [];
|
|
86
|
+
const conflicts: string[] = [];
|
|
87
|
+
visitNamingValues(document, "", replacements, conflicts);
|
|
88
|
+
return { document, replacements, conflicts };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Rewrite one settings file atomically when it contains deterministic released
|
|
93
|
+
* aliases. The caller owns any cross-process lock needed for the selected file.
|
|
94
|
+
*/
|
|
95
|
+
export function migrateNamingSettingsFile(path: string): NamingSettingsFileReport {
|
|
96
|
+
if (!existsSync(path)) return { path, changed: false, backupPath: null, replacements: [], conflicts: [] };
|
|
97
|
+
let parsed: unknown;
|
|
98
|
+
try {
|
|
99
|
+
parsed = parseYaml(readFileSync(path, "utf8"));
|
|
100
|
+
} catch (error) {
|
|
101
|
+
throw new Error(
|
|
102
|
+
`Clio Coder naming migration could not read and parse ${path}: ${error instanceof Error ? error.message : String(error)}`,
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
const transformed = transformNamingSettingsDocument(parsed);
|
|
106
|
+
const changed = transformed.replacements.length > 0 || transformed.conflicts.length > 0;
|
|
107
|
+
if (!changed) {
|
|
108
|
+
return {
|
|
109
|
+
path,
|
|
110
|
+
changed: false,
|
|
111
|
+
backupPath: null,
|
|
112
|
+
replacements: transformed.replacements,
|
|
113
|
+
conflicts: transformed.conflicts,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
const backupPath = `${path}${CLIO_CODER_NAMING_SETTINGS_BACKUP_SUFFIX}`;
|
|
117
|
+
safeResourceWrite(path, stringifyYaml(transformed.document), {
|
|
118
|
+
encoding: "utf8",
|
|
119
|
+
mode: 0o644,
|
|
120
|
+
backup: { path: backupPath },
|
|
121
|
+
});
|
|
122
|
+
return {
|
|
123
|
+
path,
|
|
124
|
+
changed: true,
|
|
125
|
+
backupPath,
|
|
126
|
+
replacements: transformed.replacements,
|
|
127
|
+
conflicts: transformed.conflicts,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function namingMigrationReportPath(stateDir: string): string {
|
|
132
|
+
return join(stateDir, "migration-reports", `${CLIO_CODER_NAMING_MIGRATION_ID}.json`);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const migration: Migration = {
|
|
136
|
+
id: CLIO_CODER_NAMING_MIGRATION_ID,
|
|
137
|
+
async up(stateDir: string): Promise<void> {
|
|
138
|
+
const settings: NamingSettingsFileReport[] = [];
|
|
139
|
+
withSettingsLock(() => settings.push(migrateNamingSettingsFile(settingsPath())));
|
|
140
|
+
const report: ClioCoderNamingMigrationReport = {
|
|
141
|
+
migrationId: CLIO_CODER_NAMING_MIGRATION_ID,
|
|
142
|
+
version: 1,
|
|
143
|
+
settings,
|
|
144
|
+
toolMarkers: inspectToolMarkerNaming({ fix: true }),
|
|
145
|
+
resources: inspectInstalledNamingResources({ fix: true }),
|
|
146
|
+
yazi: [regenerateYaziNamingProfile()],
|
|
147
|
+
mutableState: migrateMutableNamingState(stateDir),
|
|
148
|
+
};
|
|
149
|
+
const target = namingMigrationReportPath(stateDir);
|
|
150
|
+
mkdirSync(join(stateDir, "migration-reports"), { recursive: true });
|
|
151
|
+
safeResourceWrite(target, `${JSON.stringify(report, null, 2)}\n`, { encoding: "utf8", mode: 0o644 });
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
export default migration;
|