What's Changed
🧰 Internal
- Release tags are now
<bucket>@X.Y.Z—ship@5.2.0,docs@3.0.0,dev@1.0.0, with novprefix. This is the convention changesets, Lerna in independent mode, Nx and semantic-release already use for per-package releases in a monorepo. - Supersedes the
<bucket>/vX.Y.Zform from 5.1.0, which was published but never consumed, and the original<bucket>--vX.Y.Zform before it. - The
releaseskill no longer assumesclaude plugin tag. That command emits only the double-dash form and has no format option, so a repository defining its own tag shape in.agents/ship.mdtakes precedence, and tags are created withgit tag -a. - The manifest check
claude plugin tagperformed is written into the workflow instead: before tagging, the plugin'splugin.jsonversion and its marketplace entry must agree with the tag.
📋 Why @ rather than a slash
GitHub has no native mechanism for releasing part of a repository — a release is a tag plus notes, repo-wide, and the Releases docs place no constraint on tag names. The separator is therefore a convention choice, and @ avoids two rough edges that slashes carry:
- Actions filter globs treat
/specially.*matches everything except/, so a workflow triggered ontags: ['v*']silently skipsdev/v1.0.0. - Bare-tag collision. Git stores refs as paths, so a tag named
shipcould never coexist withship/v*.
⚠️ If you use this skill in your own repository
Nothing changes unless you ask for it. The reference doc still describes claude plugin tag and the <plugin-name>--vX.Y.Z form as the default, because that is what Claude Code itself produces. The @ form applies only where a repository's own .agents/ship.md asks for it.
Full Changelog: https://github.com/skrrt-sh/skills/compare/ship--v5.0.0...ship@5.2.0