universal-plugin 0.3.1 → 0.4.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.
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/LICENSE +21 -0
  5. package/dist/cli.mjs +76 -134
  6. package/package.json +3 -1
  7. package/plugin.json +1 -1
  8. package/readme.md +73 -42
  9. package/skills/doctor/README.md +42 -0
  10. package/skills/doctor/SKILL.md +123 -0
  11. package/skills/doctor/scripts/doctor.mjs +196 -0
  12. package/skills/init/README.md +57 -0
  13. package/skills/init/SKILL.md +200 -0
  14. package/skills/{plugin → init}/references/adopt.md +8 -4
  15. package/skills/init/references/create.md +111 -0
  16. package/skills/init/references/detection.md +62 -0
  17. package/skills/init/references/frontmatter.md +65 -0
  18. package/skills/init/references/standard.md +92 -0
  19. package/skills/init/references/update.md +31 -0
  20. package/skills/init/references/vendors/claude-code.md +44 -0
  21. package/skills/init/references/vendors/codex.md +48 -0
  22. package/skills/init/references/vendors/copilot-cli.md +45 -0
  23. package/skills/init/references/vendors/cursor.md +45 -0
  24. package/skills/init/scripts/init.mjs +11 -0
  25. package/skills/remove-plugin/README.md +38 -0
  26. package/skills/remove-plugin/SKILL.md +87 -0
  27. package/skills/version/README.md +36 -0
  28. package/skills/{plugin/references/version.md → version/SKILL.md} +26 -5
  29. package/skills/version/scripts/version.mjs +11 -0
  30. package/skills/plugin/README.md +0 -37
  31. package/skills/plugin/SKILL.md +0 -105
  32. package/skills/plugin/references/create.md +0 -163
  33. package/skills/plugin/references/delete.md +0 -23
  34. package/skills/plugin/references/inspect.md +0 -21
  35. package/skills/plugin/references/update.md +0 -26
  36. /package/skills/{plugin → init}/assets/templates/agent.md +0 -0
  37. /package/skills/{plugin → init}/assets/templates/command.md +0 -0
  38. /package/skills/{plugin → init}/assets/templates/hooks.json +0 -0
  39. /package/skills/{plugin → init}/assets/templates/plugin.json +0 -0
  40. /package/skills/{plugin → init}/assets/templates/setup-command.md +0 -0
  41. /package/skills/{plugin → init}/assets/templates/skill.md +0 -0
@@ -0,0 +1,87 @@
1
+ ---
2
+ name: remove-plugin
3
+ description: Use this skill to remove a universal agent plugin's artifacts — delete the generated vendor manifests for Claude Code, Cursor, or Codex, clear a stale or shadowing manifest left by an older build, or take the whole plugin out of a project. Trigger on "delete the generated manifests", "remove the vendor manifests", "clean the plugin build output", "drop Codex support", "get rid of this plugin", or "stop shipping this plugin".
4
+ ---
5
+
6
+ # Remove a plugin's artifacts
7
+
8
+ Three different removals live here, and they are not equally reversible. Establish which one is
9
+ being asked for before deleting anything.
10
+
11
+ | Ask | What it removes | Reversible by |
12
+ | --- | --- | --- |
13
+ | clean the build output | derived vendor manifests | `plugin build` |
14
+ | drop a vendor | one vendor's manifest, and its declaration | re-adding the vendor, then `plugin build` |
15
+ | remove the plugin | the canonical manifest and every component | nothing — confirm first |
16
+
17
+ ## Clean the build output
18
+
19
+ Derived manifests are build artifacts. The build removes and rewrites them itself:
20
+
21
+ ```bash
22
+ npx universal-plugin plugin build --clean
23
+ ```
24
+
25
+ `--clean` deletes exactly what the manifest declares and nothing it does not, which is why it is the
26
+ supported route. To remove a derived manifest without rebuilding, delete that one path with the
27
+ user's own file tooling — `.claude-plugin/plugin.json`, `.cursor-plugin/plugin.json`, or
28
+ `.codex-plugin/plugin.json`. Name the path you are deleting before you delete it, and never widen
29
+ the deletion to the directory.
30
+
31
+ > **Never delete root `plugin.json`.** It is the canonical source of truth *and* the manifest
32
+ > Copilot CLI reads, so removing it takes out both the source and a live target at once.
33
+ > `copilot-cli` has no generated manifest to clean — nothing to delete is the correct state for it.
34
+
35
+ ## Clear a stale or shadowing manifest
36
+
37
+ Two paths are worth checking whenever a plugin behaves as though it were an older version of itself:
38
+
39
+ - `.github/plugin/plugin.json` — written by older builds. It sits below root in Copilot CLI's search
40
+ order, so it was never read, and it is no longer generated. Safe to delete.
41
+ - `.plugin/plugin.json` — this one **outranks** root in that search order. If it exists, Copilot CLI
42
+ is reading it instead of the canonical manifest, and nothing regenerates it. Delete it, then
43
+ rebuild and confirm Copilot CLI picks up root.
44
+
45
+ Copilot CLI's search order is `.plugin/plugin.json` → `plugin.json` → `.github/plugin/plugin.json` →
46
+ `.claude-plugin/plugin.json`, first match wins.
47
+
48
+ ## Drop a vendor
49
+
50
+ Removing a vendor is a manifest edit first and a deletion second — deleting only the file leaves the
51
+ vendor declared, and the next build writes it straight back. That edit belongs to
52
+ `/universal-plugin:init`'s update route; come back here for the file.
53
+
54
+ ## Remove the whole plugin
55
+
56
+ Irreversible. Confirm with the user before proceeding, and say specifically what goes:
57
+
58
+ - root `plugin.json`
59
+ - every derived manifest
60
+ - the component directories the manifest names (`skills/`, `commands/`, `agents/`, `hooks/`, …) —
61
+ these hold authored content, not build output, so name them individually and get agreement on each
62
+
63
+ If the package's `package.json` `files` array was wired to ship the plugin (`plugin init --npm`),
64
+ that entry is now dead weight; remove it in the same change.
65
+
66
+ If the plugin was published, deleting the source does not unpublish it. Say so — consumers keep
67
+ resolving the last published version until it is deprecated at the registry, which is not something
68
+ this skill does.
69
+
70
+ ## Rules
71
+
72
+ - **Confirm before any irreversible delete.** Cleaning build output is not irreversible; removing
73
+ authored components is.
74
+ - **Never delete root `plugin.json` as cleanup.** Only as a deliberate, confirmed removal of the
75
+ whole plugin.
76
+ - Prefer `plugin build --clean` over `rm` — it removes exactly what the manifest declares, and
77
+ nothing it does not.
78
+ - A vendor left declared in `plugin.json` comes back on the next build. Edit the manifest, or the
79
+ deletion is temporary.
80
+
81
+ ## Related skills
82
+
83
+ | Task | Skill |
84
+ |------|-------|
85
+ | Remove a vendor from what the plugin declares | `init`, update route |
86
+ | Confirm what is stale, shadowing, or unbuilt before deleting | `doctor` |
87
+ | Take a published plugin out of a marketplace listing | `publish-plugin` |
@@ -0,0 +1,36 @@
1
+ # version skill
2
+
3
+ Move the version a plugin releases under, keeping every file that carries one in sync.
4
+
5
+ ## The two authored numbers
6
+
7
+ A plugin's version appears in up to five places; only two are authored — the canonical `plugin.json`
8
+ and, when `packagePath` is declared, that `package.json`. The vendor manifests, the local marketplace
9
+ catalogs, and the `npx`/`upx` pins inside `skills/**/SKILL.md` are all derived.
10
+
11
+ That is why nothing here is hand-edited: editing one authored file leaves the other stale, and every
12
+ derived artifact with it. A consumer's plugin cache is keyed by version, so a content change without
13
+ a matching bump is invisible to them.
14
+
15
+ ## Two release models
16
+
17
+ The first question the skill asks is whether the repository uses changesets.
18
+
19
+ - **With changesets** — the number is decided by the release, not by this skill. Add a changeset, let
20
+ the release run, and `publish sync-version` carries the released number into the canonical
21
+ manifest.
22
+ - **Without** — `plugin version <bump>` is the whole step. `scripts/version.mjs` runs it from the CLI
23
+ shipped beside the skill, so nothing is downloaded.
24
+
25
+ Running `plugin version` in a changesets repository would decide a number changesets is about to
26
+ decide again. The skill checks for `.changeset/` before anything else.
27
+
28
+ ## The part that is not automatable
29
+
30
+ Which release type to use is a promise to consumers about what broke. The skill offers the semver
31
+ reading — breaking → major, new behavior → minor, fix only → patch, adjusted for `0.x` — and asks
32
+ rather than guessing.
33
+
34
+ ## References
35
+
36
+ - [`plugin version` spec](https://github.com/cyberuni/universal-plugin/blob/main/packages/universal-plugin/.agents/spec/plugin/version/README.md)
@@ -1,4 +1,9 @@
1
- # Move a universal plugin's version
1
+ ---
2
+ name: version
3
+ description: Use this skill to move a universal agent plugin's version — bump it, set an explicit one, cut a release number, or reconcile a version that drifted between the canonical plugin.json and its npm package.json. Handles both release models: a changesets repository, where the number is decided by the release and carried in with publish sync-version, and a plain repository, where plugin version does the whole move. Trigger on "bump the plugin version", "release a new version of this plugin", "set the plugin version to 1.0.0", "cut a patch release", or "the manifest and package.json versions disagree".
4
+ ---
5
+
6
+ # Move a plugin's version
2
7
 
3
8
  Bump or set the version a plugin releases under, keeping every file that carries one in sync.
4
9
 
@@ -31,9 +36,13 @@ to decide again.
31
36
  ## Step 1 — Move the version
32
37
 
33
38
  ```bash
34
- npx universal-plugin plugin version <bump>
39
+ node scripts/version.mjs <bump>
35
40
  ```
36
41
 
42
+ Resolve that path against this skill's own directory; it runs the CLI that shipped beside it, so
43
+ nothing is downloaded. `npx universal-plugin plugin version <bump>` is the fallback. The command
44
+ never prompts, so it is safe to run unattended once the release type is decided.
45
+
37
46
  `<bump>` is either a semver release type or an explicit version:
38
47
 
39
48
  | `<bump>` | From `1.2.3` you get |
@@ -66,9 +75,12 @@ manifest, the `packagePath` `package.json` if one is declared, and one derived m
66
75
  harness:
67
76
 
68
77
  ```bash
69
- npx universal-plugin plugin version patch --format json
78
+ node scripts/version.mjs patch --format json
70
79
  ```
71
80
 
81
+ Default stdout is TOON, which is the machine contract this CLI documents; `--format json` is there
82
+ for non-LLM consumers. Either way, read the reported files rather than re-deriving what moved.
83
+
72
84
  If the plugin declares no harnesses, only the authored files are written — that is correct, not a
73
85
  failure.
74
86
 
@@ -78,7 +90,7 @@ Every guard resolves before the first write, so a failed run leaves the tree unt
78
90
 
79
91
  | Message names | What it means | Do this |
80
92
  |---|---|---|
81
- | a missing `plugin.json` | not at a plugin root, or the plugin was never scaffolded | `cd` to the plugin root, or see [`create.md`](./create.md) |
93
+ | a missing `plugin.json` | not at a plugin root, or the plugin was never scaffolded | `cd` to the plugin root, or run `/universal-plugin:init` |
82
94
  | no version to bump from | the manifest has never carried a `version` | pass an explicit version (`plugin version 0.1.0`) to set the first one |
83
95
  | an unknown version or release type | the argument is neither a release type nor valid semver | use one of the values in the table above |
84
96
  | a target that does not advance | the requested version is not greater than the current one | pick a higher version, or pass `--force` if the user genuinely wants to move backward |
@@ -92,6 +104,15 @@ Every guard resolves before the first write, so a failed run leaves the tree unt
92
104
  - **Run `npm version`.** It knows only `package.json` and leaves the canonical manifest — the actual
93
105
  source of truth — stale.
94
106
 
107
+ ## Related skills
108
+
109
+ | Task | Skill |
110
+ |------|-------|
111
+ | Create, adopt, or change what the plugin declares | `init` |
112
+ | Check whether the two authored versions agree | `doctor` |
113
+ | Add a changeset for the change being released | `add-changeset` |
114
+ | List the released plugin in a marketplace | `publish-plugin` |
115
+
95
116
  ## References
96
117
 
97
- - Spec: https://github.com/cyberuni/universal-plugin/blob/main/packages/universal-plugin/.agents/spec/plugin/version/README.md
118
+ - Spec: [`plugin/version/`](https://github.com/cyberuni/universal-plugin/blob/main/packages/universal-plugin/.agents/spec/plugin/version/README.md)
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ // Runs `universal-plugin plugin version` from the CLI that ships beside this skill, so a release
3
+ // number never depends on a network fetch or on which version `npx` happens to resolve.
4
+ import { dirname, join } from 'node:path'
5
+ import { fileURLToPath } from 'node:url'
6
+
7
+ // <package>/skills/<skill>/scripts/version.mjs: four levels up is the package root.
8
+ const packageRoot = dirname(dirname(dirname(dirname(fileURLToPath(import.meta.url)))))
9
+
10
+ process.argv.splice(2, 0, 'plugin', 'version')
11
+ await import(join(packageRoot, 'bin', 'universal-plugin.mjs'))
@@ -1,37 +0,0 @@
1
- # plugin skill
2
-
3
- A skill for creating, inspecting, updating, and deleting universal AI coding agent plugins that target multiple runtimes from a single source of truth.
4
-
5
- ## Supported runtimes
6
-
7
- | Vendor | Manifest path |
8
- | ----------- | ---------------------------- |
9
- | Claude Code | `.claude-plugin/plugin.json` |
10
- | Cursor | `.cursor-plugin/plugin.json` |
11
- | Codex | `.codex-plugin/plugin.json` |
12
- | Copilot CLI | root `plugin.json` (the canonical manifest; nothing derived) |
13
-
14
- Universal minimum (no vendor manifest needed): `skills/<name>/SKILL.md` or `.mcp.json`. The canonical source of truth is root `plugin.json`.
15
-
16
- ## Operations
17
-
18
- `SKILL.md` is a gateway: it detects what the project already contains, then routes to one operation
19
- reference and only that one gets read.
20
-
21
- | Operation | Reference | What it covers |
22
- | --------- | --------- | -------------- |
23
- | Create | [`references/create.md`](./references/create.md) | scaffold a new plugin with chosen vendors and components |
24
- | Adopt | [`references/adopt.md`](./references/adopt.md) | put an existing vendor-specific plugin, or already-shipped skills, onto the open standard |
25
- | Inspect | [`references/inspect.md`](./references/inspect.md) | show build status for each declared vendor |
26
- | Update | [`references/update.md`](./references/update.md) | add/remove vendors or components |
27
- | Delete | [`references/delete.md`](./references/delete.md) | remove generated manifests or the whole plugin |
28
-
29
- On invocation the gateway checks for existing vendor manifests and publicly-shipped skills, and
30
- offers adoption when it finds either without a canonical `plugin.json`. Repo-private agent config
31
- (`.claude/skills/`, `.agents/skills/`) is deliberately excluded — it is not something to package.
32
-
33
- ## References
34
-
35
- - [Spec](https://github.com/cyberuni/universal-plugin/blob/main/packages/universal-plugin/.agents/spec/spec.md)
36
- - [Schema](https://raw.githubusercontent.com/cyberuni/universal-plugin/refs/heads/main/schema/v1.json)
37
- - [Examples](https://github.com/cyberuni/universal-plugin/tree/main/examples)
@@ -1,105 +0,0 @@
1
- ---
2
- name: plugin
3
- description: Use this skill when creating, inspecting, updating, versioning, or deleting a universal agent plugin that targets multiple AI coding agent runtimes — Claude Code, Cursor, Codex, GitHub Copilot CLI. Also use it to convert a vendor-specific plugin, or a project that already ships skills, onto the open Agent Plugins Specification, or to move a plugin's version — for asks like "make my Claude Code plugin work in Cursor", "convert this to the open plugin standard", "turn these skills into a plugin", "bump my plugin's version", "release a new version of this plugin", or "set the plugin version to 1.0.0".
4
- ---
5
-
6
- # Universal Plugin
7
-
8
- Gateway skill. Identify which operation the user wants, load that operation's reference, and follow
9
- it.
10
-
11
- ## When to use
12
-
13
- When the user wants to create, inspect, update, version, or delete a plugin targeting Claude Code,
14
- Cursor, Codex, and/or GitHub Copilot CLI from a single source of truth.
15
-
16
- ## Prerequisites
17
-
18
- Load governance before starting any operation:
19
-
20
- ```bash
21
- npx universal-plugin governance show plugin-design
22
- ```
23
-
24
- Until the CLI is available, read `governances/plugin-design.md` from this plugin's installation
25
- directory. It is the authoritative source for component selection rules and anti-patterns.
26
-
27
- ## Step 0 — Detect what is already here
28
-
29
- Run this before routing. What the project already contains often changes which operation is
30
- actually right — a "create a plugin" request in a repo that already ships skills is an *adopt*, not
31
- a create.
32
-
33
- ```bash
34
- ls -d .claude-plugin .cursor-plugin .codex-plugin .github/plugin .plugin 2>/dev/null
35
- test -f plugin.json && head -20 plugin.json
36
- find . -name SKILL.md -not -path '*/node_modules/*' -not -path './.git/*'
37
- ```
38
-
39
- Read the signals:
40
-
41
- | What you find | What it means | Do this |
42
- |---------------|---------------|---------|
43
- | Root `plugin.json` with `$schema` on `agent-plugins.org` **and** an `extensions` object | Already on the open standard | Nothing to offer — route normally |
44
- | A vendor manifest (`.claude-plugin/`, `.cursor-plugin/`, `.codex-plugin/`, `.github/plugin/`) with **no** canonical root `plugin.json` | A vendor-specific plugin | **Offer to adopt** |
45
- | Root `plugin.json` with no `$schema`/`extensions` | Legacy single-vendor manifest | **Offer to adopt** |
46
- | Public skills (see below) and no plugin manifest at all | Skills shipped without a plugin | **Offer to adopt** |
47
- | None of the above | Greenfield | Route normally |
48
-
49
- ### Which skills count as public
50
-
51
- Only offer on skills the project **distributes**. Repo-local agent configuration is not a plugin,
52
- and offering to package it is wrong.
53
-
54
- | Location | Public? |
55
- |----------|---------|
56
- | `skills/<name>/SKILL.md` at the repo root | Yes |
57
- | `<package>/skills/<name>/SKILL.md` where `package.json` `files` ships it | Yes |
58
- | `.claude/skills/`, `.agents/skills/`, `.cursor/rules/` | **No** — repo-private tooling |
59
-
60
- If the only skills are in private locations, say nothing about adoption.
61
-
62
- ### Making the offer
63
-
64
- State what you found, what adoption would give them, and let them decline:
65
-
66
- > This repo has a Claude Code plugin manifest but no canonical `plugin.json`. I can convert it to
67
- > the open Agent Plugins Specification, which would let one manifest drive Cursor, Codex, and
68
- > Copilot CLI too — Claude Code keeps working exactly as it does now. Want me to?
69
-
70
- Offer once. If the user declines, or their request is already a specific unrelated operation
71
- (deleting manifests, inspecting status), drop it and do what they asked.
72
-
73
- ## Route
74
-
75
- Read exactly the reference for the operation at hand — do not load all six.
76
-
77
- | The user wants to… | Reference |
78
- |--------------------|-----------|
79
- | Scaffold a new plugin, add vendors/components to a fresh one, or build vendor manifests | [`references/create.md`](./references/create.md) |
80
- | Put an existing vendor-specific plugin, or already-shipped skills, onto the open standard | [`references/adopt.md`](./references/adopt.md) |
81
- | See what a plugin declares and which vendor manifests are built or stale | [`references/inspect.md`](./references/inspect.md) |
82
- | Add or remove a vendor, or add or remove a component, on an existing plugin | [`references/update.md`](./references/update.md) |
83
- | Bump or set the plugin's version, or cut a release of it | [`references/version.md`](./references/version.md) |
84
- | Remove generated manifests, or remove the whole plugin | [`references/delete.md`](./references/delete.md) |
85
-
86
- If the request spans more than one operation (for example "add Codex and rebuild"), load each
87
- reference in turn as you reach that part of the work.
88
-
89
- If the operation is unclear, ask which the user means rather than guessing.
90
-
91
- ## Related skills
92
-
93
- | Task | Skill |
94
- |------|-------|
95
- | Move a repo-root plugin into its npm package | `migrate-plugin` |
96
- | Publish a packaged plugin to the marketplace | `publish-plugin` |
97
- | Bump the pinned `universal-plugin@<version>` the project *calls* (not the plugin's own version) | `upgrade-plugin` |
98
- | Rewrite `npx` pins to the `upx` runner | `adopt-upx` |
99
-
100
- ## References
101
-
102
- - Governance: `npx cyberplace governance show plugin-design`
103
- - Spec: https://github.com/cyberuni/universal-plugin/blob/main/packages/universal-plugin/.agents/spec/spec.md
104
- - Schema: https://raw.githubusercontent.com/cyberuni/universal-plugin/refs/heads/main/schema/v1.json
105
- - Examples: https://github.com/cyberuni/universal-plugin/tree/main/examples
@@ -1,163 +0,0 @@
1
- # Create a universal plugin
2
-
3
- Scaffold a new plugin from a single canonical `plugin.json` and build one manifest per chosen
4
- vendor.
5
-
6
- ## Step 1 — Gather plugin identity
7
-
8
- Ask if not provided. All fields map to the canonical root `plugin.json`.
9
-
10
- | Field | Required | Notes |
11
- |-------|----------|-------|
12
- | `name` | Yes | kebab-case, 1–64 chars, `a-z 0-9 - .` only |
13
- | `description` | Recommended | one sentence; Codex requires this |
14
- | `version` | If publishing | semver; Codex requires this |
15
- | `author.name` | Recommended | person or org name |
16
- | `homepage` | Optional | docs or landing page URL |
17
- | `repository` | Optional | source repo URL |
18
- | `license` | Optional | SPDX identifier e.g. `MIT` |
19
- | `keywords` | Optional | discovery tags; array of strings |
20
-
21
- ## Step 2 — Choose vendor targets
22
-
23
- Ask the user which runtimes to support. Each chosen vendor becomes a key in
24
- `extensions["org.cyberuni.universal-plugin"].harnesses` — that is what drives the `build` output.
25
- Add the vendor's id to `extensions["org.cyberuni.universal-plugin"].vendors` too, so `build` knows
26
- to generate its manifest.
27
-
28
- | Vendor ID | Manifest read from | Hook event case | Required fields beyond `name` |
29
- |-----------|--------------------|-----------------|-------------------------------|
30
- | `claude-code` | `.claude-plugin/plugin.json` *(derived)* | PascalCase | none |
31
- | `cursor` | `.cursor-plugin/plugin.json` *(derived)* | camelCase | none |
32
- | `codex` | `.codex-plugin/plugin.json` *(derived)* | PascalCase | `version`, `description` |
33
- | `copilot-cli` | root `plugin.json` — **the canonical manifest itself** | camelCase | none |
34
-
35
- **Copilot CLI derives nothing.** It searches `.plugin/plugin.json` → `plugin.json` →
36
- `.github/plugin/plugin.json` → `.claude-plugin/plugin.json` and takes the *first* match, so root
37
- always wins; and it has read Open Plugin Spec v1 manifests since v1.0.74. `plugin build` reports it
38
- with status `canonical` and writes no file. A `harnesses["copilot-cli"]` override cannot be
39
- delivered — the canonical schema is closed to vendor-only fields — and the build warns if you set
40
- one.
41
-
42
- Universal minimum (no vendor manifest needed): `skills/<name>/SKILL.md` + `.mcp.json`.
43
-
44
- Default to all four if the user is unsure.
45
-
46
- ## Step 3 — Choose components
47
-
48
- Infer from context; ask only if ambiguous. Apply rules from the `plugin-design` governance loaded
49
- in the gateway's Prerequisites.
50
-
51
- | Component | Field | Directory | Cross-vendor? |
52
- |-----------|-------|-----------|--------------|
53
- | Skills | `skills` | `skills/<name>/SKILL.md` | Yes — all |
54
- | Commands | `commands` | `commands/<name>.md` | Claude Code, Cursor, Copilot CLI |
55
- | Agents | `agents` | `agents/<name>.md` | Claude Code, Cursor, Copilot CLI |
56
- | MCP servers | `mcpServers` | `.mcp.json` | Yes — all |
57
- | Hooks | `hooks` | `hooks/hooks.json` | Partial — event names translated on build |
58
- | Rules | `rules` | `rules/<name>.mdc` | Cursor-only |
59
- | LSP servers | `lspServers` | `.lsp.json` | Claude Code, Cursor |
60
- | Output styles | `outputStyles` | `output-styles/` | Claude Code only |
61
-
62
- ## Step 4 — Scaffold files
63
-
64
- Read the templates from `../assets/templates/` and fill in the placeholders:
65
-
66
- | File to create | Template |
67
- |----------------|----------|
68
- | `plugin.json` | `assets/templates/plugin.json` |
69
- | `skills/<name>/SKILL.md` | `assets/templates/skill.md` |
70
- | `commands/<name>.md` | `assets/templates/command.md` |
71
- | `agents/<name>.md` | `assets/templates/agent.md` |
72
- | `hooks/hooks.json` | `assets/templates/hooks.json` |
73
- | `commands/setup.md` (when `rules/` included) | `assets/templates/setup-command.md` |
74
-
75
- Directory layout:
76
-
77
- ```
78
- <plugin-name>/
79
- ├── plugin.json ← canonical definition (source of truth)
80
- ├── skills/<name>/SKILL.md
81
- ├── commands/
82
- ├── agents/
83
- ├── rules/ (only if always-on Cursor guidance requested)
84
- ├── hooks/hooks.json
85
- ├── .mcp.json
86
- └── README.md
87
- ```
88
-
89
- ## Step 5 — Populate extensions["org.cyberuni.universal-plugin"]
90
-
91
- In root `plugin.json`, under `extensions["org.cyberuni.universal-plugin"]`, add the chosen vendors
92
- to `vendors` and add a `harnesses` object with one entry per chosen vendor. An empty `{}` opts into
93
- that vendor's output with no vendor-specific fields.
94
-
95
- ```json
96
- {
97
- "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
98
- "name": "<plugin-name>",
99
- "version": "1.0.0",
100
- "description": "<description>",
101
- "author": { "name": "<author>" },
102
- "extensions": {
103
- "org.cyberuni.universal-plugin": {
104
- "vendors": ["claude-code", "cursor", "codex", "copilot-cli"],
105
- "skills": "./skills/",
106
- "harnesses": {
107
- "claude-code": {},
108
- "cursor": {
109
- "publisher": "<org>",
110
- "category": "<category>",
111
- "tags": ["<tag>"]
112
- },
113
- "codex": {
114
- "interface": {
115
- "displayName": "<Human Name>",
116
- "category": "<category>"
117
- }
118
- },
119
- "copilot-cli": {
120
- "category": "<category>",
121
- "tags": ["<tag>"]
122
- }
123
- }
124
- }
125
- }
126
- }
127
- ```
128
-
129
- See spec §3.3 for the full list of vendor-specific fields:
130
- https://github.com/cyberuni/universal-plugin/blob/main/packages/universal-plugin/.agents/spec/spec.md
131
-
132
- ## Step 6 — Audit skills
133
-
134
- Audit each skill via the aced **improve-skill** skill's mechanical `validate.mts` engine:
135
-
136
- ```bash
137
- node "<path to aced improve-skill>/scripts/validate.mts" --path skills/<skill-name>
138
- ```
139
-
140
- Fix any CRITICAL findings. Then invoke the **audit-skill** skill for full review.
141
-
142
- ## Step 7 — Build vendor manifests
143
-
144
- > **Note:** The `build` CLI is not yet available. Use the manual steps below.
145
-
146
- For each vendor in `extensions["org.cyberuni.universal-plugin"].vendors`:
147
-
148
- 1. Copy canonical fields from root `plugin.json`
149
- 2. Merge vendor-specific fields from `extensions["org.cyberuni.universal-plugin"].harnesses.<vendor>`
150
- 3. Drop fields not supported by that vendor (see spec §6.1)
151
- 4. Translate hook event names (see spec §4.2)
152
- 5. Translate `${PLUGIN_ROOT}` and `${PLUGIN_DATA}` env vars (see spec §5)
153
- 6. Write to the vendor output path (see the Step 2 table)
154
-
155
- See spec §7 for full build rules:
156
- https://github.com/cyberuni/universal-plugin/blob/main/packages/universal-plugin/.agents/spec/spec.md
157
-
158
- ## Step 8 — Install locally for testing
159
-
160
- ```bash
161
- ln -sf "$(pwd)" ~/.claude/plugins/local/<plugin-name> # Claude Code
162
- ln -sf "$(pwd)" ~/.cursor/plugins/local/<plugin-name> # Cursor → Developer: Reload Window
163
- ```
@@ -1,23 +0,0 @@
1
- # Delete a universal plugin
2
-
3
- ## Remove generated manifests only (keep source)
4
-
5
- Delete each vendor's output file. Generated manifests are build artifacts — safe to delete and
6
- regenerate via [`create.md`](./create.md) Step 7.
7
-
8
- ```bash
9
- rm -f .claude-plugin/plugin.json
10
- rm -f .cursor-plugin/plugin.json
11
- rm -f .codex-plugin/plugin.json
12
- ```
13
-
14
- > **Never delete root `plugin.json`.** It is the canonical source of truth, not a build artifact —
15
- > and it is also what Copilot CLI reads, so removing it takes out both the source and the Copilot
16
- > target. `copilot-cli` has no generated manifest to clean.
17
-
18
- If the project has a stale `.github/plugin/plugin.json` from an older build, it is safe to delete —
19
- that path is shadowed by root and is no longer generated.
20
-
21
- ## Remove the whole plugin
22
-
23
- Delete the plugin root directory. Confirm with the user before proceeding — this is irreversible.
@@ -1,21 +0,0 @@
1
- # Inspect a universal plugin
2
-
3
- Show the current state of a plugin.
4
-
5
- 1. Read root `plugin.json` — show `name`, `version`, declared vendors
6
- (`extensions["org.cyberuni.universal-plugin"].vendors`).
7
- 2. For each vendor, check whether the generated manifest exists at its output path.
8
- 3. Report status: which vendors are built, which are missing or stale.
9
-
10
- Example output:
11
-
12
- ```
13
- Plugin: my-plugin v1.0.0
14
- Vendors declared: claude-code, cursor, codex, copilot-cli
15
- claude-code .claude-plugin/plugin.json ✓ present
16
- cursor .cursor-plugin/plugin.json ✓ present
17
- codex .codex-plugin/plugin.json ✗ missing — run build
18
- copilot-cli plugin.json ✗ missing — run build
19
- ```
20
-
21
- Vendor output paths are listed in [`create.md`](./create.md) Step 2.
@@ -1,26 +0,0 @@
1
- # Update a universal plugin
2
-
3
- Change which vendors or components an existing plugin declares. Every path ends with a rebuild —
4
- see [`create.md`](./create.md) Step 7.
5
-
6
- ## Add a vendor
7
-
8
- 1. Add the vendor id to `extensions["org.cyberuni.universal-plugin"].vendors` in root
9
- `plugin.json`, and add its key to `extensions["org.cyberuni.universal-plugin"].harnesses`.
10
- 2. Populate vendor-specific fields (see spec §3.3).
11
- 3. If the vendor requires extra fields (`codex`: `version`, `description`), ensure they are in the
12
- canonical section.
13
- 4. Rebuild for the new vendor.
14
-
15
- ## Remove a vendor
16
-
17
- 1. Remove the vendor id from `extensions["org.cyberuni.universal-plugin"].vendors` and its key from
18
- `harnesses`.
19
- 2. Delete the generated manifest at its output path.
20
-
21
- ## Add or remove a component
22
-
23
- 1. Add/remove the component field under `extensions["org.cyberuni.universal-plugin"]` in root
24
- `plugin.json` (e.g. `"commands": "./commands/"`).
25
- 2. Scaffold or delete the corresponding files.
26
- 3. Rebuild to regenerate all vendor manifests.