universal-plugin 0.16.3 → 0.17.1

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.
Files changed (41) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.codex-plugin/plugin.json +1 -1
  3. package/.cursor-plugin/plugin.json +1 -1
  4. package/CHANGELOG.md +24 -0
  5. package/agents/agentskills-specialist.md +6 -11
  6. package/com.github.copilot/agents/agentskills-specialist.agent.md +6 -11
  7. package/dist/cli.mjs +669 -407
  8. package/package.json +6 -6
  9. package/plugin.json +5 -1
  10. package/readme.md +2 -2
  11. package/references/plugin-design.md +19 -33
  12. package/references/slash-invocation.md +2 -2
  13. package/skills/adopt-upx/scripts/rewrite-upx.mjs +1 -1
  14. package/skills/build-plugin/SKILL.md +2 -3
  15. package/skills/build-plugin/scripts/build.mjs +1 -1
  16. package/skills/doctor-universal-plugin/README.md +1 -1
  17. package/skills/doctor-universal-plugin/SKILL.md +3 -3
  18. package/skills/doctor-universal-plugin/scripts/doctor.mjs +1 -1
  19. package/skills/init-universal-plugin/README.md +1 -1
  20. package/skills/init-universal-plugin/SKILL.md +2 -2
  21. package/skills/init-universal-plugin/references/create.md +7 -7
  22. package/skills/init-universal-plugin/references/detection.md +1 -1
  23. package/skills/init-universal-plugin/references/frontmatter.md +1 -1
  24. package/skills/init-universal-plugin/references/standard.md +3 -3
  25. package/skills/init-universal-plugin/references/vendors/copilot-cli.md +3 -0
  26. package/skills/init-universal-plugin/scripts/init.mjs +1 -1
  27. package/skills/marketplace/README.md +9 -2
  28. package/skills/marketplace/SKILL.md +15 -10
  29. package/skills/marketplace/references/add.md +3 -1
  30. package/skills/marketplace/references/update.md +75 -0
  31. package/skills/marketplace/references/validate.md +1 -1
  32. package/skills/marketplace/scripts/add.mjs +1 -1
  33. package/skills/marketplace/scripts/install-docs.mjs +1 -1
  34. package/skills/marketplace/scripts/marketplace.mjs +1 -1
  35. package/skills/marketplace/scripts/update.mjs +52 -0
  36. package/skills/marketplace/scripts/validate.mjs +1 -1
  37. package/skills/migrate-plugin/SKILL.md +1 -2
  38. package/skills/publish-plugin/SKILL.md +15 -6
  39. package/skills/version/README.md +2 -2
  40. package/skills/version/SKILL.md +4 -4
  41. package/skills/version/scripts/version.mjs +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "universal-plugin",
3
- "version": "0.16.3",
3
+ "version": "0.17.1",
4
4
  "description": "Universal AI agent plugin build tool",
5
5
  "keywords": [
6
6
  "agent-plugin",
@@ -41,17 +41,17 @@
41
41
  ],
42
42
  "dependencies": {
43
43
  "@repobuddy/upx": "^0.2.0",
44
- "@toon-format/toon": "^4.1.1",
45
- "commander": "^15.0.0",
46
- "cyber-agentkit": "^1.0.0",
47
- "rolldown": "^1.2.11",
48
- "semver": "^7.8.1"
44
+ "rolldown": "^1.2.11"
49
45
  },
50
46
  "devDependencies": {
47
+ "@toon-format/toon": "^4.1.1",
51
48
  "@types/node": "^24.10.1",
52
49
  "@types/semver": "^7.7.1",
53
50
  "ajv": "^8.20.0",
51
+ "commander": "^15.0.0",
52
+ "cyber-agentkit": "^2.0.0",
54
53
  "knip": "^6.14.1",
54
+ "semver": "^7.8.1",
55
55
  "tsdown": "^0.23.0",
56
56
  "tsx": "^4.22.3",
57
57
  "typescript": "^6.0.0",
package/plugin.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "universal-plugin",
4
- "version": "0.16.3",
4
+ "version": "0.17.1",
5
5
  "description": "Research and design toolkit for building universal AI coding agent plugins that work across Claude Code, Cursor, Codex, and GitHub Copilot CLI.",
6
6
  "author": {
7
7
  "name": "unional"
@@ -44,6 +44,10 @@
44
44
  "source": "src/skill-scripts/run-cli.ts",
45
45
  "command": "marketplace init"
46
46
  },
47
+ "skills/marketplace/scripts/update.mjs": {
48
+ "source": "src/skill-scripts/run-cli.ts",
49
+ "command": "marketplace update"
50
+ },
47
51
  "skills/marketplace/scripts/validate.mjs": {
48
52
  "source": "src/skill-scripts/run-cli.ts",
49
53
  "command": "marketplace validate"
package/readme.md CHANGED
@@ -74,7 +74,7 @@ npx universal-plugin publish check-version # fail when any place carr
74
74
  ```
75
75
 
76
76
  `publish sync-version` and `plugin bundle` are deprecated aliases of `plugin version --from-package`
77
- and `plugin version`. They print a warning and are removed in the next minor release.
77
+ and `plugin version`. They print a warning and will be removed in a later release.
78
78
 
79
79
  ### marketplace
80
80
 
@@ -110,7 +110,7 @@ TOON by default; pass `--format json` for JSON.
110
110
  ### Reference documents
111
111
 
112
112
  This package ships its own documents (`plugin-design`, `slash-invocation`, `universal-plugin`) under
113
- `references/`. Read one with `npx cyber-agentkit reference show <name>` in any
113
+ `references/`. Read one with `npx cyber-agentkit reference load <name>` in any
114
114
  project that depends on `universal-plugin`, or, from a skill, with the `reference` skill in the
115
115
  `cyber-agentkit` plugin.
116
116
 
@@ -1,12 +1,12 @@
1
1
  # Plugin Design
2
2
 
3
- Authoritative rules for creating, validating, and transforming cross-vendor agent plugins. Apply when creating, auditing, or distributing a plugin; see **skill-design** governance for standalone skill authoring rules.
3
+ Authoritative rules for creating, validating, and transforming cross-vendor agent plugins. Apply when creating, auditing, or distributing a plugin; see the **skill-design** reference for standalone skill authoring rules.
4
4
 
5
5
  A **plugin** is the distribution unit — it bundles skills, MCP servers, hooks, commands, agents, and other extensions into a single installable package. A **skill** is the capability unit inside a plugin. Install plugins; invoke skills.
6
6
 
7
7
  ## Source of Truth: root `plugin.json`
8
8
 
9
- Author `plugin.json` at the plugin root as the canonical manifest — the Agent Plugins Specification v1.0.0 shape (closed field set, `additionalProperties: false`). All vendor manifests are derived from it via `build`. This file is never read directly by vendors at runtime; it is the single source that the build layer transforms into each vendor's manifest.
9
+ Author `plugin.json` at the plugin root as the canonical manifest — the Agent Plugins Specification v1.0.0 shape (closed field set, `additionalProperties: false`). All vendor manifests are derived from it via `build`. GitHub Copilot CLI reads this file directly at runtime; every other vendor reads the manifest the build layer derives from it.
10
10
 
11
11
  Schema declaration (first field, fixed by the spec):
12
12
 
@@ -98,8 +98,7 @@ Vendor-specific extension fields:
98
98
  │
99
99
  ├── hooks/hooks.json ← canonical hooks (PascalCase, ${PLUGIN_ROOT})
100
100
  │
101
- ├── .mcp.json ← source of truth (all vendors)
102
- ├── mcp.json -> .mcp.json ← symlink (Cursor + open-plugin-spec)
101
+ ├── mcp.json ← MCP config (fixed location, all vendors)
103
102
  │
104
103
  └── README.md
105
104
  ```
@@ -141,11 +140,11 @@ Build reads root `plugin.json`, applies the rules below, writes each vendor's ou
141
140
  | Canonical field | Claude Code | Cursor | Codex | Copilot CLI |
142
141
  | --- | --- | --- | --- | --- |
143
142
  | `skills` | ✓ | ✓ | ✓ | ✓ |
144
- | `mcpServers` | ✓ → `./.mcp.json` | adapt → `./mcp.json` (symlink) | ✓ → `./.mcp.json` | ✓ |
143
+ | `mcpServers` | ✓ → `./mcp.json` | ✓ → `./mcp.json` | ✓ → `./mcp.json` | ✓ |
145
144
  | `commands` | ✓ | ✓ | **omit** | ✓ |
146
145
  | `agents` | ✓ | ✓ | **omit** | ✓ |
147
146
  | `rules` | **omit** | ✓ | **omit** | **omit** |
148
- | `hooks` | adapt → PascalCase, `${CLAUDE_PLUGIN_ROOT}` | adapt → camelCase, pass-through env | ✓ → PascalCase, `${PLUGIN_ROOT}` native | adapt → camelCase, pass-through env |
147
+ | `hooks` | adapt → PascalCase, `${CLAUDE_PLUGIN_ROOT}` | adapt → camelCase, pass-through env | ✓ → PascalCase, `${PLUGIN_ROOT}` native | ✓ → PascalCase (selects the Claude-compatible payload) |
149
148
  | `lspServers` | ✓ | **omit** | **omit** | **omit** |
150
149
  | `outputStyles` | ✓ | **omit** | **omit** | **omit** |
151
150
  | `dependencies` | ✓ | **drop + warn** | **drop + warn** | **drop + warn** |
@@ -193,15 +192,15 @@ Canonical hooks file uses **PascalCase** event names. Build translates per vendo
193
192
 
194
193
  | Canonical (PascalCase) | Claude Code | Cursor | Codex | Copilot CLI |
195
194
  | --- | --- | --- | --- | --- |
196
- | `PreToolUse` | `PreToolUse` | `preToolUse` | `PreToolUse` | `preToolUse` |
197
- | `PostToolUse` | `PostToolUse` | `postToolUse` | `PostToolUse` | `postToolUse` |
195
+ | `PreToolUse` | `PreToolUse` | `preToolUse` | `PreToolUse` | `PreToolUse` |
196
+ | `PostToolUse` | `PostToolUse` | `postToolUse` | `PostToolUse` | `PostToolUse` |
198
197
  | `PostToolUseFailure` | `PostToolUseFailure` | — (drop+warn) | — (drop+warn) | — (drop+warn) |
199
- | `SessionStart` | `SessionStart` | `sessionStart` | `SessionStart` | `sessionStart` |
200
- | `SessionEnd` | `SessionEnd` | `sessionEnd` | `SessionEnd` | `sessionEnd` |
201
- | `Stop` | `Stop` | — (drop+warn) | — (drop+warn) | `agentStop` |
198
+ | `SessionStart` | `SessionStart` | `sessionStart` | `SessionStart` | `SessionStart` |
199
+ | `SessionEnd` | `SessionEnd` | `sessionEnd` | `SessionEnd` | `SessionEnd` |
200
+ | `Stop` | `Stop` | — (drop+warn) | — (drop+warn) | `Stop` |
202
201
  | `UserPromptSubmit` | `UserPromptSubmit` | `beforeSubmitPrompt` | — (drop+warn) | — (drop+warn) |
203
- | `Notification` | `Notification` | — (drop+warn) | — (drop+warn) | `notification` |
204
- | `PermissionRequest` | `PermissionRequest` | — (drop+warn) | — (drop+warn) | `permissionRequest` |
202
+ | `Notification` | `Notification` | — (drop+warn) | — (drop+warn) | `Notification` |
203
+ | `PermissionRequest` | `PermissionRequest` | — (drop+warn) | — (drop+warn) | `PermissionRequest` |
205
204
  | `SubagentStart` | — | `subagentStart` | — | — |
206
205
  | `SubagentStop` | — | `subagentStop` | — | — |
207
206
  | `PreCompact` | `PreCompact` | `preCompact` | — | — |
@@ -230,20 +229,9 @@ Events not in this table: pass through for `claude-code`; drop + warn for all ot
230
229
 
231
230
  Build generates vendor-specific versions. Do not hand-author the generated hook files.
232
231
 
233
- ## MCP: Symlink Rule
232
+ ## MCP: `mcp.json`
234
233
 
235
- `.mcp.json` is the source of truth. `mcp.json` is always a symlink — never a regular file.
236
-
237
- ```bash
238
- ln -sf .mcp.json mcp.json
239
- ```
240
-
241
- | Runtime | Reads |
242
- | --- | --- |
243
- | Claude Code, Codex | `.mcp.json` |
244
- | Cursor, open-plugin-spec | `mcp.json` (via symlink) |
245
-
246
- If the repo needs explicit symlink tracking: `mcp.json symlink` in `.gitattributes`. MCP server startup failures are non-fatal.
234
+ `mcp.json` at the plugin root is the Agent Plugins Specification's fixed MCP location, Author it as a regular file. `build` points each derived manifest at it, unless it has to change an entry for that vendor; then it writes the changed copy beside the vendor manifest. MCP server startup failures are non-fatal.
247
235
 
248
236
  ### Pinning a self-published server to the plugin version
249
237
 
@@ -271,9 +259,9 @@ A plugin whose MCP server is its own npm package writes an unpinned invocation
271
259
 
272
260
  ## Component Authoring Rules
273
261
 
274
- **Skills:** Author `skills/<name>/SKILL.md` following the **skill-design** governance. Within a plugin, reference MCP tools by fully qualified name: `{plugin-name}:{server-name}__{tool-name}`. Use the **slash-invocation** governance when a skill needs a user-only, model-only, or explicit both-invocation policy.
262
+ **Skills:** Author `skills/<name>/SKILL.md` following the **skill-design** reference. Within a plugin, reference MCP tools by fully qualified name: `{plugin-name}:{server-name}__{tool-name}`. Use the **slash-invocation** reference when a skill needs a user-only, model-only, or explicit both-invocation policy.
275
263
 
276
- **Commands:** One `.md` file per command in `commands/`. Filename (minus extension) is the command identifier. Optional frontmatter: `description`, `argument-hint`, `allowed-tools`, `disable-model-invocation`. `$ARGUMENTS` expands to user input.
264
+ **Commands:** One `.md` file per command in `commands/`. Filename (minus extension) is the command identifier. Optional frontmatter: `description`, `argument-hint`, `allowed-tools`, `disable-model-invocation`. `$ARGUMENTS` expands to user input on Claude Code and stays literal on other runtimes.
277
265
 
278
266
  **Agents:** One `.md` file per agent in `agents/`. Required frontmatter: `name` (1–64 lowercase alphanumeric + hyphens), `description` (≤ 1024 chars). Body is the agent system prompt.
279
267
 
@@ -306,9 +294,9 @@ A plugin whose MCP server is its own npm package writes an unpinned invocation
306
294
 
307
295
  | Scope | Claude Code | Cursor | Codex |
308
296
  | --- | --- | --- | --- |
309
- | **Personal** | `~/.claude/plugins/local/<name>` symlink | `~/.cursor/plugins/local/<name>` symlink + reload | `~/.agents/plugins/marketplace.json` |
297
+ | **Personal** | `universal-plugin plugin install`, then restart | `universal-plugin plugin install` (copies), then reload the window | `~/.agents/plugins/marketplace.json` |
310
298
  | **Team** | npm private package | Cursor Teams admin import | `.agents/plugins/marketplace.json` in repo |
311
- | **Public** | PR to `anthropics/claude-plugins-official` | `cursor.com/marketplace/publish` | `codex plugin marketplace add` |
299
+ | **Public** | `anthropics/claude-plugins-official` is curated and takes no pull requests; check its submission route live (`publish-plugin`, step 0c) | `cursor.com/marketplace/publish` | `codex plugin marketplace add` |
312
300
 
313
301
  Default scope: **team**.
314
302
 
@@ -318,13 +306,11 @@ Default scope: **team**.
318
306
 
319
307
  - Using `../` in any manifest-declared path
320
308
  - Hardcoding absolute paths instead of `${PLUGIN_ROOT}` or `${PLUGIN_DATA}`
321
- - Committing `mcp.json` as a regular file — must always be a symlink to `.mcp.json`
322
309
  - Hand-authoring vendor hook files — use canonical `hooks/hooks.json` and let build generate vendor versions
323
310
  - Relying on extended component types (commands, rules, agents, hooks) for core functionality — silently ignored on non-supporting hosts
324
311
  - Duplicating SKILL.md content in `plugin.json` — the manifest is a path index, never a content mirror
325
312
  - Using `rules/` for cross-agent always-on guidance — use AGENTS.md instead
326
313
  - Putting role- or task-scoped guidance in always-on context (`rules/` or AGENTS.md) — make it a reference loaded on demand
327
- - Putting install-time metadata in `plugin.json` instead of `skill.json`
328
314
 
329
315
  ## Cross-Platform Portability
330
316
 
@@ -338,7 +324,7 @@ Default scope: **team**.
338
324
  | Windsurf | Needs conversion | 6,000 char/file hard limit; 12,000 chars total |
339
325
  | Zed, Aider, Continue.dev, Cline | No | Incompatible formats |
340
326
 
341
- Portability rules for skill bodies: keep each `SKILL.md` body under 6,000 chars; use forward slashes in path references; declare environment requirements in `compatibility` frontmatter; do not embed vendor-specific syntax in skill bodies.
327
+ Portability rules for skill bodies: for a skill that must load in Windsurf, keep the `SKILL.md` body under its 6,000-char limit and move detail into `references/`; use forward slashes in path references; declare environment requirements in `compatibility` frontmatter; do not embed vendor-specific syntax in skill bodies.
342
328
 
343
329
  ## References
344
330
 
@@ -10,7 +10,7 @@ description: Deploy the application after running release checks.
10
10
  invocation-policy: user
11
11
  ---
12
12
 
13
- Deploy $ARGUMENTS.
13
+ Deploy the environment the user names in the invocation.
14
14
  ```
15
15
 
16
16
  | Policy | Meaning | Default |
@@ -22,7 +22,7 @@ Deploy $ARGUMENTS.
22
22
  `plugin build` derives vendor behavior from that policy:
23
23
 
24
24
  - Claude Code uses the same `SKILL.md` and adds its native invocation flag.
25
- - Cursor receives a thin `.cursor/commands/<skill>.md` prompt insert for `user` and `both` skills.
25
+ - Cursor uses the same `SKILL.md` and its native invocation flag; no per-skill command is derived.
26
26
  - Codex uses the skill itself. A user invokes it with `$skill` or `/skills`, so no command is derived. Codex custom prompts are deprecated and home-only, and `plugin build` never writes outside the plugin tree.
27
27
  - Copilot CLI receives no derived command. Its `/skill-name` form is only a prompt hint, not deterministic invocation.
28
28
 
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  // Compiled by `universal-plugin plugin build` from src/skill-scripts/rewrite-upx.ts. Edit the source, not this file.
3
- globalThis.__SKILL_SCRIPT__ = {"package":"universal-plugin","bin":"universal-plugin","version":"0.16.3","entry":"skills/adopt-upx/scripts/rewrite-upx.mjs","commands":{"marketplace add":"skills/marketplace/scripts/add.mjs","marketplace init":"skills/marketplace/scripts/marketplace.mjs","marketplace validate":"skills/marketplace/scripts/validate.mjs","plugin build":"skills/build-plugin/scripts/build.mjs","plugin init":"skills/init-universal-plugin/scripts/init.mjs","plugin version":"skills/version/scripts/version.mjs"}};
3
+ globalThis.__SKILL_SCRIPT__ = {"package":"universal-plugin","bin":"universal-plugin","version":"0.17.1","entry":"skills/adopt-upx/scripts/rewrite-upx.mjs","commands":{"marketplace add":"skills/marketplace/scripts/add.mjs","marketplace init":"skills/marketplace/scripts/marketplace.mjs","marketplace update":"skills/marketplace/scripts/update.mjs","marketplace validate":"skills/marketplace/scripts/validate.mjs","plugin build":"skills/build-plugin/scripts/build.mjs","plugin init":"skills/init-universal-plugin/scripts/init.mjs","plugin version":"skills/version/scripts/version.mjs"}};
4
4
  import { readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
5
5
  import { join, resolve } from "node:path";
6
6
  //#region src/skill-scripts/rewrite-upx.ts
@@ -47,7 +47,7 @@ node scripts/build.mjs --root <plugin-root>
47
47
 
48
48
  Resolve `scripts/build.mjs` against this skill's own directory. It runs the CLI the project installed
49
49
  (`pnpm exec universal-plugin`), else the CLI pinned to the version this skill shipped with
50
- (`npx universal-plugin@0.16.3`), so it works in a skill that was linked or copied on its own. `--root` defaults to the working directory and
50
+ (`npx universal-plugin@0.17.1`), so it works in a skill that was linked or copied on its own. `--root` defaults to the working directory and
51
51
  must name the directory that holds the canonical `plugin.json`.
52
52
 
53
53
  The command never prompts, so it is safe to run unattended.
@@ -132,8 +132,7 @@ Validation runs before the first write, so a failed build leaves the tree untouc
132
132
  - **Expect a build to pin skill `npx` references or decide a version.** Build derives and copies
133
133
  whatever `plugin.json` carries. Stamping is the release-time `plugin version`, not this step.
134
134
  - **Expect a build to copy governances into skills.** A skill loads a reference through the
135
- `reference` skill in the `cyber-agentkit` plugin; the build does not copy them and has no
136
- `--check` flag.
135
+ `reference` skill in the `cyber-agentkit` plugin; the build does not copy them.
137
136
 
138
137
  ## Related skills
139
138
 
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  // Compiled by `universal-plugin plugin build` from src/skill-scripts/run-cli.ts. Edit the source, not this file.
3
- globalThis.__SKILL_SCRIPT__ = {"package":"universal-plugin","bin":"universal-plugin","version":"0.16.3","entry":"skills/build-plugin/scripts/build.mjs","commands":{"marketplace add":"skills/marketplace/scripts/add.mjs","marketplace init":"skills/marketplace/scripts/marketplace.mjs","marketplace validate":"skills/marketplace/scripts/validate.mjs","plugin build":"skills/build-plugin/scripts/build.mjs","plugin init":"skills/init-universal-plugin/scripts/init.mjs","plugin version":"skills/version/scripts/version.mjs"}};
3
+ globalThis.__SKILL_SCRIPT__ = {"package":"universal-plugin","bin":"universal-plugin","version":"0.17.1","entry":"skills/build-plugin/scripts/build.mjs","commands":{"marketplace add":"skills/marketplace/scripts/add.mjs","marketplace init":"skills/marketplace/scripts/marketplace.mjs","marketplace update":"skills/marketplace/scripts/update.mjs","marketplace validate":"skills/marketplace/scripts/validate.mjs","plugin build":"skills/build-plugin/scripts/build.mjs","plugin init":"skills/init-universal-plugin/scripts/init.mjs","plugin version":"skills/version/scripts/version.mjs"}};
4
4
  import { spawnSync } from "node:child_process";
5
5
  //#region src/compile/scripts.ts
6
6
  /** The global the header assigns the script data to. Framework-neutral: a script's own code, or the
@@ -35,7 +35,7 @@ on purpose, so it folds into that command rather than competing with it.
35
35
  ## Boundaries
36
36
 
37
37
  Diagnoses the plugin a project ships. A repository's own agent wiring — `.agents/skills/`,
38
- `AGENTS.md`, per-harness bridges — is `buddy-agent-harness:doctor`.
38
+ `AGENTS.md`, per-harness bridges — is `buddy-agent-harness:doctor-buddy-agent-harness`.
39
39
 
40
40
  ## References
41
41
 
@@ -143,7 +143,7 @@ user can run, or ask before running it yourself.
143
143
 
144
144
  ## Version drift
145
145
 
146
- A version lives in five places. Two are authored: the canonical `plugin.json`, and the `package.json`
146
+ A version lives in six places. Two are authored: the canonical `plugin.json`, and the `package.json`
147
147
  at the `packagePath` the CLI reports (`config get --key packagePath`), resolved from the plugin root.
148
148
  The rest are stamped from them by `plugin version`: the vendor manifests, this plugin's entry in each
149
149
  repository catalog, the `npx`/`upx <package>@<version>` pins in the skills, and each `mcpServers`
@@ -172,7 +172,7 @@ it does not, offer to add it — ask first, because both are the user's files:
172
172
  semantic-release bot opens.
173
173
 
174
174
  Use the locked `universal-plugin` from the repository's devDependencies when it has one; otherwise
175
- `npx universal-plugin@0.16.3`, pinned. This check matters most where the release tool picks the
175
+ `npx universal-plugin@0.17.1`, pinned. This check matters most where the release tool picks the
176
176
  number, because nothing else runs between that bump and publish.
177
177
 
178
178
  ## Unreleased content
@@ -203,7 +203,7 @@ is meant to ship — content that is still being worked on is not a finding to a
203
203
  directly. Its **components** are a separate question — a `copilot-root-components` finding is a real
204
204
  fault, and `canonical` is only healthy for a plugin that declares none of the moved kinds.
205
205
  - Do not treat repo-private agent configuration (`.claude/skills/`, `.agents/skills/`) as part of the
206
- plugin. Diagnosing a repository's own skill wiring is `buddy-agent-harness:doctor`.
206
+ plugin. Diagnosing a repository's own skill wiring is `buddy-agent-harness:doctor-buddy-agent-harness`.
207
207
 
208
208
  ## Related skills
209
209
 
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  // Compiled by `universal-plugin plugin build` from src/skill-scripts/doctor.ts. Edit the source, not this file.
3
- globalThis.__SKILL_SCRIPT__ = {"package":"universal-plugin","bin":"universal-plugin","version":"0.16.3","entry":"skills/doctor-universal-plugin/scripts/doctor.mjs","commands":{"marketplace add":"skills/marketplace/scripts/add.mjs","marketplace init":"skills/marketplace/scripts/marketplace.mjs","marketplace validate":"skills/marketplace/scripts/validate.mjs","plugin build":"skills/build-plugin/scripts/build.mjs","plugin init":"skills/init-universal-plugin/scripts/init.mjs","plugin version":"skills/version/scripts/version.mjs"}};
3
+ globalThis.__SKILL_SCRIPT__ = {"package":"universal-plugin","bin":"universal-plugin","version":"0.17.1","entry":"skills/doctor-universal-plugin/scripts/doctor.mjs","commands":{"marketplace add":"skills/marketplace/scripts/add.mjs","marketplace init":"skills/marketplace/scripts/marketplace.mjs","marketplace update":"skills/marketplace/scripts/update.mjs","marketplace validate":"skills/marketplace/scripts/validate.mjs","plugin build":"skills/build-plugin/scripts/build.mjs","plugin init":"skills/init-universal-plugin/scripts/init.mjs","plugin version":"skills/version/scripts/version.mjs"}};
4
4
  import { spawnSync } from "node:child_process";
5
5
  import * as fs from "node:fs";
6
6
  import * as path from "node:path";
@@ -47,7 +47,7 @@ hold everywhere belongs in the Markdown body. See `references/frontmatter.md`, w
47
47
  ## Boundaries
48
48
 
49
49
  Plugin authoring only. Setting a repository up to *consume* skills — `AGENTS.md`, the
50
- `.agents/skills/` layout, per-harness bridges — is `buddy-agent-harness:init`. This skill does not
50
+ `.agents/skills/` layout, per-harness bridges — is `buddy-agent-harness:init-buddy-agent-harness`. This skill does not
51
51
  touch CI, repository settings, or unrelated project files.
52
52
 
53
53
  ## References
@@ -34,7 +34,7 @@ runtime you are enabling, and only those.
34
34
 
35
35
  This skill owns the **authoring** side: the plugin a project ships. Setting a repository up to
36
36
  *consume* skills — the `.agents/skills/` layout, `AGENTS.md`, per-harness bridges — is
37
- `buddy-agent-harness:init`, not this.
37
+ `buddy-agent-harness:init-buddy-agent-harness`, not this.
38
38
 
39
39
  ## Prerequisites
40
40
 
@@ -240,7 +240,7 @@ This skill is not a formatter. If the project has one, run it over the written f
240
240
  | Publish a packaged plugin to the marketplace | `publish-plugin` |
241
241
  | Bump the pinned `universal-plugin@<version>` the project *calls* (not the plugin's own version) | `upgrade-plugin` |
242
242
  | Rewrite `npx` pins to the `upx` runner | `adopt-upx` |
243
- | Set a repository up to *consume* skills (`AGENTS.md`, `.agents/skills/`) | `buddy-agent-harness:init` |
243
+ | Set a repository up to *consume* skills (`AGENTS.md`, `.agents/skills/`) | `buddy-agent-harness:init-buddy-agent-harness` |
244
244
 
245
245
  ## References
246
246
 
@@ -34,7 +34,7 @@ entry in both `vendors` and `harnesses` under
34
34
 
35
35
  Infer from context; ask only if ambiguous. [`standard.md`](./standard.md) has the component table and
36
36
  the layout they go in; the `plugin-design` reference decides which component a given need calls
37
- for. The universal minimum is `skills/<name>/SKILL.md` plus `.mcp.json`.
37
+ for. The universal minimum is `skills/<name>/SKILL.md` plus `mcp.json`.
38
38
 
39
39
  ## Step 4 — Scaffold
40
40
 
@@ -43,7 +43,7 @@ node scripts/init.mjs --name <plugin-name> --vendor claude-code --vendor cursor
43
43
  ```
44
44
 
45
45
  Resolve `scripts/init.mjs` against this skill's directory; it runs the project's installed CLI, else
46
- the pinned `npx universal-plugin@0.16.3`. Add `--npm` when an npm package ships the plugin,
46
+ the pinned `npx universal-plugin@0.17.1`. Add `--npm` when an npm package ships the plugin,
47
47
  which also wires that `package.json`'s `files` to carry the derived manifests, copies its `version`
48
48
  into the manifest, and, in a changesets repository, wires the root `version` script to run
49
49
  `plugin version --from-package` (SKILL.md Phase 3 asks before that rewrite).
@@ -83,10 +83,10 @@ delivery path at all.
83
83
  Run the mechanical validator from the aced **improve-skill** skill:
84
84
 
85
85
  ```bash
86
- node "<path to aced improve-skill>/scripts/validate.mts" --path skills/<skill-name>
86
+ node "<path to aced improve-skill>/scripts/validate.mjs" --path skills/<skill-name>
87
87
  ```
88
88
 
89
- Fix every CRITICAL finding, then invoke the **audit-skill** skill for the full review.
89
+ Fix every CRITICAL finding, then invoke the `aced:improve-skill` skill for the full review.
90
90
  [`frontmatter.md`](./frontmatter.md) covers what has to hold across runtimes.
91
91
 
92
92
  ## Step 7 — Build
@@ -98,8 +98,8 @@ npx universal-plugin plugin build
98
98
  Useful flags: `--dry-run` to see the plan, `--verbose` for field-by-field decisions, `--vendor <id>`
99
99
  for one target, `--clean` to delete derived manifests first.
100
100
 
101
- Read the warnings. An unknown vendor id, an undeliverable Copilot override, and a failed Codex prompt
102
- write all surface there rather than as errors.
101
+ Read the warnings. An unknown vendor id and an undeliverable Copilot override both surface there
102
+ rather than as errors.
103
103
 
104
104
  ## Step 8 — Install locally to test
105
105
 
@@ -113,7 +113,7 @@ restart for Claude Code, **Developer: Reload Window** for Cursor. `--list` shows
113
113
  without writing; `--vendor <id>` narrows it; `plugin uninstall` removes it again.
114
114
 
115
115
  Codex and Copilot CLI scan no local plugin directory, so they report as `unsupported`. Reach those
116
- through a repository-local marketplace — `publish-plugin`.
116
+ through a repository-local marketplace — `marketplace`.
117
117
 
118
118
  Do not hand-write a symlink for this. The recipe that circulated for it named
119
119
  `~/.claude/plugins/local/`, which does not exist, and a symlink into Cursor's local directory is
@@ -40,7 +40,7 @@ Only a skill the project *distributes* belongs to a plugin.
40
40
  | `.claude/skills/`, `.agents/skills/`, `.cursor/rules/` | **No** — repo-private tooling |
41
41
 
42
42
  If the only skills are in private locations, say nothing about adoption. A repository that configures
43
- its own agents is not a plugin waiting to happen; `buddy-agent-harness:init` is the skill for that
43
+ its own agents is not a plugin waiting to happen; `buddy-agent-harness:init-buddy-agent-harness` is the skill for that
44
44
  side of the line.
45
45
 
46
46
  ## Making the adoption offer
@@ -30,7 +30,7 @@ universal-plugin reads `invocation-policy` from each `SKILL.md` and projects it
30
30
  | --- | --- | --- |
31
31
  | `both` (default) | user- and model-invocable | nothing |
32
32
  | `user` | explicit invocation only | writes `disable-model-invocation: true` into the skill's frontmatter |
33
- | `model` | model-invocable only, not user-facing | writes `user-invocable: false`, and emits no Codex prompt |
33
+ | `model` | model-invocable only, not user-facing | writes `user-invocable: false` |
34
34
 
35
35
  Two consequences worth knowing before you run a build:
36
36
 
@@ -58,7 +58,7 @@ what each build gets. A vendor listed in `vendors` with no `harnesses` entry sti
58
58
  ├── agents/<name>.md
59
59
  ├── rules/<name>.mdc (Cursor-only guidance)
60
60
  ├── hooks/hooks.json
61
- ├── .mcp.json
61
+ ├── mcp.json
62
62
  └── README.md
63
63
  ```
64
64
 
@@ -70,7 +70,7 @@ directories. Create the rest only when the plugin has content for them.
70
70
  | Component | Field | Directory | Reaches |
71
71
  |-----------|-------|-----------|---------|
72
72
  | Skills | `skills` | `skills/<name>/SKILL.md` | every vendor |
73
- | MCP servers | `mcpServers` | `.mcp.json` | every vendor |
73
+ | MCP servers | `mcpServers` | `mcp.json` | every vendor |
74
74
  | Commands | `commands` | `commands/<name>.md` | Claude Code, Cursor, Copilot CLI |
75
75
  | Agents | `agents` | `agents/<name>.md` | Claude Code, Cursor, Copilot CLI |
76
76
  | Hooks | `hooks` | `hooks/hooks.json` | every vendor — authored PascalCase, translated per vendor by the build; handler types vary |
@@ -79,7 +79,7 @@ directories. Create the rest only when the plugin has content for them.
79
79
  | Output styles | `outputStyles` | `output-styles/` | Claude Code only |
80
80
 
81
81
  The universal minimum — reaching every runtime with no vendor manifest at all — is
82
- `skills/<name>/SKILL.md` plus `.mcp.json`. Reach for a narrower component only when the plugin needs
82
+ `skills/<name>/SKILL.md` plus `mcp.json`. Reach for a narrower component only when the plugin needs
83
83
  what only that component does; the `plugin-design` reference is the authority on that choice.
84
84
 
85
85
  ## Constraints
@@ -83,6 +83,9 @@ Do not build a delivery path for these into the plugin manifest. There is nothin
83
83
 
84
84
  ### Still open
85
85
 
86
+ Open as of the 1.0.83 runtime examined above. Re-check against the current release before relying
87
+ on any of these.
88
+
86
89
  - **Where the `unknown field (ignored)` warning surfaces.** It exists in the binary but reached no
87
90
  output on `plugin install`, `plugin list`, or `plugins list`. Likely the interactive dashboard or
88
91
  the session config-problems channel.
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  // Compiled by `universal-plugin plugin build` from src/skill-scripts/run-cli.ts. Edit the source, not this file.
3
- globalThis.__SKILL_SCRIPT__ = {"package":"universal-plugin","bin":"universal-plugin","version":"0.16.3","entry":"skills/init-universal-plugin/scripts/init.mjs","commands":{"marketplace add":"skills/marketplace/scripts/add.mjs","marketplace init":"skills/marketplace/scripts/marketplace.mjs","marketplace validate":"skills/marketplace/scripts/validate.mjs","plugin build":"skills/build-plugin/scripts/build.mjs","plugin init":"skills/init-universal-plugin/scripts/init.mjs","plugin version":"skills/version/scripts/version.mjs"}};
3
+ globalThis.__SKILL_SCRIPT__ = {"package":"universal-plugin","bin":"universal-plugin","version":"0.17.1","entry":"skills/init-universal-plugin/scripts/init.mjs","commands":{"marketplace add":"skills/marketplace/scripts/add.mjs","marketplace init":"skills/marketplace/scripts/marketplace.mjs","marketplace update":"skills/marketplace/scripts/update.mjs","marketplace validate":"skills/marketplace/scripts/validate.mjs","plugin build":"skills/build-plugin/scripts/build.mjs","plugin init":"skills/init-universal-plugin/scripts/init.mjs","plugin version":"skills/version/scripts/version.mjs"}};
4
4
  import { spawnSync } from "node:child_process";
5
5
  //#region src/compile/scripts.ts
6
6
  /** The global the header assigns the script data to. Framework-neutral: a script's own code, or the
@@ -3,7 +3,7 @@
3
3
  Run a repository's own plugin marketplace: generate the catalogs the runtimes read, list plugins
4
4
  that live elsewhere, and check that what is on disk is what each runtime will load.
5
5
 
6
- ## A gateway over three routes
6
+ ## A gateway over four routes
7
7
 
8
8
  `SKILL.md` holds no procedure. It classifies the request and loads one reference:
9
9
 
@@ -11,7 +11,8 @@ that live elsewhere, and check that what is on disk is what each runtime will lo
11
11
  | --- | --- | --- |
12
12
  | `init` | The repository holds the plugins. Derive a catalog from `plugins/`, then offer the README install section. | `references/init.md` |
13
13
  | `add` | The plugin lives elsewhere — an npm package, a GitHub repo, or `<plugin>@<marketplace>`. | `references/add.md` |
14
- | `validate` | Check the catalogs against the schema each runtime loads. Both other routes end here. | `references/validate.md` |
14
+ | `update` | An entry is already listed. Change its source, a pin, or one field, and keep the rest. | `references/update.md` |
15
+ | `validate` | Check the catalogs against the schema each runtime loads. Every other route ends here. | `references/validate.md` |
15
16
 
16
17
  The split exists because the two writing routes answer different questions and share almost no
17
18
  steps. A single document had to hedge every instruction with "unless the plugin is not in this
@@ -22,6 +23,11 @@ discovery could never have produced them — and keeps a non-local source on a p
22
23
  discover, so a plugin shipped through npm is not rewritten to a repository path holding gitignored
23
24
  build output.
24
25
 
26
+ `update` exists because the other writing routes cannot change one entry safely. `add --force`
27
+ replaces the entry with what `add` derives and drops what it cannot, such as `category` and
28
+ `author`, and the skill forbids patching a catalog by hand. `update` changes only the fields it is
29
+ given and validates every catalog before it writes.
30
+
25
31
  ## Support is uneven, and the skill says so
26
32
 
27
33
  | Runtime | Reality |
@@ -62,5 +68,6 @@ document.
62
68
  - [Research: local marketplaces](https://github.com/cyberuni/universal-plugin/blob/main/.research/local-marketplaces/conclusion.md)
63
69
  - [`marketplace add` spec](https://github.com/cyberuni/universal-plugin/blob/main/packages/universal-plugin/.agents/spec/marketplace/add/README.md)
64
70
  - [`marketplace init` spec](https://github.com/cyberuni/universal-plugin/blob/main/packages/universal-plugin/.agents/spec/marketplace/init/README.md)
71
+ - [`marketplace update` spec](https://github.com/cyberuni/universal-plugin/blob/main/packages/universal-plugin/.agents/spec/marketplace/update/README.md)
65
72
  - [`marketplace validate` spec](https://github.com/cyberuni/universal-plugin/blob/main/packages/universal-plugin/.agents/spec/marketplace/validate/README.md)
66
73
  - [Official Claude Code marketplace schema](https://json.schemastore.org/claude-code-marketplace.json)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: marketplace
3
- description: Use this skill to run a repository's own plugin marketplace — generate the catalogs Claude Code, Codex, GitHub Copilot CLI, and Cursor read, list a plugin that lives elsewhere (an npm package, a GitHub repo, or `<plugin>@<marketplace>`), check every catalog against the schema its runtime loads, and write the README install section. Trigger on "set up a local marketplace", "let users install this from my repo", "generate marketplace catalogs", "add a plugin to the marketplace", "list this npm package in my marketplace", "make this repo installable", "add install instructions to the README", or "check my marketplace catalogs".
4
- argument-hint: '[init|add|validate] [--claude] [--codex] [--copilot] [--cursor] [--dry-run] [--force]'
3
+ description: Use this skill to run a repository's own plugin marketplace — generate the catalogs Claude Code, Codex, GitHub Copilot CLI, and Cursor read, list a plugin that lives elsewhere (an npm package, a GitHub repo, or `<plugin>@<marketplace>`), change one listed entry in place, check every catalog against the schema its runtime loads, and write the README install section. Trigger on "set up a local marketplace", "let users install this from my repo", "generate marketplace catalogs", "add a plugin to the marketplace", "list this npm package in my marketplace", "switch this entry to a url source", "bump the ref on this entry", "change the category of a marketplace entry", "make this repo installable", "add install instructions to the README", or "check my marketplace catalogs".
4
+ argument-hint: '[init|add|update|validate] [--claude] [--codex] [--copilot] [--cursor] [--dry-run] [--force]'
5
5
  ---
6
6
 
7
7
  # marketplace
@@ -18,23 +18,26 @@ route names. Read only the one you need.
18
18
  | --- | --- | --- |
19
19
  | `init` | The repository **holds** the plugins. Derive a catalog from what is on disk, then offer the README install section. | `references/init.md` |
20
20
  | `add` | The plugin **lives elsewhere** — an npm package, a GitHub repository, or an entry another marketplace already publishes. | `references/add.md` |
21
+ | `update` | An entry is **already listed** and needs a new source, a moved pin, or one field changed. Keeps every other field. | `references/update.md` |
21
22
  | `validate` | Check the catalogs the repository already carries against the schema each runtime loads. | `references/validate.md` |
22
23
 
23
24
  `init` and `add` are not alternatives. One repository can be both a plugin's home and a curated
24
25
  list, and the two commands compose: a regeneration keeps the entries `add` wrote, because discovery
25
26
  could never have produced them.
26
27
 
27
- Both routes end in `validate`. A catalog the runtime rejects is worse than no catalog — it is found,
28
+ All three writing routes end in `validate`. A catalog the runtime rejects is worse than no catalog — it is found,
28
29
  read, and refused at install time, in someone else's terminal.
29
30
 
30
31
  ## Intake
31
32
 
32
33
  **Name the route and go.** "Set up a local marketplace", "make this repo installable", "generate the
33
- catalogs" → `init`. "Add repobuddy to the marketplace", "list this npm package" → `add`. "Check the
34
- catalogs" → `validate`. Load that reference and follow it; do not ask.
34
+ catalogs" → `init`. "Add repobuddy to the marketplace", "list this npm package" → `add`. "Switch
35
+ aced to a url source", "bump the ref", "change its category" → `update`. "Check the catalogs" →
36
+ `validate`. Load that reference and follow it; do not ask.
35
37
 
36
38
  **Ask only when the invocation is bare.** One question: does the repository hold the plugins it is
37
- listing, or is it listing plugins that live somewhere else? Offer `init`, `add`, and `validate`.
39
+ listing, or is it listing plugins that live somewhere else? Offer `init`, `add`, `update`, and
40
+ `validate`.
38
41
 
39
42
  Discovery settles the question faster than the user can:
40
43
 
@@ -44,7 +47,7 @@ ls .claude-plugin/marketplace.json .agents/plugins/marketplace.json 2>/dev/null
44
47
  ```
45
48
 
46
49
  Plugins under `plugins/` and no catalog yet is `init`. A catalog already there and nothing new on
47
- disk is usually `add`.
50
+ disk is usually `add`, or `update` when the user names an entry the catalog already lists.
48
51
 
49
52
  ## Where each runtime looks
50
53
 
@@ -69,7 +72,8 @@ their own catalog before the Claude one, which shields them. State per runtime w
69
72
  is worse than no install section, and that file is the only source of them. Widely-copied README
70
73
  snippets are not sources. The trap that lives there: Codex installs with `plugin add` where
71
74
  Copilot CLI uses `plugin install`.
72
- - **Never hand-author or hand-patch a catalog.** Generate it, then validate it. A catalog written by
75
+ - **Never hand-author or hand-patch a catalog.** Generate it, then validate it. To change an entry
76
+ that is already listed, use `update`, not `add --force`, which drops the fields it cannot derive. A catalog written by
73
77
  copying fields out of `package.json` carries `owner` as a string and `repository` as an object,
74
78
  and Claude Code refuses it for either one.
75
79
  - **Name every catalog `marketplace.json`.** Codex discovers a catalog by that filename inside a
@@ -81,8 +85,8 @@ their own catalog before the Claude one, which shields them. State per runtime w
81
85
  have published will not understand why nobody can install.
82
86
  - **Ask before editing the README**, and before `--force` replaces anything a user may have written
83
87
  by hand.
84
- - Listing a plugin in the shared `cyberuni/cyberplace` repository is a different job: use
85
- `publish-plugin`.
88
+ - Listing a plugin in the shared `cyberuni/cyberplace` repository, or changing its entry there, is a
89
+ different job: use `publish-plugin`.
86
90
 
87
91
  ## Related skills
88
92
 
@@ -97,6 +101,7 @@ their own catalog before the Claude one, which shields them. State per runtime w
97
101
 
98
102
  - `references/init.md` — derive the catalogs from the plugins this repository holds
99
103
  - `references/add.md` — list a plugin that lives elsewhere
104
+ - `references/update.md` — change one listed entry in place
100
105
  - `references/validate.md` — check the catalogs against the schema each runtime loads
101
106
  - `references/runtimes.md` — per-runtime install commands and their sources
102
107
  - [Research conclusion](https://github.com/cyberuni/universal-plugin/blob/main/.research/local-marketplaces/conclusion.md)
@@ -107,7 +107,9 @@ fallback. Run `--dry-run` first and show the plan, including the skips. The comm
107
107
  | `skipped` | that runtime cannot resolve this source; the reason says which |
108
108
 
109
109
  An entry already listed **differently** stops the run and asks for `--force`. Read what would change
110
- before passing it: someone wrote that entry, and `--force` is what discards their version.
110
+ before passing it: someone wrote that entry, and `--force` is what discards their version. To change
111
+ a listed entry rather than replace it, use `update` (`references/update.md`), which keeps every field
112
+ it is not asked about.
111
113
 
112
114
  The catalog is created if the repository has none, named and owned the same way `init` names it —
113
115
  from the root `plugin.json` author, with `--marketplace-name` and `--owner` to override. A