@iowarp/clio-coder 0.4.0 → 0.4.2
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 +131 -0
- package/CONTRIBUTING.md +59 -36
- package/README.md +407 -375
- package/SECURITY.md +2 -1
- package/dist/{acp-G5WJBNCT.js → acp-TMDQZDIG.js} +14 -14
- package/dist/{agents-FMV2Q5G4.js → agents-5N5NG3XG.js} +45 -34
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-3IDSJEIK.js → auth-Z5CCBXKQ.js} +22 -21
- package/dist/{builtins-XCZWXSC7.js → builtins-K6TNDT24.js} +6 -6
- package/dist/{chunk-GR5G2PVF.js → chunk-2HFQNRV3.js} +15 -10
- package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
- package/dist/{chunk-HJJTYUHX.js → chunk-2NHR3NAY.js} +168 -1406
- package/dist/chunk-2X4RYJTJ.js +39 -0
- package/dist/{chunk-UXMFQ54G.js → chunk-2Z2IKEXI.js} +39 -43
- package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
- package/dist/chunk-34BHNEE3.js +1846 -0
- package/dist/{chunk-YJX4SHTD.js → chunk-35MSIRKH.js} +9 -4
- package/dist/chunk-3EBYEESD.js +314 -0
- package/dist/{chunk-CTJ4RNAA.js → chunk-3F7VUY77.js} +2 -2
- package/dist/chunk-3KIPBMUA.js +308 -0
- package/dist/chunk-3M6DQK6S.js +362 -0
- package/dist/{chunk-BPKCPIL7.js → chunk-462T4EGZ.js} +3 -3
- package/dist/{chunk-QLFS5GO2.js → chunk-4JDLP6ZS.js} +44 -37
- package/dist/{chunk-LDQ2ZF2M.js → chunk-4O6MANBS.js} +6 -6
- package/dist/{chunk-O6TL7WWY.js → chunk-54ODD65L.js} +6 -6
- package/dist/{chunk-JDG2WCRO.js → chunk-5KW52TEP.js} +5 -5
- package/dist/{chunk-NHLBIGRH.js → chunk-5PFYMY2V.js} +41 -18
- package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
- package/dist/chunk-77QIVUZB.js +1334 -0
- package/dist/{chunk-HWHKMHUA.js → chunk-7BHIY2MW.js} +9 -15
- package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
- package/dist/{chunk-VAZSBTKF.js → chunk-AZ4WMN4W.js} +2 -2
- package/dist/{chunk-B7OBL7PK.js → chunk-B74PXLU7.js} +21 -11
- package/dist/{chunk-CY6FY24N.js → chunk-B7HM5Z7T.js} +15 -15
- package/dist/{chunk-ULC6OTWO.js → chunk-BO7Y52RY.js} +88 -27
- package/dist/chunk-BTK3SSSK.js +67 -0
- package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
- package/dist/{chunk-DQITNCXG.js → chunk-BYMNWQ7O.js} +149 -159
- package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
- package/dist/{chunk-Z4TXYIEG.js → chunk-CRFOIAX3.js} +10 -10
- package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
- package/dist/{chunk-3BT2XMV4.js → chunk-CYZW7JHJ.js} +53 -60
- package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
- package/dist/chunk-D7E7WCDF.js +27 -0
- package/dist/{chunk-X3YGUTOB.js → chunk-DYHAXKHD.js} +90 -62
- package/dist/{chunk-QBJA7R7N.js → chunk-DZAW46HP.js} +3 -3
- package/dist/{chunk-MLKNTWH2.js → chunk-DZEK6CJN.js} +22 -22
- package/dist/{chunk-K5C3NCBD.js → chunk-E7GT7O5N.js} +5 -5
- package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
- package/dist/chunk-F2I26BDK.js +66 -0
- package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
- package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
- package/dist/{chunk-32KWKNSF.js → chunk-FVDGR2ZL.js} +4 -4
- package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
- package/dist/{chunk-SJ5ZKQ4S.js → chunk-HIICAHCJ.js} +2 -2
- package/dist/chunk-HJWWJ6IL.js +184 -0
- package/dist/{chunk-WZR7K7ZX.js → chunk-HKMD33FO.js} +32 -83
- package/dist/chunk-HLAFFSEK.js +360 -0
- package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
- package/dist/{chunk-KFZI4NIL.js → chunk-I64IFBLB.js} +152 -31
- package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
- package/dist/{chunk-BUMFYQFY.js → chunk-I66ZTYNP.js} +543 -267
- package/dist/{chunk-2OQE55CK.js → chunk-I7XBWTYH.js} +2 -2
- package/dist/{chunk-GKF55TAZ.js → chunk-IDNA72AH.js} +104 -3
- package/dist/{chunk-GCSMB2KY.js → chunk-IKOZFYBN.js} +1 -1
- package/dist/{chunk-J4W7KFM7.js → chunk-IKSLQ4XV.js} +5439 -3475
- package/dist/{chunk-6DB53AJS.js → chunk-IMXMHHMQ.js} +171 -30
- package/dist/{chunk-AB44T6BB.js → chunk-JBCS7CRR.js} +8 -7
- package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
- package/dist/{chunk-SP2RXXYO.js → chunk-JWJGP5DQ.js} +10 -10
- package/dist/{chunk-HZHHCK24.js → chunk-KKOJXO6R.js} +527 -325
- package/dist/chunk-KPXDY6QF.js +47 -0
- package/dist/{chunk-LQ3DZAMX.js → chunk-LJID3DYZ.js} +8 -2
- package/dist/{chunk-7MCTRUCE.js → chunk-M2DAX4F6.js} +2 -2
- package/dist/{chunk-VEO4AP2K.js → chunk-M2WXEHER.js} +4 -3
- package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
- package/dist/{chunk-YDFRH54B.js → chunk-MCMZMDAC.js} +4 -4
- package/dist/{chunk-J5Q24KAG.js → chunk-MNJGS2IN.js} +5 -6
- package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
- package/dist/chunk-NDDGJUXD.js +81 -0
- package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
- package/dist/chunk-NMJXSHBJ.js +283 -0
- package/dist/{chunk-VYMXRQI6.js → chunk-O3YUNJZ2.js} +88 -100
- package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
- package/dist/{chunk-Z2RR6MAK.js → chunk-P75RZCJW.js} +28 -6
- package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
- package/dist/{chunk-DYJP44XW.js → chunk-PGF63K6I.js} +2 -2
- package/dist/chunk-PJX3WQUQ.js +42 -0
- package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
- package/dist/{chunk-2JDWVJND.js → chunk-Q4XWMHX6.js} +5 -7
- package/dist/{chunk-W5VSYASO.js → chunk-QQLGQY2A.js} +46 -87
- package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
- package/dist/{chunk-C2LTL2W6.js → chunk-RLYRBIYQ.js} +463 -180
- package/dist/{chunk-4ZG3XFUR.js → chunk-S66XZJOF.js} +14 -23
- package/dist/{chunk-I5VEOC6I.js → chunk-SSEYRH53.js} +13 -14
- package/dist/chunk-SZAA6XDG.js +30 -0
- package/dist/{chunk-CODPRO7Q.js → chunk-TPEQIQIE.js} +7 -7
- package/dist/{chunk-QLL7ILRG.js → chunk-UBRFI4HS.js} +1151 -614
- package/dist/{chunk-O4XIVISU.js → chunk-UH347SHR.js} +227 -47
- package/dist/{chunk-OQBA45DZ.js → chunk-UH632ZYL.js} +2 -2
- package/dist/chunk-UXCU4E3T.js +303 -0
- package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
- package/dist/{chunk-IQ7KR472.js → chunk-VIA6RFQZ.js} +8 -13
- package/dist/{chunk-V5DHCITQ.js → chunk-VKPAQYEB.js} +49 -19
- package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
- package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
- package/dist/{chunk-3XML7CDN.js → chunk-W4YEMFBX.js} +3 -3
- package/dist/{chunk-U77AMWDL.js → chunk-W6NIE6OW.js} +44 -23
- package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
- package/dist/{chunk-QREDIESB.js → chunk-X7IARSHT.js} +15 -9
- package/dist/{chunk-3URVFKWK.js → chunk-XE3PCIXH.js} +5 -5
- package/dist/{chunk-FEFIFZTL.js → chunk-XGDPUNND.js} +2 -2
- package/dist/{chunk-F4CKPOEQ.js → chunk-XOXV5GKE.js} +119 -38
- package/dist/chunk-XQRY4DTA.js +657 -0
- package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
- package/dist/{chunk-NQQH3YT7.js → chunk-YJISEZKC.js} +3 -3
- package/dist/{chunk-X75E3D2N.js → chunk-ZGNYYXQ6.js} +18 -16
- package/dist/{chunk-LY4S7GJC.js → chunk-ZNT2M6TG.js} +20 -18
- package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
- package/dist/{chunk-IBEBSCYA.js → chunk-ZW4HH5JJ.js} +43 -34
- package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
- package/dist/cli/index.js +38 -37
- package/dist/{clio-2JXHBBY5.js → clio-7VB377CC.js} +12 -13
- package/dist/{code-nav-3YYRMYNF.js → code-nav-YVLCYA7V.js} +86 -18
- 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-4HVOS65E.js} +112 -63
- package/dist/{configure-TEGEBYCA.js → configure-PIWO7B24.js} +25 -22
- package/dist/{context-E6H5RNMC.js → context-IYEHL3WQ.js} +53 -47
- package/dist/{context-GSXUE4CT.js → context-KQYIWPWT.js} +68 -42
- package/dist/{context-AV7OEZ4D.js → context-N6ZE3LGJ.js} +11 -11
- package/dist/{context-clear-SHIBYK6T.js → context-clear-G4OGZJDS.js} +53 -47
- package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-BWLF6LJP.js} +12 -11
- package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-2QQAITS3.js} +67 -58
- package/dist/{docs-23KQS3XK.js → docs-PD3EXDKU.js} +20 -25
- package/dist/doctor-LHBD36VU.js +773 -0
- package/dist/{eval-TFBYQH4H.js → eval-C45FYRJ6.js} +68 -49
- package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-6DEJPLBF.js} +7 -8
- package/dist/{evidence-ERGESKGN.js → evidence-6SHONYAF.js} +50 -44
- package/dist/{evolve-VDXTSYCJ.js → evolve-KRKMV72X.js} +49 -43
- package/dist/{extensions-7BGBHN57.js → extensions-KPZ2UHBB.js} +8 -6
- package/dist/{fleet-2RRVDF2V.js → fleet-IVTCKDHT.js} +93 -79
- package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EDWL3IT7.js} +10 -9
- package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-YP3YEFGK.js} +6 -6
- package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-ZFWKHY2M.js} +19 -15
- package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-FVUNCBML.js} +50 -45
- package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-UN5XED4R.js} +5 -9
- package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-XOWC4HSX.js} +22 -17
- package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-UN3SODEL.js} +48 -43
- package/dist/fleet-view-TWHJKCN6.js +96 -0
- package/dist/{init-DN2WWLFE.js → init-T2QORQ3Y.js} +72 -66
- package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
- package/dist/{interop-OZBKXAYL.js → interop-IN5I2A66.js} +13 -11
- package/dist/{library-YWZG7IMW.js → library-LSCATDLZ.js} +23 -18
- package/dist/{memory-I4C4HMLW.js → memory-HYOKAGGJ.js} +51 -45
- package/dist/{models-CEYXJBO6.js → models-2GPMFYCM.js} +42 -33
- package/dist/{monitor-NZ6GCI3P.js → monitor-E4ASVUJH.js} +56 -50
- package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-DDMPR3PY.js} +2676 -1507
- package/dist/{panes-KY6W3V2E.js → panes-E3RUXOW5.js} +5 -5
- package/dist/panes-IXKLOKA2.js +75 -0
- package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
- package/dist/{reset-DQ6FGCSH.js → reset-OAQP3W4O.js} +7 -8
- package/dist/{resources-BB3MVJMD.js → resources-OTRSN34L.js} +23 -17
- package/dist/{run-H2GQDUER.js → run-5DEYH5QK.js} +95 -84
- package/dist/{share-GTJN6A5O.js → share-IHWTLO3M.js} +26 -19
- package/dist/{skills-L55TEW6R.js → skills-IYMXMKW4.js} +25 -20
- package/dist/{skills-eval-XVXPH2JI.js → skills-eval-DROHSJAR.js} +63 -65
- package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-D7X4L4ZX.js} +21 -16
- package/dist/{slash-commands-ZSGASKJC.js → slash-commands-QBM7UZ3B.js} +38 -33
- package/dist/{steer-RZGSCY4R.js → steer-Z5DO23FJ.js} +3 -3
- package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
- package/dist/{targets-NCPZ644J.js → targets-P2FUC4IL.js} +64 -61
- package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-YREJ3JX2.js} +15 -10
- package/dist/{tools-DAF3DI3C.js → tools-5B7RO6MV.js} +10 -8
- package/dist/{trace-FYVW2MQA.js → trace-YMGMUM6A.js} +101 -8
- 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-PXK3S2YM.js} +36 -61
- package/dist/{usage-3NLHGTU2.js → usage-ME5MPXGX.js} +58 -53
- package/dist/{verifiers-SSQONKRT.js → verifiers-BVZ7IWOO.js} +10 -9
- package/dist/{verify-3U6J7FZI.js → verify-5K7ZKQFC.js} +9 -8
- package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPARV2K7.js} +2 -3
- package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-F5W5QTYY.js} +74 -70
- package/dist/{with-panes-MKB46MPQ.js → with-panes-BYOJCLAM.js} +78 -246
- package/dist/worker/entry.js +83 -63
- package/docs/README.md +176 -81
- package/docs/{acp.md → architecture/acp.md} +36 -20
- package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
- package/docs/{architecture.md → architecture/architecture.md} +43 -22
- package/docs/{artifact-placement.md → architecture/artifact-placement.md} +26 -23
- package/docs/architecture/artifact-versions.md +90 -0
- package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
- package/docs/{context-engine.md → architecture/context-engine.md} +25 -25
- package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
- package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
- package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
- package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
- package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
- package/docs/{model-catalog.md → architecture/model-catalog.md} +40 -17
- package/docs/{observability.md → architecture/observability.md} +26 -13
- package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
- package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +55 -20
- package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +35 -24
- package/docs/{safety-model.md → architecture/safety-model.md} +20 -15
- package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
- package/docs/architecture/time-conventions.md +125 -0
- package/docs/{trace-store.md → architecture/trace-store.md} +26 -13
- package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
- package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
- package/docs/{built-in-agents.md → guide/built-in-agents.md} +70 -46
- package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +73 -62
- package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -444
- package/docs/guide/configuration-reference.md +1158 -0
- package/docs/{environment-variables.md → guide/environment-variables.md} +31 -27
- package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +8 -3
- package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
- package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +47 -49
- package/docs/{glossary.md → guide/glossary.md} +14 -11
- package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +45 -14
- package/docs/guide/panes-and-files.md +290 -0
- package/docs/{proactive-memory.md → guide/proactive-memory.md} +79 -66
- package/docs/{resource-library.md → guide/resource-library.md} +13 -4
- package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +7 -3
- package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
- package/docs/{troubleshooting.md → guide/troubleshooting.md} +10 -5
- package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +13 -10
- package/docs/history/release-cut-checklist.md +207 -0
- package/docs/{development-pipeline.md → process/development-pipeline.md} +24 -26
- package/docs/process/documentation-coverage.md +100 -0
- package/docs/process/documentation-guide.md +187 -0
- package/docs/{eval-runner.md → process/eval-runner.md} +41 -50
- package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
- package/docs/{evolution.md → process/evolution.md} +2 -2
- package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +17 -10
- package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
- package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
- package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
- 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 +13 -21
- package/skills/README.md +51 -42
- package/skills/coding/ast-grep/SKILL.md +9 -3
- package/skills/coding/coding-standards/SKILL.md +9 -3
- package/skills/coding/prototype/SKILL.md +9 -3
- package/skills/coding/tdd/SKILL.md +9 -3
- package/skills/context/context-handoff/SKILL.md +13 -4
- package/skills/context/context-handoff/evals.md +3 -3
- package/skills/context/context-prime/SKILL.md +9 -3
- package/skills/context/context-prime/evals.md +2 -2
- package/skills/git/file-ticket/SKILL.md +10 -5
- 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 +9 -3
- package/skills/git/resolve-merge-conflicts/evals.md +2 -2
- package/skills/git/ship/SKILL.md +10 -4
- package/skills/git/ship/evals.md +4 -4
- package/skills/git/worktree-create/SKILL.md +8 -3
- package/skills/git/worktree-create/evals.md +6 -6
- package/skills/git/worktree-merge/SKILL.md +8 -3
- package/skills/git/worktree-merge/evals.md +6 -6
- package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +22 -12
- package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +5 -4
- package/skills/meta/clio-coder-test/SKILL.md +146 -0
- package/skills/meta/{clio-test → clio-coder-test}/evals.md +10 -5
- package/skills/meta/clio-coder-test/references/harness.md +102 -0
- package/skills/meta/clio-coder-test/references/test-map.md +96 -0
- package/skills/meta/credentials/SKILL.md +10 -3
- package/skills/meta/find-skills/SKILL.md +9 -3
- package/skills/meta/herdr/SKILL.md +9 -3
- package/skills/meta/skill-craft/SKILL.md +39 -16
- package/skills/planning/architecture/SKILL.md +9 -3
- package/skills/planning/backlog/SKILL.md +9 -3
- package/skills/planning/prd/SKILL.md +9 -3
- package/skills/planning/product-intent/SKILL.md +9 -3
- package/skills/planning/tech-spec/SKILL.md +9 -3
- package/skills/registry.yaml +66 -66
- package/skills/research/arxiv-literature/SKILL.md +9 -3
- package/skills/research/experiment-protocol/SKILL.md +10 -3
- package/skills/research/scientific-debugging/SKILL.md +10 -3
- package/skills/research/scientific-debugging/evals.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +10 -3
- package/skills/skill-marketplace.json +285 -66
- package/skills/workflow/cut-it/SKILL.md +11 -3
- package/skills/workflow/design-council/SKILL.md +12 -3
- package/skills/workflow/grill-me/SKILL.md +9 -3
- package/skills/workflow/workflow-distiller/SKILL.md +9 -3
- package/src/cli/acp.ts +2 -2
- package/src/cli/args.ts +2 -2
- package/src/cli/auth.ts +2 -2
- package/src/cli/bootstrap-generate.ts +6 -6
- package/src/cli/clio.ts +6 -1
- package/src/cli/config-inspect.ts +68 -15
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure.ts +27 -31
- package/src/cli/default-target.ts +1 -1
- package/src/cli/docs.ts +28 -20
- package/src/cli/doctor-naming.ts +323 -0
- package/src/cli/doctor-panes.ts +46 -14
- package/src/cli/doctor-toolchain.ts +31 -10
- package/src/cli/doctor.ts +15 -1
- package/src/cli/eval-inventory.ts +8 -8
- package/src/cli/eval.ts +1 -2
- package/src/cli/evidence-detail.ts +1 -1
- package/src/cli/evidence-inventory.ts +1 -1
- package/src/cli/extensions.ts +2 -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 +9 -6
- package/src/cli/index.ts +2 -1
- package/src/cli/internal-dispatch.ts +3 -4
- 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/panes.ts +19 -5
- package/src/cli/reset.ts +1 -1
- package/src/cli/run.ts +13 -17
- package/src/cli/share.ts +6 -2
- package/src/cli/skills-eval.ts +14 -14
- package/src/cli/targets.ts +25 -30
- package/src/cli/trace-inspect.ts +1 -1
- package/src/cli/trace.ts +96 -4
- 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 +6 -6
- package/src/core/artifact-paths.ts +1 -1
- package/src/core/bash-exec.ts +132 -87
- package/src/core/boot-trace.ts +3 -3
- package/src/core/bus-events.ts +51 -6
- package/src/core/bus-trace.ts +2 -2
- package/src/core/compile-cache.ts +1 -1
- package/src/core/config.ts +1066 -886
- package/src/core/defaults.ts +326 -530
- package/src/core/dispatch-outcome.ts +16 -0
- 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 +33 -52
- package/src/core/naming-compat.ts +45 -0
- package/src/core/naming-events.ts +62 -0
- package/src/core/prompt-hint.ts +9 -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/builtins/architect.md +2 -3
- package/src/domains/agents/builtins/coder.md +3 -2
- package/src/domains/agents/builtins/debugger.md +2 -2
- package/src/domains/agents/builtins/documenter.md +2 -2
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/oracle.md +1 -1
- package/src/domains/agents/builtins/provenance.md +1 -1
- package/src/domains/agents/builtins/researcher.md +1 -1
- package/src/domains/agents/builtins/scout.md +1 -1
- package/src/domains/agents/builtins/tester.md +2 -2
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +1 -1
- package/src/domains/agents/catalog.ts +14 -26
- package/src/domains/agents/contract.ts +2 -0
- package/src/domains/agents/extension.ts +26 -4
- 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 +56 -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 -6
- package/src/domains/context/prompt-context.ts +1 -1
- package/src/domains/context/wiki/assemble.ts +2 -2
- package/src/domains/context/working-set/path-index.ts +1 -0
- 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/capability-match.ts +10 -0
- 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 +169 -82
- 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/host-verification.ts +435 -39
- package/src/domains/dispatch/intent-requirements.ts +10 -0
- package/src/domains/dispatch/intent.ts +18 -1
- package/src/domains/dispatch/joint-route-resolver.ts +1 -1
- package/src/domains/dispatch/path-scope.ts +220 -70
- 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 +9 -19
- package/src/domains/dispatch/state.ts +2 -3
- package/src/domains/dispatch/tool-stats.ts +1 -1
- package/src/domains/dispatch/transport.ts +47 -40
- package/src/domains/dispatch/types.ts +58 -6
- package/src/domains/dispatch/worker-protocol.ts +2 -2
- package/src/domains/eval/artifacts/store.ts +10 -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 +20 -3
- 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/trust-status.ts +10 -1
- package/src/domains/extensions/contract.ts +15 -1
- package/src/domains/extensions/discovery.ts +238 -41
- package/src/domains/extensions/extension.ts +105 -6
- package/src/domains/extensions/index.ts +24 -0
- package/src/domains/extensions/integrity.ts +189 -0
- package/src/domains/extensions/manager.ts +17 -1
- package/src/domains/extensions/resource-path.ts +27 -0
- package/src/domains/extensions/resources.ts +18 -38
- package/src/domains/extensions/snapshot-store.ts +39 -0
- package/src/domains/extensions/snapshot.ts +180 -0
- package/src/domains/extensions/state.ts +385 -57
- package/src/domains/extensions/types.ts +118 -1
- 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-extension-install-digests.ts +27 -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 +22 -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 +276 -0
- package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
- package/src/domains/lifecycle/naming-yazi.ts +86 -0
- package/src/domains/lifecycle/upgrade-notice.ts +1 -1
- package/src/domains/memory/task-memory-handoff.ts +6 -3
- package/src/domains/middleware/contract.ts +26 -0
- package/src/domains/middleware/extension.ts +24 -24
- package/src/domains/middleware/hook-receipts.ts +27 -4
- package/src/domains/middleware/hooks-io.ts +65 -32
- package/src/domains/middleware/hooks.ts +64 -0
- package/src/domains/middleware/index.ts +35 -4
- package/src/domains/middleware/marketplace-offer.ts +339 -0
- package/src/domains/middleware/registrations.ts +326 -0
- package/src/domains/middleware/runtime.ts +30 -2
- package/src/domains/middleware/snapshot.ts +20 -7
- package/src/domains/mux/contract.ts +195 -25
- package/src/domains/mux/detect.ts +23 -6
- package/src/domains/mux/dock-controller.ts +365 -0
- package/src/domains/mux/extension.ts +7 -1
- package/src/domains/mux/index.ts +21 -1
- package/src/domains/mux/operations.ts +72 -5
- 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/assets/yazi.toml +2 -2
- 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 +79 -7
- package/src/domains/mux/yazi/theme.ts +117 -17
- package/src/domains/observability/contract.ts +10 -11
- package/src/domains/observability/extension.ts +12 -4
- package/src/domains/observability/out-of-turn-usage.ts +2 -2
- package/src/domains/observability/projection.ts +15 -91
- package/src/domains/observability/trace-store.ts +65 -19
- package/src/domains/prompts/compiler.ts +75 -55
- package/src/domains/prompts/contract.ts +15 -3
- package/src/domains/prompts/extension.ts +100 -12
- package/src/domains/prompts/fragments/identity/clio-worker.md +2 -4
- package/src/domains/prompts/fragments/identity/clio.md +6 -12
- package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
- package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
- package/src/domains/prompts/fragments/operating/contract.md +7 -15
- package/src/domains/prompts/fragments/operating/delegation.md +32 -34
- package/src/domains/prompts/fragments/operating/skills.md +11 -18
- package/src/domains/prompts/fragments/operating/worker.md +1 -8
- package/src/domains/providers/extension.ts +5 -5
- package/src/domains/providers/index.ts +1 -1
- package/src/domains/providers/knowledge-base-path.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +99 -23
- 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} +671 -106
- package/src/domains/providers/plugins.ts +1 -1
- package/src/domains/providers/resolver.ts +1 -1
- package/src/domains/providers/runtime-resolution.ts +31 -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 +9 -4
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -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/cost-provenance.ts +19 -0
- package/src/domains/providers/types/knowledge-base.ts +13 -0
- package/src/domains/providers/types/local-model-quirks.ts +87 -39
- 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 +41 -18
- 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/call-target.ts +1 -1
- package/src/domains/safety/finish-contract.ts +2 -1
- package/src/domains/safety/loop-detector.ts +7 -4
- 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/session/task-board.ts +10 -9
- package/src/domains/share/archive.ts +249 -43
- 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 +89 -35
- 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 +4 -23
- package/src/engine/apis/lmstudio.ts +4 -9
- package/src/engine/apis/ollama-native.ts +9 -9
- package/src/engine/apis/openai-completions.ts +30 -27
- package/src/engine/apis/output-budget.ts +8 -18
- package/src/engine/apis/residency.ts +10 -35
- 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/gemma-channel-filter.ts +19 -0
- package/src/engine/loop-guard.ts +92 -17
- 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 +54 -24
- package/src/engine/worker-tools.ts +3 -1
- package/src/entry/extension-hook-sources.ts +28 -0
- package/src/entry/extension-reload.ts +309 -0
- package/src/entry/orchestrator.ts +163 -120
- package/src/interactive/application-controller.ts +23 -22
- package/src/interactive/bus-notices.ts +10 -3
- package/src/interactive/chat-loop-messages.ts +3 -13
- package/src/interactive/chat-loop.ts +18 -9
- package/src/interactive/chat-panel.ts +37 -14
- package/src/interactive/chat-renderer.ts +71 -7
- 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 +36 -44
- 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 +15 -44
- package/src/interactive/interactive-application.ts +116 -61
- package/src/interactive/interactive-event-projection.ts +1 -1
- package/src/interactive/interactive-input-runtime.ts +6 -2
- package/src/interactive/interactive-presentation.ts +22 -17
- package/src/interactive/interactive-shell.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +65 -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/extensions.ts +9 -1
- package/src/interactive/overlays/fleet-run-approval.ts +3 -3
- package/src/interactive/overlays/handoff-review.ts +2 -2
- package/src/interactive/overlays/help-reference.ts +13 -0
- 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 +360 -303
- 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 +145 -43
- package/src/interactive/permission-overlay.ts +2 -2
- package/src/interactive/prompt-cache-identity.ts +88 -0
- 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 +401 -190
- package/src/interactive/slash-spec.ts +160 -17
- package/src/interactive/status/controller.ts +2 -2
- package/src/interactive/stream-pacing-policy.ts +1 -24
- package/src/interactive/tasks-overlay.ts +20 -13
- package/src/interactive/terminal-lease.ts +6 -7
- package/src/interactive/turn-context.ts +41 -26
- 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 +72 -11
- package/src/tools/agent-tools.ts +30 -1
- package/src/tools/artifact.ts +2 -2
- package/src/tools/ask-user.ts +6 -6
- package/src/tools/bash.ts +2 -2
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +52 -22
- package/src/tools/codewiki/code-nav-surface.ts +6 -0
- package/src/tools/codewiki/code-nav.ts +99 -13
- package/src/tools/compete-worktrees.ts +27 -17
- package/src/tools/context/docs-engine.ts +20 -7
- package/src/tools/context/index.ts +44 -13
- package/src/tools/core-bootstrap.ts +28 -6
- package/src/tools/credential-present.ts +1 -2
- package/src/tools/dispatch-admission.ts +4 -2
- package/src/tools/dispatch-arguments.ts +6 -2
- package/src/tools/dispatch-plan.ts +48 -15
- package/src/tools/dispatch-run-events.ts +13 -11
- package/src/tools/dispatch-runner.ts +11 -6
- package/src/tools/dispatch-schema.ts +338 -0
- package/src/tools/dispatch-types.ts +3 -0
- package/src/tools/dispatch.ts +9 -254
- package/src/tools/find.ts +1 -6
- package/src/tools/ledger.ts +3 -5
- package/src/tools/monitor-surface.ts +5 -13
- package/src/tools/monitor.ts +4 -4
- package/src/tools/observation.ts +4 -5
- package/src/tools/observers.ts +0 -33
- package/src/tools/panes-surface.ts +4 -11
- package/src/tools/panes.ts +4 -2
- package/src/tools/policy.ts +15 -2
- package/src/tools/read.ts +5 -6
- package/src/tools/registry.ts +30 -7
- package/src/tools/result-shaping.ts +18 -14
- package/src/tools/steer-surface.ts +1 -1
- package/src/tools/task-worktree.ts +28 -7
- package/src/tools/tasks.ts +1 -1
- package/src/tools/truncate.ts +6 -5
- package/src/tools/verify/authoring.ts +3 -6
- package/src/tools/verify/frontend.ts +1 -1
- package/src/tools/verify/surface.ts +6 -12
- package/src/tools/web-fetch-surface.ts +1 -3
- 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-36EJLSQQ.js +0 -814
- package/dist/chunk-GXNLGKAB.js +0 -571
- package/dist/chunk-K7VKOLQQ.js +0 -15
- package/dist/chunk-PMZCIOCJ.js +0 -25
- package/dist/chunk-SUCTJL45.js +0 -45
- package/dist/chunk-SUW5DORT.js +0 -819
- package/dist/chunk-TZ3SGWZZ.js +0 -48
- package/dist/chunk-UOV2BYIW.js +0 -107
- package/dist/chunk-VFA6GDY5.js +0 -1625
- package/dist/doctor-QOA5FNY5.js +0 -313
- package/dist/fleet-view-ZCON35AG.js +0 -102
- package/dist/panes-HMABYVO4.js +0 -58
- package/docs/artifact-versions.md +0 -67
- package/docs/documentation-coverage.md +0 -46
- package/docs/documentation-guide.md +0 -167
- package/docs/release-cut-checklist.md +0 -193
- package/docs/time-conventions.md +0 -101
- package/skills/meta/clio-test/SKILL.md +0 -133
- package/skills/meta/clio-test/references/harness.md +0 -126
- package/skills/meta/clio-test/references/test-map.md +0 -69
- package/src/engine/apis/degraded-inference.ts +0 -95
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cpSync,
|
|
3
|
+
existsSync,
|
|
4
|
+
mkdirSync,
|
|
5
|
+
readdirSync,
|
|
6
|
+
readFileSync,
|
|
7
|
+
renameSync,
|
|
8
|
+
rmSync,
|
|
9
|
+
statSync,
|
|
10
|
+
writeFileSync,
|
|
11
|
+
} from "node:fs";
|
|
12
|
+
import { homedir } from "node:os";
|
|
13
|
+
import path from "node:path";
|
|
14
|
+
|
|
15
|
+
import { parse as parseYaml } from "yaml";
|
|
16
|
+
import { resolvePackageRoot } from "../../core/package-root.js";
|
|
17
|
+
import { fsyncDirectory } from "../../core/safe-resource-write.js";
|
|
18
|
+
import { resolveClioDirs } from "../../core/xdg.js";
|
|
19
|
+
import { INTEROP_AGENT_KINDS } from "../interop/registry.js";
|
|
20
|
+
import { normalizedSkillHash, stripProvenanceFrontmatter } from "../resources/skills/content-hash.js";
|
|
21
|
+
|
|
22
|
+
const LEGACY_SKILL_NAMES = [
|
|
23
|
+
["clio-dev", "clio-coder-dev"],
|
|
24
|
+
["clio-test", "clio-coder-test"],
|
|
25
|
+
] as const;
|
|
26
|
+
|
|
27
|
+
export type NamingResourceStatus = "absent" | "canonical-present" | "modified" | "renamable" | "renamed";
|
|
28
|
+
|
|
29
|
+
export interface NamingResourceReport {
|
|
30
|
+
kind: "skill";
|
|
31
|
+
legacyPath: string;
|
|
32
|
+
canonicalPath: string;
|
|
33
|
+
status: NamingResourceStatus;
|
|
34
|
+
detail: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface NamingResourceOptions {
|
|
38
|
+
cwd?: string;
|
|
39
|
+
configDir?: string;
|
|
40
|
+
/** Home directory whose interop skill roots are inspected; defaults to the OS home. */
|
|
41
|
+
home?: string;
|
|
42
|
+
packageRoot?: string;
|
|
43
|
+
fix?: boolean;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function canonicalizeNamingText(text: string): string {
|
|
47
|
+
return text
|
|
48
|
+
.replaceAll("clio-dev", "clio-coder-dev")
|
|
49
|
+
.replaceAll("clio-test", "clio-coder-test")
|
|
50
|
+
.replace(/^clio:/gmu, "clio-coder:")
|
|
51
|
+
.replace(/^(\s*source:\s*)clio\s*$/gmu, "$1clio-coder");
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function installedHash(raw: string): string | null {
|
|
55
|
+
const match = raw.match(/^\s*installed-hash:\s*["']?([0-9a-f]{64})["']?\s*$/mu);
|
|
56
|
+
return match?.[1] ?? null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function regularFiles(root: string, current = root): string[] {
|
|
60
|
+
const out: string[] = [];
|
|
61
|
+
for (const entry of readdirSync(current, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
62
|
+
const full = path.join(current, entry.name);
|
|
63
|
+
if (entry.isDirectory()) out.push(...regularFiles(root, full));
|
|
64
|
+
else if (entry.isFile()) out.push(path.relative(root, full));
|
|
65
|
+
else return [];
|
|
66
|
+
}
|
|
67
|
+
return out;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function provesUnmodifiedShippedCopy(legacyDir: string, canonicalBundleDir: string): boolean {
|
|
71
|
+
let legacyFiles: string[];
|
|
72
|
+
let canonicalFiles: string[];
|
|
73
|
+
try {
|
|
74
|
+
legacyFiles = regularFiles(legacyDir);
|
|
75
|
+
canonicalFiles = regularFiles(canonicalBundleDir);
|
|
76
|
+
} catch {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
if (legacyFiles.length === 0 || legacyFiles.join("\0") !== canonicalFiles.join("\0")) return false;
|
|
80
|
+
for (const relative of legacyFiles) {
|
|
81
|
+
const legacyRaw = readFileSync(path.join(legacyDir, relative), "utf8");
|
|
82
|
+
const canonicalRaw = readFileSync(path.join(canonicalBundleDir, relative), "utf8");
|
|
83
|
+
if (relative === "SKILL.md") {
|
|
84
|
+
const recordedHash = installedHash(legacyRaw);
|
|
85
|
+
if (recordedHash === null || recordedHash !== normalizedSkillHash(legacyRaw)) return false;
|
|
86
|
+
if (canonicalizeNamingText(stripProvenanceFrontmatter(legacyRaw)) !== stripProvenanceFrontmatter(canonicalRaw))
|
|
87
|
+
return false;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (canonicalizeNamingText(legacyRaw) !== canonicalRaw) return false;
|
|
91
|
+
}
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function rewriteStagedCopy(stage: string, canonicalBundleDir: string): void {
|
|
96
|
+
const canonicalSkillHash = normalizedSkillHash(readFileSync(path.join(canonicalBundleDir, "SKILL.md"), "utf8"));
|
|
97
|
+
for (const relative of regularFiles(stage)) {
|
|
98
|
+
const file = path.join(stage, relative);
|
|
99
|
+
let next = canonicalizeNamingText(readFileSync(file, "utf8"));
|
|
100
|
+
if (relative === "SKILL.md") {
|
|
101
|
+
next = next.replace(/^(\s*installed-hash:\s*).+$/mu, `$1"${canonicalSkillHash}"`);
|
|
102
|
+
}
|
|
103
|
+
writeFileSync(file, next, "utf8");
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
let resourceSwapSequence = 0;
|
|
108
|
+
|
|
109
|
+
function migrateProvenSkill(legacyDir: string, canonicalDir: string, canonicalBundleDir: string): void {
|
|
110
|
+
const suffix = `${process.pid}-${++resourceSwapSequence}`;
|
|
111
|
+
const stage = `${canonicalDir}.clio-coder-naming-stage-${suffix}`;
|
|
112
|
+
const backup = `${legacyDir}.clio-coder-naming-backup-${suffix}`;
|
|
113
|
+
mkdirSync(path.dirname(canonicalDir), { recursive: true });
|
|
114
|
+
cpSync(legacyDir, stage, { recursive: true });
|
|
115
|
+
try {
|
|
116
|
+
rewriteStagedCopy(stage, canonicalBundleDir);
|
|
117
|
+
renameSync(legacyDir, backup);
|
|
118
|
+
try {
|
|
119
|
+
renameSync(stage, canonicalDir);
|
|
120
|
+
} catch (error) {
|
|
121
|
+
renameSync(backup, legacyDir);
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
124
|
+
rmSync(backup, { recursive: true, force: true });
|
|
125
|
+
fsyncDirectory(path.dirname(canonicalDir));
|
|
126
|
+
} catch (error) {
|
|
127
|
+
rmSync(stage, { recursive: true, force: true });
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function existingDirectory(candidate: string): boolean {
|
|
133
|
+
try {
|
|
134
|
+
return statSync(candidate).isDirectory();
|
|
135
|
+
} catch {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** Inspect only the selected user root and current project; never scan arbitrary repositories. */
|
|
141
|
+
export function inspectInstalledNamingResources(options: NamingResourceOptions = {}): NamingResourceReport[] {
|
|
142
|
+
const cwd = options.cwd ?? process.cwd();
|
|
143
|
+
const configDir = options.configDir ?? resolveClioDirs().config;
|
|
144
|
+
const packageRoot = options.packageRoot ?? resolvePackageRoot();
|
|
145
|
+
const roots = [path.join(configDir, "skills"), path.join(cwd, ".clio-coder", "skills")];
|
|
146
|
+
const reports: NamingResourceReport[] = [];
|
|
147
|
+
for (const root of roots) {
|
|
148
|
+
for (const [legacyName, canonicalName] of LEGACY_SKILL_NAMES) {
|
|
149
|
+
const legacyPath = path.join(root, legacyName);
|
|
150
|
+
const canonicalPath = path.join(root, canonicalName);
|
|
151
|
+
if (!existingDirectory(legacyPath)) {
|
|
152
|
+
reports.push({ kind: "skill", legacyPath, canonicalPath, status: "absent", detail: "legacy skill absent" });
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
if (existsSync(canonicalPath)) {
|
|
156
|
+
reports.push({
|
|
157
|
+
kind: "skill",
|
|
158
|
+
legacyPath,
|
|
159
|
+
canonicalPath,
|
|
160
|
+
status: "canonical-present",
|
|
161
|
+
detail: "canonical skill already exists; legacy copy left untouched",
|
|
162
|
+
});
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
const canonicalBundleDir = path.join(packageRoot, "skills", "meta", canonicalName);
|
|
166
|
+
if (!existingDirectory(canonicalBundleDir) || !provesUnmodifiedShippedCopy(legacyPath, canonicalBundleDir)) {
|
|
167
|
+
reports.push({
|
|
168
|
+
kind: "skill",
|
|
169
|
+
legacyPath,
|
|
170
|
+
canonicalPath,
|
|
171
|
+
status: "modified",
|
|
172
|
+
detail: "frontmatter/provenance/hash do not prove an unmodified shipped copy; left untouched",
|
|
173
|
+
});
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
if (options.fix) migrateProvenSkill(legacyPath, canonicalPath, canonicalBundleDir);
|
|
177
|
+
reports.push({
|
|
178
|
+
kind: "skill",
|
|
179
|
+
legacyPath,
|
|
180
|
+
canonicalPath,
|
|
181
|
+
status: options.fix ? "renamed" : "renamable",
|
|
182
|
+
detail: options.fix
|
|
183
|
+
? "proven unmodified shipped copy renamed and canonicalized"
|
|
184
|
+
: "proven unmodified shipped copy can be renamed by doctor --fix",
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return reports;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export interface ModelOverlayNamingInspection {
|
|
192
|
+
path: string;
|
|
193
|
+
legacyFile: boolean;
|
|
194
|
+
legacyMetadataKeys: number;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export interface SkillMetadataNamingInspection {
|
|
198
|
+
path: string;
|
|
199
|
+
legacyMetadataKey: boolean;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function collectSkillFiles(root: string, current = root): string[] {
|
|
203
|
+
if (!existingDirectory(current)) return [];
|
|
204
|
+
const out: string[] = [];
|
|
205
|
+
for (const entry of readdirSync(current, { withFileTypes: true })) {
|
|
206
|
+
const full = path.join(current, entry.name);
|
|
207
|
+
if (entry.isDirectory()) out.push(...collectSkillFiles(root, full));
|
|
208
|
+
else if (entry.isFile() && entry.name === "SKILL.md") out.push(full);
|
|
209
|
+
}
|
|
210
|
+
return out;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Read-only inventory of released skill metadata keys in every root the skill
|
|
215
|
+
* loader reads: the Clio user and project roots plus each interop agent's
|
|
216
|
+
* user and project compatibility roots (`.claude/skills`, `.agents/skills`,
|
|
217
|
+
* ...). The loader warns for a legacy key in any of them, so the doctor has to
|
|
218
|
+
* look where the loader looks or it reports "canonical" while boot warns.
|
|
219
|
+
*/
|
|
220
|
+
export function inspectSkillMetadataNaming(
|
|
221
|
+
options: Pick<NamingResourceOptions, "cwd" | "configDir" | "home"> = {},
|
|
222
|
+
): SkillMetadataNamingInspection[] {
|
|
223
|
+
const cwd = options.cwd ?? process.cwd();
|
|
224
|
+
const configDir = options.configDir ?? resolveClioDirs().config;
|
|
225
|
+
const home = options.home ?? homedir();
|
|
226
|
+
const roots = new Set<string>([path.join(configDir, "skills"), path.join(cwd, ".clio-coder", "skills")]);
|
|
227
|
+
for (const kind of INTEROP_AGENT_KINDS) {
|
|
228
|
+
if (kind.userSkillRoot !== undefined) roots.add(path.join(home, kind.userSkillRoot));
|
|
229
|
+
if (kind.projectSkillRoot !== undefined) roots.add(path.join(cwd, kind.projectSkillRoot));
|
|
230
|
+
}
|
|
231
|
+
return [...roots].flatMap((root) =>
|
|
232
|
+
collectSkillFiles(root).map((file) => ({
|
|
233
|
+
path: file,
|
|
234
|
+
legacyMetadataKey: /^clio:\s*(?:#.*)?$/mu.test(readFileSync(file, "utf8")),
|
|
235
|
+
})),
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function countLegacyModelMetadata(value: unknown): number {
|
|
240
|
+
if (Array.isArray(value)) return value.reduce((count, entry) => count + countLegacyModelMetadata(entry), 0);
|
|
241
|
+
if (typeof value !== "object" || value === null) return 0;
|
|
242
|
+
const record = value as Record<string, unknown>;
|
|
243
|
+
return (
|
|
244
|
+
(Object.hasOwn(record, "clio") ? 1 : 0) +
|
|
245
|
+
Object.values(record).reduce<number>((count, entry) => count + countLegacyModelMetadata(entry), 0)
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/** Read-only overlay inventory. User catalog files are never silently rewritten. */
|
|
250
|
+
export function inspectModelOverlayNaming(
|
|
251
|
+
options: Pick<NamingResourceOptions, "cwd" | "configDir"> = {},
|
|
252
|
+
): ModelOverlayNamingInspection[] {
|
|
253
|
+
const cwd = options.cwd ?? process.cwd();
|
|
254
|
+
const configDir = options.configDir ?? resolveClioDirs().config;
|
|
255
|
+
const roots = [path.join(configDir, "model-catalog.d"), path.join(cwd, ".clio-coder", "model-catalog.d")];
|
|
256
|
+
const inspections: ModelOverlayNamingInspection[] = [];
|
|
257
|
+
for (const root of roots) {
|
|
258
|
+
if (!existingDirectory(root)) continue;
|
|
259
|
+
for (const entry of readdirSync(root, { withFileTypes: true })) {
|
|
260
|
+
if (!entry.isFile() || (!entry.name.endsWith(".yaml") && !entry.name.endsWith(".yml"))) continue;
|
|
261
|
+
const file = path.join(root, entry.name);
|
|
262
|
+
let legacyMetadataKeys = 0;
|
|
263
|
+
try {
|
|
264
|
+
legacyMetadataKeys = countLegacyModelMetadata(parseYaml(readFileSync(file, "utf8")));
|
|
265
|
+
} catch {
|
|
266
|
+
// The catalog loader owns the parse diagnostic; naming still reports the filename.
|
|
267
|
+
}
|
|
268
|
+
inspections.push({
|
|
269
|
+
path: file,
|
|
270
|
+
legacyFile: entry.name === "clio-local-coding-targets.yaml",
|
|
271
|
+
legacyMetadataKeys,
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return inspections;
|
|
276
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, renameSync, rmSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
|
|
4
|
+
import { fsyncDirectory } from "../../core/safe-resource-write.js";
|
|
5
|
+
import { resolveClioDirs } from "../../core/xdg.js";
|
|
6
|
+
import { findPinnedTool } from "../toolchain/registry.js";
|
|
7
|
+
|
|
8
|
+
export const LEGACY_TOOL_MARKER = "clio-install.json";
|
|
9
|
+
export const CANONICAL_TOOL_MARKER = "clio-coder-install.json";
|
|
10
|
+
|
|
11
|
+
interface ValidToolMarker {
|
|
12
|
+
id: string;
|
|
13
|
+
version: string;
|
|
14
|
+
sha256: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type ToolMarkerNamingStatus =
|
|
18
|
+
| "renamable"
|
|
19
|
+
| "renamed"
|
|
20
|
+
| "invalid-legacy"
|
|
21
|
+
| "canonical-conflict"
|
|
22
|
+
| "agreeing-duplicate"
|
|
23
|
+
| "duplicate-removed";
|
|
24
|
+
|
|
25
|
+
export interface ToolMarkerNamingReport {
|
|
26
|
+
tool: string;
|
|
27
|
+
version: string;
|
|
28
|
+
legacyPath: string;
|
|
29
|
+
canonicalPath: string;
|
|
30
|
+
status: ToolMarkerNamingStatus;
|
|
31
|
+
detail: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface ToolMarkerNamingOptions {
|
|
35
|
+
dataDir?: string;
|
|
36
|
+
fix?: boolean;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function childDirectories(root: string): string[] {
|
|
40
|
+
try {
|
|
41
|
+
return readdirSync(root, { withFileTypes: true })
|
|
42
|
+
.filter((entry) => entry.isDirectory() && !entry.name.startsWith("."))
|
|
43
|
+
.map((entry) => entry.name)
|
|
44
|
+
.sort((left, right) => left.localeCompare(right));
|
|
45
|
+
} catch {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function readValidMarker(path: string, tool: string, version: string): ValidToolMarker | null {
|
|
51
|
+
try {
|
|
52
|
+
const value: unknown = JSON.parse(readFileSync(path, "utf8"));
|
|
53
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return null;
|
|
54
|
+
const marker = value as Record<string, unknown>;
|
|
55
|
+
if (marker.id !== tool || marker.version !== version) return null;
|
|
56
|
+
if (typeof marker.sha256 !== "string" || !/^[0-9a-f]{64}$/u.test(marker.sha256)) return null;
|
|
57
|
+
return { id: tool, version, sha256: marker.sha256 };
|
|
58
|
+
} catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function sameFacts(left: ValidToolMarker, right: ValidToolMarker): boolean {
|
|
64
|
+
return left.id === right.id && left.version === right.version && left.sha256 === right.sha256;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Inspect or migrate released tool markers only below known tool/version
|
|
69
|
+
* directories in the selected Clio Coder data root. Unknown tool roots and
|
|
70
|
+
* symlinks are never traversed.
|
|
71
|
+
*/
|
|
72
|
+
export function inspectToolMarkerNaming(options: ToolMarkerNamingOptions = {}): ToolMarkerNamingReport[] {
|
|
73
|
+
const toolsRoot = join(options.dataDir ?? resolveClioDirs().data, "tools");
|
|
74
|
+
const reports: ToolMarkerNamingReport[] = [];
|
|
75
|
+
for (const tool of childDirectories(toolsRoot)) {
|
|
76
|
+
if (findPinnedTool(tool) === null) continue;
|
|
77
|
+
for (const version of childDirectories(join(toolsRoot, tool))) {
|
|
78
|
+
const dir = join(toolsRoot, tool, version);
|
|
79
|
+
const legacyPath = join(dir, LEGACY_TOOL_MARKER);
|
|
80
|
+
if (!existsSync(legacyPath)) continue;
|
|
81
|
+
const canonicalPath = join(dir, CANONICAL_TOOL_MARKER);
|
|
82
|
+
const legacy = readValidMarker(legacyPath, tool, version);
|
|
83
|
+
if (legacy === null) {
|
|
84
|
+
reports.push({
|
|
85
|
+
tool,
|
|
86
|
+
version,
|
|
87
|
+
legacyPath,
|
|
88
|
+
canonicalPath,
|
|
89
|
+
status: "invalid-legacy",
|
|
90
|
+
detail: "legacy marker does not match its known tool/version path and checksum shape; left untouched",
|
|
91
|
+
});
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (!existsSync(canonicalPath)) {
|
|
95
|
+
if (options.fix) {
|
|
96
|
+
renameSync(legacyPath, canonicalPath);
|
|
97
|
+
fsyncDirectory(dir);
|
|
98
|
+
}
|
|
99
|
+
reports.push({
|
|
100
|
+
tool,
|
|
101
|
+
version,
|
|
102
|
+
legacyPath,
|
|
103
|
+
canonicalPath,
|
|
104
|
+
status: options.fix ? "renamed" : "renamable",
|
|
105
|
+
detail: options.fix ? "validated legacy marker renamed atomically" : "validated legacy marker can be renamed",
|
|
106
|
+
});
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const canonical = readValidMarker(canonicalPath, tool, version);
|
|
110
|
+
if (canonical === null || !sameFacts(legacy, canonical)) {
|
|
111
|
+
reports.push({
|
|
112
|
+
tool,
|
|
113
|
+
version,
|
|
114
|
+
legacyPath,
|
|
115
|
+
canonicalPath,
|
|
116
|
+
status: "canonical-conflict",
|
|
117
|
+
detail:
|
|
118
|
+
"canonical and legacy marker facts disagree or canonical is invalid; canonical wins and legacy is left untouched",
|
|
119
|
+
});
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (options.fix) {
|
|
123
|
+
rmSync(legacyPath);
|
|
124
|
+
fsyncDirectory(dir);
|
|
125
|
+
}
|
|
126
|
+
reports.push({
|
|
127
|
+
tool,
|
|
128
|
+
version,
|
|
129
|
+
legacyPath,
|
|
130
|
+
canonicalPath,
|
|
131
|
+
status: options.fix ? "duplicate-removed" : "agreeing-duplicate",
|
|
132
|
+
detail: options.fix
|
|
133
|
+
? "validated agreeing legacy duplicate removed; canonical marker kept"
|
|
134
|
+
: "canonical and legacy facts agree; legacy duplicate can be removed",
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return reports;
|
|
139
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
|
|
4
|
+
import { resolveClioDirs } from "../../core/xdg.js";
|
|
5
|
+
import { ensureYaziProfile, resetYaziProfile, yaziProfileDir } from "../mux/yazi/profile.js";
|
|
6
|
+
import { resolveToolBinary } from "../toolchain/resolve.js";
|
|
7
|
+
|
|
8
|
+
export interface YaziNamingInspection {
|
|
9
|
+
profileDir: string;
|
|
10
|
+
present: boolean;
|
|
11
|
+
legacyEvents: number;
|
|
12
|
+
legacyEnvironmentNames: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface YaziNamingRegenerationReport extends YaziNamingInspection {
|
|
16
|
+
status: "absent" | "canonical" | "regenerated" | "removed-unresolved" | "regeneration-failed";
|
|
17
|
+
detail: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface YaziNamingOptions {
|
|
21
|
+
cacheDir?: string;
|
|
22
|
+
yaziPath?: string | null;
|
|
23
|
+
yaPath?: string | null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function occurrences(text: string, pattern: RegExp): number {
|
|
27
|
+
return [...text.matchAll(pattern)].length;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Inspect only the generated keymap below the selected Clio Coder cache root. */
|
|
31
|
+
export function inspectYaziNaming(cacheDir: string = resolveClioDirs().cache): YaziNamingInspection {
|
|
32
|
+
const profileDir = yaziProfileDir(cacheDir);
|
|
33
|
+
const present = statSync(profileDir, { throwIfNoEntry: false })?.isDirectory() === true;
|
|
34
|
+
let keymap = "";
|
|
35
|
+
try {
|
|
36
|
+
keymap = readFileSync(join(profileDir, "keymap.toml"), "utf8");
|
|
37
|
+
} catch {
|
|
38
|
+
// Missing or unreadable generated material is handled as disposable cache.
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
profileDir,
|
|
42
|
+
present,
|
|
43
|
+
legacyEvents: occurrences(keymap, /(?<!clio-coder-)clio-pick/gmu),
|
|
44
|
+
legacyEnvironmentNames: occurrences(keymap, /\$CLIO_YAZI_PICK_TOKEN\b/gmu),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Replace the disposable managed profile from current inputs. Resolution is
|
|
50
|
+
* performed before removal so the report can state why a profile could not be
|
|
51
|
+
* rebuilt, while deletion remains confined to `<cache>/yazi/profile`.
|
|
52
|
+
*/
|
|
53
|
+
export function regenerateYaziNamingProfile(options: YaziNamingOptions = {}): YaziNamingRegenerationReport {
|
|
54
|
+
const cacheDir = options.cacheDir ?? resolveClioDirs().cache;
|
|
55
|
+
const before = inspectYaziNaming(cacheDir);
|
|
56
|
+
if (!before.present) {
|
|
57
|
+
return {
|
|
58
|
+
...before,
|
|
59
|
+
status: "absent",
|
|
60
|
+
detail: "managed files pane profile is absent; next open writes canonical names",
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
if (before.legacyEvents === 0 && before.legacyEnvironmentNames === 0) {
|
|
64
|
+
return { ...before, status: "canonical", detail: "managed files pane profile already uses canonical names" };
|
|
65
|
+
}
|
|
66
|
+
const yaziPath = options.yaziPath === undefined ? resolveToolBinary("yazi").binaryPath : options.yaziPath;
|
|
67
|
+
const yaPath = options.yaPath === undefined ? resolveToolBinary("ya").binaryPath : options.yaPath;
|
|
68
|
+
resetYaziProfile(before.profileDir);
|
|
69
|
+
if (!yaziPath || !yaPath) {
|
|
70
|
+
return {
|
|
71
|
+
...before,
|
|
72
|
+
status: "removed-unresolved",
|
|
73
|
+
detail:
|
|
74
|
+
"legacy managed profile removed; the files pane engine is unresolved, so the next managed open will regenerate it",
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const profile = ensureYaziProfile({ yaziPath, yaPath, profileDir: before.profileDir });
|
|
78
|
+
if (!profile) {
|
|
79
|
+
return {
|
|
80
|
+
...before,
|
|
81
|
+
status: "regeneration-failed",
|
|
82
|
+
detail: "legacy managed profile removed, but the files pane engine rejected the regenerated profile",
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return { ...before, status: "regenerated", detail: "managed files pane profile regenerated with canonical names" };
|
|
86
|
+
}
|
|
@@ -27,7 +27,7 @@ const KEYBOARD_FACING_CHANGES: Readonly<Record<string, string>> = Object.freeze(
|
|
|
27
27
|
*/
|
|
28
28
|
export function describeUpgradeNotice(transition: UpgradeTransition): string {
|
|
29
29
|
const changes = KEYBOARD_FACING_CHANGES[transition.to];
|
|
30
|
-
const head = `clio: upgraded ${transition.from} → ${transition.to}.`;
|
|
30
|
+
const head = `clio-coder: upgraded ${transition.from} → ${transition.to}.`;
|
|
31
31
|
const tail = `Full notes: CHANGELOG.md, section ${transition.to}.`;
|
|
32
32
|
return changes === undefined
|
|
33
33
|
? `${head} What changed is in CHANGELOG.md, section ${transition.to}.`
|
|
@@ -11,7 +11,8 @@ import {
|
|
|
11
11
|
} from "./task-bank.js";
|
|
12
12
|
|
|
13
13
|
export const TASK_MEMORY_HANDOFF_VERSION = 2;
|
|
14
|
-
export const TASK_MEMORY_HANDOFF_LANGUAGE = "clio-task-memory";
|
|
14
|
+
export const TASK_MEMORY_HANDOFF_LANGUAGE = "clio-coder-task-memory";
|
|
15
|
+
const LEGACY_TASK_MEMORY_HANDOFF_LANGUAGE = "clio-task-memory";
|
|
15
16
|
const HANDOFF_MAX_BYTES = 1_000_000;
|
|
16
17
|
|
|
17
18
|
export interface TaskMemoryHandoffEntry {
|
|
@@ -134,8 +135,10 @@ export function renderTaskMemoryHandoffSource(
|
|
|
134
135
|
|
|
135
136
|
export function parseTaskMemoryHandoffSnapshot(text: string): TaskMemoryHandoffSnapshot | null {
|
|
136
137
|
if (typeof text !== "string" || text.length === 0 || text.length > HANDOFF_MAX_BYTES) return null;
|
|
137
|
-
const
|
|
138
|
-
|
|
138
|
+
const languages = [TASK_MEMORY_HANDOFF_LANGUAGE, LEGACY_TASK_MEMORY_HANDOFF_LANGUAGE]
|
|
139
|
+
.map((language) => language.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&"))
|
|
140
|
+
.join("|");
|
|
141
|
+
const match = new RegExp(`(?:^|\\n)\\x60{3}(?:${languages})\\r?\\n([^\\r\\n]+)\\r?\\n\\x60{3}(?:$|\\n)`, "u").exec(
|
|
139
142
|
text,
|
|
140
143
|
);
|
|
141
144
|
if (match?.[1] === undefined) return null;
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
MiddlewareRegistrationOwner,
|
|
3
|
+
PrepareRegistrationReplacementResult,
|
|
4
|
+
ReplaceRegistrationsReport,
|
|
5
|
+
} from "./registrations.js";
|
|
1
6
|
import type { MiddlewareDiagnosticSink, MiddlewareHookRegistration } from "./runtime.js";
|
|
2
7
|
import type {
|
|
3
8
|
MiddlewareEffect,
|
|
@@ -32,4 +37,25 @@ export interface MiddlewareContract {
|
|
|
32
37
|
* stderr writer default.
|
|
33
38
|
*/
|
|
34
39
|
setDiagnosticSink(sink: MiddlewareDiagnosticSink): void;
|
|
40
|
+
/**
|
|
41
|
+
* Validate an owner's replacement registration set against the current
|
|
42
|
+
* builtin and host ids and build its evaluation list without publishing.
|
|
43
|
+
* Rejected when `generation` is not strictly greater than the owner's
|
|
44
|
+
* active generation. The returned replacement publishes with one reference
|
|
45
|
+
* assignment that cannot refuse or call out, so a composition root can publish it
|
|
46
|
+
* back-to-back with another domain's generation on the same stack.
|
|
47
|
+
*/
|
|
48
|
+
prepareRegistrationReplacement(
|
|
49
|
+
owner: MiddlewareRegistrationOwner,
|
|
50
|
+
generation: number,
|
|
51
|
+
registrations: ReadonlyArray<MiddlewareHookRegistration>,
|
|
52
|
+
): PrepareRegistrationReplacementResult;
|
|
53
|
+
/** Prepare, check currentness, publish, then emit any conflict diagnostics. */
|
|
54
|
+
replaceRegistrations(
|
|
55
|
+
owner: MiddlewareRegistrationOwner,
|
|
56
|
+
generation: number,
|
|
57
|
+
registrations: ReadonlyArray<MiddlewareHookRegistration>,
|
|
58
|
+
): ReplaceRegistrationsReport;
|
|
59
|
+
/** Active generation for an owner; 0 when nothing was ever applied. */
|
|
60
|
+
ownedGeneration(owner: MiddlewareRegistrationOwner): number;
|
|
35
61
|
}
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
resolveHookBudgetTunablesFromEnv,
|
|
7
7
|
} from "./budget.js";
|
|
8
8
|
import type { MiddlewareContract } from "./contract.js";
|
|
9
|
+
import { createMiddlewareRegistrationTable } from "./registrations.js";
|
|
9
10
|
import { cloneMiddlewareRule, listMiddlewareRuleDefinitions } from "./rules.js";
|
|
10
11
|
import {
|
|
11
12
|
type MiddlewareDiagnosticSink,
|
|
@@ -14,6 +15,7 @@ import {
|
|
|
14
15
|
registrationFromRuleDefinition,
|
|
15
16
|
runMiddlewareAsyncRegistrations,
|
|
16
17
|
runMiddlewareRegistrations,
|
|
18
|
+
writeMiddlewareDiagnosticToStderr,
|
|
17
19
|
} from "./runtime.js";
|
|
18
20
|
import { createMiddlewareSnapshot } from "./snapshot.js";
|
|
19
21
|
|
|
@@ -54,18 +56,28 @@ export interface MiddlewareBundleOptions {
|
|
|
54
56
|
|
|
55
57
|
export function createMiddlewareBundle(options: MiddlewareBundleOptions = {}): DomainBundle<MiddlewareContract> {
|
|
56
58
|
const ruleDefinitions = combineRuleDefinitions(listMiddlewareRuleDefinitions(), options.ruleDefinitions ?? []);
|
|
57
|
-
const registrations = combineRegistrations(ruleDefinitions, options.registrations ?? []);
|
|
58
|
-
const registeredIds = new Set(registrations.map((registration) => registration.id));
|
|
59
59
|
let diagnosticSink = options.onDiagnostic;
|
|
60
|
+
// Declarative rules are the fixed tier; construction-time coded
|
|
61
|
+
// registrations are the first host entries, deduplicated first-wins across
|
|
62
|
+
// the shared id namespace exactly as before.
|
|
63
|
+
const table = createMiddlewareRegistrationTable({
|
|
64
|
+
fixed: ruleDefinitions.map(registrationFromRuleDefinition),
|
|
65
|
+
diagnosticSink: () => diagnosticSink ?? writeMiddlewareDiagnosticToStderr,
|
|
66
|
+
});
|
|
67
|
+
for (const registration of options.registrations ?? []) table.registerHook(registration);
|
|
60
68
|
const budgetTracker = options.budgetTracker ?? createEnvHookBudgetTracker();
|
|
61
69
|
const contract: MiddlewareContract = {
|
|
62
70
|
runHook(input) {
|
|
71
|
+
// Capture the list once; a replacement published mid-evaluation
|
|
72
|
+
// takes effect for the next evaluation, never this one.
|
|
73
|
+
const registrations = table.list();
|
|
63
74
|
return runMiddlewareRegistrations(input, registrations, {
|
|
64
75
|
budgetTracker,
|
|
65
76
|
...(diagnosticSink !== undefined ? { onDiagnostic: diagnosticSink } : {}),
|
|
66
77
|
});
|
|
67
78
|
},
|
|
68
79
|
runAsyncHook(input, priorEffects = []) {
|
|
80
|
+
const registrations = table.list();
|
|
69
81
|
return runMiddlewareAsyncRegistrations(input, registrations, priorEffects, {
|
|
70
82
|
...(diagnosticSink !== undefined ? { onDiagnostic: diagnosticSink } : {}),
|
|
71
83
|
});
|
|
@@ -77,13 +89,20 @@ export function createMiddlewareBundle(options: MiddlewareBundleOptions = {}): D
|
|
|
77
89
|
return createMiddlewareSnapshot(ruleDefinitions.map((definition) => definition.rule));
|
|
78
90
|
},
|
|
79
91
|
registerHook(registration) {
|
|
80
|
-
|
|
81
|
-
registeredIds.add(registration.id);
|
|
82
|
-
registrations.push(registration);
|
|
92
|
+
table.registerHook(registration);
|
|
83
93
|
},
|
|
84
94
|
setDiagnosticSink(sink) {
|
|
85
95
|
diagnosticSink = sink;
|
|
86
96
|
},
|
|
97
|
+
prepareRegistrationReplacement(owner, generation, registrations) {
|
|
98
|
+
return table.prepareReplacement(owner, generation, registrations);
|
|
99
|
+
},
|
|
100
|
+
replaceRegistrations(owner, generation, registrations) {
|
|
101
|
+
return table.replaceRegistrations(owner, generation, registrations);
|
|
102
|
+
},
|
|
103
|
+
ownedGeneration(owner) {
|
|
104
|
+
return table.ownedGeneration(owner);
|
|
105
|
+
},
|
|
87
106
|
};
|
|
88
107
|
return {
|
|
89
108
|
extension: {
|
|
@@ -108,22 +127,3 @@ function combineRuleDefinitions(
|
|
|
108
127
|
}
|
|
109
128
|
return combined;
|
|
110
129
|
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* One ordered evaluation list: declarative rules first (builtin, then
|
|
114
|
-
* composition-root), then coded registrations, deduplicated across the shared
|
|
115
|
-
* id namespace with the earlier entry winning.
|
|
116
|
-
*/
|
|
117
|
-
function combineRegistrations(
|
|
118
|
-
ruleDefinitions: ReadonlyArray<MiddlewareRuleDefinition>,
|
|
119
|
-
coded: ReadonlyArray<MiddlewareHookRegistration>,
|
|
120
|
-
): MiddlewareHookRegistration[] {
|
|
121
|
-
const seen = new Set<string>(ruleDefinitions.map((definition) => definition.rule.id));
|
|
122
|
-
const combined: MiddlewareHookRegistration[] = ruleDefinitions.map(registrationFromRuleDefinition);
|
|
123
|
-
for (const registration of coded) {
|
|
124
|
-
if (seen.has(registration.id)) continue;
|
|
125
|
-
seen.add(registration.id);
|
|
126
|
-
combined.push(registration);
|
|
127
|
-
}
|
|
128
|
-
return combined;
|
|
129
|
-
}
|