skills/update-changelog/SKILL.md
Automate changelog management, version bumping, release tracking, tags, and GitHub Releases. Sets up a changelog system (CHANGELOG.md, UI modal, version display) if none exists, or updates an existing one. Use when: updating changelog, bumping version, creating release entry, promoting [Unreleased], tagging, publishing GitHub Release notes, handling prerelease versions, setting up changelog, adding version display, managing semver, commit/push/release workflow. Triggers on: changelog, version bump, release notes, semver, CHANGELOG.md, release entry, what's new, patch/minor/major/prerelease bump, tag release, GitHub Release, update the changelog, release, new version.
npx skillsauth add jakerains/agentskills update-changelogInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Dual-mode skill for changelog lifecycle management. Detects existing systems and adapts.
| Task | Mode | Details | |------|------|---------| | First-time setup | Setup | Read setup-workflow.md | | Update existing changelog | Update | Inline below (the hot path) | | CHANGELOG.md format | Reference | Read changelog-format-spec.md | | UI components | Reference | Read ui-component-guide.md | | Detection algorithm | Reference | Read detection-logic.md | | Parse CHANGELOG.md → JSON | Script | Run parse-changelog.sh | | Tags and GitHub Releases | Publish | Approval-gated in Update Mode |
Run these checks BEFORE choosing a mode. All are read-only.
Check in order, use the first match:
package.json → read "version" field (Node/JS projects)pyproject.toml → read version under [project] or [tool.poetry]Cargo.toml → read version under [package]VERSION file at project root (plain text)Check for existing changelog data:
CHANGELOG.md at project rootdocs/CHANGELOG.mdlib/changelog-data.tsx or lib/changelog-data.tslib/changelog-data.json or changelog.json**/changelog-data.*next.config.* or package.json containing "next" → Next.jspackage.json containing "react" → React (non-Next)package.json containing "vue" or nuxt.config.* → Vue/Nuxtpackage.json containing "svelte" → SvelteKitchangelog in components/, src/components/, app/getCurrentVersion, packageJson.version, APP_VERSIONIF no CHANGELOG.md found AND no structured data file found:
→ SETUP MODE (read references/setup-workflow.md)
ELSE:
→ UPDATE MODE (continue below)
Read references/setup-workflow.md for the complete setup workflow.
High-level steps:
CHANGELOG.md at project root using Keep a Changelog format. Populate with initial entry using detected version (or 1.0.0).lib/changelog-data.ts with typed entries. Use the template from assets/changelog-data-template.ts.getCurrentVersion() reads from package.json.chore: set up changelog system (vX.Y.Z) — stage only the new files.After setup, immediately offer to run Update Mode if there are existing changes to document.
This is the primary workflow. Follow every step in order.
# Current version
cat package.json | jq -r '.version'
# Recent commits (adjust depth as needed)
git log --oneline -20
# What's changed since last entry
git diff --stat
git status
# Release context
git branch --show-current
git tag --list --sort=-v:refname | head -20
git remote -v
command -v gh >/dev/null && gh auth status
Read the existing changelog file(s) to find the last documented version and its date.
If a structured data file exists (e.g., lib/changelog-data.tsx), read it to understand the entry format:
content? (e.g., <div className="prose">...</div>)content?Store the detected format. New entries MUST match the existing format exactly.
Check release workflow context before drafting:
main. If already on a feature branch with the code being released, keep the changelog/version bump on that branch so the merge carries code + release notes together. If not on main and intent is unclear, ask before writing.git tag --list. If tags use vX.Y.Z, use vX.Y.Z. If tags use X.Y.Z, use X.Y.Z. If there are no tags, ask and recommend vX.Y.Z.gh exists and gh auth status succeeds. If not, skip GitHub Release creation unless the user fixes auth/tooling..github/workflows/, vercel.json, netlify.toml, fly.toml, render.yaml, railway.json, or package scripts that imply deploy on main. If main auto-deploys, warn during approval: "Committing this release on main may ship vX.Y.Z to production."Analyze ALL changes since the last changelog entry. This includes:
[Unreleased] sectionCategorize. Default to patch. Only escalate to minor when there is clearly a new, user-facing capability worth announcing. When torn between patch and minor, choose patch.
Tiebreaker: If the change feels "meh, it's just more of what we already do" → patch. If you find yourself justifying why it's minor → it's probably patch.
Calculate the new version number based on the scope assessment. Remember: patch is the default. Only pick minor if the Step 2 criteria for minor are clearly met.
Pre-release handling:
-alpha, -beta, or -rc versions unless the user asks or the current version is already a pre-release.1.2.0-beta.1 and the work continues that track, recommend incrementing the pre-release number (1.2.0-beta.2) instead of jumping stable.1.2.0-rc.1 and the user says it is ready, recommend finalizing to 1.2.0.0.x projects, still use semver shape: patch for fixes, minor for new user-facing capability, major only by explicit direction.Present your recommendation with rationale. If you picked minor, explicitly justify which Step 2 minor-criterion the change meets — if you can't point to one cleanly, downgrade to patch before presenting.
Current version: 1.15.7
Recommended bump: patch → 1.15.8
Reason: Bug fixes and small UI tweaks, no new user-facing capability
Or, for a minor bump:
Current version: 1.15.7
Recommended bump: minor → 1.16.0
Reason: Adds new /reports page (new user-facing surface) — qualifies as minor under Step 2 criteria
The user may override your recommendation. Accept their choice.
Draft entries for ALL detected changelog targets:
A. CHANGELOG.md entry (always):
## [X.Y.Z] - Month DD, YYYY
### Added
- Add new feature description
### Changed
- Update changed behavior description
### Fixed
- Fix bug description
Use only the categories that apply: Added, Changed, Deprecated, Removed, Fixed, Security.
If CHANGELOG.md has populated [Unreleased] items, promote relevant items into the new version entry and leave a fresh empty ## [Unreleased] above it.
Add traceability only when it helps:
Fix login redirect (#142).Fix migration ordering (a1b2c3d).B. Structured data file entry (if one exists):
Match the EXACT format of existing entries. Examples:
For TSX with JSX content (like LemonNotes lib/changelog-data.tsx):
{
version: "X.Y.Z",
title: "vX.Y.Z: Brief Title",
date: "Month DD, YYYY",
excerpt: "One-sentence summary.",
content: (
<div className="prose dark:prose-invert prose-sm">
<h3>Section</h3>
<ul>
<li>Change description</li>
</ul>
</div>
),
},
For TS with markdown strings:
{
version: "X.Y.Z",
title: "vX.Y.Z: Brief Title",
date: "Month DD, YYYY",
excerpt: "One-sentence summary.",
content: "### Added\n- Feature description\n\n### Fixed\n- Bug fix",
},
CRITICAL: This is a hard stop. Do NOT proceed without explicit user approval.
Show the user:
current → proposed (with bump type)Use this friendly approval shape:
I found changes since vX.Y.Z and recommend a patch bump to vX.Y.Z.
Release context:
- Branch: main
- Tags: existing tags use a v-prefix, so I will use vX.Y.Z
- GitHub Release: gh is authenticated
- Deploy: main appears to auto-deploy, so this may ship to production
Proposed changelog:
## [X.Y.Z] - Month DD, YYYY
### Fixed
- Fix ...
Files I will modify:
- package.json
- CHANGELOG.md
Reply "approved" to write and commit this release, or tell me what to change.
Keep it compact. Replace unavailable release context lines with clear status such as GitHub Release: gh is not authenticated, so I will skip release creation unless that is fixed. Omit sections that do not apply, like structured data when there is no structured data file.
Wait for the user to explicitly approve (e.g., "looks good", "approved", "go", "yes", "do it").
If the user requests changes, revise and present again. Loop until approved.
After approval, execute ALL writes:
A. Bump version in version source file:
package.json: update the "version" fieldB. Prepend to CHANGELOG.md:
# Changelog header (or after any intro text)[Unreleased] exists, keep it above the new version entry and make it empty after promoting released itemsC. Update structured data file (if exists):
# Stage only the modified files — be explicit
git add package.json CHANGELOG.md <structured-data-file-if-exists> <any-other-changed-source-files>
# Commit with version in message
git commit -m "release: vX.Y.Z — <brief title describing the changes>"
Include any source code files that were part of the changes being documented (i.e., if this is a "commit and push" workflow where you also wrote code, stage those files too).
Report what was written:
old → newThen offer only the publish actions that are actually available:
git tag -a <tag> -m "<tag>"git push origin <tag>gh release create <tag> --notes-file <release-notes-file>Use the detected tag style. If there are no existing tags and the user has not chosen a style yet, ask before tagging and recommend vX.Y.Z.
For GitHub Releases, first verify the tag exists on the remote; create and push the annotated tag after approval if needed. Then write release notes from the new changelog entry to a temporary file and pass it with --notes-file. Use --notes-from-tag only when the tag message is intentionally the release notes.
Use this post-commit shape:
Release commit created: abc1234
Available publish actions:
- Create annotated local tag vX.Y.Z
- Push tag vX.Y.Z to origin
- Create GitHub Release from the changelog notes
I will not publish anything unless you explicitly approve those actions.
If some actions are unavailable, say why in the same list: Create GitHub Release: unavailable because gh is not authenticated.
Hard stop: Do not create tags, push tags, or create GitHub Releases until the user explicitly approves those publish actions after the commit.
After any approved publish actions, report:
These rules are non-negotiable. Follow them exactly.
Month DD, YYYY (e.g., April 9, 2026)className="prose dark:prose-invert prose-sm", use that exact patternrelease: vX.Y.Z — <brief description>release: v1.15.8 — fix audio upload timeout & improve error messagesrelease: v1.16.0 — add project grouping & bulk actionsrelease: v2.0.0 — redesign API with breaking schema changespackage.json, CHANGELOG.md, and the structured data file must all agreeCHANGELOG.md and a structured data file exist, BOTH must be updatedCHANGELOG.md exists, that's fine — just update itWhen a user says "commit and push" in a project with this skill installed, treat it as an Update Mode trigger. Commit the changelog/version only after approval. Do not push commits. After the commit, ask for explicit approval before tag push or GitHub Release publication.
If git log shows no commits since the last changelog entry and there are no uncommitted changes, inform the user: "No changes found since the last changelog entry (vX.Y.Z on Date). Nothing to update."
If package.json version differs from the latest CHANGELOG.md version, flag it:
"package.json is at vX.Y.Z but the latest changelog entry is vA.B.C. Which should I use as the base?"
If both a .tsx and .json changelog data file exist, update both. Ask the user which is canonical if unclear.
If the user requests a pre-release but does not specify the label, ask whether to use alpha, beta, or rc. If a pre-release label already exists, continue that label by default.
For Python, Rust, Go, or other projects without package.json:
pyproject.toml, Cargo.toml, VERSION)development
Build durable workflows with Vercel Workflow DevKit using "use workflow" and "use step" directives. Use for long-running tasks, background jobs, AI agents, webhooks, scheduled tasks, retries, and workflow orchestration. Supports Next.js, Vite, Astro, Express, Fastify, Hono, Nitro, Nuxt, SvelteKit.
development
Convert documentation websites, GitHub repositories, and PDFs into Claude AI skills. Use when creating Claude skills from docs, scraping documentation, packaging websites into skills, or converting repos/PDFs to Claude knowledge.
development
Generate professional shot lists from screenplays and scripts. Use when user uploads a screenplay (.fountain, .fdx, .txt, .pdf, .docx) or describes scenes for production planning. Parses scripts to extract scenes, helps determine camera setups, shot types, framing, and movement through collaborative discussion, then generates beautifully formatted PDF shot lists for production. Triggers include requests to create shot lists, plan shots, break down scripts for filming, or organize camera coverage.
tools
Convert HuggingFace transformer models to ONNX format for browser inference with Transformers.js and WebGPU. Use when given a HuggingFace model link to convert to ONNX, when setting up optimum-cli for ONNX export, when quantizing models (fp16, q8, q4) for web deployment, when configuring Transformers.js with WebGPU acceleration, or when troubleshooting ONNX conversion errors. Triggers on mentions of ONNX conversion, Transformers.js, WebGPU inference, optimum export, model quantization for browser, or running ML models in the browser.