@iowarp/clio-coder 0.3.0 → 0.3.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 +123 -2
- package/CONTRIBUTING.md +23 -23
- package/README.md +295 -627
- package/dist/acp-BIYHVZIM.js +128 -0
- package/dist/{agents-Q4MYPMUW.js → agents-YT6SSRIT.js} +52 -27
- package/dist/assets/codewiki.json +1 -0
- package/dist/assets/grammars/notices/@vscode__tree-sitter-wasm/LICENSE +21 -0
- package/dist/assets/grammars/notices/@vscode__tree-sitter-wasm/cgmanifest.json +16 -0
- package/dist/assets/grammars/notices/tree-sitter-wasms/LICENSE +24 -0
- package/dist/assets/grammars/tree-sitter-c-sharp.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-c.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-cpp.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-go.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-java.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-javascript.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-python.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-ruby.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-rust.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-tsx.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-typescript.wasm +0 -0
- package/dist/assets/grammars/tree-sitter.wasm +0 -0
- package/dist/{auth-O6HYIJ6J.js → auth-5TWEIYDN.js} +30 -15
- package/dist/chunk-2EHAIA3X.js +481 -0
- package/dist/{chunk-ME6DNWIU.js → chunk-2IR2NMPA.js} +12 -4
- package/dist/chunk-2SFS6XQE.js +122 -0
- package/dist/{chunk-KKKPTZLM.js → chunk-2STGEDFV.js} +8 -1
- package/dist/chunk-2VTFPG5O.js +48 -0
- package/dist/chunk-3I7MS7N2.js +40 -0
- package/dist/chunk-3R73A4XB.js +69 -0
- package/dist/{chunk-JPOWPFCU.js → chunk-3ZXDFGR5.js} +52 -23
- package/dist/chunk-4BJ5BYCE.js +61 -0
- package/dist/{chunk-26BZQOAD.js → chunk-4BPJXDWC.js} +161 -260
- package/dist/chunk-4KLWL3UC.js +18 -0
- package/dist/{chunk-5LDRNKX2.js → chunk-4VP4KH3K.js} +161 -262
- package/dist/chunk-4ZG3XFUR.js +77 -0
- package/dist/chunk-5B2AEOW5.js +5407 -0
- package/dist/chunk-5TSRNF4G.js +510 -0
- package/dist/{chunk-WD6AJM35.js → chunk-5UUP6MWO.js} +48 -69
- package/dist/{chunk-X3BR7HWV.js → chunk-5WIGXA4T.js} +7 -1
- package/dist/chunk-65DEGPJ6.js +52 -0
- package/dist/chunk-6EJMN2Y3.js +17 -0
- package/dist/chunk-6EJV5X2W.js +16405 -0
- package/dist/chunk-6N5PTWMY.js +136 -0
- package/dist/chunk-6XLNIQDB.js +27 -0
- package/dist/{chunk-XNISANGE.js → chunk-77VKQEHF.js} +171 -74
- package/dist/chunk-7CR24IG7.js +242 -0
- package/dist/{chunk-UWIJNAOB.js → chunk-7EYHLWU7.js} +907 -638
- package/dist/chunk-7MNJORFF.js +22 -0
- package/dist/{chunk-JWHCJDCI.js → chunk-A3CYT5EX.js} +257 -79
- package/dist/chunk-AGYYIBLL.js +1069 -0
- package/dist/chunk-AO4RKG4M.js +277 -0
- package/dist/chunk-APJ265NV.js +7410 -0
- package/dist/chunk-ARBGF5F7.js +174 -0
- package/dist/{chunk-TFSSEXL6.js → chunk-BMEMKKIT.js} +14 -4
- package/dist/{chunk-X3NE4WVW.js → chunk-BNAZZHFG.js} +7 -1
- package/dist/chunk-CBCAPZAA.js +229 -0
- package/dist/{chunk-QV47YRF4.js → chunk-CGKSTWHD.js} +7 -1
- package/dist/chunk-CMZWFGD2.js +352 -0
- package/dist/chunk-ECH6PKUQ.js +39 -0
- package/dist/{chunk-67MTHP2E.js → chunk-ED4KHGC3.js} +13 -5
- package/dist/chunk-EKMEHE4H.js +340 -0
- package/dist/{chunk-O4EJEDHO.js → chunk-EPVUXGXG.js} +50 -35
- package/dist/chunk-FCSXB6T2.js +338 -0
- package/dist/chunk-FJ3H4MN5.js +48 -0
- package/dist/chunk-FQ4SKYE4.js +29 -0
- package/dist/chunk-G2DE3C7R.js +644 -0
- package/dist/chunk-G4BMMOKF.js +182 -0
- package/dist/{chunk-7BHLZB3A.js → chunk-GGXXDWE4.js} +190 -1218
- package/dist/chunk-HC4CLZ2Y.js +68 -0
- package/dist/{chunk-E3NYWENM.js → chunk-HFSBBKSQ.js} +55 -61
- package/dist/chunk-HKIYEGME.js +30 -0
- package/dist/chunk-I4HZDVNP.js +73 -0
- package/dist/chunk-IGLFWIYI.js +161 -0
- package/dist/chunk-IHXBNWMM.js +137 -0
- package/dist/chunk-IKCO5N3L.js +162 -0
- package/dist/chunk-IR4CFBFN.js +56 -0
- package/dist/{chunk-DXQNI4PC.js → chunk-IWHMRKLL.js} +8 -1
- package/dist/{chunk-VOO7NYPP.js → chunk-J5HN4RYU.js} +27 -9
- package/dist/{chunk-4UQA7NCT.js → chunk-J5Q24KAG.js} +7 -2
- package/dist/{chunk-KBR4MZZR.js → chunk-JVCV3ICN.js} +7 -1
- package/dist/chunk-KJ5LWLOE.js +1077 -0
- package/dist/chunk-LBMZMYH2.js +285 -0
- package/dist/{chunk-3DANZDGR.js → chunk-LBNRH5WM.js} +100 -161
- package/dist/{chunk-TKHQ4DGZ.js → chunk-LZSJBIVT.js} +7358 -7414
- package/dist/{chunk-UGYAX5YI.js → chunk-M6SHUN7Q.js} +13 -8
- package/dist/chunk-MAW544W2.js +1882 -0
- package/dist/chunk-MBS4V7ZP.js +217 -0
- package/dist/{chunk-2J63S4SF.js → chunk-MFFY33HR.js} +167 -140
- package/dist/chunk-MNA4JGU4.js +255 -0
- package/dist/chunk-MQSRRFWA.js +3428 -0
- package/dist/{chunk-RQDWMVRB.js → chunk-MVVUPGPW.js} +138 -137
- package/dist/chunk-OAO4GE4M.js +619 -0
- package/dist/chunk-OHHN2SO4.js +5135 -0
- package/dist/chunk-OKGUZO2U.js +34 -0
- package/dist/{chunk-BBUH4VAA.js → chunk-OOJYHWRB.js} +60 -361
- package/dist/{chunk-D5YD55AR.js → chunk-OQ33BKR3.js} +12 -1
- package/dist/chunk-OQE5J4C6.js +73 -0
- package/dist/{chunk-AMFR5YA3.js → chunk-ORBHGJC5.js} +26 -12
- package/dist/chunk-POHLU5DW.js +1186 -0
- package/dist/chunk-QKMUKYO7.js +4961 -0
- package/dist/{chunk-7RBKDI66.js → chunk-QTYWRVRA.js} +104 -12
- package/dist/{chunk-5N2FG33Q.js → chunk-R346GLFC.js} +7 -1
- package/dist/chunk-SRF2PJNW.js +184 -0
- package/dist/chunk-SST6Z5JA.js +80 -0
- package/dist/{chunk-XV4ZJ6ZM.js → chunk-STBPMHSX.js} +473 -1194
- package/dist/{chunk-HBU5MTAM.js → chunk-SVNXH4L2.js} +7 -1
- package/dist/chunk-T6YILFSB.js +80 -0
- package/dist/chunk-TXOTCRLG.js +15 -0
- package/dist/chunk-TZTZS7QK.js +227 -0
- package/dist/chunk-UOV2BYIW.js +107 -0
- package/dist/{chunk-527KG6XR.js → chunk-V4RXGQ5Q.js} +72 -185
- package/dist/chunk-VAKQQHWR.js +434 -0
- package/dist/chunk-VG7TBQIY.js +128 -0
- package/dist/chunk-VJWL6YS5.js +244 -0
- package/dist/chunk-WEH5XRJQ.js +32 -0
- package/dist/{chunk-VPAWTYLY.js → chunk-WEPFGWHJ.js} +7 -1
- package/dist/chunk-WMSVI4G2.js +2095 -0
- package/dist/chunk-WVO7V2QY.js +797 -0
- package/dist/chunk-X4RCMKVQ.js +641 -0
- package/dist/chunk-X75S7HFS.js +374 -0
- package/dist/chunk-XN3L4EYL.js +46 -0
- package/dist/{chunk-HMYNFFY4.js → chunk-XPLRXC72.js} +7 -2
- package/dist/{chunk-PIDUD6M2.js → chunk-YCWGATWI.js} +12 -5
- package/dist/chunk-YHZX5GEU.js +193 -0
- package/dist/chunk-YXLYO42X.js +91 -0
- package/dist/{chunk-UHTSULZS.js → chunk-ZDOOVTXZ.js} +38 -73
- package/dist/chunk-ZI647VB5.js +37 -0
- package/dist/{chunk-CLJ5HLUD.js → chunk-ZWLZP4ZT.js} +25 -6
- package/dist/cli/index.js +70 -56
- package/dist/clio-4LY5K2AC.js +25 -0
- package/dist/code-nav-7AX6FYE6.js +600 -0
- package/dist/codewiki/build-worker.js +66 -0
- package/dist/compile-cache-CVJMMODC.js +18 -0
- package/dist/{components-JVHMUBEB.js → components-KELWS457.js} +31 -9
- package/dist/{config-ZFCDBMDC.js → config-GTLUW2PR.js} +104 -56
- package/dist/configure-R6A64DHX.js +42 -0
- package/dist/context-5VKGUVJJ.js +866 -0
- package/dist/{context-CDXTP2MP.js → context-JFZEJ7W5.js} +21 -13
- package/dist/{context-E3KIFVXI.js → context-RW5HC47S.js} +77 -36
- package/dist/{context-clear-3F4PLXOS.js → context-clear-6ZHBAZZT.js} +64 -30
- package/dist/{context-index-Q7YSYTR3.js → context-index-BZ4UYMTC.js} +36 -24
- package/dist/dispatch-runner-VKBRCWQC.js +1997 -0
- package/dist/{docs-YIETIWZI.js → docs-2C2LTVT2.js} +32 -13
- package/dist/doctor-KI767GSN.js +87 -0
- package/dist/{eval-B3KZZESM.js → eval-XSSNATB4.js} +93 -27
- package/dist/{evidence-V67CHM35.js → evidence-UA6AWDQQ.js} +55 -27
- package/dist/{evolve-YDZSUQYA.js → evolve-QNTFGV6Z.js} +59 -26
- package/dist/{extensions-SRG7XCAH.js → extensions-QVDOHDGJ.js} +23 -8
- package/dist/{fleet-CA2CRTVG.js → fleet-Q7UOMUSG.js} +173 -56
- package/dist/fleet-preflight-DDN536IT.js +26 -0
- package/dist/{init-2OZDJE2D.js → init-WBB65ZHQ.js} +79 -34
- package/dist/{memory-3PIQQAKX.js → memory-MD3O64RI.js} +57 -28
- package/dist/{models-DY35XI7Y.js → models-BZU34YWD.js} +49 -24
- package/dist/monitor-MEQA5C3I.js +661 -0
- package/dist/{chunk-PS4PFJQP.js → orchestrator-CGFKEP27.js} +22837 -18564
- package/dist/{paths-5OMXW7Z4.js → paths-UXLN5YYZ.js} +17 -6
- package/dist/preload-P6DGH2PZ.js +13 -0
- package/dist/{reset-PIFYNOS3.js → reset-L2FQEE3E.js} +25 -13
- package/dist/{run-3VSPP24F.js → run-IV4Q6RLN.js} +115 -63
- package/dist/{share-D36RQCXM.js → share-S5BZQC5I.js} +23 -10
- package/dist/{skills-F2MRLELY.js → skills-LQEKRDTN.js} +42 -15
- package/dist/{skills-eval-E2ZTW4PL.js → skills-eval-3DC4HEWS.js} +90 -45
- package/dist/steer-GGWFUJUD.js +77 -0
- package/dist/{targets-DZMEZAH4.js → targets-C4SSGQOB.js} +78 -60
- package/dist/terminal-lease-IT5JW2NR.js +395 -0
- package/dist/{trace-7NYCUI2J.js → trace-PNCASAXC.js} +48 -17
- package/dist/tree-sitter-HGKH6LG4.js +4673 -0
- package/dist/{uninstall-AD3JWHBB.js → uninstall-FZCQCDKC.js} +19 -8
- package/dist/{upgrade-WYYBKGDY.js → upgrade-7TT7SQ3G.js} +66 -24
- package/dist/{usage-ULIDAGFF.js → usage-GV4PKT3M.js} +71 -32
- package/dist/verify-G6V4D2G7.js +716 -0
- package/dist/version-KGEG7EPO.js +21 -0
- package/dist/web-fetch-2YHJ3KTG.js +638 -0
- package/dist/{wiki-generate-PKFIX6OB.js → wiki-generate-DQF6Z66B.js} +98 -48
- package/dist/worker/entry.js +297 -54
- package/dist/workspace-G4ZWUIPR.js +22 -0
- package/docs/README.md +29 -21
- package/docs/acp.md +191 -16
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +157 -7
- package/docs/artifact-placement.md +101 -0
- package/docs/artifact-versions.md +1 -1
- package/docs/built-in-agents.md +4 -2
- package/docs/capacity-and-scheduling.md +1 -1
- package/docs/commands-and-modes.md +224 -97
- package/docs/config-knobs-audit.md +1 -3
- package/docs/configuration-and-targets.md +236 -38
- package/docs/context-engine.md +34 -7
- package/docs/development-pipeline.md +102 -0
- package/docs/dispatch-architecture-rationale.md +1 -1
- package/docs/documentation-coverage.md +4 -4
- package/docs/documentation-guide.md +3 -3
- package/docs/environment-variables.md +15 -6
- package/docs/eval-runner.md +3 -3
- package/docs/evals-internal.md +2 -2
- package/docs/evidence-and-memory.md +10 -2
- package/docs/evolution.md +2 -2
- package/docs/exit-codes-and-output.md +15 -9
- package/docs/extensions-and-sharing.md +25 -18
- package/docs/fleet-demo-runbook.md +22 -23
- package/docs/fleet-dispatch.md +117 -16
- package/docs/git-commit-provenance.md +120 -0
- package/docs/glossary.md +107 -15
- package/docs/installation-and-lifecycle.md +75 -17
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +46 -15
- package/docs/observability.md +8 -5
- package/docs/performance-methodology.md +491 -0
- package/docs/pi-boundary.md +72 -0
- package/docs/proactive-memory.md +14 -14
- package/docs/prompt-envelope-and-tools.md +25 -4
- package/docs/provider-adapter-cookbook.md +57 -4
- package/docs/release-cut-checklist.md +129 -111
- package/docs/safety-model.md +28 -8
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +55 -12
- package/docs/skills-marketplace.md +12 -8
- package/docs/time-conventions.md +101 -0
- package/docs/tool-usage.md +6 -5
- package/docs/trace-store.md +1 -1
- package/docs/troubleshooting.md +10 -7
- package/docs/tui-design.md +121 -28
- package/docs/worker-dispatch-mechanics.md +3 -3
- package/package.json +33 -36
- package/skills/README.md +5 -6
- package/skills/coding/ast-grep/SKILL.md +136 -0
- package/skills/coding/ast-grep/evals.md +56 -0
- package/skills/coding/ast-grep/references/rule_reference.md +297 -0
- package/skills/coding/coding-standards/SKILL.md +113 -0
- package/skills/coding/coding-standards/evals.md +34 -0
- package/skills/coding/prototype/SKILL.md +86 -0
- package/skills/coding/prototype/evals.md +42 -0
- package/skills/coding/prototype/references/LOGIC.md +67 -0
- package/skills/coding/prototype/references/UI.md +112 -0
- package/skills/coding/tdd/SKILL.md +101 -0
- package/skills/coding/tdd/evals.md +41 -0
- package/skills/coding/tdd/references/mocking.md +59 -0
- package/skills/coding/tdd/references/tests.md +77 -0
- package/skills/context/context-handoff/SKILL.md +126 -0
- package/skills/context/context-handoff/evals.md +57 -0
- package/skills/context/context-handoff/scripts/new-handoff.sh +26 -0
- package/skills/context/context-prime/SKILL.md +95 -0
- package/skills/context/context-prime/evals.md +54 -0
- package/skills/git/file-ticket/SKILL.md +107 -0
- package/skills/git/file-ticket/evals.md +54 -0
- package/skills/git/fix-issue/SKILL.md +106 -0
- package/skills/git/fix-issue/evals.md +71 -0
- package/skills/git/ship/SKILL.md +92 -0
- package/skills/git/ship/evals.md +72 -0
- package/skills/meta/clio-dev/SKILL.md +91 -0
- package/skills/meta/clio-dev/evals.md +45 -0
- package/skills/meta/clio-test/SKILL.md +130 -0
- package/skills/meta/clio-test/evals.md +43 -0
- package/skills/meta/clio-test/references/harness.md +97 -0
- package/skills/meta/clio-test/references/test-map.md +59 -0
- package/skills/meta/credentials/SKILL.md +125 -0
- package/skills/meta/credentials/evals.md +104 -0
- package/skills/meta/find-skills/SKILL.md +72 -0
- package/skills/meta/find-skills/evals.md +47 -0
- package/skills/meta/herdr/SKILL.md +127 -0
- package/skills/meta/herdr/evals.md +38 -0
- package/skills/meta/skill-craft/SKILL.md +102 -0
- package/skills/meta/skill-craft/evals.md +41 -0
- package/skills/planning/architecture/SKILL.md +129 -0
- package/skills/planning/architecture/evals.md +36 -0
- package/skills/planning/backlog/SKILL.md +90 -0
- package/skills/planning/backlog/evals.md +43 -0
- package/skills/planning/prd/SKILL.md +82 -0
- package/skills/planning/prd/evals.md +49 -0
- package/skills/planning/product-intent/SKILL.md +112 -0
- package/skills/planning/product-intent/evals.md +36 -0
- package/skills/planning/tech-spec/SKILL.md +115 -0
- package/skills/planning/tech-spec/evals.md +47 -0
- package/skills/registry.yaml +136 -0
- package/skills/research/arxiv-literature/SKILL.md +104 -0
- package/skills/research/arxiv-literature/evals.md +58 -0
- package/skills/research/experiment-protocol/SKILL.md +122 -0
- package/skills/research/experiment-protocol/evals.md +91 -0
- package/skills/research/scientific-debugging/SKILL.md +119 -0
- package/skills/research/scientific-debugging/evals.md +138 -0
- package/skills/research/scientific-modernization/SKILL.md +138 -0
- package/skills/research/scientific-modernization/evals.md +84 -0
- package/skills/skill-marketplace.json +12 -20
- package/skills/workflow/design-council/SKILL.md +139 -0
- package/skills/workflow/design-council/evals.md +97 -0
- package/skills/workflow/grill-me/SKILL.md +186 -0
- package/skills/workflow/grill-me/evals.md +78 -0
- package/skills/workflow/workflow-distiller/SKILL.md +136 -0
- package/skills/workflow/workflow-distiller/evals.md +107 -0
- package/src/cli/acp.ts +115 -0
- package/src/cli/agents.ts +60 -0
- package/src/cli/args.ts +280 -0
- package/src/cli/argv.ts +170 -0
- package/src/cli/ask.ts +34 -0
- package/src/cli/auth.ts +468 -0
- package/src/cli/bootstrap-generate.ts +498 -0
- package/src/cli/clio.ts +96 -0
- package/src/cli/components.ts +195 -0
- package/src/cli/config-inspect.ts +336 -0
- package/src/cli/config.ts +72 -0
- package/src/cli/configure-interop.ts +67 -0
- package/src/cli/configure-layout.ts +172 -0
- package/src/cli/configure.ts +1525 -0
- package/src/cli/context-clear.ts +76 -0
- package/src/cli/context-index.ts +100 -0
- package/src/cli/context.ts +321 -0
- package/src/cli/default-target.ts +55 -0
- package/src/cli/docs.ts +346 -0
- package/src/cli/doctor.ts +54 -0
- package/src/cli/eval.ts +315 -0
- package/src/cli/evidence.ts +225 -0
- package/src/cli/evolve.ts +219 -0
- package/src/cli/extensions.ts +214 -0
- package/src/cli/fleet.ts +868 -0
- package/src/cli/index.ts +338 -0
- package/src/cli/init.ts +219 -0
- package/src/cli/initial-message.ts +47 -0
- package/src/cli/internal-dispatch.ts +55 -0
- package/src/cli/memory.ts +182 -0
- package/src/cli/models.ts +257 -0
- package/src/cli/modes/json-stream.ts +121 -0
- package/src/cli/modes/jsonl.ts +9 -0
- package/src/cli/modes/print.ts +604 -0
- package/src/cli/oauth-manual-input.ts +72 -0
- package/src/cli/oauth-select.ts +36 -0
- package/src/cli/output-guard.ts +48 -0
- package/src/cli/paths.ts +44 -0
- package/src/cli/provider-target.ts +113 -0
- package/src/cli/removal.ts +72 -0
- package/src/cli/reset.ts +253 -0
- package/src/cli/run.ts +497 -0
- package/src/cli/share.ts +243 -0
- package/src/cli/shared.ts +60 -0
- package/src/cli/skills-eval.ts +1240 -0
- package/src/cli/skills.ts +485 -0
- package/src/cli/steer-channel.ts +86 -0
- package/src/cli/targets.ts +1154 -0
- package/src/cli/text-layout.ts +112 -0
- package/src/cli/trace.ts +322 -0
- package/src/cli/uninstall.ts +405 -0
- package/src/cli/upgrade.ts +286 -0
- package/src/cli/usage.ts +876 -0
- package/src/cli/validate-model.ts +28 -0
- package/src/cli/version.ts +7 -0
- package/src/cli/wiki-generate.ts +510 -0
- package/src/core/agent-environment.ts +7 -0
- package/src/core/artifact-paths.ts +43 -0
- package/src/core/bash-exec.ts +313 -0
- package/src/core/boot-trace.ts +42 -0
- package/src/core/bus-events.ts +744 -0
- package/src/core/bus-trace.ts +53 -0
- package/src/core/c-header-language.ts +265 -0
- package/src/core/clio-repo.ts +78 -0
- package/src/core/commit-attribution.ts +157 -0
- package/src/core/compile-cache.ts +159 -0
- package/src/core/config.ts +1722 -0
- package/src/core/context-floor.ts +33 -0
- package/src/core/defaults.ts +659 -0
- package/src/core/domain-loader.ts +177 -0
- package/src/core/event-bus.ts +94 -0
- package/src/core/file-references.ts +282 -0
- package/src/core/git-commit-attribution.ts +362 -0
- package/src/core/guardrails.ts +185 -0
- package/src/core/headless-permission.ts +21 -0
- package/src/core/incomplete-installation.ts +45 -0
- package/src/core/init.ts +223 -0
- package/src/core/json-payload.ts +58 -0
- package/src/core/package-root.ts +54 -0
- package/src/core/path-canonical.ts +37 -0
- package/src/core/process-identity.ts +41 -0
- package/src/core/recent-models.ts +91 -0
- package/src/core/residency-protection.ts +56 -0
- package/src/core/resolve-config-value.ts +88 -0
- package/src/core/response-schema.ts +279 -0
- package/src/core/run-overrides.ts +77 -0
- package/src/core/safe-exec.ts +205 -0
- package/src/core/safe-id.ts +37 -0
- package/src/core/safe-resource-write.ts +162 -0
- package/src/core/session-routing.ts +339 -0
- package/src/core/settings-layers.ts +354 -0
- package/src/core/shared-bus.ts +8 -0
- package/src/core/shell-quote.ts +26 -0
- package/src/core/skill-activation.ts +190 -0
- package/src/core/startup-timer.ts +37 -0
- package/src/core/state-file-lock.ts +219 -0
- package/src/core/termination.ts +275 -0
- package/src/core/timers.ts +38 -0
- package/src/core/tool-names.ts +65 -0
- package/src/core/verification-scripts.ts +13 -0
- package/src/core/workspace-files.ts +492 -0
- package/src/core/xdg.ts +177 -0
- package/src/domains/agents/builtins/architect.md +4 -4
- package/src/domains/agents/builtins/coder.md +3 -2
- package/src/domains/agents/builtins/debugger.md +1 -1
- package/src/domains/agents/builtins/documenter.md +1 -1
- package/src/domains/agents/builtins/git-master.md +3 -3
- 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 +1 -1
- package/src/domains/agents/builtins/verifier.md +1 -1
- package/src/domains/agents/builtins/wiki-writer.md +1 -1
- package/src/domains/agents/catalog.ts +172 -0
- package/src/domains/agents/contract.ts +16 -0
- package/src/domains/agents/extension.ts +110 -0
- package/src/domains/agents/fleet-commands.ts +154 -0
- package/src/domains/agents/fleet-contract.ts +797 -0
- package/src/domains/agents/frontmatter.ts +40 -0
- package/src/domains/agents/index.ts +102 -0
- package/src/domains/agents/manifest.ts +6 -0
- package/src/domains/agents/recipe-schema.ts +202 -0
- package/src/domains/agents/recipe.ts +125 -0
- package/src/domains/agents/registry.ts +111 -0
- package/src/domains/agents/result-contract.ts +1265 -0
- package/src/domains/agents/spec.ts +371 -0
- package/src/domains/agents/write-boundary.ts +109 -0
- package/src/domains/components/diff.ts +99 -0
- package/src/domains/components/hash.ts +21 -0
- package/src/domains/components/index.ts +3 -0
- package/src/domains/components/scan.ts +304 -0
- package/src/domains/components/snapshot.ts +108 -0
- package/src/domains/components/types.ts +82 -0
- package/src/domains/config/agent-namespace.ts +13 -0
- package/src/domains/config/classify.ts +106 -0
- package/src/domains/config/contract.ts +22 -0
- package/src/domains/config/extension.ts +142 -0
- package/src/domains/config/index.ts +23 -0
- package/src/domains/config/keybindings.ts +200 -0
- package/src/domains/config/manifest.ts +6 -0
- package/src/domains/config/watcher.ts +41 -0
- package/src/domains/context/adoption.ts +880 -0
- package/src/domains/context/bootstrap-prompt.ts +273 -0
- package/src/domains/context/bootstrap.ts +1502 -0
- package/src/domains/context/clear.ts +91 -0
- package/src/domains/context/clio-md.ts +429 -0
- package/src/domains/context/codewiki/artifact.ts +400 -0
- package/src/domains/context/codewiki/build-worker-protocol.ts +24 -0
- package/src/domains/context/codewiki/build-worker.ts +54 -0
- package/src/domains/context/codewiki/cmake.ts +356 -0
- package/src/domains/context/codewiki/cooperative.ts +46 -0
- package/src/domains/context/codewiki/coordinator.ts +182 -0
- package/src/domains/context/codewiki/digest.ts +135 -0
- package/src/domains/context/codewiki/grammar-assets.ts +33 -0
- package/src/domains/context/codewiki/indexer.ts +1529 -0
- package/src/domains/context/codewiki/paths.ts +67 -0
- package/src/domains/context/codewiki/schema.ts +80 -0
- package/src/domains/context/codewiki/tree-sitter.ts +771 -0
- package/src/domains/context/contract.ts +68 -0
- package/src/domains/context/excluded-dirs.ts +1 -0
- package/src/domains/context/extension.ts +358 -0
- package/src/domains/context/fingerprint.ts +198 -0
- package/src/domains/context/index.ts +154 -0
- package/src/domains/context/init-options.ts +69 -0
- package/src/domains/context/manifest.ts +6 -0
- package/src/domains/context/operator-profile.ts +157 -0
- package/src/domains/context/project-metadata.ts +529 -0
- package/src/domains/context/project-rules.ts +227 -0
- package/src/domains/context/prompt-context.ts +61 -0
- package/src/domains/context/refresh.ts +178 -0
- package/src/domains/context/runtime.ts +17 -0
- package/src/domains/context/sibling-files.ts +10 -0
- package/src/domains/context/state.ts +237 -0
- package/src/domains/context/wiki/assemble.ts +303 -0
- package/src/domains/context/wiki/frontmatter.ts +210 -0
- package/src/domains/context/wiki/generate.ts +595 -0
- package/src/domains/context/wiki/layout.ts +111 -0
- package/src/domains/context/wiki/meta.ts +221 -0
- package/src/domains/context/wiki/plan-store.ts +217 -0
- package/src/domains/context/wiki/plan.ts +250 -0
- package/src/domains/context/wiki/prompts.ts +283 -0
- package/src/domains/context/wiki/staleness.ts +198 -0
- package/src/domains/dispatch/active-route-planner.ts +168 -0
- package/src/domains/dispatch/admission-queue.ts +150 -0
- package/src/domains/dispatch/admission.ts +334 -0
- package/src/domains/dispatch/agent-candidates.ts +307 -0
- package/src/domains/dispatch/agent-ledger-hub.ts +71 -0
- package/src/domains/dispatch/agent-ledger-store.ts +257 -0
- package/src/domains/dispatch/agent-ledger.ts +212 -0
- package/src/domains/dispatch/agent-plan-adapter.ts +85 -0
- package/src/domains/dispatch/assignment-events.ts +132 -0
- package/src/domains/dispatch/assignment-reconcile.ts +76 -0
- package/src/domains/dispatch/assignment-store.ts +162 -0
- package/src/domains/dispatch/assignment.ts +278 -0
- package/src/domains/dispatch/backoff.ts +59 -0
- package/src/domains/dispatch/batch-store.ts +134 -0
- package/src/domains/dispatch/batch-tracker.ts +66 -0
- package/src/domains/dispatch/capability-match.ts +155 -0
- package/src/domains/dispatch/capacity-lease.ts +413 -0
- package/src/domains/dispatch/code-step-store.ts +52 -0
- package/src/domains/dispatch/code-step.ts +387 -0
- package/src/domains/dispatch/contract.ts +278 -0
- package/src/domains/dispatch/dedup.ts +133 -0
- package/src/domains/dispatch/event-pump.ts +251 -0
- package/src/domains/dispatch/execution-handoff.ts +29 -0
- package/src/domains/dispatch/execution-plan.ts +328 -0
- package/src/domains/dispatch/execution-role.ts +277 -0
- package/src/domains/dispatch/execution-scheduler.ts +583 -0
- package/src/domains/dispatch/extension.ts +6006 -0
- package/src/domains/dispatch/failure-classification.ts +147 -0
- package/src/domains/dispatch/fleet-commit-attribution.ts +56 -0
- package/src/domains/dispatch/fleet-plan.ts +225 -0
- package/src/domains/dispatch/fleet-preflight.ts +394 -0
- package/src/domains/dispatch/gate-decisions.ts +1040 -0
- package/src/domains/dispatch/gate-role-prompts.ts +58 -0
- package/src/domains/dispatch/heartbeat.ts +27 -0
- package/src/domains/dispatch/index.ts +137 -0
- package/src/domains/dispatch/joint-route-adapter.ts +114 -0
- package/src/domains/dispatch/joint-route-resolver.ts +283 -0
- package/src/domains/dispatch/manifest.ts +6 -0
- package/src/domains/dispatch/orphan-recovery.ts +266 -0
- package/src/domains/dispatch/outcome.ts +109 -0
- package/src/domains/dispatch/phase-timing.ts +47 -0
- package/src/domains/dispatch/placement.ts +202 -0
- package/src/domains/dispatch/receipt-findings.ts +255 -0
- package/src/domains/dispatch/receipt-integrity.ts +383 -0
- package/src/domains/dispatch/recovery-candidates.ts +74 -0
- package/src/domains/dispatch/reproducibility.ts +48 -0
- package/src/domains/dispatch/reservation-store.ts +501 -0
- package/src/domains/dispatch/route-approval.ts +177 -0
- package/src/domains/dispatch/route-candidates.ts +57 -0
- package/src/domains/dispatch/route-decision.ts +1079 -0
- package/src/domains/dispatch/route-facts.ts +187 -0
- package/src/domains/dispatch/route-history.ts +238 -0
- package/src/domains/dispatch/route-observer.ts +488 -0
- package/src/domains/dispatch/route-policy.ts +327 -0
- package/src/domains/dispatch/route-quality.ts +256 -0
- package/src/domains/dispatch/route-readiness.ts +120 -0
- package/src/domains/dispatch/routing-intent.ts +287 -0
- package/src/domains/dispatch/run-identity.ts +56 -0
- package/src/domains/dispatch/scout-transition.ts +130 -0
- package/src/domains/dispatch/state.ts +302 -0
- package/src/domains/dispatch/tool-stats.ts +132 -0
- package/src/domains/dispatch/transport.ts +210 -0
- package/src/domains/dispatch/types.ts +799 -0
- package/src/domains/dispatch/validation-grounding.ts +154 -0
- package/src/domains/dispatch/validation.ts +721 -0
- package/src/domains/dispatch/worker-protocol.ts +275 -0
- package/src/domains/dispatch/worker-spawn.ts +585 -0
- package/src/domains/dispatch/write-boundary-enforcer.ts +97 -0
- package/src/domains/dispatch/write-boundary.ts +426 -0
- package/src/domains/eval/artifacts/redact.ts +42 -0
- package/src/domains/eval/artifacts/store.ts +173 -0
- package/src/domains/eval/compare/compare.ts +33 -0
- package/src/domains/eval/compare/gates.ts +66 -0
- package/src/domains/eval/compare/thresholds.ts +92 -0
- package/src/domains/eval/harness-metrics.ts +62 -0
- package/src/domains/eval/index.ts +66 -0
- package/src/domains/eval/metrics/chaos-stream.ts +93 -0
- package/src/domains/eval/metrics/context.ts +34 -0
- package/src/domains/eval/metrics/coverage.ts +21 -0
- package/src/domains/eval/metrics/evidence.ts +182 -0
- package/src/domains/eval/metrics/fleet-loop-stream.ts +196 -0
- package/src/domains/eval/metrics/invariants.ts +736 -0
- package/src/domains/eval/metrics/latency.ts +4 -0
- package/src/domains/eval/metrics/token-stream.ts +139 -0
- package/src/domains/eval/metrics/tokens.ts +51 -0
- package/src/domains/eval/metrics/tool-calls.ts +7 -0
- package/src/domains/eval/proactive-memory.ts +279 -0
- package/src/domains/eval/provenance.ts +35 -0
- package/src/domains/eval/report.ts +234 -0
- package/src/domains/eval/reports/json.ts +5 -0
- package/src/domains/eval/reports/junit.ts +23 -0
- package/src/domains/eval/reports/markdown.ts +20 -0
- package/src/domains/eval/reports/swe-jsonl.ts +16 -0
- package/src/domains/eval/reports/text.ts +25 -0
- package/src/domains/eval/run-compare.ts +274 -0
- package/src/domains/eval/runner.ts +244 -0
- package/src/domains/eval/runners/clio-run.ts +148 -0
- package/src/domains/eval/runners/context-index.ts +56 -0
- package/src/domains/eval/runners/context-init.ts +203 -0
- package/src/domains/eval/runners/external-command.ts +350 -0
- package/src/domains/eval/runtime-paths.ts +171 -0
- package/src/domains/eval/schema/artifact.ts +75 -0
- package/src/domains/eval/schema/suite.ts +235 -0
- package/src/domains/eval/schema/validate.ts +339 -0
- package/src/domains/eval/store.ts +392 -0
- package/src/domains/eval/suites/load.ts +74 -0
- package/src/domains/eval/suites/matrix.ts +19 -0
- package/src/domains/eval/suites/resolve.ts +44 -0
- package/src/domains/eval/suites/run.ts +325 -0
- package/src/domains/eval/task-file.ts +186 -0
- package/src/domains/eval/types.ts +140 -0
- package/src/domains/eval/verifiers/command.ts +27 -0
- package/src/domains/eval/verifiers/file-exists.ts +6 -0
- package/src/domains/eval/verifiers/patch.ts +22 -0
- package/src/domains/eval/workspaces/git.ts +41 -0
- package/src/domains/eval/workspaces/local.ts +17 -0
- package/src/domains/eval/workspaces/temp-copy.ts +29 -0
- package/src/domains/evidence/build.ts +1754 -0
- package/src/domains/evidence/eval.ts +605 -0
- package/src/domains/evidence/failure-attribution.ts +54 -0
- package/src/domains/evidence/finish-contract-map.ts +42 -0
- package/src/domains/evidence/index.ts +55 -0
- package/src/domains/evidence/provenance.ts +200 -0
- package/src/domains/evidence/redact.ts +81 -0
- package/src/domains/evidence/store.ts +291 -0
- package/src/domains/evidence/types.ts +325 -0
- package/src/domains/evolution/SELF_EDIT_GATE.md +91 -0
- package/src/domains/evolution/index.ts +26 -0
- package/src/domains/evolution/manifest.ts +154 -0
- package/src/domains/evolution/validate.ts +304 -0
- package/src/domains/extensions/contract.ts +22 -0
- package/src/domains/extensions/discovery.ts +193 -0
- package/src/domains/extensions/extension.ts +46 -0
- package/src/domains/extensions/index.ts +34 -0
- package/src/domains/extensions/manager.ts +30 -0
- package/src/domains/extensions/manifest.ts +6 -0
- package/src/domains/extensions/resources.ts +38 -0
- package/src/domains/extensions/state.ts +224 -0
- package/src/domains/extensions/types.ts +83 -0
- package/src/domains/interop/consent.ts +185 -0
- package/src/domains/interop/contract.ts +29 -0
- package/src/domains/interop/detect.ts +173 -0
- package/src/domains/interop/extension.ts +59 -0
- package/src/domains/interop/index.ts +34 -0
- package/src/domains/interop/manifest.ts +6 -0
- package/src/domains/interop/registry.ts +139 -0
- package/src/domains/interop/state.ts +92 -0
- package/src/domains/interop/types.ts +109 -0
- package/src/domains/lifecycle/contract.ts +11 -0
- package/src/domains/lifecycle/doctor.ts +536 -0
- package/src/domains/lifecycle/extension.ts +23 -0
- package/src/domains/lifecycle/index.ts +21 -0
- package/src/domains/lifecycle/install-method.ts +51 -0
- package/src/domains/lifecycle/manifest.ts +6 -0
- package/src/domains/lifecycle/migrations/2026-08-18-lmstudio-runtime-id.ts +52 -0
- package/src/domains/lifecycle/migrations/index.ts +114 -0
- package/src/domains/lifecycle/state.ts +93 -0
- package/src/domains/lifecycle/upgrade-notice.ts +35 -0
- package/src/domains/lifecycle/version.ts +35 -0
- package/src/domains/memory/index.ts +128 -0
- package/src/domains/memory/operations.ts +143 -0
- package/src/domains/memory/prompt-section.ts +86 -0
- package/src/domains/memory/proposal.ts +180 -0
- package/src/domains/memory/store.ts +163 -0
- package/src/domains/memory/task-bank.ts +229 -0
- package/src/domains/memory/task-memory-handoff.ts +222 -0
- package/src/domains/memory/task-memory-policy.ts +602 -0
- package/src/domains/memory/task-memory-status.ts +58 -0
- package/src/domains/memory/task-memory-telemetry.ts +346 -0
- package/src/domains/memory/task-memory-trace.ts +89 -0
- package/src/domains/memory/types.ts +74 -0
- package/src/domains/memory/validate.ts +297 -0
- package/src/domains/middleware/budget.ts +216 -0
- package/src/domains/middleware/contract.ts +35 -0
- package/src/domains/middleware/dispatch-nudge.ts +469 -0
- package/src/domains/middleware/extension.ts +129 -0
- package/src/domains/middleware/hook-receipts.ts +70 -0
- package/src/domains/middleware/hooks-io.ts +186 -0
- package/src/domains/middleware/hooks.ts +432 -0
- package/src/domains/middleware/index.ts +154 -0
- package/src/domains/middleware/manifest.ts +6 -0
- package/src/domains/middleware/memory-intervention.ts +701 -0
- package/src/domains/middleware/rules.ts +42 -0
- package/src/domains/middleware/runtime.ts +333 -0
- package/src/domains/middleware/skills-reminder.ts +202 -0
- package/src/domains/middleware/snapshot.ts +71 -0
- package/src/domains/middleware/stalled-turn.ts +71 -0
- package/src/domains/middleware/task-board-reminder.ts +87 -0
- package/src/domains/middleware/task-nudge.ts +77 -0
- package/src/domains/middleware/tool-choice-control.ts +42 -0
- package/src/domains/middleware/types.ts +131 -0
- package/src/domains/middleware/validate.ts +329 -0
- package/src/domains/observability/accountability.ts +67 -0
- package/src/domains/observability/contract.ts +168 -0
- package/src/domains/observability/cost.ts +206 -0
- package/src/domains/observability/evidence-index.ts +123 -0
- package/src/domains/observability/extension.ts +281 -0
- package/src/domains/observability/index.ts +78 -0
- package/src/domains/observability/manifest.ts +10 -0
- package/src/domains/observability/metrics.ts +37 -0
- package/src/domains/observability/projection.ts +477 -0
- package/src/domains/observability/telemetry.ts +89 -0
- package/src/domains/observability/trace-store.ts +1454 -0
- package/src/domains/prompts/compiler.ts +614 -0
- package/src/domains/prompts/contract.ts +46 -0
- package/src/domains/prompts/extension.ts +336 -0
- package/src/domains/prompts/fragment-loader.ts +138 -0
- package/src/domains/prompts/fragments/identity/clio.md +5 -6
- package/src/domains/prompts/fragments/identity/docs-routing.md +10 -0
- package/src/domains/prompts/fragments/identity/self-awareness.md +19 -0
- package/src/domains/prompts/fragments/operating/contract.md +4 -41
- package/src/domains/prompts/fragments/operating/delegation.md +42 -0
- package/src/domains/prompts/fragments/operating/skills.md +26 -0
- package/src/domains/prompts/fragments/operating/worker.md +16 -0
- package/src/domains/prompts/fragments/safety/auto-edit.md +5 -5
- package/src/domains/prompts/fragments/safety/full-auto.md +3 -3
- package/src/domains/prompts/fragments/safety/read-only.md +4 -4
- package/src/domains/prompts/fragments/safety/suggest.md +2 -2
- package/src/domains/prompts/fragments/wiki/page.md +10 -0
- package/src/domains/prompts/fragments/wiki/plan.md +10 -0
- package/src/domains/prompts/hash.ts +73 -0
- package/src/domains/prompts/index.ts +32 -0
- package/src/domains/prompts/manifest.ts +8 -0
- package/src/domains/prompts/memory-intervention.ts +57 -0
- package/src/domains/prompts/preload.ts +82 -0
- package/src/domains/providers/auth/api-key.ts +47 -0
- package/src/domains/providers/auth/backend-file.ts +79 -0
- package/src/domains/providers/auth/backend-memory.ts +72 -0
- package/src/domains/providers/auth/boot-status.ts +65 -0
- package/src/domains/providers/auth/index.ts +37 -0
- package/src/domains/providers/auth/oauth.ts +37 -0
- package/src/domains/providers/auth/storage.ts +726 -0
- package/src/domains/providers/capabilities.ts +58 -0
- package/src/domains/providers/catalog.ts +162 -0
- package/src/domains/providers/contract.ts +162 -0
- package/src/domains/providers/credentials.ts +20 -0
- package/src/domains/providers/eligibility.ts +24 -0
- package/src/domains/providers/errors.ts +64 -0
- package/src/domains/providers/extension.ts +548 -0
- package/src/domains/providers/index.ts +142 -0
- package/src/domains/providers/knowledge-base-path.ts +102 -0
- package/src/domains/providers/manifest.ts +6 -0
- package/src/domains/providers/model-capabilities.ts +136 -0
- package/src/domains/providers/model-discovery.ts +144 -0
- package/src/domains/providers/model-family.ts +32 -0
- package/src/domains/providers/model-runtime-capabilities.ts +723 -0
- package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +120 -37
- package/src/domains/providers/plugins.ts +61 -0
- package/src/domains/providers/probe/fingerprint.ts +64 -0
- package/src/domains/providers/probe/http.ts +114 -0
- package/src/domains/providers/probe/reasoning.ts +111 -0
- package/src/domains/providers/registry.ts +187 -0
- package/src/domains/providers/resolver.ts +156 -0
- package/src/domains/providers/runtime-resolution.ts +720 -0
- package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +90 -0
- package/src/domains/providers/runtimes/boot-manifest.ts +55 -0
- package/src/domains/providers/runtimes/builtins.ts +78 -0
- package/src/domains/providers/runtimes/claude/claude-code.ts +38 -0
- package/src/domains/providers/runtimes/claude/claude-sdk.ts +38 -0
- package/src/domains/providers/runtimes/claude/common.ts +55 -0
- package/src/domains/providers/runtimes/cloud/alcf.ts +171 -0
- package/src/domains/providers/runtimes/cloud/anthropic-max.ts +71 -0
- package/src/domains/providers/runtimes/cloud/anthropic.ts +43 -0
- package/src/domains/providers/runtimes/cloud/bedrock.ts +35 -0
- package/src/domains/providers/runtimes/cloud/deepseek.ts +50 -0
- package/src/domains/providers/runtimes/cloud/google.ts +41 -0
- package/src/domains/providers/runtimes/cloud/groq.ts +46 -0
- package/src/domains/providers/runtimes/cloud/mistral.ts +46 -0
- package/src/domains/providers/runtimes/cloud/openai-codex.ts +49 -0
- package/src/domains/providers/runtimes/cloud/openai.ts +46 -0
- package/src/domains/providers/runtimes/cloud/openrouter.ts +111 -0
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +423 -0
- package/src/domains/providers/runtimes/common/local-synth.ts +164 -0
- package/src/domains/providers/runtimes/common/probe-helpers.ts +474 -0
- package/src/domains/providers/runtimes/local-native/lemonade-anthropic.ts +27 -0
- package/src/domains/providers/runtimes/local-native/lemonade-openai.ts +26 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +88 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +207 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +180 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +126 -0
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +98 -0
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +241 -0
- package/src/domains/providers/runtimes/local-native/ollama-native.ts +117 -0
- package/src/domains/providers/runtimes/local-native/sglang.ts +26 -0
- package/src/domains/providers/runtimes/local-native/vllm.ts +27 -0
- package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +104 -0
- package/src/domains/providers/runtimes/protocol/anthropic-messages.ts +28 -0
- package/src/domains/providers/runtimes/protocol/bedrock.ts +26 -0
- package/src/domains/providers/runtimes/protocol/google.ts +27 -0
- package/src/domains/providers/runtimes/protocol/openai-compat.ts +145 -0
- package/src/domains/providers/support.ts +241 -0
- package/src/domains/providers/thinking-control-policy.ts +85 -0
- package/src/domains/providers/types/capability-flags.ts +114 -0
- package/src/domains/providers/types/cost-provenance.ts +7 -0
- package/src/domains/providers/types/inference.ts +41 -0
- package/src/domains/providers/types/knowledge-base.ts +156 -0
- package/src/domains/providers/types/local-model-quirks.ts +216 -0
- package/src/domains/providers/types/runtime-descriptor.ts +181 -0
- package/src/domains/providers/types/target-descriptor.ts +60 -0
- package/src/domains/resources/collision.ts +92 -0
- package/src/domains/resources/common-loader.ts +140 -0
- package/src/domains/resources/contract.ts +24 -0
- package/src/domains/resources/extension.ts +59 -0
- package/src/domains/resources/index.ts +74 -0
- package/src/domains/resources/loader.ts +85 -0
- package/src/domains/resources/manifest.ts +6 -0
- package/src/domains/resources/prompts/loader.ts +246 -0
- package/src/domains/resources/prompts/substitute.ts +1 -0
- package/src/domains/resources/skills/content-hash.ts +107 -0
- package/src/domains/resources/skills/evals.ts +175 -0
- package/src/domains/resources/skills/install.ts +427 -0
- package/src/domains/resources/skills/loader.ts +985 -0
- package/src/domains/resources/skills/marketplace.ts +301 -0
- package/src/domains/resources/skills/provenance-pin.ts +115 -0
- package/src/domains/safety/action-classifier.ts +270 -0
- package/src/domains/safety/approval-axis.ts +23 -0
- package/src/domains/safety/audit.ts +493 -0
- package/src/domains/safety/autonomy.ts +174 -0
- package/src/domains/safety/call-target.ts +59 -0
- package/src/domains/safety/contract.ts +65 -0
- package/src/domains/safety/damage-control.ts +44 -0
- package/src/domains/safety/default-path-policy.ts +117 -0
- package/src/domains/safety/extension.ts +383 -0
- package/src/domains/safety/finish-contract-registration.ts +128 -0
- package/src/domains/safety/finish-contract.ts +554 -0
- package/src/domains/safety/index.ts +44 -0
- package/src/domains/safety/loop-detector.ts +143 -0
- package/src/domains/safety/manifest.ts +6 -0
- package/src/domains/safety/path-policy.ts +164 -0
- package/src/domains/safety/policy-engine.ts +994 -0
- package/src/domains/safety/project-policy.ts +391 -0
- package/src/domains/safety/protected-artifacts-registration.ts +189 -0
- package/src/domains/safety/protected-artifacts.ts +993 -0
- package/src/domains/safety/rejection-feedback.ts +102 -0
- package/src/domains/safety/rigor.ts +72 -0
- package/src/domains/safety/rule-compiler.ts +48 -0
- package/src/domains/safety/rule-pack-loader.ts +92 -0
- package/src/domains/safety/run-effects.ts +197 -0
- package/src/domains/safety/scope.ts +61 -0
- package/src/domains/scheduling/budget.ts +35 -0
- package/src/domains/scheduling/cluster.ts +175 -0
- package/src/domains/scheduling/contract.ts +30 -0
- package/src/domains/scheduling/extension.ts +91 -0
- package/src/domains/scheduling/index.ts +12 -0
- package/src/domains/scheduling/manifest.ts +6 -0
- package/src/domains/session/archive-readers.ts +208 -0
- package/src/domains/session/checkpoint.ts +38 -0
- package/src/domains/session/compaction/auto.ts +89 -0
- package/src/domains/session/compaction/branch-summary.ts +187 -0
- package/src/domains/session/compaction/compact.ts +493 -0
- package/src/domains/session/compaction/cut-point.ts +172 -0
- package/src/domains/session/compaction/defaults.ts +34 -0
- package/src/domains/session/compaction/mask-observations.ts +265 -0
- package/src/domains/session/compaction/session-entries.ts +18 -0
- package/src/domains/session/compaction/tokens.ts +148 -0
- package/src/domains/session/context-accounting.ts +583 -0
- package/src/domains/session/context-ledger.ts +362 -0
- package/src/domains/session/contract.ts +159 -0
- package/src/domains/session/cwd-fallback.ts +65 -0
- package/src/domains/session/decision-board.ts +190 -0
- package/src/domains/session/entries.ts +572 -0
- package/src/domains/session/extension.ts +403 -0
- package/src/domains/session/history.ts +172 -0
- package/src/domains/session/index.ts +84 -0
- package/src/domains/session/manager.ts +128 -0
- package/src/domains/session/manifest.ts +6 -0
- package/src/domains/session/migrations/index.ts +27 -0
- package/src/domains/session/prompt-manifest.ts +173 -0
- package/src/domains/session/protected-artifact-journal.ts +241 -0
- package/src/domains/session/protected-artifacts.ts +90 -0
- package/src/domains/session/retry.ts +230 -0
- package/src/domains/session/session-artifacts.ts +107 -0
- package/src/domains/session/task-board.ts +569 -0
- package/src/domains/session/tree/active-path.ts +137 -0
- package/src/domains/session/tree/fork.ts +159 -0
- package/src/domains/session/tree/manager.ts +128 -0
- package/src/domains/session/tree/navigator.ts +177 -0
- package/src/domains/session/tree/preview.ts +259 -0
- package/src/domains/session/usage.ts +148 -0
- package/src/domains/session/workspace/git-probe.ts +167 -0
- package/src/domains/session/workspace/index.ts +4 -0
- package/src/domains/session/workspace/project-type.ts +217 -0
- package/src/domains/session/workspace/snapshot.ts +74 -0
- package/src/domains/share/archive.ts +684 -0
- package/src/domains/share/contract.ts +9 -0
- package/src/domains/share/extension.ts +26 -0
- package/src/domains/share/index.ts +28 -0
- package/src/domains/share/manifest.ts +6 -0
- package/src/domains/user-tasks/store.ts +297 -0
- package/src/engine/acp/adapter.ts +397 -0
- package/src/engine/acp/errors.ts +128 -0
- package/src/engine/acp/event-mapper.ts +154 -0
- package/src/engine/acp/server.ts +2238 -0
- package/src/engine/acp/tool-mediator.ts +686 -0
- package/src/engine/acp/transport.ts +775 -0
- package/src/engine/acp/types.ts +196 -0
- package/src/engine/agent.ts +29 -0
- package/src/engine/ai.ts +207 -0
- package/src/engine/alcf-oauth.ts +205 -0
- package/src/engine/antigravity/subprocess-runtime.ts +205 -0
- package/src/engine/api-registry.ts +223 -0
- package/src/engine/apis/degraded-inference.ts +95 -0
- package/src/engine/apis/index.ts +16 -0
- package/src/engine/apis/llamacpp-residency.ts +292 -0
- package/src/engine/apis/lmstudio-residency.ts +76 -0
- package/src/engine/apis/lmstudio.ts +243 -0
- package/src/engine/apis/ollama-native.ts +528 -0
- package/src/engine/apis/openai-completions.ts +795 -0
- package/src/engine/apis/output-budget.ts +99 -0
- package/src/engine/apis/residency-lock.ts +29 -0
- package/src/engine/apis/residency.ts +776 -0
- package/src/engine/apis/resident-models.ts +42 -0
- package/src/engine/apis/sampling-overrides.ts +38 -0
- package/src/engine/apis/types.ts +16 -0
- package/src/engine/claude/sdk-runtime.ts +685 -0
- package/src/engine/claude/session-id.ts +5 -0
- package/src/engine/claude/subprocess-runtime.ts +316 -0
- package/src/engine/claude/tool-safety.ts +400 -0
- package/src/engine/env-api-keys.ts +98 -0
- package/src/engine/external-subprocess.ts +23 -0
- package/src/engine/gemma-channel-filter.ts +223 -0
- package/src/engine/harmony-response.ts +165 -0
- package/src/engine/instrumented-tui.ts +192 -0
- package/src/engine/loop-guard.ts +1127 -0
- package/src/engine/messages.ts +14 -0
- package/src/engine/models.ts +42 -0
- package/src/engine/oauth.ts +196 -0
- package/src/engine/pi-mono-names.ts +13 -0
- package/src/engine/prompt-templates.ts +1 -0
- package/src/engine/provider-payload.ts +272 -0
- package/src/engine/select-list.ts +53 -0
- package/src/engine/session.ts +834 -0
- package/src/engine/strip-tokenizer-sentinels.ts +125 -0
- package/src/engine/truncate.ts +9 -0
- package/src/engine/tui.ts +111 -0
- package/src/engine/types.ts +63 -0
- package/src/engine/worker-events.ts +100 -0
- package/src/engine/worker-runtime-capabilities.ts +5 -0
- package/src/engine/worker-runtime.ts +1022 -0
- package/src/engine/worker-tools.ts +208 -0
- package/src/entry/boot-options.ts +50 -0
- package/src/entry/orchestrator.ts +2011 -0
- package/src/interactive/application-controller.ts +433 -0
- package/src/interactive/bus-notices.ts +265 -0
- package/src/interactive/chat-loop-messages.ts +626 -0
- package/src/interactive/chat-loop-policy.ts +18 -0
- package/src/interactive/chat-loop.ts +1090 -0
- package/src/interactive/chat-panel.ts +1820 -0
- package/src/interactive/chat-renderer.ts +1228 -0
- package/src/interactive/clio-editor.ts +161 -0
- package/src/interactive/command-fallbacks.ts +23 -0
- package/src/interactive/command-output.ts +85 -0
- package/src/interactive/context-activity.ts +203 -0
- package/src/interactive/context-meter.ts +223 -0
- package/src/interactive/context-overlay.ts +246 -0
- package/src/interactive/cost-overlay.ts +279 -0
- package/src/interactive/dispatch-board.ts +1319 -0
- package/src/interactive/dispatch-steering.ts +86 -0
- package/src/interactive/editor-bash.ts +46 -0
- package/src/interactive/editor-steer.ts +51 -0
- package/src/interactive/editor-submit.ts +507 -0
- package/src/interactive/export-html/ansi-to-html.ts +161 -0
- package/src/interactive/export-html/index.ts +51 -0
- package/src/interactive/export-html/template.ts +45 -0
- package/src/interactive/export-html/tool-renderer.ts +54 -0
- package/src/interactive/external-editor.ts +67 -0
- package/src/interactive/follow-up-queue-panel.ts +75 -0
- package/src/interactive/footer/dashboard.ts +538 -0
- package/src/interactive/footer/notifications.ts +275 -0
- package/src/interactive/footer/widgets.ts +1264 -0
- package/src/interactive/footer-panel.ts +187 -0
- package/src/interactive/format-time.ts +97 -0
- package/src/interactive/index.ts +11 -0
- package/src/interactive/interactive-application.ts +939 -0
- package/src/interactive/interactive-event-projection.ts +385 -0
- package/src/interactive/interactive-input-runtime.ts +307 -0
- package/src/interactive/interactive-presentation.ts +584 -0
- package/src/interactive/interactive-shell.ts +388 -0
- package/src/interactive/interactive-slash-runtime.ts +554 -0
- package/src/interactive/interactive-subscriptions.ts +111 -0
- package/src/interactive/interactive-tickers.ts +183 -0
- package/src/interactive/keybinding-manager.ts +496 -0
- package/src/interactive/layout.ts +57 -0
- package/src/interactive/leader-key.ts +143 -0
- package/src/interactive/loop-guard-interrupt.ts +101 -0
- package/src/interactive/memory-overlay.ts +280 -0
- package/src/interactive/overlay-ask-user-lifecycle.ts +110 -0
- package/src/interactive/overlay-auth-lifecycle.ts +308 -0
- package/src/interactive/overlay-frame.ts +502 -0
- package/src/interactive/overlay-general-openers.ts +274 -0
- package/src/interactive/overlay-key-routing.ts +216 -0
- package/src/interactive/overlay-lifecycle.ts +426 -0
- package/src/interactive/overlay-model-selectors.ts +127 -0
- package/src/interactive/overlay-permission-lifecycle.ts +345 -0
- package/src/interactive/overlay-resource-openers.ts +112 -0
- package/src/interactive/overlay-session-lifecycle.ts +327 -0
- package/src/interactive/overlay-transitions.ts +57 -0
- package/src/interactive/overlays/agents.ts +69 -0
- package/src/interactive/overlays/ask-user.ts +921 -0
- package/src/interactive/overlays/auth-dialog.ts +221 -0
- package/src/interactive/overlays/context-reset.ts +108 -0
- package/src/interactive/overlays/cwd-fallback.ts +141 -0
- package/src/interactive/overlays/decisions.ts +300 -0
- package/src/interactive/overlays/extensions.ts +54 -0
- package/src/interactive/overlays/help-reference.ts +145 -0
- package/src/interactive/overlays/interop.ts +139 -0
- package/src/interactive/overlays/keybinding-detail.ts +90 -0
- package/src/interactive/overlays/list-overlay.ts +606 -0
- package/src/interactive/overlays/message-picker.ts +155 -0
- package/src/interactive/overlays/model-selector.ts +1109 -0
- package/src/interactive/overlays/prompts.ts +72 -0
- package/src/interactive/overlays/session-selector-search.ts +31 -0
- package/src/interactive/overlays/session-selector.ts +284 -0
- package/src/interactive/overlays/settings.ts +3451 -0
- package/src/interactive/overlays/skills-hub.ts +237 -0
- package/src/interactive/overlays/tree-selector.ts +422 -0
- package/src/interactive/permission-overlay.ts +170 -0
- package/src/interactive/render-trace.ts +534 -0
- package/src/interactive/renderers/branch-summary.ts +86 -0
- package/src/interactive/renderers/code-ink.ts +420 -0
- package/src/interactive/renderers/compaction-summary.ts +112 -0
- package/src/interactive/renderers/diff.ts +137 -0
- package/src/interactive/renderers/mermaid.ts +53 -0
- package/src/interactive/renderers/notice.ts +28 -0
- package/src/interactive/renderers/retry-status.ts +31 -0
- package/src/interactive/renderers/structured.ts +89 -0
- package/src/interactive/renderers/tool-execution.ts +1357 -0
- package/src/interactive/renderers/worker-entry.ts +280 -0
- package/src/interactive/session-last-turn.ts +186 -0
- package/src/interactive/session-switch-settlement.ts +10 -0
- package/src/interactive/session-transcript.ts +105 -0
- package/src/interactive/session-usage-reseed.ts +74 -0
- package/src/interactive/slash-autocomplete.ts +256 -0
- package/src/interactive/slash-commands.ts +1407 -0
- package/src/interactive/slash-spec.ts +424 -0
- package/src/interactive/status/controller.ts +260 -0
- package/src/interactive/status/index.ts +23 -0
- package/src/interactive/status/state-machine.ts +530 -0
- package/src/interactive/status/summary.ts +170 -0
- package/src/interactive/status/types.ts +121 -0
- package/src/interactive/status/verbs.ts +163 -0
- package/src/interactive/status/watchdog.ts +24 -0
- package/src/interactive/stdout-backpressure.ts +99 -0
- package/src/interactive/stream-pacer.ts +530 -0
- package/src/interactive/stream-pacing-policy.ts +66 -0
- package/src/interactive/tasks-overlay.ts +540 -0
- package/src/interactive/terminal-lease.ts +485 -0
- package/src/interactive/theme/components.ts +55 -0
- package/src/interactive/theme/glyphs.ts +70 -0
- package/src/interactive/theme/index.ts +15 -0
- package/src/interactive/theme/labels.ts +88 -0
- package/src/interactive/theme/rules.ts +138 -0
- package/src/interactive/theme/segments.ts +88 -0
- package/src/interactive/theme/tokens.ts +121 -0
- package/src/interactive/thinking-level-policy.ts +6 -0
- package/src/interactive/tool-prose-loop.ts +122 -0
- package/src/interactive/tool-prose-registration.ts +48 -0
- package/src/interactive/turn-context.ts +855 -0
- package/src/interactive/turn-middleware.ts +283 -0
- package/src/interactive/turn-persistence.ts +458 -0
- package/src/interactive/turn-queues.ts +181 -0
- package/src/interactive/turn-recovery.ts +323 -0
- package/src/interactive/turn-runtime.ts +869 -0
- package/src/interactive/turn-state.ts +133 -0
- package/src/interactive/view/artifacts.ts +1452 -0
- package/src/interactive/view/view-overlay.ts +735 -0
- package/src/interactive/welcome-dashboard.ts +537 -0
- package/src/interactive/worker-receipts.ts +143 -0
- package/src/interactive/worker-replay.ts +111 -0
- package/src/interactive/worker-share.ts +100 -0
- package/src/interactive/worker-stream.ts +446 -0
- package/src/interactive/workspace-facts.ts +141 -0
- package/src/tools/agent-tools.ts +402 -0
- package/src/tools/artifact.ts +103 -0
- package/src/tools/ask-user.ts +666 -0
- package/src/tools/bash.ts +204 -0
- package/src/tools/bootstrap.ts +77 -0
- package/src/tools/builtin-tool-catalog.ts +265 -0
- package/src/tools/codewiki/code-nav-surface.ts +29 -0
- package/src/tools/codewiki/code-nav.ts +549 -0
- package/src/tools/codewiki/shared.ts +118 -0
- package/src/tools/compete-worktrees.ts +898 -0
- package/src/tools/context/docs-engine.ts +630 -0
- package/src/tools/context/index.ts +514 -0
- package/src/tools/context/surface.ts +19 -0
- package/src/tools/core-bootstrap.ts +168 -0
- package/src/tools/credential-present.ts +151 -0
- package/src/tools/dispatch-admission.ts +533 -0
- package/src/tools/dispatch-arguments.ts +228 -0
- package/src/tools/dispatch-background.ts +54 -0
- package/src/tools/dispatch-event-text.ts +6 -0
- package/src/tools/dispatch-plan.ts +746 -0
- package/src/tools/dispatch-run-events.ts +238 -0
- package/src/tools/dispatch-runner.ts +2370 -0
- package/src/tools/dispatch-scout-admission.ts +295 -0
- package/src/tools/dispatch-scout.ts +461 -0
- package/src/tools/dispatch-types.ts +77 -0
- package/src/tools/dispatch.ts +244 -0
- package/src/tools/edit-diff.ts +534 -0
- package/src/tools/edit.ts +128 -0
- package/src/tools/executables.ts +22 -0
- package/src/tools/file-mutation-queue.ts +35 -0
- package/src/tools/find.ts +294 -0
- package/src/tools/grep.ts +495 -0
- package/src/tools/ignore-policy.ts +169 -0
- package/src/tools/lazy-tool.ts +60 -0
- package/src/tools/ledger.ts +206 -0
- package/src/tools/ls.ts +110 -0
- package/src/tools/monitor-surface.ts +36 -0
- package/src/tools/monitor.ts +767 -0
- package/src/tools/network-policy.ts +29 -0
- package/src/tools/observation.ts +421 -0
- package/src/tools/observers.ts +99 -0
- package/src/tools/path-utils.ts +79 -0
- package/src/tools/policy.ts +154 -0
- package/src/tools/profiles.ts +108 -0
- package/src/tools/read.ts +173 -0
- package/src/tools/registry.ts +1169 -0
- package/src/tools/result-shaping.ts +204 -0
- package/src/tools/safe-exec.ts +128 -0
- package/src/tools/spawn-hygiene.ts +182 -0
- package/src/tools/steer-surface.ts +17 -0
- package/src/tools/steer.ts +77 -0
- package/src/tools/tasks.ts +265 -0
- package/src/tools/truncate-utf8.ts +17 -0
- package/src/tools/truncate.ts +43 -0
- package/src/tools/verify/frontend.ts +687 -0
- package/src/tools/verify/index.ts +31 -0
- package/src/tools/verify/scripts.ts +108 -0
- package/src/tools/verify/surface.ts +46 -0
- package/src/tools/web-fetch-surface.ts +23 -0
- package/src/tools/web-fetch.ts +759 -0
- package/src/tools/worker-evidence.ts +215 -0
- package/src/tools/write.ts +57 -0
- package/src/utils/exif-orientation.ts +192 -0
- package/src/utils/git.ts +24 -0
- package/src/utils/image-resize.ts +148 -0
- package/src/utils/photon.ts +103 -0
- package/src/worker/control-lane.ts +22 -0
- package/src/worker/entry.ts +294 -0
- package/src/worker/event-projection.ts +56 -0
- package/src/worker/heartbeat.ts +24 -0
- package/src/worker/ledger-mirror.ts +95 -0
- package/src/worker/ndjson.ts +40 -0
- package/src/worker/protocol.ts +529 -0
- package/src/worker/resource-facts.ts +79 -0
- package/src/worker/runtime-registry.ts +12 -0
- package/src/worker/spec-contract.ts +675 -0
- package/src/worker/stdin-demux.ts +316 -0
- package/dist/acp-UMLFVA3F.js +0 -92
- package/dist/chunk-262G75JS.js +0 -35
- package/dist/chunk-6CWDTGUC.js +0 -20
- package/dist/chunk-BYEU76JP.js +0 -899
- package/dist/chunk-GNGDQYDU.js +0 -34688
- package/dist/chunk-GOTUR54M.js +0 -9
- package/dist/chunk-NI4DEJMC.js +0 -88
- package/dist/chunk-TPOCL34A.js +0 -2876
- package/dist/chunk-UU3R62TT.js +0 -128
- package/dist/clio-KIQ5SNDS.js +0 -53
- package/dist/configure-G4E3A2PG.js +0 -27
- package/dist/doctor-M5HJJZOL.js +0 -61
- package/dist/domains/agents/builtins/architect.md +0 -33
- package/dist/domains/agents/builtins/coder.md +0 -31
- package/dist/domains/agents/builtins/context-bootstrap.md +0 -38
- package/dist/domains/agents/builtins/debugger.md +0 -30
- package/dist/domains/agents/builtins/documenter.md +0 -31
- package/dist/domains/agents/builtins/git-master.md +0 -30
- package/dist/domains/agents/builtins/provenance.md +0 -30
- package/dist/domains/agents/builtins/researcher.md +0 -71
- package/dist/domains/agents/builtins/scout.md +0 -42
- package/dist/domains/agents/builtins/tester.md +0 -31
- package/dist/domains/agents/builtins/verifier.md +0 -30
- package/dist/domains/agents/builtins/wiki-writer.md +0 -41
- package/dist/fleet-preflight-CLIAX7YR.js +0 -21
- package/dist/preload-KZVHET2B.js +0 -11
- package/dist/version-ROZ6CZKH.js +0 -16
- package/docs/html/agents_blueprint.html +0 -936
- package/docs/html/alcf_blueprint.html +0 -324
- package/docs/html/architecture_blueprint.html +0 -850
- package/docs/html/commands_blueprint.html +0 -794
- package/docs/html/config_knobs_audit_blueprint.html +0 -178
- package/docs/html/configuration_blueprint.html +0 -1080
- package/docs/html/context_blueprint.html +0 -603
- package/docs/html/documentation_blueprint.html +0 -832
- package/docs/html/environment_blueprint.html +0 -404
- package/docs/html/eval_blueprint.html +0 -743
- package/docs/html/evals_internal_blueprint.html +0 -190
- package/docs/html/evolution_blueprint.html +0 -674
- package/docs/html/extensions_blueprint.html +0 -2065
- package/docs/html/fleet_dispatch_blueprint.html +0 -286
- package/docs/html/index.html +0 -919
- package/docs/html/lifecycle_blueprint.html +0 -723
- package/docs/html/memory_blueprint.html +0 -699
- package/docs/html/middleware_blueprint.html +0 -664
- package/docs/html/models_blueprint.html +0 -2366
- package/docs/html/observability_blueprint.html +0 -683
- package/docs/html/provider_adapter_blueprint.html +0 -245
- package/docs/html/safety_blueprint.html +0 -1386
- package/docs/html/shared.css +0 -571
- package/docs/html/shared.js +0 -143
- package/docs/html/skills_blueprint.html +0 -671
- package/docs/html/soak_blueprint.html +0 -182
- package/docs/html/tool_usage_blueprint.html +0 -350
- package/docs/html/tools_blueprint.html +0 -2249
- package/docs/html/trace_blueprint.html +0 -235
- package/docs/html/tui_design_blueprint.html +0 -314
- package/docs/html/validation_blueprint.html +0 -961
- package/docs/html/worker_dispatch_blueprint.html +0 -231
- package/skills/git/commit-crafting/SKILL.md +0 -79
- package/skills/git/commit-crafting/evals.md +0 -92
- package/skills/git/create-pr/SKILL.md +0 -116
- package/skills/git/create-pr/evals.md +0 -114
- package/skills/git/investigate-issue/SKILL.md +0 -139
- package/skills/git/investigate-issue/evals.md +0 -94
- package/skills/git/review-changes/SKILL.md +0 -103
- package/skills/git/review-changes/evals.md +0 -85
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { resolvePackageRoot } from "../../../core/package-root.js";
|
|
4
|
+
import { clioConfigDir } from "../../../core/xdg.js";
|
|
5
|
+
import {
|
|
6
|
+
type InstallSkillInput,
|
|
7
|
+
type InstallSkillResult,
|
|
8
|
+
installSkillFromSource,
|
|
9
|
+
isSkillName,
|
|
10
|
+
parseSkillSourceSpec,
|
|
11
|
+
} from "./install.js";
|
|
12
|
+
import { loadSkills, type Skill } from "./loader.js";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Local skill marketplace. Entries come from two real sources only:
|
|
16
|
+
*
|
|
17
|
+
* 1. A catalog directory of actual SKILL.md packages: CLIO_CODER_SKILL_CATALOG_DIR,
|
|
18
|
+
* else a repo-level skills/ folder in the working tree, else the skills/
|
|
19
|
+
* catalog the installed clio-coder package carries. Metadata is read from
|
|
20
|
+
* the packages themselves via the normal skill loader.
|
|
21
|
+
* 2. A JSON index file: CLIO_CODER_SKILL_MARKETPLACE_INDEX, else
|
|
22
|
+
* <config>/skill-marketplace.json, else the skill-marketplace.json the
|
|
23
|
+
* package carries. Entries point at installable sources.
|
|
24
|
+
*
|
|
25
|
+
* The package fallbacks are what make a fresh npm install a marketplace at
|
|
26
|
+
* all: before them, an operator outside this repository with no env var set
|
|
27
|
+
* had no catalog and no index, so every bare-name install and every
|
|
28
|
+
* `/skill <name>` for a catalog skill failed. The package catalog is a
|
|
29
|
+
* marketplace source only, never a discovery root; catalog skills stay
|
|
30
|
+
* uninstalled until the operator asks, and install copies them out of the
|
|
31
|
+
* package into a Clio root without touching the network.
|
|
32
|
+
*
|
|
33
|
+
* There is no synthetic or hardcoded marketplace data; an empty result means
|
|
34
|
+
* no marketplace is configured.
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
export type MarketplaceSkillOrigin = "catalog" | "index";
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The diagnostic that means "nothing is wrong, nothing is configured". Callers
|
|
41
|
+
* that render an empty state of their own separate it from real failures (an
|
|
42
|
+
* unreadable index, a broken package) by identity rather than by string match.
|
|
43
|
+
*/
|
|
44
|
+
export const MARKETPLACE_UNCONFIGURED = "no local skill marketplace catalog or index configured";
|
|
45
|
+
|
|
46
|
+
export interface MarketplaceSkill {
|
|
47
|
+
name: string;
|
|
48
|
+
description: string;
|
|
49
|
+
/** Local path or URL accepted by `clio-coder skills install`. */
|
|
50
|
+
sourceUrl: string;
|
|
51
|
+
version?: string;
|
|
52
|
+
audit?: "pass" | "warn" | "fail" | "unknown";
|
|
53
|
+
/** Catalog grouping ("git", "research", ...); absent in a flat catalog. */
|
|
54
|
+
category?: string;
|
|
55
|
+
origin: MarketplaceSkillOrigin;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export type MarketplaceStatus = "installed" | "installable" | "unavailable";
|
|
59
|
+
|
|
60
|
+
export interface MarketplaceDiscoveryResult {
|
|
61
|
+
status: MarketplaceStatus;
|
|
62
|
+
skills: MarketplaceSkill[];
|
|
63
|
+
diagnostics: string[];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface DiscoverMarketplaceOptions {
|
|
67
|
+
/** Working directory used to find a repo-level skills/ catalog. */
|
|
68
|
+
cwd?: string;
|
|
69
|
+
/** Override the JSON index path; null disables the JSON index source. */
|
|
70
|
+
indexPath?: string | null;
|
|
71
|
+
/** Override the catalog directory; null disables catalog discovery. */
|
|
72
|
+
catalogDir?: string | null;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* The catalog directory and index the installed package carries. Resolved
|
|
77
|
+
* lazily and defensively: a source checkout that has not built, or a package
|
|
78
|
+
* root the harness cannot locate, must degrade to "no package catalog" rather
|
|
79
|
+
* than throw out of a listing.
|
|
80
|
+
*/
|
|
81
|
+
function packageCatalogDir(): string | null {
|
|
82
|
+
try {
|
|
83
|
+
return path.join(resolvePackageRoot(), "skills");
|
|
84
|
+
} catch {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function packageIndexPath(): string | null {
|
|
90
|
+
try {
|
|
91
|
+
return path.join(resolvePackageRoot(), "skills", "skill-marketplace.json");
|
|
92
|
+
} catch {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Index precedence when no explicit path is given: the operator's config-dir
|
|
99
|
+
* copy beats the package's, so a hand-curated index still wins, and the
|
|
100
|
+
* package's own index is what a fresh install falls back to.
|
|
101
|
+
*/
|
|
102
|
+
function defaultIndexPath(): string | null {
|
|
103
|
+
try {
|
|
104
|
+
const configured = path.join(clioConfigDir(), "skill-marketplace.json");
|
|
105
|
+
if (existsSync(configured)) return configured;
|
|
106
|
+
} catch {
|
|
107
|
+
// Fall through: no config dir is not "no marketplace" once the package
|
|
108
|
+
// carries an index of its own.
|
|
109
|
+
}
|
|
110
|
+
const bundled = packageIndexPath();
|
|
111
|
+
return bundled && existsSync(bundled) ? bundled : null;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function isIndexSkill(value: unknown): value is { name: string; description: string; sourceUrl: string } {
|
|
115
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return false;
|
|
116
|
+
const record = value as Record<string, unknown>;
|
|
117
|
+
return (
|
|
118
|
+
typeof record.name === "string" &&
|
|
119
|
+
record.name.trim().length > 0 &&
|
|
120
|
+
typeof record.description === "string" &&
|
|
121
|
+
typeof record.sourceUrl === "string" &&
|
|
122
|
+
record.sourceUrl.trim().length > 0
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function optionalString(value: unknown): string | undefined {
|
|
127
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function indexAudit(value: unknown): MarketplaceSkill["audit"] {
|
|
131
|
+
return value === "pass" || value === "warn" || value === "fail" || value === "unknown" ? value : undefined;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function indexSkills(indexPath: string, diagnostics: string[]): MarketplaceSkill[] {
|
|
135
|
+
try {
|
|
136
|
+
const parsed = JSON.parse(readFileSync(indexPath, "utf8")) as unknown;
|
|
137
|
+
const rawSkills = Array.isArray(parsed)
|
|
138
|
+
? parsed
|
|
139
|
+
: parsed && typeof parsed === "object" && Array.isArray((parsed as { skills?: unknown }).skills)
|
|
140
|
+
? (parsed as { skills: unknown[] }).skills
|
|
141
|
+
: [];
|
|
142
|
+
return rawSkills.filter(isIndexSkill).map((skill) => {
|
|
143
|
+
const record = skill as unknown as Record<string, unknown>;
|
|
144
|
+
// Version, audit and category are published by `npm run skills:pin`.
|
|
145
|
+
// They are advisory display metadata; an index entry stays installable
|
|
146
|
+
// without them, which is why only name/description/sourceUrl gate.
|
|
147
|
+
const version = optionalString(record.version);
|
|
148
|
+
const audit = indexAudit(record.audit);
|
|
149
|
+
const category = optionalString(record.category);
|
|
150
|
+
return {
|
|
151
|
+
name: skill.name.trim(),
|
|
152
|
+
description: skill.description.trim(),
|
|
153
|
+
sourceUrl: skill.sourceUrl.trim(),
|
|
154
|
+
...(version ? { version } : {}),
|
|
155
|
+
...(audit ? { audit } : {}),
|
|
156
|
+
...(category ? { category } : {}),
|
|
157
|
+
origin: "index" as const,
|
|
158
|
+
};
|
|
159
|
+
});
|
|
160
|
+
} catch (err) {
|
|
161
|
+
diagnostics.push(`skill marketplace index unreadable: ${err instanceof Error ? err.message : String(err)}`);
|
|
162
|
+
return [];
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* True when the directory contains a <pkg>/SKILL.md either immediately (flat
|
|
168
|
+
* catalog) or one category folder down (grouped catalog, e.g.
|
|
169
|
+
* skills/git/ship/SKILL.md). The loader itself recurses arbitrarily;
|
|
170
|
+
* this probe only decides whether a repo-level skills/ folder is a catalog.
|
|
171
|
+
*/
|
|
172
|
+
function looksLikeSkillCatalog(dir: string): boolean {
|
|
173
|
+
if (!existsSync(dir)) return false;
|
|
174
|
+
try {
|
|
175
|
+
return readdirSync(dir, { withFileTypes: true }).some((entry) => {
|
|
176
|
+
if (!entry.isDirectory()) return false;
|
|
177
|
+
const child = path.join(dir, entry.name);
|
|
178
|
+
if (existsSync(path.join(child, "SKILL.md"))) return true;
|
|
179
|
+
try {
|
|
180
|
+
return readdirSync(child, { withFileTypes: true }).some(
|
|
181
|
+
(inner) => inner.isDirectory() && existsSync(path.join(child, inner.name, "SKILL.md")),
|
|
182
|
+
);
|
|
183
|
+
} catch {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
} catch {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function resolveCatalogDir(options: DiscoverMarketplaceOptions): string | null {
|
|
193
|
+
if (options.catalogDir === null) return null;
|
|
194
|
+
if (options.catalogDir) return path.resolve(options.catalogDir);
|
|
195
|
+
const fromEnv = process.env.CLIO_CODER_SKILL_CATALOG_DIR;
|
|
196
|
+
if (fromEnv && fromEnv.trim().length > 0) return path.resolve(fromEnv.trim());
|
|
197
|
+
const repoCatalog = path.join(options.cwd ?? process.cwd(), "skills");
|
|
198
|
+
if (looksLikeSkillCatalog(repoCatalog)) return repoCatalog;
|
|
199
|
+
// The package's own catalog: rows resolve to local files, so a bare-name
|
|
200
|
+
// install copies out of the package and needs no network. From a checkout
|
|
201
|
+
// of this repository the two paths coincide.
|
|
202
|
+
const bundled = packageCatalogDir();
|
|
203
|
+
return bundled && looksLikeSkillCatalog(bundled) ? bundled : null;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* The catalog folder a package sits in, which is the grouping `--category`
|
|
208
|
+
* installs by. A flat catalog has none, and a package outside the catalog dir
|
|
209
|
+
* (which `path.relative` reports with a leading "..") is not grouped by it.
|
|
210
|
+
*/
|
|
211
|
+
function catalogCategory(catalogDir: string, baseDir: string): string | undefined {
|
|
212
|
+
const rel = path.relative(catalogDir, baseDir);
|
|
213
|
+
const category = path.dirname(rel);
|
|
214
|
+
if (rel.length === 0 || rel.startsWith("..") || category === "." || category.startsWith("..")) return undefined;
|
|
215
|
+
return category;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function catalogEntry(skill: Skill, catalogDir: string): MarketplaceSkill {
|
|
219
|
+
const version = typeof skill.metadata.version === "string" ? skill.metadata.version : undefined;
|
|
220
|
+
const category = catalogCategory(catalogDir, skill.baseDir);
|
|
221
|
+
return {
|
|
222
|
+
name: skill.name,
|
|
223
|
+
description: skill.description,
|
|
224
|
+
sourceUrl: skill.baseDir,
|
|
225
|
+
...(version ? { version } : {}),
|
|
226
|
+
...(skill.provenance?.audit ? { audit: skill.provenance.audit } : {}),
|
|
227
|
+
...(category ? { category } : {}),
|
|
228
|
+
origin: "catalog",
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function catalogSkills(dir: string, diagnostics: string[]): MarketplaceSkill[] {
|
|
233
|
+
const list = loadSkills({ disableDiscovery: true, explicitSkillPaths: [dir] });
|
|
234
|
+
for (const diag of list.diagnostics) {
|
|
235
|
+
if (diag.type === "warning" || diag.type === "error") diagnostics.push(diag.message);
|
|
236
|
+
}
|
|
237
|
+
return list.items.map((skill) => catalogEntry(skill, dir));
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export function discoverMarketplaceSkills(options: DiscoverMarketplaceOptions = {}): MarketplaceDiscoveryResult {
|
|
241
|
+
const diagnostics: string[] = [];
|
|
242
|
+
const skills: MarketplaceSkill[] = [];
|
|
243
|
+
const seen = new Set<string>();
|
|
244
|
+
|
|
245
|
+
// Catalog packages first: real local files beat index pointers on name collisions.
|
|
246
|
+
const catalogDir = resolveCatalogDir(options);
|
|
247
|
+
if (catalogDir) {
|
|
248
|
+
for (const skill of catalogSkills(catalogDir, diagnostics)) {
|
|
249
|
+
if (seen.has(skill.name)) continue;
|
|
250
|
+
seen.add(skill.name);
|
|
251
|
+
skills.push(skill);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const indexPath =
|
|
256
|
+
options.indexPath === null ? null : (options.indexPath ?? process.env.CLIO_CODER_SKILL_MARKETPLACE_INDEX ?? null);
|
|
257
|
+
const resolvedIndexPath = indexPath ?? defaultIndexPath();
|
|
258
|
+
if (options.indexPath !== null && resolvedIndexPath && existsSync(resolvedIndexPath)) {
|
|
259
|
+
for (const skill of indexSkills(resolvedIndexPath, diagnostics)) {
|
|
260
|
+
if (seen.has(skill.name)) continue;
|
|
261
|
+
seen.add(skill.name);
|
|
262
|
+
skills.push(skill);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
if (skills.length === 0 && diagnostics.length === 0) {
|
|
267
|
+
diagnostics.push(MARKETPLACE_UNCONFIGURED);
|
|
268
|
+
}
|
|
269
|
+
return { status: skills.length > 0 ? "installable" : "unavailable", skills, diagnostics };
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
export function getMarketplaceSkills(options: DiscoverMarketplaceOptions = {}): MarketplaceSkill[] {
|
|
273
|
+
return discoverMarketplaceSkills(options).skills;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* The single install entry point for every frontend (headless CLI, TUI
|
|
278
|
+
* pending-skill prompt, skills hub). Source resolution, in precedence order:
|
|
279
|
+
*
|
|
280
|
+
* 1. A GitHub URL installs directly.
|
|
281
|
+
* 2. An existing local path installs directly; paths always beat same-named
|
|
282
|
+
* marketplace entries.
|
|
283
|
+
* 3. A bare skill name resolves through the local marketplace.
|
|
284
|
+
*
|
|
285
|
+
* Anything else is an error naming both failed interpretations. Overwriting
|
|
286
|
+
* an existing install always requires an explicit `force: true`.
|
|
287
|
+
*/
|
|
288
|
+
export function installSkill(input: InstallSkillInput): InstallSkillResult {
|
|
289
|
+
const source = input.source.trim();
|
|
290
|
+
const spec = parseSkillSourceSpec(source);
|
|
291
|
+
if (spec?.kind === "local" && isSkillName(source) && !existsSync(spec.path)) {
|
|
292
|
+
const skill = getMarketplaceSkills({ ...(input.cwd ? { cwd: input.cwd } : {}) }).find(
|
|
293
|
+
(entry) => entry.name === source,
|
|
294
|
+
);
|
|
295
|
+
if (!skill) {
|
|
296
|
+
throw new Error(`"${source}" is neither an existing local path nor available in the local marketplace`);
|
|
297
|
+
}
|
|
298
|
+
return installSkillFromSource({ ...input, source: skill.sourceUrl });
|
|
299
|
+
}
|
|
300
|
+
return installSkillFromSource(input);
|
|
301
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local-first skill provenance pinning.
|
|
3
|
+
*
|
|
4
|
+
* `skills/registry.yaml` (regenerated with `npm run skills:pin`) pins the
|
|
5
|
+
* provenance-stripped sha256 of every marketplace skill's SKILL.md. At
|
|
6
|
+
* activation time, a skill carrying marketplace provenance (`registry-id`
|
|
7
|
+
* frontmatter) is compared against the pinned entry on the same normalized
|
|
8
|
+
* hash, so install-lifecycle stamps (`installed-at`, `installed-hash`, ...)
|
|
9
|
+
* never read as drift while any content or registry-identity edit does. A
|
|
10
|
+
* mismatch means the installed content drifted from its audited form. Drift
|
|
11
|
+
* never blocks; skills still pass through the normal tool safety gates. No
|
|
12
|
+
* network, no remote registry, no signing; this is hash comparison against a
|
|
13
|
+
* local manifest.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
17
|
+
import path from "node:path";
|
|
18
|
+
import yaml from "yaml";
|
|
19
|
+
|
|
20
|
+
export const SKILL_PIN_MANIFEST_FILENAME = "registry.yaml";
|
|
21
|
+
|
|
22
|
+
export interface SkillPinEntry {
|
|
23
|
+
name: string;
|
|
24
|
+
version: string | null;
|
|
25
|
+
sha256: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export type SkillDriftVerdict = "match" | "mismatch";
|
|
29
|
+
|
|
30
|
+
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
31
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Resolve the manifest path using the same catalog resolution as the marketplace. */
|
|
35
|
+
function resolveSkillPinManifestPath(cwd: string): string | null {
|
|
36
|
+
const fromEnv = process.env.CLIO_CODER_SKILL_CATALOG_DIR;
|
|
37
|
+
const catalogDir = fromEnv && fromEnv.trim().length > 0 ? path.resolve(fromEnv.trim()) : path.join(cwd, "skills");
|
|
38
|
+
const manifestPath = path.join(catalogDir, SKILL_PIN_MANIFEST_FILENAME);
|
|
39
|
+
return existsSync(manifestPath) ? manifestPath : null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function loadSkillPinManifest(manifestPath: string): Map<string, SkillPinEntry> | null {
|
|
43
|
+
let parsed: unknown;
|
|
44
|
+
try {
|
|
45
|
+
parsed = yaml.parse(readFileSync(manifestPath, "utf8"));
|
|
46
|
+
} catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
if (!isPlainObject(parsed) || !Array.isArray(parsed.skills)) return null;
|
|
50
|
+
const entries = new Map<string, SkillPinEntry>();
|
|
51
|
+
for (const raw of parsed.skills) {
|
|
52
|
+
if (!isPlainObject(raw)) continue;
|
|
53
|
+
const name = typeof raw.name === "string" ? raw.name.trim() : "";
|
|
54
|
+
const sha256 = typeof raw.sha256 === "string" ? raw.sha256.trim().toLowerCase() : "";
|
|
55
|
+
if (name.length === 0 || !/^[0-9a-f]{64}$/.test(sha256)) continue;
|
|
56
|
+
entries.set(name, {
|
|
57
|
+
name,
|
|
58
|
+
version: typeof raw.version === "string" && raw.version.trim().length > 0 ? raw.version.trim() : null,
|
|
59
|
+
sha256,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return entries;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Which recorded hash the activated content was measured against. */
|
|
66
|
+
export type SkillDriftAuthority = "pinned-manifest" | "install-record";
|
|
67
|
+
|
|
68
|
+
export interface SkillDriftReport {
|
|
69
|
+
verdict: SkillDriftVerdict;
|
|
70
|
+
authority: SkillDriftAuthority;
|
|
71
|
+
/** The hash the content was compared against, for the operator's record. */
|
|
72
|
+
expected: string;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Compare an activated skill against whatever recorded hash can speak for it.
|
|
77
|
+
*
|
|
78
|
+
* Two independent authorities, tried in that order because they answer
|
|
79
|
+
* different questions. The pinned manifest says what the audited catalog
|
|
80
|
+
* entry's content is, so it wins wherever it has an entry. The skill's own
|
|
81
|
+
* `installed-hash` frontmatter says what this machine wrote at install time,
|
|
82
|
+
* which is the only evidence available for a skill installed straight from a
|
|
83
|
+
* URL, and it catches the case the manifest cannot see at all: content edited
|
|
84
|
+
* on disk after installation.
|
|
85
|
+
*
|
|
86
|
+
* Both compare on the provenance-stripped hash, so install-lifecycle stamps
|
|
87
|
+
* never read as drift while any content or registry-identity edit does. Null
|
|
88
|
+
* means nothing recorded a hash for this skill; drift evidence is opt-in and
|
|
89
|
+
* never a gate, and skills still pass the normal tool safety gates either way.
|
|
90
|
+
*/
|
|
91
|
+
export function checkSkillDrift(
|
|
92
|
+
skill: { name: string; normalizedHash: string; provenance?: { installedHash?: string } },
|
|
93
|
+
cwd: string,
|
|
94
|
+
): SkillDriftReport | null {
|
|
95
|
+
const actual = skill.normalizedHash.toLowerCase();
|
|
96
|
+
const manifestPath = resolveSkillPinManifestPath(cwd);
|
|
97
|
+
const manifest = manifestPath === null ? null : loadSkillPinManifest(manifestPath);
|
|
98
|
+
const pinned = manifest?.get(skill.name);
|
|
99
|
+
if (pinned !== undefined) {
|
|
100
|
+
return {
|
|
101
|
+
verdict: pinned.sha256 === actual ? "match" : "mismatch",
|
|
102
|
+
authority: "pinned-manifest",
|
|
103
|
+
expected: pinned.sha256,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
const recorded = skill.provenance?.installedHash?.trim().toLowerCase();
|
|
107
|
+
if (recorded !== undefined && /^[0-9a-f]{64}$/.test(recorded)) {
|
|
108
|
+
return {
|
|
109
|
+
verdict: recorded === actual ? "match" : "mismatch",
|
|
110
|
+
authority: "install-record",
|
|
111
|
+
expected: recorded,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { artifactDefaultPath } from "../../core/artifact-paths.js";
|
|
3
|
+
import { canonicalizeExistingPath } from "../../core/path-canonical.js";
|
|
4
|
+
import { ToolNames } from "../../core/tool-names.js";
|
|
5
|
+
import { extractCommandCdTargets, extractCommandWriteTargets } from "./protected-artifacts.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Deterministic action classifier for tool calls. Pure function, no I/O, no
|
|
9
|
+
* state. Slice 3 wires it into dispatch admission and audit. This module only
|
|
10
|
+
* owns the mapping from (tool, args) to an ActionClass.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export type ActionClass = "read" | "write" | "execute" | "dispatch" | "system_modify" | "git_destructive" | "unknown";
|
|
14
|
+
|
|
15
|
+
export interface ClassifierCall {
|
|
16
|
+
tool: string;
|
|
17
|
+
args?: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface Classification {
|
|
21
|
+
actionClass: ActionClass;
|
|
22
|
+
reasons: ReadonlyArray<string>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
interface NamedPattern {
|
|
26
|
+
name: string;
|
|
27
|
+
re: RegExp;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const GIT_DESTRUCTIVE_PATTERNS: ReadonlyArray<NamedPattern> = [
|
|
31
|
+
{ name: "git-push-force-long", re: /\bgit\s+push\s+--force\b/i },
|
|
32
|
+
{ name: "git-push-force-short", re: /\bgit\s+push\s+-f\b/i },
|
|
33
|
+
{ name: "git-reset-hard", re: /\bgit\s+reset\s+--hard\b/i },
|
|
34
|
+
{ name: "git-clean-fd", re: /\bgit\s+clean\s+-fd?\b/i },
|
|
35
|
+
{ name: "git-checkout-dot", re: /\bgit\s+checkout\s+--\s+\./i },
|
|
36
|
+
{ name: "git-branch-D", re: /\bgit\s+branch\s+-D\b/i },
|
|
37
|
+
{ name: "git-restore-source", re: /\bgit\s+restore\s+--source\b/i },
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
const SYSTEM_MODIFY_PATTERNS: ReadonlyArray<NamedPattern> = [
|
|
41
|
+
{ name: "sudo-or-doas", re: /\b(sudo|doas)\b/i },
|
|
42
|
+
// allow rm -rf /tmp/... and /var/tmp/... but flag everything else rooted at /
|
|
43
|
+
{ name: "rm-rf-root", re: /\brm\s+-rf?\s+\/(?!(tmp|var\/tmp)(?:\/|\s|$))/i },
|
|
44
|
+
{ name: "apt-install", re: /\bapt(-get)?\s+(install|remove|purge)/i },
|
|
45
|
+
{ name: "brew-install", re: /\bbrew\s+(install|uninstall|reinstall)/i },
|
|
46
|
+
{ name: "npm-install-global", re: /\bnpm\s+install\s+-g\b/i },
|
|
47
|
+
{ name: "pip-install", re: /\bpip\s+install\b/i },
|
|
48
|
+
{ name: "systemctl", re: /\bsystemctl\s+/i },
|
|
49
|
+
{ name: "chmod-root", re: /\bchmod\s+[0-7]{3,4}\s+\//i },
|
|
50
|
+
{ name: "chown", re: /\bchown\s+/i },
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* `/run` is here because path resolution canonicalizes symlinks: on every
|
|
55
|
+
* systemd distribution `/var/run` is a symlink to `/run` and `/var/lock` to
|
|
56
|
+
* `/run/lock`, so a write aimed at either landed on a path no prefix covered
|
|
57
|
+
* and escaped the system-root rule whenever the workspace happened to sit
|
|
58
|
+
* under it. Found while auditing the `/var` subdirectories for the carve-out
|
|
59
|
+
* below.
|
|
60
|
+
*/
|
|
61
|
+
const SYSTEM_WRITE_ROOT_PREFIXES: ReadonlyArray<string> = ["/etc", "/usr", "/var", "/bin", "/sbin", "/run"];
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Temp trees that sit under a protected root but are ordinary scratch space,
|
|
65
|
+
* not system state. `/var/tmp` is the FHS's persistent temp directory and
|
|
66
|
+
* `/var/folders` is macOS's per-user temp tree, and both are where an operator
|
|
67
|
+
* or a harness puts a throwaway workspace. Classifying them as system_modify
|
|
68
|
+
* made every mutating call from a workspace there require a confirmation, which
|
|
69
|
+
* headless runs answer with a denial: a `clio-coder run` in a `/var/tmp` sandbox
|
|
70
|
+
* could not write one byte, and the model's recovery was to report work it had
|
|
71
|
+
* not done. The exemption is a carve-out rather than an enumeration of the
|
|
72
|
+
* system directories under `/var` on purpose: `/var/log`, `/var/lib`,
|
|
73
|
+
* `/var/spool`, `/var/db` and every other subdirectory, including ones this
|
|
74
|
+
* list has never heard of, stay exactly as protected as before.
|
|
75
|
+
*
|
|
76
|
+
* `rm -rf` already reads the same line (SYSTEM_MODIFY_PATTERNS rm-rf-root
|
|
77
|
+
* exempts `/tmp` and `/var/tmp`), so the two checks now agree.
|
|
78
|
+
*/
|
|
79
|
+
const SYSTEM_WRITE_EXEMPT_PREFIXES: ReadonlyArray<string> = ["/var/tmp", "/var/folders"];
|
|
80
|
+
|
|
81
|
+
function isUnderPrefix(abs: string, prefix: string): boolean {
|
|
82
|
+
return abs === prefix || abs.startsWith(`${prefix}/`);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function baseClassify(tool: string): ActionClass | null {
|
|
86
|
+
switch (tool) {
|
|
87
|
+
case ToolNames.Read:
|
|
88
|
+
case ToolNames.Grep:
|
|
89
|
+
case ToolNames.Find:
|
|
90
|
+
case ToolNames.Ls:
|
|
91
|
+
case ToolNames.WebFetch:
|
|
92
|
+
case ToolNames.Git:
|
|
93
|
+
case ToolNames.CodeNav:
|
|
94
|
+
case ToolNames.Context:
|
|
95
|
+
case ToolNames.Monitor:
|
|
96
|
+
case ToolNames.AskUser:
|
|
97
|
+
case ToolNames.CredentialPresent:
|
|
98
|
+
// tasks pick mutates only Clio-owned session-ledger and project-local
|
|
99
|
+
// .clio-coder runtime state, never source-workspace files. By intentional
|
|
100
|
+
// policy it stays read class and ungated; the tool itself still requires
|
|
101
|
+
// a durable operator task id before it can mutate either store.
|
|
102
|
+
case ToolNames.Tasks:
|
|
103
|
+
// ledger posts a typed contribution to a coordination board and reads a
|
|
104
|
+
// local mirror. Neither touches the workspace, so it is never gated
|
|
105
|
+
// behind a confirmation.
|
|
106
|
+
case ToolNames.Ledger:
|
|
107
|
+
return "read";
|
|
108
|
+
case ToolNames.Write:
|
|
109
|
+
case ToolNames.Edit:
|
|
110
|
+
case ToolNames.Artifact:
|
|
111
|
+
return "write";
|
|
112
|
+
case ToolNames.Bash:
|
|
113
|
+
case ToolNames.Verify:
|
|
114
|
+
return "execute";
|
|
115
|
+
case ToolNames.Dispatch:
|
|
116
|
+
case ToolNames.Steer:
|
|
117
|
+
return "dispatch";
|
|
118
|
+
default:
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function scanStringOf(args: Record<string, unknown> | undefined): string {
|
|
124
|
+
if (!args) return "";
|
|
125
|
+
const parts: string[] = [];
|
|
126
|
+
for (const value of Object.values(args)) {
|
|
127
|
+
if (value == null) continue;
|
|
128
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
129
|
+
parts.push(String(value));
|
|
130
|
+
} else {
|
|
131
|
+
try {
|
|
132
|
+
parts.push(JSON.stringify(value));
|
|
133
|
+
} catch {
|
|
134
|
+
// ignore values that cannot be serialized
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return parts.join(" ");
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function matchFirst(patterns: ReadonlyArray<NamedPattern>, haystack: string): NamedPattern | null {
|
|
142
|
+
for (const p of patterns) {
|
|
143
|
+
if (p.re.test(haystack)) return p;
|
|
144
|
+
}
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function resolveCandidate(p: string, baseCwd?: string): string {
|
|
149
|
+
// ~ expansion is not performed here; any ~-prefixed path is treated as an
|
|
150
|
+
// absolute user-home reference. We keep it as-is so the caller-visible
|
|
151
|
+
// string drives the escape check, and classify conservatively as modify.
|
|
152
|
+
if (p.startsWith("~")) return p;
|
|
153
|
+
const base = canonicalizeExistingPath(path.resolve(baseCwd ?? process.cwd()));
|
|
154
|
+
const resolved = path.isAbsolute(p) ? path.resolve(p) : path.resolve(base, p);
|
|
155
|
+
return canonicalizeExistingPath(resolved);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function isInsideCwd(abs: string): boolean {
|
|
159
|
+
const cwd = canonicalizeExistingPath(path.resolve(process.cwd()));
|
|
160
|
+
const candidate = canonicalizeExistingPath(abs);
|
|
161
|
+
const rel = path.relative(cwd, candidate);
|
|
162
|
+
return rel === "" || (!rel.startsWith("..") && !path.isAbsolute(rel));
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function writePathClass(pathArg: string, baseCwd?: string): { cls: "system_modify" | "write"; reason?: string } {
|
|
166
|
+
if (pathArg.startsWith("~")) {
|
|
167
|
+
return { cls: "system_modify", reason: `write-path-home-escape: ${pathArg}` };
|
|
168
|
+
}
|
|
169
|
+
const abs = resolveCandidate(pathArg, baseCwd);
|
|
170
|
+
const exempt = SYSTEM_WRITE_EXEMPT_PREFIXES.some((prefix) => isUnderPrefix(abs, prefix));
|
|
171
|
+
if (!exempt) {
|
|
172
|
+
for (const prefix of SYSTEM_WRITE_ROOT_PREFIXES) {
|
|
173
|
+
if (isUnderPrefix(abs, prefix)) {
|
|
174
|
+
return { cls: "system_modify", reason: `write-path-system-root: ${prefix}` };
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (!isInsideCwd(abs)) {
|
|
179
|
+
return { cls: "system_modify", reason: `write-path-outside-cwd: ${abs}` };
|
|
180
|
+
}
|
|
181
|
+
return { cls: "write" };
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* The artifact tool writes a default file name when the call names no path, so
|
|
186
|
+
* a classifier that only reads the path argument saw no target at all and
|
|
187
|
+
* returned plain write for a call that writes into whatever the cwd is. The
|
|
188
|
+
* live evidence: in a `/var/tmp` workspace where write, edit and every bash
|
|
189
|
+
* redirect were refused as system_modify, `artifact(kind:"report")` wrote a
|
|
190
|
+
* report into that same directory. The default now resolves through
|
|
191
|
+
* core/artifact-paths.ts, the one place the tool, the write-root check, and the
|
|
192
|
+
* protected-artifacts guard all read, so the four can never disagree.
|
|
193
|
+
*/
|
|
194
|
+
function extractWritePath(tool: string, args: Record<string, unknown> | undefined): string | null {
|
|
195
|
+
const candidate = args?.path ?? args?.file_path ?? args?.filePath;
|
|
196
|
+
if (typeof candidate === "string" && candidate.length > 0) return candidate;
|
|
197
|
+
return tool === ToolNames.Artifact ? artifactDefaultPath(args?.kind) : null;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export function classify(call: ClassifierCall): Classification {
|
|
201
|
+
const base = baseClassify(call.tool);
|
|
202
|
+
if (base === null) {
|
|
203
|
+
return { actionClass: "unknown", reasons: [`unknown tool: ${call.tool}`] };
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const reasons: string[] = [];
|
|
207
|
+
|
|
208
|
+
if (call.tool === ToolNames.Bash) {
|
|
209
|
+
const scan = scanStringOf(call.args);
|
|
210
|
+
const gitHit = matchFirst(GIT_DESTRUCTIVE_PATTERNS, scan);
|
|
211
|
+
if (gitHit) {
|
|
212
|
+
return { actionClass: "git_destructive", reasons: [`pattern:${gitHit.name}`] };
|
|
213
|
+
}
|
|
214
|
+
const sysHit = matchFirst(SYSTEM_MODIFY_PATTERNS, scan);
|
|
215
|
+
if (sysHit) {
|
|
216
|
+
return { actionClass: "system_modify", reasons: [`pattern:${sysHit.name}`] };
|
|
217
|
+
}
|
|
218
|
+
// Apply the same path-class gate we use for the write tool to every
|
|
219
|
+
// shell write-target the command exposes (redirects, tee, cp/mv
|
|
220
|
+
// destinations). Without this the model can dodge the write tool's
|
|
221
|
+
// confirmation gate by emitting `echo X > /tmp/foo.txt` after the user
|
|
222
|
+
// cancels the original write call. Relative write targets are
|
|
223
|
+
// resolved against the bash call's explicit cwd argument when
|
|
224
|
+
// supplied so a model cannot launder a write outside the workspace
|
|
225
|
+
// by combining a relative redirect with a cwd outside the workspace.
|
|
226
|
+
const command = typeof call.args?.command === "string" ? call.args.command : null;
|
|
227
|
+
const argCwd = typeof call.args?.cwd === "string" && call.args.cwd.length > 0 ? call.args.cwd : undefined;
|
|
228
|
+
if (command !== null) {
|
|
229
|
+
const targetReasons: string[] = [];
|
|
230
|
+
for (const target of extractCommandWriteTargets(command)) {
|
|
231
|
+
const decision = writePathClass(target, argCwd);
|
|
232
|
+
if (decision.cls === "system_modify") {
|
|
233
|
+
targetReasons.push(decision.reason ?? `bash-write-target: ${target}`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// A `cd` outside the workspace re-bases every relative path after it,
|
|
237
|
+
// so static write-target extraction stops describing what the command
|
|
238
|
+
// touches. Escalate through the same system_modify confirm gate as an
|
|
239
|
+
// out-of-workspace write target; inside-workspace `cd` stays plain
|
|
240
|
+
// execute.
|
|
241
|
+
for (const target of extractCommandCdTargets(command)) {
|
|
242
|
+
if (target.startsWith("~")) {
|
|
243
|
+
targetReasons.push(`bash-cd-home-escape: ${target}`);
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
const abs = resolveCandidate(target, argCwd);
|
|
247
|
+
if (!isInsideCwd(abs)) {
|
|
248
|
+
targetReasons.push(`bash-cd-outside-workspace: ${abs}`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (targetReasons.length > 0) {
|
|
252
|
+
return { actionClass: "system_modify", reasons: targetReasons };
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return { actionClass: "execute", reasons };
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
if (base === "write") {
|
|
259
|
+
const pathArg = extractWritePath(call.tool, call.args);
|
|
260
|
+
if (pathArg) {
|
|
261
|
+
const decision = writePathClass(pathArg);
|
|
262
|
+
if (decision.cls === "system_modify") {
|
|
263
|
+
return { actionClass: "system_modify", reasons: decision.reason ? [decision.reason] : [] };
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return { actionClass: "write", reasons };
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
return { actionClass: base, reasons };
|
|
270
|
+
}
|