opencode-skill-autodiscovery 2.0.0 → 2.1.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,35 @@ 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
+ ### MCP credentials
66
+
67
+ Package-declared `mcp.json` servers are mirrored **verbatim** into your
68
+ opencode config: `headers`, `env` values, and server `url`s are copied exactly
69
+ as written (modulo `${PLUGIN_ROOT}` / `${PLUGIN_DATA}` expansion) into
70
+ `config.mcp.<server>`. opencode stores `config.mcp` in plaintext, so any
71
+ credential in those fields — an `Authorization` header, a token in `env`, an
72
+ `userinfo@` URL — is plaintext-at-rest and may appear in host config backups,
73
+ logs, or terminal output. Treat a server's headers/env/URL as a static
74
+ snapshot: once mirrored, the value has no rotation or revocation linkage back
75
+ to the package — updating the package does not rotate a copied token.
76
+
77
+ Guidance:
78
+
79
+ - **Use https-only remotes.** `streamable-http` servers must already be
80
+ `https://` to register (a plain `http://` URL would ship any `headers` in
81
+ cleartext), and that is the transport you want when a server carries
82
+ credentials.
83
+ - **Audit `config.mcp`** after discovery to confirm which servers and
84
+ credential fields entered your config, and remove anything you did not
85
+ intend to persist.
86
+ - **Use `consent` / `exclude`** to control admission: servers from untrusted
87
+ packages are skipped until the package is listed under `consent.mcp`, and
88
+ `exclude` drops a package entirely.
89
+ - The planning-time `mkdir` for a package stdio server's `PLUGIN_DATA`
90
+ directory is deferred: the directory is created only when the server is
91
+ actually applied to the config, never at plan time — so a
92
+ discovered-but-unapplied server leaves no filesystem trace.
93
+
65
94
  ### Agents (opt-in)
66
95
 
67
96
  Agent Plugins 1.0.0 has no portable "agents" component type (only skills and
@@ -87,9 +116,11 @@ Discovered agents are registered as `config.agent.<name>` with the same rules
87
116
  as commands: user-defined agents are never overwritten, same-source mirrors are
88
117
  collapsed, and cross-source collisions become `<package>-<agent>`.
89
118
 
90
- **Trust note:** a package-supplied `permission` block is always dropped agent
91
- permissions are too powerful to inherit from a package by default. If you need
92
- one, define the agent yourself in `opencode.json` (which always wins).
119
+ **Trust note:** package-supplied capability is clamped to the conservative
120
+ default: `permission` blocks and `tools` grants are always dropped, and any
121
+ declared `mode` other than `subagent` clamps to `subagent`. Each drop is logged
122
+ naming the package and the agent. If you need more, define the agent yourself
123
+ in `opencode.json` (which always wins).
93
124
 
94
125
  ### Slash commands
95
126
 
@@ -150,6 +181,7 @@ Use the tuple form to configure options:
150
181
  | `exclude` | `[]` | Package names to skip during discovery, regardless of trust tier. Matches the conformant package's `plugin.json` name, or the directory basename when there is no manifest. |
151
182
  | `mcp` | `false` | Also register MCP servers from discovered packages' `mcp.json`. |
152
183
  | `agents` | `false` | Also register agents from packages (see "Agents" above). |
184
+ | `consent` | `{}` | Per-package consent map: `consent.mcp` / `consent.agents` list package names whose MCP servers / agents are wanted even when the package is discovered as untrusted. Refines the `mcp` / `agents` switches; `exclude` remains the deny side. |
153
185
 
154
186
  Both scan flags default to `false` for supply-chain reasons: a discovered
155
187
  skill's `SKILL.md` becomes prompt material in your sessions, so anything that
@@ -181,26 +213,52 @@ deliberately, vouched for by a manifest:
181
213
  - the project's `node_modules`: dependencies install transitively, so anything
182
214
  in the tree can ship skills, MCP servers, or agents. Scanning it is **off by
183
215
  default**; restore it explicitly with `"scanNodeModules": true`.
184
- - user-supplied `extraRoots`: the plugin cannot vouch for whatever you point it at.
216
+ - user-supplied `extraRoots`: the plugin cannot vouch for whatever you point
217
+ it at. A manifest discovered under one of these roots is untrusted and may
218
+ only reference a package inside that root (a trusted VS Code home root may
219
+ still reference a global extension directory).
185
220
  - manifest-less directory walks (e.g. cloned-but-uninstalled marketplace folders).
186
221
 
187
- Trust decides whether content gets *registered*, not whether it is safe: a
188
- registered skill's `SKILL.md` becomes prompt material in your sessions. The
189
- `$schema` check identifies format only never provenance or safety. Any package
190
- can copy the literal schema URL, so a conformant manifest proves nothing about
191
- who wrote it.
192
-
193
- ### `mcp` and `agents` trust everything they find
194
-
195
- Both flags are single global switches: enabling one trusts **every** discovered
196
- package that ships the matching config. There is no per-package consent step.
197
-
198
- - `mcp: true` registers every conformant package's `mcp.json`; stdio entries
199
- execute commands on your machine.
200
- - `agents: true` registers package-supplied agents essentially verbatim within
201
- the schema: a package can set `mode: "primary"` (making itself a primary
202
- agent) and arbitrary `tools` booleans such as `"write": true`. Only
203
- `permission` blocks are dropped.
222
+ ### Graduated default
223
+
224
+ Trust gates the two component tiers differently:
225
+
226
+ - **Skills and slash commands register for every tier.** Both are read-only
227
+ content registration — surfacing a package's skills is the plugin's job, so
228
+ trust never blocks them. An untrusted package's skills and commands are
229
+ registered exactly like a trusted one's, but each untrusted package emits a
230
+ one-line info log naming the package and its source, so side-effect content
231
+ entering the session stays visible. `exclude` remains the deny side.
232
+ - **MCP servers and agents are default-off for untrusted packages.** The
233
+ `mcp` / `agents` switches admit servers and agents from trusted packages
234
+ directly; an untrusted package contributes them only when the package is
235
+ listed under `consent.mcp` / `consent.agents`.
236
+
237
+ Trust never decides whether content is *safe*: a registered skill's
238
+ `SKILL.md` becomes prompt material in your sessions. The `$schema` check
239
+ identifies format only — never provenance or safety. Any package can copy the
240
+ literal schema URL, so a conformant manifest proves nothing about who wrote it.
241
+
242
+ ### `mcp` and `agents` register package content
243
+
244
+ Both flags are global opt-in switches, narrowed by `exclude` and refined by
245
+ per-package `consent` (below). Trust decides admission: `mcp: true` /
246
+ `agents: true` admit servers or agents from trusted packages, and from
247
+ untrusted packages only when the package is listed under `consent.mcp` /
248
+ `consent.agents`.
249
+
250
+ - `mcp: true` admits MCP servers from packages that are trusted or listed in
251
+ `consent.mcp`. Every registered package-supplied server starts with
252
+ `enabled: false`: opencode will not spawn a package-declared binary or
253
+ connect to a package-chosen endpoint at startup on discovery alone.
254
+ Admittance is opt-in; the safe default is off.
255
+ - `agents: true` admits agents from packages that are trusted or listed in
256
+ `consent.agents`, then clamps each to the conservative default: a declared
257
+ `mode` other than `subagent` is dropped (a package cannot make itself a
258
+ primary agent), `tools` booleans such as `"write": true` are never
259
+ inherited, and `permission` blocks are dropped — each drop is logged naming
260
+ the package and the agent. An agent without an explicit `mode` still falls
261
+ through to opencode's `all` default.
204
262
 
205
263
  Pair these flags with `exclude` to carve out packages you do not want
206
264
  registered:
@@ -213,10 +271,44 @@ registered:
213
271
  }
214
272
  ```
215
273
 
216
- Residual risk, stated plainly: approving or rejecting an individual package's
217
- MCP servers or agents would require an interactive consent surface, which
218
- opencode's synchronous `config` hook cannot provide. The granularity available
219
- today is all-or-nothing per component type, narrowed by `exclude`.
274
+ ### Per-package consent (`consent`)
275
+
276
+ Consent is the per-package allow side for packages discovered as **untrusted**
277
+ (the project's `node_modules`, user-supplied `extraRoots`, manifest-less
278
+ walks). List a package's name under `consent.mcp` to admit its MCP servers, or
279
+ under `consent.agents` to admit its agents, even though the package is not
280
+ trusted by default:
281
+
282
+ ```json
283
+ {
284
+ "plugin": [
285
+ [
286
+ "opencode-skill-autodiscovery",
287
+ {
288
+ "scanNodeModules": true,
289
+ "mcp": true,
290
+ "agents": true,
291
+ "consent": {
292
+ "mcp": ["community-tools"],
293
+ "agents": ["community-tools"]
294
+ }
295
+ }
296
+ ]
297
+ ]
298
+ }
299
+ ```
300
+
301
+ - `consent` only refines the coarse switches: `mcp: true` / `agents: true`
302
+ stay the on-switch, and `consent.mcp` / `consent.agents` list which
303
+ untrusted packages are admitted when a switch is on.
304
+ - `exclude` remains the deny side and wins: a package listed in both
305
+ `exclude` and `consent` is never discovered.
306
+ - Trusted packages need no consent entry.
307
+ - The default — no `consent` option — grants nothing extra: untrusted
308
+ packages contribute no MCP servers or agents until admitted by name.
309
+
310
+ Consent is declarative (package names in `opencode.json`), so it works inside
311
+ opencode's synchronous `config` hook — no interactive prompt required.
220
312
 
221
313
  ### Identifier rules
222
314
 
package/dist/agents.d.ts CHANGED
@@ -11,8 +11,10 @@ export type AgentConfig = {
11
11
  color?: string;
12
12
  maxSteps?: number;
13
13
  };
14
- export declare function readAgents(pkg: PluginPackage): Array<{
14
+ type ReadAgentsResult = Array<{
15
15
  name: string;
16
16
  agent: AgentConfig;
17
17
  }>;
18
+ export declare function readAgents(pkg: PluginPackage): ReadAgentsResult;
19
+ export {};
18
20
  //# sourceMappingURL=agents.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAIA,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;AAmJF,wBAAgB,UAAU,CACxB,GAAG,EAAE,aAAa,GACjB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC,CA8H7C"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAOA,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;AAwKF,KAAK,gBAAgB,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC,CAAC;AAkBpE,wBAAgB,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,gBAAgB,CAQ/D"}
package/dist/agents.js CHANGED
@@ -1,7 +1,10 @@
1
1
  import { readFileSync, readdirSync } from "node:fs";
2
2
  import { join } from "node:path";
3
+ import { cachedRead } from "./cache.js";
4
+ import { fingerprintTree, getCachedValue, setCachedValue } from "./discovery-cache.js";
3
5
  import { log } from "./log.js";
4
6
  import { validateName } from "./schema.js";
7
+ import { resolveContained } from "./discovery.js";
5
8
  // Reverse-DNS namespace this plugin (and opencode, by convention) owns for
6
9
  // client-specific manifest data and extension directories (Agent Plugins 5.6/8).
7
10
  const OPENCODE_NS = "dev.opencode";
@@ -91,10 +94,25 @@ function readJson(path) {
91
94
  return null;
92
95
  }
93
96
  }
97
+ // Package-supplied JSON that feeds agent config (the plugin manifests and the
98
+ // dev.opencode/agents/*.json extension files) is read only when it resolves
99
+ // inside the package root. A symlinked manifest would otherwise let an outside
100
+ // file's `description`/`prompt`/`systemPrompt` fields become model prompt
101
+ // material. Missing files resolve to null silently; an escaping symlink is
102
+ // logged once by resolveContained.
103
+ function readContainedJson(root, path) {
104
+ const contained = resolveContained(root, path);
105
+ if (!contained)
106
+ return null;
107
+ return readJson(contained);
108
+ }
94
109
  // Converts a raw, package-supplied agent object into an opencode AgentConfig.
95
- // `permission` blocks are dropped (too powerful to inherit by default) and
96
- // unknown/mistyped keys are ignored. Returns null when nothing usable is left.
97
- function toAgentConfig(raw) {
110
+ // Package-supplied capability is deliberately clamped: any declared `mode`
111
+ // other than the conservative "subagent" default is dropped, and `permission`
112
+ // blocks and `tools` grants are never inherited (both too powerful to inherit
113
+ // by default). Each drop is logged naming the package and the agent. Unknown
114
+ // or mistyped keys are ignored. Returns null when nothing usable is left.
115
+ function toAgentConfig(raw, pkgName, agentName) {
98
116
  const src = asRecord(raw);
99
117
  if (!src)
100
118
  return null;
@@ -126,20 +144,25 @@ function toAgentConfig(raw) {
126
144
  agent.maxSteps = maxSteps;
127
145
  if (typeof src.disable === "boolean")
128
146
  agent.disable = src.disable;
147
+ // A declared mode other than "subagent" requests capabilities (a primary
148
+ // agent, or opencode's full "all" surface) that a package should not grant
149
+ // itself. Drop it and clamp to the conservative default. An unset mode
150
+ // falls through to opencode's own "all" default, so it stays unset.
129
151
  if (typeof src.mode === "string" && MODES.has(src.mode)) {
130
- agent.mode = src.mode;
152
+ if (src.mode !== "subagent") {
153
+ log(`dropping mode "${src.mode}" from agent "${agentName}" supplied by package "${pkgName}": clamping to conservative "subagent"`);
154
+ }
155
+ agent.mode = "subagent";
131
156
  }
157
+ // Tools booleans are capability grants and are never inherited from a
158
+ // package (agent.tools is intentionally left unset). The drop is logged so
159
+ // a package cannot silently pretend it carries write access.
132
160
  const tools = asRecord(src.tools);
133
- if (tools) {
134
- const filtered = {};
135
- for (const [name, value] of Object.entries(tools)) {
136
- if (typeof value === "boolean")
137
- filtered[name] = value;
138
- }
139
- agent.tools = filtered;
161
+ if (tools && Object.values(tools).some((value) => typeof value === "boolean")) {
162
+ log(`dropping tools from agent "${agentName}" supplied by package "${pkgName}": too powerful to inherit`);
140
163
  }
141
164
  if (src.permission !== undefined) {
142
- log("dropping permission block from a package-supplied agent: too powerful to inherit");
165
+ log(`dropping permission block from agent "${agentName}" supplied by package "${pkgName}": too powerful to inherit`);
143
166
  }
144
167
  if (!agent.description && !agent.prompt)
145
168
  return null;
@@ -151,9 +174,29 @@ function toAgentConfig(raw) {
151
174
  // 3. a legacy Claude Code plugin shim: `.claude-plugin/plugin.json` `agents`
152
175
  // plus `agents/<name>/AGENTS.md` when no systemPrompt is declared.
153
176
  // Returns a stable, de-duplicated list keyed by agent name.
177
+ //
178
+ // Cached as a whole per package, fingerprinted on pkg.root: this function's
179
+ // own per-file cachedRead calls (below) already skip re-parsing an unchanged
180
+ // *file*, but still pay a readdirSync + containment check (2x realpathSync)
181
+ // per candidate file on every call. A marketplace package that ships many
182
+ // flat agent .md files directly in its root (the agency-agents layout) makes
183
+ // that per-file overhead the dominant remaining cost even on an otherwise
184
+ // fully warm run — skipping the whole function on an unchanged package root
185
+ // avoids it entirely, the same way discovery-cache.ts's walk-skip avoids
186
+ // re-walking an unchanged marketplace tree.
154
187
  export function readAgents(pkg) {
188
+ const fingerprint = fingerprintTree(pkg.root);
189
+ const key = JSON.stringify(["agents", pkg.root]);
190
+ const cached = getCachedValue(key, fingerprint);
191
+ if (cached)
192
+ return cached;
193
+ const result = readAgentsUncached(pkg);
194
+ setCachedValue(key, fingerprint, result);
195
+ return result;
196
+ }
197
+ function readAgentsUncached(pkg) {
155
198
  const out = new Map();
156
- const manifest = asRecord(readJson(join(pkg.root, "plugin.json")));
199
+ const manifest = asRecord(readContainedJson(pkg.root, join(pkg.root, "plugin.json")));
157
200
  const extensions = asRecord(manifest?.extensions);
158
201
  const opencodeExt = asRecord(extensions?.[OPENCODE_NS]);
159
202
  const manifestAgents = asRecord(opencodeExt?.agents);
@@ -167,7 +210,7 @@ export function readAgents(pkg) {
167
210
  }
168
211
  if (out.has(name))
169
212
  continue;
170
- const agent = toAgentConfig(raw);
213
+ const agent = toAgentConfig(raw, pkg.name, name);
171
214
  if (agent)
172
215
  out.set(name, agent);
173
216
  }
@@ -192,11 +235,11 @@ export function readAgents(pkg) {
192
235
  }
193
236
  if (out.has(name))
194
237
  continue;
195
- const agent = toAgentConfig(readJson(join(extDir, entry)));
238
+ const agent = toAgentConfig(readContainedJson(pkg.root, join(extDir, entry)), pkg.name, name);
196
239
  if (agent)
197
240
  out.set(name, agent);
198
241
  }
199
- const claudeManifest = asRecord(readJson(join(pkg.root, ".claude-plugin", "plugin.json")));
242
+ const claudeManifest = asRecord(readContainedJson(pkg.root, join(pkg.root, ".claude-plugin", "plugin.json")));
200
243
  const claudeAgents = asRecord(claudeManifest?.agents);
201
244
  if (claudeAgents) {
202
245
  for (const [name, raw] of Object.entries(claudeAgents)) {
@@ -216,11 +259,17 @@ export function readAgents(pkg) {
216
259
  agent.prompt = src.systemPrompt;
217
260
  }
218
261
  else {
219
- try {
220
- agent.prompt = readFileSync(join(pkg.root, "agents", name, "AGENTS.md"), "utf8");
221
- }
222
- catch {
223
- // No prompt file; the description alone is enough to register.
262
+ // AGENTS.md is package-supplied prompt content: only read it when it
263
+ // resolves inside the package, so a symlinked shim cannot pull in an
264
+ // outside file's bytes.
265
+ const promptPath = resolveContained(pkg.root, join(pkg.root, "agents", name, "AGENTS.md"));
266
+ if (promptPath) {
267
+ try {
268
+ agent.prompt = readFileSync(promptPath, "utf8");
269
+ }
270
+ catch {
271
+ // No prompt file; the description alone is enough to register.
272
+ }
224
273
  }
225
274
  }
226
275
  if (typeof src.model === "string")
@@ -255,18 +304,28 @@ export function readAgents(pkg) {
255
304
  }
256
305
  if (out.has(name))
257
306
  continue;
258
- let content;
307
+ // Flat agent files are package-supplied prompt content: only read one
308
+ // when it resolves inside the package, so a symlinked .md cannot pull in
309
+ // an outside file's bytes.
310
+ const contained = resolveContained(pkg.root, join(flatAgentsDir, entry));
311
+ if (!contained)
312
+ continue;
313
+ let parsed;
259
314
  try {
260
- content = readFileSync(join(flatAgentsDir, entry), "utf8");
315
+ parsed = cachedRead("flat-agent-md", contained, (content) => {
316
+ // Bare .md files in the package root may be docs (README.md); only
317
+ // treat them as agents when they carry a frontmatter block.
318
+ if (isRoot && !/^---\s*\n/.test(content))
319
+ return null;
320
+ return parseAgentMarkdown(content);
321
+ });
261
322
  }
262
323
  catch {
263
324
  continue;
264
325
  }
265
- // Bare .md files in the package root may be docs (README.md); only treat
266
- // them as agents when they carry a frontmatter block.
267
- if (isRoot && !/^---\s*\n/.test(content))
326
+ if (!parsed)
268
327
  continue;
269
- const { description, color, body } = parseAgentMarkdown(content);
328
+ const { description, color, body } = parsed;
270
329
  if (!description && !body)
271
330
  continue;
272
331
  const agent = {};
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function pluginCacheRoot(): string;
2
+ export declare function _resetFileCacheForTests(): void;
3
+ export declare function cachedRead<T>(kind: string, path: string, parse: (content: string) => T): T;
4
+ export declare function flushFileCache(): void;
5
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAqCA,wBAAgB,eAAe,IAAI,MAAM,CAGxC;AAyBD,wBAAgB,uBAAuB,IAAI,IAAI,CAG9C;AAgBD,wBAAgB,UAAU,CAAC,CAAC,EAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,CAAC,GAC5B,CAAC,CAaH;AAMD,wBAAgB,cAAc,IAAI,IAAI,CAWrC"}
package/dist/cache.js ADDED
@@ -0,0 +1,94 @@
1
+ import { mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ const CACHE_FILE_NAME = "discovery-file-cache.json";
5
+ // Bump when the shape of a cached `value` changes, so an old on-disk cache
6
+ // from a prior plugin version is discarded instead of misread.
7
+ const CACHE_VERSION = 1;
8
+ let store = null;
9
+ let dirty = false;
10
+ // Deliberately its own root, separate from {state}/opencode/plugin-data/:
11
+ // that tree is reserved for *discovered* packages' own data (created only
12
+ // when a package's mcp.json is actually processed), and several tests assert
13
+ // it stays untouched when discovery finds nothing that needs it. This cache
14
+ // belongs to the plugin itself, not to anything it discovers. Exported so
15
+ // other plugin-owned caches (discovery-cache.ts) share one root instead of
16
+ // inventing their own convention.
17
+ export function pluginCacheRoot() {
18
+ const base = process.env.XDG_CACHE_HOME || join(homedir(), ".cache");
19
+ return join(base, "opencode-skill-autodiscovery");
20
+ }
21
+ function cacheFilePath() {
22
+ return join(pluginCacheRoot(), CACHE_FILE_NAME);
23
+ }
24
+ function loadStore() {
25
+ if (store)
26
+ return store;
27
+ try {
28
+ const raw = JSON.parse(readFileSync(cacheFilePath(), "utf8"));
29
+ store =
30
+ raw && raw.version === CACHE_VERSION && raw.entries && typeof raw.entries === "object"
31
+ ? raw.entries
32
+ : {};
33
+ }
34
+ catch {
35
+ store = {};
36
+ }
37
+ return store;
38
+ }
39
+ // Test-only seam: drops the in-memory store so the next cachedRead/flush
40
+ // reloads from disk (or starts empty) instead of reusing state left over
41
+ // from a previous test's HOME. Production code never calls this: one
42
+ // opencode process makes exactly one config() call, so a process-lifetime
43
+ // singleton is the right scope there.
44
+ export function _resetFileCacheForTests() {
45
+ store = null;
46
+ dirty = false;
47
+ }
48
+ // Reads `path` and feeds its content to `parse`, reusing a previous result
49
+ // when the file's (mtimeMs, size) match the last successful cachedRead of the
50
+ // same (kind, path) pair. Throws exactly when `readFileSync`/`statSync` would
51
+ // have thrown (missing file, permission error, etc.) — existing callers
52
+ // already wrap those in try/catch, so behavior is unchanged when nothing is
53
+ // cached yet. `parse` must be pure and return a JSON-serializable value: it
54
+ // round-trips through the on-disk cache verbatim.
55
+ //
56
+ // `kind` namespaces the cache entry by what `parse` extracts, not just which
57
+ // file: the same file is read for different purposes at different call sites
58
+ // (e.g. "does this .md have agent frontmatter" vs. "the parsed agent from
59
+ // this .md"), and those must never share one cached value. The key is built
60
+ // with JSON.stringify (not string concatenation) so no separator choice can
61
+ // ever collide with a path or kind that happens to contain it.
62
+ export function cachedRead(kind, path, parse) {
63
+ const st = statSync(path);
64
+ const key = JSON.stringify([kind, path]);
65
+ const s = loadStore();
66
+ const cached = s[key];
67
+ if (cached && cached.mtimeMs === st.mtimeMs && cached.size === st.size) {
68
+ return cached.value;
69
+ }
70
+ const content = readFileSync(path, "utf8");
71
+ const value = parse(content);
72
+ s[key] = { mtimeMs: st.mtimeMs, size: st.size, value };
73
+ dirty = true;
74
+ return value;
75
+ }
76
+ // Persists the in-memory cache to disk when it changed. Best-effort, like
77
+ // every other filesystem side effect in this codebase: a failed write is
78
+ // swallowed rather than surfaced, since caching is an optimization and must
79
+ // never be able to break discovery.
80
+ export function flushFileCache() {
81
+ if (!dirty || !store)
82
+ return;
83
+ try {
84
+ const path = cacheFilePath();
85
+ mkdirSync(dirname(path), { recursive: true });
86
+ const payload = { version: CACHE_VERSION, entries: store };
87
+ writeFileSync(path, JSON.stringify(payload));
88
+ dirty = false;
89
+ }
90
+ catch {
91
+ // Non-fatal: the next run just re-reads everything.
92
+ }
93
+ }
94
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAoB1C,MAAM,eAAe,GAAG,2BAA2B,CAAC;AACpD,2EAA2E;AAC3E,+DAA+D;AAC/D,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,IAAI,KAAK,GAAsB,IAAI,CAAC;AACpC,IAAI,KAAK,GAAG,KAAK,CAAC;AAElB,0EAA0E;AAC1E,0EAA0E;AAC1E,6EAA6E;AAC7E,4EAA4E;AAC5E,0EAA0E;AAC1E,2EAA2E;AAC3E,kCAAkC;AAClC,MAAM,UAAU,eAAe;IAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC,IAAI,EAAE,8BAA8B,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,eAAe,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,SAAS;IAChB,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,EAAE,MAAM,CAAC,CAAuB,CAAC;QACpF,KAAK;YACH,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,aAAa,IAAI,GAAG,CAAC,OAAO,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;gBACpF,CAAC,CAAC,GAAG,CAAC,OAAO;gBACb,CAAC,CAAC,EAAE,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,GAAG,EAAE,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yEAAyE;AACzE,yEAAyE;AACzE,qEAAqE;AACrE,0EAA0E;AAC1E,sCAAsC;AACtC,MAAM,UAAU,uBAAuB;IACrC,KAAK,GAAG,IAAI,CAAC;IACb,KAAK,GAAG,KAAK,CAAC;AAChB,CAAC;AAED,2EAA2E;AAC3E,8EAA8E;AAC9E,8EAA8E;AAC9E,wEAAwE;AACxE,4EAA4E;AAC5E,4EAA4E;AAC5E,kDAAkD;AAClD,EAAE;AACF,6EAA6E;AAC7E,6EAA6E;AAC7E,0EAA0E;AAC1E,4EAA4E;AAC5E,4EAA4E;AAC5E,+DAA+D;AAC/D,MAAM,UAAU,UAAU,CACxB,IAAY,EACZ,IAAY,EACZ,KAA6B;IAE7B,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;IACtB,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,EAAE,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;QACvE,OAAO,MAAM,CAAC,KAAU,CAAC;IAC3B,CAAC;IACD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;IACvD,KAAK,GAAG,IAAI,CAAC;IACb,OAAO,KAAK,CAAC;AACf,CAAC;AAED,0EAA0E;AAC1E,yEAAyE;AACzE,4EAA4E;AAC5E,oCAAoC;AACpC,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK;QAAE,OAAO;IAC7B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;QAC7B,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAc,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACtE,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7C,KAAK,GAAG,KAAK,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;IACtD,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { PluginPackage } from "./discovery.js";
2
+ export declare function _resetDiscoveryCacheForTests(): void;
3
+ export declare function fingerprintTree(root: string): string;
4
+ export declare function getCachedPackages(key: string, fingerprint: string): PluginPackage[] | null;
5
+ export declare function setCachedPackages(key: string, fingerprint: string, packages: PluginPackage[]): void;
6
+ export declare function getCachedValue<T>(key: string, fingerprint: string): T | null;
7
+ export declare function setCachedValue<T>(key: string, fingerprint: string, value: T): void;
8
+ export declare function flushDiscoveryCache(): void;
9
+ //# sourceMappingURL=discovery-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery-cache.d.ts","sourceRoot":"","sources":["../src/discovery-cache.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AA+DpD,wBAAgB,4BAA4B,IAAI,IAAI,CAGnD;AAcD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOpD;AA2BD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa,EAAE,GAAG,IAAI,CAE1F;AAKD,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,aAAa,EAAE,GACxB,IAAI,CAEN;AAWD,wBAAgB,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAG5E;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAGlF;AAQD,wBAAgB,mBAAmB,IAAI,IAAI,CAa1C"}