@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
|
@@ -12,7 +12,7 @@ export function createResourcesBundle(
|
|
|
12
12
|
...(options.cwd !== undefined ? { cwd: options.cwd } : {}),
|
|
13
13
|
...(options.reservedPromptNames !== undefined ? { reservedPromptNames: options.reservedPromptNames } : {}),
|
|
14
14
|
skills: () => ({
|
|
15
|
-
...skillOptions(config()?.get().
|
|
15
|
+
...skillOptions(config()?.get().integrations.projectResources.trustProjectImports === true, options),
|
|
16
16
|
}),
|
|
17
17
|
});
|
|
18
18
|
const extension: DomainExtension = {
|
|
@@ -37,7 +37,7 @@ function isRecord(value: unknown): value is Record<string, unknown> {
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
function catalogPath(): string {
|
|
40
|
-
const configured = readSettings().library.catalog;
|
|
40
|
+
const configured = readSettings().integrations.library.catalog;
|
|
41
41
|
return path.resolve(configured ?? path.join(clioConfigDir(), "library.yaml"));
|
|
42
42
|
}
|
|
43
43
|
|
|
@@ -283,17 +283,17 @@ export function installLibraryPlan(plan: LibraryInstallPlan): void {
|
|
|
283
283
|
}
|
|
284
284
|
|
|
285
285
|
function confirmedRemote(): string {
|
|
286
|
-
const settings = readSettings().library;
|
|
286
|
+
const settings = readSettings().integrations.library;
|
|
287
287
|
if (!settings.remote || settings.remote !== settings.confirmedRemote) throw new Error("library_remote_unconfirmed");
|
|
288
288
|
return settings.remote;
|
|
289
289
|
}
|
|
290
290
|
|
|
291
291
|
export function confirmLibraryRemote(url: string): void {
|
|
292
|
-
const current = readSettings().library.remote;
|
|
292
|
+
const current = readSettings().integrations.library.remote;
|
|
293
293
|
if (current !== null && current !== url) throw new Error("library_remote_mismatch");
|
|
294
294
|
updateSettings((settings) => {
|
|
295
|
-
if (settings.library.remote === null) settings.library.remote = url;
|
|
296
|
-
settings.library.confirmedRemote = url;
|
|
295
|
+
if (settings.integrations.library.remote === null) settings.integrations.library.remote = url;
|
|
296
|
+
settings.integrations.library.confirmedRemote = url;
|
|
297
297
|
});
|
|
298
298
|
}
|
|
299
299
|
|
|
@@ -307,7 +307,7 @@ export async function syncLibrary(
|
|
|
307
307
|
direction: "sync" | "push",
|
|
308
308
|
runner: LibraryCommandRunner = runCommandVector,
|
|
309
309
|
): Promise<void> {
|
|
310
|
-
const settings = readSettings().library;
|
|
310
|
+
const settings = readSettings().integrations.library;
|
|
311
311
|
if (!settings.sync) throw new Error("library_sync_disabled");
|
|
312
312
|
const remote = confirmedRemote();
|
|
313
313
|
const cwd = path.dirname(catalogPath());
|
|
@@ -393,7 +393,7 @@ export function expandPromptTemplateInput(input: string, templates: PromptTempla
|
|
|
393
393
|
};
|
|
394
394
|
}
|
|
395
395
|
if (!template.trusted) {
|
|
396
|
-
const message = `prompt template ${template.name} comes from an untrusted project root; set
|
|
396
|
+
const message = `prompt template ${template.name} comes from an untrusted project root; set integrations.projectResources.trustProjectImports to use it`;
|
|
397
397
|
return {
|
|
398
398
|
expanded: false,
|
|
399
399
|
text: input,
|
|
@@ -2,7 +2,8 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Frontmatter keys owned by the install lifecycle, recognized both at the top
|
|
5
|
-
* level (legacy flat form) and nested under the reserved `clio:`
|
|
5
|
+
* level (legacy flat form) and nested under the reserved `clio-coder:` or
|
|
6
|
+
* released `clio:` block.
|
|
6
7
|
* Stripped before hashing so upstream and installed copies compare on
|
|
7
8
|
* content, not on when or how a copy was installed. Registry identity
|
|
8
9
|
* (`registry-id`, `registry-url`) is deliberately NOT here: it names which
|
|
@@ -64,7 +65,7 @@ export function frontmatterRegion(rawText: string): FrontmatterRegion | null {
|
|
|
64
65
|
export function stripProvenanceLines(lines: ReadonlyArray<string>): string[] {
|
|
65
66
|
const kept: string[] = [];
|
|
66
67
|
let dropIndent: number | null = null;
|
|
67
|
-
let
|
|
68
|
+
let inProductBlock = false;
|
|
68
69
|
for (const line of lines) {
|
|
69
70
|
const indent = line.length - line.trimStart().length;
|
|
70
71
|
if (dropIndent !== null && line.trim().length > 0 && indent > dropIndent) continue;
|
|
@@ -72,19 +73,19 @@ export function stripProvenanceLines(lines: ReadonlyArray<string>): string[] {
|
|
|
72
73
|
const keyMatch = line.match(/^([ \t]*)([A-Za-z][A-Za-z0-9-]*):/);
|
|
73
74
|
const key = keyMatch?.[2];
|
|
74
75
|
if (key !== undefined) {
|
|
75
|
-
if (indent === 0)
|
|
76
|
-
if (PROVENANCE_KEYS.has(key) && (indent === 0 ||
|
|
76
|
+
if (indent === 0) inProductBlock = key === "clio-coder" || key === "clio";
|
|
77
|
+
if (PROVENANCE_KEYS.has(key) && (indent === 0 || inProductBlock)) {
|
|
77
78
|
dropIndent = indent;
|
|
78
79
|
continue;
|
|
79
80
|
}
|
|
80
81
|
}
|
|
81
82
|
kept.push(line);
|
|
82
83
|
}
|
|
83
|
-
// A
|
|
84
|
+
// A product mapping whose children were all lifecycle keys is now empty;
|
|
84
85
|
// keep it and a source that never had the block reads as drifted from its
|
|
85
86
|
// own installed copy. Drop the dangling key line.
|
|
86
87
|
return kept.filter((line, index) => {
|
|
87
|
-
if (!/^clio:\s*$/.test(line)) return true;
|
|
88
|
+
if (!/^(?:clio-coder|clio):\s*$/.test(line)) return true;
|
|
88
89
|
for (let next = index + 1; next < kept.length; next += 1) {
|
|
89
90
|
const candidate = kept[next] as string;
|
|
90
91
|
if (candidate.trim().length === 0) continue;
|
|
@@ -29,7 +29,7 @@ export interface SkillEvalParseResult {
|
|
|
29
29
|
|
|
30
30
|
// Tolerates ASCII dash/colon and the en/em dashes older evals.md files used.
|
|
31
31
|
// The canonical prefix is S ("## S1 - title"); discipline skills use other
|
|
32
|
-
// letters (clio-dev's D1), so any single capital letter is accepted.
|
|
32
|
+
// letters (clio-coder-dev's D1), so any single capital letter is accepted.
|
|
33
33
|
const SCENARIO_HEADING = /^##\s+([A-Z])(\d+)\s*[-:–—]\s*(.+?)\s*$/;
|
|
34
34
|
|
|
35
35
|
export function parseSkillEvals(markdown: string): SkillEvalParseResult {
|
|
@@ -140,14 +140,33 @@ interface ProvenanceFields {
|
|
|
140
140
|
installedBy?: "worker";
|
|
141
141
|
}
|
|
142
142
|
|
|
143
|
+
function canonicalizeProductMetadataBlock(lines: ReadonlyArray<string>): string[] {
|
|
144
|
+
const hasCanonical = lines.some((line) => /^clio-coder:/.test(line));
|
|
145
|
+
const canonical: string[] = [];
|
|
146
|
+
let dropLegacyChildren = false;
|
|
147
|
+
for (const line of lines) {
|
|
148
|
+
if (/^clio:/.test(line)) {
|
|
149
|
+
dropLegacyChildren = hasCanonical;
|
|
150
|
+
if (!hasCanonical) canonical.push(line.replace(/^clio:/, "clio-coder:"));
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (dropLegacyChildren) {
|
|
154
|
+
if (line.trim().length === 0 || /^[ \t]/.test(line)) continue;
|
|
155
|
+
dropLegacyChildren = false;
|
|
156
|
+
}
|
|
157
|
+
canonical.push(line);
|
|
158
|
+
}
|
|
159
|
+
return canonical;
|
|
160
|
+
}
|
|
161
|
+
|
|
143
162
|
/**
|
|
144
163
|
* Replace install-lifecycle frontmatter with the recorded fields, written
|
|
145
|
-
* nested under the reserved `clio:` block (merged into an existing block-style
|
|
146
|
-
* `clio:` mapping when the skill carries one). Registry identity lines
|
|
164
|
+
* nested under the reserved `clio-coder:` block (merged into an existing block-style
|
|
165
|
+
* `clio-coder:` mapping when the skill carries one). Registry identity lines
|
|
147
166
|
* (`registry-id`, `registry-url`) are content, not lifecycle, so they survive
|
|
148
167
|
* the install and keep pinned drift checks working on the installed copy.
|
|
149
168
|
*
|
|
150
|
-
* A flow-style `clio: {...}` value cannot take appended block lines, so that
|
|
169
|
+
* A flow-style `clio-coder: {...}` value cannot take appended block lines, so that
|
|
151
170
|
* rare shape falls back to the legacy flat stamps, which the hash and loader
|
|
152
171
|
* still understand.
|
|
153
172
|
*/
|
|
@@ -166,21 +185,24 @@ function injectProvenanceFrontmatter(rawText: string, fields: ProvenanceFields):
|
|
|
166
185
|
"audit: unknown",
|
|
167
186
|
...(fields.installedBy ? [`installed-by: ${yamlQuote(fields.installedBy)}`] : []),
|
|
168
187
|
];
|
|
169
|
-
const
|
|
170
|
-
|
|
171
|
-
|
|
188
|
+
const canonicalKept = canonicalizeProductMetadataBlock(kept);
|
|
189
|
+
const clioIndex = canonicalKept.findIndex((line) => /^clio-coder:/.test(line));
|
|
190
|
+
if (clioIndex >= 0 && !/^clio-coder:\s*$/.test(canonicalKept[clioIndex] as string)) {
|
|
191
|
+
return `${region.head}${[...canonicalKept, ...stamps].join("\n")}${region.tail}`;
|
|
172
192
|
}
|
|
173
193
|
const nested = stamps.map((line) => ` ${line}`);
|
|
174
194
|
if (clioIndex < 0) {
|
|
175
|
-
return `${region.head}${[...
|
|
195
|
+
return `${region.head}${[...canonicalKept, "clio-coder:", ...nested].join("\n")}${region.tail}`;
|
|
176
196
|
}
|
|
177
197
|
let blockEnd = clioIndex + 1;
|
|
178
|
-
while (blockEnd <
|
|
179
|
-
const line =
|
|
198
|
+
while (blockEnd < canonicalKept.length) {
|
|
199
|
+
const line = canonicalKept[blockEnd] as string;
|
|
180
200
|
if (line.trim().length > 0 && !/^[ \t]/.test(line)) break;
|
|
181
201
|
blockEnd += 1;
|
|
182
202
|
}
|
|
183
|
-
return `${region.head}${[...
|
|
203
|
+
return `${region.head}${[...canonicalKept.slice(0, blockEnd), ...nested, ...canonicalKept.slice(blockEnd)].join(
|
|
204
|
+
"\n",
|
|
205
|
+
)}${region.tail}`;
|
|
184
206
|
}
|
|
185
207
|
|
|
186
208
|
function resolveSkillDir(target: string): string {
|
|
@@ -205,7 +227,7 @@ function fetchSource(spec: SkillSourceSpec): FetchedSource {
|
|
|
205
227
|
if (spec.kind === "local") {
|
|
206
228
|
return { skillDir: resolveSkillDir(spec.path), cleanup: () => {} };
|
|
207
229
|
}
|
|
208
|
-
const tmp = mkdtempSync(path.join(tmpdir(), "clio-skill-"));
|
|
230
|
+
const tmp = mkdtempSync(path.join(tmpdir(), "clio-coder-skill-"));
|
|
209
231
|
const cleanup = (): void => rmSync(tmp, { recursive: true, force: true });
|
|
210
232
|
try {
|
|
211
233
|
execFileSync("git", ["clone", "--depth", "1", "--branch", spec.branch, spec.cloneUrl, tmp], {
|
|
@@ -358,7 +380,9 @@ export function installSkillFromSource(input: InstallSkillInput): InstallSkillRe
|
|
|
358
380
|
function managedSkills(cwd: string, configDir?: string): Skill[] {
|
|
359
381
|
const list = loadSkills({ cwd, ...(configDir ? { configDir } : {}) });
|
|
360
382
|
// Only Clio-managed roots are update targets; compat roots belong to other harnesses.
|
|
361
|
-
return list.items.filter(
|
|
383
|
+
return list.items.filter(
|
|
384
|
+
(skill) => skill.source === "clio-coder" && (skill.scope === "user" || skill.scope === "project"),
|
|
385
|
+
);
|
|
362
386
|
}
|
|
363
387
|
|
|
364
388
|
function updateOne(skill: Skill, force: boolean): SkillUpdateReport {
|
|
@@ -2,6 +2,7 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { type Dirent, existsSync, readdirSync, readFileSync, realpathSync } from "node:fs";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import path from "node:path";
|
|
5
|
+
import { warnLegacyNaming } from "../../../core/naming-compat.js";
|
|
5
6
|
import type { PendingSkillRequest } from "../../../core/skill-activation.js";
|
|
6
7
|
import { type ToolName, ToolNames } from "../../../core/tool-names.js";
|
|
7
8
|
import { clioConfigDir } from "../../../core/xdg.js";
|
|
@@ -47,7 +48,7 @@ const CORE_FRONTMATTER_KEYS = new Set([
|
|
|
47
48
|
* only encodes collision precedence tiers shared across resource kinds.
|
|
48
49
|
*/
|
|
49
50
|
export type SkillSource =
|
|
50
|
-
| "clio"
|
|
51
|
+
| "clio-coder"
|
|
51
52
|
| "agents"
|
|
52
53
|
| "claude"
|
|
53
54
|
| "codex"
|
|
@@ -217,8 +218,7 @@ function defaultPrecedenceForScope(scope: ResourceScope): number {
|
|
|
217
218
|
* Clio's context, so one opt-in covers both.
|
|
218
219
|
*/
|
|
219
220
|
export function projectCompatTrusted(explicit?: boolean): boolean {
|
|
220
|
-
|
|
221
|
-
return process.env.CLIO_CODER_TRUST_PROJECT_SKILLS === "1";
|
|
221
|
+
return explicit === true;
|
|
222
222
|
}
|
|
223
223
|
|
|
224
224
|
/**
|
|
@@ -268,7 +268,7 @@ export function defaultSkillRoots(input: LoadSkillsInput = {}): SkillRoot[] {
|
|
|
268
268
|
roots.push({
|
|
269
269
|
path: path.join(configDir, "skills"),
|
|
270
270
|
scope: "user",
|
|
271
|
-
source: "clio",
|
|
271
|
+
source: "clio-coder",
|
|
272
272
|
origin: "config",
|
|
273
273
|
precedence: SKILL_PRECEDENCE.user,
|
|
274
274
|
trusted: true,
|
|
@@ -292,7 +292,7 @@ export function defaultSkillRoots(input: LoadSkillsInput = {}): SkillRoot[] {
|
|
|
292
292
|
roots.push({
|
|
293
293
|
path: path.join(cwd, ".clio-coder", "skills"),
|
|
294
294
|
scope: "project",
|
|
295
|
-
source: "clio",
|
|
295
|
+
source: "clio-coder",
|
|
296
296
|
origin: "project",
|
|
297
297
|
precedence: SKILL_PRECEDENCE.project,
|
|
298
298
|
trusted: true,
|
|
@@ -441,28 +441,49 @@ function validateDescription(description: string | null): string[] {
|
|
|
441
441
|
return [];
|
|
442
442
|
}
|
|
443
443
|
|
|
444
|
-
|
|
444
|
+
/**
|
|
445
|
+
* The deprecation names the file: a bare "clio: skill metadata" warning at
|
|
446
|
+
* boot left the operator hunting across five compatibility roots for the
|
|
447
|
+
* SKILL.md that carried the key, and `doctor` scanned only two of them.
|
|
448
|
+
*/
|
|
449
|
+
function warnLegacySkillMetadata(filePath: string): void {
|
|
450
|
+
warnLegacyNaming(`clio: skill metadata in ${filePath}`, "clio-coder: skill metadata");
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
function extractMetadata(frontmatter: Record<string, unknown>, filePath: string): Record<string, unknown> {
|
|
445
454
|
const metadata: Record<string, unknown> = {};
|
|
446
455
|
for (const [key, value] of Object.entries(frontmatter)) {
|
|
447
456
|
if (CORE_FRONTMATTER_KEYS.has(key)) continue;
|
|
457
|
+
if (key === "clio-coder") {
|
|
458
|
+
metadata.clioCoder = value;
|
|
459
|
+
continue;
|
|
460
|
+
}
|
|
461
|
+
if (key === "clio") {
|
|
462
|
+
warnLegacySkillMetadata(filePath);
|
|
463
|
+
if (!("clio-coder" in frontmatter)) metadata.clioCoder = value;
|
|
464
|
+
continue;
|
|
465
|
+
}
|
|
448
466
|
metadata[key] = value;
|
|
449
467
|
}
|
|
450
468
|
return metadata;
|
|
451
469
|
}
|
|
452
470
|
|
|
453
|
-
function extractProvenance(frontmatter: Record<string, unknown
|
|
454
|
-
// Provenance lives nested under the reserved `clio:` block; the flat
|
|
471
|
+
function extractProvenance(frontmatter: Record<string, unknown>, filePath: string): SkillProvenance | undefined {
|
|
472
|
+
// Provenance lives nested under the reserved `clio-coder:` block; the flat
|
|
455
473
|
// top-level keys remain readable for already-installed copies stamped
|
|
456
474
|
// before the nested form existed.
|
|
457
|
-
const
|
|
458
|
-
const
|
|
459
|
-
|
|
460
|
-
|
|
475
|
+
const canonicalRaw = frontmatter["clio-coder"];
|
|
476
|
+
const legacyRaw = frontmatter.clio;
|
|
477
|
+
if (legacyRaw !== undefined) warnLegacySkillMetadata(filePath);
|
|
478
|
+
const clioCoderRaw = canonicalRaw ?? legacyRaw;
|
|
479
|
+
const clioCoder =
|
|
480
|
+
clioCoderRaw !== null && typeof clioCoderRaw === "object" && !Array.isArray(clioCoderRaw)
|
|
481
|
+
? (clioCoderRaw as Record<string, unknown>)
|
|
461
482
|
: undefined;
|
|
462
483
|
const field = (...keys: string[]): string | null => {
|
|
463
484
|
for (const key of keys) {
|
|
464
|
-
if (
|
|
465
|
-
const nested = stringField(
|
|
485
|
+
if (clioCoder) {
|
|
486
|
+
const nested = stringField(clioCoder, key);
|
|
466
487
|
if (nested !== null) return nested;
|
|
467
488
|
}
|
|
468
489
|
}
|
|
@@ -621,7 +642,9 @@ function loadSkillFile(
|
|
|
621
642
|
|
|
622
643
|
const pathSubject = validationSubject(filePath);
|
|
623
644
|
const frontmatterName = stringField(parsed.frontmatter, "name");
|
|
624
|
-
const
|
|
645
|
+
const rawName = frontmatterName ?? pathSubject;
|
|
646
|
+
const name = rawName === "clio-dev" ? "clio-coder-dev" : rawName === "clio-test" ? "clio-coder-test" : rawName;
|
|
647
|
+
if (name !== rawName) warnLegacyNaming(rawName, name);
|
|
625
648
|
const description = stringField(parsed.frontmatter, "description");
|
|
626
649
|
|
|
627
650
|
for (const message of validateDescription(description)) diagnostics.push({ type: "warning", message, path: filePath });
|
|
@@ -645,7 +668,7 @@ function loadSkillFile(
|
|
|
645
668
|
scope,
|
|
646
669
|
...(root.origin ? { source: root.origin } : {}),
|
|
647
670
|
};
|
|
648
|
-
const provenance = extractProvenance(parsed.frontmatter);
|
|
671
|
+
const provenance = extractProvenance(parsed.frontmatter, filePath);
|
|
649
672
|
const allowedTools = declaredToolSurface(parsed.frontmatter, "allowed-tools", filePath, diagnostics);
|
|
650
673
|
const disallowedTools = declaredToolSurface(parsed.frontmatter, "disallowed-tools", filePath, diagnostics);
|
|
651
674
|
const skill: Skill = {
|
|
@@ -658,14 +681,14 @@ function loadSkillFile(
|
|
|
658
681
|
disableModelInvocation: booleanField(parsed.frontmatter, "disable-model-invocation"),
|
|
659
682
|
...(allowedTools ? { allowedTools } : {}),
|
|
660
683
|
...(disallowedTools ? { disallowedTools } : {}),
|
|
661
|
-
source: root.source ?? "clio",
|
|
684
|
+
source: root.source ?? "clio-coder",
|
|
662
685
|
scope,
|
|
663
686
|
hash: sha256(raw),
|
|
664
687
|
normalizedHash: normalizedSkillHash(raw),
|
|
665
688
|
pathSubject,
|
|
666
689
|
trusted: root.trusted ?? true,
|
|
667
690
|
precedence: root.precedence ?? defaultPrecedenceForScope(scope),
|
|
668
|
-
metadata: extractMetadata(parsed.frontmatter),
|
|
691
|
+
metadata: extractMetadata(parsed.frontmatter, filePath),
|
|
669
692
|
diagnostics,
|
|
670
693
|
...(provenance ? { provenance } : {}),
|
|
671
694
|
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
+
import { warnLegacyNaming } from "../../../core/naming-compat.js";
|
|
3
4
|
import { resolvePackageRoot } from "../../../core/package-root.js";
|
|
4
5
|
import { clioConfigDir } from "../../../core/xdg.js";
|
|
5
6
|
import {
|
|
@@ -55,6 +56,8 @@ export interface MarketplaceSkill {
|
|
|
55
56
|
audit?: "pass" | "warn" | "fail" | "unknown";
|
|
56
57
|
/** Catalog grouping ("git", "research", ...); absent in a flat catalog. */
|
|
57
58
|
category?: string;
|
|
59
|
+
/** Trigger phrases from the skill's frontmatter, for local promotion matching. */
|
|
60
|
+
triggers?: string[];
|
|
58
61
|
origin: MarketplaceSkillOrigin;
|
|
59
62
|
requires?: LibraryRequirementRef[];
|
|
60
63
|
}
|
|
@@ -131,6 +134,16 @@ function optionalString(value: unknown): string | undefined {
|
|
|
131
134
|
return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
|
|
132
135
|
}
|
|
133
136
|
|
|
137
|
+
/** Non-empty trimmed trigger phrases, or undefined when the field is absent or unusable. */
|
|
138
|
+
function optionalTriggerList(value: unknown): string[] | undefined {
|
|
139
|
+
if (!Array.isArray(value)) return undefined;
|
|
140
|
+
const triggers = value
|
|
141
|
+
.filter((entry): entry is string => typeof entry === "string")
|
|
142
|
+
.map((entry) => entry.trim())
|
|
143
|
+
.filter((entry) => entry.length > 0);
|
|
144
|
+
return triggers.length > 0 ? triggers : undefined;
|
|
145
|
+
}
|
|
146
|
+
|
|
134
147
|
function indexAudit(value: unknown): MarketplaceSkill["audit"] {
|
|
135
148
|
return value === "pass" || value === "warn" || value === "fail" || value === "unknown" ? value : undefined;
|
|
136
149
|
}
|
|
@@ -151,6 +164,7 @@ function parseMarketplaceIndex(indexPath: string, diagnostics: string[] = []): M
|
|
|
151
164
|
const version = optionalString(record.version);
|
|
152
165
|
const audit = indexAudit(record.audit);
|
|
153
166
|
const category = optionalString(record.category);
|
|
167
|
+
const triggers = optionalTriggerList(record.triggers);
|
|
154
168
|
if (record.kind !== undefined && !["skill", "agent", "prompt", "fleet"].includes(String(record.kind))) {
|
|
155
169
|
diagnostics.push(`skill marketplace index entry has unsupported kind: ${skill.name}`);
|
|
156
170
|
return [];
|
|
@@ -176,6 +190,7 @@ function parseMarketplaceIndex(indexPath: string, diagnostics: string[] = []): M
|
|
|
176
190
|
...(version ? { version } : {}),
|
|
177
191
|
...(audit ? { audit } : {}),
|
|
178
192
|
...(category ? { category } : {}),
|
|
193
|
+
...(triggers ? { triggers } : {}),
|
|
179
194
|
...(requires ? { requires } : {}),
|
|
180
195
|
origin: "index" as const,
|
|
181
196
|
},
|
|
@@ -242,6 +257,7 @@ function catalogCategory(catalogDir: string, baseDir: string): string | undefine
|
|
|
242
257
|
function catalogEntry(skill: Skill, catalogDir: string): MarketplaceSkill {
|
|
243
258
|
const version = typeof skill.metadata.version === "string" ? skill.metadata.version : undefined;
|
|
244
259
|
const category = catalogCategory(catalogDir, skill.baseDir);
|
|
260
|
+
const triggers = optionalTriggerList(skill.metadata.triggers);
|
|
245
261
|
return {
|
|
246
262
|
name: skill.name,
|
|
247
263
|
description: skill.description,
|
|
@@ -249,6 +265,7 @@ function catalogEntry(skill: Skill, catalogDir: string): MarketplaceSkill {
|
|
|
249
265
|
...(version ? { version } : {}),
|
|
250
266
|
...(skill.provenance?.audit ? { audit: skill.provenance.audit } : {}),
|
|
251
267
|
...(category ? { category } : {}),
|
|
268
|
+
...(triggers ? { triggers } : {}),
|
|
252
269
|
origin: "catalog",
|
|
253
270
|
kind: "skill",
|
|
254
271
|
};
|
|
@@ -311,7 +328,9 @@ export function getMarketplaceSkills(options: DiscoverMarketplaceOptions = {}):
|
|
|
311
328
|
* an existing install always requires an explicit `force: true`.
|
|
312
329
|
*/
|
|
313
330
|
export function installSkill(input: InstallSkillInput): InstallSkillResult {
|
|
314
|
-
const
|
|
331
|
+
const requested = input.source.trim();
|
|
332
|
+
const source = requested === "clio-dev" ? "clio-coder-dev" : requested === "clio-test" ? "clio-coder-test" : requested;
|
|
333
|
+
if (source !== requested) warnLegacyNaming(requested, source);
|
|
315
334
|
const spec = parseSkillSourceSpec(source);
|
|
316
335
|
if (spec?.kind === "local" && isSkillName(source) && !existsSync(spec.path)) {
|
|
317
336
|
const skill = getMarketplaceSkills({ ...(input.cwd ? { cwd: input.cwd } : {}) }).find(
|
|
@@ -322,5 +341,5 @@ export function installSkill(input: InstallSkillInput): InstallSkillResult {
|
|
|
322
341
|
}
|
|
323
342
|
return installSkillFromSource({ ...input, source: skill.sourceUrl });
|
|
324
343
|
}
|
|
325
|
-
return installSkillFromSource(input);
|
|
344
|
+
return installSkillFromSource({ ...input, source });
|
|
326
345
|
}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { safeResourceWrite } from "../../../core/safe-resource-write.js";
|
|
4
|
+
import { clioConfigDir } from "../../../core/xdg.js";
|
|
5
|
+
import type { MarketplaceSkill } from "./marketplace.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Marketplace self-promotion: local detection that an uninstalled marketplace
|
|
9
|
+
* skill serves the operator's current request, plus the two policy pieces the
|
|
10
|
+
* offer flow needs — the persistent "never offer this skill" store and the
|
|
11
|
+
* own-marketplace source gate that bounds what a promotion-flow install may
|
|
12
|
+
* ever fetch.
|
|
13
|
+
*
|
|
14
|
+
* Detection is a pure lexical match against the local catalog: no model call,
|
|
15
|
+
* no network, and no request text ever leaves the process. False positives
|
|
16
|
+
* cost operator trust, so the matcher is deliberately conservative — a
|
|
17
|
+
* trigger-phrase hit or a strong distinctive-token overlap fires; anything
|
|
18
|
+
* weaker stays silent and the broad paths (the first-turn reminder,
|
|
19
|
+
* context(scope="skills")) remain the fallback.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
export interface PromotionMatch {
|
|
23
|
+
entry: MarketplaceSkill;
|
|
24
|
+
score: number;
|
|
25
|
+
/** The trigger phrase that fired, when the match came from one. */
|
|
26
|
+
matchedTrigger?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const TOKEN_STOPWORDS = new Set([
|
|
30
|
+
"the",
|
|
31
|
+
"a",
|
|
32
|
+
"an",
|
|
33
|
+
"and",
|
|
34
|
+
"or",
|
|
35
|
+
"for",
|
|
36
|
+
"with",
|
|
37
|
+
"this",
|
|
38
|
+
"that",
|
|
39
|
+
"when",
|
|
40
|
+
"what",
|
|
41
|
+
"how",
|
|
42
|
+
"into",
|
|
43
|
+
"from",
|
|
44
|
+
"use",
|
|
45
|
+
"used",
|
|
46
|
+
"using",
|
|
47
|
+
"one",
|
|
48
|
+
"not",
|
|
49
|
+
"skill",
|
|
50
|
+
"skills",
|
|
51
|
+
"clio",
|
|
52
|
+
"please",
|
|
53
|
+
"can",
|
|
54
|
+
"you",
|
|
55
|
+
"should",
|
|
56
|
+
"would",
|
|
57
|
+
"about",
|
|
58
|
+
"need",
|
|
59
|
+
"want",
|
|
60
|
+
"help",
|
|
61
|
+
"make",
|
|
62
|
+
"file",
|
|
63
|
+
"files",
|
|
64
|
+
"code",
|
|
65
|
+
]);
|
|
66
|
+
|
|
67
|
+
function normalize(text: string): string {
|
|
68
|
+
return text
|
|
69
|
+
.toLowerCase()
|
|
70
|
+
.replace(/[^\p{L}\p{N}\s]/gu, " ")
|
|
71
|
+
.replace(/\s+/g, " ")
|
|
72
|
+
.trim();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Distinctive tokens: 4+ chars and outside the stopword set. */
|
|
76
|
+
function distinctiveTokens(text: string): Set<string> {
|
|
77
|
+
return new Set(
|
|
78
|
+
normalize(text)
|
|
79
|
+
.split(" ")
|
|
80
|
+
.filter((token) => token.length >= 4 && !TOKEN_STOPWORDS.has(token)),
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const TRIGGER_SCORE = 4;
|
|
85
|
+
/** Distinct description/name token overlaps required to fire without a trigger. */
|
|
86
|
+
const TOKEN_FIRE_THRESHOLD = 3;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Score one marketplace entry against the operator's request text. A trigger
|
|
90
|
+
* phrase is a whole-phrase substring match on normalized text; token overlap
|
|
91
|
+
* is a fallback for skills whose triggers have not been authored yet.
|
|
92
|
+
*/
|
|
93
|
+
export function scorePromotionEntry(userText: string, entry: MarketplaceSkill): PromotionMatch | null {
|
|
94
|
+
const haystack = ` ${normalize(userText)} `;
|
|
95
|
+
if (haystack.trim().length === 0) return null;
|
|
96
|
+
for (const trigger of entry.triggers ?? []) {
|
|
97
|
+
const phrase = normalize(trigger);
|
|
98
|
+
if (phrase.length >= 4 && haystack.includes(` ${phrase} `)) {
|
|
99
|
+
return { entry, score: TRIGGER_SCORE, matchedTrigger: trigger };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const requestTokens = distinctiveTokens(userText);
|
|
103
|
+
if (requestTokens.size === 0) return null;
|
|
104
|
+
const entryTokens = distinctiveTokens(`${entry.name.replace(/-/g, " ")} ${entry.description}`);
|
|
105
|
+
let overlap = 0;
|
|
106
|
+
for (const token of requestTokens) if (entryTokens.has(token)) overlap += 1;
|
|
107
|
+
return overlap >= TOKEN_FIRE_THRESHOLD ? { entry, score: overlap } : null;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* The uninstalled marketplace entries that match the request, best first.
|
|
112
|
+
* `excludedNames` carries installed skills plus every decline scope the
|
|
113
|
+
* caller tracks; the matcher itself is stateless.
|
|
114
|
+
*/
|
|
115
|
+
export function matchMarketplaceSkills(
|
|
116
|
+
userText: string,
|
|
117
|
+
entries: ReadonlyArray<MarketplaceSkill>,
|
|
118
|
+
excludedNames: ReadonlySet<string>,
|
|
119
|
+
): PromotionMatch[] {
|
|
120
|
+
const matches: PromotionMatch[] = [];
|
|
121
|
+
for (const entry of entries) {
|
|
122
|
+
if (entry.kind !== "skill" || excludedNames.has(entry.name)) continue;
|
|
123
|
+
const match = scorePromotionEntry(userText, entry);
|
|
124
|
+
if (match) matches.push(match);
|
|
125
|
+
}
|
|
126
|
+
return matches.sort((a, b) => b.score - a.score || a.entry.name.localeCompare(b.entry.name));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* The hard runtime gate on promotion-flow installs: only Clio's own
|
|
131
|
+
* marketplace is ever an acceptable source, whether the install runs on
|
|
132
|
+
* operator consent or autonomously at full-auto. A local path is the shipped
|
|
133
|
+
* package catalog (install copies files, no network); the one acceptable URL
|
|
134
|
+
* shape is this project's own repository tree. Public skill registries and
|
|
135
|
+
* arbitrary GitHub sources are rejected here, in code — a prompt instruction
|
|
136
|
+
* is not the enforcement mechanism.
|
|
137
|
+
*
|
|
138
|
+
* This gates the promotion flow only. Operator-driven installs through
|
|
139
|
+
* `clio-coder skills install <url>` keep their existing behavior.
|
|
140
|
+
*/
|
|
141
|
+
export const OWN_MARKETPLACE_URL_PREFIX = "https://github.com/iowarp/clio-coder/";
|
|
142
|
+
|
|
143
|
+
export function isOwnMarketplaceSource(entry: Pick<MarketplaceSkill, "origin" | "sourceUrl">): boolean {
|
|
144
|
+
const source = entry.sourceUrl.trim();
|
|
145
|
+
if (/^(?:https?:\/\/|git@)/.test(source)) return source.startsWith(OWN_MARKETPLACE_URL_PREFIX);
|
|
146
|
+
// A non-URL source is a local filesystem path; only catalog discovery
|
|
147
|
+
// produces those, and it resolves them against the shipped package.
|
|
148
|
+
return entry.origin === "catalog" && path.isAbsolute(source);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export function assertPromotionInstallSource(entry: MarketplaceSkill): void {
|
|
152
|
+
if (isOwnMarketplaceSource(entry)) return;
|
|
153
|
+
throw new Error(
|
|
154
|
+
`skill promotion: refusing to install "${entry.name}" from ${entry.sourceUrl}; ` +
|
|
155
|
+
"promotion installs only from Clio's own marketplace (local catalog or " +
|
|
156
|
+
`${OWN_MARKETPLACE_URL_PREFIX}). Install manually with clio-coder skills install if intended.`,
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Persistent "never offer this skill" store. Session-scoped declines live in
|
|
162
|
+
* the offer registration's memory and die with the session; this file holds
|
|
163
|
+
* only the explicit fourth option. It is a standalone JSON document in the
|
|
164
|
+
* config dir rather than a settings key because the settings-v2 manifest is
|
|
165
|
+
* owned elsewhere this sprint; the proposed key for a later migration is
|
|
166
|
+
* `skills.promotionDeclines`.
|
|
167
|
+
*/
|
|
168
|
+
export const PROMOTION_DECLINES_FILE = "skill-promotion-declines.json";
|
|
169
|
+
|
|
170
|
+
export interface PromotionDeclineStore {
|
|
171
|
+
/** decline key (name@version) -> ISO timestamp of the operator's "never" answer. */
|
|
172
|
+
never: Record<string, string>;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* The decline store key. A "never" answer is scoped to the catalog version the
|
|
177
|
+
* operator saw, so a later version of the same skill is offerable again while a
|
|
178
|
+
* re-published identical version stays declined. Absent version keys as
|
|
179
|
+
* `name@`, distinct from any real version, so it re-offers once a version
|
|
180
|
+
* appears.
|
|
181
|
+
*/
|
|
182
|
+
export function declineKey(name: string, version?: string): string {
|
|
183
|
+
return `${name}@${version ?? ""}`;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function declinesPath(configDir?: string): string {
|
|
187
|
+
return path.join(configDir ?? clioConfigDir(), PROMOTION_DECLINES_FILE);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export function readPromotionDeclines(configDir?: string): PromotionDeclineStore {
|
|
191
|
+
const file = declinesPath(configDir);
|
|
192
|
+
if (!existsSync(file)) return { never: {} };
|
|
193
|
+
try {
|
|
194
|
+
const parsed = JSON.parse(readFileSync(file, "utf8")) as unknown;
|
|
195
|
+
const never =
|
|
196
|
+
parsed && typeof parsed === "object" && !Array.isArray(parsed) ? (parsed as { never?: unknown }).never : undefined;
|
|
197
|
+
if (never && typeof never === "object" && !Array.isArray(never)) {
|
|
198
|
+
const entries = Object.entries(never as Record<string, unknown>).filter(
|
|
199
|
+
(pair): pair is [string, string] => typeof pair[1] === "string",
|
|
200
|
+
);
|
|
201
|
+
return { never: Object.fromEntries(entries) };
|
|
202
|
+
}
|
|
203
|
+
} catch {
|
|
204
|
+
// An unreadable store means no recorded declines; the worst outcome is
|
|
205
|
+
// one extra offer, which the operator can re-decline.
|
|
206
|
+
}
|
|
207
|
+
return { never: {} };
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
export function recordPromotionNeverDecline(name: string, version?: string, configDir?: string): void {
|
|
211
|
+
const store = readPromotionDeclines(configDir);
|
|
212
|
+
store.never[declineKey(name, version)] = new Date().toISOString();
|
|
213
|
+
safeResourceWrite(declinesPath(configDir), `${JSON.stringify(store, null, 2)}\n`, { encoding: "utf8" });
|
|
214
|
+
}
|
|
@@ -11,7 +11,7 @@ import type { SafetyPolicyDecision } from "./policy-engine.js";
|
|
|
11
11
|
* rotation, and on a low-frequency background interval instead of once per
|
|
12
12
|
* row, which kept blocking the admission hot path on disk latency. Write
|
|
13
13
|
* errors never throw back to the caller because safety must not kill the hot
|
|
14
|
-
* path; they are logged to stderr with a `[clio:audit]` prefix for
|
|
14
|
+
* path; they are logged to stderr with a `[clio-coder:audit]` prefix for
|
|
15
15
|
* post-mortem review.
|
|
16
16
|
*
|
|
17
17
|
* Records are a discriminated union over `kind`:
|
|
@@ -404,7 +404,7 @@ interface OpenFile {
|
|
|
404
404
|
function logAuditError(err: unknown, path?: string): void {
|
|
405
405
|
const msg = err instanceof Error ? err.message : String(err);
|
|
406
406
|
const where = path ? ` (${path})` : "";
|
|
407
|
-
process.stderr.write(`[clio:audit] ${msg}${where}\n`);
|
|
407
|
+
process.stderr.write(`[clio-coder:audit] ${msg}${where}\n`);
|
|
408
408
|
}
|
|
409
409
|
|
|
410
410
|
/** Cadence of the background safety flush that bounds how long rows can sit unfsynced. */
|
|
@@ -168,7 +168,7 @@ const CALL_TARGET_FIELDS: Readonly<Record<string, ReadonlyArray<string>>> = {
|
|
|
168
168
|
grep: ["pattern", "path", "mode", "glob", "ignore_case", "literal", "context", "limit", "include_ignored"],
|
|
169
169
|
find: ["pattern", "path", "order", "limit", "include_ignored"],
|
|
170
170
|
ls: ["path", "limit"],
|
|
171
|
-
code_nav: ["mode", "query", "limit"],
|
|
171
|
+
code_nav: ["source", "mode", "query", "limit"],
|
|
172
172
|
context: ["scope", "query", "name", "limit", "ref", "include_tree"],
|
|
173
173
|
credential_present: ["name", "source", "file"],
|
|
174
174
|
write: ["path"],
|