@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
package/src/cli/docs.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
-
import { createReadStream, readdirSync, statSync } from "node:fs";
|
|
2
|
+
import { createReadStream, readdirSync, realpathSync, statSync } from "node:fs";
|
|
3
3
|
import { createServer, type IncomingMessage, type Server, type ServerResponse } from "node:http";
|
|
4
4
|
import type { AddressInfo } from "node:net";
|
|
5
5
|
import { relative, resolve } from "node:path";
|
|
6
6
|
import chalk from "chalk";
|
|
7
7
|
import { resolvePackageRoot } from "../core/package-root.js";
|
|
8
|
-
import { printError, printHeader } from "./
|
|
8
|
+
import { printError, printHeader } from "./argv.js";
|
|
9
9
|
|
|
10
|
-
// Human-facing viewer over the
|
|
10
|
+
// Human-facing viewer over the source-checkout HTML blueprints. It binds an ephemeral
|
|
11
11
|
// static file server to 127.0.0.1 only, serves docs/html/index.html as the
|
|
12
12
|
// menu plus the blueprint pages, prints the URL, and runs until SIGINT. It
|
|
13
13
|
// uses only Node's built-in http and fs: zero new dependencies, no daemon, no
|
|
@@ -21,7 +21,8 @@ const HELP = `clio-coder docs [topic] [--no-open]
|
|
|
21
21
|
|
|
22
22
|
Serve Clio Coder's interactive HTML documentation locally and open it in a
|
|
23
23
|
browser. The blueprints live in docs/html of a source checkout; the npm package
|
|
24
|
-
ships the Markdown
|
|
24
|
+
ships the categorized Markdown reference tree under docs/ and excludes HTML.
|
|
25
|
+
The server binds an ephemeral port on
|
|
25
26
|
127.0.0.1, keeps no state, runs no daemon, and reaches no external network.
|
|
26
27
|
Press Ctrl+C to stop it.
|
|
27
28
|
|
|
@@ -64,13 +65,13 @@ export interface DocsMenuEntry {
|
|
|
64
65
|
label: string;
|
|
65
66
|
}
|
|
66
67
|
|
|
67
|
-
/** Resolve
|
|
68
|
-
|
|
68
|
+
/** Resolve the source-checkout HTML root. The npm package deliberately excludes it. */
|
|
69
|
+
function resolveDocsHtmlDir(): string {
|
|
69
70
|
return resolve(resolvePackageRoot(), "docs", "html");
|
|
70
71
|
}
|
|
71
72
|
|
|
72
73
|
/** Content-type for a file path by extension. Pure. Defaults to octet-stream. */
|
|
73
|
-
|
|
74
|
+
function contentTypeFor(filePath: string): string {
|
|
74
75
|
const dot = filePath.lastIndexOf(".");
|
|
75
76
|
if (dot === -1) return "application/octet-stream";
|
|
76
77
|
return CONTENT_TYPES[filePath.slice(dot).toLowerCase()] ?? "application/octet-stream";
|
|
@@ -82,7 +83,7 @@ export function contentTypeFor(filePath: string): string {
|
|
|
82
83
|
* to `index.html`, and rejects any traversal segment so a request can never
|
|
83
84
|
* escape the served directory.
|
|
84
85
|
*/
|
|
85
|
-
|
|
86
|
+
function resolveRequestPath(rawUrl: string): { ok: true; relative: string } | { ok: false; reason: string } {
|
|
86
87
|
const pathPart = (rawUrl.split(/[?#]/, 1)[0] ?? "").trim();
|
|
87
88
|
let decoded: string;
|
|
88
89
|
try {
|
|
@@ -112,7 +113,7 @@ function titleize(topic: string): string {
|
|
|
112
113
|
* the file-name list, not the directory. `index.html` is the menu itself and is
|
|
113
114
|
* excluded; a trailing `_blueprint` is stripped from the topic key.
|
|
114
115
|
*/
|
|
115
|
-
|
|
116
|
+
function synthesizeMenu(fileNames: ReadonlyArray<string>): DocsMenuEntry[] {
|
|
116
117
|
const entries: DocsMenuEntry[] = [];
|
|
117
118
|
for (const name of fileNames) {
|
|
118
119
|
if (!name.toLowerCase().endsWith(".html")) continue;
|
|
@@ -129,7 +130,7 @@ export function synthesizeMenu(fileNames: ReadonlyArray<string>): DocsMenuEntry[
|
|
|
129
130
|
* topic (`safety`), the blueprint file stem (`safety_blueprint`), or a full
|
|
130
131
|
* `.html` name, case-insensitively. Returns null when nothing matches.
|
|
131
132
|
*/
|
|
132
|
-
|
|
133
|
+
function topicToFile(topic: string, fileNames: ReadonlyArray<string>): string | null {
|
|
133
134
|
const wanted = topic
|
|
134
135
|
.trim()
|
|
135
136
|
.toLowerCase()
|
|
@@ -159,8 +160,8 @@ function listHtmlFiles(htmlDir: string): string[] {
|
|
|
159
160
|
}
|
|
160
161
|
|
|
161
162
|
/** Build the static request handler for one html root. */
|
|
162
|
-
function createDocsRequestHandler(htmlDir: string): (req: IncomingMessage, res: ServerResponse) => void {
|
|
163
|
-
const root = resolve(htmlDir);
|
|
163
|
+
export function createDocsRequestHandler(htmlDir: string): (req: IncomingMessage, res: ServerResponse) => void {
|
|
164
|
+
const root = realpathSync(resolve(htmlDir));
|
|
164
165
|
return (req, res) => {
|
|
165
166
|
if (req.method !== "GET" && req.method !== "HEAD") {
|
|
166
167
|
res.writeHead(405, { "content-type": "text/plain; charset=utf-8", allow: "GET, HEAD" });
|
|
@@ -174,20 +175,27 @@ function createDocsRequestHandler(htmlDir: string): (req: IncomingMessage, res:
|
|
|
174
175
|
res.end(resolved.reason);
|
|
175
176
|
return;
|
|
176
177
|
}
|
|
177
|
-
const
|
|
178
|
-
if (!isWithin(
|
|
178
|
+
const requestedTarget = resolve(root, resolved.relative);
|
|
179
|
+
if (!isWithin(requestedTarget, root)) {
|
|
179
180
|
res.writeHead(403, { "content-type": "text/plain; charset=utf-8" });
|
|
180
181
|
res.end("forbidden");
|
|
181
182
|
return;
|
|
182
183
|
}
|
|
183
184
|
let size: number | null = null;
|
|
185
|
+
let target: string | null = null;
|
|
184
186
|
try {
|
|
187
|
+
target = realpathSync(requestedTarget);
|
|
188
|
+
if (!isWithin(target, root)) {
|
|
189
|
+
res.writeHead(403, { "content-type": "text/plain; charset=utf-8" });
|
|
190
|
+
res.end("forbidden");
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
185
193
|
const stat = statSync(target);
|
|
186
194
|
if (stat.isFile()) size = stat.size;
|
|
187
195
|
} catch {
|
|
188
196
|
size = null;
|
|
189
197
|
}
|
|
190
|
-
if (size === null) {
|
|
198
|
+
if (size === null || target === null) {
|
|
191
199
|
res.writeHead(404, { "content-type": "text/plain; charset=utf-8" });
|
|
192
200
|
res.end("not found");
|
|
193
201
|
return;
|
|
@@ -227,7 +235,7 @@ export interface StartDocsServerOptions {
|
|
|
227
235
|
}
|
|
228
236
|
|
|
229
237
|
/** Start the viewer bound to 127.0.0.1 on an ephemeral port. */
|
|
230
|
-
|
|
238
|
+
async function startDocsServer(options: StartDocsServerOptions): Promise<DocsServerHandle> {
|
|
231
239
|
const host = options.host ?? HOST;
|
|
232
240
|
const server = createServer(createDocsRequestHandler(options.htmlDir));
|
|
233
241
|
await new Promise<void>((resolveListen, rejectListen) => {
|
|
@@ -263,7 +271,7 @@ function openBrowser(url: string): void {
|
|
|
263
271
|
}
|
|
264
272
|
}
|
|
265
273
|
|
|
266
|
-
function waitForShutdown(): Promise<void> {
|
|
274
|
+
export function waitForShutdown(): Promise<void> {
|
|
267
275
|
return new Promise((resolveShutdown) => {
|
|
268
276
|
const onSignal = (): void => {
|
|
269
277
|
process.removeListener("SIGINT", onSignal);
|
|
@@ -304,14 +312,14 @@ export async function runDocsCommand(args: ReadonlyArray<string> = []): Promise<
|
|
|
304
312
|
try {
|
|
305
313
|
htmlDir = resolveDocsHtmlDir();
|
|
306
314
|
} catch (err) {
|
|
307
|
-
printError(`could not resolve
|
|
315
|
+
printError(`could not resolve the docs HTML root: ${err instanceof Error ? err.message : String(err)}`);
|
|
308
316
|
return 1;
|
|
309
317
|
}
|
|
310
318
|
const files = listHtmlFiles(htmlDir);
|
|
311
319
|
if (files.length === 0) {
|
|
312
320
|
printError(`no HTML docs at ${htmlDir}`);
|
|
313
321
|
process.stdout.write(
|
|
314
|
-
` the npm package ships the Markdown
|
|
322
|
+
` the npm package ships only the categorized Markdown reference tree: ${resolve(resolvePackageRoot(), "docs")}\n` +
|
|
315
323
|
" the interactive blueprints are in a source checkout and at https://github.com/iowarp/clio-coder/tree/main/docs/html\n",
|
|
316
324
|
);
|
|
317
325
|
return 1;
|
|
@@ -333,7 +341,7 @@ export async function runDocsCommand(args: ReadonlyArray<string> = []): Promise<
|
|
|
333
341
|
const handle = await startDocsServer({ htmlDir });
|
|
334
342
|
const landingUrl = landing === "index.html" ? handle.url : `${handle.url}${landing}`;
|
|
335
343
|
printHeader("Clio docs viewer");
|
|
336
|
-
process.stdout.write(` serving ${htmlDir}\n`);
|
|
344
|
+
process.stdout.write(` serving HTML root ${htmlDir}\n`);
|
|
337
345
|
process.stdout.write(` open ${chalk.cyan(landingUrl)}\n`);
|
|
338
346
|
process.stdout.write(" bound to 127.0.0.1 only: no external network, no daemon, no state.\n");
|
|
339
347
|
process.stdout.write(" press Ctrl+C to stop.\n");
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
|
|
5
|
+
import { parse as parseYaml } from "yaml";
|
|
6
|
+
import { withSettingsLock } from "../core/config.js";
|
|
7
|
+
import { resolveClioDirs } from "../core/xdg.js";
|
|
8
|
+
import type { DoctorFinding } from "../domains/lifecycle/doctor.js";
|
|
9
|
+
import {
|
|
10
|
+
migrateNamingSettingsFile,
|
|
11
|
+
transformNamingSettingsDocument,
|
|
12
|
+
} from "../domains/lifecycle/migrations/2026-09-01-clio-coder-naming.js";
|
|
13
|
+
import { inspectNamingHistory } from "../domains/lifecycle/naming-history.js";
|
|
14
|
+
import {
|
|
15
|
+
inspectInstalledNamingResources,
|
|
16
|
+
inspectModelOverlayNaming,
|
|
17
|
+
inspectSkillMetadataNaming,
|
|
18
|
+
} from "../domains/lifecycle/naming-resources.js";
|
|
19
|
+
import { inspectToolMarkerNaming } from "../domains/lifecycle/naming-tool-markers.js";
|
|
20
|
+
import { inspectYaziNaming, regenerateYaziNamingProfile } from "../domains/lifecycle/naming-yazi.js";
|
|
21
|
+
|
|
22
|
+
export interface NamingDoctorOptions {
|
|
23
|
+
fix?: boolean;
|
|
24
|
+
cwd?: string;
|
|
25
|
+
yaziEnabled?: boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
interface SettingsNamingInspection {
|
|
29
|
+
path: string;
|
|
30
|
+
legacy: number;
|
|
31
|
+
conflicts: number;
|
|
32
|
+
error: string | null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const LEGACY_ENVIRONMENT_NAMES = [
|
|
36
|
+
["CLIO_EVAL_RUNNER_STDOUT_FILE", "CLIO_CODER_EVAL_RUNNER_STDOUT_FILE"],
|
|
37
|
+
["CLIO_YAZI_PICK_TOKEN", "CLIO_CODER_YAZI_PICK_TOKEN"],
|
|
38
|
+
] as const;
|
|
39
|
+
|
|
40
|
+
function namingEnvironmentFindings(
|
|
41
|
+
yaziEnabled: boolean,
|
|
42
|
+
environment: NodeJS.ProcessEnv = process.env,
|
|
43
|
+
): DoctorFinding[] {
|
|
44
|
+
const present = LEGACY_ENVIRONMENT_NAMES.filter(
|
|
45
|
+
([legacy]) => (yaziEnabled || legacy !== "CLIO_YAZI_PICK_TOKEN") && Boolean(environment[legacy]?.trim()),
|
|
46
|
+
);
|
|
47
|
+
if (present.length === 0) {
|
|
48
|
+
return [{ ok: true, name: "naming environment", detail: "no legacy Clio Coder environment variables are set" }];
|
|
49
|
+
}
|
|
50
|
+
return present.map(([legacy, canonical]) => ({
|
|
51
|
+
ok: true,
|
|
52
|
+
level: "warn",
|
|
53
|
+
name: "naming environment",
|
|
54
|
+
detail: `${legacy} is deprecated; use ${canonical} (compatibility ends in v0.7.0)`,
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function namingResourceFindings(options: NamingDoctorOptions): DoctorFinding[] {
|
|
59
|
+
try {
|
|
60
|
+
const resourceOptions = {
|
|
61
|
+
...(options.cwd ? { cwd: options.cwd } : {}),
|
|
62
|
+
...(options.fix !== undefined ? { fix: options.fix } : {}),
|
|
63
|
+
};
|
|
64
|
+
const resources = inspectInstalledNamingResources(resourceOptions);
|
|
65
|
+
const legacyResources = resources.filter((entry) => entry.status !== "absent");
|
|
66
|
+
const rootOptions = options.cwd ? { cwd: options.cwd } : {};
|
|
67
|
+
const skillMetadata = inspectSkillMetadataNaming(rootOptions).filter((entry) => entry.legacyMetadataKey);
|
|
68
|
+
const overlays = inspectModelOverlayNaming(rootOptions).filter(
|
|
69
|
+
(entry) => entry.legacyFile || entry.legacyMetadataKeys > 0,
|
|
70
|
+
);
|
|
71
|
+
if (legacyResources.length === 0 && skillMetadata.length === 0 && overlays.length === 0) {
|
|
72
|
+
return [{ ok: true, name: "naming resources", detail: "installed skills and model overlays use canonical names" }];
|
|
73
|
+
}
|
|
74
|
+
const renamed = legacyResources.filter((entry) => entry.status === "renamed").length;
|
|
75
|
+
const renamable = legacyResources.filter((entry) => entry.status === "renamable").length;
|
|
76
|
+
const conflicts = legacyResources.filter(
|
|
77
|
+
(entry) => entry.status === "modified" || entry.status === "canonical-present",
|
|
78
|
+
).length;
|
|
79
|
+
return [
|
|
80
|
+
{
|
|
81
|
+
ok: true,
|
|
82
|
+
level:
|
|
83
|
+
renamed > 0 && renamable === 0 && conflicts === 0 && skillMetadata.length === 0 && overlays.length === 0
|
|
84
|
+
? "ok"
|
|
85
|
+
: "warn",
|
|
86
|
+
name: "naming resources",
|
|
87
|
+
detail: [
|
|
88
|
+
`${renamed} proven skills renamed`,
|
|
89
|
+
`${renamable} proven skills await doctor --fix`,
|
|
90
|
+
`${conflicts} modified/conflicting skills left untouched`,
|
|
91
|
+
`${skillMetadata.length} legacy skill metadata keys${skillMetadata.length > 0 ? ` (rename \`clio:\` to \`clio-coder:\` in ${skillMetadata.map((entry) => entry.path).join(", ")})` : ""}`,
|
|
92
|
+
`${overlays.length} legacy model overlay files/metadata (manual migration required)`,
|
|
93
|
+
].join("; "),
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
} catch (error) {
|
|
97
|
+
return [
|
|
98
|
+
{
|
|
99
|
+
ok: false,
|
|
100
|
+
name: "naming resources",
|
|
101
|
+
detail: `resource naming inspection failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
102
|
+
},
|
|
103
|
+
];
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function inspectSettingsNaming(path: string): SettingsNamingInspection {
|
|
108
|
+
if (!existsSync(path)) return { path, legacy: 0, conflicts: 0, error: null };
|
|
109
|
+
try {
|
|
110
|
+
const transformed = transformNamingSettingsDocument(parseYaml(readFileSync(path, "utf8")));
|
|
111
|
+
return {
|
|
112
|
+
path,
|
|
113
|
+
legacy: transformed.replacements.length,
|
|
114
|
+
conflicts: transformed.conflicts.length,
|
|
115
|
+
error: null,
|
|
116
|
+
};
|
|
117
|
+
} catch (error) {
|
|
118
|
+
return { path, legacy: 0, conflicts: 0, error: error instanceof Error ? error.message : String(error) };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function settingsFinding(label: string, inspection: SettingsNamingInspection, fixed: boolean): DoctorFinding {
|
|
123
|
+
if (inspection.error !== null) {
|
|
124
|
+
return {
|
|
125
|
+
ok: false,
|
|
126
|
+
name: `naming ${label}`,
|
|
127
|
+
detail: `${inspection.path} could not be inspected: ${inspection.error}`,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
const count = inspection.legacy + inspection.conflicts;
|
|
131
|
+
if (count === 0) {
|
|
132
|
+
return { ok: true, name: `naming ${label}`, detail: `${inspection.path} has canonical settings identifiers` };
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
ok: fixed,
|
|
136
|
+
level: fixed ? "ok" : "warn",
|
|
137
|
+
name: `naming ${label}`,
|
|
138
|
+
detail: fixed
|
|
139
|
+
? `${inspection.path}: migrated ${inspection.legacy} aliases and resolved ${inspection.conflicts} canonical collisions; backup written beside the file`
|
|
140
|
+
: `${inspection.path}: ${inspection.legacy} legacy aliases and ${inspection.conflicts} canonical collisions (run \`clio-coder doctor --fix\`)`,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function yaziNamingFinding(fix: boolean, enabled: boolean): DoctorFinding {
|
|
145
|
+
if (!enabled) {
|
|
146
|
+
return {
|
|
147
|
+
ok: true,
|
|
148
|
+
name: "naming files profile",
|
|
149
|
+
detail: "disabled by settings",
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
const inspection = inspectYaziNaming();
|
|
153
|
+
const legacy = inspection.legacyEvents + inspection.legacyEnvironmentNames;
|
|
154
|
+
if (legacy === 0) {
|
|
155
|
+
return {
|
|
156
|
+
ok: true,
|
|
157
|
+
name: "naming files profile",
|
|
158
|
+
detail: inspection.present
|
|
159
|
+
? `${inspection.profileDir} uses canonical event and environment identifiers`
|
|
160
|
+
: `${inspection.profileDir} is absent; the next managed open will generate canonical identifiers`,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
if (!fix) {
|
|
164
|
+
return {
|
|
165
|
+
ok: true,
|
|
166
|
+
level: "warn",
|
|
167
|
+
name: "naming files profile",
|
|
168
|
+
detail: `${inspection.profileDir}: ${inspection.legacyEvents} legacy events and ${inspection.legacyEnvironmentNames} legacy environment names (run \`clio-coder doctor --fix\`)`,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
const report = regenerateYaziNamingProfile();
|
|
172
|
+
return {
|
|
173
|
+
ok: report.status !== "regeneration-failed",
|
|
174
|
+
...(report.status === "regeneration-failed" ? {} : { level: "ok" as const }),
|
|
175
|
+
name: "naming files profile",
|
|
176
|
+
detail: report.detail,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function toolMarkerNamingFinding(fix: boolean): DoctorFinding {
|
|
181
|
+
try {
|
|
182
|
+
const reports = inspectToolMarkerNaming({ fix });
|
|
183
|
+
if (reports.length === 0) {
|
|
184
|
+
return { ok: true, name: "naming tool markers", detail: "known tool versions use canonical install markers" };
|
|
185
|
+
}
|
|
186
|
+
const fixed = reports.filter((entry) => entry.status === "renamed" || entry.status === "duplicate-removed").length;
|
|
187
|
+
const fixable = reports.filter(
|
|
188
|
+
(entry) => entry.status === "renamable" || entry.status === "agreeing-duplicate",
|
|
189
|
+
).length;
|
|
190
|
+
const manual = reports.length - fixed - fixable;
|
|
191
|
+
return {
|
|
192
|
+
ok: true,
|
|
193
|
+
level: fixed > 0 && fixable === 0 && manual === 0 ? "ok" : "warn",
|
|
194
|
+
name: "naming tool markers",
|
|
195
|
+
detail: `${fixed} validated markers fixed; ${fixable} await doctor --fix; ${manual} invalid/conflicting markers left untouched`,
|
|
196
|
+
};
|
|
197
|
+
} catch (error) {
|
|
198
|
+
return {
|
|
199
|
+
ok: false,
|
|
200
|
+
name: "naming tool markers",
|
|
201
|
+
detail: `tool marker inspection failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function immutableHistoryNamingFinding(): DoctorFinding {
|
|
207
|
+
const dirs = resolveClioDirs();
|
|
208
|
+
const counts = inspectNamingHistory({ stateDir: dirs.state, dataDir: dirs.data });
|
|
209
|
+
const errors = counts.filter((entry) => entry.error !== null);
|
|
210
|
+
if (errors.length > 0) {
|
|
211
|
+
return {
|
|
212
|
+
ok: false,
|
|
213
|
+
name: "naming immutable history",
|
|
214
|
+
detail: errors.map((entry) => `${entry.area}: ${entry.error}`).join("; "),
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
const legacy = counts.reduce((sum, entry) => sum + entry.legacyIdentifiers, 0);
|
|
218
|
+
return {
|
|
219
|
+
ok: true,
|
|
220
|
+
...(legacy > 0 ? { level: "warn" as const } : {}),
|
|
221
|
+
name: "naming immutable history",
|
|
222
|
+
detail: `${counts.map((entry) => `${entry.area}=${entry.legacyIdentifiers}`).join("; ")} legacy identifiers; read-only retention, no rewrite`,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function legacyGitRefsFinding(cwd: string): DoctorFinding {
|
|
227
|
+
let refs: string[];
|
|
228
|
+
try {
|
|
229
|
+
refs = execFileSync(
|
|
230
|
+
"git",
|
|
231
|
+
["-C", cwd, "for-each-ref", "--format=%(refname:short)", "refs/heads/clio/task", "refs/heads/clio/compete"],
|
|
232
|
+
{ encoding: "utf8", stdio: ["ignore", "pipe", "ignore"], timeout: 5_000 },
|
|
233
|
+
)
|
|
234
|
+
.split("\n")
|
|
235
|
+
.map((entry) => entry.trim())
|
|
236
|
+
.filter((entry) => /^clio\/(?:task|compete)\//u.test(entry))
|
|
237
|
+
.sort();
|
|
238
|
+
} catch {
|
|
239
|
+
refs = [];
|
|
240
|
+
}
|
|
241
|
+
if (refs.length === 0) {
|
|
242
|
+
return { ok: true, name: "naming git refs", detail: "no legacy Clio Coder task or compete refs found" };
|
|
243
|
+
}
|
|
244
|
+
const shown = refs.slice(0, 20);
|
|
245
|
+
return {
|
|
246
|
+
ok: true,
|
|
247
|
+
level: "warn",
|
|
248
|
+
name: "naming git refs",
|
|
249
|
+
detail: `${refs.length} legacy refs retained (never auto-renamed): ${shown.join(", ")}${refs.length > shown.length ? ", …" : ""}`,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
function legacyWorktreeMarkerFinding(cwd: string): DoctorFinding {
|
|
254
|
+
const root = join(cwd, ".clio-coder", "worktrees");
|
|
255
|
+
let legacy = 0;
|
|
256
|
+
try {
|
|
257
|
+
for (const entry of readdirSync(root, { withFileTypes: true })) {
|
|
258
|
+
const candidates = entry.isFile()
|
|
259
|
+
? entry.name.endsWith(".task-owner.json")
|
|
260
|
+
? [join(root, entry.name)]
|
|
261
|
+
: []
|
|
262
|
+
: entry.isDirectory()
|
|
263
|
+
? [join(root, entry.name, ".clio-coder-compete-owner.json")]
|
|
264
|
+
: [];
|
|
265
|
+
for (const path of candidates) {
|
|
266
|
+
if (!existsSync(path)) continue;
|
|
267
|
+
const parsed = JSON.parse(readFileSync(path, "utf8")) as Record<string, unknown>;
|
|
268
|
+
if (parsed.kind === "clio-task-worktree" || parsed.kind === "clio-compete-group") legacy += 1;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
} catch {
|
|
272
|
+
// An absent or partially unreadable project-local worktree root is not a
|
|
273
|
+
// repair target. Proven markers remain the lifecycle readers' authority.
|
|
274
|
+
}
|
|
275
|
+
return {
|
|
276
|
+
ok: true,
|
|
277
|
+
...(legacy > 0 ? { level: "warn" as const } : {}),
|
|
278
|
+
name: "naming worktree markers",
|
|
279
|
+
detail:
|
|
280
|
+
legacy === 0
|
|
281
|
+
? "active worktree markers use canonical identifiers"
|
|
282
|
+
: `${legacy} active legacy worktree markers retained for cleanup compatibility; no automatic rewrite`,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/** Read-only naming-footprint settings sweep plus the sanctioned deterministic fixes. */
|
|
287
|
+
export function namingFootprintFindings(options: NamingDoctorOptions = {}): DoctorFinding[] {
|
|
288
|
+
const cwd = options.cwd ?? process.cwd();
|
|
289
|
+
const userSettingsPath = join(resolveClioDirs().config, "settings.yaml");
|
|
290
|
+
const candidates = [
|
|
291
|
+
{ label: "settings user", path: userSettingsPath, lock: true },
|
|
292
|
+
{ label: "settings project", path: join(cwd, ".clio-coder", "settings.yaml"), lock: false },
|
|
293
|
+
{ label: "settings local", path: join(cwd, ".clio-coder", "settings.local.yaml"), lock: false },
|
|
294
|
+
] as const;
|
|
295
|
+
const findings: DoctorFinding[] = [];
|
|
296
|
+
for (const candidate of candidates) {
|
|
297
|
+
const before = inspectSettingsNaming(candidate.path);
|
|
298
|
+
let fixed = false;
|
|
299
|
+
if (options.fix && before.error === null && before.legacy + before.conflicts > 0) {
|
|
300
|
+
try {
|
|
301
|
+
if (candidate.lock) withSettingsLock(() => migrateNamingSettingsFile(candidate.path));
|
|
302
|
+
else migrateNamingSettingsFile(candidate.path);
|
|
303
|
+
fixed = true;
|
|
304
|
+
} catch (error) {
|
|
305
|
+
findings.push({
|
|
306
|
+
ok: false,
|
|
307
|
+
name: `naming ${candidate.label}`,
|
|
308
|
+
detail: `--fix could not migrate ${candidate.path}: ${error instanceof Error ? error.message : String(error)}`,
|
|
309
|
+
});
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
findings.push(settingsFinding(candidate.label, before, fixed));
|
|
314
|
+
}
|
|
315
|
+
findings.push(...namingEnvironmentFindings(options.yaziEnabled ?? true));
|
|
316
|
+
findings.push(...namingResourceFindings({ ...options, cwd }));
|
|
317
|
+
findings.push(yaziNamingFinding(Boolean(options.fix), options.yaziEnabled ?? true));
|
|
318
|
+
findings.push(toolMarkerNamingFinding(Boolean(options.fix)));
|
|
319
|
+
findings.push(immutableHistoryNamingFinding());
|
|
320
|
+
findings.push(legacyGitRefsFinding(cwd));
|
|
321
|
+
findings.push(legacyWorktreeMarkerFinding(cwd));
|
|
322
|
+
return findings;
|
|
323
|
+
}
|
package/src/cli/doctor-panes.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { accessSync, constants
|
|
1
|
+
import { accessSync, constants } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
2
3
|
import { readSettings } from "../core/config.js";
|
|
3
|
-
import {
|
|
4
|
+
import { resolveClioDirs } from "../core/xdg.js";
|
|
4
5
|
import type { DoctorFinding } from "../domains/lifecycle/doctor.js";
|
|
5
6
|
import { detectMux, MUX_METHOD_MIN_PROTOCOL, resolveSocketCandidates } from "../domains/mux/index.js";
|
|
6
7
|
import { describeResolution, findPinnedTool, toolStatus } from "../domains/toolchain/index.js";
|
|
@@ -8,10 +9,11 @@ import { describeResolution, findPinnedTool, toolStatus } from "../domains/toolc
|
|
|
8
9
|
/**
|
|
9
10
|
* The panes section of `clio-coder doctor`.
|
|
10
11
|
*
|
|
11
|
-
*
|
|
12
|
+
* Six rows, in the order an operator debugs them: what mode the pane layer
|
|
12
13
|
* resolved to, whether the socket answered, whether the server is new enough
|
|
13
|
-
* for the methods phase 3 uses, where the pane host binary resolves,
|
|
14
|
-
* whether the journal directory the viewer reads is
|
|
14
|
+
* for the methods phase 3 uses, where the pane host binary resolves, what the
|
|
15
|
+
* boot layout composes, and whether the journal directory the viewer reads is
|
|
16
|
+
* writable.
|
|
15
17
|
*
|
|
16
18
|
* No row is an error. Panes are optional: an operator who never wanted them has
|
|
17
19
|
* a healthy install without them, and doctor's exit code answers "is this
|
|
@@ -24,11 +26,8 @@ const PANE_HOST_TOOL_ID = "herdr";
|
|
|
24
26
|
/** Highest protocol any method Clio drives requires, for the version row. */
|
|
25
27
|
const REQUIRED_PROTOCOL = Math.max(...Object.values(MUX_METHOD_MIN_PROTOCOL));
|
|
26
28
|
|
|
27
|
-
function journalWritabilityFinding(root =
|
|
29
|
+
function journalWritabilityFinding(root = join(resolveClioDirs().state, "runs")): DoctorFinding {
|
|
28
30
|
try {
|
|
29
|
-
// The viewer reads this tree and the journal writes it, so the useful
|
|
30
|
-
// question is whether it can exist and be written, not whether it does.
|
|
31
|
-
mkdirSync(root, { recursive: true });
|
|
32
31
|
accessSync(root, constants.W_OK);
|
|
33
32
|
return { ok: true, name: "panes journal dir", detail: `${root} is writable` };
|
|
34
33
|
} catch (error) {
|
|
@@ -36,15 +35,28 @@ function journalWritabilityFinding(root = runEventJournalRoot()): DoctorFinding
|
|
|
36
35
|
ok: true,
|
|
37
36
|
level: "warn",
|
|
38
37
|
name: "panes journal dir",
|
|
39
|
-
detail: `${root} is not writable (${error instanceof Error ? error.message : String(error)}); \`clio-coder fleet view\` will have no transcript to follow`,
|
|
38
|
+
detail: `${root} is absent or not writable (${error instanceof Error ? error.message : String(error)}); \`clio-coder fleet view\` will have no transcript to follow`,
|
|
40
39
|
};
|
|
41
40
|
}
|
|
42
41
|
}
|
|
43
42
|
|
|
44
43
|
export async function panesFindings(env: NodeJS.ProcessEnv = process.env): Promise<DoctorFinding[]> {
|
|
45
44
|
let enabled: "auto" | "embedded" | "off" = "off";
|
|
45
|
+
let layoutRow: DoctorFinding = {
|
|
46
|
+
ok: true,
|
|
47
|
+
name: "panes layout",
|
|
48
|
+
detail: "off",
|
|
49
|
+
};
|
|
46
50
|
try {
|
|
47
|
-
|
|
51
|
+
const panes = readSettings().interface.panes;
|
|
52
|
+
enabled = panes.enabled;
|
|
53
|
+
if (panes.layout !== "off") {
|
|
54
|
+
layoutRow = {
|
|
55
|
+
ok: true,
|
|
56
|
+
name: "panes layout",
|
|
57
|
+
detail: `${panes.layout} at boot (workers dock ${(panes.workers.ratio * 100).toFixed(0)}%, files dock ${(panes.files.ratio * 100).toFixed(0)}%)`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
48
60
|
} catch {
|
|
49
61
|
// An unreadable settings file is already reported by the settings row;
|
|
50
62
|
// this section answers on the shipped default (off) rather than throwing.
|
|
@@ -59,10 +71,9 @@ export async function panesFindings(env: NodeJS.ProcessEnv = process.env): Promi
|
|
|
59
71
|
{
|
|
60
72
|
ok: true,
|
|
61
73
|
name: "panes mode",
|
|
62
|
-
detail:
|
|
63
|
-
"off by choice (panes.enabled=off); start `clio-coder --with-panes` for one session, or set panes.enabled=auto",
|
|
74
|
+
detail: "off by choice",
|
|
64
75
|
},
|
|
65
|
-
|
|
76
|
+
layoutRow,
|
|
66
77
|
];
|
|
67
78
|
}
|
|
68
79
|
|
|
@@ -70,6 +81,7 @@ export async function panesFindings(env: NodeJS.ProcessEnv = process.env): Promi
|
|
|
70
81
|
// answer that boot would get. It opens a socket and nothing else: no file is
|
|
71
82
|
// created and no pane is touched.
|
|
72
83
|
const { detection, client } = await detectMux({ enabled, env });
|
|
84
|
+
const snapshot = client ? await client.snapshot().catch(() => null) : null;
|
|
73
85
|
await client?.close().catch(() => undefined);
|
|
74
86
|
|
|
75
87
|
const candidates = detection.candidates.length > 0 ? detection.candidates : resolveSocketCandidates(env);
|
|
@@ -119,6 +131,26 @@ export async function panesFindings(env: NodeJS.ProcessEnv = process.env): Promi
|
|
|
119
131
|
},
|
|
120
132
|
);
|
|
121
133
|
|
|
134
|
+
findings.push(layoutRow);
|
|
135
|
+
const legacyOwnedPanes =
|
|
136
|
+
snapshot?.panes.filter(
|
|
137
|
+
(pane) => pane.tokens.clio_owner === "clio:mux" && pane.tokens.clio_coder_owner !== "clio-coder:mux",
|
|
138
|
+
).length ?? 0;
|
|
139
|
+
const staleWatchTitles =
|
|
140
|
+
snapshot?.panes.filter(
|
|
141
|
+
(pane) =>
|
|
142
|
+
(pane.title === "clio watch" || pane.label === "clio watch") &&
|
|
143
|
+
(pane.tokens.clio_coder_owner === "clio-coder:mux" || pane.tokens.clio_owner === "clio:mux"),
|
|
144
|
+
).length ?? 0;
|
|
145
|
+
findings.push({
|
|
146
|
+
ok: true,
|
|
147
|
+
level: legacyOwnedPanes > 0 || staleWatchTitles > 0 ? "warn" : "ok",
|
|
148
|
+
name: "naming panes",
|
|
149
|
+
detail:
|
|
150
|
+
legacyOwnedPanes > 0 || staleWatchTitles > 0
|
|
151
|
+
? `${legacyOwnedPanes} panes carry only the legacy clio_owner=clio:mux token; ${staleWatchTitles} owned panes retain the stale 'clio watch' title; quit/cleanup recognizes both token schemes`
|
|
152
|
+
: "no legacy Clio Coder pane ownership tokens or watch titles found",
|
|
153
|
+
});
|
|
122
154
|
findings.push(journalWritabilityFinding());
|
|
123
155
|
return findings;
|
|
124
156
|
}
|
|
@@ -7,19 +7,31 @@ import {
|
|
|
7
7
|
} from "../domains/mux/index.js";
|
|
8
8
|
import { describeResolution, toolStatuses } from "../domains/toolchain/index.js";
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
export interface ToolchainFindingOptions {
|
|
11
|
+
panesEnabled?: boolean;
|
|
12
|
+
filesEnabled?: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function yaziProfileFinding(enabled: boolean): DoctorFinding {
|
|
16
|
+
if (!enabled) {
|
|
17
|
+
return {
|
|
18
|
+
ok: true,
|
|
19
|
+
name: "files pane profile",
|
|
20
|
+
detail: "disabled by settings",
|
|
21
|
+
};
|
|
22
|
+
}
|
|
11
23
|
try {
|
|
12
24
|
const profile = inspectCurrentYaziProfile();
|
|
13
25
|
return {
|
|
14
26
|
ok: true,
|
|
15
|
-
name: "
|
|
27
|
+
name: "files pane profile",
|
|
16
28
|
detail: describeYaziProfile(profile),
|
|
17
29
|
level: profile.state === "current" ? "ok" : "warn",
|
|
18
30
|
};
|
|
19
31
|
} catch (error) {
|
|
20
32
|
return {
|
|
21
33
|
ok: true,
|
|
22
|
-
name: "
|
|
34
|
+
name: "files pane profile",
|
|
23
35
|
level: "warn",
|
|
24
36
|
detail: `${yaziProfileDir()} could not be inspected (${error instanceof Error ? error.message : String(error)}); user config ${userYaziConfigDir()} is separate and untouched`,
|
|
25
37
|
};
|
|
@@ -43,15 +55,24 @@ function yaziProfileFinding(): DoctorFinding {
|
|
|
43
55
|
* being used, and a row that only said "not found" would send them looking for
|
|
44
56
|
* a binary that is right there on their PATH.
|
|
45
57
|
*/
|
|
46
|
-
export function toolchainFindings(): DoctorFinding[] {
|
|
58
|
+
export function toolchainFindings(options: ToolchainFindingOptions = {}): DoctorFinding[] {
|
|
59
|
+
const panesEnabled = options.panesEnabled ?? true;
|
|
60
|
+
const filesEnabled = options.filesEnabled ?? true;
|
|
47
61
|
const tools = toolStatuses().map((status) => ({
|
|
48
62
|
ok: true,
|
|
49
63
|
name: `external tool ${status.id}`,
|
|
50
|
-
//
|
|
51
|
-
//
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
64
|
+
// Active integrations share the tools-status resolution sentence. Disabled
|
|
65
|
+
// experimental integrations stay neutral and do not advertise setup work.
|
|
66
|
+
detail:
|
|
67
|
+
(status.id === "herdr" && !panesEnabled) || (status.id === "yazi" && !filesEnabled)
|
|
68
|
+
? "experimental integration disabled by settings"
|
|
69
|
+
: describeResolution(status),
|
|
70
|
+
level:
|
|
71
|
+
(status.id === "herdr" && !panesEnabled) || (status.id === "yazi" && !filesEnabled)
|
|
72
|
+
? ("ok" as const)
|
|
73
|
+
: status.resolution.source === "none"
|
|
74
|
+
? ("warn" as const)
|
|
75
|
+
: ("ok" as const),
|
|
55
76
|
}));
|
|
56
|
-
return [...tools, yaziProfileFinding()];
|
|
77
|
+
return [...tools, yaziProfileFinding(filesEnabled)];
|
|
57
78
|
}
|