opencode-skill-autodiscovery 1.2.0 → 1.3.0

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 CHANGED
@@ -62,6 +62,29 @@ and both variables are injected into each stdio server's environment
62
62
  per-entry, never fatally. `sse` servers and stdio `cwd` (which opencode cannot
63
63
  represent) are dropped with a log line.
64
64
 
65
+ ### Agents (opt-in)
66
+
67
+ Agent Plugins 1.0.0 has no portable "agents" component type (only skills and
68
+ MCP servers), so agents are contributed through the spec's client-extension
69
+ mechanism. With the `agents` option, the plugin reads agents from three
70
+ sources, in order:
71
+
72
+ 1. `plugin.json` → `extensions["dev.opencode"].agents` (a map of agent name →
73
+ opencode `agent` config).
74
+ 2. A `dev.opencode/agents/<name>.json` extension directory (one opencode agent
75
+ config per file).
76
+ 3. A legacy Claude Code plugin shim: `.claude-plugin/plugin.json` `agents`,
77
+ mapping `description` and `systemPrompt` (or the `agents/<name>/AGENTS.md`
78
+ body) onto an opencode agent.
79
+
80
+ Discovered agents are registered as `config.agent.<name>` with the same rules
81
+ as commands: user-defined agents are never overwritten, same-source mirrors are
82
+ collapsed, and cross-source collisions become `<package>-<agent>`.
83
+
84
+ **Trust note:** a package-supplied `permission` block is always dropped — agent
85
+ permissions are too powerful to inherit from a package by default. If you need
86
+ one, define the agent yourself in `opencode.json` (which always wins).
87
+
65
88
  ### Slash commands
66
89
 
67
90
  opencode treats skills and slash commands as separate mechanisms: skills are
@@ -100,7 +123,8 @@ Use the tuple form to configure options:
100
123
  "extraRoots": ["/home/user/.vscode-server"],
101
124
  "scanCache": true,
102
125
  "scanNodeModules": true,
103
- "mcp": false
126
+ "mcp": false,
127
+ "agents": false
104
128
  }
105
129
  ]
106
130
  ]
@@ -113,6 +137,7 @@ Use the tuple form to configure options:
113
137
  | `scanCache` | `true` | Scan opencode's plugin cache (`~/.cache/opencode/packages/*`) for Agent Plugins packages. |
114
138
  | `scanNodeModules` | `true` | Scan the project's `node_modules` (incl. `@scope/*`) for Agent Plugins packages. |
115
139
  | `mcp` | `false` | Also register MCP servers from discovered packages' `mcp.json`. |
140
+ | `agents` | `false` | Also register agents from packages (see "Agents" above). |
116
141
 
117
142
  ## Notes
118
143
 
@@ -0,0 +1,18 @@
1
+ import type { PluginPackage } from "./discovery.js";
2
+ export type AgentConfig = {
3
+ model?: string;
4
+ temperature?: number;
5
+ top_p?: number;
6
+ prompt?: string;
7
+ tools?: Record<string, boolean>;
8
+ disable?: boolean;
9
+ description?: string;
10
+ mode?: "subagent" | "primary" | "all";
11
+ color?: string;
12
+ maxSteps?: number;
13
+ };
14
+ export declare function readAgents(pkg: PluginPackage): Array<{
15
+ name: string;
16
+ agent: AgentConfig;
17
+ }>;
18
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAIpD,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,KAAK,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AA4EF,wBAAgB,UAAU,CACxB,GAAG,EAAE,aAAa,GACjB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC,CA0D7C"}
package/dist/agents.js ADDED
@@ -0,0 +1,143 @@
1
+ import { readFileSync, readdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { log } from "./log.js";
4
+ // Reverse-DNS namespace this plugin (and opencode, by convention) owns for
5
+ // client-specific manifest data and extension directories (Agent Plugins 5.6/8).
6
+ const OPENCODE_NS = "dev.opencode";
7
+ const MODES = new Set(["subagent", "primary", "all"]);
8
+ function asRecord(value) {
9
+ return typeof value === "object" && value !== null
10
+ ? value
11
+ : null;
12
+ }
13
+ function readJson(path) {
14
+ try {
15
+ return JSON.parse(readFileSync(path, "utf8"));
16
+ }
17
+ catch {
18
+ return null;
19
+ }
20
+ }
21
+ // Converts a raw, package-supplied agent object into an opencode AgentConfig.
22
+ // `permission` blocks are dropped (too powerful to inherit by default) and
23
+ // unknown/mistyped keys are ignored. Returns null when nothing usable is left.
24
+ function toAgentConfig(raw) {
25
+ const src = asRecord(raw);
26
+ if (!src)
27
+ return null;
28
+ const agent = {};
29
+ const stringValue = (key) => typeof src[key] === "string" ? src[key] : undefined;
30
+ const numberValue = (key) => typeof src[key] === "number" && Number.isFinite(src[key])
31
+ ? src[key]
32
+ : undefined;
33
+ const model = stringValue("model");
34
+ const prompt = stringValue("prompt");
35
+ const description = stringValue("description");
36
+ const color = stringValue("color");
37
+ const temperature = numberValue("temperature");
38
+ const topP = numberValue("top_p");
39
+ const maxSteps = numberValue("maxSteps");
40
+ if (model)
41
+ agent.model = model;
42
+ if (prompt)
43
+ agent.prompt = prompt;
44
+ if (description)
45
+ agent.description = description;
46
+ if (color)
47
+ agent.color = color;
48
+ if (temperature !== undefined)
49
+ agent.temperature = temperature;
50
+ if (topP !== undefined)
51
+ agent.top_p = topP;
52
+ if (maxSteps !== undefined)
53
+ agent.maxSteps = maxSteps;
54
+ if (typeof src.disable === "boolean")
55
+ agent.disable = src.disable;
56
+ if (typeof src.mode === "string" && MODES.has(src.mode)) {
57
+ agent.mode = src.mode;
58
+ }
59
+ const tools = asRecord(src.tools);
60
+ if (tools) {
61
+ const filtered = {};
62
+ for (const [name, value] of Object.entries(tools)) {
63
+ if (typeof value === "boolean")
64
+ filtered[name] = value;
65
+ }
66
+ agent.tools = filtered;
67
+ }
68
+ if (src.permission !== undefined) {
69
+ log("dropping permission block from a package-supplied agent: too powerful to inherit");
70
+ }
71
+ if (!agent.description && !agent.prompt)
72
+ return null;
73
+ return agent;
74
+ }
75
+ // Discovers agents contributed by a package, in order:
76
+ // 1. plugin.json `extensions["dev.opencode"].agents` (Agent Plugins 5.6)
77
+ // 2. a `dev.opencode/agents/<name>.json` extension directory (Agent Plugins 8.2)
78
+ // 3. a legacy Claude Code plugin shim: `.claude-plugin/plugin.json` `agents`
79
+ // plus `agents/<name>/AGENTS.md` when no systemPrompt is declared.
80
+ // Returns a stable, de-duplicated list keyed by agent name.
81
+ export function readAgents(pkg) {
82
+ const out = new Map();
83
+ const manifest = asRecord(readJson(join(pkg.root, "plugin.json")));
84
+ const extensions = asRecord(manifest?.extensions);
85
+ const opencodeExt = asRecord(extensions?.[OPENCODE_NS]);
86
+ const manifestAgents = asRecord(opencodeExt?.agents);
87
+ if (manifestAgents) {
88
+ for (const [name, raw] of Object.entries(manifestAgents)) {
89
+ if (out.has(name))
90
+ continue;
91
+ const agent = toAgentConfig(raw);
92
+ if (agent)
93
+ out.set(name, agent);
94
+ }
95
+ }
96
+ const extDir = join(pkg.root, OPENCODE_NS, "agents");
97
+ let extEntries = [];
98
+ try {
99
+ extEntries = readdirSync(extDir);
100
+ }
101
+ catch {
102
+ extEntries = [];
103
+ }
104
+ for (const entry of extEntries) {
105
+ if (!entry.endsWith(".json"))
106
+ continue;
107
+ const name = entry.slice(0, -".json".length);
108
+ if (out.has(name))
109
+ continue;
110
+ const agent = toAgentConfig(readJson(join(extDir, entry)));
111
+ if (agent)
112
+ out.set(name, agent);
113
+ }
114
+ const claudeManifest = asRecord(readJson(join(pkg.root, ".claude-plugin", "plugin.json")));
115
+ const claudeAgents = asRecord(claudeManifest?.agents);
116
+ if (claudeAgents) {
117
+ for (const [name, raw] of Object.entries(claudeAgents)) {
118
+ if (out.has(name))
119
+ continue;
120
+ const src = asRecord(raw);
121
+ if (!src || typeof src.description !== "string")
122
+ continue;
123
+ const agent = { description: src.description };
124
+ if (typeof src.systemPrompt === "string" && src.systemPrompt) {
125
+ agent.prompt = src.systemPrompt;
126
+ }
127
+ else {
128
+ try {
129
+ agent.prompt = readFileSync(join(pkg.root, "agents", name, "AGENTS.md"), "utf8");
130
+ }
131
+ catch {
132
+ // No prompt file; the description alone is enough to register.
133
+ }
134
+ }
135
+ if (typeof src.model === "string")
136
+ agent.model = src.model;
137
+ if (agent.prompt || agent.description)
138
+ out.set(name, agent);
139
+ }
140
+ }
141
+ return [...out.entries()].map(([name, agent]) => ({ name, agent }));
142
+ }
143
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAkB/B,2EAA2E;AAC3E,iFAAiF;AACjF,MAAM,WAAW,GAAG,cAAc,CAAC;AAEnC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;AAEtD,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAChD,CAAC,CAAE,KAAiC;QACpC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,2EAA2E;AAC3E,+EAA+E;AAC/E,SAAS,aAAa,CAAC,GAAY;IACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,KAAK,GAAgB,EAAE,CAAC;IAE9B,MAAM,WAAW,GAAG,CAAC,GAAiD,EAAsB,EAAE,CAC5F,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,GAAG,CAAC,GAAG,CAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,MAAM,WAAW,GAAG,CAAC,GAAyC,EAAsB,EAAE,CACpF,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAW,CAAC;QACjE,CAAC,CAAE,GAAG,CAAC,GAAG,CAAY;QACtB,CAAC,CAAC,SAAS,CAAC;IAEhB,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,KAAK;QAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IAC/B,IAAI,MAAM;QAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;IAClC,IAAI,WAAW;QAAE,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;IACjD,IAAI,KAAK;QAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IAC/B,IAAI,WAAW,KAAK,SAAS;QAAE,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;IAC/D,IAAI,IAAI,KAAK,SAAS;QAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;IAC3C,IAAI,QAAQ,KAAK,SAAS;QAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACtD,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,SAAS;QAAE,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAClE,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACxD,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,IAA2B,CAAC;IAC/C,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,QAAQ,GAA4B,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAClD,IAAI,OAAO,KAAK,KAAK,SAAS;gBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QACzD,CAAC;QACD,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC;IACzB,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACjC,GAAG,CAAC,kFAAkF,CAAC,CAAC;IAC1F,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACrD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,uDAAuD;AACvD,2EAA2E;AAC3E,mFAAmF;AACnF,+EAA+E;AAC/E,wEAAwE;AACxE,4DAA4D;AAC5D,MAAM,UAAU,UAAU,CACxB,GAAkB;IAElB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACrD,IAAI,cAAc,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;YACzD,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC5B,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,KAAK;gBAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IACrD,IAAI,UAAU,GAAa,EAAE,CAAC;IAC9B,IAAI,CAAC;QACH,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,UAAU,GAAG,EAAE,CAAC;IAClB,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC5B,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,KAAK;YAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,cAAc,GAAG,QAAQ,CAC7B,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC,CAC1D,CAAC;IACF,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACtD,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YACvD,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ;gBAAE,SAAS;YAC1D,MAAM,KAAK,GAAgB,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC;YAC5D,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;gBAC7D,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC;oBACH,KAAK,CAAC,MAAM,GAAG,YAAY,CACzB,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,EAC3C,MAAM,CACP,CAAC;gBACJ,CAAC;gBAAC,MAAM,CAAC;oBACP,+DAA+D;gBACjE,CAAC;YACH,CAAC;YACD,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;gBAAE,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;YAC3D,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,WAAW;gBAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACtE,CAAC"}
@@ -1,3 +1,9 @@
1
+ import type { AgentConfig } from "./agents.js";
2
+ import type { McpEntry } from "./mcp.js";
3
+ export { readAgents } from "./agents.js";
4
+ export type { AgentConfig } from "./agents.js";
5
+ export { readMcp } from "./mcp.js";
6
+ export type { McpEntry } from "./mcp.js";
1
7
  export type PackageSource = "claude" | "vscode" | "opencode-cache" | "node_modules" | "extra";
2
8
  export type PluginPackage = {
3
9
  source: PackageSource;
@@ -13,17 +19,6 @@ export type SkillInfo = {
13
19
  name: string;
14
20
  description: string;
15
21
  };
16
- export type McpEntry = {
17
- type: "local";
18
- command: string[];
19
- environment?: Record<string, string>;
20
- enabled?: boolean;
21
- } | {
22
- type: "remote";
23
- url: string;
24
- headers?: Record<string, string>;
25
- enabled?: boolean;
26
- };
27
22
  export type ConfigPatch = {
28
23
  skillPaths: string[];
29
24
  commands: Array<{
@@ -35,25 +30,42 @@ export type ConfigPatch = {
35
30
  key: string;
36
31
  entry: McpEntry;
37
32
  }>;
33
+ agents: Array<{
34
+ name: string;
35
+ agent: AgentConfig;
36
+ }>;
37
+ };
38
+ export type ConfigLike = {
39
+ skills?: {
40
+ paths?: string[];
41
+ };
42
+ command?: Record<string, {
43
+ description?: string;
44
+ template: string;
45
+ }>;
46
+ mcp?: Record<string, McpEntry>;
47
+ agent?: Record<string, AgentConfig | undefined>;
38
48
  };
39
- export declare function log(message: string): void;
40
49
  export declare function contains(parent: string, child: string): boolean;
41
50
  export declare function readSkillInfo(dir: string): SkillInfo | null;
42
51
  export declare function readPackage(root: string, source: PackageSource): PluginPackage | null;
43
52
  export declare function findSkillDirs(root: string, out: Set<string>, seen: Set<string>): void;
44
53
  export declare function packageFromDir(root: string, source: PackageSource): PluginPackage | null;
54
+ export declare function collectVscodeManifest(out: PluginPackage[], installedJson: string): void;
55
+ export declare function collectVscodeCache(out: PluginPackage[], cacheJson: string): void;
45
56
  export declare function collectVscode(out: PluginPackage[], extra: string[]): void;
57
+ export declare function collectClaudeManifest(out: PluginPackage[], installedJson: string): void;
46
58
  export declare function collectClaude(out: PluginPackage[]): void;
47
59
  export declare function opencodeCacheRoot(): string;
48
60
  export declare function collectOpencodeCache(packagesRoot: string, out: PluginPackage[]): void;
49
61
  export declare function collectNodeModules(nodeModulesRoot: string, out: PluginPackage[]): void;
50
- export declare function pluginDataRoot(name: string): string;
51
- export declare function readMcp(pkg: PluginPackage, out: Array<{
52
- key: string;
53
- entry: McpEntry;
54
- }>): void;
55
62
  export declare function planConfig(packages: PluginPackage[], taken?: {
56
63
  commands?: Iterable<string>;
57
64
  mcp?: Iterable<string>;
65
+ agents?: Iterable<string>;
58
66
  }): ConfigPatch;
67
+ export declare function applyConfigPatch(config: ConfigLike, plan: ConfigPatch, enabled: {
68
+ mcp: boolean;
69
+ agents: boolean;
70
+ }): void;
59
71
  //# sourceMappingURL=discovery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
package/dist/discovery.js CHANGED
@@ -1,14 +1,12 @@
1
- import { existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, statSync, } from "node:fs";
1
+ import { existsSync, readFileSync, readdirSync, realpathSync, statSync, } from "node:fs";
2
2
  import { homedir } from "node:os";
3
3
  import { dirname, isAbsolute, join, relative, sep } from "node:path";
4
- const PLUGIN_SCHEMA = /^https:\/\/agent-plugins\.org\/schemas\/1\.\d+\.\d+\/plugin\.schema\.json$/;
5
- const MCP_SCHEMA = /^https:\/\/agent-plugins\.org\/schemas\/1\.\d+\.\d+\/mcp\.schema\.json$/;
6
- const VERSION = /^https:\/\/agent-plugins\.org\/schemas\/(\d+\.\d+\.\d+)\//;
7
- const STDIO_KEYS = new Set(["type", "command", "args", "env", "cwd"]);
8
- const HTTP_KEYS = new Set(["type", "url", "headers"]);
9
- export function log(message) {
10
- console.error(`[opencode-skill-autodiscovery] ${message}`);
11
- }
4
+ import { log } from "./log.js";
5
+ import { readAgents } from "./agents.js";
6
+ import { readMcp } from "./mcp.js";
7
+ import { NAME_PATTERN, PLUGIN_SCHEMA, VERSION } from "./schema.js";
8
+ export { readAgents } from "./agents.js";
9
+ export { readMcp } from "./mcp.js";
12
10
  function isDirectory(p) {
13
11
  try {
14
12
  return statSync(p).isDirectory();
@@ -61,8 +59,8 @@ export function readSkillInfo(dir) {
61
59
  }
62
60
  // Reads a conformant Agent Plugins 1.0.0 package from a directory root.
63
61
  // Returns null when the root has no valid plugin.json, so callers can fall
64
- // back to legacy discovery. The $schema URL is the discriminator that makes
65
- // scanning untrusted directories safe.
62
+ // back to legacy discovery. The $schema URL and the manifest name are the
63
+ // discriminators that make scanning untrusted directories safe.
66
64
  export function readPackage(root, source) {
67
65
  const manifestPath = join(root, "plugin.json");
68
66
  if (!isRegularFile(manifestPath))
@@ -79,7 +77,10 @@ export function readPackage(root, source) {
79
77
  if (typeof manifest.$schema !== "string" || !PLUGIN_SCHEMA.test(manifest.$schema)) {
80
78
  return null;
81
79
  }
82
- if (typeof manifest.name !== "string" || manifest.name.length === 0) {
80
+ if (typeof manifest.name !== "string" ||
81
+ manifest.name.length === 0 ||
82
+ manifest.name.length > 64 ||
83
+ !NAME_PATTERN.test(manifest.name)) {
83
84
  return null;
84
85
  }
85
86
  const skillDirs = [];
@@ -149,6 +150,22 @@ export function findSkillDirs(root, out, seen) {
149
150
  }
150
151
  }
151
152
  }
153
+ // True when a legacy Claude Code plugin declares at least one agent, so an
154
+ // agents-only plugin is still discovered even though it ships no skills.
155
+ function hasClaudeAgents(root) {
156
+ try {
157
+ const manifest = JSON.parse(readFileSync(join(root, ".claude-plugin", "plugin.json"), "utf8"));
158
+ if (typeof manifest !== "object" || manifest === null)
159
+ return false;
160
+ const agents = manifest.agents;
161
+ return (typeof agents === "object" &&
162
+ agents !== null &&
163
+ Object.keys(agents).length > 0);
164
+ }
165
+ catch {
166
+ return false;
167
+ }
168
+ }
152
169
  // Prefers a conformant package manifest; falls back to a legacy tree walk so
153
170
  // non-conformant layouts keep working. Returns null when nothing is found.
154
171
  export function packageFromDir(root, source) {
@@ -157,7 +174,7 @@ export function packageFromDir(root, source) {
157
174
  return pkg;
158
175
  const skillDirs = new Set();
159
176
  findSkillDirs(root, skillDirs, new Set());
160
- if (skillDirs.size === 0)
177
+ if (skillDirs.size === 0 && !hasClaudeAgents(root))
161
178
  return null;
162
179
  return {
163
180
  source,
@@ -223,7 +240,7 @@ function vscodePluginPath(pluginUri) {
223
240
  raw = raw.slice(1);
224
241
  return raw;
225
242
  }
226
- function collectVscodeManifest(out, installedJson) {
243
+ export function collectVscodeManifest(out, installedJson) {
227
244
  if (!existsSync(installedJson))
228
245
  return;
229
246
  let manifest;
@@ -249,7 +266,7 @@ function collectVscodeManifest(out, installedJson) {
249
266
  // cache.json. Resolve each entry so the materialized synced-customization
250
267
  // bundle ("VS Code Synced Data" Open Plugin, skills/<name>/SKILL.md) is
251
268
  // discovered.
252
- function collectVscodeCache(out, cacheJson) {
269
+ export function collectVscodeCache(out, cacheJson) {
253
270
  if (!existsSync(cacheJson))
254
271
  return;
255
272
  let entries;
@@ -269,8 +286,17 @@ function collectVscodeCache(out, cacheJson) {
269
286
  const nonce = typeof entry.nonce === "string" && entry.nonce
270
287
  ? sanitizeKey(entry.nonce)
271
288
  : "default";
272
- for (const dir of [join(parent, key, nonce), join(parent, key)]) {
273
- const pkg = packageFromDir(dir, "vscode");
289
+ const nonceDir = join(parent, key, nonce);
290
+ if (isDirectory(nonceDir)) {
291
+ const pkg = packageFromDir(nonceDir, "vscode");
292
+ if (pkg)
293
+ out.push(pkg);
294
+ }
295
+ else {
296
+ // Layouts without the {nonce} subdirectory materialize the bundle
297
+ // directly under {key}; walking it only when the nonce dir is absent
298
+ // avoids re-descending into it.
299
+ const pkg = packageFromDir(join(parent, key), "vscode");
274
300
  if (pkg)
275
301
  out.push(pkg);
276
302
  }
@@ -307,7 +333,7 @@ export function collectVscode(out, extra) {
307
333
  }
308
334
  }
309
335
  // --- Claude Code plugin discovery ------------------------------------------
310
- function collectClaudeManifest(out, installedJson) {
336
+ export function collectClaudeManifest(out, installedJson) {
311
337
  if (!existsSync(installedJson))
312
338
  return;
313
339
  let manifest;
@@ -333,23 +359,19 @@ export function collectClaude(out) {
333
359
  join(home, ".claude", "plugins", "installed_plugins.json"),
334
360
  join(home, ".claude", "remote", "plugins", "installed_plugins.json"),
335
361
  ];
336
- let found = false;
337
362
  for (const installedJson of installedJsons) {
338
363
  if (existsSync(installedJson)) {
339
- found = true;
340
364
  collectClaudeManifest(out, installedJson);
341
365
  }
342
366
  }
343
- // Remote hosts sync Claude plugins as {nonce}/ dirs with per-plugin
344
- // manifest.json but no installed_plugins.json; tree-walk the remote plugins
345
- // dir as a fallback so those skills are discovered too.
346
- if (!found) {
347
- const remoteRoot = join(home, ".claude", "remote", "plugins");
348
- if (existsSync(remoteRoot)) {
349
- const pkg = packageFromDir(remoteRoot, "claude");
350
- if (pkg)
351
- out.push(pkg);
352
- }
367
+ // Always scan the SSH-synced remote bundle too: it can exist alongside a
368
+ // local Claude Code install that has its own installed_plugins.json, and
369
+ // the same-source mirror dedup in planConfig collapses any overlap.
370
+ const remoteRoot = join(home, ".claude", "remote", "plugins");
371
+ if (existsSync(remoteRoot)) {
372
+ const pkg = packageFromDir(remoteRoot, "claude");
373
+ if (pkg)
374
+ out.push(pkg);
353
375
  }
354
376
  }
355
377
  // --- npm-distributed Agent Plugins packages --------------------------------
@@ -418,166 +440,32 @@ export function collectNodeModules(nodeModulesRoot, out) {
418
440
  }
419
441
  }
420
442
  }
421
- // --- MCP servers (mcp.json) -------------------------------------------------
422
- function opencodeStateRoot() {
423
- const base = process.env.XDG_STATE_HOME || join(homedir(), ".local", "state");
424
- return join(base, "opencode");
425
- }
426
- export function pluginDataRoot(name) {
427
- return join(opencodeStateRoot(), "plugin-data", name);
428
- }
429
- function expandPluginVars(value, root, dataDir) {
430
- return value
431
- .split("${PLUGIN_ROOT}")
432
- .join(root)
433
- .split("${PLUGIN_DATA}")
434
- .join(dataDir);
435
- }
436
- function collectHeaders(value) {
437
- const headers = {};
438
- if (typeof value === "object" && value !== null) {
439
- for (const [k, v] of Object.entries(value)) {
440
- if (typeof v === "string")
441
- headers[k] = v;
442
- }
443
- }
444
- return headers;
445
- }
446
- function hasUnknownKeys(server, allowed) {
447
- return Object.keys(server).some((k) => !allowed.has(k));
448
- }
449
- // Maps the portable mcp.json shape onto opencode's native config.mcp. Per the
450
- // Agent Plugins spec, failures are per-entry (and per-package for an invalid
451
- // mcp.json): a bad server never blocks other servers or the package's skills.
452
- export function readMcp(pkg, out) {
453
- if (!pkg.mcpPath)
454
- return;
455
- let raw;
456
- try {
457
- raw = readFileSync(pkg.mcpPath, "utf8");
458
- }
459
- catch {
460
- return;
461
- }
462
- let parsed;
463
- try {
464
- parsed = JSON.parse(raw);
465
- }
466
- catch {
467
- log(`ignoring mcp.json for package "${pkg.name}": not valid JSON`);
468
- return;
469
- }
470
- if (typeof parsed !== "object" || parsed === null) {
471
- log(`ignoring mcp.json for package "${pkg.name}": not an object`);
472
- return;
473
- }
474
- if (typeof parsed.$schema !== "string" || !MCP_SCHEMA.test(parsed.$schema)) {
475
- log(`ignoring mcp.json for package "${pkg.name}": unsupported or missing $schema`);
476
- return;
477
- }
478
- const mcpVersion = VERSION.exec(parsed.$schema)?.[1];
479
- if (pkg.schemaVersion && mcpVersion && mcpVersion !== pkg.schemaVersion) {
480
- log(`ignoring mcp.json for package "${pkg.name}": schema version ${mcpVersion} does not match plugin.json (${pkg.schemaVersion})`);
481
- return;
482
- }
483
- if (typeof parsed.mcpServers !== "object" || parsed.mcpServers === null) {
484
- log(`ignoring mcp.json for package "${pkg.name}": missing mcpServers`);
485
- return;
486
- }
487
- const dataDir = pluginDataRoot(pkg.name);
488
- const servers = parsed.mcpServers;
489
- for (const [name, serverValue] of Object.entries(servers)) {
490
- if (typeof serverValue !== "object" || serverValue === null) {
491
- log(`skipping MCP server "${pkg.name}/${name}": invalid entry`);
443
+ // --- Merge logic ------------------------------------------------------------
444
+ // Collapses mirrors of the same conformant package discovered from several
445
+ // places at once (opencode cache + project node_modules + VS Code clone +
446
+ // synced bundle). Conformant packages are identified by their manifest name;
447
+ // legacy packages fall back to source + root, which is unique per location.
448
+ function dedupePackages(packages) {
449
+ const seen = new Set();
450
+ const out = [];
451
+ for (const pkg of packages) {
452
+ const id = pkg.schemaVersion
453
+ ? `conformant:${pkg.name}`
454
+ : `${pkg.source}\u0000${pkg.root}`;
455
+ if (seen.has(id))
492
456
  continue;
493
- }
494
- const server = serverValue;
495
- if (server.type === "stdio") {
496
- if (hasUnknownKeys(server, STDIO_KEYS)) {
497
- log(`skipping MCP server "${pkg.name}/${name}": unknown fields in stdio entry`);
498
- continue;
499
- }
500
- if (typeof server.command !== "string" || server.command.length === 0) {
501
- log(`skipping MCP server "${pkg.name}/${name}": stdio requires a string command`);
502
- continue;
503
- }
504
- const command = server.command.startsWith("./")
505
- ? join(pkg.root, server.command)
506
- : server.command;
507
- const args = Array.isArray(server.args)
508
- ? server.args
509
- .filter((a) => typeof a === "string")
510
- .map((a) => expandPluginVars(a, pkg.root, dataDir))
511
- : [];
512
- const environment = {};
513
- if (typeof server.env === "object" && server.env !== null) {
514
- for (const [k, v] of Object.entries(server.env)) {
515
- if (k === "PLUGIN_ROOT" || k === "PLUGIN_DATA") {
516
- log(`dropping reserved env key "${k}" for MCP server "${pkg.name}/${name}"`);
517
- continue;
518
- }
519
- if (typeof v === "string") {
520
- environment[k] = expandPluginVars(v, pkg.root, dataDir);
521
- }
522
- }
523
- }
524
- environment.PLUGIN_ROOT = pkg.root;
525
- environment.PLUGIN_DATA = dataDir;
526
- if (server.cwd !== undefined) {
527
- const cwd = typeof server.cwd === "string"
528
- ? expandPluginVars(server.cwd, pkg.root, dataDir)
529
- : String(server.cwd);
530
- log(`dropping cwd "${cwd}" for MCP server "${pkg.name}/${name}": opencode has no cwd support`);
531
- }
532
- try {
533
- mkdirSync(dataDir, { recursive: true });
534
- }
535
- catch {
536
- // Non-fatal: the subprocess env still points at the (uncreated) dir.
537
- }
538
- out.push({
539
- key: name,
540
- entry: { type: "local", command: [command, ...args], environment, enabled: true },
541
- });
542
- }
543
- else if (server.type === "streamable-http") {
544
- if (hasUnknownKeys(server, HTTP_KEYS)) {
545
- log(`skipping MCP server "${pkg.name}/${name}": unknown fields in streamable-http entry`);
546
- continue;
547
- }
548
- if (typeof server.url !== "string" || server.url.length === 0) {
549
- log(`skipping MCP server "${pkg.name}/${name}": streamable-http requires a string url`);
550
- continue;
551
- }
552
- out.push({
553
- key: name,
554
- entry: {
555
- type: "remote",
556
- url: server.url,
557
- headers: collectHeaders(server.headers),
558
- enabled: true,
559
- },
560
- });
561
- }
562
- else if (server.type === "sse") {
563
- if (hasUnknownKeys(server, HTTP_KEYS)) {
564
- log(`skipping MCP server "${pkg.name}/${name}": unknown fields in sse entry`);
565
- continue;
566
- }
567
- log(`skipping MCP server "${pkg.name}/${name}": opencode does not support the sse transport`);
568
- }
569
- else {
570
- log(`skipping MCP server "${pkg.name}/${name}": unknown transport "${String(server.type)}"`);
571
- }
457
+ seen.add(id);
458
+ out.push(pkg);
572
459
  }
460
+ return out;
573
461
  }
574
- // --- Merge logic ------------------------------------------------------------
575
462
  // Computes the config contribution from the discovered packages: every unique
576
463
  // skill path, slash commands keyed by frontmatter name with collisions
577
464
  // namespaced by package name, and MCP servers keyed by server name with
578
465
  // collisions namespaced by package name. `taken` seeds the reserved names from
579
466
  // the user's existing config so user-defined entries are never overwritten.
580
467
  export function planConfig(packages, taken = {}) {
468
+ packages = dedupePackages(packages);
581
469
  const skillPaths = [];
582
470
  const seenDir = new Set();
583
471
  for (const pkg of packages) {
@@ -660,6 +548,82 @@ export function planConfig(packages, taken = {}) {
660
548
  mcp.push({ key: k, entry });
661
549
  }
662
550
  }
663
- return { skillPaths, commands, mcp };
551
+ const agents = [];
552
+ const usedAgents = new Set(taken.agents ?? []);
553
+ const agentOwner = new Map();
554
+ for (const name of taken.agents ?? [])
555
+ agentOwner.set(name, "user");
556
+ const seenAgent = new Set();
557
+ for (const pkg of packages) {
558
+ for (const { name, agent } of readAgents(pkg)) {
559
+ const dedupeKey = `${pkg.root}\u0000${name}`;
560
+ if (seenAgent.has(dedupeKey))
561
+ continue;
562
+ seenAgent.add(dedupeKey);
563
+ let agentName = name;
564
+ const owner = agentOwner.get(agentName);
565
+ if (owner !== undefined) {
566
+ if (owner === pkg.source)
567
+ continue;
568
+ const namespaced = `${pkg.name}-${agentName}`;
569
+ if (usedAgents.has(namespaced)) {
570
+ log(`skipping agent "${pkg.name}/${agentName}": name already taken`);
571
+ continue;
572
+ }
573
+ agentName = namespaced;
574
+ }
575
+ agentOwner.set(agentName, pkg.source);
576
+ usedAgents.add(agentName);
577
+ agents.push({ name: agentName, agent });
578
+ }
579
+ }
580
+ return { skillPaths, commands, mcp, agents };
581
+ }
582
+ // Applies a computed plan to the resolved config. Never overwrites user-defined
583
+ // entries; de-duplicates paths against what the user already configured.
584
+ // `enabled` gates the opt-in component types (MCP servers, agents), which are
585
+ // more powerful than skills and therefore off by default.
586
+ export function applyConfigPatch(config, plan, enabled) {
587
+ const doAgents = enabled.agents && plan.agents.length > 0;
588
+ if (plan.skillPaths.length === 0 && !enabled.mcp && !doAgents)
589
+ return;
590
+ if (plan.skillPaths.length > 0) {
591
+ config.skills ??= {};
592
+ config.skills.paths ??= [];
593
+ const seen = new Set(config.skills.paths);
594
+ for (const dir of plan.skillPaths) {
595
+ if (seen.has(dir))
596
+ continue;
597
+ seen.add(dir);
598
+ config.skills.paths.push(dir);
599
+ }
600
+ }
601
+ if (plan.commands.length > 0) {
602
+ config.command ??= {};
603
+ for (const cmd of plan.commands) {
604
+ if (config.command[cmd.name])
605
+ continue;
606
+ config.command[cmd.name] = {
607
+ description: cmd.description,
608
+ template: cmd.template,
609
+ };
610
+ }
611
+ }
612
+ if (enabled.mcp && plan.mcp.length > 0) {
613
+ config.mcp ??= {};
614
+ for (const { key, entry } of plan.mcp) {
615
+ if (config.mcp[key])
616
+ continue;
617
+ config.mcp[key] = entry;
618
+ }
619
+ }
620
+ if (doAgents) {
621
+ config.agent ??= {};
622
+ for (const { name, agent } of plan.agents) {
623
+ if (config.agent[name])
624
+ continue;
625
+ config.agent[name] = agent;
626
+ }
627
+ }
664
628
  }
665
629
  //# sourceMappingURL=discovery.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,qBAAqB,CAAC;;kBAoBlC,MAAM;;AAF9B,wBAwDoB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAU,MAAM,EAAE,MAAM,qBAAqB,CAAC;;kBAqBlC,MAAM;;AAF9B,wBA+BoB"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { join } from "node:path";
2
- import { collectClaude, collectNodeModules, collectOpencodeCache, collectVscode, opencodeCacheRoot, planConfig, } from "./discovery.js";
2
+ import { applyConfigPatch, collectClaude, collectNodeModules, collectOpencodeCache, collectVscode, opencodeCacheRoot, planConfig, } from "./discovery.js";
3
3
  export default (async (_input, options) => {
4
4
  return {
5
5
  config: async (cfg) => {
@@ -10,6 +10,7 @@ export default (async (_input, options) => {
10
10
  const scanCache = options?.scanCache !== false;
11
11
  const scanNodeModules = options?.scanNodeModules !== false;
12
12
  const mcpEnabled = options?.mcp === true;
13
+ const agentsEnabled = options?.agents === true;
13
14
  const packages = [];
14
15
  collectClaude(packages);
15
16
  collectVscode(packages, extra);
@@ -22,35 +23,9 @@ export default (async (_input, options) => {
22
23
  const plan = planConfig(packages, {
23
24
  commands: Object.keys(config.command ?? {}),
24
25
  mcp: Object.keys(config.mcp ?? {}),
26
+ agents: Object.keys(config.agent ?? {}),
25
27
  });
26
- if (plan.skillPaths.length === 0 && !mcpEnabled)
27
- return;
28
- if (plan.skillPaths.length > 0) {
29
- config.skills ??= {};
30
- config.skills.paths ??= [];
31
- for (const dir of plan.skillPaths) {
32
- if (!config.skills.paths.includes(dir)) {
33
- config.skills.paths.push(dir);
34
- }
35
- }
36
- }
37
- config.command ??= {};
38
- for (const cmd of plan.commands) {
39
- if (config.command[cmd.name])
40
- continue;
41
- config.command[cmd.name] = {
42
- description: cmd.description,
43
- template: cmd.template,
44
- };
45
- }
46
- if (mcpEnabled) {
47
- config.mcp ??= {};
48
- for (const { key, entry } of plan.mcp) {
49
- if (config.mcp[key])
50
- continue;
51
- config.mcp[key] = entry;
52
- }
53
- }
28
+ applyConfigPatch(config, plan, { mcp: mcpEnabled, agents: agentsEnabled });
54
29
  },
55
30
  };
56
31
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,iBAAiB,EACjB,UAAU,GACX,MAAM,gBAAgB,CAAC;AAUxB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;IACxC,OAAO;QACL,MAAM,EAAE,KAAK,EAAE,GAAW,EAAE,EAAE;YAC5B,MAAM,MAAM,GAAG,GAAuB,CAAC;YACvC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC;gBAC9C,CAAC,CAAE,OAAO,CAAC,UAAuB;gBAClC,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,KAAK,KAAK,CAAC;YAC/C,MAAM,eAAe,GAAG,OAAO,EAAE,eAAe,KAAK,KAAK,CAAC;YAC3D,MAAM,UAAU,GAAG,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;YACzC,MAAM,aAAa,GAAG,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;YAE/C,MAAM,QAAQ,GAAoB,EAAE,CAAC;YACrC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxB,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC/B,IAAI,SAAS,EAAE,CAAC;gBACd,oBAAoB,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC;YACxE,CAAC;YACD,IAAI,eAAe,EAAE,CAAC;gBACpB,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,EAAE,QAAQ,CAAC,CAAC;YACpE,CAAC;YAED,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE;gBAChC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;gBAC3C,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;gBAClC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;aACxC,CAAC,CAAC;YAEH,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;QAC7E,CAAC;KACF,CAAC;AACJ,CAAC,CAAkB,CAAC"}
package/dist/log.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export declare function sanitize(value: string): string;
2
+ export declare function log(message: string): void;
3
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAGA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI9C;AAED,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEzC"}
package/dist/log.js ADDED
@@ -0,0 +1,12 @@
1
+ // Strips ANSI escape sequences and C0 control characters so values
2
+ // interpolated from package names can never inject terminal control codes
3
+ // into the log stream.
4
+ export function sanitize(value) {
5
+ return value
6
+ .replace(/\u001b\[[0-9;]*[A-Za-z]/g, "")
7
+ .replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f]/g, "");
8
+ }
9
+ export function log(message) {
10
+ console.error(`[opencode-skill-autodiscovery] ${sanitize(message)}`);
11
+ }
12
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,0EAA0E;AAC1E,uBAAuB;AACvB,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAO,KAAK;SACT,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC;SACvC,OAAO,CAAC,2CAA2C,EAAE,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,OAAe;IACjC,OAAO,CAAC,KAAK,CAAC,kCAAkC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AACvE,CAAC"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ import type { PluginPackage } from "./discovery.js";
2
+ export type McpEntry = {
3
+ type: "local";
4
+ command: string[];
5
+ environment?: Record<string, string>;
6
+ enabled?: boolean;
7
+ } | {
8
+ type: "remote";
9
+ url: string;
10
+ headers?: Record<string, string>;
11
+ enabled?: boolean;
12
+ };
13
+ export declare function pluginDataRoot(name: string): string;
14
+ export declare function readMcp(pkg: PluginPackage, out: Array<{
15
+ key: string;
16
+ entry: McpEntry;
17
+ }>): void;
18
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,MAAM,QAAQ,GAChB;IACE,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GACD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAWN,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AA8BD,wBAAgB,OAAO,CACrB,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,CAAC,GAC3C,IAAI,CAiIN"}
package/dist/mcp.js ADDED
@@ -0,0 +1,169 @@
1
+ import { mkdirSync, readFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { log } from "./log.js";
5
+ import { MCP_SCHEMA, VERSION } from "./schema.js";
6
+ const STDIO_KEYS = new Set(["type", "command", "args", "env", "cwd"]);
7
+ const HTTP_KEYS = new Set(["type", "url", "headers"]);
8
+ const HTTP_URL = /^https?:\/\//;
9
+ function opencodeStateRoot() {
10
+ const base = process.env.XDG_STATE_HOME || join(homedir(), ".local", "state");
11
+ return join(base, "opencode");
12
+ }
13
+ export function pluginDataRoot(name) {
14
+ return join(opencodeStateRoot(), "plugin-data", name);
15
+ }
16
+ function expandPluginVars(value, root, dataDir) {
17
+ return value
18
+ .split("${PLUGIN_ROOT}")
19
+ .join(root)
20
+ .split("${PLUGIN_DATA}")
21
+ .join(dataDir);
22
+ }
23
+ function collectHeaders(value) {
24
+ const headers = {};
25
+ if (typeof value === "object" && value !== null) {
26
+ for (const [k, v] of Object.entries(value)) {
27
+ if (typeof v === "string")
28
+ headers[k] = v;
29
+ }
30
+ }
31
+ return headers;
32
+ }
33
+ function hasUnknownKeys(server, allowed) {
34
+ return Object.keys(server).some((k) => !allowed.has(k));
35
+ }
36
+ // Maps the portable mcp.json shape onto opencode's native config.mcp. Per the
37
+ // Agent Plugins spec, failures are per-entry (and per-package for an invalid
38
+ // mcp.json): a bad server never blocks other servers or the package's skills.
39
+ export function readMcp(pkg, out) {
40
+ if (!pkg.mcpPath)
41
+ return;
42
+ let raw;
43
+ try {
44
+ raw = readFileSync(pkg.mcpPath, "utf8");
45
+ }
46
+ catch {
47
+ return;
48
+ }
49
+ let parsed;
50
+ try {
51
+ parsed = JSON.parse(raw);
52
+ }
53
+ catch {
54
+ log(`ignoring mcp.json for package "${pkg.name}": not valid JSON`);
55
+ return;
56
+ }
57
+ if (typeof parsed !== "object" || parsed === null) {
58
+ log(`ignoring mcp.json for package "${pkg.name}": not an object`);
59
+ return;
60
+ }
61
+ if (typeof parsed.$schema !== "string" || !MCP_SCHEMA.test(parsed.$schema)) {
62
+ log(`ignoring mcp.json for package "${pkg.name}": unsupported or missing $schema`);
63
+ return;
64
+ }
65
+ const mcpVersion = VERSION.exec(parsed.$schema)?.[1];
66
+ if (pkg.schemaVersion && mcpVersion && mcpVersion !== pkg.schemaVersion) {
67
+ log(`ignoring mcp.json for package "${pkg.name}": schema version ${mcpVersion} does not match plugin.json (${pkg.schemaVersion})`);
68
+ return;
69
+ }
70
+ if (typeof parsed.mcpServers !== "object" || parsed.mcpServers === null) {
71
+ log(`ignoring mcp.json for package "${pkg.name}": missing mcpServers`);
72
+ return;
73
+ }
74
+ const dataDir = pluginDataRoot(pkg.name);
75
+ const servers = parsed.mcpServers;
76
+ for (const [name, serverValue] of Object.entries(servers)) {
77
+ if (typeof serverValue !== "object" || serverValue === null) {
78
+ log(`skipping MCP server "${pkg.name}/${name}": invalid entry`);
79
+ continue;
80
+ }
81
+ const server = serverValue;
82
+ if (server.type === "stdio") {
83
+ if (hasUnknownKeys(server, STDIO_KEYS)) {
84
+ log(`skipping MCP server "${pkg.name}/${name}": unknown fields in stdio entry`);
85
+ continue;
86
+ }
87
+ if (typeof server.command !== "string" || server.command.length === 0) {
88
+ log(`skipping MCP server "${pkg.name}/${name}": stdio requires a string command`);
89
+ continue;
90
+ }
91
+ const command = server.command.startsWith("./")
92
+ ? join(pkg.root, server.command)
93
+ : server.command;
94
+ const args = Array.isArray(server.args)
95
+ ? server.args
96
+ .filter((a) => typeof a === "string")
97
+ .map((a) => expandPluginVars(a, pkg.root, dataDir))
98
+ : [];
99
+ const environment = {};
100
+ if (typeof server.env === "object" && server.env !== null) {
101
+ for (const [k, v] of Object.entries(server.env)) {
102
+ if (k === "PLUGIN_ROOT" || k === "PLUGIN_DATA") {
103
+ log(`dropping reserved env key "${k}" for MCP server "${pkg.name}/${name}"`);
104
+ continue;
105
+ }
106
+ if (typeof v === "string") {
107
+ environment[k] = expandPluginVars(v, pkg.root, dataDir);
108
+ }
109
+ }
110
+ }
111
+ environment.PLUGIN_ROOT = pkg.root;
112
+ environment.PLUGIN_DATA = dataDir;
113
+ if (server.cwd !== undefined) {
114
+ const cwd = typeof server.cwd === "string"
115
+ ? expandPluginVars(server.cwd, pkg.root, dataDir)
116
+ : String(server.cwd);
117
+ log(`dropping cwd "${cwd}" for MCP server "${pkg.name}/${name}": opencode has no cwd support`);
118
+ }
119
+ try {
120
+ mkdirSync(dataDir, { recursive: true });
121
+ }
122
+ catch {
123
+ // Non-fatal: the subprocess env still points at the (uncreated) dir.
124
+ }
125
+ out.push({
126
+ key: name,
127
+ entry: { type: "local", command: [command, ...args], environment, enabled: true },
128
+ });
129
+ }
130
+ else if (server.type === "streamable-http") {
131
+ if (hasUnknownKeys(server, HTTP_KEYS)) {
132
+ log(`skipping MCP server "${pkg.name}/${name}": unknown fields in streamable-http entry`);
133
+ continue;
134
+ }
135
+ if (typeof server.url !== "string" || server.url.length === 0) {
136
+ log(`skipping MCP server "${pkg.name}/${name}": streamable-http requires a string url`);
137
+ continue;
138
+ }
139
+ if (!HTTP_URL.test(server.url)) {
140
+ log(`skipping MCP server "${pkg.name}/${name}": url must be an absolute http(s) URL`);
141
+ continue;
142
+ }
143
+ out.push({
144
+ key: name,
145
+ entry: {
146
+ type: "remote",
147
+ url: server.url,
148
+ headers: collectHeaders(server.headers),
149
+ enabled: true,
150
+ },
151
+ });
152
+ }
153
+ else if (server.type === "sse") {
154
+ if (hasUnknownKeys(server, HTTP_KEYS)) {
155
+ log(`skipping MCP server "${pkg.name}/${name}": unknown fields in sse entry`);
156
+ continue;
157
+ }
158
+ if (typeof server.url !== "string" || !HTTP_URL.test(server.url)) {
159
+ log(`skipping MCP server "${pkg.name}/${name}": sse requires an absolute http(s) url`);
160
+ continue;
161
+ }
162
+ log(`skipping MCP server "${pkg.name}/${name}": opencode does not support the sse transport`);
163
+ }
164
+ else {
165
+ log(`skipping MCP server "${pkg.name}/${name}": unknown transport "${String(server.type)}"`);
166
+ }
167
+ }
168
+ }
169
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare const PLUGIN_SCHEMA: RegExp;
2
+ export declare const MCP_SCHEMA: RegExp;
3
+ export declare const VERSION: RegExp;
4
+ export declare const NAME_PATTERN: RegExp;
5
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,QACoD,CAAC;AAE/E,eAAO,MAAM,UAAU,QACoD,CAAC;AAE5E,eAAO,MAAM,OAAO,QAA8D,CAAC;AAInF,eAAO,MAAM,YAAY,QAC8B,CAAC"}
package/dist/schema.js ADDED
@@ -0,0 +1,9 @@
1
+ // Shared Agent Plugins schema identifiers and constraints. Kept in one module
2
+ // so the plugin manifest, MCP config, and version-match logic never drift.
3
+ export const PLUGIN_SCHEMA = /^https:\/\/agent-plugins\.org\/schemas\/1\.\d+\.\d+\/plugin\.schema\.json$/;
4
+ export const MCP_SCHEMA = /^https:\/\/agent-plugins\.org\/schemas\/1\.\d+\.\d+\/mcp\.schema\.json$/;
5
+ export const VERSION = /^https:\/\/agent-plugins\.org\/schemas\/(\d+\.\d+\.\d+)\//;
6
+ // Manifest `name` constraints (Agent Plugins spec 5.5): 1-64 chars, lowercase
7
+ // alphanumeric plus `-`/`.`, alphanumeric start/end, no `--` or `..`.
8
+ export const NAME_PATTERN = /^(?!.*(?:--|\.\.))[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$/;
9
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,2EAA2E;AAE3E,MAAM,CAAC,MAAM,aAAa,GACxB,4EAA4E,CAAC;AAE/E,MAAM,CAAC,MAAM,UAAU,GACrB,yEAAyE,CAAC;AAE5E,MAAM,CAAC,MAAM,OAAO,GAAG,2DAA2D,CAAC;AAEnF,8EAA8E;AAC9E,sEAAsE;AACtE,MAAM,CAAC,MAAM,YAAY,GACvB,qDAAqD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-skill-autodiscovery",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "OpenCode plugin that auto-discovers skills installed by VS Code agent plugins, Claude Code plugins, and Agent Plugins 1.0.0 packages, and registers them with the local opencode config.",
5
5
  "license": "MIT",
6
6
  "repository": {