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.
- package/.claude-plugin/plugin.json +15 -0
- package/.codex-plugin/plugin.json +14 -0
- package/.cursor-plugin/plugin.json +14 -0
- package/agents/agentskills-specialist.md +132 -0
- package/bin/upx.mjs +6 -0
- package/dist/cli.mjs +1330 -255
- package/dist/run.mjs +271 -0
- package/governances/plugin-design.md +22 -17
- package/governances/slash-invocation.md +30 -0
- package/package.json +14 -5
- package/plugin.json +18 -0
- package/readme.md +37 -3
- package/skills/adopt-upx/README.md +38 -0
- package/skills/adopt-upx/SKILL.md +120 -0
- package/skills/adopt-upx/scripts/rewrite-upx.mjs +168 -0
- package/skills/migrate-plugin/SKILL.md +106 -0
- package/skills/migrate-plugin/evals/evals.json +11 -0
- package/skills/migrate-plugin/evals/trigger-queries.json +35 -0
- package/skills/plugin/README.md +37 -0
- package/skills/plugin/SKILL.md +105 -0
- package/skills/plugin/assets/templates/agent.md +7 -0
- package/skills/plugin/assets/templates/command.md +9 -0
- package/skills/plugin/assets/templates/hooks.json +9 -0
- package/skills/plugin/assets/templates/plugin.json +19 -0
- package/skills/plugin/assets/templates/setup-command.md +15 -0
- package/skills/plugin/assets/templates/skill.md +15 -0
- package/skills/plugin/references/adopt.md +114 -0
- package/skills/plugin/references/create.md +163 -0
- package/skills/plugin/references/delete.md +23 -0
- package/skills/plugin/references/inspect.md +21 -0
- package/skills/plugin/references/update.md +26 -0
- package/skills/plugin/references/version.md +97 -0
- package/skills/publish-plugin/SKILL.md +246 -0
- package/skills/publish-plugin/evals/evals.json +23 -0
- package/skills/publish-plugin/references/vendor-requirements.md +38 -0
- package/skills/upgrade-plugin/README.md +23 -0
- package/skills/upgrade-plugin/SKILL.md +86 -0
- 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.
|