Automates the cleanup and verification of CHANGELOG.md before a release.
Install
mkdir -p .claude/skills/changelog-audit && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/12983" && unzip -o skill.zip -d .claude/skills/changelog-audit && rm skill.zipInstalls to .claude/skills/changelog-audit
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Audit Warp CHANGELOG.md before a release: recover lost entries, sort by user impact, refine entry language, line-wrap, and (release-branch mode) bump compare refs.Key capabilities
- →Recover lost changelog entries
- →Sort changelog entries by user impact
- →Refine entry language for clarity
- →Line-wrap changelog entries to 120 characters
- →Promote `[Unreleased]` to `[X.Y.Z]` in release-branch mode
- →Bump compare-link references at the bottom of the changelog
How it works
The skill operates in release-branch or main mode, performing cleanup passes like lost-entry recovery, verification, consolidation, impact sorting, and language refinement on `CHANGELOG.md`.
Inputs & outputs
When to use changelog-audit
- →Audit changelog before release
- →Sync release sections
- →Recover missing changelog entries
- →Update comparison refs
About this skill
Changelog Audit
Audits CHANGELOG.md before a Warp release. Operates in two modes auto-detected from the resolved ref name:
- Release-branch mode (ref name matches
^release-): the upcoming release section is being finalized. Run all cleanup passes, promote[Unreleased]→[X.Y.Z], and bump the compare-link reference block at the bottom. - Main mode (anything else, including bare
main): tidy the live[Unreleased]section in place. If main's CHANGELOG is out of sync with one or more released tags, also back-port the tag's section, dedupe redundant[Unreleased]entries, and rotate the compare-link refs. No rename of[Unreleased].
Cleanup passes (some mode-conditional, run in this order):
- Phase 1.5 (main only, conditional) — Post-release sync. When a stable tag exists whose
[X.Y.Z]section is missing from main's CHANGELOG, back-port the section from the tag, dedupe[Unreleased]entries that already shipped, and rotate compare-link refs. Runs unconditionally when triggered (not skippable). - Phase 2 — Lost-entry recovery. Find entries that landed inside an already-released section due to merge=union and propose moves up.
- Phase 3 — Verify, consolidate, link metadata, and check section placement. Confirm non-trivial entries are accurate against the actual code (run code if needed); merge "Add X / Fix X / Change X" sequences for never-shipped features into a single accurate entry; retro-search GitHub for missing GH refs; and re-classify entries that landed in the wrong subsection (e.g., a behavior change wrongly under Fixed) or are missing a
**Breaking:**marker. - Phase 4 — Impact sort. Within each subsection, most user-impactful first; soft preference for keeping similar entries adjacent.
- Phase 5 — Language pass. Drop entries with no user-facing impact, rewrite jargon-heavy entries, fan out to user-perspective subagents on ambiguous cases, then run the editorial conventions sweep (imperative mood, hyphenation, GH-link position, symbol formatting consistency).
- Phase 6 — Line-wrap and consolidated diff. 120-char hard limit, prefer fewer lines, preserve semantic line breaks where they help raw-text readers.
- Phase 7 (release-branch only) — Promote + ref bump. Rename header and update the link-reference block.
Edits land in CHANGELOG.md directly. All passes stage their changes to an in-memory buffer; nothing is written until Phase 6 surfaces the consolidated diff and the user confirms. Phase 1.5 (post-release sync, on dedupe decisions), Pass 2 (lost-entry recovery), Pass 3 (consolidations and retro-GH ref insertions), and Pass 5 (rewrites and deletions) prompt before staging certain decisions so the user can decide on a per-candidate basis. Phase 7 (release-branch only) confirms its rename + ref-bump diff separately and writes after that confirmation.
Inputs:
[ref](positional argument, optional). Any git ref. If omitted, defaults toHEAD. The skill never assumes the current working tree's branch matches what the user intends to audit; the ref is the source of truth for content reads.
Reference files (loaded on demand via Read):
references/sorting-rubric.md— Phase 4 impact-ordering rules with worked examples.references/language-conventions.md— Phase 5 conventions: what belongs in CHANGELOG, what doesn't, internal-jargon flag list, user-perspective subagent prompt template.
Phase 1 — Resolve scope
-
Parse the ref argument. If empty, treat as
HEAD. -
Determine mode from the ref. Resolve the ref to a name, then strip any remote prefix:
resolved=$(git rev-parse --verify --abbrev-ref --symbolic-full-name <ref> 2>/dev/null \ || git rev-parse --verify --abbrev-ref --symbolic-full-name origin/<ref> 2>/dev/null \ || git rev-parse --verify --abbrev-ref --symbolic-full-name upstream/<ref> 2>/dev/null) short=${resolved#origin/}; short=${short#upstream/}If
$shortmatches^release-(e.g.,release-1.13,release-1.13.4) → release-branch mode. Otherwise → main mode.Edge case: ref is a tag like
v1.13.0rc1. Treat as release-branch mode if the tag's commit is reachable from arelease-*branch (git branch -r --contains <tag>); else main mode. When in doubt, ask. -
Determine target version:
- Read
VERSION.mdandwarp/config.pyat the resolved ref viagit show <ref>:VERSION.mdandgit show <ref>:warp/config.py. Take the first that parses to aMAJOR.MINOR.PATCH(stripdev0,rc1,.dev0, etc.). VERSION.md wins on conflict. - In release-branch mode the version must parse to a clean
X.Y.Z. If it doesn't, surface the raw string and ask the user. - In main mode the version drives nothing (no rename), but record it for the report header.
- Read
-
Determine base release tag for the lost-entry diff. Use the parsed
(major, minor)from step 3 to restrict the tag pattern; do not just take the highest tag merged into the ref (anrcof the same minor would land first).# Release-branch mode: previous minor (X.Y-1).*. Use integer math on the parsed version. git tag --merged <ref> --list 'v<major>.<minor-1>.*' --sort=-v:refname | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | head -1 # Main mode (or fallback): highest clean stable tag overall. git tag --list 'v*' --sort=-v:refname | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | head -1Filter excludes anything with
rc,dev,beta, or other suffixes. Take the first result.Major-boundary fallback: if
minor == 0(e.g., target(2, 0)), there is nov2.-1.*line. Enumerate from the previous major instead:git tag --merged <ref> --list 'v<major-1>.*'and take the highest. For example, target(2, 0)→ patternv1.*→ take the highest stablev1.x.ytag from the result. Always use integer math on the parsed(major, minor)tuple; never treat the dotted version string as a float.- In release-branch mode, the result is typically the last release of the previous minor (e.g.,
release-1.13→v1.12.1). - In main mode, the result is the last stable release overall.
- If no tag exists, skip Phase 2 and note in the report.
- In release-branch mode, the result is typically the last release of the previous minor (e.g.,
-
Locate the working directory for edits:
- If
git -C <cwd> rev-parse HEADresolves to the same commit asgit rev-parse <ref>, edit in place. - Otherwise run
git worktree listand check whether<ref>is checked out in a sibling worktree. If so, tell the user the path and ask whether tocdthere or create a fresh worktree. - If neither, propose
git worktree add ../warp-changelog-audit-<ref-slug> <ref>and wait for confirmation. Compute<ref-slug>by replacing every/and any non-[A-Za-z0-9._-]character in the ref with-(e.g.,origin/release-1.13→origin-release-1.13).
- If
-
Detect post-release sync need (main mode only). Get the list of stable tags merged into
<ref>:git tag --merged <ref> --list 'v*' --sort=-v:refname | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$'For each tag, check whether
^## \[X.Y.Z\]( - .*)?$appears in main'sCHANGELOG.md(read at<ref>). The set of tags whose header is absent is the missing-tags set. If non-empty, Phase 1.5 will run; surface the set in the confirmation below.In release-branch mode, skip this check entirely.
-
Present scope and wait for explicit user confirmation before any mutation:
Auditing CHANGELOG.md at <ref> in <working-dir>. Mode: <release-branch|main>. Target version: <X.Y.Z> (source: <VERSION.md|warp/config.py|user>). Base for lost-entry diff: <vX.Y-prev.Z> (or: no tag, skipping Phase 2). Post-release sync needed: <vX.Y.Z, vX.Y.Z+1, ...> (main mode only; omit line if missing-tags set is empty) Release date placeholder: <YYYY-?? | YYYY-MM-DD> (release-branch mode only; default `YYYY-??`) Confirm to proceed, or override release date.Mandatory pause. The release-date line is omitted in main mode (no rename happens). The post-release-sync line is omitted in release-branch mode and in main mode when the missing-tags set is empty.
Phase 1.5 — Post-release sync (main mode only, conditional)
Skip in release-branch mode. Skip in main mode when the missing-tags set from Phase 1.6 is empty.
When a release branch is cut and tagged (vX.Y.Z), the release-branch audit promotes [Unreleased] → [X.Y.Z] on the release branch. Main's CHANGELOG keeps the same bullets under [Unreleased] until someone back-ports the section. This phase performs that back-port, removes redundant [Unreleased] entries that already shipped, and rotates the compare-link refs.
The sync runs unconditionally when missing tags are detected — the user does not get to skip it. Out-of-sync CHANGELOGs on main are a bug, not a preference. The user is consulted only on (a) the feature-branch name and (b) per-entry duplicate-removal decisions.
Process the missing-tags set oldest-first (sort ascending). Each newly inserted section goes immediately below [Unreleased], so the final file ends up with the most recent release first — same convention as before.
1.5.1 — Branch enforcement (must run before any mutation)
Determine the current branch in the working directory:
git -C <wd> rev-parse --abbrev-ref HEAD
main,master, orHEAD(detached): the skill MUST switch to a feature branch before mutating CHANGELOG.md. This is required by the user's "never commit to main" guidance (see auto-memory).- Anything else: the user is already on a feature branch. Re-use it; do not create another.
When a feature branch must be created, propose <user>/sync-changelog-v<newest-missing-tag>:
<user>defaults to the local-part ofgit config user.email(everything before the first@). Example:[email protected]→ershi.<newest-missing-tag>is the highest version in the missing-tags set (e.g., if 1.13.0 and 1.13.1 are
Content truncated.
When not to use it
- →When the current working tree's branch does not match the intended audit ref
Limitations
- →The skill does not auto-stash dirty trees
- →The skill requires user confirmation for certain decisions
- →The skill does not proceed if `git switch -c` fails due to an existing branch
How it compares
This workflow systematically audits `CHANGELOG.md` through multiple phases, including mode-specific actions and user confirmations, providing a more thorough and controlled update than manual editing.
Compared to similar skills
changelog-audit side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| changelog-audit (this skill) | 0 | 2mo | Review | Intermediate |
| deepwiki-rs | 25 | 9mo | Review | Intermediate |
| codex-cli-bridge | 9 | 9mo | Review | Intermediate |
| skill-development | 17 | 8mo | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by NVIDIA
View all by NVIDIA →You might also like
deepwiki-rs
sopaco
AI-powered Rust documentation generation engine for comprehensive codebase analysis, C4 architecture diagrams, and automated technical documentation. Use when Claude needs to analyze source code, understand software architecture, generate technical specs, or create professional documentation from any programming language.
codex-cli-bridge
alirezarezvani
Bridge between Claude Code and OpenAI Codex CLI - generates AGENTS.md from CLAUDE.md, provides Codex CLI execution helpers, and enables seamless interoperability between both tools
skill-development
anthropics
This skill should be used when the user wants to "create a skill", "add a skill to plugin", "write a new skill", "improve skill description", "organize skill content", or needs guidance on skill structure, progressive disclosure, or skill development best practices for Claude Code plugins.
skill-writer
pytorch
Guide users through creating Agent Skills for Claude Code. Use when the user wants to create, write, author, or design a new Skill, or needs help with SKILL.md files, frontmatter, or skill structure.
openapi-spec-generation
wshobson
Generate and maintain OpenAPI 3.1 specifications from code, design-first specs, and validation patterns. Use when creating API documentation, generating SDKs, or ensuring API contract compliance.
korean-skill-creator
clwmfksek
한글 기반 클로드 스킬 자동 생성 도구. 사용자가 "클로드 스킬을 만들어줘" 또는 "[요구사항] 스킬 만들어줘"라고 요청할 때 사용. Progressive disclosure 원칙을 따르는 한글 문서 구조(SKILL.md + references/)를 자동으로 생성하고, 실전 예시를 포함한 일관성 있는 스킬 템플릿을 제공.