원클릭으로
release
Prepare and publish a new release. Use when the user asks to release, cut a release, or publish a new version.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Prepare and publish a new release. Use when the user asks to release, cut a release, or publish a new version.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | release |
| description | Prepare and publish a new release. Use when the user asks to release, cut a release, or publish a new version. |
Release a new version of Timer CLI using the release script and CI pipeline.
Use this skill when:
Before releasing, verify:
master — releases only happen from mastergit rev-list --count origin/master..HEAD must be 0)Check with:
git status --short
git rev-parse --abbrev-ref HEAD
git pull origin master
git rev-list --count origin/master..HEAD
git tag --sort=-creatordate | head -3
git log --oneline v<latest_tag>..HEAD
Use Semantic Versioning (MAJOR.MINOR.PATCH). Determine the bump type by analyzing commits since the last release.
Bump MAJOR when:
BREAKING CHANGE: or ! (e.g., feat!: ...)Bump MINOR when:
feat: commits)Bump PATCH when:
fix: commits)docs: commits)refactor: commits)chore(deps): commits)git log v<CURRENT_VERSION>..HEAD --oneline! or BREAKING CHANGE: -> MAJORfeat: -> MINORfix:, docs:, refactor:, etc. -> PATCHEnsure you're on master with no uncommitted changes, up to date with origin, and no commits ahead:
git checkout master
git pull origin master
git status # Should show "nothing to commit, working tree clean"
Verify no commits ahead of origin/master:
git rev-list --count origin/master..HEAD # Should output 0
Unshallow check — shallow clones produce incomplete changelogs:
git rev-parse --is-shallow-repository
If this outputs true, unshallow the repo before proceeding:
git fetch --unshallow origin
git fetch --tags origin
Get current version:
grep '^version =' Cargo.toml | head -1
Review commits since last release:
git log v<CURRENT_VERSION>..HEAD --oneline
Decide on MAJOR, MINOR, or PATCH bump based on the Version Decision Guide above.
git checkout -b release/v<NEW_VERSION>
Edit Cargo.toml and update the version:
version = "<NEW_VERSION>"
cargo update -p timer-cli
Generate the changelog using git-cliff:
make update-changelog
This runs: git cliff -t v<VERSION> -u -p CHANGELOG.md
The changelog is generated from conventional commits and grouped by type (Added, Fixed, Documentation, Build, Refactor, Styling, Testing, Chore). Release commits are excluded.
Stage and commit all changes:
git add .
VERSION=$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -n1)
git commit -m "release: Version $VERSION"
git push -u origin release/v<NEW_VERSION>
Create a pull request to merge into master.
After the PR is merged to master, tagging and releasing is done automatically by CI:
auto-tag.yaml reads the new version from CHANGELOG.mdv<VERSION>The tag then triggers:
rust.yml: Builds for macOS and Linux, runs tests, publishes to crates.io, creates GitHub Release with changelogaur-publish.yml: Publishes AUR packages (timer-rs and timer-rs-bin)Monitor with:
gh run list --limit 5
Note: Do not manually create tags — CI handles this automatically.
| Mistake | Why it's wrong | Fix |
|---|---|---|
| Manually editing CHANGELOG.md | git-cliff generates it from conventional commits | Use make update-changelog |
| Creating git tags manually | auto-tag.yaml creates signed tags automatically | Just push to master |
| Releasing from a feature branch | Changelog generation needs master commit IDs | Checkout master first |
| Releasing with dirty working tree | Script will fail or produce incomplete release | Commit or stash changes first |
| Skipping the unshallow check | Shallow clones produce incomplete changelogs | Always check and unshallow if needed |
Using --amend on a commit | May amend the wrong parent commit after hook failures | Just commit again normally |
Merge or push them first before starting the release.
git fetch --unshallow origin
git fetch --tags origin
cargo install git-cliff
Ensure:
## [v...] headinggit tag -l | grep <version>PAT and GPG_PRIVATE_KEY secrets are configured in GitHubDo NOT use --amend. Simply stage the changes and commit again:
git add .
git commit -m "release: Version <VERSION>"
| File | Role |
|---|---|
Cargo.toml | Package version (single source of truth) |
cliff.toml | git-cliff configuration for changelog generation |
CHANGELOG.md | Generated changelog (auto-tag reads version from here) |
.github/workflows/auto-tag.yaml | Creates signed GPG tag on push to master |
.github/workflows/rust.yml | Builds, tests, publishes to crates.io and GitHub on tag |
.github/workflows/aur-publish.yml | Publishes AUR packages on tag |
Makefile | update-changelog target |
.ci/release.sh | Full release script (can be run manually) |
release/v<VERSION>Cargo.tomlcargo update -p timer-climake update-changelogrelease: Version <VERSION>| Step | Command |
|---|---|
| Check current version | grep '^version =' Cargo.toml | head -1 |
| View recent commits | git log v<CUR>..HEAD --oneline |
| Check commits ahead | git rev-list --count origin/master..HEAD |
| Check shallow clone | git rev-parse --is-shallow-repository |
| Unshallow repo | git fetch --unshallow origin && git fetch --tags origin |
| Update lock file | cargo update -p timer-cli |
| Update changelog | make update-changelog |
| Commit | git commit -m "release: Version <VER>" |
| Monitor CI | gh run list --limit 5 |
| Run release script | .ci/release.sh |