@iowarp/clio-coder 0.4.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +92 -0
- package/CONTRIBUTING.md +59 -36
- package/README.md +404 -472
- package/SECURITY.md +2 -1
- package/dist/{acp-ZILU3AUO.js → acp-TMDQZDIG.js} +7 -7
- package/dist/{agents-HYWGBGQR.js → agents-5N5NG3XG.js} +28 -28
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-N3QT7CBO.js → auth-Z5CCBXKQ.js} +8 -9
- package/dist/{builtins-UJLMOVOV.js → builtins-K6TNDT24.js} +4 -4
- package/dist/{chunk-GVQJ5CCZ.js → chunk-2HFQNRV3.js} +7 -7
- package/dist/{chunk-QMXC4JB7.js → chunk-2NHR3NAY.js} +163 -1401
- package/dist/chunk-2X4RYJTJ.js +39 -0
- package/dist/{chunk-Y45G3AXC.js → chunk-2Z2IKEXI.js} +6 -10
- package/dist/{chunk-EIMVLWB3.js → chunk-34BHNEE3.js} +7 -3
- package/dist/{chunk-GIZNH63R.js → chunk-35MSIRKH.js} +9 -4
- package/dist/chunk-3EBYEESD.js +314 -0
- package/dist/{chunk-CTJ4RNAA.js → chunk-3F7VUY77.js} +2 -2
- package/dist/{chunk-AP73CFDC.js → chunk-3KIPBMUA.js} +2 -2
- package/dist/{chunk-J5LZHVIT.js → chunk-3M6DQK6S.js} +113 -35
- package/dist/{chunk-VEGN6WIQ.js → chunk-462T4EGZ.js} +2 -2
- package/dist/{chunk-AFKWHWXF.js → chunk-4JDLP6ZS.js} +33 -16
- package/dist/{chunk-6FN3E6KX.js → chunk-4O6MANBS.js} +2 -2
- package/dist/{chunk-AKB4GYDL.js → chunk-54ODD65L.js} +5 -5
- package/dist/{chunk-BBTJOK6Y.js → chunk-5KW52TEP.js} +3 -3
- package/dist/{chunk-6CCS4G3W.js → chunk-5PFYMY2V.js} +2 -2
- package/dist/chunk-77QIVUZB.js +1334 -0
- package/dist/{chunk-7OBGU7UB.js → chunk-7BHIY2MW.js} +7 -13
- package/dist/{chunk-3QSOM6PA.js → chunk-AZ4WMN4W.js} +2 -2
- package/dist/{chunk-6NJQITNH.js → chunk-B74PXLU7.js} +6 -3
- package/dist/{chunk-R23Z6K6I.js → chunk-B7HM5Z7T.js} +15 -15
- package/dist/{chunk-R32CLGZ6.js → chunk-BO7Y52RY.js} +81 -20
- package/dist/{chunk-UEDMSP56.js → chunk-BYMNWQ7O.js} +123 -148
- package/dist/{chunk-ZJLUDYFY.js → chunk-CRFOIAX3.js} +4 -4
- package/dist/{chunk-2NM363SV.js → chunk-CYZW7JHJ.js} +7 -7
- package/dist/{chunk-6HMJX2VU.js → chunk-DYHAXKHD.js} +38 -10
- package/dist/{chunk-THYWACCR.js → chunk-DZAW46HP.js} +3 -3
- package/dist/{chunk-FYUN5KZ3.js → chunk-DZEK6CJN.js} +17 -17
- package/dist/{chunk-3I5NY75V.js → chunk-E7GT7O5N.js} +5 -5
- package/dist/{chunk-VKFQTNDV.js → chunk-F2I26BDK.js} +4 -4
- package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
- package/dist/{chunk-IXJT6DCX.js → chunk-FVDGR2ZL.js} +3 -3
- package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
- package/dist/{chunk-7EPLI7VL.js → chunk-HIICAHCJ.js} +2 -2
- package/dist/{chunk-E67WX76H.js → chunk-HKMD33FO.js} +29 -80
- package/dist/chunk-HLAFFSEK.js +360 -0
- package/dist/{chunk-UAPGZHYC.js → chunk-I64IFBLB.js} +9 -2
- package/dist/{chunk-XKA2ICR3.js → chunk-I66ZTYNP.js} +440 -175
- package/dist/{chunk-7PWAODYW.js → chunk-I7XBWTYH.js} +2 -2
- package/dist/{chunk-PVAMAVBB.js → chunk-IDNA72AH.js} +102 -2
- package/dist/{chunk-GCSMB2KY.js → chunk-IKOZFYBN.js} +1 -1
- package/dist/{chunk-2VG7KLYV.js → chunk-IKSLQ4XV.js} +5460 -3241
- package/dist/{chunk-QKIFBZKT.js → chunk-IMXMHHMQ.js} +166 -25
- package/dist/{chunk-74YWRRU5.js → chunk-JBCS7CRR.js} +2 -2
- package/dist/{chunk-BDPT6GTK.js → chunk-JWJGP5DQ.js} +2 -2
- package/dist/{chunk-K6BF4U2H.js → chunk-KKOJXO6R.js} +62 -14
- package/dist/chunk-KPXDY6QF.js +47 -0
- package/dist/{chunk-ABLSQ6JX.js → chunk-LJID3DYZ.js} +7 -1
- package/dist/{chunk-VKRH2TCS.js → chunk-M2DAX4F6.js} +2 -2
- package/dist/{chunk-6I5ILFOF.js → chunk-M2WXEHER.js} +2 -2
- package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
- package/dist/{chunk-N5UK64DP.js → chunk-MCMZMDAC.js} +2 -2
- package/dist/{chunk-Y4CAGMM6.js → chunk-MNJGS2IN.js} +5 -6
- package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
- package/dist/{chunk-U2WB7TZS.js → chunk-NMJXSHBJ.js} +97 -85
- package/dist/{chunk-HUAS7ITX.js → chunk-O3YUNJZ2.js} +13 -21
- package/dist/{chunk-MA3H6DM5.js → chunk-P75RZCJW.js} +25 -3
- package/dist/{chunk-IG7BCQBA.js → chunk-PGF63K6I.js} +2 -2
- package/dist/chunk-PJX3WQUQ.js +42 -0
- package/dist/{chunk-6DWBAZ5U.js → chunk-Q4XWMHX6.js} +4 -6
- package/dist/{chunk-OJTRZGR3.js → chunk-QQLGQY2A.js} +8 -8
- package/dist/{chunk-J4HBWF6Y.js → chunk-RLYRBIYQ.js} +115 -20
- package/dist/{chunk-NLFAQR7Z.js → chunk-S66XZJOF.js} +3 -23
- package/dist/{chunk-C537JADH.js → chunk-SSEYRH53.js} +6 -7
- package/dist/chunk-SZAA6XDG.js +30 -0
- package/dist/{chunk-MOPSG2X7.js → chunk-TPEQIQIE.js} +6 -6
- package/dist/{chunk-JA5QWE4Z.js → chunk-UBRFI4HS.js} +1879 -1650
- package/dist/{chunk-BTGG6BG2.js → chunk-UH347SHR.js} +154 -15
- package/dist/{chunk-5YHDIDBP.js → chunk-UH632ZYL.js} +2 -2
- package/dist/{chunk-BWW4HLO4.js → chunk-UXCU4E3T.js} +8 -6
- package/dist/{chunk-6VC4OV3Z.js → chunk-VIA6RFQZ.js} +3 -11
- package/dist/{chunk-ZAZB4JMW.js → chunk-VKPAQYEB.js} +27 -8
- package/dist/{chunk-UXN6JT4W.js → chunk-W4YEMFBX.js} +2 -2
- package/dist/{chunk-TD3PGPQA.js → chunk-W6NIE6OW.js} +2 -2
- package/dist/{chunk-TVH4ONAM.js → chunk-X7IARSHT.js} +3 -3
- package/dist/{chunk-PJJ6MY27.js → chunk-XE3PCIXH.js} +3 -3
- package/dist/{chunk-FEFIFZTL.js → chunk-XGDPUNND.js} +2 -2
- package/dist/{chunk-SCYB3HA4.js → chunk-XOXV5GKE.js} +51 -16
- package/dist/{chunk-QTFGO774.js → chunk-XQRY4DTA.js} +24 -11
- package/dist/{chunk-BJGUKIG4.js → chunk-YJISEZKC.js} +2 -2
- package/dist/{chunk-GPPB3JBE.js → chunk-ZGNYYXQ6.js} +2 -2
- package/dist/{chunk-SINK3QR6.js → chunk-ZNT2M6TG.js} +7 -7
- package/dist/{chunk-7RY5VZPH.js → chunk-ZW4HH5JJ.js} +6 -6
- package/dist/cli/index.js +33 -32
- package/dist/{clio-IT3G3VQH.js → clio-7VB377CC.js} +7 -7
- package/dist/{code-nav-RK6S7F6E.js → code-nav-YVLCYA7V.js} +85 -17
- package/dist/{config-3QZRWZJF.js → config-4HVOS65E.js} +88 -43
- package/dist/{configure-FL7Y3KJF.js → configure-PIWO7B24.js} +10 -10
- package/dist/{context-5HE7ODYK.js → context-IYEHL3WQ.js} +33 -31
- package/dist/{context-XNHL75JV.js → context-KQYIWPWT.js} +47 -34
- package/dist/{context-KYQFRVDC.js → context-N6ZE3LGJ.js} +11 -11
- package/dist/{context-clear-N545L53A.js → context-clear-G4OGZJDS.js} +33 -31
- package/dist/{context-working-set-QHKXSV2F.js → context-working-set-BWLF6LJP.js} +7 -7
- package/dist/{dispatch-runner-RGIE5PCT.js → dispatch-runner-2QQAITS3.js} +38 -38
- package/dist/{docs-5NAF6AU7.js → docs-PD3EXDKU.js} +21 -20
- package/dist/{doctor-ZGPEGHIP.js → doctor-LHBD36VU.js} +23 -22
- package/dist/{eval-GXLL44RD.js → eval-C45FYRJ6.js} +21 -20
- package/dist/{eval-inventory-HBWSWQOK.js → eval-inventory-6DEJPLBF.js} +2 -2
- package/dist/{evidence-HWLBRH3Q.js → evidence-6SHONYAF.js} +30 -28
- package/dist/{evolve-FTZBMNVW.js → evolve-KRKMV72X.js} +30 -28
- package/dist/{extensions-VHRBEID7.js → extensions-KPZ2UHBB.js} +5 -3
- package/dist/{fleet-CKZHJWZJ.js → fleet-IVTCKDHT.js} +62 -61
- package/dist/{fleet-commands-EXDXBMV6.js → fleet-commands-EDWL3IT7.js} +5 -5
- package/dist/{fleet-decisions-OTHB6KRL.js → fleet-decisions-YP3YEFGK.js} +4 -4
- package/dist/{fleet-graph-YTEZUCUT.js → fleet-graph-ZFWKHY2M.js} +16 -14
- package/dist/{fleet-inspect-SS6YMDCK.js → fleet-inspect-FVUNCBML.js} +31 -29
- package/dist/{fleet-preflight-PBY4VYOM.js → fleet-preflight-UN5XED4R.js} +2 -2
- package/dist/{fleet-validate-KMEM5L3S.js → fleet-validate-XOWC4HSX.js} +17 -15
- package/dist/{fleet-verify-QD5M7E7Q.js → fleet-verify-UN3SODEL.js} +30 -28
- package/dist/{fleet-view-WAMJYNDT.js → fleet-view-TWHJKCN6.js} +31 -29
- package/dist/{init-5XQRBOFV.js → init-T2QORQ3Y.js} +50 -49
- package/dist/{interop-34TVO25M.js → interop-IN5I2A66.js} +5 -5
- package/dist/{library-3QY6KF57.js → library-LSCATDLZ.js} +15 -13
- package/dist/{memory-L4UTIIIW.js → memory-HYOKAGGJ.js} +31 -29
- package/dist/{models-ZVX3QOWE.js → models-2GPMFYCM.js} +22 -21
- package/dist/{monitor-CEKVSYTS.js → monitor-E4ASVUJH.js} +34 -32
- package/dist/{orchestrator-77BAP6BC.js → orchestrator-DDMPR3PY.js} +984 -583
- package/dist/{panes-7STHOAUJ.js → panes-E3RUXOW5.js} +4 -4
- package/dist/{panes-SHAUIRXY.js → panes-IXKLOKA2.js} +23 -8
- package/dist/{reset-EOLM7GVE.js → reset-OAQP3W4O.js} +4 -4
- package/dist/{resources-74GKTLSF.js → resources-OTRSN34L.js} +15 -13
- package/dist/{run-HBAUJNNZ.js → run-5DEYH5QK.js} +60 -59
- package/dist/{share-G3APVLVP.js → share-IHWTLO3M.js} +19 -15
- package/dist/{skills-35HHUKCR.js → skills-IYMXMKW4.js} +17 -15
- package/dist/{skills-eval-QN4HSHDC.js → skills-eval-DROHSJAR.js} +36 -36
- package/dist/{skills-inventory-J357J34F.js → skills-inventory-D7X4L4ZX.js} +15 -13
- package/dist/{slash-commands-JZZCQA32.js → slash-commands-QBM7UZ3B.js} +21 -18
- package/dist/{steer-XAVHJM22.js → steer-Z5DO23FJ.js} +2 -2
- package/dist/{targets-DSM6CY3M.js → targets-P2FUC4IL.js} +25 -28
- package/dist/{terminal-lease-JOPFUVEM.js → terminal-lease-YREJ3JX2.js} +5 -5
- package/dist/{tools-MKNWVPBH.js → tools-5B7RO6MV.js} +4 -4
- package/dist/{trace-ECQ7TIYZ.js → trace-YMGMUM6A.js} +55 -7
- package/dist/{upgrade-H7TOM7YL.js → upgrade-PXK3S2YM.js} +11 -9
- package/dist/{usage-X52N3IDJ.js → usage-ME5MPXGX.js} +36 -34
- package/dist/{verifiers-EJTVVSMA.js → verifiers-BVZ7IWOO.js} +5 -5
- package/dist/{verify-YJL6XET2.js → verify-5K7ZKQFC.js} +4 -4
- package/dist/{web-fetch-MPIFL3LL.js → web-fetch-MPARV2K7.js} +2 -2
- package/dist/{wiki-generate-4NDZTQ4B.js → wiki-generate-F5W5QTYY.js} +48 -47
- package/dist/{with-panes-OBOBFIIR.js → with-panes-BYOJCLAM.js} +51 -255
- package/dist/worker/entry.js +45 -30
- package/docs/README.md +176 -81
- package/docs/{acp.md → architecture/acp.md} +36 -20
- package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
- package/docs/{architecture.md → architecture/architecture.md} +43 -22
- package/docs/{artifact-placement.md → architecture/artifact-placement.md} +26 -23
- package/docs/architecture/artifact-versions.md +90 -0
- package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
- package/docs/{context-engine.md → architecture/context-engine.md} +25 -25
- package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
- package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
- package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
- package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
- package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
- package/docs/{model-catalog.md → architecture/model-catalog.md} +40 -17
- package/docs/{observability.md → architecture/observability.md} +26 -13
- package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
- package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +55 -20
- package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +35 -24
- package/docs/{safety-model.md → architecture/safety-model.md} +20 -15
- package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
- package/docs/architecture/time-conventions.md +125 -0
- package/docs/{trace-store.md → architecture/trace-store.md} +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} +50 -34
- package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +65 -60
- package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +227 -289
- package/docs/guide/configuration-reference.md +1158 -0
- package/docs/{environment-variables.md → guide/environment-variables.md} +31 -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} +44 -13
- package/docs/guide/panes-and-files.md +290 -0
- package/docs/{proactive-memory.md → guide/proactive-memory.md} +79 -66
- package/docs/{resource-library.md → guide/resource-library.md} +13 -4
- package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +7 -3
- package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
- package/docs/{troubleshooting.md → guide/troubleshooting.md} +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/{development-pipeline.md → process/development-pipeline.md} +24 -26
- package/docs/process/documentation-coverage.md +100 -0
- package/docs/process/documentation-guide.md +187 -0
- package/docs/{eval-runner.md → process/eval-runner.md} +41 -50
- package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
- package/docs/{evolution.md → process/evolution.md} +2 -2
- package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +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/package.json +9 -7
- package/skills/README.md +46 -37
- package/skills/coding/ast-grep/SKILL.md +2 -2
- package/skills/coding/coding-standards/SKILL.md +2 -2
- package/skills/coding/prototype/SKILL.md +2 -2
- package/skills/coding/tdd/SKILL.md +2 -2
- package/skills/context/context-handoff/SKILL.md +2 -2
- package/skills/context/context-prime/SKILL.md +2 -2
- package/skills/git/file-ticket/SKILL.md +2 -2
- package/skills/git/fix-issue/SKILL.md +3 -3
- package/skills/git/resolve-merge-conflicts/SKILL.md +2 -2
- package/skills/git/ship/SKILL.md +2 -2
- package/skills/git/worktree-create/SKILL.md +2 -2
- package/skills/git/worktree-merge/SKILL.md +2 -2
- 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/architecture/SKILL.md +2 -2
- package/skills/planning/backlog/SKILL.md +2 -2
- package/skills/planning/prd/SKILL.md +2 -2
- package/skills/planning/product-intent/SKILL.md +2 -2
- package/skills/planning/tech-spec/SKILL.md +2 -2
- package/skills/registry.yaml +62 -62
- package/skills/research/arxiv-literature/SKILL.md +2 -2
- package/skills/research/experiment-protocol/SKILL.md +2 -2
- package/skills/research/scientific-debugging/SKILL.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +2 -2
- package/skills/skill-marketplace.json +62 -62
- package/skills/workflow/cut-it/SKILL.md +2 -2
- package/skills/workflow/design-council/SKILL.md +2 -2
- package/skills/workflow/grill-me/SKILL.md +2 -2
- package/skills/workflow/workflow-distiller/SKILL.md +2 -2
- 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.ts +0 -4
- 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 +2 -1
- package/src/cli/internal-dispatch.ts +3 -4
- package/src/cli/panes.ts +19 -5
- package/src/cli/run.ts +2 -2
- package/src/cli/share.ts +5 -1
- package/src/cli/skills-eval.ts +3 -3
- package/src/cli/targets.ts +2 -6
- package/src/cli/trace.ts +55 -4
- 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 +5 -1
- package/src/core/defaults.ts +7 -4
- package/src/core/dispatch-outcome.ts +16 -0
- package/src/core/guardrails.ts +10 -49
- package/src/core/prompt-hint.ts +9 -0
- package/src/domains/agents/builtins/architect.md +2 -3
- package/src/domains/agents/builtins/coder.md +3 -2
- package/src/domains/agents/builtins/debugger.md +2 -2
- package/src/domains/agents/builtins/documenter.md +2 -2
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/oracle.md +1 -1
- package/src/domains/agents/builtins/provenance.md +1 -1
- package/src/domains/agents/builtins/researcher.md +1 -1
- package/src/domains/agents/builtins/scout.md +1 -1
- package/src/domains/agents/builtins/tester.md +2 -2
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +1 -1
- package/src/domains/agents/catalog.ts +12 -14
- package/src/domains/agents/contract.ts +2 -0
- package/src/domains/agents/extension.ts +23 -1
- package/src/domains/config/keybindings.ts +8 -0
- package/src/domains/context/extension.ts +0 -3
- package/src/domains/context/working-set/path-index.ts +1 -0
- package/src/domains/dispatch/capability-match.ts +10 -0
- package/src/domains/dispatch/extension.ts +105 -22
- 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 +55 -3
- package/src/domains/eval/artifacts/store.ts +5 -0
- package/src/domains/eval/store.ts +8 -1
- 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/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
- package/src/domains/lifecycle/migrations/index.ts +2 -0
- package/src/domains/lifecycle/naming-resources.ts +19 -4
- package/src/domains/lifecycle/naming-yazi.ts +10 -5
- 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 -4
- package/src/domains/middleware/registrations.ts +326 -0
- package/src/domains/middleware/runtime.ts +28 -0
- 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/contract.ts +10 -11
- package/src/domains/observability/extension.ts +11 -3
- 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/index.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +85 -21
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +669 -104
- package/src/domains/providers/runtime-resolution.ts +31 -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/types/cost-provenance.ts +19 -0
- package/src/domains/providers/types/local-model-quirks.ts +85 -37
- package/src/domains/resources/skills/loader.ts +16 -19
- package/src/domains/safety/call-target.ts +1 -1
- package/src/domains/safety/loop-detector.ts +7 -4
- package/src/domains/session/task-board.ts +10 -9
- package/src/domains/share/archive.ts +164 -7
- package/src/engine/acp/server.ts +62 -9
- 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 +28 -25
- package/src/engine/apis/output-budget.ts +8 -18
- package/src/engine/apis/residency.ts +8 -27
- 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/extension-hook-sources.ts +28 -0
- package/src/entry/extension-reload.ts +309 -0
- package/src/entry/orchestrator.ts +59 -35
- package/src/interactive/application-controller.ts +2 -1
- package/src/interactive/bus-notices.ts +8 -1
- package/src/interactive/chat-loop-messages.ts +3 -13
- package/src/interactive/chat-loop.ts +10 -1
- package/src/interactive/chat-panel.ts +36 -13
- package/src/interactive/chat-renderer.ts +71 -7
- 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 +2 -0
- 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/slash-commands.ts +129 -14
- package/src/interactive/stream-pacing-policy.ts +0 -23
- package/src/interactive/turn-context.ts +30 -15
- 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 +29 -12
- package/src/tools/core-bootstrap.ts +28 -6
- package/src/tools/credential-present.ts +1 -2
- package/src/tools/dispatch-arguments.ts +5 -1
- package/src/tools/dispatch-plan.ts +48 -4
- package/src/tools/dispatch-run-events.ts +1 -1
- 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 +30 -7
- 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/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/docs/artifact-versions.md +0 -67
- package/docs/documentation-coverage.md +0 -46
- package/docs/documentation-guide.md +0 -167
- package/docs/time-conventions.md +0 -101
package/dist/chunk-SUW5DORT.js
DELETED
|
@@ -1,819 +0,0 @@
|
|
|
1
|
-
import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
|
|
2
|
-
import {
|
|
3
|
-
getVersionInfo
|
|
4
|
-
} from "./chunk-XPLRXC72.js";
|
|
5
|
-
import {
|
|
6
|
-
require_dist
|
|
7
|
-
} from "./chunk-APJ265NV.js";
|
|
8
|
-
import {
|
|
9
|
-
clioConfigDir
|
|
10
|
-
} from "./chunk-BYP5D4HI.js";
|
|
11
|
-
import {
|
|
12
|
-
safeResourceWrite
|
|
13
|
-
} from "./chunk-WEPFGWHJ.js";
|
|
14
|
-
import {
|
|
15
|
-
__toESM,
|
|
16
|
-
init_esm_shims
|
|
17
|
-
} from "./chunk-3R73A4XB.js";
|
|
18
|
-
|
|
19
|
-
// src/domains/extensions/discovery.ts
|
|
20
|
-
init_esm_shims();
|
|
21
|
-
var import_yaml = __toESM(require_dist(), 1);
|
|
22
|
-
import { existsSync, lstatSync, readdirSync, readFileSync, realpathSync, statSync } from "node:fs";
|
|
23
|
-
import path from "node:path";
|
|
24
|
-
|
|
25
|
-
// src/domains/extensions/compatibility.ts
|
|
26
|
-
init_esm_shims();
|
|
27
|
-
var MAX_RANGE_CHARS = 256;
|
|
28
|
-
var NUMERIC = "(?:0|[1-9]\\d*)";
|
|
29
|
-
var IDENTIFIER = "[0-9A-Za-z-]+";
|
|
30
|
-
var VERSION_RE = new RegExp(
|
|
31
|
-
`^v?(${NUMERIC})\\.(${NUMERIC})\\.(${NUMERIC})(?:-(${IDENTIFIER}(?:\\.${IDENTIFIER})*))?(?:\\+${IDENTIFIER}(?:\\.${IDENTIFIER})*)?$`
|
|
32
|
-
);
|
|
33
|
-
var PARTIAL_RE = new RegExp(
|
|
34
|
-
`^v?(${NUMERIC}|[xX*])(?:\\.(${NUMERIC}|[xX*]))?(?:\\.(${NUMERIC}|[xX*]))?(?:-(${IDENTIFIER}(?:\\.${IDENTIFIER})*))?(?:\\+${IDENTIFIER}(?:\\.${IDENTIFIER})*)?$`
|
|
35
|
-
);
|
|
36
|
-
function prerelease(value) {
|
|
37
|
-
if (value === void 0) return [];
|
|
38
|
-
const out = [];
|
|
39
|
-
for (const identifier of value.split(".")) {
|
|
40
|
-
if (identifier.length === 0) return null;
|
|
41
|
-
if (/^\d+$/u.test(identifier)) {
|
|
42
|
-
if (identifier.length > 1 && identifier.startsWith("0")) return null;
|
|
43
|
-
const parsed = Number(identifier);
|
|
44
|
-
if (!Number.isSafeInteger(parsed)) return null;
|
|
45
|
-
out.push(parsed);
|
|
46
|
-
} else {
|
|
47
|
-
out.push(identifier);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return out;
|
|
51
|
-
}
|
|
52
|
-
function parseSemVer(value) {
|
|
53
|
-
const match = VERSION_RE.exec(value);
|
|
54
|
-
if (match === null) return null;
|
|
55
|
-
const parsedPrerelease = prerelease(match[4]);
|
|
56
|
-
if (parsedPrerelease === null) return null;
|
|
57
|
-
const major = Number(match[1]);
|
|
58
|
-
const minor = Number(match[2]);
|
|
59
|
-
const patch = Number(match[3]);
|
|
60
|
-
if (![major, minor, patch].every(Number.isSafeInteger)) return null;
|
|
61
|
-
return { major, minor, patch, prerelease: parsedPrerelease };
|
|
62
|
-
}
|
|
63
|
-
function parsePart(value) {
|
|
64
|
-
if (value === void 0 || value === "x" || value === "X" || value === "*") return null;
|
|
65
|
-
const parsed = Number(value);
|
|
66
|
-
return Number.isSafeInteger(parsed) ? parsed : null;
|
|
67
|
-
}
|
|
68
|
-
function parsePartial(value) {
|
|
69
|
-
const match = PARTIAL_RE.exec(value);
|
|
70
|
-
if (match === null) return null;
|
|
71
|
-
for (const part of match.slice(1, 4)) {
|
|
72
|
-
if (part === void 0 || part === "x" || part === "X" || part === "*") continue;
|
|
73
|
-
if (!Number.isSafeInteger(Number(part))) return null;
|
|
74
|
-
}
|
|
75
|
-
const major = parsePart(match[1]);
|
|
76
|
-
const minor = parsePart(match[2]);
|
|
77
|
-
const patch = parsePart(match[3]);
|
|
78
|
-
if (major === null && (match[2] !== void 0 || match[3] !== void 0) || minor === null && match[3] !== void 0) {
|
|
79
|
-
return null;
|
|
80
|
-
}
|
|
81
|
-
const parsedPrerelease = prerelease(match[4]);
|
|
82
|
-
if (parsedPrerelease === null) return null;
|
|
83
|
-
if (parsedPrerelease.length > 0 && (major === null || minor === null || patch === null)) return null;
|
|
84
|
-
return { major, minor, patch, prerelease: parsedPrerelease };
|
|
85
|
-
}
|
|
86
|
-
function compareIdentifiers(left, right) {
|
|
87
|
-
if (left === right) return 0;
|
|
88
|
-
if (typeof left === "number" && typeof right === "number") return left < right ? -1 : 1;
|
|
89
|
-
if (typeof left === "number") return -1;
|
|
90
|
-
if (typeof right === "number") return 1;
|
|
91
|
-
return left < right ? -1 : 1;
|
|
92
|
-
}
|
|
93
|
-
function compare(left, right) {
|
|
94
|
-
for (const key of ["major", "minor", "patch"]) {
|
|
95
|
-
if (left[key] !== right[key]) return left[key] < right[key] ? -1 : 1;
|
|
96
|
-
}
|
|
97
|
-
if (left.prerelease.length === 0 || right.prerelease.length === 0) {
|
|
98
|
-
if (left.prerelease.length === right.prerelease.length) return 0;
|
|
99
|
-
return left.prerelease.length === 0 ? 1 : -1;
|
|
100
|
-
}
|
|
101
|
-
const length = Math.max(left.prerelease.length, right.prerelease.length);
|
|
102
|
-
for (let index = 0; index < length; index += 1) {
|
|
103
|
-
const leftPart = left.prerelease[index];
|
|
104
|
-
const rightPart = right.prerelease[index];
|
|
105
|
-
if (leftPart === void 0 || rightPart === void 0) {
|
|
106
|
-
if (leftPart === rightPart) return 0;
|
|
107
|
-
return leftPart === void 0 ? -1 : 1;
|
|
108
|
-
}
|
|
109
|
-
const order = compareIdentifiers(leftPart, rightPart);
|
|
110
|
-
if (order !== 0) return order;
|
|
111
|
-
}
|
|
112
|
-
return 0;
|
|
113
|
-
}
|
|
114
|
-
function floor(partial) {
|
|
115
|
-
return {
|
|
116
|
-
major: partial.major ?? 0,
|
|
117
|
-
minor: partial.minor ?? 0,
|
|
118
|
-
patch: partial.patch ?? 0,
|
|
119
|
-
prerelease: partial.prerelease
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
function nextWildcard(partial) {
|
|
123
|
-
if (partial.major === null) return null;
|
|
124
|
-
if (partial.minor === null) return { major: partial.major + 1, minor: 0, patch: 0, prerelease: [] };
|
|
125
|
-
if (partial.patch === null) return { major: partial.major, minor: partial.minor + 1, patch: 0, prerelease: [] };
|
|
126
|
-
return null;
|
|
127
|
-
}
|
|
128
|
-
function lowerBound(version, inclusive) {
|
|
129
|
-
return (candidate) => inclusive ? compare(candidate, version) >= 0 : compare(candidate, version) > 0;
|
|
130
|
-
}
|
|
131
|
-
function upperBound(version, inclusive) {
|
|
132
|
-
return (candidate) => inclusive ? compare(candidate, version) <= 0 : compare(candidate, version) < 0;
|
|
133
|
-
}
|
|
134
|
-
function core(version) {
|
|
135
|
-
return `${version.major}.${version.minor}.${version.patch}`;
|
|
136
|
-
}
|
|
137
|
-
function predicatesForToken(token) {
|
|
138
|
-
const match = /^(<=|>=|<|>|=|~|\^)?(.+)$/u.exec(token);
|
|
139
|
-
if (match === null) return null;
|
|
140
|
-
const operator = match[1] ?? "";
|
|
141
|
-
const partial = parsePartial(match[2] ?? "");
|
|
142
|
-
if (partial === null) return null;
|
|
143
|
-
const base = floor(partial);
|
|
144
|
-
const wildcardUpper = nextWildcard(partial);
|
|
145
|
-
const prereleaseCore = partial.prerelease.length > 0 ? core(base) : null;
|
|
146
|
-
if (operator === "" || operator === "=") {
|
|
147
|
-
if (partial.major === null) return { predicates: [], prereleaseCore };
|
|
148
|
-
if (wildcardUpper !== null) {
|
|
149
|
-
return { predicates: [lowerBound(base, true), upperBound(wildcardUpper, false)], prereleaseCore };
|
|
150
|
-
}
|
|
151
|
-
return { predicates: [(candidate) => compare(candidate, base) === 0], prereleaseCore };
|
|
152
|
-
}
|
|
153
|
-
if (operator === ">=") return { predicates: [lowerBound(base, true)], prereleaseCore };
|
|
154
|
-
if (operator === "<") return { predicates: [upperBound(base, false)], prereleaseCore };
|
|
155
|
-
if (operator === ">") {
|
|
156
|
-
return {
|
|
157
|
-
predicates: [wildcardUpper === null ? lowerBound(base, false) : lowerBound(wildcardUpper, true)],
|
|
158
|
-
prereleaseCore
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
if (operator === "<=") {
|
|
162
|
-
return {
|
|
163
|
-
predicates: [wildcardUpper === null ? upperBound(base, true) : upperBound(wildcardUpper, false)],
|
|
164
|
-
prereleaseCore
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
if (partial.major === null) return { predicates: [], prereleaseCore };
|
|
168
|
-
if (operator === "~") {
|
|
169
|
-
const upper2 = partial.minor === null ? { major: partial.major + 1, minor: 0, patch: 0, prerelease: [] } : { major: partial.major, minor: partial.minor + 1, patch: 0, prerelease: [] };
|
|
170
|
-
return { predicates: [lowerBound(base, true), upperBound(upper2, false)], prereleaseCore };
|
|
171
|
-
}
|
|
172
|
-
const upper = partial.major > 0 ? { major: partial.major + 1, minor: 0, patch: 0, prerelease: [] } : partial.minor === null ? { major: 1, minor: 0, patch: 0, prerelease: [] } : (partial.minor ?? 0) > 0 ? { major: 0, minor: (partial.minor ?? 0) + 1, patch: 0, prerelease: [] } : partial.patch === null ? { major: 0, minor: 1, patch: 0, prerelease: [] } : { major: 0, minor: 0, patch: (partial.patch ?? 0) + 1, prerelease: [] };
|
|
173
|
-
return { predicates: [lowerBound(base, true), upperBound(upper, false)], prereleaseCore };
|
|
174
|
-
}
|
|
175
|
-
function predicatesForSet(raw) {
|
|
176
|
-
const hyphen = /^(\S+)\s+-\s+(\S+)$/u.exec(raw);
|
|
177
|
-
if (hyphen !== null) {
|
|
178
|
-
const left = parsePartial(hyphen[1] ?? "");
|
|
179
|
-
const right = parsePartial(hyphen[2] ?? "");
|
|
180
|
-
if (left === null || right === null || left.major === null || right.major === null) return null;
|
|
181
|
-
const rightUpper = nextWildcard(right);
|
|
182
|
-
return {
|
|
183
|
-
predicates: [
|
|
184
|
-
lowerBound(floor(left), true),
|
|
185
|
-
rightUpper === null ? upperBound(floor(right), true) : upperBound(rightUpper, false)
|
|
186
|
-
],
|
|
187
|
-
prereleaseCores: new Set(
|
|
188
|
-
[
|
|
189
|
-
left.prerelease.length > 0 ? core(floor(left)) : null,
|
|
190
|
-
right.prerelease.length > 0 ? core(floor(right)) : null
|
|
191
|
-
].filter((entry) => entry !== null)
|
|
192
|
-
)
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
const normalized = raw.replace(/(<=|>=|<|>|=|~|\^)\s+/gu, "$1");
|
|
196
|
-
const tokens = normalized.split(/\s+/u).filter((entry) => entry.length > 0);
|
|
197
|
-
if (tokens.length === 0) return null;
|
|
198
|
-
const predicates = [];
|
|
199
|
-
const prereleaseCores = /* @__PURE__ */ new Set();
|
|
200
|
-
for (const token of tokens) {
|
|
201
|
-
const parsed = predicatesForToken(token);
|
|
202
|
-
if (parsed === null) return null;
|
|
203
|
-
predicates.push(...parsed.predicates);
|
|
204
|
-
if (parsed.prereleaseCore !== null) prereleaseCores.add(parsed.prereleaseCore);
|
|
205
|
-
}
|
|
206
|
-
return { predicates, prereleaseCores };
|
|
207
|
-
}
|
|
208
|
-
function parseRange(range) {
|
|
209
|
-
const trimmed = range.trim();
|
|
210
|
-
if (trimmed.length === 0 || trimmed.length > MAX_RANGE_CHARS) return null;
|
|
211
|
-
const sets = trimmed.split("||");
|
|
212
|
-
if (sets.some((set) => set.trim().length === 0)) return null;
|
|
213
|
-
const parsed = sets.map((set) => predicatesForSet(set.trim()));
|
|
214
|
-
return parsed.every((set) => set !== null) ? parsed : null;
|
|
215
|
-
}
|
|
216
|
-
function isValidSemVerRange(range) {
|
|
217
|
-
return parseRange(range) !== null;
|
|
218
|
-
}
|
|
219
|
-
function satisfiesSemVerRange(version, range) {
|
|
220
|
-
const candidate = parseSemVer(version);
|
|
221
|
-
const sets = parseRange(range);
|
|
222
|
-
if (candidate === null || sets === null) return false;
|
|
223
|
-
return sets.some((set) => {
|
|
224
|
-
if (candidate.prerelease.length > 0 && !set.prereleaseCores.has(core(candidate))) return false;
|
|
225
|
-
return set.predicates.every((predicate) => predicate(candidate));
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
function evaluateClioCompatibility(range, runningVersion = getVersionInfo().clio) {
|
|
229
|
-
const rangeValid = isValidSemVerRange(range);
|
|
230
|
-
return {
|
|
231
|
-
rangeValid,
|
|
232
|
-
satisfied: rangeValid && satisfiesSemVerRange(runningVersion, range),
|
|
233
|
-
runningVersion
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
// src/domains/extensions/discovery.ts
|
|
238
|
-
var MANIFEST_NAMES = ["clio-coder-extension.yaml", "clio-coder-extension.yml", "clio-coder-extension.json"];
|
|
239
|
-
function isRecord(value) {
|
|
240
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
241
|
-
}
|
|
242
|
-
function trimString(value) {
|
|
243
|
-
if (typeof value !== "string") return void 0;
|
|
244
|
-
const trimmed = value.trim();
|
|
245
|
-
return trimmed.length > 0 ? trimmed : void 0;
|
|
246
|
-
}
|
|
247
|
-
function validateId(id) {
|
|
248
|
-
if (id.length > 80) return "id exceeds 80 characters";
|
|
249
|
-
if (!/^[a-z0-9][a-z0-9._-]*[a-z0-9]$/.test(id)) {
|
|
250
|
-
return "id must use lowercase letters, numbers, dots, underscores, or hyphens and start/end alphanumeric";
|
|
251
|
-
}
|
|
252
|
-
return null;
|
|
253
|
-
}
|
|
254
|
-
function readJsonOrYaml(filePath) {
|
|
255
|
-
const raw = readFileSync(filePath, "utf8");
|
|
256
|
-
if (filePath.endsWith(".json")) return JSON.parse(raw);
|
|
257
|
-
return (0, import_yaml.parse)(raw);
|
|
258
|
-
}
|
|
259
|
-
function normalizeResources(value) {
|
|
260
|
-
if (!isRecord(value)) return {};
|
|
261
|
-
const out = {};
|
|
262
|
-
const skills = trimString(value.skills);
|
|
263
|
-
const prompts = trimString(value.prompts);
|
|
264
|
-
const agents = trimString(value.agents);
|
|
265
|
-
const fleets = trimString(value.fleets);
|
|
266
|
-
const themes = trimString(value.themes);
|
|
267
|
-
if (skills) out.skills = skills;
|
|
268
|
-
if (prompts) out.prompts = prompts;
|
|
269
|
-
if (agents) out.agents = agents;
|
|
270
|
-
if (fleets) out.fleets = fleets;
|
|
271
|
-
if (themes) out.themes = themes;
|
|
272
|
-
return out;
|
|
273
|
-
}
|
|
274
|
-
function contained(root, candidate) {
|
|
275
|
-
const relative = path.relative(root, candidate);
|
|
276
|
-
return relative === "" || !relative.startsWith(`..${path.sep}`) && relative !== ".." && !path.isAbsolute(relative);
|
|
277
|
-
}
|
|
278
|
-
function validateResourceTree(root, resourcePath, kind, diagnostics) {
|
|
279
|
-
if (path.isAbsolute(resourcePath)) {
|
|
280
|
-
diagnostics.push({ type: "error", message: `resources.${kind} must be relative`, path: resourcePath });
|
|
281
|
-
return;
|
|
282
|
-
}
|
|
283
|
-
const resolvedRoot = path.resolve(root);
|
|
284
|
-
const resolved = path.resolve(resolvedRoot, resourcePath);
|
|
285
|
-
if (!contained(resolvedRoot, resolved) || resolved === resolvedRoot) {
|
|
286
|
-
diagnostics.push({ type: "error", message: `resources.${kind} escapes the extension root`, path: resourcePath });
|
|
287
|
-
return;
|
|
288
|
-
}
|
|
289
|
-
let canonicalRoot;
|
|
290
|
-
let canonicalResource;
|
|
291
|
-
try {
|
|
292
|
-
canonicalRoot = realpathSync(resolvedRoot);
|
|
293
|
-
canonicalResource = realpathSync(resolved);
|
|
294
|
-
if (!lstatSync(resolved).isDirectory()) {
|
|
295
|
-
diagnostics.push({ type: "error", message: `resources.${kind} is not a directory`, path: resolved });
|
|
296
|
-
return;
|
|
297
|
-
}
|
|
298
|
-
} catch (error) {
|
|
299
|
-
diagnostics.push({
|
|
300
|
-
type: "error",
|
|
301
|
-
message: `resources.${kind} cannot be resolved: ${error instanceof Error ? error.message : String(error)}`,
|
|
302
|
-
path: resolved
|
|
303
|
-
});
|
|
304
|
-
return;
|
|
305
|
-
}
|
|
306
|
-
if (!contained(canonicalRoot, canonicalResource)) {
|
|
307
|
-
diagnostics.push({ type: "error", message: `resources.${kind} escapes through a symbolic link`, path: resolved });
|
|
308
|
-
return;
|
|
309
|
-
}
|
|
310
|
-
const pending = [resolved];
|
|
311
|
-
while (pending.length > 0) {
|
|
312
|
-
const directory = pending.pop();
|
|
313
|
-
if (!directory) continue;
|
|
314
|
-
for (const entry of readdirSync(directory, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
315
|
-
const candidate = path.join(directory, entry.name);
|
|
316
|
-
if (entry.isSymbolicLink()) {
|
|
317
|
-
try {
|
|
318
|
-
if (!contained(canonicalRoot, realpathSync(candidate))) {
|
|
319
|
-
diagnostics.push({
|
|
320
|
-
type: "error",
|
|
321
|
-
message: `resources.${kind} contains an escaping symbolic link`,
|
|
322
|
-
path: candidate
|
|
323
|
-
});
|
|
324
|
-
}
|
|
325
|
-
} catch (error) {
|
|
326
|
-
diagnostics.push({
|
|
327
|
-
type: "error",
|
|
328
|
-
message: `resources.${kind} contains an unresolved symbolic link: ${error instanceof Error ? error.message : String(error)}`,
|
|
329
|
-
path: candidate
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
} else if (entry.isDirectory()) {
|
|
333
|
-
pending.push(candidate);
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
function validateResourceRoots(root, resources, diagnostics) {
|
|
339
|
-
for (const [kind, resourcePath] of Object.entries(resources)) {
|
|
340
|
-
if (resourcePath) validateResourceTree(root, resourcePath, kind, diagnostics);
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
function stringArray(value) {
|
|
344
|
-
if (!Array.isArray(value)) return void 0;
|
|
345
|
-
const out = value.map((entry) => trimString(entry)).filter((entry) => entry !== void 0);
|
|
346
|
-
return out.length > 0 ? out : void 0;
|
|
347
|
-
}
|
|
348
|
-
function parseExtensionManifest(value, manifestPath) {
|
|
349
|
-
const diagnostics = [];
|
|
350
|
-
if (!isRecord(value)) {
|
|
351
|
-
return { diagnostics: [{ type: "error", message: "extension manifest must be an object", path: manifestPath }] };
|
|
352
|
-
}
|
|
353
|
-
if (value.manifestVersion !== 1) {
|
|
354
|
-
diagnostics.push({ type: "error", message: "manifestVersion must be 1", path: manifestPath });
|
|
355
|
-
}
|
|
356
|
-
const id = trimString(value.id);
|
|
357
|
-
const name = trimString(value.name) ?? id;
|
|
358
|
-
const version = trimString(value.version);
|
|
359
|
-
const description = trimString(value.description);
|
|
360
|
-
if (!id) diagnostics.push({ type: "error", message: "id is required", path: manifestPath });
|
|
361
|
-
else {
|
|
362
|
-
const idError = validateId(id);
|
|
363
|
-
if (idError) diagnostics.push({ type: "error", message: idError, path: manifestPath });
|
|
364
|
-
}
|
|
365
|
-
if (!version) diagnostics.push({ type: "error", message: "version is required", path: manifestPath });
|
|
366
|
-
if (!description) diagnostics.push({ type: "error", message: "description is required", path: manifestPath });
|
|
367
|
-
const resources = normalizeResources(value.resources);
|
|
368
|
-
const tools = stringArray(value.tools);
|
|
369
|
-
const settings = stringArray(value.settings);
|
|
370
|
-
let compatibility;
|
|
371
|
-
if (value.compatibility !== void 0) {
|
|
372
|
-
if (!isRecord(value.compatibility)) {
|
|
373
|
-
diagnostics.push({ type: "error", message: "compatibility must be an object", path: manifestPath });
|
|
374
|
-
} else if ("clio" in value.compatibility) {
|
|
375
|
-
const range = trimString(value.compatibility.clio);
|
|
376
|
-
if (range === void 0) {
|
|
377
|
-
diagnostics.push({
|
|
378
|
-
type: "error",
|
|
379
|
-
message: "compatibility.clio must be a non-empty semver range",
|
|
380
|
-
path: manifestPath
|
|
381
|
-
});
|
|
382
|
-
} else {
|
|
383
|
-
const evaluation = evaluateClioCompatibility(range);
|
|
384
|
-
if (!evaluation.rangeValid) {
|
|
385
|
-
diagnostics.push({
|
|
386
|
-
type: "error",
|
|
387
|
-
message: `extension ${id ?? "<unknown>"} declares malformed compatibility.clio range '${range}'`,
|
|
388
|
-
path: manifestPath
|
|
389
|
-
});
|
|
390
|
-
} else {
|
|
391
|
-
compatibility = { clio: range };
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
if (!id || !name || !version || !description || diagnostics.some((diag) => diag.type === "error")) {
|
|
397
|
-
return { diagnostics };
|
|
398
|
-
}
|
|
399
|
-
const manifest = {
|
|
400
|
-
manifestVersion: 1,
|
|
401
|
-
id,
|
|
402
|
-
name,
|
|
403
|
-
version,
|
|
404
|
-
description,
|
|
405
|
-
resources
|
|
406
|
-
};
|
|
407
|
-
if (tools) manifest.tools = tools;
|
|
408
|
-
if (settings) manifest.settings = settings;
|
|
409
|
-
if (compatibility && Object.keys(compatibility).length > 0) manifest.compatibility = compatibility;
|
|
410
|
-
const clioRange = manifest.compatibility?.clio;
|
|
411
|
-
if (clioRange !== void 0) {
|
|
412
|
-
const evaluation = evaluateClioCompatibility(clioRange);
|
|
413
|
-
if (!evaluation.satisfied) {
|
|
414
|
-
diagnostics.push({
|
|
415
|
-
type: "error",
|
|
416
|
-
message: `extension ${manifest.id} requires Clio '${clioRange}', but running Clio version is '${evaluation.runningVersion}'`,
|
|
417
|
-
path: manifestPath
|
|
418
|
-
});
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
return { manifest, diagnostics };
|
|
422
|
-
}
|
|
423
|
-
function findExtensionManifestPath(root) {
|
|
424
|
-
for (const name of MANIFEST_NAMES) {
|
|
425
|
-
const candidate = path.join(root, name);
|
|
426
|
-
try {
|
|
427
|
-
if (statSync(candidate).isFile()) return candidate;
|
|
428
|
-
} catch {
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
return null;
|
|
432
|
-
}
|
|
433
|
-
function loadManifestFromRoot(root) {
|
|
434
|
-
const manifestPath = findExtensionManifestPath(root);
|
|
435
|
-
if (!manifestPath) {
|
|
436
|
-
return {
|
|
437
|
-
path: root,
|
|
438
|
-
valid: false,
|
|
439
|
-
diagnostics: [{ type: "error", message: "extension manifest not found", path: root }]
|
|
440
|
-
};
|
|
441
|
-
}
|
|
442
|
-
try {
|
|
443
|
-
const parsed = parseExtensionManifest(readJsonOrYaml(manifestPath), manifestPath);
|
|
444
|
-
if (parsed.manifest) validateResourceRoots(root, parsed.manifest.resources, parsed.diagnostics);
|
|
445
|
-
return {
|
|
446
|
-
path: root,
|
|
447
|
-
manifestPath,
|
|
448
|
-
...parsed.manifest ? { manifest: parsed.manifest } : {},
|
|
449
|
-
valid: parsed.manifest !== void 0 && !parsed.diagnostics.some((diag) => diag.type === "error"),
|
|
450
|
-
diagnostics: parsed.diagnostics
|
|
451
|
-
};
|
|
452
|
-
} catch (err) {
|
|
453
|
-
const reason = err instanceof Error ? err.message : String(err);
|
|
454
|
-
return {
|
|
455
|
-
path: root,
|
|
456
|
-
manifestPath,
|
|
457
|
-
valid: false,
|
|
458
|
-
diagnostics: [{ type: "error", message: `extension manifest could not be read: ${reason}`, path: manifestPath }]
|
|
459
|
-
};
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
function discoverExtensionPackages(root) {
|
|
463
|
-
const full = path.resolve(root);
|
|
464
|
-
if (!existsSync(full)) {
|
|
465
|
-
return [{ path: full, valid: false, diagnostics: [{ type: "error", message: "path does not exist", path: full }] }];
|
|
466
|
-
}
|
|
467
|
-
const stat = statSync(full);
|
|
468
|
-
if (!stat.isDirectory()) {
|
|
469
|
-
return [
|
|
470
|
-
{
|
|
471
|
-
path: full,
|
|
472
|
-
valid: false,
|
|
473
|
-
diagnostics: [{ type: "error", message: "extension path is not a directory", path: full }]
|
|
474
|
-
}
|
|
475
|
-
];
|
|
476
|
-
}
|
|
477
|
-
const direct = loadManifestFromRoot(full);
|
|
478
|
-
if (direct.valid || direct.manifestPath) return [direct];
|
|
479
|
-
const candidates = [];
|
|
480
|
-
for (const entry of readdirSync(full, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
481
|
-
if (!entry.isDirectory() || entry.name.startsWith(".")) continue;
|
|
482
|
-
const child = path.join(full, entry.name);
|
|
483
|
-
const loaded = loadManifestFromRoot(child);
|
|
484
|
-
if (loaded.valid || loaded.manifestPath) candidates.push(loaded);
|
|
485
|
-
}
|
|
486
|
-
const discovered = candidates.length > 0 ? candidates : [direct];
|
|
487
|
-
const ids = /* @__PURE__ */ new Map();
|
|
488
|
-
for (const candidate of discovered) {
|
|
489
|
-
const id = candidate.manifest?.id;
|
|
490
|
-
if (!id) continue;
|
|
491
|
-
const group = ids.get(id) ?? [];
|
|
492
|
-
group.push(candidate);
|
|
493
|
-
ids.set(id, group);
|
|
494
|
-
}
|
|
495
|
-
for (const [id, group] of ids) {
|
|
496
|
-
if (group.length < 2) continue;
|
|
497
|
-
for (const candidate of group) {
|
|
498
|
-
candidate.valid = false;
|
|
499
|
-
candidate.diagnostics.push({
|
|
500
|
-
type: "error",
|
|
501
|
-
message: `duplicate extension id ${id}`,
|
|
502
|
-
path: candidate.manifestPath ?? candidate.path
|
|
503
|
-
});
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
return discovered;
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
// src/domains/extensions/state.ts
|
|
510
|
-
init_esm_shims();
|
|
511
|
-
import { cpSync, existsSync as existsSync2, mkdirSync, readdirSync as readdirSync2, readFileSync as readFileSync2, renameSync, rmSync } from "node:fs";
|
|
512
|
-
import path2 from "node:path";
|
|
513
|
-
var DEFAULT_STATE = { version: 1, disabled: [], installed: {} };
|
|
514
|
-
function extensionBaseDir(scope, cwd = process.cwd()) {
|
|
515
|
-
return scope === "user" ? path2.join(clioConfigDir(), "extensions") : path2.join(path2.resolve(cwd), ".clio-coder", "extensions");
|
|
516
|
-
}
|
|
517
|
-
function statePath(scope, cwd = process.cwd()) {
|
|
518
|
-
return path2.join(extensionBaseDir(scope, cwd), "state.json");
|
|
519
|
-
}
|
|
520
|
-
function scopeRank(scope) {
|
|
521
|
-
return scope === "project" ? 2 : 1;
|
|
522
|
-
}
|
|
523
|
-
function readState(scope, cwd = process.cwd()) {
|
|
524
|
-
const filePath = statePath(scope, cwd);
|
|
525
|
-
if (!existsSync2(filePath)) return structuredClone(DEFAULT_STATE);
|
|
526
|
-
try {
|
|
527
|
-
const parsed = JSON.parse(readFileSync2(filePath, "utf8"));
|
|
528
|
-
if (!isRecord(parsed) || parsed.version !== 1) return structuredClone(DEFAULT_STATE);
|
|
529
|
-
const disabled = Array.isArray(parsed.disabled) ? parsed.disabled.filter((entry) => typeof entry === "string") : [];
|
|
530
|
-
const installed = isRecord(parsed.installed) ? Object.fromEntries(
|
|
531
|
-
Object.entries(parsed.installed).flatMap(([id, raw]) => {
|
|
532
|
-
if (!isRecord(raw)) return [];
|
|
533
|
-
const installedAt = trimString(raw.installedAt) ?? (/* @__PURE__ */ new Date(0)).toISOString();
|
|
534
|
-
const source = trimString(raw.source);
|
|
535
|
-
return [[id, { installedAt, ...source ? { source } : {} }]];
|
|
536
|
-
})
|
|
537
|
-
) : {};
|
|
538
|
-
return { version: 1, disabled, installed };
|
|
539
|
-
} catch {
|
|
540
|
-
return structuredClone(DEFAULT_STATE);
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
function writeState(scope, state, cwd = process.cwd()) {
|
|
544
|
-
const filePath = statePath(scope, cwd);
|
|
545
|
-
safeResourceWrite(filePath, `${JSON.stringify(state, null, 2)}
|
|
546
|
-
`, { encoding: "utf8" });
|
|
547
|
-
}
|
|
548
|
-
function installedFromRoot(root, scope, state) {
|
|
549
|
-
const candidate = loadManifestFromRoot(root);
|
|
550
|
-
const manifest = candidate.manifest;
|
|
551
|
-
if (!manifest || !candidate.manifestPath) return null;
|
|
552
|
-
const clioRange = manifest.compatibility?.clio;
|
|
553
|
-
const compatible = clioRange === void 0 || evaluateClioCompatibility(clioRange).satisfied;
|
|
554
|
-
return {
|
|
555
|
-
id: manifest.id,
|
|
556
|
-
name: manifest.name,
|
|
557
|
-
version: manifest.version,
|
|
558
|
-
description: manifest.description,
|
|
559
|
-
scope,
|
|
560
|
-
rootPath: root,
|
|
561
|
-
manifestPath: candidate.manifestPath,
|
|
562
|
-
enabled: !state.disabled.includes(manifest.id),
|
|
563
|
-
compatible,
|
|
564
|
-
effective: false,
|
|
565
|
-
resources: manifest.resources,
|
|
566
|
-
diagnostics: candidate.diagnostics
|
|
567
|
-
};
|
|
568
|
-
}
|
|
569
|
-
function listScope(scope, cwd = process.cwd()) {
|
|
570
|
-
const base = extensionBaseDir(scope, cwd);
|
|
571
|
-
if (!existsSync2(base)) return [];
|
|
572
|
-
const state = readState(scope, cwd);
|
|
573
|
-
const out = [];
|
|
574
|
-
for (const entry of readdirSync2(base, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
575
|
-
if (!entry.isDirectory()) continue;
|
|
576
|
-
const root = path2.join(base, entry.name);
|
|
577
|
-
const installed = installedFromRoot(root, scope, state);
|
|
578
|
-
if (installed) out.push(installed);
|
|
579
|
-
}
|
|
580
|
-
return out;
|
|
581
|
-
}
|
|
582
|
-
function listInstalledExtensions(cwd = process.cwd(), options = {}) {
|
|
583
|
-
const scopes = options.scope ? [options.scope] : ["user", "project"];
|
|
584
|
-
const entries = scopes.flatMap((scope) => listScope(scope, cwd));
|
|
585
|
-
const byId = /* @__PURE__ */ new Map();
|
|
586
|
-
for (const entry of entries) {
|
|
587
|
-
const list = byId.get(entry.id) ?? [];
|
|
588
|
-
list.push(entry);
|
|
589
|
-
byId.set(entry.id, list);
|
|
590
|
-
}
|
|
591
|
-
for (const group of byId.values()) {
|
|
592
|
-
const winner = group.filter((entry) => entry.compatible).sort((a, b) => scopeRank(a.scope) - scopeRank(b.scope)).at(-1);
|
|
593
|
-
for (const entry of group) {
|
|
594
|
-
entry.effective = entry === winner;
|
|
595
|
-
if (entry.compatible && !entry.effective && winner) entry.overriddenBy = winner.scope;
|
|
596
|
-
}
|
|
597
|
-
}
|
|
598
|
-
const all = options.all === true ? entries : entries.filter((entry) => entry.effective || !entry.compatible);
|
|
599
|
-
return all.sort((a, b) => {
|
|
600
|
-
const id = a.id.localeCompare(b.id);
|
|
601
|
-
if (id !== 0) return id;
|
|
602
|
-
return scopeRank(a.scope) - scopeRank(b.scope);
|
|
603
|
-
});
|
|
604
|
-
}
|
|
605
|
-
function findInstalled(id, cwd, scope) {
|
|
606
|
-
const entries = listInstalledExtensions(cwd, { ...scope ? { scope } : {}, all: true }).filter(
|
|
607
|
-
(entry) => entry.id === id
|
|
608
|
-
);
|
|
609
|
-
if (entries.length === 0) return null;
|
|
610
|
-
return [...entries].sort((a, b) => scopeRank(a.scope) - scopeRank(b.scope)).at(-1) ?? null;
|
|
611
|
-
}
|
|
612
|
-
function installExtension(sourcePath, options = {}) {
|
|
613
|
-
const scope = options.scope ?? "user";
|
|
614
|
-
const cwd = options.cwd ?? process.cwd();
|
|
615
|
-
const source = path2.resolve(sourcePath);
|
|
616
|
-
const candidate = loadManifestFromRoot(source);
|
|
617
|
-
if (!candidate.manifest || !candidate.valid) return { diagnostics: candidate.diagnostics };
|
|
618
|
-
const targetRoot = path2.join(extensionBaseDir(scope, cwd), candidate.manifest.id);
|
|
619
|
-
if (existsSync2(targetRoot)) {
|
|
620
|
-
if (!options.force) {
|
|
621
|
-
return {
|
|
622
|
-
diagnostics: [
|
|
623
|
-
{ type: "error", message: `extension ${candidate.manifest.id} is already installed`, path: targetRoot }
|
|
624
|
-
]
|
|
625
|
-
};
|
|
626
|
-
}
|
|
627
|
-
}
|
|
628
|
-
const parent = path2.dirname(targetRoot);
|
|
629
|
-
const stagingRoot = path2.join(parent, `.${candidate.manifest.id}.install-${process.pid}-${Date.now()}`);
|
|
630
|
-
const backupRoot = path2.join(parent, `.${candidate.manifest.id}.backup-${process.pid}-${Date.now()}`);
|
|
631
|
-
let installedReplacement = false;
|
|
632
|
-
let movedExisting = false;
|
|
633
|
-
const state = readState(scope, cwd);
|
|
634
|
-
try {
|
|
635
|
-
mkdirSync(parent, { recursive: true });
|
|
636
|
-
rmSync(stagingRoot, { recursive: true, force: true });
|
|
637
|
-
rmSync(backupRoot, { recursive: true, force: true });
|
|
638
|
-
cpSync(source, stagingRoot, {
|
|
639
|
-
recursive: true,
|
|
640
|
-
// `state.json` beside the installed extension directories belongs to
|
|
641
|
-
// Clio's extension manager. An extension may legitimately ship nested
|
|
642
|
-
// resources with the same basename (for example a project-state JSON
|
|
643
|
-
// template), so exclude only a bookkeeping file at the package root.
|
|
644
|
-
filter: (src) => path2.relative(source, src) !== "state.json"
|
|
645
|
-
});
|
|
646
|
-
if (existsSync2(targetRoot)) {
|
|
647
|
-
renameSync(targetRoot, backupRoot);
|
|
648
|
-
movedExisting = true;
|
|
649
|
-
}
|
|
650
|
-
renameSync(stagingRoot, targetRoot);
|
|
651
|
-
installedReplacement = true;
|
|
652
|
-
state.installed[candidate.manifest.id] = { installedAt: (/* @__PURE__ */ new Date()).toISOString(), source };
|
|
653
|
-
state.disabled = state.disabled.filter((entry) => entry !== candidate.manifest?.id);
|
|
654
|
-
writeState(scope, state, cwd);
|
|
655
|
-
rmSync(backupRoot, { recursive: true, force: true });
|
|
656
|
-
} catch (error) {
|
|
657
|
-
rmSync(stagingRoot, { recursive: true, force: true });
|
|
658
|
-
if (installedReplacement) rmSync(targetRoot, { recursive: true, force: true });
|
|
659
|
-
if (movedExisting && existsSync2(backupRoot) && !existsSync2(targetRoot)) {
|
|
660
|
-
renameSync(backupRoot, targetRoot);
|
|
661
|
-
}
|
|
662
|
-
return {
|
|
663
|
-
diagnostics: [
|
|
664
|
-
{
|
|
665
|
-
type: "error",
|
|
666
|
-
message: `extension ${candidate.manifest.id} install failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
667
|
-
path: targetRoot
|
|
668
|
-
}
|
|
669
|
-
]
|
|
670
|
-
};
|
|
671
|
-
}
|
|
672
|
-
const installed = findInstalled(candidate.manifest.id, cwd, scope);
|
|
673
|
-
return {
|
|
674
|
-
...installed ? { extension: installed } : {},
|
|
675
|
-
diagnostics: candidate.diagnostics
|
|
676
|
-
};
|
|
677
|
-
}
|
|
678
|
-
function mutateEnabled(id, enabled, options = {}) {
|
|
679
|
-
const cwd = options.cwd ?? process.cwd();
|
|
680
|
-
const target = findInstalled(id, cwd, options.scope);
|
|
681
|
-
if (!target) {
|
|
682
|
-
return { diagnostics: [{ type: "error", message: `extension ${id} is not installed` }] };
|
|
683
|
-
}
|
|
684
|
-
const state = readState(target.scope, cwd);
|
|
685
|
-
if (enabled) state.disabled = state.disabled.filter((entry) => entry !== id);
|
|
686
|
-
else if (!state.disabled.includes(id)) state.disabled.push(id);
|
|
687
|
-
writeState(target.scope, state, cwd);
|
|
688
|
-
const extension = findInstalled(id, cwd, target.scope) ?? void 0;
|
|
689
|
-
return { ...extension ? { extension } : {}, diagnostics: [] };
|
|
690
|
-
}
|
|
691
|
-
function enableExtension(id, options = {}) {
|
|
692
|
-
return mutateEnabled(id, true, options);
|
|
693
|
-
}
|
|
694
|
-
function disableExtension(id, options = {}) {
|
|
695
|
-
return mutateEnabled(id, false, options);
|
|
696
|
-
}
|
|
697
|
-
function removeExtension(id, options = {}) {
|
|
698
|
-
const cwd = options.cwd ?? process.cwd();
|
|
699
|
-
const target = findInstalled(id, cwd, options.scope);
|
|
700
|
-
if (!target) {
|
|
701
|
-
return { diagnostics: [{ type: "error", message: `extension ${id} is not installed` }] };
|
|
702
|
-
}
|
|
703
|
-
rmSync(target.rootPath, { recursive: true, force: true });
|
|
704
|
-
const state = readState(target.scope, cwd);
|
|
705
|
-
Reflect.deleteProperty(state.installed, id);
|
|
706
|
-
state.disabled = state.disabled.filter((entry) => entry !== id);
|
|
707
|
-
writeState(target.scope, state, cwd);
|
|
708
|
-
return { removed: { id, scope: target.scope, path: target.rootPath }, diagnostics: [] };
|
|
709
|
-
}
|
|
710
|
-
|
|
711
|
-
// src/domains/extensions/manager.ts
|
|
712
|
-
init_esm_shims();
|
|
713
|
-
|
|
714
|
-
// src/domains/extensions/resources.ts
|
|
715
|
-
init_esm_shims();
|
|
716
|
-
import { lstatSync as lstatSync2, realpathSync as realpathSync2 } from "node:fs";
|
|
717
|
-
import path3 from "node:path";
|
|
718
|
-
function extensionResourcePath(rootPath, resourcePath) {
|
|
719
|
-
const root = path3.resolve(rootPath);
|
|
720
|
-
const full = path3.resolve(root, resourcePath);
|
|
721
|
-
const relative = path3.relative(root, full);
|
|
722
|
-
if (relative === "" || relative === ".." || relative.startsWith(`..${path3.sep}`) || path3.isAbsolute(relative))
|
|
723
|
-
return null;
|
|
724
|
-
try {
|
|
725
|
-
const rootReal = realpathSync2(root);
|
|
726
|
-
const fullReal = realpathSync2(full);
|
|
727
|
-
const canonicalRelative = path3.relative(rootReal, fullReal);
|
|
728
|
-
if (canonicalRelative === ".." || canonicalRelative.startsWith(`..${path3.sep}`) || path3.isAbsolute(canonicalRelative)) {
|
|
729
|
-
return null;
|
|
730
|
-
}
|
|
731
|
-
if (!lstatSync2(full).isDirectory()) return null;
|
|
732
|
-
return full;
|
|
733
|
-
} catch {
|
|
734
|
-
return null;
|
|
735
|
-
}
|
|
736
|
-
}
|
|
737
|
-
function enabledExtensionResourceRoots(kind, cwd = process.cwd()) {
|
|
738
|
-
const roots = [];
|
|
739
|
-
for (const entry of listInstalledExtensions(cwd)) {
|
|
740
|
-
if (!entry.enabled || !entry.compatible || !entry.effective) continue;
|
|
741
|
-
const rel = entry.resources[kind];
|
|
742
|
-
if (!rel) continue;
|
|
743
|
-
const full = extensionResourcePath(entry.rootPath, rel);
|
|
744
|
-
if (!full) continue;
|
|
745
|
-
roots.push({
|
|
746
|
-
id: entry.id,
|
|
747
|
-
scope: entry.scope,
|
|
748
|
-
path: full,
|
|
749
|
-
rootPath: entry.rootPath,
|
|
750
|
-
source: `extension:${entry.scope}:${entry.id}`
|
|
751
|
-
});
|
|
752
|
-
}
|
|
753
|
-
return roots;
|
|
754
|
-
}
|
|
755
|
-
|
|
756
|
-
// src/domains/extensions/index.ts
|
|
757
|
-
init_esm_shims();
|
|
758
|
-
|
|
759
|
-
// src/domains/extensions/extension.ts
|
|
760
|
-
init_esm_shims();
|
|
761
|
-
function createExtensionsBundle(_context) {
|
|
762
|
-
const extension = {
|
|
763
|
-
start() {
|
|
764
|
-
return void 0;
|
|
765
|
-
}
|
|
766
|
-
};
|
|
767
|
-
const contract = {
|
|
768
|
-
list(cwd, options = {}) {
|
|
769
|
-
return listInstalledExtensions(cwd, options);
|
|
770
|
-
},
|
|
771
|
-
discover(root) {
|
|
772
|
-
return discoverExtensionPackages(root);
|
|
773
|
-
},
|
|
774
|
-
install(root, options = {}) {
|
|
775
|
-
return installExtension(root, options);
|
|
776
|
-
},
|
|
777
|
-
enable(id, options = {}) {
|
|
778
|
-
return enableExtension(id, options);
|
|
779
|
-
},
|
|
780
|
-
disable(id, options = {}) {
|
|
781
|
-
return disableExtension(id, options);
|
|
782
|
-
},
|
|
783
|
-
remove(id, options = {}) {
|
|
784
|
-
return removeExtension(id, options);
|
|
785
|
-
},
|
|
786
|
-
resourceRoots(kind, cwd) {
|
|
787
|
-
return enabledExtensionResourceRoots(kind, cwd);
|
|
788
|
-
},
|
|
789
|
-
async reload() {
|
|
790
|
-
return void 0;
|
|
791
|
-
}
|
|
792
|
-
};
|
|
793
|
-
return { extension, contract };
|
|
794
|
-
}
|
|
795
|
-
|
|
796
|
-
// src/domains/extensions/manifest.ts
|
|
797
|
-
init_esm_shims();
|
|
798
|
-
var ExtensionsManifest = {
|
|
799
|
-
name: "extensions",
|
|
800
|
-
dependsOn: ["config"]
|
|
801
|
-
};
|
|
802
|
-
|
|
803
|
-
// src/domains/extensions/index.ts
|
|
804
|
-
var ExtensionsDomainModule = {
|
|
805
|
-
manifest: ExtensionsManifest,
|
|
806
|
-
createExtension: createExtensionsBundle
|
|
807
|
-
};
|
|
808
|
-
|
|
809
|
-
export {
|
|
810
|
-
discoverExtensionPackages,
|
|
811
|
-
listInstalledExtensions,
|
|
812
|
-
installExtension,
|
|
813
|
-
enableExtension,
|
|
814
|
-
disableExtension,
|
|
815
|
-
removeExtension,
|
|
816
|
-
enabledExtensionResourceRoots,
|
|
817
|
-
ExtensionsDomainModule
|
|
818
|
-
};
|
|
819
|
-
//# sourceMappingURL=chunk-SUW5DORT.js.map
|