@iowarp/clio-coder 0.4.1 → 0.4.3
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 +127 -0
- package/CONTRIBUTING.md +142 -52
- package/README.md +434 -473
- package/SECURITY.md +2 -1
- package/dist/{acp-ZILU3AUO.js → acp-H2NGRPWO.js} +12 -12
- package/dist/{agents-HYWGBGQR.js → agents-TL5LLUQP.js} +56 -55
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-N3QT7CBO.js → auth-E5SW4HMS.js} +23 -21
- package/dist/builtins-IA7V7FUC.js +22 -0
- package/dist/{chunk-7RY5VZPH.js → chunk-2APPQIER.js} +8 -8
- package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
- package/dist/{chunk-JA5QWE4Z.js → chunk-2UG5F4C5.js} +1973 -1664
- package/dist/{chunk-5YHDIDBP.js → chunk-2UH2KFUP.js} +2 -2
- package/dist/{chunk-CTJ4RNAA.js → chunk-2VIKGWFZ.js} +2 -2
- package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
- package/dist/{chunk-GIZNH63R.js → chunk-35MSIRKH.js} +9 -4
- package/dist/chunk-3EBYEESD.js +314 -0
- package/dist/{chunk-J5LZHVIT.js → chunk-3M6DQK6S.js} +113 -35
- package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
- package/dist/{chunk-6FN3E6KX.js → chunk-4O6MANBS.js} +2 -2
- package/dist/chunk-4UVU7BJ5.js +39 -0
- package/dist/{chunk-VKRH2TCS.js → chunk-4WR7VSYB.js} +2 -2
- package/dist/{chunk-BBTJOK6Y.js → chunk-54CBCGIR.js} +5 -5
- package/dist/{chunk-AP73CFDC.js → chunk-5ICU3EUH.js} +2 -2
- package/dist/chunk-5MEZN6CB.js +1334 -0
- package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
- package/dist/{chunk-ABLSQ6JX.js → chunk-64I3JVYM.js} +8 -2
- package/dist/{chunk-AFKWHWXF.js → chunk-6PTFB5VS.js} +39 -22
- package/dist/{chunk-VN3SHNBN.js → chunk-7DICMOS6.js} +2 -2
- package/dist/chunk-7DRAWPTZ.js +360 -0
- package/dist/chunk-7E7I3WLS.js +3762 -0
- package/dist/{chunk-BJGUKIG4.js → chunk-7ZYNNDKC.js} +7 -7
- package/dist/{chunk-XKA2ICR3.js → chunk-AF4YM7Z4.js} +652 -252
- package/dist/{chunk-GVQJ5CCZ.js → chunk-AX2THNSA.js} +12 -12
- package/dist/{chunk-IG7BCQBA.js → chunk-B4OAX3SI.js} +65 -3
- package/dist/{chunk-TD3PGPQA.js → chunk-B4VEBZKF.js} +3 -3
- package/dist/{chunk-74YWRRU5.js → chunk-BEPZRGGU.js} +10 -10
- package/dist/{chunk-FEFIFZTL.js → chunk-CE5AX47J.js} +2 -2
- package/dist/{chunk-UAPGZHYC.js → chunk-DWUOQKRU.js} +25 -11
- package/dist/{chunk-THYWACCR.js → chunk-E3TPLWFX.js} +3 -3
- package/dist/{chunk-7EPLI7VL.js → chunk-EKCHAPYA.js} +2 -2
- package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
- package/dist/{chunk-PJJ6MY27.js → chunk-F5JHEYZM.js} +7 -7
- package/dist/{chunk-6CCS4G3W.js → chunk-FTMGRKEF.js} +3 -3
- package/dist/{chunk-SINK3QR6.js → chunk-G76U63X4.js} +17 -17
- package/dist/{chunk-EIMVLWB3.js → chunk-GHS5EBTQ.js} +64 -9
- package/dist/{chunk-QMXC4JB7.js → chunk-GI7YYQ3F.js} +187 -1419
- package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
- package/dist/{chunk-6HMJX2VU.js → chunk-GWZNEVM2.js} +44 -12
- package/dist/chunk-GYV6VZOC.js +26 -0
- package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
- package/dist/{chunk-UXN6JT4W.js → chunk-HEQY7ZFI.js} +3 -3
- package/dist/{chunk-7PWAODYW.js → chunk-I7XBWTYH.js} +2 -2
- package/dist/{chunk-GCSMB2KY.js → chunk-I7ZPNEJM.js} +145 -102
- package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
- package/dist/{chunk-QTFGO774.js → chunk-IGLP3ODT.js} +29 -16
- package/dist/chunk-IJNZMHLA.js +101 -0
- package/dist/{chunk-BDPT6GTK.js → chunk-INY6HTFL.js} +7 -7
- package/dist/{chunk-PBP4B7XR.js → chunk-IUE3Y34X.js} +2 -2
- package/dist/{chunk-6NJQITNH.js → chunk-IWT4SF4R.js} +6 -3
- package/dist/{chunk-R23Z6K6I.js → chunk-JDAY6FIL.js} +19 -19
- package/dist/chunk-JEQ3XTHC.js +42 -0
- package/dist/{chunk-FSP7CMNU.js → chunk-JGRC33J2.js} +50 -4
- package/dist/{chunk-TVH4ONAM.js → chunk-JKKCYP3C.js} +10 -10
- package/dist/{chunk-HJWWJ6IL.js → chunk-JSC3U7TI.js} +16 -4
- package/dist/{chunk-C537JADH.js → chunk-KK4JZPBQ.js} +19 -141
- package/dist/{chunk-K6BF4U2H.js → chunk-KKOJXO6R.js} +62 -14
- package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
- package/dist/{chunk-6DWBAZ5U.js → chunk-L47TF46W.js} +5 -7
- package/dist/{chunk-HUAS7ITX.js → chunk-LDJG7DW3.js} +91 -42
- package/dist/{chunk-CDNVLKUX.js → chunk-LLDJM5XK.js} +13 -7
- package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
- package/dist/{chunk-Y4CAGMM6.js → chunk-MNJGS2IN.js} +5 -6
- package/dist/{chunk-VKFQTNDV.js → chunk-MUW2BDDH.js} +4 -4
- package/dist/{chunk-E67WX76H.js → chunk-MWUZBSAQ.js} +104 -152
- package/dist/{chunk-OJTRZGR3.js → chunk-N2Z7HLVY.js} +21 -21
- package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
- package/dist/{chunk-FYUN5KZ3.js → chunk-NIQJ66N4.js} +21 -21
- package/dist/{chunk-U2WB7TZS.js → chunk-NMJXSHBJ.js} +97 -85
- package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
- package/dist/{chunk-VEGN6WIQ.js → chunk-O5CVSAG5.js} +3 -3
- package/dist/{chunk-MOPSG2X7.js → chunk-OML5D5V5.js} +8 -8
- package/dist/{chunk-2VG7KLYV.js → chunk-PAJQJ7BS.js} +5816 -3255
- package/dist/{chunk-ZW55JB7N.js → chunk-PUVDKJ2Y.js} +2 -2
- package/dist/{chunk-BTGG6BG2.js → chunk-QWGDJJYJ.js} +158 -19
- package/dist/chunk-R6Q67RJH.js +134 -0
- package/dist/{chunk-ZJLUDYFY.js → chunk-RRNP2ANY.js} +6 -6
- package/dist/{chunk-PVAMAVBB.js → chunk-RSJ25QSL.js} +102 -2
- package/dist/{chunk-NLFAQR7Z.js → chunk-S66XZJOF.js} +3 -23
- package/dist/chunk-SKHCAU7K.js +385 -0
- package/dist/chunk-SZAA6XDG.js +30 -0
- package/dist/{chunk-J4HBWF6Y.js → chunk-TM6LQDI3.js} +131 -28
- package/dist/chunk-UOIZ7DA4.js +41 -0
- package/dist/{chunk-MA3H6DM5.js → chunk-UPZU6GE4.js} +25 -3
- package/dist/{chunk-BWW4HLO4.js → chunk-UXCU4E3T.js} +8 -6
- package/dist/{chunk-N5UK64DP.js → chunk-V2ANDPVT.js} +4 -4
- package/dist/{chunk-AK5XEFVZ.js → chunk-VA5FNYMT.js} +26 -13
- package/dist/{chunk-6VC4OV3Z.js → chunk-VIA6RFQZ.js} +3 -11
- package/dist/{chunk-ZAZB4JMW.js → chunk-VKPAQYEB.js} +27 -8
- package/dist/{chunk-QKIFBZKT.js → chunk-VW6DOEDG.js} +497 -81
- package/dist/{chunk-SCYB3HA4.js → chunk-W6RRQCPQ.js} +63 -19
- package/dist/{chunk-2NM363SV.js → chunk-WBKFA554.js} +10 -10
- package/dist/{chunk-R32CLGZ6.js → chunk-WCXUNS7U.js} +82 -21
- package/dist/{chunk-GPPB3JBE.js → chunk-WRBAGUNF.js} +3 -3
- package/dist/{chunk-IXJT6DCX.js → chunk-XIVNBFZS.js} +85 -30
- package/dist/{chunk-UEDMSP56.js → chunk-XPWWI35G.js} +417 -201
- package/dist/chunk-XRZT5WY5.js +47 -0
- package/dist/{chunk-3QSOM6PA.js → chunk-Y3CBHOR6.js} +2 -2
- package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
- package/dist/{chunk-AKB4GYDL.js → chunk-YQWYVTMC.js} +5 -5
- package/dist/{chunk-6I5ILFOF.js → chunk-ZA4VCIGV.js} +3 -3
- package/dist/{chunk-7OBGU7UB.js → chunk-ZDN3Y73Y.js} +12 -18
- package/dist/{chunk-3I5NY75V.js → chunk-ZWPRK62N.js} +8 -5
- package/dist/cli/index.js +41 -39
- package/dist/{clio-IT3G3VQH.js → clio-CMMK4KRR.js} +9 -9
- package/dist/{code-nav-RK6S7F6E.js → code-nav-MDZNQS33.js} +89 -21
- package/dist/{components-UBWCQSRW.js → components-UCUQ4QXW.js} +4 -4
- package/dist/{config-3QZRWZJF.js → config-SVM5P5YI.js} +131 -84
- package/dist/{configure-FL7Y3KJF.js → configure-LE3IK2TJ.js} +28 -26
- package/dist/{context-5HE7ODYK.js → context-2OHRKS42.js} +69 -64
- package/dist/{context-KYQFRVDC.js → context-E3VC7RX5.js} +15 -11
- package/dist/{context-XNHL75JV.js → context-VNCR7KAG.js} +93 -65
- package/dist/{context-clear-N545L53A.js → context-clear-BW4O37TG.js} +64 -60
- package/dist/context-map-COB37XXN.js +505 -0
- package/dist/{context-working-set-QHKXSV2F.js → context-working-set-VDS25HXZ.js} +19 -18
- package/dist/{dispatch-runner-RGIE5PCT.js → dispatch-runner-5AHT53RF.js} +93 -82
- package/dist/{docs-5NAF6AU7.js → docs-PD3EXDKU.js} +21 -20
- package/dist/{doctor-ZGPEGHIP.js → doctor-WNNVO6FY.js} +48 -47
- package/dist/{eval-GXLL44RD.js → eval-7G7SGAYO.js} +287 -115
- package/dist/{eval-inventory-HBWSWQOK.js → eval-inventory-Y6QRFOH5.js} +4 -4
- package/dist/{evidence-HWLBRH3Q.js → evidence-VD6736FQ.js} +67 -64
- package/dist/{evolve-FTZBMNVW.js → evolve-AL3NGVRL.js} +65 -62
- package/dist/{extensions-VHRBEID7.js → extensions-MOVJ32NM.js} +9 -7
- package/dist/{fleet-CKZHJWZJ.js → fleet-QZHUMAGI.js} +114 -111
- package/dist/{fleet-commands-EXDXBMV6.js → fleet-commands-BAYT5FJZ.js} +10 -10
- package/dist/{fleet-decisions-OTHB6KRL.js → fleet-decisions-IREVMRU4.js} +7 -6
- package/dist/{fleet-graph-YTEZUCUT.js → fleet-graph-YCTT3HTI.js} +22 -19
- package/dist/{fleet-inspect-SS6YMDCK.js → fleet-inspect-QVJTDAVB.js} +58 -55
- package/dist/{fleet-preflight-PBY4VYOM.js → fleet-preflight-25QAFPK4.js} +4 -4
- package/dist/{fleet-validate-KMEM5L3S.js → fleet-validate-5O57AAJ7.js} +26 -23
- package/dist/{fleet-verify-QD5M7E7Q.js → fleet-verify-CPH2W2T6.js} +59 -56
- package/dist/{fleet-view-WAMJYNDT.js → fleet-view-SWBR3VGQ.js} +58 -55
- package/dist/{init-5XQRBOFV.js → init-J477LKZH.js} +82 -79
- package/dist/{interop-34TVO25M.js → interop-3FCM6XLG.js} +11 -11
- package/dist/{library-3QY6KF57.js → library-QUQEIUG6.js} +30 -27
- package/dist/{memory-L4UTIIIW.js → memory-SGGSEP65.js} +67 -64
- package/dist/{models-ZVX3QOWE.js → models-HEKUAXXK.js} +53 -46
- package/dist/{monitor-CEKVSYTS.js → monitor-HKU57TYQ.js} +63 -60
- package/dist/{orchestrator-77BAP6BC.js → orchestrator-VDFAEFAI.js} +1831 -1057
- package/dist/{panes-7STHOAUJ.js → panes-DN2SSFOH.js} +5 -5
- package/dist/{panes-SHAUIRXY.js → panes-TALGNPZT.js} +29 -14
- package/dist/{paths-L7LGY6RN.js → paths-NBMFAIEZ.js} +5 -5
- package/dist/reset-EAJFFJVB.js +344 -0
- package/dist/{resources-74GKTLSF.js → resources-OVKSEFVE.js} +29 -20
- package/dist/{run-HBAUJNNZ.js → run-7DP7ZF2J.js} +120 -115
- package/dist/{share-G3APVLVP.js → share-WML67FT3.js} +32 -27
- package/dist/{skills-35HHUKCR.js → skills-SG662R2K.js} +41 -31
- package/dist/{skills-eval-QN4HSHDC.js → skills-eval-VVZEUU46.js} +78 -77
- package/dist/{skills-inventory-J357J34F.js → skills-inventory-I2E23GET.js} +23 -20
- package/dist/{slash-commands-JZZCQA32.js → slash-commands-S7MBJDQK.js} +40 -36
- package/dist/{steer-XAVHJM22.js → steer-2LQOMCPB.js} +3 -3
- package/dist/{support-U7QOWY26.js → support-CC2UJBJ6.js} +6 -6
- package/dist/{targets-DSM6CY3M.js → targets-4QC3HIEW.js} +54 -54
- package/dist/{terminal-lease-JOPFUVEM.js → terminal-lease-TUHIJ6Y2.js} +5 -5
- package/dist/{tools-MKNWVPBH.js → tools-TFGJICCU.js} +10 -10
- package/dist/{trace-ECQ7TIYZ.js → trace-FXMXUZUF.js} +55 -7
- package/dist/uninstall-5PEVOE5B.js +408 -0
- package/dist/upgrade-M4WXY6KN.js +303 -0
- package/dist/{usage-X52N3IDJ.js → usage-N7ZNVLEM.js} +151 -104
- package/dist/{verifiers-EJTVVSMA.js → verifiers-DJTP4XX6.js} +15 -15
- package/dist/{verify-YJL6XET2.js → verify-RWE4PPEK.js} +9 -9
- package/dist/{web-fetch-MPIFL3LL.js → web-fetch-MPARV2K7.js} +2 -2
- package/dist/{wiki-generate-4NDZTQ4B.js → wiki-generate-C7IQOXSP.js} +89 -86
- package/dist/{with-panes-OBOBFIIR.js → with-panes-4GCGSL7J.js} +53 -257
- package/dist/worker/entry.js +90 -74
- package/docs/README.md +176 -81
- package/docs/{acp.md → architecture/acp.md} +36 -20
- package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
- package/docs/{architecture.md → architecture/architecture.md} +43 -22
- package/docs/{artifact-placement.md → architecture/artifact-placement.md} +27 -23
- package/docs/architecture/artifact-versions.md +90 -0
- package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
- package/docs/{context-engine.md → architecture/context-engine.md} +29 -25
- package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
- package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
- package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
- package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
- package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
- package/docs/{model-catalog.md → architecture/model-catalog.md} +61 -27
- package/docs/{observability.md → architecture/observability.md} +38 -14
- package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
- package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +57 -20
- package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +99 -25
- package/docs/{safety-model.md → architecture/safety-model.md} +35 -20
- package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
- package/docs/architecture/time-conventions.md +125 -0
- package/docs/{trace-store.md → architecture/trace-store.md} +13 -5
- package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
- package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
- package/docs/{built-in-agents.md → guide/built-in-agents.md} +65 -35
- package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +66 -61
- package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -297
- package/docs/guide/configuration-reference.md +1163 -0
- package/docs/{environment-variables.md → guide/environment-variables.md} +33 -28
- package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +6 -3
- package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
- package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +39 -43
- package/docs/{glossary.md → guide/glossary.md} +14 -11
- package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +81 -17
- package/docs/guide/panes-and-files.md +290 -0
- package/docs/{proactive-memory.md → guide/proactive-memory.md} +131 -107
- package/docs/{resource-library.md → guide/resource-library.md} +13 -4
- package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +25 -3
- package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
- package/docs/{troubleshooting.md → guide/troubleshooting.md} +9 -4
- package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +11 -11
- package/docs/{release-cut-checklist.md → history/release-cut-checklist.md} +29 -2
- package/docs/process/development-pipeline.md +152 -0
- package/docs/process/documentation-coverage.md +100 -0
- package/docs/process/documentation-guide.md +187 -0
- package/docs/{eval-runner.md → process/eval-runner.md} +108 -53
- package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
- package/docs/{evolution.md → process/evolution.md} +2 -2
- package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +11 -7
- package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
- package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
- package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
- package/evals/README.md +2 -2
- package/evals/behavioral-model.yaml +3 -2
- package/package.json +10 -8
- package/skills/README.md +52 -41
- package/skills/coding/ast-grep/SKILL.md +102 -31
- package/skills/coding/ast-grep/evals.md +26 -0
- package/skills/coding/coding-standards/SKILL.md +41 -6
- package/skills/coding/coding-standards/evals.md +23 -0
- package/skills/coding/prototype/SKILL.md +88 -29
- package/skills/coding/prototype/evals.md +19 -0
- package/skills/coding/tdd/SKILL.md +81 -54
- package/skills/coding/tdd/evals.md +20 -0
- package/skills/context/context-handoff/SKILL.md +44 -3
- package/skills/context/context-handoff/evals.md +44 -0
- package/skills/context/context-prime/SKILL.md +46 -16
- package/skills/context/context-prime/evals.md +45 -0
- package/skills/git/branch-closeout/SKILL.md +132 -0
- package/skills/git/branch-closeout/evals.md +133 -0
- package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
- package/skills/git/file-ticket/SKILL.md +78 -64
- package/skills/git/file-ticket/assets/issue-template.md +22 -0
- package/skills/git/file-ticket/evals.md +31 -26
- package/skills/git/file-ticket/references/issue-discovery.md +49 -0
- package/skills/git/fix-issue/SKILL.md +88 -65
- package/skills/git/fix-issue/evals.md +35 -31
- package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
- package/skills/git/resolve-merge-conflicts/SKILL.md +101 -52
- package/skills/git/resolve-merge-conflicts/evals.md +52 -25
- package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
- package/skills/git/ship/SKILL.md +103 -67
- package/skills/git/ship/assets/pr-template.md +21 -0
- package/skills/git/ship/evals.md +44 -28
- package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
- package/skills/git/worktree-create/SKILL.md +80 -50
- package/skills/git/worktree-create/evals.md +40 -33
- package/skills/git/worktree-create/references/worktree-setup.md +62 -66
- package/skills/git/worktree-merge/SKILL.md +112 -65
- package/skills/git/worktree-merge/evals.md +42 -34
- package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
- package/skills/meta/clio-coder-dev/SKILL.md +9 -5
- package/skills/meta/clio-coder-dev/evals.md +3 -2
- package/skills/meta/clio-coder-test/SKILL.md +102 -95
- package/skills/meta/clio-coder-test/evals.md +9 -4
- package/skills/meta/clio-coder-test/references/harness.md +100 -124
- package/skills/meta/clio-coder-test/references/test-map.md +77 -50
- package/skills/meta/credentials/SKILL.md +2 -2
- package/skills/meta/find-skills/SKILL.md +2 -2
- package/skills/meta/herdr/SKILL.md +2 -2
- package/skills/meta/skill-craft/SKILL.md +22 -16
- package/skills/planning/archify/SKILL.md +196 -0
- package/skills/planning/archify/evals.md +65 -0
- package/skills/planning/architecture/SKILL.md +62 -13
- package/skills/planning/architecture/evals.md +65 -0
- package/skills/planning/backlog/SKILL.md +131 -15
- package/skills/planning/backlog/evals.md +142 -0
- package/skills/planning/prd/SKILL.md +47 -7
- package/skills/planning/prd/evals.md +54 -0
- package/skills/planning/product-intent/SKILL.md +58 -3
- package/skills/planning/product-intent/evals.md +70 -0
- package/skills/planning/tech-spec/SKILL.md +54 -3
- package/skills/planning/tech-spec/evals.md +73 -0
- package/skills/registry.yaml +70 -62
- package/skills/remote.yaml +13 -0
- package/skills/research/arxiv-literature/SKILL.md +77 -19
- package/skills/research/arxiv-literature/evals.md +50 -0
- package/skills/research/experiment-protocol/SKILL.md +21 -2
- package/skills/research/experiment-protocol/evals.md +23 -0
- package/skills/research/scientific-debugging/SKILL.md +24 -2
- package/skills/research/scientific-debugging/evals.md +18 -0
- package/skills/research/scientific-modernization/SKILL.md +27 -2
- package/skills/research/scientific-modernization/evals.md +27 -0
- package/skills/skill-marketplace.json +97 -62
- package/skills/workflow/cut-it/SKILL.md +66 -6
- package/skills/workflow/cut-it/evals.md +101 -0
- package/skills/workflow/design-council/SKILL.md +118 -28
- package/skills/workflow/design-council/evals.md +161 -0
- package/skills/workflow/grill-me/SKILL.md +87 -11
- package/skills/workflow/grill-me/evals.md +153 -0
- package/skills/workflow/workflow-distiller/SKILL.md +77 -18
- package/skills/workflow/workflow-distiller/evals.md +118 -0
- package/src/cli/args.ts +2 -2
- package/src/cli/bootstrap-generate.ts +1 -1
- package/src/cli/config-inspect.ts +65 -12
- package/src/cli/configure-interop.ts +105 -13
- package/src/cli/configure-oauth.ts +57 -0
- package/src/cli/configure-onboarding.ts +980 -0
- package/src/cli/configure-target.ts +594 -0
- package/src/cli/configure.ts +1082 -532
- package/src/cli/context-map.ts +114 -0
- package/src/cli/context.ts +4 -0
- package/src/cli/docs.ts +22 -14
- package/src/cli/doctor-naming.ts +5 -5
- package/src/cli/doctor-toolchain.ts +3 -3
- package/src/cli/eval.ts +1 -2
- package/src/cli/extensions.ts +2 -1
- package/src/cli/fleet.ts +1 -1
- package/src/cli/index.ts +3 -1
- package/src/cli/internal-dispatch.ts +3 -4
- package/src/cli/lifecycle-presenter.ts +436 -0
- package/src/cli/models.ts +10 -2
- package/src/cli/modes/print.ts +5 -1
- package/src/cli/panes.ts +19 -5
- package/src/cli/reset.ts +228 -106
- package/src/cli/run.ts +9 -4
- package/src/cli/select.ts +664 -0
- package/src/cli/share.ts +5 -1
- package/src/cli/skills-eval.ts +3 -3
- package/src/cli/skills.ts +9 -2
- package/src/cli/targets.ts +5 -6
- package/src/cli/trace.ts +55 -4
- package/src/cli/uninstall.ts +233 -165
- package/src/cli/upgrade.ts +204 -149
- package/src/cli/usage.ts +86 -27
- package/src/cli/validate-model.ts +3 -3
- package/src/cli/wiki-generate.ts +1 -1
- package/src/core/artifact-paths.ts +1 -1
- package/src/core/bash-exec.ts +131 -86
- package/src/core/bus-events.ts +51 -6
- package/src/core/config.ts +61 -1
- package/src/core/defaults.ts +7 -4
- package/src/core/dispatch-outcome.ts +16 -0
- package/src/core/external-diagnostic.ts +44 -0
- package/src/core/gateway-routing.ts +157 -0
- package/src/core/guardrails.ts +10 -49
- package/src/core/prompt-hint.ts +9 -0
- package/src/core/safe-exec.ts +17 -2
- package/src/core/skill-activation.ts +89 -2
- package/src/domains/agents/builtins/architect.md +2 -3
- package/src/domains/agents/builtins/coder.md +3 -2
- package/src/domains/agents/builtins/debugger.md +2 -2
- package/src/domains/agents/builtins/documenter.md +2 -2
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/oracle.md +1 -1
- package/src/domains/agents/builtins/provenance.md +1 -1
- package/src/domains/agents/builtins/researcher.md +1 -1
- package/src/domains/agents/builtins/scout.md +1 -1
- package/src/domains/agents/builtins/tester.md +2 -2
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +1 -1
- package/src/domains/agents/builtins/world-knowledge.md +31 -0
- package/src/domains/agents/catalog.ts +13 -15
- package/src/domains/agents/contract.ts +2 -0
- package/src/domains/agents/extension.ts +23 -1
- package/src/domains/agents/result-contract.ts +70 -0
- package/src/domains/config/keybindings.ts +8 -0
- package/src/domains/context/extension.ts +0 -3
- package/src/domains/context/wiki/map-seed.ts +589 -0
- package/src/domains/context/wiki/plan.ts +2 -2
- package/src/domains/context/working-set/path-index.ts +1 -0
- package/src/domains/dispatch/admission.ts +29 -0
- package/src/domains/dispatch/agent-candidates.ts +10 -0
- package/src/domains/dispatch/budget-envelope.ts +86 -1
- package/src/domains/dispatch/capability-match.ts +11 -0
- package/src/domains/dispatch/capacity-lease.ts +17 -0
- package/src/domains/dispatch/contract.ts +11 -1
- package/src/domains/dispatch/extension.ts +237 -49
- package/src/domains/dispatch/host-verification.ts +435 -39
- package/src/domains/dispatch/intent-requirements.ts +10 -0
- package/src/domains/dispatch/intent.ts +18 -1
- package/src/domains/dispatch/path-scope.ts +235 -24
- package/src/domains/dispatch/run-event-journal.ts +4 -15
- package/src/domains/dispatch/state.ts +2 -3
- package/src/domains/dispatch/transport.ts +45 -21
- package/src/domains/dispatch/types.ts +58 -3
- package/src/domains/dispatch/worker-model-metadata.ts +38 -0
- package/src/domains/eval/artifacts/store.ts +5 -0
- package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
- package/src/domains/eval/metrics/token-stream.ts +201 -31
- package/src/domains/eval/metrics/tracked.ts +40 -4
- package/src/domains/eval/runners/clio-run.ts +5 -2
- package/src/domains/eval/schema/suite.ts +28 -0
- package/src/domains/eval/schema/verdict.ts +2 -2
- package/src/domains/eval/store.ts +8 -1
- package/src/domains/eval/suites/resolve.ts +13 -1
- package/src/domains/eval/suites/run.ts +24 -3
- package/src/domains/evidence/trust-status.ts +10 -1
- package/src/domains/extensions/contract.ts +15 -1
- package/src/domains/extensions/discovery.ts +238 -41
- package/src/domains/extensions/extension.ts +105 -6
- package/src/domains/extensions/index.ts +24 -0
- package/src/domains/extensions/integrity.ts +189 -0
- package/src/domains/extensions/manager.ts +17 -1
- package/src/domains/extensions/resource-path.ts +27 -0
- package/src/domains/extensions/resources.ts +18 -38
- package/src/domains/extensions/snapshot-store.ts +39 -0
- package/src/domains/extensions/snapshot.ts +180 -0
- package/src/domains/extensions/state.ts +385 -57
- package/src/domains/extensions/types.ts +118 -1
- package/src/domains/interop/registry.ts +6 -2
- package/src/domains/interop/types.ts +4 -0
- package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
- package/src/domains/lifecycle/migrations/index.ts +6 -0
- package/src/domains/lifecycle/naming-resources.ts +19 -4
- package/src/domains/lifecycle/naming-yazi.ts +10 -5
- package/src/domains/memory/task-memory-policy.ts +70 -26
- package/src/domains/memory/task-memory-telemetry.ts +1 -0
- package/src/domains/middleware/contract.ts +26 -0
- package/src/domains/middleware/extension.ts +24 -24
- package/src/domains/middleware/hook-receipts.ts +27 -4
- package/src/domains/middleware/hooks-io.ts +65 -32
- package/src/domains/middleware/hooks.ts +64 -0
- package/src/domains/middleware/index.ts +28 -5
- package/src/domains/middleware/marketplace-offer.ts +3 -35
- package/src/domains/middleware/memory-intervention.ts +127 -32
- package/src/domains/middleware/memory-step-endpoint.ts +3 -2
- package/src/domains/middleware/registrations.ts +326 -0
- package/src/domains/middleware/runtime.ts +28 -0
- package/src/domains/middleware/skills-reminder.ts +31 -2
- package/src/domains/middleware/snapshot.ts +20 -7
- package/src/domains/mux/contract.ts +38 -0
- package/src/domains/mux/detect.ts +6 -13
- package/src/domains/mux/index.ts +1 -1
- package/src/domains/mux/operations.ts +44 -5
- package/src/domains/mux/yazi/assets/yazi.toml +2 -2
- package/src/domains/mux/yazi/session.ts +53 -4
- package/src/domains/mux/yazi/theme.ts +117 -17
- package/src/domains/observability/compaction-usage.ts +118 -0
- package/src/domains/observability/contract.ts +10 -11
- package/src/domains/observability/cost.ts +1 -1
- package/src/domains/observability/extension.ts +17 -4
- package/src/domains/observability/out-of-turn-usage.ts +52 -21
- package/src/domains/observability/projection.ts +14 -90
- package/src/domains/observability/trace-store.ts +43 -7
- package/src/domains/prompts/compiler.ts +73 -53
- package/src/domains/prompts/contract.ts +15 -3
- package/src/domains/prompts/extension.ts +97 -9
- package/src/domains/prompts/fragments/identity/clio-worker.md +1 -3
- package/src/domains/prompts/fragments/identity/clio.md +6 -12
- package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
- package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
- package/src/domains/prompts/fragments/operating/contract.md +7 -15
- package/src/domains/prompts/fragments/operating/delegation.md +32 -34
- package/src/domains/prompts/fragments/operating/skills.md +10 -24
- package/src/domains/prompts/fragments/operating/worker.md +1 -8
- package/src/domains/providers/contract.ts +4 -1
- package/src/domains/providers/extension.ts +40 -9
- package/src/domains/providers/index.ts +1 -1
- package/src/domains/providers/model-capabilities.ts +9 -0
- package/src/domains/providers/model-discovery.ts +2 -0
- package/src/domains/providers/model-runtime-capabilities.ts +99 -25
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +699 -114
- package/src/domains/providers/runtime-resolution.ts +31 -0
- package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
- package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
- package/src/domains/providers/runtimes/common/probe-helpers.ts +7 -2
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
- package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
- package/src/domains/providers/support.ts +11 -5
- package/src/domains/providers/target-model-cache.ts +25 -2
- package/src/domains/providers/types/capability-flags.ts +2 -0
- package/src/domains/providers/types/cost-provenance.ts +19 -0
- package/src/domains/providers/types/local-model-quirks.ts +85 -37
- package/src/domains/providers/types/runtime-descriptor.ts +20 -1
- package/src/domains/providers/types/target-descriptor.ts +19 -0
- package/src/domains/resources/index.ts +3 -0
- package/src/domains/resources/skills/install.ts +72 -7
- package/src/domains/resources/skills/loader.ts +23 -19
- package/src/domains/resources/skills/marketplace.ts +63 -11
- package/src/domains/safety/autonomy.ts +15 -0
- package/src/domains/safety/call-target.ts +1 -1
- package/src/domains/safety/index.ts +1 -0
- package/src/domains/safety/loop-detector.ts +7 -4
- package/src/domains/safety/path-policy.ts +1 -1
- package/src/domains/safety/policy-engine.ts +34 -11
- package/src/domains/safety/protected-artifacts.ts +191 -88
- package/src/domains/safety/run-effects.ts +2 -22
- package/src/domains/safety/skill-authority.ts +55 -0
- package/src/domains/session/compaction/compact.ts +72 -22
- package/src/domains/session/entries.ts +6 -0
- package/src/domains/session/task-board.ts +10 -9
- package/src/domains/session/usage.ts +3 -3
- package/src/domains/share/archive.ts +164 -7
- package/src/engine/acp/server.ts +62 -9
- package/src/engine/agent.ts +13 -3
- package/src/engine/ai.ts +26 -8
- package/src/engine/antigravity/subprocess-runtime.ts +386 -120
- package/src/engine/api-registry.ts +3 -0
- package/src/engine/apis/llamacpp-residency.ts +3 -4
- package/src/engine/apis/lmstudio.ts +3 -3
- package/src/engine/apis/ollama-native.ts +6 -6
- package/src/engine/apis/openai-completions.ts +145 -39
- package/src/engine/apis/output-budget.ts +8 -18
- package/src/engine/apis/residency.ts +8 -27
- package/src/engine/external-subprocess.ts +114 -6
- package/src/engine/gemma-channel-filter.ts +19 -0
- package/src/engine/loop-guard.ts +92 -12
- package/src/engine/worker-runtime.ts +40 -11
- package/src/engine/worker-tools.ts +3 -1
- package/src/entry/background-model-metadata.ts +18 -0
- package/src/entry/compaction-prompt.ts +57 -0
- package/src/entry/extension-hook-sources.ts +28 -0
- package/src/entry/extension-reload.ts +309 -0
- package/src/entry/orchestrator.ts +464 -251
- package/src/entry/task-memory-lifecycle.ts +35 -0
- package/src/interactive/application-controller.ts +2 -1
- package/src/interactive/bus-notices.ts +8 -1
- package/src/interactive/chat-loop-messages.ts +16 -17
- package/src/interactive/chat-loop.ts +75 -3
- package/src/interactive/chat-panel.ts +36 -13
- package/src/interactive/chat-renderer.ts +72 -7
- package/src/interactive/cost-overlay.ts +26 -2
- package/src/interactive/dispatch-board.ts +6 -11
- package/src/interactive/footer/widgets.ts +13 -0
- package/src/interactive/interactive-application.ts +39 -4
- package/src/interactive/interactive-input-runtime.ts +4 -0
- package/src/interactive/interactive-presentation.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +4 -1
- package/src/interactive/overlays/extensions.ts +9 -1
- package/src/interactive/overlays/help-reference.ts +13 -0
- package/src/interactive/overlays/settings.ts +27 -16
- package/src/interactive/panes-runtime.ts +111 -35
- package/src/interactive/prompt-cache-identity.ts +88 -0
- package/src/interactive/renderers/worker-entry.ts +32 -0
- package/src/interactive/slash-commands.ts +153 -20
- package/src/interactive/stream-pacing-policy.ts +0 -23
- package/src/interactive/theme/labels.ts +19 -13
- package/src/interactive/turn-context.ts +39 -20
- package/src/interactive/turn-recovery.ts +8 -0
- package/src/interactive/turn-runtime.ts +27 -11
- package/src/interactive/turn-state.ts +7 -0
- package/src/interactive/worker-receipts.ts +1 -0
- package/src/interactive/worker-stream.ts +6 -1
- package/src/interactive/yazi-bridge.ts +60 -6
- package/src/tools/agent-tools.ts +30 -1
- package/src/tools/artifact.ts +2 -2
- package/src/tools/ask-user.ts +3 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +52 -22
- package/src/tools/codewiki/code-nav-surface.ts +6 -0
- package/src/tools/codewiki/code-nav.ts +99 -13
- package/src/tools/context/docs-engine.ts +20 -7
- package/src/tools/context/index.ts +59 -21
- package/src/tools/core-bootstrap.ts +28 -6
- package/src/tools/credential-present.ts +1 -2
- package/src/tools/dispatch-arguments.ts +6 -1
- package/src/tools/dispatch-event-text.ts +10 -0
- package/src/tools/dispatch-plan.ts +49 -4
- package/src/tools/dispatch-run-events.ts +1 -1
- package/src/tools/dispatch-runner.ts +12 -0
- package/src/tools/dispatch-schema.ts +338 -0
- package/src/tools/dispatch-types.ts +3 -0
- package/src/tools/dispatch.ts +9 -254
- package/src/tools/ledger.ts +3 -5
- package/src/tools/monitor-surface.ts +5 -13
- package/src/tools/observation.ts +4 -5
- package/src/tools/panes-surface.ts +4 -11
- package/src/tools/panes.ts +4 -2
- package/src/tools/policy.ts +15 -2
- package/src/tools/read.ts +5 -6
- package/src/tools/registry.ts +41 -12
- package/src/tools/result-shaping.ts +18 -14
- package/src/tools/steer-surface.ts +1 -1
- package/src/tools/tasks.ts +1 -1
- package/src/tools/truncate.ts +6 -5
- package/src/tools/verify/surface.ts +6 -12
- package/src/tools/web-fetch-surface.ts +1 -3
- package/src/tools/worker-evidence.ts +3 -1
- package/src/worker/spec-contract.ts +4 -0
- package/dist/builtins-UJLMOVOV.js +0 -17
- package/dist/chunk-5QIAJV2D.js +0 -48
- package/dist/chunk-JZWT5J3Y.js +0 -814
- package/dist/chunk-K7VKOLQQ.js +0 -15
- package/dist/chunk-PMZCIOCJ.js +0 -25
- package/dist/chunk-SUW5DORT.js +0 -819
- package/dist/chunk-UOV2BYIW.js +0 -107
- package/dist/chunk-WR6U3OVP.js +0 -45
- package/dist/chunk-Y45G3AXC.js +0 -1558
- package/dist/reset-EOLM7GVE.js +0 -230
- package/dist/uninstall-N34PCTGJ.js +0 -331
- package/dist/upgrade-H7TOM7YL.js +0 -323
- package/docs/artifact-versions.md +0 -67
- package/docs/development-pipeline.md +0 -121
- package/docs/documentation-coverage.md +0 -46
- package/docs/documentation-guide.md +0 -167
- package/docs/time-conventions.md +0 -101
|
@@ -39,6 +39,24 @@ export interface LmStudioTargetSettings {
|
|
|
39
39
|
request?: LmStudioRequestSettings;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
+
/** Per-request controls understood by a LiteLLM proxy. Values are optional so server policy remains authoritative by default. */
|
|
43
|
+
export interface LiteLLMRequestSettings {
|
|
44
|
+
/** Extra LiteLLM request tags. Clio always adds `clio-coder`. */
|
|
45
|
+
tags?: string[];
|
|
46
|
+
/** Forward Clio's stable session id as `x-litellm-session-id`. Defaults to true. */
|
|
47
|
+
sendSessionId?: boolean;
|
|
48
|
+
/** Override the proxy/upstream request timeout through `x-litellm-timeout`. */
|
|
49
|
+
timeoutSeconds?: number;
|
|
50
|
+
/** Override LiteLLM's streamed-response timeout through `x-litellm-stream-timeout`. */
|
|
51
|
+
streamTimeoutSeconds?: number;
|
|
52
|
+
/** Override LiteLLM router retries for this request; this does not enable client-side SDK retries. */
|
|
53
|
+
numRetries?: number;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface LiteLLMTargetSettings {
|
|
57
|
+
request?: LiteLLMRequestSettings;
|
|
58
|
+
}
|
|
59
|
+
|
|
42
60
|
/**
|
|
43
61
|
* Persisted target specification from settings.yaml (`targets:`). It binds a
|
|
44
62
|
* user-facing target id to a RuntimeDescriptor id, target URL/auth metadata,
|
|
@@ -57,6 +75,7 @@ export interface TargetDescriptor {
|
|
|
57
75
|
gateway?: boolean;
|
|
58
76
|
pricing?: TargetPricing;
|
|
59
77
|
lmstudio?: LmStudioTargetSettings;
|
|
78
|
+
litellm?: LiteLLMTargetSettings;
|
|
60
79
|
/** Explicit request-slot limit for this inference endpoint. It overrides live discovery. */
|
|
61
80
|
maxConcurrentRequests?: number;
|
|
62
81
|
}
|
|
@@ -67,6 +67,7 @@ export {
|
|
|
67
67
|
modelVisibleSkills,
|
|
68
68
|
parsePendingSkillRequests,
|
|
69
69
|
parseSkillCommand,
|
|
70
|
+
SKILL_SURFACE_CLEAR_ARG,
|
|
70
71
|
type Skill,
|
|
71
72
|
type SkillCatalogInvalidReason,
|
|
72
73
|
type SkillCatalogValidity,
|
|
@@ -89,6 +90,8 @@ export {
|
|
|
89
90
|
type MarketplaceSkill,
|
|
90
91
|
type MarketplaceSkillOrigin,
|
|
91
92
|
type MarketplaceStatus,
|
|
93
|
+
marketplaceInstallShaping,
|
|
94
|
+
resolveMarketplaceShaping,
|
|
92
95
|
} from "./skills/marketplace.js";
|
|
93
96
|
export {
|
|
94
97
|
checkSkillDrift,
|
|
@@ -40,6 +40,20 @@ export interface InstallSkillInput {
|
|
|
40
40
|
force?: boolean;
|
|
41
41
|
/** Override the Clio config dir used for the user root (testing). */
|
|
42
42
|
configDir?: string;
|
|
43
|
+
/**
|
|
44
|
+
* Absolute path of a local directory whose files are copied over the fetched
|
|
45
|
+
* source before the install lands. Its SKILL.md becomes the installed skill
|
|
46
|
+
* text, so the provenance stamps and the pinned hash describe the overlay.
|
|
47
|
+
*/
|
|
48
|
+
overlay?: string;
|
|
49
|
+
/** Top-level names dropped from the fetched source before the overlay is applied. */
|
|
50
|
+
exclude?: string[];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** The overlay and exclude list a marketplace entry attaches to a source URL. */
|
|
54
|
+
export interface SkillInstallShaping {
|
|
55
|
+
overlay?: string;
|
|
56
|
+
exclude?: string[];
|
|
43
57
|
}
|
|
44
58
|
|
|
45
59
|
export interface InstallSkillResult {
|
|
@@ -68,6 +82,12 @@ export interface UpdateSkillsInput {
|
|
|
68
82
|
all?: boolean;
|
|
69
83
|
/** Overwrite local modifications. */
|
|
70
84
|
force?: boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Recovers the overlay and exclude list an installed skill was shaped with,
|
|
87
|
+
* keyed by its name and recorded source URL. Without it an update of a
|
|
88
|
+
* remote-entry skill would refetch bare upstream and drop the wrapper.
|
|
89
|
+
*/
|
|
90
|
+
resolveShaping?: (skill: { name: string; sourceUrl: string }) => SkillInstallShaping | undefined;
|
|
71
91
|
}
|
|
72
92
|
|
|
73
93
|
/**
|
|
@@ -252,17 +272,51 @@ function fetchSource(spec: SkillSourceSpec): FetchedSource {
|
|
|
252
272
|
}
|
|
253
273
|
}
|
|
254
274
|
|
|
255
|
-
function copySkillDir(from: string, to: string): void {
|
|
275
|
+
function copySkillDir(from: string, to: string, exclude: ReadonlyArray<string> = []): void {
|
|
256
276
|
mkdirSync(path.dirname(to), { recursive: true });
|
|
277
|
+
const excluded = new Set(exclude);
|
|
257
278
|
cpSync(from, to, {
|
|
258
279
|
recursive: true,
|
|
259
280
|
filter: (source) => {
|
|
260
281
|
const base = path.basename(source);
|
|
261
|
-
|
|
282
|
+
if (base === ".git" || base === "node_modules") return false;
|
|
283
|
+
// `exclude` names top-level members only, so a nested `test/` inside
|
|
284
|
+
// a renderer stays where the upstream package put it.
|
|
285
|
+
return !(excluded.size > 0 && path.dirname(source) === from && excluded.has(base));
|
|
262
286
|
},
|
|
263
287
|
});
|
|
264
288
|
}
|
|
265
289
|
|
|
290
|
+
/**
|
|
291
|
+
* Shape a fetched source the way a marketplace remote entry asks: drop the
|
|
292
|
+
* excluded top-level members, then lay the overlay's files on top. The result
|
|
293
|
+
* is a fresh temporary tree so the fetched source (which may be an operator's
|
|
294
|
+
* own local directory) is never modified, and validation runs against what
|
|
295
|
+
* will actually be installed.
|
|
296
|
+
*/
|
|
297
|
+
function shapeSource(fetched: FetchedSource, shaping: SkillInstallShaping): FetchedSource {
|
|
298
|
+
const exclude = shaping.exclude ?? [];
|
|
299
|
+
if (!shaping.overlay && exclude.length === 0) return fetched;
|
|
300
|
+
if (shaping.overlay && !existsSync(shaping.overlay)) {
|
|
301
|
+
fetched.cleanup();
|
|
302
|
+
throw new Error(`skill overlay directory does not exist: ${shaping.overlay}`);
|
|
303
|
+
}
|
|
304
|
+
const tmp = mkdtempSync(path.join(tmpdir(), "clio-coder-skill-shape-"));
|
|
305
|
+
const shaped = path.join(tmp, "skill");
|
|
306
|
+
const cleanup = (): void => {
|
|
307
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
308
|
+
fetched.cleanup();
|
|
309
|
+
};
|
|
310
|
+
try {
|
|
311
|
+
copySkillDir(fetched.skillDir, shaped, exclude);
|
|
312
|
+
if (shaping.overlay) copySkillDir(shaping.overlay, shaped);
|
|
313
|
+
return { skillDir: resolveSkillDir(shaped), cleanup };
|
|
314
|
+
} catch (err) {
|
|
315
|
+
cleanup();
|
|
316
|
+
throw err instanceof Error ? err : new Error(String(err));
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
266
320
|
let skillSwapSequence = 0;
|
|
267
321
|
|
|
268
322
|
/**
|
|
@@ -328,7 +382,7 @@ export function installSkillFromSource(input: InstallSkillInput): InstallSkillRe
|
|
|
328
382
|
const cwd = input.cwd ?? process.cwd();
|
|
329
383
|
const scope = input.scope ?? "project";
|
|
330
384
|
|
|
331
|
-
const fetched = fetchSource(spec);
|
|
385
|
+
const fetched = shapeSource(fetchSource(spec), input);
|
|
332
386
|
try {
|
|
333
387
|
const { skill, warnings } = validateSourceSkill(fetched.skillDir);
|
|
334
388
|
const name = (input.name ?? skill.name).trim();
|
|
@@ -385,13 +439,18 @@ function managedSkills(cwd: string, configDir?: string): Skill[] {
|
|
|
385
439
|
);
|
|
386
440
|
}
|
|
387
441
|
|
|
388
|
-
function updateOne(skill: Skill, force: boolean): SkillUpdateReport {
|
|
442
|
+
function updateOne(skill: Skill, force: boolean, shaping: SkillInstallShaping = {}): SkillUpdateReport {
|
|
389
443
|
const sourceUrl = skill.provenance?.installUrl;
|
|
390
444
|
if (!sourceUrl) return { name: skill.name, status: "no-source", detail: "no source-url provenance recorded" };
|
|
391
445
|
const spec = parseSkillSourceSpec(sourceUrl);
|
|
392
446
|
if (!spec) return { name: skill.name, status: "error", detail: `unsupported source-url: ${sourceUrl}` };
|
|
393
447
|
|
|
394
|
-
|
|
448
|
+
let fetched: FetchedSource;
|
|
449
|
+
try {
|
|
450
|
+
fetched = shapeSource(fetchSource(spec), shaping);
|
|
451
|
+
} catch (err) {
|
|
452
|
+
return { name: skill.name, status: "error", detail: err instanceof Error ? err.message : String(err) };
|
|
453
|
+
}
|
|
395
454
|
try {
|
|
396
455
|
// The same gate a fresh install passes. Upstream may have moved on to a
|
|
397
456
|
// SKILL.md that no longer loads, and without this an update replaces a
|
|
@@ -441,11 +500,17 @@ function updateOne(skill: Skill, force: boolean): SkillUpdateReport {
|
|
|
441
500
|
export function updateSkills(input: UpdateSkillsInput = {}): SkillUpdateReport[] {
|
|
442
501
|
const cwd = input.cwd ?? process.cwd();
|
|
443
502
|
const skills = managedSkills(cwd, input.configDir);
|
|
503
|
+
const shapingFor = (skill: Skill): SkillInstallShaping =>
|
|
504
|
+
(skill.provenance?.installUrl &&
|
|
505
|
+
input.resolveShaping?.({ name: skill.name, sourceUrl: skill.provenance.installUrl })) ||
|
|
506
|
+
{};
|
|
444
507
|
if (input.name) {
|
|
445
508
|
const skill = skills.find((entry) => entry.name === input.name);
|
|
446
509
|
if (!skill) return [{ name: input.name, status: "error", detail: "not found in Clio-managed skill roots" }];
|
|
447
|
-
return [updateOne(skill, input.force === true)];
|
|
510
|
+
return [updateOne(skill, input.force === true, shapingFor(skill))];
|
|
448
511
|
}
|
|
449
512
|
if (input.all !== true) throw new Error("updateSkills requires a name or all=true");
|
|
450
|
-
return skills
|
|
513
|
+
return skills
|
|
514
|
+
.filter((skill) => skill.provenance?.installUrl)
|
|
515
|
+
.map((skill) => updateOne(skill, input.force === true, shapingFor(skill)));
|
|
451
516
|
}
|
|
@@ -217,20 +217,8 @@ function defaultPrecedenceForScope(scope: ResourceScope): number {
|
|
|
217
217
|
* this gate with skills: both substitute another agent's project file into
|
|
218
218
|
* Clio's context, so one opt-in covers both.
|
|
219
219
|
*/
|
|
220
|
-
let warnedLegacyProjectTrustEnv = false;
|
|
221
|
-
|
|
222
220
|
export function projectCompatTrusted(explicit?: boolean): boolean {
|
|
223
|
-
|
|
224
|
-
if (process.env.CLIO_CODER_TRUST_PROJECT_RESOURCES === "1") return true;
|
|
225
|
-
if (process.env.CLIO_CODER_TRUST_PROJECT_SKILLS !== "1") return false;
|
|
226
|
-
if (!warnedLegacyProjectTrustEnv) {
|
|
227
|
-
warnedLegacyProjectTrustEnv = true;
|
|
228
|
-
process.emitWarning("CLIO_CODER_TRUST_PROJECT_SKILLS is deprecated; use CLIO_CODER_TRUST_PROJECT_RESOURCES instead", {
|
|
229
|
-
code: "CLIO_CODER_DEPRECATED_ENV",
|
|
230
|
-
type: "DeprecationWarning",
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
return true;
|
|
221
|
+
return explicit === true;
|
|
234
222
|
}
|
|
235
223
|
|
|
236
224
|
/**
|
|
@@ -453,7 +441,16 @@ function validateDescription(description: string | null): string[] {
|
|
|
453
441
|
return [];
|
|
454
442
|
}
|
|
455
443
|
|
|
456
|
-
|
|
444
|
+
/**
|
|
445
|
+
* The deprecation names the file: a bare "clio: skill metadata" warning at
|
|
446
|
+
* boot left the operator hunting across five compatibility roots for the
|
|
447
|
+
* SKILL.md that carried the key, and `doctor` scanned only two of them.
|
|
448
|
+
*/
|
|
449
|
+
function warnLegacySkillMetadata(filePath: string): void {
|
|
450
|
+
warnLegacyNaming(`clio: skill metadata in ${filePath}`, "clio-coder: skill metadata");
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
function extractMetadata(frontmatter: Record<string, unknown>, filePath: string): Record<string, unknown> {
|
|
457
454
|
const metadata: Record<string, unknown> = {};
|
|
458
455
|
for (const [key, value] of Object.entries(frontmatter)) {
|
|
459
456
|
if (CORE_FRONTMATTER_KEYS.has(key)) continue;
|
|
@@ -462,7 +459,7 @@ function extractMetadata(frontmatter: Record<string, unknown>): Record<string, u
|
|
|
462
459
|
continue;
|
|
463
460
|
}
|
|
464
461
|
if (key === "clio") {
|
|
465
|
-
|
|
462
|
+
warnLegacySkillMetadata(filePath);
|
|
466
463
|
if (!("clio-coder" in frontmatter)) metadata.clioCoder = value;
|
|
467
464
|
continue;
|
|
468
465
|
}
|
|
@@ -471,13 +468,13 @@ function extractMetadata(frontmatter: Record<string, unknown>): Record<string, u
|
|
|
471
468
|
return metadata;
|
|
472
469
|
}
|
|
473
470
|
|
|
474
|
-
function extractProvenance(frontmatter: Record<string, unknown
|
|
471
|
+
function extractProvenance(frontmatter: Record<string, unknown>, filePath: string): SkillProvenance | undefined {
|
|
475
472
|
// Provenance lives nested under the reserved `clio-coder:` block; the flat
|
|
476
473
|
// top-level keys remain readable for already-installed copies stamped
|
|
477
474
|
// before the nested form existed.
|
|
478
475
|
const canonicalRaw = frontmatter["clio-coder"];
|
|
479
476
|
const legacyRaw = frontmatter.clio;
|
|
480
|
-
if (legacyRaw !== undefined)
|
|
477
|
+
if (legacyRaw !== undefined) warnLegacySkillMetadata(filePath);
|
|
481
478
|
const clioCoderRaw = canonicalRaw ?? legacyRaw;
|
|
482
479
|
const clioCoder =
|
|
483
480
|
clioCoderRaw !== null && typeof clioCoderRaw === "object" && !Array.isArray(clioCoderRaw)
|
|
@@ -671,7 +668,7 @@ function loadSkillFile(
|
|
|
671
668
|
scope,
|
|
672
669
|
...(root.origin ? { source: root.origin } : {}),
|
|
673
670
|
};
|
|
674
|
-
const provenance = extractProvenance(parsed.frontmatter);
|
|
671
|
+
const provenance = extractProvenance(parsed.frontmatter, filePath);
|
|
675
672
|
const allowedTools = declaredToolSurface(parsed.frontmatter, "allowed-tools", filePath, diagnostics);
|
|
676
673
|
const disallowedTools = declaredToolSurface(parsed.frontmatter, "disallowed-tools", filePath, diagnostics);
|
|
677
674
|
const skill: Skill = {
|
|
@@ -691,7 +688,7 @@ function loadSkillFile(
|
|
|
691
688
|
pathSubject,
|
|
692
689
|
trusted: root.trusted ?? true,
|
|
693
690
|
precedence: root.precedence ?? defaultPrecedenceForScope(scope),
|
|
694
|
-
metadata: extractMetadata(parsed.frontmatter),
|
|
691
|
+
metadata: extractMetadata(parsed.frontmatter, filePath),
|
|
695
692
|
diagnostics,
|
|
696
693
|
...(provenance ? { provenance } : {}),
|
|
697
694
|
};
|
|
@@ -952,6 +949,13 @@ export function skillCatalogValidity(list: SkillList): SkillCatalogValidity {
|
|
|
952
949
|
return { ok: true, reason: null };
|
|
953
950
|
}
|
|
954
951
|
|
|
952
|
+
/**
|
|
953
|
+
* The one argument `/skill` reserves for itself: `/skill off` clears the tool
|
|
954
|
+
* surface an activated skill armed for the session instead of loading a skill
|
|
955
|
+
* by that name.
|
|
956
|
+
*/
|
|
957
|
+
export const SKILL_SURFACE_CLEAR_ARG = "off";
|
|
958
|
+
|
|
955
959
|
export function parseSkillCommand(input: string): { name: string; args: string } | null {
|
|
956
960
|
const trimmed = input.trim();
|
|
957
961
|
if (!trimmed.startsWith("/skill ")) return null;
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
installSkillFromSource,
|
|
10
10
|
isSkillName,
|
|
11
11
|
parseSkillSourceSpec,
|
|
12
|
+
type SkillInstallShaping,
|
|
12
13
|
} from "./install.js";
|
|
13
14
|
import { loadSkills, type Skill } from "./loader.js";
|
|
14
15
|
|
|
@@ -60,6 +61,14 @@ export interface MarketplaceSkill {
|
|
|
60
61
|
triggers?: string[];
|
|
61
62
|
origin: MarketplaceSkillOrigin;
|
|
62
63
|
requires?: LibraryRequirementRef[];
|
|
64
|
+
/**
|
|
65
|
+
* Remote entry: a package-root-relative directory whose files are copied
|
|
66
|
+
* over the fetched upstream tree at install. Clio owns only the overlay
|
|
67
|
+
* (typically a wrapper SKILL.md); the upstream renderer is never vendored.
|
|
68
|
+
*/
|
|
69
|
+
overlay?: string;
|
|
70
|
+
/** Remote entry: top-level upstream members dropped at install. */
|
|
71
|
+
exclude?: string[];
|
|
63
72
|
}
|
|
64
73
|
|
|
65
74
|
export type MarketplaceStatus = "installed" | "installable" | "unavailable";
|
|
@@ -181,6 +190,12 @@ function parseMarketplaceIndex(indexPath: string, diagnostics: string[] = []): M
|
|
|
181
190
|
const requires = Array.isArray(record.requires)
|
|
182
191
|
? record.requires.filter((entry): entry is LibraryRequirementRef => typeof entry === "string")
|
|
183
192
|
: undefined;
|
|
193
|
+
const overlay = optionalString(record.overlay);
|
|
194
|
+
if (overlay && (path.isAbsolute(overlay) || overlay.split("/").includes(".."))) {
|
|
195
|
+
diagnostics.push(`skill marketplace index entry has an overlay outside the package: ${skill.name}`);
|
|
196
|
+
return [];
|
|
197
|
+
}
|
|
198
|
+
const exclude = optionalTriggerList(record.exclude);
|
|
184
199
|
return [
|
|
185
200
|
{
|
|
186
201
|
kind,
|
|
@@ -192,6 +207,8 @@ function parseMarketplaceIndex(indexPath: string, diagnostics: string[] = []): M
|
|
|
192
207
|
...(category ? { category } : {}),
|
|
193
208
|
...(triggers ? { triggers } : {}),
|
|
194
209
|
...(requires ? { requires } : {}),
|
|
210
|
+
...(overlay ? { overlay } : {}),
|
|
211
|
+
...(exclude ? { exclude } : {}),
|
|
195
212
|
origin: "index" as const,
|
|
196
213
|
},
|
|
197
214
|
];
|
|
@@ -284,25 +301,32 @@ export function discoverMarketplaceSkills(options: DiscoverMarketplaceOptions =
|
|
|
284
301
|
const skills: MarketplaceSkill[] = [];
|
|
285
302
|
const seen = new Set<string>();
|
|
286
303
|
|
|
304
|
+
const indexPath =
|
|
305
|
+
options.indexPath === null ? null : (options.indexPath ?? process.env.CLIO_CODER_SKILL_MARKETPLACE_INDEX ?? null);
|
|
306
|
+
const resolvedIndexPath = indexPath ?? defaultIndexPath();
|
|
307
|
+
const indexSkills =
|
|
308
|
+
options.indexPath !== null && resolvedIndexPath && existsSync(resolvedIndexPath)
|
|
309
|
+
? parseMarketplaceIndex(resolvedIndexPath, diagnostics)
|
|
310
|
+
: [];
|
|
311
|
+
// A remote entry's overlay folder is also a catalog package on disk, but
|
|
312
|
+
// installing that folder alone would land the wrapper without the upstream
|
|
313
|
+
// it wraps. The index entry that names the overlay is the whole skill.
|
|
314
|
+
const overlayNames = new Set(indexSkills.filter((skill) => skill.overlay).map((skill) => skill.name));
|
|
315
|
+
|
|
287
316
|
// Catalog packages first: real local files beat index pointers on name collisions.
|
|
288
317
|
const catalogDir = resolveCatalogDir(options);
|
|
289
318
|
if (catalogDir) {
|
|
290
319
|
for (const skill of catalogSkills(catalogDir, diagnostics)) {
|
|
291
|
-
if (seen.has(skill.name)) continue;
|
|
320
|
+
if (seen.has(skill.name) || overlayNames.has(skill.name)) continue;
|
|
292
321
|
seen.add(skill.name);
|
|
293
322
|
skills.push(skill);
|
|
294
323
|
}
|
|
295
324
|
}
|
|
296
325
|
|
|
297
|
-
const
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
for (const skill of parseMarketplaceIndex(resolvedIndexPath, diagnostics)) {
|
|
302
|
-
if (seen.has(skill.name)) continue;
|
|
303
|
-
seen.add(skill.name);
|
|
304
|
-
skills.push(skill);
|
|
305
|
-
}
|
|
326
|
+
for (const skill of indexSkills) {
|
|
327
|
+
if (seen.has(skill.name)) continue;
|
|
328
|
+
seen.add(skill.name);
|
|
329
|
+
skills.push(skill);
|
|
306
330
|
}
|
|
307
331
|
|
|
308
332
|
if (skills.length === 0 && diagnostics.length === 0) {
|
|
@@ -315,6 +339,34 @@ export function getMarketplaceSkills(options: DiscoverMarketplaceOptions = {}):
|
|
|
315
339
|
return discoverMarketplaceSkills(options).skills;
|
|
316
340
|
}
|
|
317
341
|
|
|
342
|
+
/**
|
|
343
|
+
* The install shaping a marketplace entry carries, with its overlay resolved
|
|
344
|
+
* to an absolute directory under the package root. An entry with neither
|
|
345
|
+
* field shapes nothing, so the caller can spread the result unconditionally.
|
|
346
|
+
*/
|
|
347
|
+
export function marketplaceInstallShaping(skill: MarketplaceSkill): SkillInstallShaping {
|
|
348
|
+
const shaping: SkillInstallShaping = {};
|
|
349
|
+
if (skill.overlay) shaping.overlay = path.join(resolvePackageRoot(), skill.overlay);
|
|
350
|
+
if (skill.exclude && skill.exclude.length > 0) shaping.exclude = [...skill.exclude];
|
|
351
|
+
return shaping;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* Recover the shaping for an installed skill by name and recorded source URL,
|
|
356
|
+
* for `updateSkills`. Only a marketplace entry that still points at the same
|
|
357
|
+
* upstream URL applies; a skill installed from a URL the index no longer
|
|
358
|
+
* carries updates bare, as it was installed.
|
|
359
|
+
*/
|
|
360
|
+
export function resolveMarketplaceShaping(options: DiscoverMarketplaceOptions = {}) {
|
|
361
|
+
return (installed: { name: string; sourceUrl: string }): SkillInstallShaping | undefined => {
|
|
362
|
+
const entry = getMarketplaceSkills(options).find(
|
|
363
|
+
(skill) => skill.name === installed.name && skill.sourceUrl === installed.sourceUrl,
|
|
364
|
+
);
|
|
365
|
+
if (!entry || (!entry.overlay && !entry.exclude)) return undefined;
|
|
366
|
+
return marketplaceInstallShaping(entry);
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
|
|
318
370
|
/**
|
|
319
371
|
* The single install entry point for every frontend (headless CLI, TUI
|
|
320
372
|
* pending-skill prompt, skills hub). Source resolution, in precedence order:
|
|
@@ -339,7 +391,7 @@ export function installSkill(input: InstallSkillInput): InstallSkillResult {
|
|
|
339
391
|
if (!skill) {
|
|
340
392
|
throw new Error(`"${source}" is neither an existing local path nor available in the local marketplace`);
|
|
341
393
|
}
|
|
342
|
-
return installSkillFromSource({ ...input, source: skill.sourceUrl });
|
|
394
|
+
return installSkillFromSource({ ...input, ...marketplaceInstallShaping(skill), source: skill.sourceUrl });
|
|
343
395
|
}
|
|
344
396
|
return installSkillFromSource({ ...input, source });
|
|
345
397
|
}
|
|
@@ -68,6 +68,21 @@ export interface AutonomyMappingOptions {
|
|
|
68
68
|
exposure?: AutonomyExposure;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
+
/**
|
|
72
|
+
* Whether the model may activate an installed skill itself rather than
|
|
73
|
+
* emitting the suggestion anchor and waiting for the operator to type
|
|
74
|
+
* `/skill <name>`.
|
|
75
|
+
*
|
|
76
|
+
* At `read-only` and `suggest` the operator asked to be consulted before the
|
|
77
|
+
* agent acts, and activation is an action. At `auto-edit` and `full-auto` they
|
|
78
|
+
* already said otherwise, and a skill can only narrow the tool surface, never
|
|
79
|
+
* widen it, so the gate buys no safety there. The level is the opt-in; there is
|
|
80
|
+
* no per-skill frontmatter flag for this.
|
|
81
|
+
*/
|
|
82
|
+
export function modelMayActivateSkills(level: AutonomyLevel): boolean {
|
|
83
|
+
return level === "auto-edit" || level === "full-auto";
|
|
84
|
+
}
|
|
85
|
+
|
|
71
86
|
/**
|
|
72
87
|
* The §2.3 level-dependent matrix. `git_destructive` never reaches this
|
|
73
88
|
* mapping in practice (the safety net blocks it first); it maps to deny
|
|
@@ -168,7 +168,7 @@ const CALL_TARGET_FIELDS: Readonly<Record<string, ReadonlyArray<string>>> = {
|
|
|
168
168
|
grep: ["pattern", "path", "mode", "glob", "ignore_case", "literal", "context", "limit", "include_ignored"],
|
|
169
169
|
find: ["pattern", "path", "order", "limit", "include_ignored"],
|
|
170
170
|
ls: ["path", "limit"],
|
|
171
|
-
code_nav: ["mode", "query", "limit"],
|
|
171
|
+
code_nav: ["source", "mode", "query", "limit"],
|
|
172
172
|
context: ["scope", "query", "name", "limit", "ref", "include_tree"],
|
|
173
173
|
credential_present: ["name", "source", "file"],
|
|
174
174
|
write: ["path"],
|
|
@@ -33,10 +33,12 @@ const DEFAULT_WINDOW_MS = 30_000;
|
|
|
33
33
|
// stops them before they burn a turn. Callers that need a different cadence
|
|
34
34
|
// pass `maxRepeats` explicitly.
|
|
35
35
|
const DEFAULT_MAX_REPEATS = 3;
|
|
36
|
-
// Sized so a
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
|
|
36
|
+
// Sized so a batch-shaped spiral still counts its third repeat at any call
|
|
37
|
+
// latency: a model that re-emits the same parallel batch of up to sixteen
|
|
38
|
+
// calls three times has every key inside the retained tail. Fix-verify loops
|
|
39
|
+
// are not this detector's concern any more; the loop guard keys attempts by
|
|
40
|
+
// the turn's write/edit epoch, so a check rerun after a change is a new key.
|
|
41
|
+
const DEFAULT_KEEP_LAST_ATTEMPTS = 48;
|
|
40
42
|
|
|
41
43
|
export function createLoopState(opts?: {
|
|
42
44
|
windowMs?: number;
|
|
@@ -138,6 +140,7 @@ export function observe(state: LoopDetectorState, key: string, now: number): [Lo
|
|
|
138
140
|
recent: next,
|
|
139
141
|
windowMs: state.windowMs,
|
|
140
142
|
maxRepeats: state.maxRepeats,
|
|
143
|
+
keepLastAttempts: keepLast,
|
|
141
144
|
};
|
|
142
145
|
return [newState, { looping, key, count }];
|
|
143
146
|
}
|
|
@@ -41,7 +41,7 @@ export function isSameOrDescendant(candidatePath: string, policyPath: string): b
|
|
|
41
41
|
const candidate = path.resolve(candidatePath);
|
|
42
42
|
const policy = path.resolve(policyPath);
|
|
43
43
|
const relative = path.relative(policy, candidate);
|
|
44
|
-
return relative === "" || (!relative.startsWith(
|
|
44
|
+
return relative === "" || (relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
function expandTilde(rawPath: string): string {
|
|
@@ -25,10 +25,12 @@ import {
|
|
|
25
25
|
extractCommandDeleteTargets,
|
|
26
26
|
extractCommandWriteTargets,
|
|
27
27
|
inlineShellScript,
|
|
28
|
-
|
|
28
|
+
invokesClioSkillMutation,
|
|
29
|
+
scanShellLike,
|
|
29
30
|
} from "./protected-artifacts.js";
|
|
30
31
|
import { formatRejection, type RejectionMessage } from "./rejection-feedback.js";
|
|
31
32
|
import { getCachedDefaultRulePacks, type PackId, type RulePacks } from "./rule-pack-loader.js";
|
|
33
|
+
import { activeClioSkillRoots, skillMutationReason } from "./skill-authority.js";
|
|
32
34
|
|
|
33
35
|
export type SafetyPolicySource =
|
|
34
36
|
| "damage-control:base"
|
|
@@ -194,6 +196,7 @@ export function createSafetyPolicyEngine(options: SafetyPolicyEngineOptions = {}
|
|
|
194
196
|
// cwd and roots to compare like against like (the design mandates no symlink chasing).
|
|
195
197
|
const writeRootCwd = path.resolve(options.cwd ?? process.cwd());
|
|
196
198
|
const writeRoots = (options.writeRoots ?? []).map((root) => resolvePathBoundary(writeRootCwd, root));
|
|
199
|
+
const skillRoots = activeClioSkillRoots(cwd);
|
|
197
200
|
const packs = options.rulePacks ?? getCachedDefaultRulePacks();
|
|
198
201
|
const projectPolicy = options.projectPolicy ?? loadProjectSafetyPolicy(cwd);
|
|
199
202
|
const projectPolicyRoot =
|
|
@@ -308,6 +311,27 @@ export function createSafetyPolicyEngine(options: SafetyPolicyEngineOptions = {}
|
|
|
308
311
|
return blockDecision(base, blockInput);
|
|
309
312
|
}
|
|
310
313
|
|
|
314
|
+
// Editing active instructions is an operator privilege at every autonomy
|
|
315
|
+
// level, in both the coordinator and the shared worker safety contract.
|
|
316
|
+
const mutationCommand = call.tool === ToolNames.Bash ? command : catalogCommand;
|
|
317
|
+
const skillReason =
|
|
318
|
+
mutationCommand !== null && invokesClioSkillMutation(mutationCommand)
|
|
319
|
+
? "skill installation and updates require the operator CLI or an explicit operator install choice; draft outside active skill roots"
|
|
320
|
+
: skillMutationReason(
|
|
321
|
+
skillRoots,
|
|
322
|
+
pathPolicyTargets(catalogCommand === null ? call : { tool: ToolNames.Bash, args: { command: catalogCommand } }),
|
|
323
|
+
callCwd,
|
|
324
|
+
mutationCommand,
|
|
325
|
+
);
|
|
326
|
+
if (skillReason !== null) {
|
|
327
|
+
return blockDecision(base, {
|
|
328
|
+
ruleId: "skill-authority",
|
|
329
|
+
reasonCode: "skill-authority",
|
|
330
|
+
reasons: [skillReason],
|
|
331
|
+
policySource: "builtin-classifier",
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
|
|
311
335
|
// The path policy runs regardless of project policy validity. When
|
|
312
336
|
// `.clio-coder/safety.yaml` is invalid, the loader has already dropped every
|
|
313
337
|
// project-authored path entry and forced `disableDefaultPathPolicy`
|
|
@@ -488,10 +512,10 @@ function stripQuotes(token: string): string {
|
|
|
488
512
|
*/
|
|
489
513
|
function bashPathTokenCandidates(command: string): string[] {
|
|
490
514
|
const candidates: string[] = [];
|
|
491
|
-
for (const
|
|
515
|
+
for (const scanned of scanShellLike(command)) {
|
|
516
|
+
if (scanned.operator) continue;
|
|
517
|
+
const token = scanned.value;
|
|
492
518
|
if (token.length === 0) continue;
|
|
493
|
-
if (token === ";" || token === "&&" || token === "||" || token === "|" || token === ">" || token === ">>") continue;
|
|
494
|
-
if (token === "<" || token === "<<") continue;
|
|
495
519
|
// A token containing whitespace came from a quoted string of prose, not
|
|
496
520
|
// a path argument; and flags are not paths unless they embed one
|
|
497
521
|
// (--file=~/.aws/credentials).
|
|
@@ -821,9 +845,6 @@ function matchingProjectCommand(
|
|
|
821
845
|
return null;
|
|
822
846
|
}
|
|
823
847
|
|
|
824
|
-
/** Operators that end chain recognition; only `&&` keeps a chain readable. */
|
|
825
|
-
const CHAIN_BREAKING_TOKENS: ReadonlySet<string> = new Set([";", "|", "||", ">", ">>", "<", "<<"]);
|
|
826
|
-
|
|
827
848
|
/** Chain length ceiling. Real compound calls are two or three steps. */
|
|
828
849
|
const CHAIN_MAX_SEGMENTS = 6;
|
|
829
850
|
|
|
@@ -856,14 +877,16 @@ function recognizeCommandChain(
|
|
|
856
877
|
): ChainRecognition | null {
|
|
857
878
|
const segments: string[][] = [];
|
|
858
879
|
let current: string[] = [];
|
|
859
|
-
for (const token of
|
|
860
|
-
if (token === "&&") {
|
|
880
|
+
for (const token of scanShellLike(command)) {
|
|
881
|
+
if (token.operator && token.value === "&&") {
|
|
861
882
|
segments.push(current);
|
|
862
883
|
current = [];
|
|
863
884
|
continue;
|
|
864
885
|
}
|
|
865
|
-
|
|
866
|
-
|
|
886
|
+
// Only an actual && operator joins recognizable commands. Quoted words
|
|
887
|
+
// remain argv and every other real operator makes this chain unrecognized.
|
|
888
|
+
if (token.operator) return null;
|
|
889
|
+
current.push(token.value);
|
|
867
890
|
}
|
|
868
891
|
segments.push(current);
|
|
869
892
|
if (segments.length < 2 || segments.length > CHAIN_MAX_SEGMENTS) return null;
|