Skip to content

The skill has moved out; this is now only the action - #14

Merged
oetiker merged 1 commit into
mainfrom
feat/skill-moved-out
Aug 20, 2026
Merged

The skill has moved out; this is now only the action#14
oetiker merged 1 commit into
mainfrom
feat/skill-moved-out

Conversation

@oetiker

@oetiker oetiker commented Aug 20, 2026

Copy link
Copy Markdown
Member

Two products with different audiences shared one version number. It misfired in both directions:

release action files skill files told the wrong audience
v2.2.2 5 0 every skill user saw an "update"
v2.3.0 0 (byte-identical) 10 every workflow pinning @v2 saw a new action

The skill now lives at oposs/cmk-oposs-plugin. This repo is now only the action.

The trap this nearly walked into

.claude-plugin/plugin.json was load-bearing: Release publisher triggered on it and read the version out of it. Deleting it naively would have broken releases entirely.

The version now comes from CHANGES.md:

VERSION_NO_V=$(grep -m1 -oP '^##\s+\Kv?[0-9]+\.[0-9]+\.[0-9]+' CHANGES.md || true)

Tested against the real file and both edge cases: it skips ## [Unreleased] (no digits), returns the newest released section, and matches nothing when nothing is released — so the publisher fails loudly rather than tagging something arbitrary.

One behaviour change, already safe

The publisher now triggers on CHANGES.md instead of plugin.json, so an ordinary PR adding an [Unreleased] entry also fires it. The existing guard already handles that — it resolves the newest released version, finds the tag present, sets already_released=true, and every downstream step is gated on it. No new mechanism needed.

Also removed

assets/release.yml and assets/validate.yml went with the skill and are not being replaced. Release and CI workflows belong to oposs/repo-infra, which installs one standard flow across every repository and generates a ci.yml that calls this action.

The seam between the three repos is one line: uses: oposs/mkp-builder@v2.

Housekeeping

  • RELEASING.md rewritten for one product. Its note on why the version bump is load-bearing (Claude caches a plugin under its resolved version; a skill fix without a bump ships nothing, silently) moved to the new repo's RELEASING.md rather than being deleted.
  • README's plugin section → a Related projects section.
  • .gitignore whitelist entries !/skills and !/.claude-plugin dropped.
  • All four workflow YAML files still parse.

Merge order

Merge oposs/claude-plugins#4 first — it repoints the marketplace at the new repo. Until then the marketplace still resolves cmk-oposs-plugin from here.

🤖 Generated with Claude Code

Two products with different audiences shared one version number, and it
misfired in both directions. v2.2.2 changed five action files and zero skill
files, yet told every skill user their skill had updated. v2.3.0, three days
later, changed only skill files and left action.yml and mkp-builder.py
byte-identical, yet cut a release of a GitHub Action that consumers pin by
major. The skill now lives at oposs/cmk-oposs-plugin.

The release machinery had to move with it. .claude-plugin/plugin.json was
load-bearing here -- Release publisher triggered on it and read the version
out of it -- so deleting it naively would have broken releases entirely. The
version now comes from CHANGES.md: the first heading carrying a semver is the
newest release, and `## [Unreleased]` has no digits so it is skipped. A
changelog with nothing released matches nothing and the publisher fails
rather than tagging something arbitrary.

Publisher now triggers on CHANGES.md rather than plugin.json, which means an
ordinary PR adding an [Unreleased] entry also fires it. That is already safe:
the existing guard resolves the newest released version, finds the tag
present, sets already_released=true, and every downstream step is gated on
it. No new mechanism was needed.

The reason plugin.json was synced in the first place is recorded in its own
comment -- Claude caches a plugin under its resolved version -- and that
reason does not survive the split. The note itself was worth keeping, so it
moved to the new repo's RELEASING.md rather than being deleted.

Also removed: assets/release.yml and assets/validate.yml went with the skill
and are not being replaced. Release and CI workflows belong to
oposs/repo-infra, which installs one standard flow across every repository
and generates a ci.yml that calls this action. The seam between the three
repos is one line: uses: oposs/mkp-builder@v2.

RELEASING.md rewritten, README's plugin section replaced with a Related
projects section, and the .gitignore whitelist entries for the moved trees
dropped. All four workflow YAML files still parse.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@oetiker
oetiker merged commit 699cefc into main Aug 20, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant