universal-plugin 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/.claude-plugin/plugin.json +15 -0
  2. package/.codex-plugin/plugin.json +14 -0
  3. package/.cursor-plugin/plugin.json +14 -0
  4. package/agents/agentskills-specialist.md +132 -0
  5. package/bin/upx.mjs +6 -0
  6. package/dist/cli.mjs +1330 -255
  7. package/dist/run.mjs +271 -0
  8. package/governances/plugin-design.md +22 -17
  9. package/governances/slash-invocation.md +30 -0
  10. package/package.json +14 -5
  11. package/plugin.json +18 -0
  12. package/readme.md +37 -3
  13. package/skills/adopt-upx/README.md +38 -0
  14. package/skills/adopt-upx/SKILL.md +120 -0
  15. package/skills/adopt-upx/scripts/rewrite-upx.mjs +168 -0
  16. package/skills/migrate-plugin/SKILL.md +106 -0
  17. package/skills/migrate-plugin/evals/evals.json +11 -0
  18. package/skills/migrate-plugin/evals/trigger-queries.json +35 -0
  19. package/skills/plugin/README.md +37 -0
  20. package/skills/plugin/SKILL.md +105 -0
  21. package/skills/plugin/assets/templates/agent.md +7 -0
  22. package/skills/plugin/assets/templates/command.md +9 -0
  23. package/skills/plugin/assets/templates/hooks.json +9 -0
  24. package/skills/plugin/assets/templates/plugin.json +19 -0
  25. package/skills/plugin/assets/templates/setup-command.md +15 -0
  26. package/skills/plugin/assets/templates/skill.md +15 -0
  27. package/skills/plugin/references/adopt.md +114 -0
  28. package/skills/plugin/references/create.md +163 -0
  29. package/skills/plugin/references/delete.md +23 -0
  30. package/skills/plugin/references/inspect.md +21 -0
  31. package/skills/plugin/references/update.md +26 -0
  32. package/skills/plugin/references/version.md +97 -0
  33. package/skills/publish-plugin/SKILL.md +246 -0
  34. package/skills/publish-plugin/evals/evals.json +23 -0
  35. package/skills/publish-plugin/references/vendor-requirements.md +38 -0
  36. package/skills/upgrade-plugin/README.md +23 -0
  37. package/skills/upgrade-plugin/SKILL.md +86 -0
  38. package/LICENSE +0 -21
@@ -0,0 +1,246 @@
1
+ ---
2
+ name: publish-plugin
3
+ description: Use this skill whenever the user wants to publish, release, submit, or share a plugin to the universal plugin marketplace so it works across Claude Code, Cursor, Codex, and GitHub Copilot CLI. Trigger on phrases like "publish my plugin", "submit to marketplace", "release plugin", "list my plugin", "share my plugin", or any mention of getting a plugin into the universal registry. The plugin should already be packaged before using this skill.
4
+ ---
5
+
6
+ # Publish Universal Plugin
7
+
8
+ Guides adding an already-packaged plugin to a marketplace repo by opening a pull request. Each vendor runtime may have its own marketplace manifest file inside the marketplace repo — update every one that exists.
9
+
10
+ **Default marketplace repo:** `cyberuni/marketplace` (adjust if the user targets a different one)
11
+
12
+ ## Overview
13
+
14
+ Publishing has three steps:
15
+
16
+ 1. **Pre-flight** — validate the plugin is ready
17
+ 2. **Prepare entries** — build the entry for each vendor marketplace file that exists
18
+ 3. **Submit PR** — one PR that updates all relevant marketplace files
19
+
20
+ Work through each step in order. Do not skip pre-flight even if the user says the plugin is ready.
21
+
22
+ ---
23
+
24
+ ## Step 1: Pre-flight validation
25
+
26
+ Run these checks against the plugin directory. Stop and fix any failures before continuing.
27
+
28
+ ### 1a. Required metadata
29
+
30
+ Read the plugin's root `plugin.json`. Verify:
31
+
32
+ - `name` — present, kebab-case (no spaces, no uppercase)
33
+ - `version` — present, valid semver (`x.y.z`)
34
+ - `description` — present, at least 10 characters
35
+ - `author` — present (string or `{name, email}` object)
36
+ - `homepage` or `repository` — at least one present
37
+ - `license` — present (SPDX identifier, e.g. `MIT`, `Apache-2.0`)
38
+
39
+ ### 1b. Vendor manifest files
40
+
41
+ Each runtime expects its manifest at a specific path. Check all targeted runtimes and verify each has at minimum a `name` field:
42
+
43
+ | Runtime | Expected path |
44
+ |---|---|
45
+ | Claude Code | `.claude-plugin/plugin.json` |
46
+ | Cursor | `.cursor-plugin/plugin.json` |
47
+ | Codex | `.codex-plugin/plugin.json` |
48
+ | GitHub Copilot CLI | `plugin.json` (root) |
49
+
50
+ See `references/vendor-requirements.md` for required fields and hook casing rules per vendor.
51
+
52
+ ### 1c. Hook casing check
53
+
54
+ If the plugin has hooks, verify each vendor manifest uses the correct event name casing:
55
+
56
+ - Claude Code and Codex: **PascalCase** (`SessionStart`, `PreToolCall`)
57
+ - Cursor and GitHub Copilot CLI: **camelCase** (`sessionStart`, `preToolCall`)
58
+
59
+ Mixed casing causes silent hook failures at runtime.
60
+
61
+ ### 1d. Skills check (if present)
62
+
63
+ If the plugin ships skills, each `skills/<name>/SKILL.md` must exist with valid YAML frontmatter containing at minimum `name` and `description`.
64
+
65
+ ### 1e. Report
66
+
67
+ List what passed and what failed. Do not proceed to Step 2 until all checks pass.
68
+
69
+ ---
70
+
71
+ ## Step 2: Prepare marketplace entries
72
+
73
+ ### 2a. Detect which vendor marketplace files exist
74
+
75
+ Clone or check out the marketplace repo locally, then look for vendor marketplace files:
76
+
77
+ | File | Runtime |
78
+ |---|---|
79
+ | `.claude-plugin/marketplace.json` | Claude Code |
80
+ | `.cursor-plugin/marketplace.json` | Cursor |
81
+
82
+ Only prepare entries for files that actually exist — do not create new vendor marketplace files.
83
+
84
+ ### 2b. Claude Code entry (`.claude-plugin/marketplace.json`)
85
+
86
+ The richer format. Use this shape:
87
+
88
+ ```json
89
+ {
90
+ "name": "<plugin-name>",
91
+ "source": {
92
+ "source": "url",
93
+ "url": "<git-clone-url>.git"
94
+ },
95
+ "description": "<one-line description>",
96
+ "author": { "name": "<author>" },
97
+ "homepage": "<URL>",
98
+ "repository": "<git-clone-url>",
99
+ "license": "<SPDX identifier>",
100
+ "category": "<category>"
101
+ }
102
+ ```
103
+
104
+ **`source`** — use `"source": "url"` with the `.git` clone URL for public repos. Other options: `github` (sparse checkout), `git` (with ref/path), `file`, `directory`.
105
+
106
+ **`category`** — choose closest: `research`, `skills`, `setup`, `productivity`, `plugin-authoring`.
107
+
108
+ **`skills`** — if the plugin ships skills users invoke directly, list their relative paths:
109
+ ```json
110
+ "skills": ["./skills/my-skill"]
111
+ ```
112
+
113
+ **`strict`** — set `false` unless the plugin requires exact version pinning.
114
+
115
+ Omit optional fields rather than leaving them empty.
116
+
117
+ ### 2c. Cursor entry (`.cursor-plugin/marketplace.json`)
118
+
119
+ The simpler format — only three required fields:
120
+
121
+ ```json
122
+ {
123
+ "name": "<plugin-name>",
124
+ "source": {
125
+ "source": "url",
126
+ "url": "<git-clone-url>.git"
127
+ },
128
+ "description": "<one-line description>"
129
+ }
130
+ ```
131
+
132
+ The `source` field supports the same options as Claude Code (`url`, `github`, `git`, `file`, `directory`).
133
+
134
+ ### 2d. Update scenario
135
+
136
+ If the plugin is already listed (this is an update), find its existing entry, update changed fields, and preserve any curator-added fields not in the standard shape. Do not overwrite `publishedAt` if present — add `"updatedAt": "<today>"` instead.
137
+
138
+ Show all prepared entries to the user and ask them to confirm before proceeding.
139
+
140
+ ---
141
+
142
+ ## Step 3: Submit PR
143
+
144
+ Use the `gh` CLI. Confirm commands that affect shared state before running.
145
+
146
+ ### 3a. Get the marketplace repo locally
147
+
148
+ If the user has write access (org member), work directly:
149
+
150
+ ```bash
151
+ gh repo clone cyberuni/marketplace
152
+ cd marketplace
153
+ ```
154
+
155
+ If a fork is needed:
156
+
157
+ ```bash
158
+ gh repo fork cyberuni/marketplace --clone --remote
159
+ cd marketplace
160
+ git fetch upstream && git merge upstream/main
161
+ ```
162
+
163
+ ### 3b. Create a branch
164
+
165
+ ```bash
166
+ git checkout -b add-<plugin-name>
167
+ ```
168
+
169
+ ### 3c. Edit all detected marketplace files
170
+
171
+ For each vendor marketplace file detected in Step 2a, append the plugin entry to its `plugins` array. Preserve formatting and all existing entries exactly. Stage all changed files together.
172
+
173
+ ### 3d. Commit and push
174
+
175
+ ```bash
176
+ git add .claude-plugin/marketplace.json .cursor-plugin/marketplace.json # whichever exist
177
+ git commit -m "feat: add <plugin-name> v<version>"
178
+ git push origin add-<plugin-name>
179
+ ```
180
+
181
+ ### 3e. Open the PR
182
+
183
+ ```bash
184
+ gh pr create \
185
+ --repo cyberuni/marketplace \
186
+ --title "Add <plugin-name> v<version>" \
187
+ --body "$(cat <<'EOF'
188
+ ## Plugin
189
+
190
+ **Name:** <plugin-name>
191
+ **Version:** <version>
192
+ **Author:** <author>
193
+ **License:** <license>
194
+ **Category:** <category>
195
+
196
+ ## Description
197
+
198
+ <description>
199
+
200
+ ## Runtimes
201
+
202
+ - [x] Claude Code
203
+ - [x] Cursor
204
+ - [ ] Codex (no marketplace file)
205
+ - [ ] GitHub Copilot CLI (no marketplace file)
206
+
207
+ ## Marketplace files updated
208
+
209
+ - `.claude-plugin/marketplace.json`
210
+ - `.cursor-plugin/marketplace.json`
211
+
212
+ ## Links
213
+
214
+ - Homepage: <homepage>
215
+ - Repository: <repository>
216
+
217
+ ## Checklist
218
+
219
+ - [ ] All targeted vendor manifests present and valid
220
+ - [ ] Hook event casing correct per vendor
221
+ - [ ] Semver version string
222
+ - [ ] SPDX license identifier
223
+ - [ ] Entry appended to each detected marketplace file
224
+ EOF
225
+ )"
226
+ ```
227
+
228
+ Return the PR URL to the user when done.
229
+
230
+ ---
231
+
232
+ ## Common failure modes
233
+
234
+ | Problem | Fix |
235
+ |---|---|
236
+ | Hook events silently don't fire | Check casing: Claude Code/Codex need PascalCase, Cursor/Copilot CLI need camelCase |
237
+ | Codex rejects manifest | `version` and `description` are required by Codex |
238
+ | PR rejected: missing source link | Add `homepage` or `repository` to plugin.json |
239
+ | Name conflict in marketplace | Check existing entries in each marketplace file first |
240
+ | Plugin loads but skills missing | Add `skills` array to the Claude Code marketplace entry |
241
+
242
+ ---
243
+
244
+ ## Reference files
245
+
246
+ - `references/vendor-requirements.md` — required fields and hook casing rules per runtime
@@ -0,0 +1,23 @@
1
+ {
2
+ "skill_name": "publish-plugin",
3
+ "evals": [
4
+ {
5
+ "id": 1,
6
+ "prompt": "I've finished building my plugin 'git-summary' — it's in ~/projects/git-summary-plugin. It has skills, hooks for all four runtimes, and I want to publish it to the universal plugin marketplace. Walk me through the full publish process.",
7
+ "expected_output": "Runs pre-flight validation checks on all four vendor manifests and plugin.json metadata, then prepares the registry entry JSON and guides opening a PR to the registry repo. Should check hook casing per vendor.",
8
+ "files": []
9
+ },
10
+ {
11
+ "id": 2,
12
+ "prompt": "I'm trying to submit my 'code-formatter' plugin to the marketplace but I think there might be validation errors. The plugin is at /tmp/code-formatter. Can you check if it's ready and fix any issues before submitting?",
13
+ "expected_output": "Runs pre-flight checks, identifies specific validation failures (e.g., missing Codex manifest, wrong hook casing on Cursor manifest, missing license field), reports them clearly, and asks user to fix before proceeding to Step 2.",
14
+ "files": []
15
+ },
16
+ {
17
+ "id": 3,
18
+ "prompt": "My plugin 'ai-commit' is already published in the universal marketplace at version 1.0.0. I've just released v1.1.0 with some new hooks. How do I update the marketplace listing?",
19
+ "expected_output": "Recognizes this as an update scenario, reads existing registry entry, runs pre-flight on new version, prepares updated entry preserving existing fields (especially curator_note and original publishedAt), adds updatedAt, submits an update PR.",
20
+ "files": []
21
+ }
22
+ ]
23
+ }
@@ -0,0 +1,38 @@
1
+ # Vendor Requirements
2
+
3
+ ## Claude Code
4
+
5
+ **Manifest path:** `.claude-plugin/plugin.json`
6
+ **Required fields:** `name`
7
+ **Hook casing:** PascalCase (`SessionStart`, `PreToolCall`, `PostToolCall`, `Stop`)
8
+ **Schema:** https://json.schemastore.org/claude-code-plugin-manifest.json
9
+
10
+ ## Cursor
11
+
12
+ **Manifest path:** `.cursor-plugin/plugin.json`
13
+ **Required fields:** `name`
14
+ **Hook casing:** camelCase (`sessionStart`, `preToolCall`, `postToolCall`)
15
+ **Schema:** https://raw.githubusercontent.com/cursor/plugins/main/schemas/plugin.schema.json
16
+
17
+ ## Codex
18
+
19
+ **Manifest path:** `.codex-plugin/plugin.json`
20
+ **Required fields:** `name`, `version`, `description`
21
+ **Hook casing:** PascalCase (follows Claude Code convention)
22
+
23
+ ## GitHub Copilot CLI
24
+
25
+ **Manifest path:** `plugin.json` (root of plugin directory)
26
+ **Required fields:** `name`
27
+ **Hook casing:** camelCase (follows Cursor convention)
28
+ **Notes:** Also searches `.plugin/plugin.json` as a fallback path
29
+
30
+ ## Hook event name reference
31
+
32
+ | Canonical | Claude Code / Codex | Cursor / Copilot CLI |
33
+ |---|---|---|
34
+ | session start | `SessionStart` | `sessionStart` |
35
+ | session end | `SessionStop` | `sessionStop` |
36
+ | before tool | `PreToolCall` | `preToolCall` |
37
+ | after tool | `PostToolCall` | `postToolCall` |
38
+ | agent stop | `Stop` | `stop` |
@@ -0,0 +1,23 @@
1
+ # upgrade-plugin skill
2
+
3
+ Upgrades all pinned `universal-plugin@<version>` calls across a project to the latest or a specific version — recognizes both `npx universal-plugin@<version>` and `upx universal-plugin@<version>` (see the `adopt-upx` skill), preserving whichever runner word each reference already uses.
4
+
5
+ ## When to use
6
+
7
+ When you need to bump the `universal-plugin` version pin in hook files, SKILL.md files, docs, or any other project files.
8
+
9
+ ## What it does
10
+
11
+ 1. Resolves the target version (latest from npm, or user-supplied semver)
12
+ 2. Finds every `npx universal-plugin@<version>` and `upx universal-plugin@<version>` occurrence across the project
13
+ 3. Confirms the replacement plan with the user
14
+ 4. Applies changes using the Edit tool (reviewable diffs), keeping each reference's runner word (`npx` or `upx`) unchanged
15
+ 5. Verifies no old pins remain, then commits
16
+
17
+ Cross-major bumps require explicit confirmation.
18
+
19
+ ## Install
20
+
21
+ ```bash
22
+ npx skills add cyberuni/universal-plugin --skill upgrade-plugin
23
+ ```
@@ -0,0 +1,86 @@
1
+ ---
2
+ name: upgrade-plugin
3
+ description: Use this skill when upgrading pinned `npx universal-plugin@<version>` calls across a project to a newer version.
4
+ ---
5
+
6
+ # Upgrade Universal Plugin
7
+
8
+ ## When to use
9
+
10
+ When the user wants to bump the pinned `universal-plugin` version in hook commands, SKILL.md files, docs, or any other project files from the current pinned version to a target version (latest or a specific semver).
11
+
12
+ Recognizes both runner words — `npx universal-plugin@<version>` and `upx universal-plugin@<version>` (the fast local-first runner, see the `adopt-upx` skill). A reference keeps whichever runner word it already uses; this skill only bumps the version, never changes `npx` to `upx` or vice versa.
13
+
14
+ ## Instructions
15
+
16
+ ### Step 1 — Resolve the target version
17
+
18
+ If the user supplied a version (e.g. `2.1.0`), use it directly.
19
+
20
+ Otherwise, fetch the latest published version:
21
+
22
+ ```bash
23
+ npm view universal-plugin version
24
+ ```
25
+
26
+ ### Step 2 — Find all pinned calls
27
+
28
+ Search the project for every occurrence of `npx universal-plugin@` or `upx universal-plugin@`:
29
+
30
+ ```bash
31
+ grep -rnE "(npx|upx) universal-plugin@" . \
32
+ --include="*.md" --include="*.json" --include="*.yaml" --include="*.yml" \
33
+ --include="*.ts" --include="*.js" \
34
+ | grep -v node_modules
35
+ ```
36
+
37
+ Report a summary: how many files, which files, the runner word each uses (`npx` or `upx`), and the versions currently pinned.
38
+
39
+ If zero occurrences are found, report that there is nothing to upgrade and stop — do not modify files or create a commit.
40
+
41
+ ### Step 3 — Confirm with the user
42
+
43
+ Show the list of files and the planned replacement, then ask for confirmation before making any changes.
44
+
45
+ Example summary:
46
+
47
+ ```text
48
+ Found universal-plugin@1.2.3 pins in 4 files:
49
+ <skill>/SKILL.md (2 occurrences, npx)
50
+ <hooks-file> (1 occurrence, npx)
51
+ <docs-file> (1 occurrence, upx)
52
+
53
+ Replace all with @1.5.0, keeping each occurrence's runner word (npx/upx)? (y/n)
54
+ ```
55
+
56
+ ### Step 4 — Apply replacements
57
+
58
+ For each confirmed file, replace every `npx universal-plugin@<old-version>` with `npx universal-plugin@<target-version>`, and every `upx universal-plugin@<old-version>` with `upx universal-plugin@<target-version>` — bump the version, keep whichever runner word was already there.
59
+
60
+ Only replace within the same major version by default — cross-major bumps may include breaking changes. Warn the user and ask for explicit confirmation before replacing across major versions.
61
+
62
+ ```bash
63
+ # Dry-run first (review output before applying)
64
+ grep -rnE "(npx|upx) universal-plugin@" <file> | head -20
65
+ ```
66
+
67
+ Apply with the Edit tool, not `sed`, so each change is reviewable.
68
+
69
+ ### Step 5 — Verify
70
+
71
+ Re-run the search from Step 2 and confirm no old version strings remain (within the same major), for either runner word.
72
+
73
+ ```bash
74
+ grep -rnE "(npx|upx) universal-plugin@" . \
75
+ --include="*.md" --include="*.json" --include="*.yaml" --include="*.yml" \
76
+ --include="*.ts" --include="*.js" \
77
+ | grep -v node_modules
78
+ ```
79
+
80
+ ### Step 6 — Commit
81
+
82
+ Commit the changes following the project commit discipline:
83
+
84
+ ```text
85
+ chore: upgrade npx universal-plugin pin to @<target-version>
86
+ ```
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 unional
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.