From harlan-claude-code
Generate release notes for major/minor releases. Use when user says "release notes", "write release notes", "draft changelog", "prepare release announcement", "what changed since last release", or "generate upgrade guide".
npx claudepluginhub harlan-zw/harlan-claude-code --plugin harlan-claude-codeThis skill uses the workspace's default tool permissions.
Generate Nuxt-style release notes with highlights, categorized changelog, and LLM upgrade prompts for breaking changes.
Creates isolated Git worktrees for feature branches with prioritized directory selection, gitignore safety checks, auto project setup for Node/Python/Rust/Go, and baseline verification.
Executes implementation plans in current session by dispatching fresh subagents per independent task, with two-stage reviews: spec compliance then code quality.
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
Generate Nuxt-style release notes with highlights, categorized changelog, and LLM upgrade prompts for breaking changes.
gh repo view --json nameWithOwner --jq '.nameWithOwner' 2>/dev/null || echo 'unknown'git tag --sort=-v:refname | head -10 | tr '\n' ', 'cat package.json 2>/dev/null | jq -r '.version // "unknown"'gh release view --json body --jq '.body' 2>/dev/null | head -40 || echo 'no prior releases'git tag --sort=-v:refname may interleave v1.2.0-beta.1 with stable tags. Filter with grep -v '\-' when needed.feat:, fix:, perf:, etc. prefixes. If commits are freeform, infer category from the diff: new files/exports = Enhancement, changed test assertions = Fix, package.json dep changes = Chore, etc.! suffix (feat!:, fix!:) AND BREAKING CHANGE: in commit bodies, not just type prefixes.git log only shows the merge author. Use gh pr list --search to find actual PR authors.! suffix constantly. Always cross-reference with the export diff (Step 1b) to catch unlabeled breaking changes.Track release note history:
echo "$(date -I) VERSION TAG" >> "${CLAUDE_PLUGIN_DATA}/release-notes-history.log"
From the preprocessed state above, determine:
$ARGUMENTS if provided, otherwise from current version, otherwise askPREV_TAG..HEADRun IN PARALLEL:
# Full commit log with bodies (for BREAKING CHANGE detection)
git log PREV_TAG..HEAD --format='%H|%s|%b' --no-merges
# Stat summary
git log PREV_TAG..HEAD --stat --no-merges
# All PRs merged since last tag
gh pr list --state merged --search "merged:>=PREV_TAG_DATE" --limit 100 --json number,title,body,author,labels
# Breaking changes (! suffix or BREAKING CHANGE in body)
git log PREV_TAG..HEAD --format='%H %s' --no-merges | grep -E '!:|BREAKING CHANGE'
Commit messages in most cases miss breaking changes. Diff the actual exports to catch unlabeled ones:
# Compare exports between tags (adapt paths to project structure)
# For packages with src/index.ts or similar entry point:
git diff PREV_TAG..HEAD -- src/index.ts src/exports.ts src/public.ts index.ts
# For Nuxt modules, also check runtime/ and composables/:
git diff PREV_TAG..HEAD -- src/runtime/ src/module.ts
# Check for removed or renamed exports
git diff PREV_TAG..HEAD -- '*.d.ts' | grep -E '^\-export'
Flag any removed exports, renamed functions, changed type signatures, or removed config options as potential breaking changes even if commits don't label them.
Analyze docs changes to enrich highlights and catch migration notes already written:
# Docs changes since last tag
git diff PREV_TAG..HEAD --stat -- docs/ README.md MIGRATION.md UPGRADING.md '*.md'
# Read any migration or upgrade docs that were added/modified
git diff PREV_TAG..HEAD --name-only -- docs/ '*.md' | grep -iE 'migrat|upgrad|breaking|changelog'
Read any modified migration docs in full. These in most cases contain context that commit messages lack and should inform both the Highlights narrative and the upgrade prompt.
Major dependency upgrades in most cases introduce transitive breaking changes:
# Diff package.json dependencies
git diff PREV_TAG..HEAD -- package.json | grep -E '^\+.*"(dependencies|peerDependencies)"' -A 50 | grep -E '^\+\s+"'
If any dependency had a major version bump, note it as a potential source of breaking changes and check that dep's own changelog for migration notes.
Compare the target version against findings:
0.x.y): minor bumps can contain breaking changes per semver spec, but still note them clearlyParse conventional commit prefixes into changelog sections. See references/changelog-categories.md for the full mapping.
Select 3-7 changes that deserve narrative treatment in the Highlights section. Criteria:
feat:)perf:)For each highlight, fetch the full PR body if not already available:
gh pr view NUMBER --json body,title --jq '.title + "\n" + .body'
Check the preprocessed "Prior release style" above. If the repo has existing GitHub releases, match that structure and tone. If no prior releases exist (or user requests it), follow the Nuxt release format. See references/nuxt-release-format.md for the exact structure.
Structure:
# vX.Y.Z
## ๐ Highlights
[1-2 sentence intro: what this release focuses on, tone should be enthusiastic but not breathless]
### EMOJI Feature Title
[2-3 sentences explaining the feature, why it matters, what it enables]
[Code example if applicable]
... repeat for each highlight ...
## โ ๏ธ Breaking Changes
[Only if breaking changes exist. List each with migration steps.]
## โ
Upgrading
[Package manager commands + brief notes]
## ๐ Changelog
> [Compare link: PREV_TAG...vX.Y.Z](REPO_URL/compare/PREV_TAG...vX.Y.Z)
### ๐ Enhancements
- Description of change ([#NUMBER](REPO_URL/pull/NUMBER))
### ๐ฅ Performance
...
### ๐ฉน Fixes
...
### ๐
Refactors
...
### ๐ Documentation
...
### ๐ก Chore
...
### โค๏ธ Contributors
[List of contributors]
If breaking changes exist, generate an upgrade prompt that helps users migrate. Read the template at ${CLAUDE_SKILL_DIR}/templates/upgrade-prompt.md.
The upgrade prompt should be:
Write the upgrade prompt to a standalone file:
echo "PROMPT_CONTENT" > upgrade-prompt-vX.Y.Z.md
Also embed it in the release notes as a collapsible section after โ ๏ธ Breaking Changes:
<details>
<summary>๐ค LLM Upgrade Prompt โ paste this into Claude, ChatGPT, etc. to migrate your codebase</summary>
UPGRADE_PROMPT_CONTENT
</details>
This way users discover the prompt directly in the GitHub release page.
Present the release notes in full. Then:
Ask if the user wants to create a GitHub release draft:
gh release create vX.Y.Z --draft --title "vX.Y.Z" --notes "$(cat <<'EOF'
RELEASE_NOTES
EOF
)"
Use --draft so the user can review before publishing.
Report the file path of the standalone upgrade prompt (if generated).
Log to history:
echo "$(date -I) vX.Y.Z PREV_TAG" >> "${CLAUDE_PLUGIN_DATA}/release-notes-history.log"