diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json index e49d644..7872c20 100644 --- a/.agents/plugins/marketplace.json +++ b/.agents/plugins/marketplace.json @@ -6,7 +6,7 @@ "plugins": [ { "name": "universal-plugin", - "version": "0.7.0", + "version": "0.8.0", "source": { "source": "local", "path": "./packages/universal-plugin" diff --git a/.changeset/config-get-package-path.md b/.changeset/config-get-package-path.md deleted file mode 100644 index 7768c58..0000000 --- a/.changeset/config-get-package-path.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"universal-plugin": minor ---- - -`config get --key packagePath` now reads `packagePath` instead of rejecting it. `--format json` prints the declared path as a JSON string, relative to the plugin root, or `null` when no npm package is declared. `plugin version`, `publish sync-version`, and `config get` share one reader, so they cannot disagree about a declaration. `config add --key packagePath` is still rejected: the key is a string, not a plugin-registered array. diff --git a/.changeset/doctor-package-path-location.md b/.changeset/doctor-package-path-location.md deleted file mode 100644 index 9d6e029..0000000 --- a/.changeset/doctor-package-path-location.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"universal-plugin": patch ---- - -`doctor` now reads `packagePath` only from `.agents/universal-plugin.json`, resolved from the plugin root — the same file and base `plugin version` and `publish sync-version` use. It no longer falls back to `extensions["org.cyberuni.universal-plugin"].packagePath`, which the CLI never honored, so doctor could pass a plugin that `version` still treated as not shipping to npm. A `packagePath` declared in the manifest extension is now reported as `misplaced-package-path`. diff --git a/.changeset/doctor-shared-marketplace-root.md b/.changeset/doctor-shared-marketplace-root.md deleted file mode 100644 index 3b13e9e..0000000 --- a/.changeset/doctor-shared-marketplace-root.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"universal-plugin": patch ---- - -`doctor` now accepts a repeatable `--marketplace-root ` flag to also validate a separately-cloned shared marketplace repository (e.g. a local clone of `cyberuni/marketplace`) — previously only the plugin's own repository root was checked, so a bad entry that reached the shared catalog another way went unnoticed. A named `--marketplace-root` that does not exist is reported as `marketplace-root-missing` instead of being silently skipped. diff --git a/.changeset/explicit-cli-bundling.md b/.changeset/explicit-cli-bundling.md deleted file mode 100644 index f32ef12..0000000 --- a/.changeset/explicit-cli-bundling.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -"universal-plugin": patch ---- - -State the CLI's dependency bundling explicitly in the build config. - -`dist/cli.mjs` already shipped with its runtime dependencies inlined, and that is what lets the -shipped skill launchers run from an installed plugin directory at all — those directories are copies -of a source checkout, so their `node_modules` is absent or incomplete. The build now declares that -intent through an explicit `deps.alwaysBundle` block rather than relying on it incidentally, so a -dependency added later cannot quietly become external and break the launchers. - -`@repobuddy/upx` is deliberately excluded. It is reachable only from the separate `bin/upx.mjs` shim, -which is not a build entry, so the `upx` bin still resolves it at runtime from an installed tree. diff --git a/.changeset/extract-upx.md b/.changeset/extract-upx.md deleted file mode 100644 index 31653a7..0000000 --- a/.changeset/extract-upx.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -"universal-plugin": minor ---- - -Move the `upx` runner into its own package, `@repobuddy/upx`. - -A generic package runner is broader than this package's build/derivation charter — a placement note -in the spec has said so since it landed. It also made the wrong trade for `upx` itself: the runner's -value is *install once globally, use everywhere*, and that install should be small, so requiring -`npm i -g universal-plugin` to get a runner word worked against it. - -Nothing about `upx`'s behavior changed, and the emitter side stays here: `plugin bundle --runner upx`, -the `adopt-upx` skill, and `upgrade-plugin`'s runner-word handling all still live in this package. -Their coupling was always to the *word* `upx`, never to its code. - -**Install `@repobuddy/upx` directly** — `npm i -g @repobuddy/upx`. The `upx` bin on this package now -re-exports it so existing global installs keep working, and prints a deprecation notice on `--help` -(never on a normal call — `upx` is a transparent exec wrapper). It will be removed in the next major. diff --git a/.changeset/fix-build-next-step-hint.md b/.changeset/fix-build-next-step-hint.md deleted file mode 100644 index 6582753..0000000 --- a/.changeset/fix-build-next-step-hint.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"universal-plugin": patch ---- - -Fix `plugin build` ending with a next-step hint for `universal-plugin plugin validate`, a command that does not exist yet. A build that refreshed a marketplace catalog now points at `universal-plugin marketplace validate` (with `--root` for that repository), and any other successful build points at `/universal-plugin:doctor`. diff --git a/.changeset/fix-cli-version-flag.md b/.changeset/fix-cli-version-flag.md deleted file mode 100644 index 0244cfd..0000000 --- a/.changeset/fix-cli-version-flag.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"universal-plugin": patch ---- - -Fix `universal-plugin --version` (and `-V`) always printing `0.0.0` instead of the installed package's actual version. diff --git a/.changeset/migrate-plugin-bundle-cli.md b/.changeset/migrate-plugin-bundle-cli.md deleted file mode 100644 index 70748ed..0000000 --- a/.changeset/migrate-plugin-bundle-cli.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"universal-plugin": patch ---- - -`migrate-plugin` now bundles the package's CLI with tsdown as part of the migration, so the CLI runs from an installed plugin directory that has no `node_modules`. It splits `tsdown.config.ts` into a library config that keeps dependencies external and a CLI config that inlines them through `deps.alwaysBundle`. It then proves the result by running the CLI from an extracted tarball. - -The skill also covers plugins that live in a sibling workspace member such as `plugins//`, merges a colliding readme instead of overwriting it, and notes that `publish sync-version` reads `packagePath` from `.agents/universal-plugin.json`, not from the manifest. It also repoints lint excludes, marketplace sources, and spec paths. diff --git a/.changeset/package-path-not-in-extension.md b/.changeset/package-path-not-in-extension.md deleted file mode 100644 index 8875b08..0000000 --- a/.changeset/package-path-not-in-extension.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"universal-plugin": patch ---- - -`schema/extension.schema.json` and the `init-universal-plugin` standard reference no longer advertise `packagePath` under `extensions["org.cyberuni.universal-plugin"]`. The CLI never read it there, so a plugin that declared it where the schema said silently fell back to the author-picks release model. `packagePath` lives in `.agents/universal-plugin.json` beside `plugin.json`, as a path relative to the plugin root; a namespace `packagePath` now fails schema validation. diff --git a/.changeset/plugin-validate.md b/.changeset/plugin-validate.md deleted file mode 100644 index dd76b69..0000000 --- a/.changeset/plugin-validate.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -"universal-plugin": minor ---- - -Add `universal-plugin plugin validate`, which checks the root `plugin.json` without building anything. It reports every problem in one pass, in two groups: - -- **Schema violations** against the Agent Plugins 1.0.0 schema: `$schema` and `name` are required, `name` must match the schema's pattern, fields must have the right types, and top-level keys the standard does not define are rejected. -- **Vendor violations**: for example, Codex requires `description` and `version`. `--vendor ` limits these checks to one vendor. - -An unknown vendor key in `harnesses` is a warning, and `--strict` makes it a violation. Output is TOON by default, with `--format json` and `--full` available. Running `universal-plugin plugin` with no subcommand now validates the current project and lists its declared harnesses, instead of printing help. - -A manifest without `$schema` now fails `plugin validate`. `plugin build` does not check `$schema` and still accepts it. `plugin init` already writes `$schema`. diff --git a/.changeset/skills-ask-cli-package-path.md b/.changeset/skills-ask-cli-package-path.md deleted file mode 100644 index 59130fe..0000000 --- a/.changeset/skills-ask-cli-package-path.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"universal-plugin": patch ---- - -The `doctor` and `publish-plugin` skills now ask the CLI for `packagePath` (`config get --key packagePath`) instead of reading `.agents/universal-plugin.json` themselves, so they cannot drift from `plugin version`. When the CLI is too old to answer, doctor reports `package-path-unknown` and skips `version-drift` and `unreleased-content` rather than guessing. diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 9d9a44a..52c6062 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -18,7 +18,7 @@ "repository": "https://github.com/cyberuni/universal-plugin", "license": "MIT", "category": "plugin-authoring", - "version": "0.7.0", + "version": "0.8.0", "keywords": ["universal", "plugin", "agent", "cross-vendor"] } ] diff --git a/packages/universal-plugin/.claude-plugin/plugin.json b/packages/universal-plugin/.claude-plugin/plugin.json index b237501..5f015f6 100644 --- a/packages/universal-plugin/.claude-plugin/plugin.json +++ b/packages/universal-plugin/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "universal-plugin", - "version": "0.7.0", + "version": "0.8.0", "description": "Research and design toolkit for building universal AI coding agent plugins that work across Claude Code, Cursor, Codex, and GitHub Copilot CLI.", "author": { "name": "unional" diff --git a/packages/universal-plugin/.codex-plugin/plugin.json b/packages/universal-plugin/.codex-plugin/plugin.json index b237501..5f015f6 100644 --- a/packages/universal-plugin/.codex-plugin/plugin.json +++ b/packages/universal-plugin/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "universal-plugin", - "version": "0.7.0", + "version": "0.8.0", "description": "Research and design toolkit for building universal AI coding agent plugins that work across Claude Code, Cursor, Codex, and GitHub Copilot CLI.", "author": { "name": "unional" diff --git a/packages/universal-plugin/.cursor-plugin/plugin.json b/packages/universal-plugin/.cursor-plugin/plugin.json index b237501..5f015f6 100644 --- a/packages/universal-plugin/.cursor-plugin/plugin.json +++ b/packages/universal-plugin/.cursor-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "universal-plugin", - "version": "0.7.0", + "version": "0.8.0", "description": "Research and design toolkit for building universal AI coding agent plugins that work across Claude Code, Cursor, Codex, and GitHub Copilot CLI.", "author": { "name": "unional" diff --git a/packages/universal-plugin/CHANGELOG.md b/packages/universal-plugin/CHANGELOG.md index 1623fbb..28341bf 100644 --- a/packages/universal-plugin/CHANGELOG.md +++ b/packages/universal-plugin/CHANGELOG.md @@ -1,5 +1,55 @@ # universal-plugin +## 0.8.0 + +### Minor Changes + +- cbda7c2: `config get --key packagePath` now reads `packagePath` instead of rejecting it. `--format json` prints the declared path as a JSON string, relative to the plugin root, or `null` when no npm package is declared. `plugin version`, `publish sync-version`, and `config get` share one reader, so they cannot disagree about a declaration. `config add --key packagePath` is still rejected: the key is a string, not a plugin-registered array. +- 1eab810: Move the `upx` runner into its own package, `@repobuddy/upx`. + + A generic package runner is broader than this package's build/derivation charter — a placement note + in the spec has said so since it landed. It also made the wrong trade for `upx` itself: the runner's + value is *install once globally, use everywhere*, and that install should be small, so requiring + `npm i -g universal-plugin` to get a runner word worked against it. + + Nothing about `upx`'s behavior changed, and the emitter side stays here: `plugin bundle --runner upx`, + the `adopt-upx` skill, and `upgrade-plugin`'s runner-word handling all still live in this package. + Their coupling was always to the *word* `upx`, never to its code. + + **Install `@repobuddy/upx` directly** — `npm i -g @repobuddy/upx`. The `upx` bin on this package now + re-exports it so existing global installs keep working, and prints a deprecation notice on `--help` + (never on a normal call — `upx` is a transparent exec wrapper). It will be removed in the next major. +- 49f1036: Add `universal-plugin plugin validate`, which checks the root `plugin.json` without building anything. It reports every problem in one pass, in two groups: + + - **Schema violations** against the Agent Plugins 1.0.0 schema: `$schema` and `name` are required, `name` must match the schema's pattern, fields must have the right types, and top-level keys the standard does not define are rejected. + - **Vendor violations**: for example, Codex requires `description` and `version`. `--vendor ` limits these checks to one vendor. + + An unknown vendor key in `harnesses` is a warning, and `--strict` makes it a violation. Output is TOON by default, with `--format json` and `--full` available. Running `universal-plugin plugin` with no subcommand now validates the current project and lists its declared harnesses, instead of printing help. + + A manifest without `$schema` now fails `plugin validate`. `plugin build` does not check `$schema` and still accepts it. `plugin init` already writes `$schema`. + +### Patch Changes + +- a40d5b0: `doctor` now reads `packagePath` only from `.agents/universal-plugin.json`, resolved from the plugin root — the same file and base `plugin version` and `publish sync-version` use. It no longer falls back to `extensions["org.cyberuni.universal-plugin"].packagePath`, which the CLI never honored, so doctor could pass a plugin that `version` still treated as not shipping to npm. A `packagePath` declared in the manifest extension is now reported as `misplaced-package-path`. +- f0be1fa: `doctor` now accepts a repeatable `--marketplace-root ` flag to also validate a separately-cloned shared marketplace repository (e.g. a local clone of `cyberuni/marketplace`) — previously only the plugin's own repository root was checked, so a bad entry that reached the shared catalog another way went unnoticed. A named `--marketplace-root` that does not exist is reported as `marketplace-root-missing` instead of being silently skipped. +- 0211cae: State the CLI's dependency bundling explicitly in the build config. + + `dist/cli.mjs` already shipped with its runtime dependencies inlined, and that is what lets the + shipped skill launchers run from an installed plugin directory at all — those directories are copies + of a source checkout, so their `node_modules` is absent or incomplete. The build now declares that + intent through an explicit `deps.alwaysBundle` block rather than relying on it incidentally, so a + dependency added later cannot quietly become external and break the launchers. + + `@repobuddy/upx` is deliberately excluded. It is reachable only from the separate `bin/upx.mjs` shim, + which is not a build entry, so the `upx` bin still resolves it at runtime from an installed tree. +- becd7ef: Fix `plugin build` ending with a next-step hint for `universal-plugin plugin validate`, a command that does not exist yet. A build that refreshed a marketplace catalog now points at `universal-plugin marketplace validate` (with `--root` for that repository), and any other successful build points at `/universal-plugin:doctor`. +- 2469986: Fix `universal-plugin --version` (and `-V`) always printing `0.0.0` instead of the installed package's actual version. +- c6304c5: `migrate-plugin` now bundles the package's CLI with tsdown as part of the migration, so the CLI runs from an installed plugin directory that has no `node_modules`. It splits `tsdown.config.ts` into a library config that keeps dependencies external and a CLI config that inlines them through `deps.alwaysBundle`. It then proves the result by running the CLI from an extracted tarball. + + The skill also covers plugins that live in a sibling workspace member such as `plugins//`, merges a colliding readme instead of overwriting it, and notes that `publish sync-version` reads `packagePath` from `.agents/universal-plugin.json`, not from the manifest. It also repoints lint excludes, marketplace sources, and spec paths. +- 1f82ccd: `schema/extension.schema.json` and the `init-universal-plugin` standard reference no longer advertise `packagePath` under `extensions["org.cyberuni.universal-plugin"]`. The CLI never read it there, so a plugin that declared it where the schema said silently fell back to the author-picks release model. `packagePath` lives in `.agents/universal-plugin.json` beside `plugin.json`, as a path relative to the plugin root; a namespace `packagePath` now fails schema validation. +- 4161472: The `doctor` and `publish-plugin` skills now ask the CLI for `packagePath` (`config get --key packagePath`) instead of reading `.agents/universal-plugin.json` themselves, so they cannot drift from `plugin version`. When the CLI is too old to answer, doctor reports `package-path-unknown` and skips `version-drift` and `unreleased-content` rather than guessing. + ## 0.7.0 ### Minor Changes diff --git a/packages/universal-plugin/package.json b/packages/universal-plugin/package.json index 02ec3a0..ce08464 100644 --- a/packages/universal-plugin/package.json +++ b/packages/universal-plugin/package.json @@ -1,6 +1,6 @@ { "name": "universal-plugin", - "version": "0.7.0", + "version": "0.8.0", "description": "Universal AI agent plugin build tool", "keywords": [ "agent-plugin", diff --git a/packages/universal-plugin/plugin.json b/packages/universal-plugin/plugin.json index 4fe7bc2..34eb0d0 100644 --- a/packages/universal-plugin/plugin.json +++ b/packages/universal-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", "name": "universal-plugin", - "version": "0.7.0", + "version": "0.8.0", "description": "Research and design toolkit for building universal AI coding agent plugins that work across Claude Code, Cursor, Codex, and GitHub Copilot CLI.", "author": { "name": "unional"