writing-release-notes
Use when drafting release notes for a cc-port version tag.
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Menu
Use when drafting release notes for a cc-port version tag.
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Basé sur la classification professionnelle SOC
| name | writing-release-notes |
| description | Use when drafting release notes for a cc-port version tag. |
| model | sonnet |
v0.5.0. Ask if missing. Accept with or without leading v; emit canonical v form in output.git fetch --tags if unsure).digraph release_notes {
entry [shape=doublecircle, label="Version?"];
fetch_tags [shape=box, label="List tags +\ncheck target"];
prev_exists [shape=diamond, label="Previous tag\nexists?"];
first_release [shape=box, label="Range =\ninitial-commit..HEAD\n(note in summary)"];
target_exists [shape=diamond, label="Target tag\nexists?"];
range_tag [shape=box, label="Range =\nprev..target"];
ask_head [shape=box, label="AskUser:\nconfirm HEAD"];
range_head [shape=box, label="Range =\nprev..HEAD"];
list_prs [shape=box, label="List merged PRs"];
fetch_pr [shape=box, label="Fetch PR details"];
categorise [shape=box, label="Categorise"];
filter [shape=box, label="Filter"];
breaking [shape=diamond, label="Breaking?"];
flag_break [shape=box, label="Require Breaking\nChanges section"];
title [shape=box, label="Generate title"];
draft [shape=box, label="Draft notes"];
antislop [shape=box, label="Anti-slop pass"];
clean [shape=diamond, label="Clean?"];
present [shape=doublecircle, label="Present output"];
entry -> fetch_tags;
fetch_tags -> prev_exists;
prev_exists -> first_release [label="no"];
prev_exists -> target_exists [label="yes"];
target_exists -> range_tag [label="yes"];
target_exists -> ask_head [label="no"];
ask_head -> range_head;
first_release -> list_prs;
range_tag -> list_prs;
range_head -> list_prs;
list_prs -> fetch_pr;
fetch_pr -> categorise;
categorise -> filter;
filter -> breaking;
breaking -> flag_break [label="yes"];
breaking -> title [label="no"];
flag_break -> title;
title -> draft;
draft -> antislop;
antislop -> clean;
clean -> antislop [label="no, rewrite"];
clean -> present [label="yes"];
}
Run in parallel:
# Sorted tags, newest first
git tag --sort=-v:refname
# Whether the target tag exists locally
git rev-parse "refs/tags/<version>" 2>/dev/null || echo TAG_NOT_FOUND
From the sorted tag list, pick the tag immediately before <version>.
<prev>..<version>.<prev>..HEAD. AskUserQuestion to confirm HEAD is the intended endpoint before proceeding.<initial-commit>..HEAD. Note this in the Summary.When the range is otherwise ambiguous (two plausible previous tags, unusual tag pattern), confirm with the user before continuing.
Run:
git log <range> --pretty=format:"%H %s" --no-merges
git diff <range> --stat
Extract PR numbers from commit subjects. cc-port commits land via squash-merge with the trailing (#N) suffix added by GitHub.
For commits without a trailing (#N) (direct pushes from before the PR workflow), include the commit subject verbatim and treat the commit as its own change unit.
For each PR number, call gh-tooling pr_view to read title, body, and labels. For ambiguous commits without PRs, call gh-tooling commit_pulls with the commit SHA to confirm whether a PR exists.
Every line in the eventual draft must trace to a PR body, a commit subject, or a diff hunk read here. Do not invent change descriptions or migration steps.
Map each PR to one cc-port category. Use the conventional-commit prefix on the PR title as the primary signal, falling back to changed paths.
| Category | Prefix or path signal |
|---|---|
| Features | feat:, feat(scope): |
| Fixes | fix:, fix(scope): |
| Refactors | refactor: |
| Performance | perf: |
| Build / Release | build:, .goreleaser.yml, packaging |
| CI | ci:, .github/workflows/ |
| Documentation | docs:, README.md, docs/, AGENTS.md |
| Dependencies | deps:, chore(deps):, go.mod, go.sum |
| Tests | test:, only *_test.go files touched |
| Chore | chore: and anything not covered above |
Group by cc-port module under each category when more than two PRs share a module. Modules are listed in AGENTS.md §Navigation.
Exclude from the user-facing notes:
Dependencies line with the count.Mark a PR as breaking if any apply:
BREAKING CHANGE: or title carries ! after the type.cmd/cc-port diffs).internal/lock/README.md, internal/tool/claude/README.md).If any breaking change is present, the notes must include ### Breaking Changes with migration guidance.
A descriptive 3-6 word title that captures the release theme.
Manifest XML Validation.Import Cap Guards & Homebrew Cask.Use this exact skeleton:
## v{version} - {Title}
### Summary
{1-3 sentences. Start with an action verb. Name the user-visible effect.}
### Changes
#### {Category}
- {Description starting with an action verb. Name the user-visible effect.} (#{pr-number})
{repeat per category}
### Breaking Changes
{Only if any. Describe what breaks and the migration path. Include code or command examples when they shorten the explanation.}
### Upgrade Notes
{Either concrete upgrade steps, or the literal line: `No breaking changes.`}
Format rules:
## v{version} - {Title}. Becomes the GitHub release title.####. Omit a category if it has no entries.Add, Fix, Refactor, Reduce); trail with the PR reference in parentheses. Do not bold a change name and follow with a colon. The - **Title**: description. pattern reads as AI slop.### Upgrade Notes section. Use the literal No breaking changes. when no migration applies.The release notes are user-facing prose. Re-read references/writing-rules-anti-ai-slop.md and check the draft literally:
- **Title**: description. bullets. Rewrite them as plain prose bullets that lead with an action verb.Rewrite affected text and re-check. Do not exit this step until the draft passes every check.
Output:
pbcopy (macOS) or xclip -selection clipboard (Linux). Ask first.The session's gh-tooling MCP is read-only. The user applies the notes themselves; do not attempt to mutate the release via gh-tooling or the gh CLI.