brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Full release lifecycle — version bump, CHANGELOG, rich release notes, tag, publish. Use when user says "release", "tag and release", "publish version", "cut a release", "new version".
Claude Code
$ npx -y skills add alexei-led/ccgram --skill releasing --agent claude-code
Codex
$ npx skills add alexei-led/ccgram --skill releasing -a codex -y
Cursor
$ npx skills add alexei-led/ccgram --skill releasing -a cursor -y
Gemini CLI
$ npx skills add alexei-led/ccgram --skill releasing -a gemini-cli -y
GitHub Copilot
$ npx skills add alexei-led/ccgram --skill releasing -a github-copilot -y
OpenCode
$ npx skills add alexei-led/ccgram --skill releasing -a opencode -y
Windsurf
$ npx skills add alexei-led/ccgram --skill releasing -a windsurf -y
name: releasing description: Full release lifecycle — version bump, CHANGELOG, rich release notes, tag, publish. Use when user says "release", "tag and release", "publish version", "cut a release", "new version". user-invocable: true allowed-tools: - Bash(git *) - Bash(gh *) - Bash(git cliff *) - Bash(make check) - Read argument-hint: "[patch|minor|major|<version>] (e.g., patch, minor, 2.4.0)"
Tag and publish a new version with rich, narrative release notes.
Run in parallel:
git branch --show-current # Must be main git status --porcelain # Must be clean git log origin/main..HEAD --oneline # Must be empty (all pushed)
**If any fail:** report and stop.
Run `make check` — all must pass.
Get the last tag:
git describe --tags --abbrev=0
Parse `$ARGUMENTS`:
The version is `X.Y.Z` (no `v` prefix in display). The git tag is `vX.Y.Z`.
git cliff --tag vX.Y.Z --output CHANGELOG.md
Read the FULL diff since the last tag to understand every change:
git diff <last-tag>..HEAD -- '*.py' '*.yml' '*.toml' git log <last-tag>..HEAD --format="%H %s"
Also read any PR descriptions referenced in commits:
gh pr list --state merged --search "is:merged" --limit 20 --json number,title,body
Now write release notes following this structure and style (study existing releases for tone):
1. **Lead with a theme headline** — one sentence summarizing what this release is about
2. **Explain WHY, not just WHAT** — don't just list commit messages. Explain user-facing impact:
3. **Group by theme, not commit type** — if 3 fixes all relate to "shell prompt reliability", group them under that heading instead of a flat "### Fixed" list
4. **Include context** — before/after examples, tables, config snippets where they help
5. **End with Install / Upgrade block** — always include `uv tool upgrade ccgram` and `brew upgrade ccgram`
6. **Keep it concise** — a patch release with 2 fixes needs 15-20 lines, not 100. Scale depth with change magnitude.
7. **No "Documentation" section** — skip changelog/readme commits, they're noise in release notes
8. **Link PRs** where available: `([#36](https://github.com/alexei-led/ccgram/pull/36))`
Present the draft release notes to the user for review before proceeding.
git add CHANGELOG.md git commit -m "docs: update CHANGELOG.md for vX.Y.Z" git push origin main git tag vX.Y.Z git push origin vX.Y.Z
**CRITICAL:** The CHANGELOG commit message must NOT contain `[skip ci]` — it kills tag-triggered workflows.
Poll until the release exists (CI creates it), then edit with the crafted notes:
# Poll every 15s, up to 5 minutes gh release view vX.Y.Z --json tagName 2>/dev/null
Once it exists:
gh release edit vX.Y.Z --notes "<crafted release notes>"
Report final status with link to the release.
Control AI coding agents from your phone. Walk away mid-session. Keep monitoring and responding from Telegram—without losing terminal access.
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.