universal-plugin 0.3.1 → 0.5.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/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/LICENSE +21 -0
- package/dist/cli.mjs +1262 -375
- package/dist/data/vendors.json +12 -0
- package/dist/run.mjs +4 -4
- package/governances/plugin-design.md +42 -1
- package/package.json +3 -1
- package/plugin.json +1 -1
- package/readme.md +80 -42
- package/skills/doctor/README.md +42 -0
- package/skills/doctor/SKILL.md +144 -0
- package/skills/doctor/scripts/doctor.mjs +273 -0
- package/skills/init/README.md +57 -0
- package/skills/init/SKILL.md +219 -0
- package/skills/{plugin → init}/references/adopt.md +8 -4
- package/skills/init/references/create.md +122 -0
- package/skills/init/references/detection.md +62 -0
- package/skills/init/references/frontmatter.md +65 -0
- package/skills/init/references/standard.md +93 -0
- package/skills/init/references/update.md +31 -0
- package/skills/init/references/vendors/claude-code.md +76 -0
- package/skills/init/references/vendors/codex.md +56 -0
- package/skills/init/references/vendors/copilot-cli.md +53 -0
- package/skills/init/references/vendors/cursor.md +52 -0
- package/skills/init/scripts/init.mjs +11 -0
- package/skills/marketplace/README.md +38 -0
- package/skills/marketplace/SKILL.md +170 -0
- package/skills/marketplace/references/runtimes.md +104 -0
- package/skills/marketplace/scripts/install-docs.mjs +115 -0
- package/skills/marketplace/scripts/marketplace.mjs +11 -0
- package/skills/publish-plugin/SKILL.md +10 -8
- package/skills/publish-plugin/references/vendor-requirements.md +13 -10
- package/skills/remove-plugin/README.md +38 -0
- package/skills/remove-plugin/SKILL.md +87 -0
- package/skills/version/README.md +36 -0
- package/skills/{plugin/references/version.md → version/SKILL.md} +27 -5
- package/skills/version/scripts/version.mjs +11 -0
- package/skills/plugin/README.md +0 -37
- package/skills/plugin/SKILL.md +0 -105
- package/skills/plugin/references/create.md +0 -163
- package/skills/plugin/references/delete.md +0 -23
- package/skills/plugin/references/inspect.md +0 -21
- package/skills/plugin/references/update.md +0 -26
- /package/skills/{plugin → init}/assets/templates/agent.md +0 -0
- /package/skills/{plugin → init}/assets/templates/command.md +0 -0
- /package/skills/{plugin → init}/assets/templates/hooks.json +0 -0
- /package/skills/{plugin → init}/assets/templates/plugin.json +0 -0
- /package/skills/{plugin → init}/assets/templates/setup-command.md +0 -0
- /package/skills/{plugin → init}/assets/templates/skill.md +0 -0
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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,16 @@ 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
|
+
| Refresh the repository's own marketplace catalogs after a bump | `marketplace` |
|
|
115
|
+
| List the released plugin in the shared marketplace | `publish-plugin` |
|
|
116
|
+
|
|
95
117
|
## References
|
|
96
118
|
|
|
97
|
-
- Spec: https://github.com/cyberuni/universal-plugin/blob/main/packages/universal-plugin/.agents/spec/plugin/version/README.md
|
|
119
|
+
- 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'))
|
package/skills/plugin/README.md
DELETED
|
@@ -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)
|
package/skills/plugin/SKILL.md
DELETED
|
@@ -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.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|