git-tag
จัดการ git tags — annotated release tags, semver, sync กับ manifest และ remote
SKILL.mdgit-tag/SKILL.md
GitHubGoal
Create and manage git tags per convention — annotated tags for releases, clear semver, synced with the manifest version and the remote
Scope
- create annotated/lightweight tags, list, push, delete (local + remote)
- connects with
/deep-review-codebase— the tag must match thepackage.json/manifest version - does not cover the full release process →
/run-release(this skill handles tags only)
Execute
1. Verify Version Target
Goal: the tagged version matches the real release
- check the version in the manifest (
package.json,Cargo.toml,pyproject.toml) git tag -l+git ls-remote --tags origin— the tag is not a duplicate, no drift (/deep-review-codebase)- the tag must point at the actual release commit — usually the release's merge commit on main
2. Create Tag
Goal: the tag has full information and follows convention
git tag -a v1.2.3 -m "Release v1.2.3" # annotated — always choose this for releases
git tag v1.2.3 # lightweight — temp/internal markers only
git tag -a v1.2.3 <sha> -m "..." # tag an older commit
- release tags always use annotated (
-a) — includes tagger, date, message - the tag name matches the version:
v<semver>per the project's convention (checkgit tag -lwhether thevprefix is used)
3. Push And Sync
Goal: the tag reaches the remote and is picked up by the CI release pipeline
git push origin <tag>— push only that tag, not all--tags(prevents leaking local tags)- check the CI/release workflow trigger if the project is tag-driven (GitHub release, publish)
- report: tag, commit, version, remote status
4. Fix Mistakes
Goal: a wrong tag is corrected safely
- local only:
git tag -d <tag>then recreate - already pushed: never move a tag silently —
git push origin :refs/tags/<tag>to delete the remote one, recreate, push — notify the team because consumers may pin the tag
Rules
- release tag = annotated always; lightweight only for temporary markers
- a pushed tag is immutable — moving it = a breaking change for consumers
- the tag name must match the manifest version — drift = a
/deep-review-codebasefinding - do not push all
--tags— push only the intended tag - Use /deep-review-codebase if needed
Expected Outcome
- the tag is created, matching the version and the released commit
- remote is synced, no tag drift