writing-release-notes
Use when drafting release notes for a cc-port version tag.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Use when drafting release notes for a cc-port version tag.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف 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.