opendevbrowser 0.0.28 → 0.0.29
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/README.md +2 -2
- package/dist/accessibility-snapshot-PA6NWNS7.js +39 -0
- package/dist/accessibility-snapshot-PA6NWNS7.js.map +1 -0
- package/dist/active-window-YNYTIPZN.js +37 -0
- package/dist/active-window-YNYTIPZN.js.map +1 -0
- package/dist/annotate-STYHXZYJ.js +205 -0
- package/dist/annotate-STYHXZYJ.js.map +1 -0
- package/dist/artifacts-KJ6RNDO2.js +120 -0
- package/dist/artifacts-KJ6RNDO2.js.map +1 -0
- package/dist/attr-GHFZZ4SA.js +84 -0
- package/dist/attr-GHFZZ4SA.js.map +1 -0
- package/dist/browser/ops-client.d.ts +1 -0
- package/dist/browser/ops-client.d.ts.map +1 -1
- package/dist/canvas-54FBOEGP.js +309 -0
- package/dist/canvas-54FBOEGP.js.map +1 -0
- package/dist/capture-desktop-SNABC24E.js +38 -0
- package/dist/capture-desktop-SNABC24E.js.map +1 -0
- package/dist/capture-window-UJSB5AMP.js +40 -0
- package/dist/capture-window-UJSB5AMP.js.map +1 -0
- package/dist/check-ST5UQ2F5.js +71 -0
- package/dist/check-ST5UQ2F5.js.map +1 -0
- package/dist/checked-IEMWI5CU.js +71 -0
- package/dist/checked-IEMWI5CU.js.map +1 -0
- package/dist/chunk-2CG4SW3E.js +64 -0
- package/dist/chunk-2CG4SW3E.js.map +1 -0
- package/dist/chunk-2SIMIPLY.js +67 -0
- package/dist/chunk-2SIMIPLY.js.map +1 -0
- package/dist/chunk-37VSRUW4.js +141 -0
- package/dist/chunk-37VSRUW4.js.map +1 -0
- package/dist/chunk-5SWZDVOW.js +144 -0
- package/dist/chunk-5SWZDVOW.js.map +1 -0
- package/dist/chunk-6PVZ2ABC.js +429 -0
- package/dist/chunk-6PVZ2ABC.js.map +1 -0
- package/dist/chunk-7GVOUZMQ.js +64 -0
- package/dist/chunk-7GVOUZMQ.js.map +1 -0
- package/dist/chunk-7THCPS52.js +84 -0
- package/dist/chunk-7THCPS52.js.map +1 -0
- package/dist/chunk-ASMHEEKY.js +10 -0
- package/dist/chunk-ASMHEEKY.js.map +1 -0
- package/dist/chunk-DBF5OKH3.js +111 -0
- package/dist/chunk-DBF5OKH3.js.map +1 -0
- package/dist/chunk-DW4TX7MU.js +54 -0
- package/dist/chunk-DW4TX7MU.js.map +1 -0
- package/dist/chunk-IPE7TF2P.js +54 -0
- package/dist/chunk-IPE7TF2P.js.map +1 -0
- package/dist/chunk-IQTJHXZJ.js +126 -0
- package/dist/chunk-IQTJHXZJ.js.map +1 -0
- package/dist/chunk-J47N77VG.js +2969 -0
- package/dist/chunk-J47N77VG.js.map +1 -0
- package/dist/chunk-JZXD6FWR.js +25 -0
- package/dist/chunk-JZXD6FWR.js.map +1 -0
- package/dist/{chunk-QVWOPIZJ.js → chunk-KDSNXS6N.js} +75 -149
- package/dist/chunk-KDSNXS6N.js.map +1 -0
- package/dist/chunk-KZ2IXVQT.js +219 -0
- package/dist/chunk-KZ2IXVQT.js.map +1 -0
- package/dist/chunk-LBPELU7L.js +3649 -0
- package/dist/chunk-LBPELU7L.js.map +1 -0
- package/dist/chunk-MX3NFLCE.js +940 -0
- package/dist/chunk-MX3NFLCE.js.map +1 -0
- package/dist/chunk-N44UXKIB.js +26 -0
- package/dist/chunk-N44UXKIB.js.map +1 -0
- package/dist/chunk-OW5HMYMI.js +19 -0
- package/dist/chunk-OW5HMYMI.js.map +1 -0
- package/dist/chunk-OYNLAZQU.js +838 -0
- package/dist/chunk-OYNLAZQU.js.map +1 -0
- package/dist/chunk-PDPJN2OP.js +17 -0
- package/dist/chunk-PDPJN2OP.js.map +1 -0
- package/dist/chunk-RCZZGGJS.js +226 -0
- package/dist/chunk-RCZZGGJS.js.map +1 -0
- package/dist/chunk-RJNI3BHT.js +1 -0
- package/dist/chunk-RPXWUCQQ.js +112 -0
- package/dist/chunk-RPXWUCQQ.js.map +1 -0
- package/dist/chunk-S5KZQJJI.js +107 -0
- package/dist/chunk-S5KZQJJI.js.map +1 -0
- package/dist/{chunk-T3VVHJTK.js → chunk-S6S2UP6U.js} +1074 -1459
- package/dist/chunk-S6S2UP6U.js.map +1 -0
- package/dist/{chunk-I5ZCOZZV.js → chunk-SXAGSEKZ.js} +1202 -9561
- package/dist/chunk-SXAGSEKZ.js.map +1 -0
- package/dist/chunk-T4GMCW6Z.js +46 -0
- package/dist/chunk-T4GMCW6Z.js.map +1 -0
- package/dist/chunk-WHQZBUNY.js +982 -0
- package/dist/chunk-WHQZBUNY.js.map +1 -0
- package/dist/chunk-WOXBLP7V.js +610 -0
- package/dist/chunk-WOXBLP7V.js.map +1 -0
- package/dist/cli/commands/inspiredesign.d.ts.map +1 -1
- package/dist/cli/commands/macro-resolve.d.ts +4 -1
- package/dist/cli/commands/macro-resolve.d.ts.map +1 -1
- package/dist/cli/commands/product-video.d.ts.map +1 -1
- package/dist/cli/commands/research.d.ts.map +1 -1
- package/dist/cli/commands/serve.d.ts.map +1 -1
- package/dist/cli/commands/shopping.d.ts.map +1 -1
- package/dist/cli/commands/workflow-output.d.ts +2 -0
- package/dist/cli/commands/workflow-output.d.ts.map +1 -0
- package/dist/cli/daemon-commands.d.ts.map +1 -1
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/index.js +204 -8123
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/installers/postinstall-skill-sync.js +2 -1
- package/dist/cli/installers/postinstall-skill-sync.js.map +1 -1
- package/dist/cli/remote-relay.d.ts.map +1 -1
- package/dist/click-TENZA3Y6.js +81 -0
- package/dist/click-TENZA3Y6.js.map +1 -0
- package/dist/clone-component-STH5AR6M.js +82 -0
- package/dist/clone-component-STH5AR6M.js.map +1 -0
- package/dist/clone-page-BSTWAPAJ.js +69 -0
- package/dist/clone-page-BSTWAPAJ.js.map +1 -0
- package/dist/close-CEMMAAM7.js +63 -0
- package/dist/close-CEMMAAM7.js.map +1 -0
- package/dist/close-QCWUNRAI.js +63 -0
- package/dist/close-QCWUNRAI.js.map +1 -0
- package/dist/connect-J3RVSEZF.js +107 -0
- package/dist/connect-J3RVSEZF.js.map +1 -0
- package/dist/console-poll-HL7BVIVX.js +76 -0
- package/dist/console-poll-HL7BVIVX.js.map +1 -0
- package/dist/cookie-import-WMUCIIHN.js +177 -0
- package/dist/cookie-import-WMUCIIHN.js.map +1 -0
- package/dist/cookie-list-PB2N4RPH.js +117 -0
- package/dist/cookie-list-PB2N4RPH.js.map +1 -0
- package/dist/daemon-5KSVMGN4.js +194 -0
- package/dist/daemon-5KSVMGN4.js.map +1 -0
- package/dist/daemon-fingerprint.json +1 -1
- package/dist/debug-trace-snapshot-RK7KDXA5.js +136 -0
- package/dist/debug-trace-snapshot-RK7KDXA5.js.map +1 -0
- package/dist/dialog-P6P4U7XE.js +75 -0
- package/dist/dialog-P6P4U7XE.js.map +1 -0
- package/dist/disconnect-32F7IDIP.js +58 -0
- package/dist/disconnect-32F7IDIP.js.map +1 -0
- package/dist/enabled-A6C6ZM2O.js +71 -0
- package/dist/enabled-A6C6ZM2O.js.map +1 -0
- package/dist/extension-extractor-GKWSFHPN.js +11 -0
- package/dist/extension-extractor-GKWSFHPN.js.map +1 -0
- package/dist/global-D6WLWBXA.js +56 -0
- package/dist/global-D6WLWBXA.js.map +1 -0
- package/dist/goto-ULTSABDM.js +98 -0
- package/dist/goto-ULTSABDM.js.map +1 -0
- package/dist/help-EKKKEDL5.js +491 -0
- package/dist/help-EKKKEDL5.js.map +1 -0
- package/dist/hover-UF2ZUMTQ.js +71 -0
- package/dist/hover-UF2ZUMTQ.js.map +1 -0
- package/dist/html-B6TX7GK7.js +84 -0
- package/dist/html-B6TX7GK7.js.map +1 -0
- package/dist/index.js +68 -34
- package/dist/index.js.map +1 -1
- package/dist/inspector-6S5FKUZQ.js +62 -0
- package/dist/inspector-6S5FKUZQ.js.map +1 -0
- package/dist/inspector-audit-ARGEGOS7.js +84 -0
- package/dist/inspector-audit-ARGEGOS7.js.map +1 -0
- package/dist/inspector-plan-CSG5HZOC.js +69 -0
- package/dist/inspector-plan-CSG5HZOC.js.map +1 -0
- package/dist/inspiredesign-7VRMMZN4.js +234 -0
- package/dist/inspiredesign-7VRMMZN4.js.map +1 -0
- package/dist/install-autostart-output-5DOMKCQL.js +41 -0
- package/dist/install-autostart-output-5DOMKCQL.js.map +1 -0
- package/dist/install-autostart-reconciliation-NHKOFYTD.js +73 -0
- package/dist/install-autostart-reconciliation-NHKOFYTD.js.map +1 -0
- package/dist/launch-REYCIR3Z.js +225 -0
- package/dist/launch-REYCIR3Z.js.map +1 -0
- package/dist/list-NPRXRQY2.js +51 -0
- package/dist/list-NPRXRQY2.js.map +1 -0
- package/dist/list-STYD2ZWA.js +54 -0
- package/dist/list-STYD2ZWA.js.map +1 -0
- package/dist/local-HXJLUUNT.js +54 -0
- package/dist/local-HXJLUUNT.js.map +1 -0
- package/dist/macro-resolve-ZIJZ65QI.js +253 -0
- package/dist/macro-resolve-ZIJZ65QI.js.map +1 -0
- package/dist/macros/execute-runtime.d.ts +3 -1
- package/dist/macros/execute-runtime.d.ts.map +1 -1
- package/dist/macros/execute.d.ts +2 -0
- package/dist/macros/execute.d.ts.map +1 -1
- package/dist/native-UPLVQ2SG.js +22 -0
- package/dist/native-UPLVQ2SG.js.map +1 -0
- package/dist/network-poll-HLDOSC72.js +76 -0
- package/dist/network-poll-HLDOSC72.js.map +1 -0
- package/dist/new-HXLLN6UT.js +69 -0
- package/dist/new-HXLLN6UT.js.map +1 -0
- package/dist/onboarding-metadata-7E3KLYSZ.js +27 -0
- package/dist/onboarding-metadata-7E3KLYSZ.js.map +1 -0
- package/dist/open-KDR25LQZ.js +81 -0
- package/dist/open-KDR25LQZ.js.map +1 -0
- package/dist/opendevbrowser.js +68 -34
- package/dist/opendevbrowser.js.map +1 -1
- package/dist/perf-EM6SWFJ6.js +58 -0
- package/dist/perf-EM6SWFJ6.js.map +1 -0
- package/dist/pointer-down-ZYWRZNCH.js +55 -0
- package/dist/pointer-down-ZYWRZNCH.js.map +1 -0
- package/dist/pointer-drag-LVEAVJO4.js +54 -0
- package/dist/pointer-drag-LVEAVJO4.js.map +1 -0
- package/dist/pointer-move-7SRKUS66.js +52 -0
- package/dist/pointer-move-7SRKUS66.js.map +1 -0
- package/dist/pointer-up-KLDBSK37.js +55 -0
- package/dist/pointer-up-KLDBSK37.js.map +1 -0
- package/dist/press-UIIXFTD7.js +83 -0
- package/dist/press-UIIXFTD7.js.map +1 -0
- package/dist/product-video-PYOXJVAI.js +235 -0
- package/dist/product-video-PYOXJVAI.js.map +1 -0
- package/dist/providers/artifacts.d.ts +0 -2
- package/dist/providers/artifacts.d.ts.map +1 -1
- package/dist/providers/blocker.d.ts.map +1 -1
- package/dist/providers/bounded-map.d.ts +2 -0
- package/dist/providers/bounded-map.d.ts.map +1 -0
- package/dist/providers/community/index.d.ts.map +1 -1
- package/dist/providers/constraint.d.ts.map +1 -1
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/renderer.d.ts.map +1 -1
- package/dist/providers/research-compiler.d.ts +1 -1
- package/dist/providers/research-compiler.d.ts.map +1 -1
- package/dist/providers/research-executor.d.ts.map +1 -1
- package/dist/providers/runtime-factory.d.ts.map +1 -1
- package/dist/providers/shared/traversal-url.d.ts +3 -0
- package/dist/providers/shared/traversal-url.d.ts.map +1 -1
- package/dist/providers/shopping/index.d.ts.map +1 -1
- package/dist/providers/social/search-quality.d.ts.map +1 -1
- package/dist/providers/workflow-handoff.d.ts +4 -0
- package/dist/providers/workflow-handoff.d.ts.map +1 -1
- package/dist/providers/workflows.d.ts.map +1 -1
- package/dist/{providers-QF2RFB4J.js → providers-4YY2BLXG.js} +19 -14
- package/dist/providers-4YY2BLXG.js.map +1 -0
- package/dist/public-surface/generated-manifest.d.ts +2 -2
- package/dist/public-surface/generated-manifest.d.ts.map +1 -1
- package/dist/public-surface/source.d.ts +2 -2
- package/dist/public-surface/source.d.ts.map +1 -1
- package/dist/relay/protocol.d.ts +3 -1
- package/dist/relay/protocol.d.ts.map +1 -1
- package/dist/relay/relay-server.d.ts +6 -0
- package/dist/relay/relay-server.d.ts.map +1 -1
- package/dist/research-CKXMJ2DK.js +295 -0
- package/dist/research-CKXMJ2DK.js.map +1 -0
- package/dist/review-7HWJPZOD.js +48 -0
- package/dist/review-7HWJPZOD.js.map +1 -0
- package/dist/review-desktop-2IBJHFB5.js +54 -0
- package/dist/review-desktop-2IBJHFB5.js.map +1 -0
- package/dist/rpc-3HGIEJUO.js +159 -0
- package/dist/rpc-3HGIEJUO.js.map +1 -0
- package/dist/run-ADRYI3MS.js +180 -0
- package/dist/run-ADRYI3MS.js.map +1 -0
- package/dist/screencast-start-DTLUHD5H.js +67 -0
- package/dist/screencast-start-DTLUHD5H.js.map +1 -0
- package/dist/screencast-stop-54C5LRSS.js +59 -0
- package/dist/screencast-stop-54C5LRSS.js.map +1 -0
- package/dist/screenshot-HOAKR7P7.js +68 -0
- package/dist/screenshot-HOAKR7P7.js.map +1 -0
- package/dist/scroll-IAOO5COY.js +84 -0
- package/dist/scroll-IAOO5COY.js.map +1 -0
- package/dist/scroll-into-view-RKWSLAPH.js +71 -0
- package/dist/scroll-into-view-RKWSLAPH.js.map +1 -0
- package/dist/select-IGD3T6X4.js +86 -0
- package/dist/select-IGD3T6X4.js.map +1 -0
- package/dist/serve-7X4INUCU.js +498 -0
- package/dist/serve-7X4INUCU.js.map +1 -0
- package/dist/shopping-FC6DRW76.js +273 -0
- package/dist/shopping-FC6DRW76.js.map +1 -0
- package/dist/skill-lifecycle-5UAZGKSN.js +89 -0
- package/dist/skill-lifecycle-5UAZGKSN.js.map +1 -0
- package/dist/skills-NSXDX6YM.js +26 -0
- package/dist/skills-NSXDX6YM.js.map +1 -0
- package/dist/snapshot-X22GG324.js +113 -0
- package/dist/snapshot-X22GG324.js.map +1 -0
- package/dist/status-SP55LMNW.js +132 -0
- package/dist/status-SP55LMNW.js.map +1 -0
- package/dist/status-VH2WXIDG.js +35 -0
- package/dist/status-VH2WXIDG.js.map +1 -0
- package/dist/status-capabilities-YBERLRRA.js +57 -0
- package/dist/status-capabilities-YBERLRRA.js.map +1 -0
- package/dist/text-6TB5WNLI.js +84 -0
- package/dist/text-6TB5WNLI.js.map +1 -0
- package/dist/tools/macro_resolve.d.ts.map +1 -1
- package/dist/type-3UI3TQH3.js +94 -0
- package/dist/type-3UI3TQH3.js.map +1 -0
- package/dist/uncheck-5L3D2D4U.js +71 -0
- package/dist/uncheck-5L3D2D4U.js.map +1 -0
- package/dist/uninstall-KYKGJAX7.js +91 -0
- package/dist/uninstall-KYKGJAX7.js.map +1 -0
- package/dist/update-SMXPYGXS.js +305 -0
- package/dist/update-SMXPYGXS.js.map +1 -0
- package/dist/update-skill-modes-BVX7IVMW.js +38 -0
- package/dist/update-skill-modes-BVX7IVMW.js.map +1 -0
- package/dist/upload-YG4J2EMI.js +56 -0
- package/dist/upload-YG4J2EMI.js.map +1 -0
- package/dist/use-V3LGFP3K.js +63 -0
- package/dist/use-V3LGFP3K.js.map +1 -0
- package/dist/value-3247D57X.js +71 -0
- package/dist/value-3247D57X.js.map +1 -0
- package/dist/visible-A7HEV36U.js +71 -0
- package/dist/visible-A7HEV36U.js.map +1 -0
- package/dist/wait-UZPP4Y4R.js +109 -0
- package/dist/wait-UZPP4Y4R.js.map +1 -0
- package/dist/windows-76TR3AIP.js +37 -0
- package/dist/windows-76TR3AIP.js.map +1 -0
- package/extension/dist/background.js +99 -22
- package/extension/dist/ops/ops-runtime.js +85 -7
- package/extension/dist/ops/ops-session-store.js +3 -0
- package/extension/dist/ops/target-session-coordinator.js +3 -0
- package/extension/dist/services/CDPRouter.js +9 -0
- package/extension/manifest.json +1 -1
- package/package.json +1 -1
- package/skills/opendevbrowser-best-practices/SKILL.md +8 -6
- package/skills/opendevbrowser-best-practices/artifacts/skill-runtime-surface-matrix.md +1 -1
- package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +3 -2
- package/skills/opendevbrowser-best-practices/scripts/validator-fixture-cli.sh +39 -2
- package/skills/opendevbrowser-research/SKILL.md +64 -12
- package/skills/opendevbrowser-research/artifacts/research-workflows.md +56 -19
- package/skills/opendevbrowser-research/assets/templates/compact.md +31 -5
- package/skills/opendevbrowser-research/assets/templates/context.json +52 -1
- package/skills/opendevbrowser-research/assets/templates/report.md +57 -4
- package/skills/opendevbrowser-research/examples/sample-input.json +1 -1
- package/skills/opendevbrowser-research/examples/sample-output.md +27 -2
- package/skills/opendevbrowser-research/scripts/run-research.sh +2 -6
- package/skills/opendevbrowser-research/scripts/validate-skill-assets.sh +115 -1
- package/dist/chunk-I5ZCOZZV.js.map +0 -1
- package/dist/chunk-QVWOPIZJ.js.map +0 -1
- package/dist/chunk-T3VVHJTK.js.map +0 -1
- /package/dist/{providers-QF2RFB4J.js.map → chunk-RJNI3BHT.js.map} +0 -0
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ensureDir
|
|
3
|
+
} from "./chunk-7THCPS52.js";
|
|
1
4
|
import {
|
|
2
5
|
getBundledSkillsDir,
|
|
3
6
|
listBundledSkillDirectories
|
|
@@ -5,108 +8,34 @@ import {
|
|
|
5
8
|
|
|
6
9
|
// src/cli/installers/skills.ts
|
|
7
10
|
import * as crypto from "crypto";
|
|
8
|
-
import * as fs2 from "fs";
|
|
9
|
-
import * as path3 from "path";
|
|
10
|
-
|
|
11
|
-
// src/cli/utils/config.ts
|
|
12
11
|
import * as fs from "fs";
|
|
13
|
-
import * as
|
|
14
|
-
import * as os from "os";
|
|
15
|
-
import { parse as parseJsonc, modify, applyEdits } from "jsonc-parser";
|
|
16
|
-
var PLUGIN_NAME = "opendevbrowser";
|
|
17
|
-
var SCHEMA_URL = "https://opencode.ai/config.json";
|
|
18
|
-
function getGlobalConfigPath() {
|
|
19
|
-
const configDir = process.env.OPENCODE_CONFIG_DIR || path.join(os.homedir(), ".config", "opencode");
|
|
20
|
-
return path.join(configDir, "opencode.json");
|
|
21
|
-
}
|
|
22
|
-
function getLocalConfigPath() {
|
|
23
|
-
return path.join(process.cwd(), "opencode.json");
|
|
24
|
-
}
|
|
25
|
-
function ensureDir(dirPath) {
|
|
26
|
-
if (!fs.existsSync(dirPath)) {
|
|
27
|
-
fs.mkdirSync(dirPath, { recursive: true });
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
function readConfig(configPath) {
|
|
31
|
-
if (!fs.existsSync(configPath)) {
|
|
32
|
-
return { content: "", config: {} };
|
|
33
|
-
}
|
|
34
|
-
const content = fs.readFileSync(configPath, "utf-8");
|
|
35
|
-
const errors = [];
|
|
36
|
-
const parsed = parseJsonc(content, errors, { allowTrailingComma: true });
|
|
37
|
-
if (errors.length > 0) {
|
|
38
|
-
const firstError = errors[0];
|
|
39
|
-
throw new Error(`Invalid JSONC at ${configPath}: parse error at offset ${firstError?.offset ?? 0}`);
|
|
40
|
-
}
|
|
41
|
-
return { content, config: parsed ?? {} };
|
|
42
|
-
}
|
|
43
|
-
function hasPlugin(config, pluginName = PLUGIN_NAME) {
|
|
44
|
-
return config.plugin?.includes(pluginName) ?? false;
|
|
45
|
-
}
|
|
46
|
-
function createConfigWithPlugin(pluginName = PLUGIN_NAME) {
|
|
47
|
-
return {
|
|
48
|
-
$schema: SCHEMA_URL,
|
|
49
|
-
plugin: [pluginName]
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
function updateConfigContent(content, pluginName = PLUGIN_NAME) {
|
|
53
|
-
if (!content.trim()) {
|
|
54
|
-
return JSON.stringify(createConfigWithPlugin(pluginName), null, 2) + "\n";
|
|
55
|
-
}
|
|
56
|
-
const parsed = parseJsonc(content, [], { allowTrailingComma: true }) ?? {};
|
|
57
|
-
if (parsed.plugin?.includes(pluginName)) {
|
|
58
|
-
return content;
|
|
59
|
-
}
|
|
60
|
-
let result = content;
|
|
61
|
-
if (!parsed.$schema) {
|
|
62
|
-
const edits2 = modify(result, ["$schema"], SCHEMA_URL, { formattingOptions: { tabSize: 2, insertSpaces: true } });
|
|
63
|
-
result = applyEdits(result, edits2);
|
|
64
|
-
}
|
|
65
|
-
const newPlugins = parsed.plugin ? [...parsed.plugin, pluginName] : [pluginName];
|
|
66
|
-
const edits = modify(result, ["plugin"], newPlugins, { formattingOptions: { tabSize: 2, insertSpaces: true } });
|
|
67
|
-
result = applyEdits(result, edits);
|
|
68
|
-
return result;
|
|
69
|
-
}
|
|
70
|
-
function removePluginFromContent(content, pluginName = PLUGIN_NAME) {
|
|
71
|
-
if (!content.trim()) {
|
|
72
|
-
return content;
|
|
73
|
-
}
|
|
74
|
-
const parsed = parseJsonc(content, [], { allowTrailingComma: true }) ?? {};
|
|
75
|
-
if (!parsed.plugin?.includes(pluginName)) {
|
|
76
|
-
return content;
|
|
77
|
-
}
|
|
78
|
-
const newPlugins = parsed.plugin.filter((p) => p !== pluginName);
|
|
79
|
-
const edits = modify(content, ["plugin"], newPlugins.length > 0 ? newPlugins : void 0, {
|
|
80
|
-
formattingOptions: { tabSize: 2, insertSpaces: true }
|
|
81
|
-
});
|
|
82
|
-
return applyEdits(content, edits);
|
|
83
|
-
}
|
|
12
|
+
import * as path2 from "path";
|
|
84
13
|
|
|
85
14
|
// src/cli/utils/skills.ts
|
|
86
|
-
import * as
|
|
87
|
-
import * as
|
|
15
|
+
import * as path from "path";
|
|
16
|
+
import * as os from "os";
|
|
88
17
|
var SKILL_DIR_NAME = "skill";
|
|
89
18
|
var SKILLS_DIR_NAME = "skills";
|
|
90
19
|
function getGlobalSkillDir() {
|
|
91
|
-
const configDir = process.env.OPENCODE_CONFIG_DIR ||
|
|
92
|
-
return
|
|
20
|
+
const configDir = process.env.OPENCODE_CONFIG_DIR || path.join(os.homedir(), ".config", "opencode");
|
|
21
|
+
return path.join(configDir, SKILL_DIR_NAME);
|
|
93
22
|
}
|
|
94
23
|
function getLocalSkillDir() {
|
|
95
|
-
return
|
|
24
|
+
return path.join(process.cwd(), ".opencode", SKILL_DIR_NAME);
|
|
96
25
|
}
|
|
97
26
|
function getCodexHomeDir() {
|
|
98
|
-
return process.env.CODEX_HOME ||
|
|
27
|
+
return process.env.CODEX_HOME || path.join(os.homedir(), ".codex");
|
|
99
28
|
}
|
|
100
29
|
function getClaudeCodeHomeDir() {
|
|
101
|
-
return process.env.CLAUDECODE_HOME ||
|
|
30
|
+
return process.env.CLAUDECODE_HOME || path.join(os.homedir(), ".claude");
|
|
102
31
|
}
|
|
103
32
|
function getAmpHomeDir() {
|
|
104
|
-
return process.env.AMP_CLI_HOME ||
|
|
33
|
+
return process.env.AMP_CLI_HOME || path.join(os.homedir(), ".amp");
|
|
105
34
|
}
|
|
106
35
|
function dedupeTargets(targets) {
|
|
107
36
|
const deduped = /* @__PURE__ */ new Map();
|
|
108
37
|
for (const target of targets) {
|
|
109
|
-
const key =
|
|
38
|
+
const key = path.resolve(target.dir);
|
|
110
39
|
const existing = deduped.get(key);
|
|
111
40
|
if (existing) {
|
|
112
41
|
if (!existing.agents.includes(target.agent)) {
|
|
@@ -119,21 +48,21 @@ function dedupeTargets(targets) {
|
|
|
119
48
|
return Array.from(deduped.values());
|
|
120
49
|
}
|
|
121
50
|
function getGlobalSkillTargets() {
|
|
122
|
-
const claudeSkillsDir =
|
|
123
|
-
const ampSkillsDir =
|
|
51
|
+
const claudeSkillsDir = path.join(getClaudeCodeHomeDir(), SKILLS_DIR_NAME);
|
|
52
|
+
const ampSkillsDir = path.join(getAmpHomeDir(), SKILLS_DIR_NAME);
|
|
124
53
|
return dedupeTargets([
|
|
125
54
|
{ agent: "opencode", dir: getGlobalSkillDir() },
|
|
126
|
-
{ agent: "codex", dir:
|
|
55
|
+
{ agent: "codex", dir: path.join(getCodexHomeDir(), SKILLS_DIR_NAME) },
|
|
127
56
|
{ agent: "claudecode", dir: claudeSkillsDir },
|
|
128
57
|
{ agent: "ampcli", dir: ampSkillsDir }
|
|
129
58
|
]);
|
|
130
59
|
}
|
|
131
60
|
function getLocalSkillTargets() {
|
|
132
|
-
const localClaudeSkillsDir =
|
|
133
|
-
const localAmpSkillsDir =
|
|
61
|
+
const localClaudeSkillsDir = path.join(process.cwd(), ".claude", SKILLS_DIR_NAME);
|
|
62
|
+
const localAmpSkillsDir = path.join(process.cwd(), ".amp", SKILLS_DIR_NAME);
|
|
134
63
|
return dedupeTargets([
|
|
135
64
|
{ agent: "opencode", dir: getLocalSkillDir() },
|
|
136
|
-
{ agent: "codex", dir:
|
|
65
|
+
{ agent: "codex", dir: path.join(process.cwd(), ".codex", SKILLS_DIR_NAME) },
|
|
137
66
|
{ agent: "claudecode", dir: localClaudeSkillsDir },
|
|
138
67
|
{ agent: "ampcli", dir: localAmpSkillsDir }
|
|
139
68
|
]);
|
|
@@ -151,27 +80,27 @@ function getCanonicalBundledSkillNames() {
|
|
|
151
80
|
return listBundledSkillDirectories().map((entry) => entry.name);
|
|
152
81
|
}
|
|
153
82
|
function getManagedSkillsMarkerPath(targetDir) {
|
|
154
|
-
return
|
|
83
|
+
return path2.join(targetDir, MANAGED_SKILLS_MARKER);
|
|
155
84
|
}
|
|
156
85
|
function getManagedSkillSentinelPath(targetPath) {
|
|
157
|
-
return
|
|
86
|
+
return path2.join(targetPath, MANAGED_SKILL_SENTINEL);
|
|
158
87
|
}
|
|
159
88
|
function snapshotManagedSkillsMarker(targetDir) {
|
|
160
89
|
const markerPath = getManagedSkillsMarkerPath(targetDir);
|
|
161
|
-
return
|
|
90
|
+
return fs.existsSync(markerPath) ? fs.readFileSync(markerPath, "utf8") : null;
|
|
162
91
|
}
|
|
163
92
|
function restoreManagedSkillsMarker(targetDir, previousMarker) {
|
|
164
93
|
if (previousMarker === null) {
|
|
165
94
|
removeManagedSkillsMarker(targetDir);
|
|
166
95
|
return;
|
|
167
96
|
}
|
|
168
|
-
|
|
97
|
+
fs.writeFileSync(getManagedSkillsMarkerPath(targetDir), previousMarker, "utf8");
|
|
169
98
|
}
|
|
170
99
|
function hasManagedSkillsMarker(targetDir) {
|
|
171
|
-
return
|
|
100
|
+
return fs.existsSync(getManagedSkillsMarkerPath(targetDir));
|
|
172
101
|
}
|
|
173
102
|
function isSafePathSegment(value) {
|
|
174
|
-
return value.length > 0 && value !== "." && value !== ".." && !value.includes("/") && !value.includes("\\") &&
|
|
103
|
+
return value.length > 0 && value !== "." && value !== ".." && !value.includes("/") && !value.includes("\\") && path2.basename(value) === value;
|
|
175
104
|
}
|
|
176
105
|
function isManagedPackName(value) {
|
|
177
106
|
return isSafePathSegment(value) && value.startsWith(MANAGED_PACK_PREFIX);
|
|
@@ -181,7 +110,7 @@ function readManagedSkillsMarker(targetDir) {
|
|
|
181
110
|
return null;
|
|
182
111
|
}
|
|
183
112
|
try {
|
|
184
|
-
const raw =
|
|
113
|
+
const raw = fs.readFileSync(getManagedSkillsMarkerPath(targetDir), "utf8");
|
|
185
114
|
const parsed = JSON.parse(raw);
|
|
186
115
|
return Array.isArray(parsed.managedPacks) ? {
|
|
187
116
|
managedPacks: parsed.managedPacks.filter(
|
|
@@ -198,7 +127,7 @@ function writeManagedSkillsMarker(targetDir, packNames, managesAllCanonicalPacks
|
|
|
198
127
|
managedPacks: Array.from(new Set(packNames)),
|
|
199
128
|
managesAllCanonicalPacks
|
|
200
129
|
};
|
|
201
|
-
|
|
130
|
+
fs.writeFileSync(
|
|
202
131
|
getManagedSkillsMarkerPath(targetDir),
|
|
203
132
|
`${JSON.stringify(marker, null, 2)}
|
|
204
133
|
`,
|
|
@@ -206,7 +135,7 @@ function writeManagedSkillsMarker(targetDir, packNames, managesAllCanonicalPacks
|
|
|
206
135
|
);
|
|
207
136
|
}
|
|
208
137
|
function removeManagedSkillsMarker(targetDir) {
|
|
209
|
-
|
|
138
|
+
fs.rmSync(getManagedSkillsMarkerPath(targetDir), { force: true });
|
|
210
139
|
}
|
|
211
140
|
function writeManagedSkillSentinel(targetPath, packName, fingerprint) {
|
|
212
141
|
const sentinel = {
|
|
@@ -214,7 +143,7 @@ function writeManagedSkillSentinel(targetPath, packName, fingerprint) {
|
|
|
214
143
|
packName,
|
|
215
144
|
fingerprint
|
|
216
145
|
};
|
|
217
|
-
|
|
146
|
+
fs.writeFileSync(
|
|
218
147
|
getManagedSkillSentinelPath(targetPath),
|
|
219
148
|
`${JSON.stringify(sentinel, null, 2)}
|
|
220
149
|
`,
|
|
@@ -223,13 +152,13 @@ function writeManagedSkillSentinel(targetPath, packName, fingerprint) {
|
|
|
223
152
|
}
|
|
224
153
|
function readManagedSkillFingerprint(targetPath) {
|
|
225
154
|
const sentinelPath = getManagedSkillSentinelPath(targetPath);
|
|
226
|
-
if (!
|
|
155
|
+
if (!fs.existsSync(sentinelPath)) {
|
|
227
156
|
return null;
|
|
228
157
|
}
|
|
229
158
|
try {
|
|
230
|
-
const raw =
|
|
159
|
+
const raw = fs.readFileSync(sentinelPath, "utf8");
|
|
231
160
|
const parsed = JSON.parse(raw);
|
|
232
|
-
return parsed.managedBy === MANAGED_SKILL_OWNER && parsed.packName ===
|
|
161
|
+
return parsed.managedBy === MANAGED_SKILL_OWNER && parsed.packName === path2.basename(targetPath) && typeof parsed.fingerprint === "string" ? parsed.fingerprint : null;
|
|
233
162
|
} catch {
|
|
234
163
|
return null;
|
|
235
164
|
}
|
|
@@ -237,16 +166,16 @@ function readManagedSkillFingerprint(targetPath) {
|
|
|
237
166
|
function getSentinelManagedPackNames(targetDir, packNames) {
|
|
238
167
|
const canonicalPackNames = new Set(packNames);
|
|
239
168
|
const candidatePackNames = new Set(packNames);
|
|
240
|
-
if (
|
|
241
|
-
for (const entry of
|
|
169
|
+
if (fs.existsSync(targetDir) && isDirectoryPath(targetDir)) {
|
|
170
|
+
for (const entry of fs.readdirSync(targetDir, { withFileTypes: true })) {
|
|
242
171
|
if (entry.isDirectory() && isManagedPackName(entry.name)) {
|
|
243
172
|
candidatePackNames.add(entry.name);
|
|
244
173
|
}
|
|
245
174
|
}
|
|
246
175
|
}
|
|
247
176
|
return Array.from(candidatePackNames).filter((packName) => {
|
|
248
|
-
const targetPath =
|
|
249
|
-
if (!
|
|
177
|
+
const targetPath = path2.join(targetDir, packName);
|
|
178
|
+
if (!fs.existsSync(targetPath) || readManagedSkillFingerprint(targetPath) === null) {
|
|
250
179
|
return false;
|
|
251
180
|
}
|
|
252
181
|
return canonicalPackNames.has(packName) || shouldRemoveRetiredManagedPack(targetPath);
|
|
@@ -259,9 +188,9 @@ function removeManagedPackArtifacts(targetDir, packNames) {
|
|
|
259
188
|
const removed = [];
|
|
260
189
|
const missing = [];
|
|
261
190
|
for (const packName of packNames) {
|
|
262
|
-
const targetPath =
|
|
263
|
-
if (
|
|
264
|
-
|
|
191
|
+
const targetPath = path2.join(targetDir, packName);
|
|
192
|
+
if (fs.existsSync(targetPath)) {
|
|
193
|
+
fs.rmSync(targetPath, { recursive: true, force: true });
|
|
265
194
|
removed.push(packName);
|
|
266
195
|
continue;
|
|
267
196
|
}
|
|
@@ -277,10 +206,10 @@ function formatSummary(parts, totalTargets, failures) {
|
|
|
277
206
|
function hashDirectoryTree(dirPath) {
|
|
278
207
|
const hash = crypto.createHash("sha256");
|
|
279
208
|
const visit = (currentPath, relativePath) => {
|
|
280
|
-
const entries =
|
|
209
|
+
const entries = fs.readdirSync(currentPath, { withFileTypes: true }).sort((left, right) => left.name.localeCompare(right.name));
|
|
281
210
|
for (const entry of entries) {
|
|
282
|
-
const absolutePath =
|
|
283
|
-
const entryRelativePath = relativePath ?
|
|
211
|
+
const absolutePath = path2.join(currentPath, entry.name);
|
|
212
|
+
const entryRelativePath = relativePath ? path2.posix.join(relativePath, entry.name) : entry.name;
|
|
284
213
|
if (entry.isFile() && entry.name === MANAGED_SKILL_SENTINEL) {
|
|
285
214
|
continue;
|
|
286
215
|
}
|
|
@@ -291,12 +220,12 @@ function hashDirectoryTree(dirPath) {
|
|
|
291
220
|
}
|
|
292
221
|
if (entry.isFile()) {
|
|
293
222
|
hash.update(`F:${entryRelativePath}\0`);
|
|
294
|
-
hash.update(
|
|
223
|
+
hash.update(fs.readFileSync(absolutePath));
|
|
295
224
|
hash.update("\0");
|
|
296
225
|
continue;
|
|
297
226
|
}
|
|
298
227
|
if (entry.isSymbolicLink()) {
|
|
299
|
-
hash.update(`L:${entryRelativePath}\0${
|
|
228
|
+
hash.update(`L:${entryRelativePath}\0${fs.readlinkSync(absolutePath)}\0`);
|
|
300
229
|
}
|
|
301
230
|
}
|
|
302
231
|
};
|
|
@@ -304,18 +233,18 @@ function hashDirectoryTree(dirPath) {
|
|
|
304
233
|
return hash.digest("hex");
|
|
305
234
|
}
|
|
306
235
|
function isDirectoryPath(targetPath) {
|
|
307
|
-
return
|
|
236
|
+
return fs.lstatSync(targetPath).isDirectory();
|
|
308
237
|
}
|
|
309
238
|
function shouldRemoveRetiredManagedPack(targetPath) {
|
|
310
|
-
if (!
|
|
239
|
+
if (!fs.existsSync(targetPath) || !isDirectoryPath(targetPath)) {
|
|
311
240
|
return false;
|
|
312
241
|
}
|
|
313
242
|
const fingerprint = readManagedSkillFingerprint(targetPath);
|
|
314
243
|
return fingerprint !== null && hashDirectoryTree(targetPath) === fingerprint;
|
|
315
244
|
}
|
|
316
245
|
function syncSkillDirectory(sourcePath, targetPath, sourceFingerprint) {
|
|
317
|
-
if (!
|
|
318
|
-
|
|
246
|
+
if (!fs.existsSync(targetPath)) {
|
|
247
|
+
fs.cpSync(sourcePath, targetPath, { recursive: true });
|
|
319
248
|
return "installed";
|
|
320
249
|
}
|
|
321
250
|
if (isDirectoryPath(targetPath)) {
|
|
@@ -324,32 +253,32 @@ function syncSkillDirectory(sourcePath, targetPath, sourceFingerprint) {
|
|
|
324
253
|
return "unchanged";
|
|
325
254
|
}
|
|
326
255
|
}
|
|
327
|
-
const parentDir =
|
|
328
|
-
const targetName =
|
|
329
|
-
const stagingRoot =
|
|
330
|
-
const stagedPath =
|
|
331
|
-
const backupPath =
|
|
256
|
+
const parentDir = path2.dirname(targetPath);
|
|
257
|
+
const targetName = path2.basename(targetPath);
|
|
258
|
+
const stagingRoot = fs.mkdtempSync(path2.join(parentDir, `.${targetName}-sync-`));
|
|
259
|
+
const stagedPath = path2.join(stagingRoot, targetName);
|
|
260
|
+
const backupPath = path2.join(stagingRoot, `${targetName}-backup`);
|
|
332
261
|
try {
|
|
333
|
-
|
|
334
|
-
|
|
262
|
+
fs.cpSync(sourcePath, stagedPath, { recursive: true });
|
|
263
|
+
fs.renameSync(targetPath, backupPath);
|
|
335
264
|
try {
|
|
336
|
-
|
|
265
|
+
fs.renameSync(stagedPath, targetPath);
|
|
337
266
|
} catch (error) {
|
|
338
|
-
if (
|
|
339
|
-
|
|
267
|
+
if (fs.existsSync(backupPath) && !fs.existsSync(targetPath)) {
|
|
268
|
+
fs.renameSync(backupPath, targetPath);
|
|
340
269
|
}
|
|
341
270
|
throw error;
|
|
342
271
|
}
|
|
343
|
-
|
|
272
|
+
fs.rmSync(backupPath, { recursive: true, force: true });
|
|
344
273
|
return "refreshed";
|
|
345
274
|
} finally {
|
|
346
|
-
if (
|
|
347
|
-
|
|
275
|
+
if (fs.existsSync(stagedPath)) {
|
|
276
|
+
fs.rmSync(stagedPath, { recursive: true, force: true });
|
|
348
277
|
}
|
|
349
|
-
if (
|
|
350
|
-
|
|
278
|
+
if (fs.existsSync(backupPath)) {
|
|
279
|
+
fs.rmSync(backupPath, { recursive: true, force: true });
|
|
351
280
|
}
|
|
352
|
-
|
|
281
|
+
fs.rmSync(stagingRoot, { recursive: true, force: true });
|
|
353
282
|
}
|
|
354
283
|
}
|
|
355
284
|
function buildSyncMessage(mode, result) {
|
|
@@ -427,8 +356,8 @@ function syncBundledSkillsForTargets(mode, targets) {
|
|
|
427
356
|
const packNames = getCanonicalBundledSkillNames();
|
|
428
357
|
const bundledFingerprints = /* @__PURE__ */ new Map();
|
|
429
358
|
for (const packName of packNames) {
|
|
430
|
-
const sourcePath =
|
|
431
|
-
if (!
|
|
359
|
+
const sourcePath = path2.join(sourceDir, packName);
|
|
360
|
+
if (!fs.existsSync(sourcePath)) {
|
|
432
361
|
throw new Error(`Bundled skill directory missing: ${packName}`);
|
|
433
362
|
}
|
|
434
363
|
bundledFingerprints.set(packName, hashDirectoryTree(sourcePath));
|
|
@@ -450,8 +379,8 @@ function syncBundledSkillsForTargets(mode, targets) {
|
|
|
450
379
|
const activePackNameSet = new Set(activePackNames);
|
|
451
380
|
writeManagedSkillsMarker(target.dir, managedPackNames, managesAllCanonicalPacks);
|
|
452
381
|
for (const packName of activePackNames) {
|
|
453
|
-
const sourcePath =
|
|
454
|
-
const targetPath =
|
|
382
|
+
const sourcePath = path2.join(sourceDir, packName);
|
|
383
|
+
const targetPath = path2.join(target.dir, packName);
|
|
455
384
|
const sourceFingerprint = bundledFingerprints.get(packName);
|
|
456
385
|
if (!sourceFingerprint) {
|
|
457
386
|
throw new Error(`Bundled fingerprint missing: ${packName}`);
|
|
@@ -467,7 +396,7 @@ function syncBundledSkillsForTargets(mode, targets) {
|
|
|
467
396
|
}
|
|
468
397
|
}
|
|
469
398
|
const retiredPackNames = managedPackNames.filter((packName) => {
|
|
470
|
-
return !activePackNameSet.has(packName) && shouldRemoveRetiredManagedPack(
|
|
399
|
+
return !activePackNameSet.has(packName) && shouldRemoveRetiredManagedPack(path2.join(target.dir, packName));
|
|
471
400
|
});
|
|
472
401
|
removeManagedPackArtifacts(target.dir, retiredPackNames);
|
|
473
402
|
if (activePackNames.length > 0 || managesAllCanonicalPacks) {
|
|
@@ -547,7 +476,7 @@ function removeBundledSkillsForTargets(mode, targets) {
|
|
|
547
476
|
removed.push(...currentRemoval.removed);
|
|
548
477
|
missing.push(...currentRemoval.missing);
|
|
549
478
|
const retiredPackNames = managedPackNames.filter((packName) => {
|
|
550
|
-
return !packNames.includes(packName) && shouldRemoveRetiredManagedPack(
|
|
479
|
+
return !packNames.includes(packName) && shouldRemoveRetiredManagedPack(path2.join(target.dir, packName));
|
|
551
480
|
});
|
|
552
481
|
const retiredRemoval = removeManagedPackArtifacts(target.dir, retiredPackNames);
|
|
553
482
|
removed.push(...retiredRemoval.removed);
|
|
@@ -583,6 +512,9 @@ function removeBundledSkillsForTargets(mode, targets) {
|
|
|
583
512
|
result.message = buildRemovalMessage(mode, result);
|
|
584
513
|
return result;
|
|
585
514
|
}
|
|
515
|
+
function removeBundledSkills(mode) {
|
|
516
|
+
return removeBundledSkillsForTargets(mode, getTargets(mode));
|
|
517
|
+
}
|
|
586
518
|
function hasBundledSkillArtifacts(mode) {
|
|
587
519
|
const packNames = getCanonicalBundledSkillNames();
|
|
588
520
|
const targets = getTargets(mode);
|
|
@@ -593,20 +525,14 @@ function hasManagedBundledSkillInstall(mode) {
|
|
|
593
525
|
}
|
|
594
526
|
|
|
595
527
|
export {
|
|
596
|
-
getGlobalConfigPath,
|
|
597
|
-
getLocalConfigPath,
|
|
598
|
-
ensureDir,
|
|
599
|
-
readConfig,
|
|
600
|
-
hasPlugin,
|
|
601
|
-
updateConfigContent,
|
|
602
|
-
removePluginFromContent,
|
|
603
528
|
createNoOpSkillRemovalResult,
|
|
604
529
|
getBundledSkillLifecycleTargets,
|
|
605
530
|
getBundledSkillTargets,
|
|
606
531
|
syncBundledSkillsForTargets,
|
|
607
532
|
syncBundledSkills,
|
|
608
533
|
removeBundledSkillsForTargets,
|
|
534
|
+
removeBundledSkills,
|
|
609
535
|
hasBundledSkillArtifacts,
|
|
610
536
|
hasManagedBundledSkillInstall
|
|
611
537
|
};
|
|
612
|
-
//# sourceMappingURL=chunk-
|
|
538
|
+
//# sourceMappingURL=chunk-KDSNXS6N.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/installers/skills.ts","../src/cli/utils/skills.ts"],"sourcesContent":["import * as crypto from \"crypto\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { ensureDir } from \"../utils/config\";\nimport { getBundledSkillsDir, getGlobalSkillTargets, getLocalSkillTargets, type SkillTarget } from \"../utils/skills\";\nimport { listBundledSkillDirectories } from \"../../skills/bundled-skill-directories\";\n\nexport type SkillInstallMode = \"global\" | \"local\";\ntype ManagedSkillTarget = SkillTarget & {\n managedPackNames?: string[];\n};\n\ntype SyncOutcome = \"installed\" | \"refreshed\" | \"unchanged\";\nconst MANAGED_SKILLS_MARKER = \".opendevbrowser-managed-skills.json\";\nconst MANAGED_SKILL_SENTINEL = \".opendevbrowser-managed-skill.json\";\nconst MANAGED_SKILL_OWNER = \"opendevbrowser\";\nconst MANAGED_PACK_PREFIX = \"opendevbrowser-\";\n\ninterface ManagedSkillsMarker {\n managedPacks: string[];\n managesAllCanonicalPacks: boolean;\n}\n\ninterface ManagedSkillSentinel {\n managedBy: string;\n packName: string;\n fingerprint: string;\n}\n\ninterface SkillLifecycleTargetOptions {\n includeLegacyArtifacts: boolean;\n}\n\ninterface ManagedPackScope {\n managedPackNames: string[];\n activePackNames: string[];\n managesAllCanonicalPacks: boolean;\n}\n\nexport interface SkillTargetSyncResult {\n agents: string[];\n targetDir: string;\n installed: string[];\n refreshed: string[];\n unchanged: string[];\n success: boolean;\n error?: string;\n}\n\nexport interface SkillSyncResult {\n success: boolean;\n message: string;\n mode: SkillInstallMode;\n targets: SkillTargetSyncResult[];\n installed: string[];\n refreshed: string[];\n unchanged: string[];\n}\n\nexport interface SkillTargetRemovalResult {\n agents: string[];\n targetDir: string;\n removed: string[];\n missing: string[];\n success: boolean;\n error?: string;\n}\n\nexport interface SkillRemovalResult {\n success: boolean;\n message: string;\n mode: SkillInstallMode;\n targets: SkillTargetRemovalResult[];\n removed: string[];\n missing: string[];\n}\n\nfunction getTargets(mode: SkillInstallMode): SkillTarget[] {\n return mode === \"global\" ? getGlobalSkillTargets() : getLocalSkillTargets();\n}\n\nfunction getCanonicalBundledSkillNames(): string[] {\n return listBundledSkillDirectories().map((entry) => entry.name);\n}\n\nfunction getManagedSkillsMarkerPath(targetDir: string): string {\n return path.join(targetDir, MANAGED_SKILLS_MARKER);\n}\n\nfunction getManagedSkillSentinelPath(targetPath: string): string {\n return path.join(targetPath, MANAGED_SKILL_SENTINEL);\n}\n\nfunction snapshotManagedSkillsMarker(targetDir: string): string | null {\n const markerPath = getManagedSkillsMarkerPath(targetDir);\n return fs.existsSync(markerPath) ? fs.readFileSync(markerPath, \"utf8\") : null;\n}\n\nfunction restoreManagedSkillsMarker(targetDir: string, previousMarker: string | null): void {\n if (previousMarker === null) {\n removeManagedSkillsMarker(targetDir);\n return;\n }\n fs.writeFileSync(getManagedSkillsMarkerPath(targetDir), previousMarker, \"utf8\");\n}\n\nfunction hasManagedSkillsMarker(targetDir: string): boolean {\n return fs.existsSync(getManagedSkillsMarkerPath(targetDir));\n}\n\nfunction isSafePathSegment(value: string): boolean {\n return value.length > 0\n && value !== \".\"\n && value !== \"..\"\n && !value.includes(\"/\")\n && !value.includes(\"\\\\\")\n && path.basename(value) === value;\n}\n\nfunction isManagedPackName(value: string): boolean {\n return isSafePathSegment(value) && value.startsWith(MANAGED_PACK_PREFIX);\n}\n\nfunction readManagedSkillsMarker(targetDir: string): ManagedSkillsMarker | null {\n if (!hasManagedSkillsMarker(targetDir)) {\n return null;\n }\n\n try {\n const raw = fs.readFileSync(getManagedSkillsMarkerPath(targetDir), \"utf8\");\n const parsed = JSON.parse(raw) as Partial<ManagedSkillsMarker>;\n return Array.isArray(parsed.managedPacks)\n ? {\n managedPacks: parsed.managedPacks.filter(\n (value): value is string => typeof value === \"string\" && isManagedPackName(value)\n ),\n managesAllCanonicalPacks: parsed.managesAllCanonicalPacks !== false\n }\n : null;\n } catch {\n return null;\n }\n}\n\nfunction writeManagedSkillsMarker(\n targetDir: string,\n packNames: readonly string[],\n managesAllCanonicalPacks: boolean\n): void {\n const marker: ManagedSkillsMarker = {\n managedPacks: Array.from(new Set(packNames)),\n managesAllCanonicalPacks\n };\n fs.writeFileSync(\n getManagedSkillsMarkerPath(targetDir),\n `${JSON.stringify(marker, null, 2)}\\n`,\n \"utf8\"\n );\n}\n\nfunction removeManagedSkillsMarker(targetDir: string): void {\n fs.rmSync(getManagedSkillsMarkerPath(targetDir), { force: true });\n}\n\nfunction writeManagedSkillSentinel(targetPath: string, packName: string, fingerprint: string): void {\n const sentinel: ManagedSkillSentinel = {\n managedBy: MANAGED_SKILL_OWNER,\n packName,\n fingerprint\n };\n fs.writeFileSync(\n getManagedSkillSentinelPath(targetPath),\n `${JSON.stringify(sentinel, null, 2)}\\n`,\n \"utf8\"\n );\n}\n\nfunction readManagedSkillFingerprint(targetPath: string): string | null {\n const sentinelPath = getManagedSkillSentinelPath(targetPath);\n if (!fs.existsSync(sentinelPath)) {\n return null;\n }\n\n try {\n const raw = fs.readFileSync(sentinelPath, \"utf8\");\n const parsed = JSON.parse(raw) as Partial<ManagedSkillSentinel>;\n return parsed.managedBy === MANAGED_SKILL_OWNER\n && parsed.packName === path.basename(targetPath)\n && typeof parsed.fingerprint === \"string\"\n ? parsed.fingerprint\n : null;\n } catch {\n return null;\n }\n}\n\nfunction getSentinelManagedPackNames(targetDir: string, packNames: readonly string[]): string[] {\n const canonicalPackNames = new Set(packNames);\n const candidatePackNames = new Set(packNames);\n if (fs.existsSync(targetDir) && isDirectoryPath(targetDir)) {\n for (const entry of fs.readdirSync(targetDir, { withFileTypes: true })) {\n if (entry.isDirectory() && isManagedPackName(entry.name)) {\n candidatePackNames.add(entry.name);\n }\n }\n }\n\n return Array.from(candidatePackNames).filter((packName) => {\n const targetPath = path.join(targetDir, packName);\n if (!fs.existsSync(targetPath) || readManagedSkillFingerprint(targetPath) === null) {\n return false;\n }\n return canonicalPackNames.has(packName) || shouldRemoveRetiredManagedPack(targetPath);\n });\n}\n\nfunction hasManagedCanonicalBundledSkillInTarget(targetDir: string, packNames: readonly string[]): boolean {\n return getSentinelManagedPackNames(targetDir, packNames).length > 0;\n}\n\nfunction removeManagedPackArtifacts(\n targetDir: string,\n packNames: readonly string[]\n): { removed: string[]; missing: string[] } {\n const removed: string[] = [];\n const missing: string[] = [];\n\n for (const packName of packNames) {\n const targetPath = path.join(targetDir, packName);\n if (fs.existsSync(targetPath)) {\n fs.rmSync(targetPath, { recursive: true, force: true });\n removed.push(packName);\n continue;\n }\n missing.push(packName);\n }\n\n return { removed, missing };\n}\n\nfunction formatSummary(parts: string[], totalTargets: number, failures: number): string {\n const summary = parts.length > 0 ? parts.join(\", \") : \"no lifecycle changes\";\n const failureSummary = failures > 0 ? `, ${failures} failed` : \"\";\n return `${summary} across ${totalTargets} targets${failureSummary}`;\n}\n\nfunction hashDirectoryTree(dirPath: string): string {\n const hash = crypto.createHash(\"sha256\");\n\n const visit = (currentPath: string, relativePath: string): void => {\n const entries = fs.readdirSync(currentPath, { withFileTypes: true })\n .sort((left, right) => left.name.localeCompare(right.name));\n\n for (const entry of entries) {\n const absolutePath = path.join(currentPath, entry.name);\n const entryRelativePath = relativePath\n ? path.posix.join(relativePath, entry.name)\n : entry.name;\n\n if (entry.isFile() && entry.name === MANAGED_SKILL_SENTINEL) {\n continue;\n }\n\n if (entry.isDirectory()) {\n hash.update(`D:${entryRelativePath}\\0`);\n visit(absolutePath, entryRelativePath);\n continue;\n }\n\n if (entry.isFile()) {\n hash.update(`F:${entryRelativePath}\\0`);\n hash.update(fs.readFileSync(absolutePath));\n hash.update(\"\\0\");\n continue;\n }\n\n if (entry.isSymbolicLink()) {\n hash.update(`L:${entryRelativePath}\\0${fs.readlinkSync(absolutePath)}\\0`);\n }\n }\n };\n\n visit(dirPath, \"\");\n return hash.digest(\"hex\");\n}\n\nfunction isDirectoryPath(targetPath: string): boolean {\n return fs.lstatSync(targetPath).isDirectory();\n}\n\nfunction shouldRemoveRetiredManagedPack(targetPath: string): boolean {\n if (!fs.existsSync(targetPath) || !isDirectoryPath(targetPath)) {\n return false;\n }\n const fingerprint = readManagedSkillFingerprint(targetPath);\n return fingerprint !== null && hashDirectoryTree(targetPath) === fingerprint;\n}\n\nfunction syncSkillDirectory(sourcePath: string, targetPath: string, sourceFingerprint: string): SyncOutcome {\n if (!fs.existsSync(targetPath)) {\n fs.cpSync(sourcePath, targetPath, { recursive: true });\n return \"installed\";\n }\n\n if (isDirectoryPath(targetPath)) {\n const targetFingerprint = hashDirectoryTree(targetPath);\n if (targetFingerprint === sourceFingerprint) {\n return \"unchanged\";\n }\n }\n\n const parentDir = path.dirname(targetPath);\n const targetName = path.basename(targetPath);\n const stagingRoot = fs.mkdtempSync(path.join(parentDir, `.${targetName}-sync-`));\n const stagedPath = path.join(stagingRoot, targetName);\n const backupPath = path.join(stagingRoot, `${targetName}-backup`);\n\n try {\n fs.cpSync(sourcePath, stagedPath, { recursive: true });\n fs.renameSync(targetPath, backupPath);\n try {\n fs.renameSync(stagedPath, targetPath);\n } catch (error) {\n if (fs.existsSync(backupPath) && !fs.existsSync(targetPath)) {\n fs.renameSync(backupPath, targetPath);\n }\n throw error;\n }\n fs.rmSync(backupPath, { recursive: true, force: true });\n return \"refreshed\";\n } finally {\n if (fs.existsSync(stagedPath)) {\n fs.rmSync(stagedPath, { recursive: true, force: true });\n }\n if (fs.existsSync(backupPath)) {\n fs.rmSync(backupPath, { recursive: true, force: true });\n }\n fs.rmSync(stagingRoot, { recursive: true, force: true });\n }\n}\n\nfunction buildSyncMessage(mode: SkillInstallMode, result: SkillSyncResult): string {\n return `Skills ${mode} sync: ${formatSummary(\n [\n result.installed.length > 0 ? `${result.installed.length} installed` : \"\",\n result.refreshed.length > 0 ? `${result.refreshed.length} refreshed` : \"\",\n result.unchanged.length > 0 ? `${result.unchanged.length} unchanged` : \"\"\n ].filter(Boolean),\n result.targets.length,\n result.targets.filter((entry) => !entry.success).length\n )}`;\n}\n\nfunction buildRemovalMessage(mode: SkillInstallMode, result: SkillRemovalResult): string {\n return `Skills ${mode} removal: ${formatSummary(\n [\n result.removed.length > 0 ? `${result.removed.length} removed` : \"\",\n result.missing.length > 0 ? `${result.missing.length} already absent` : \"\"\n ].filter(Boolean),\n result.targets.length,\n result.targets.filter((entry) => !entry.success).length\n )}`;\n}\n\nfunction resolveManagedPackScope(\n target: ManagedSkillTarget,\n marker: ManagedSkillsMarker | null,\n packNames: readonly string[]\n): ManagedPackScope {\n const requestedAllCanonicalPacks = target.managedPackNames === undefined;\n const managesAllCanonicalPacks = requestedAllCanonicalPacks || marker?.managesAllCanonicalPacks === true;\n const managedPackNames = managesAllCanonicalPacks\n ? Array.from(new Set([...(marker?.managedPacks ?? []), ...packNames]))\n : Array.from(new Set(target.managedPackNames ?? marker?.managedPacks ?? []));\n const activePackNames = managesAllCanonicalPacks\n ? [...packNames]\n : managedPackNames.filter((packName) => packNames.includes(packName));\n\n return {\n managedPackNames,\n activePackNames,\n managesAllCanonicalPacks\n };\n}\n\nexport function createNoOpSkillRemovalResult(mode: SkillInstallMode): SkillRemovalResult {\n const result: SkillRemovalResult = {\n success: true,\n message: \"\",\n mode,\n targets: [],\n removed: [],\n missing: []\n };\n result.message = buildRemovalMessage(mode, result);\n return result;\n}\n\nexport function getBundledSkillLifecycleTargets(\n mode: SkillInstallMode,\n options: SkillLifecycleTargetOptions\n): SkillTarget[] {\n const packNames = getCanonicalBundledSkillNames();\n return getTargets(mode).flatMap((target) => {\n const marker = readManagedSkillsMarker(target.dir);\n if (marker) {\n if (marker.managesAllCanonicalPacks || !options.includeLegacyArtifacts) {\n return marker.managesAllCanonicalPacks\n ? [target]\n : [{ ...target, managedPackNames: marker.managedPacks }];\n }\n const managedPackNames = Array.from(new Set([\n ...marker.managedPacks,\n ...getSentinelManagedPackNames(target.dir, packNames)\n ]));\n return managedPackNames.length > 0 ? [{ ...target, managedPackNames }] : [];\n }\n if (!options.includeLegacyArtifacts) {\n return [];\n }\n const managedPackNames = getSentinelManagedPackNames(target.dir, packNames);\n return managedPackNames.length > 0 ? [{ ...target, managedPackNames }] : [];\n });\n}\n\nexport function getBundledSkillTargets(mode: SkillInstallMode): SkillTarget[] {\n return getTargets(mode);\n}\n\nexport function syncBundledSkillsForTargets(\n mode: SkillInstallMode,\n targets: readonly SkillTarget[]\n): SkillSyncResult {\n const targetResults: SkillTargetSyncResult[] = [];\n\n try {\n const sourceDir = getBundledSkillsDir();\n const packNames = getCanonicalBundledSkillNames();\n const bundledFingerprints = new Map<string, string>();\n\n for (const packName of packNames) {\n const sourcePath = path.join(sourceDir, packName);\n if (!fs.existsSync(sourcePath)) {\n throw new Error(`Bundled skill directory missing: ${packName}`);\n }\n bundledFingerprints.set(packName, hashDirectoryTree(sourcePath));\n }\n\n for (const target of targets) {\n const installed: string[] = [];\n const refreshed: string[] = [];\n const unchanged: string[] = [];\n const previousMarker = snapshotManagedSkillsMarker(target.dir);\n\n try {\n ensureDir(target.dir);\n const managedTarget = target as ManagedSkillTarget;\n const marker = readManagedSkillsMarker(target.dir);\n const { managedPackNames, activePackNames, managesAllCanonicalPacks } = resolveManagedPackScope(\n managedTarget,\n marker,\n packNames\n );\n const activePackNameSet = new Set(activePackNames);\n writeManagedSkillsMarker(target.dir, managedPackNames, managesAllCanonicalPacks);\n\n for (const packName of activePackNames) {\n const sourcePath = path.join(sourceDir, packName);\n const targetPath = path.join(target.dir, packName);\n const sourceFingerprint = bundledFingerprints.get(packName);\n if (!sourceFingerprint) {\n throw new Error(`Bundled fingerprint missing: ${packName}`);\n }\n\n const outcome = syncSkillDirectory(sourcePath, targetPath, sourceFingerprint);\n writeManagedSkillSentinel(targetPath, packName, sourceFingerprint);\n if (outcome === \"installed\") {\n installed.push(packName);\n } else if (outcome === \"refreshed\") {\n refreshed.push(packName);\n } else {\n unchanged.push(packName);\n }\n }\n\n const retiredPackNames = managedPackNames.filter((packName) => {\n return !activePackNameSet.has(packName)\n && shouldRemoveRetiredManagedPack(path.join(target.dir, packName));\n });\n removeManagedPackArtifacts(target.dir, retiredPackNames);\n if (activePackNames.length > 0 || managesAllCanonicalPacks) {\n writeManagedSkillsMarker(target.dir, activePackNames, managesAllCanonicalPacks);\n } else {\n removeManagedSkillsMarker(target.dir);\n }\n\n targetResults.push({\n agents: target.agents,\n targetDir: target.dir,\n installed,\n refreshed,\n unchanged,\n success: true\n });\n } catch (error) {\n restoreManagedSkillsMarker(target.dir, previousMarker);\n const message = error instanceof Error ? error.message : String(error);\n targetResults.push({\n agents: target.agents,\n targetDir: target.dir,\n installed,\n refreshed,\n unchanged,\n success: false,\n error: message\n });\n }\n }\n\n const result: SkillSyncResult = {\n success: targetResults.every((entry) => entry.success),\n message: \"\",\n mode,\n targets: targetResults,\n installed: targetResults.flatMap((entry) => entry.installed),\n refreshed: targetResults.flatMap((entry) => entry.refreshed),\n unchanged: targetResults.flatMap((entry) => entry.unchanged)\n };\n result.message = buildSyncMessage(mode, result);\n return result;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const result: SkillSyncResult = {\n success: false,\n message: \"\",\n mode,\n targets: targetResults,\n installed: targetResults.flatMap((entry) => entry.installed),\n refreshed: targetResults.flatMap((entry) => entry.refreshed),\n unchanged: targetResults.flatMap((entry) => entry.unchanged)\n };\n result.message = `Failed to sync skills (${mode}): ${message}`;\n return result;\n }\n}\n\nexport function syncBundledSkills(mode: SkillInstallMode): SkillSyncResult {\n return syncBundledSkillsForTargets(mode, getTargets(mode));\n}\n\nexport function removeBundledSkillsForTargets(\n mode: SkillInstallMode,\n targets: readonly SkillTarget[]\n): SkillRemovalResult {\n const packNames = getCanonicalBundledSkillNames();\n const targetResults: SkillTargetRemovalResult[] = [];\n\n for (const target of targets) {\n const removed: string[] = [];\n const missing: string[] = [];\n\n try {\n const managedTarget = target as ManagedSkillTarget;\n const marker = readManagedSkillsMarker(target.dir);\n const { managedPackNames, activePackNames } = resolveManagedPackScope(\n managedTarget,\n marker,\n packNames\n );\n const currentRemoval = removeManagedPackArtifacts(\n target.dir,\n activePackNames\n );\n removed.push(...currentRemoval.removed);\n missing.push(...currentRemoval.missing);\n const retiredPackNames = managedPackNames.filter((packName) => {\n return !packNames.includes(packName)\n && shouldRemoveRetiredManagedPack(path.join(target.dir, packName));\n });\n const retiredRemoval = removeManagedPackArtifacts(target.dir, retiredPackNames);\n removed.push(...retiredRemoval.removed);\n missing.push(...retiredRemoval.missing);\n removeManagedSkillsMarker(target.dir);\n\n targetResults.push({\n agents: target.agents,\n targetDir: target.dir,\n removed,\n missing,\n success: true\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n targetResults.push({\n agents: target.agents,\n targetDir: target.dir,\n removed,\n missing,\n success: false,\n error: message\n });\n }\n }\n\n const result: SkillRemovalResult = {\n success: targetResults.every((entry) => entry.success),\n message: \"\",\n mode,\n targets: targetResults,\n removed: targetResults.flatMap((entry) => entry.removed),\n missing: targetResults.flatMap((entry) => entry.missing)\n };\n result.message = buildRemovalMessage(mode, result);\n return result;\n}\n\nexport function removeBundledSkills(mode: SkillInstallMode): SkillRemovalResult {\n return removeBundledSkillsForTargets(mode, getTargets(mode));\n}\n\nexport function hasBundledSkillArtifacts(mode: SkillInstallMode): boolean {\n const packNames = getCanonicalBundledSkillNames();\n const targets = getTargets(mode);\n\n return targets.some((target) => hasManagedCanonicalBundledSkillInTarget(target.dir, packNames));\n}\n\nexport function hasManagedBundledSkillInstall(mode: SkillInstallMode): boolean {\n return getTargets(mode).some((target) => readManagedSkillsMarker(target.dir) !== null);\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nexport { getBundledSkillsDir } from \"../../utils/package-assets\";\n\nconst SKILL_DIR_NAME = \"skill\";\nconst SKILLS_DIR_NAME = \"skills\";\n\nexport type SkillTargetAgent = \"opencode\" | \"codex\" | \"claudecode\" | \"ampcli\";\n\nexport interface SkillTarget {\n agents: SkillTargetAgent[];\n dir: string;\n}\n\nexport function getGlobalSkillDir(): string {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || path.join(os.homedir(), \".config\", \"opencode\");\n return path.join(configDir, SKILL_DIR_NAME);\n}\n\nexport function getLocalSkillDir(): string {\n return path.join(process.cwd(), \".opencode\", SKILL_DIR_NAME);\n}\n\nfunction getCodexHomeDir(): string {\n return process.env.CODEX_HOME\n || path.join(os.homedir(), \".codex\");\n}\n\nfunction getClaudeCodeHomeDir(): string {\n return process.env.CLAUDECODE_HOME\n || path.join(os.homedir(), \".claude\");\n}\n\nfunction getAmpHomeDir(): string {\n return process.env.AMP_CLI_HOME\n || path.join(os.homedir(), \".amp\");\n}\n\nfunction dedupeTargets(targets: Array<{ agent: SkillTargetAgent; dir: string }>): SkillTarget[] {\n const deduped = new Map<string, SkillTarget>();\n\n for (const target of targets) {\n const key = path.resolve(target.dir);\n const existing = deduped.get(key);\n if (existing) {\n if (!existing.agents.includes(target.agent)) {\n existing.agents.push(target.agent);\n }\n continue;\n }\n deduped.set(key, { agents: [target.agent], dir: target.dir });\n }\n\n return Array.from(deduped.values());\n}\n\nexport function getGlobalSkillTargets(): SkillTarget[] {\n const claudeSkillsDir = path.join(getClaudeCodeHomeDir(), SKILLS_DIR_NAME);\n const ampSkillsDir = path.join(getAmpHomeDir(), SKILLS_DIR_NAME);\n\n return dedupeTargets([\n { agent: \"opencode\", dir: getGlobalSkillDir() },\n { agent: \"codex\", dir: path.join(getCodexHomeDir(), SKILLS_DIR_NAME) },\n { agent: \"claudecode\", dir: claudeSkillsDir },\n { agent: \"ampcli\", dir: ampSkillsDir }\n ]);\n}\n\nexport function getLocalSkillTargets(): SkillTarget[] {\n const localClaudeSkillsDir = path.join(process.cwd(), \".claude\", SKILLS_DIR_NAME);\n const localAmpSkillsDir = path.join(process.cwd(), \".amp\", SKILLS_DIR_NAME);\n\n return dedupeTargets([\n { agent: \"opencode\", dir: getLocalSkillDir() },\n { agent: \"codex\", dir: path.join(process.cwd(), \".codex\", SKILLS_DIR_NAME) },\n { agent: \"claudecode\", dir: localClaudeSkillsDir },\n { agent: \"ampcli\", dir: localAmpSkillsDir }\n ]);\n}\n"],"mappings":"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","names":["path","managedPackNames"]}
|