changelog
Skill1 starsChanged 7 months agoApache-2.0View on GitHub
This skill should be used when the user asks to "update the changelog", "add changelog entries", "generate release notes", "document recent changes", "write a changelog", "summarize recent changes", "prepare a release", "clean up the changelog", "consolidate changelog entries", "tidy the changelog", "create a changelog", "draft release notes", or says /changelog. It adds entries to CHANGELOG.md following Keep a Changelog format by analyzing git history and uncommitted changes, categorizing them into Added, Changed, Deprecated, Removed, Fixed, and Security sections. It can also consolidate existing entries to remove duplicates and superseded items.
160 other projects use a version of this, 2 of them edited.
Adopted by
Most recently taken up by
- morethanwords/twebtheir own version, first seen Nov 9, 2026
- 27Aaron/skillstheir own version, first seen Nov 8, 2026
- computerlovetech/skillstheir own version, first seen Nov 8, 2026
- ainurdev/mystical-assistanttheir own version, first seen Nov 8, 2026
- RodrigoAnciaes/golem-sddtheir own version, first seen Nov 8, 2026
- itsryanarmani/skillstheir own version, first seen Nov 8, 2026
Used with
Projects with it also use playtest-report, soak-test and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
CoralGameSkillplaytest-report
Generates a structured playtest report template or analyzes existing playtest notes into a structured format. Use this to standardize playtest feedback collection and analysis.
Also in 12 projects that use this
lilangMaxSkillsoak-test
Generate a soak test protocol for extended play sessions. Defines what to observe, measure, and log during long play sessions to surface slow leaks, fatigue effects, and edge cases that only appear after sustained play. Primarily used in Polish and Release phases.
Also in 9 projects that use this
lilangMaxSkillteam-live-ops
Orchestrate the live-ops team for post-launch content planning: coordinates live-ops-designer, economy-designer, analytics-engineer, community-manager, writer, and narrative-director to design and plan a season, event, or live content update.
Also in 9 projects that use this
CoralGameSkillteam-polish
Orchestrate the polish team: coordinates performance-analyst, technical-artist, sound-designer, and qa-tester to optimize, polish, and harden a feature or area for release quality.
Also in 14 projects that use this
- +5 more from lilangMax
- +3 more from CoralGame
Other versions160 projects use a version of this.
Word for word · 0
None found.
Edited · 2
- kasperjunge/agent-resources-legacy★ 910% same
- sissc0731/claude-code-skills★ 024% same
Wrote their own version · 158
- meteor/meteor★ 45ksame name
- Donchitos/Claude-Code-Game-Studios★ 27ksame name
- MaaAssistantArknights/MaaAssistantArknights★ 24ksame name
- pipecat-ai/pipecat★ 17ksame name
- elie222/inbox-zero★ 13ksame name
- hashicorp/terraform-provider-aws★ 11ksame name
- JetBrains/ideavim★ 10ksame name
- BuilderIO/agent-native★ 7.6ksame name
- UnigramDev/Unigram★ 5.5ksame name
- entireio/cli★ 5.3ksame name
148 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
The file
Show its rules and text
We split this skill into the rules it gives an agent
45 rules. 0 are common, 33 are distinctive, and 12 are very specific to this project.
0
Common
Most of the 149 edited versions we read keep these.
33
Distinctive
This author's own choices. Worth a look.
12
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 38
consolidate: Run housekeeping on the existing changelog — merge duplicates, remove stale entries superseded by newer ones, and tighten … - Very specific: line 81
Dates: use ISO 8601 format: YYYY-MM-DD
- Distinctive: line 85
Entries are for humans: write clear, concise descriptions of what changed and why it matters, not raw commit messages
- Very specific: line 101
When a commit includes a scope (e.g., feat(api): add endpoint), use the scope as component context in the entry (e.g., "Add API endpoint").
- Very specific: line 105
If a commit both adds and removes user-visible functionality, categorize by the primary intent (e.g., feat: replace old auth with OAuth is …
- Distinctive: line 106
If a refactor removes user-visible features or endpoints, categorize as Removed, not Changed
- Distinctive: line 107
If a performance improvement noticeably changes user experience (e.g., faster page loads), categorize as Changed
- Distinctive: line 114
If creating, add the standard header.
- Very specific: line 117
If the changelog has an ## [Unreleased] section and no version argument was given, use it.
- Very specific: line 118
If a version argument was given, find or create ## [version] - YYYY-MM-DD.
- Very specific: line 119
If no [Unreleased] exists and no version given, create ## [Unreleased] below the header.
- Very specific: line 123
If no tags exist, fall back to parsing the latest ## [x.y.z] heading in the changelog to identify the last documented version, then use git …
- Distinctive: line 124
If neither tags nor changelog versions exist, limit to the last 50 commits to avoid excessive analysis.
- Distinctive: line 125
Run git log --no-merges to get commits within the determined scope.
- Distinctive: line 126
Run git diff against the last version tag if available.
- Distinctive: line 127
Run git diff --cached to collect staged but uncommitted changes.
- Distinctive: line 128
Run git diff (no arguments) to collect unstaged changes in the working tree.
- Distinctive: line 133
Read diffs for commits without clear type prefixes.
- Distinctive: line 139
Use clear, human-readable language.
- Distinctive: line 140
Start each entry with an imperative verb matching the section: Add, Change, Deprecate, Remove, Fix, Secure.
- Distinctive: line 144
Don't include commit hashes or author names.
- Distinctive: line 147
Add section headers only for sections that have entries.
- Distinctive: line 148
Place new entries in the target section.
- Distinctive: line 150
Don't modify existing entries.
- Distinctive: line 153
Run git remote get-url origin to detect the repository URL.
- Distinctive: line 158
Add link references at the bottom of the changelog:
- Very specific: line 163
If there are no prior tags, use the initial commit hash as the base for the [Unreleased] link.
- Distinctive: line 164
Update existing link references when adding new versions.
- Distinctive: line 169
Exception — malformed changelog: If the existing file cannot be parsed (missing headers, broken markdown structure, unparseable version …
- Very specific: line 173
When invoked with consolidate (or when the user asks to "clean up the changelog", "consolidate entries", "tidy the changelog"), run a …
- Distinctive: line 177
Detect superseded entries: When a later entry makes an earlier one obsolete, remove the stale one.
- Very specific: line 184
Preserve version boundaries: Never move entries between versioned sections (## [x.y.z]).
- Distinctive: line 253
Malformed changelog: If the existing file cannot be parsed (missing headers, broken markdown structure, unparseable version sections), stop …
- Distinctive: line 254
Git command failures: If git log or git diff fails, report the error and stop rather than producing incomplete entries
- Distinctive: line 255
No changes in scope: If scope detection finds zero commits and no uncommitted changes, inform the user — do not add empty sections
- Distinctive: line 259
Raw commit messages: Don't paste commit messages verbatim.
- Distinctive: line 260
Empty sections: Don't include section headers with no entries
- Very specific: line 261
Overwriting: Never modify or delete existing changelog entries during normal operation (adding new entries).
- Distinctive: line 263
Duplicate entries: Check existing entries before adding new ones
- Distinctive: line 264
Unbounded history: Don't analyze the entire git history when there are no tags — cap at 50 commits
- Distinctive: line 265
CI/docs noise: Don't add entries for commits that only change CI config, linting rules, or documentation unless user-visible
- Distinctive: line 266
Future tense: Write entries as completed actions ("Add support for X"), not future plans ("Will add support for X")
- Distinctive: line 267
Unmarked breaking changes: Always clearly mark breaking changes (e.g., prefix with "BREAKING:")
- Distinctive: line 268
Stale comparison links: When adding a new version, update all comparison link references at the bottom of the file
- Distinctive: line 269
Unnecessary confirmation prompts: Don't ask for approval before writing — auto-apply is the default.
“Common” is measured: kept by at least 6 in 10 of the 149 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
/changelog — Update Changelog from Recent Changes
Adds entries to a CHANGELOG.md file following the Keep a Changelog format by analyzing git history and uncommitted changes.
Tools
- Bash — Run
git log,git tag,git diff,git diff --cached,git status, andgit remotecommands - Read — Read the existing
CHANGELOG.md - Edit — Insert new entries into the changelog (preferred for updates)
- Write — Create
CHANGELOG.mdfrom scratch when it doesn't exist
Arguments
The skill accepts an optional argument string:
- No argument: Analyze commits since the last changelog entry or tag and add entries to
## [Unreleased] - Version string (e.g.,
1.2.0): Add entries under## [1.2.0] - YYYY-MM-DDusing today's date unreleased: Explicitly target the## [Unreleased]sectionconsolidate: Run housekeeping on the existing changelog — merge duplicates, remove stale entries superseded by newer ones, and tighten wording (see Housekeeping)
Changelog Format
The file MUST follow Keep a Changelog 1.1.0:
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Added
- New feature description
### Changed
- Modified behavior description
### Deprecated
- Soon-to-be removed feature
### Removed
- Deleted feature description
### Fixed
- Bug fix description
### Security
- Vulnerability fix description
## [1.0.0] - 2024-01-15
### Added
- Initial release featuresRules
- Section order is fixed: Added, Changed, Deprecated, Removed, Fixed, Security — never reorder or alphabetize
- Dates use ISO 8601 format:
YYYY-MM-DD - Latest version appears first, just below
[Unreleased] - Only include sections that have entries (don't add empty sections)
- Each entry is a bullet point starting with
- - Entries are for humans: write clear, concise descriptions of what changed and why it matters, not raw commit messages
- Group related commits into a single entry when they address the same change
- Don't duplicate entries already present in the changelog
Commit-to-Section Mapping
| Commit Signal | Section |
feat:, feat(scope):, new files, new modules, new API endpoints | Added |
refactor:, perf:, behavior changes, API changes | Changed |
Deprecation notices, deprecated in message | Deprecated |
Deleted files, removed features, remove in message | Removed |
fix:, fix(scope):, bug fixes, error corrections | Fixed |
security:, vulnerability patches, dependency security updates | Security |
feat!:, fix!:, BREAKING CHANGE: in footer | Prefix entry with "BREAKING:" |
When a commit includes a scope (e.g., feat(api): add endpoint), use the scope as component context in the entry (e.g., "Add API endpoint"). When a commit doesn't clearly map to a type, read the diff to determine the appropriate section.
Decision Rules for Ambiguous Cases
- If a commit both adds and removes user-visible functionality, categorize by the primary intent (e.g.,
feat: replace old auth with OAuthis Added, not Removed) - If a refactor removes user-visible features or endpoints, categorize as Removed, not Changed
- If a performance improvement noticeably changes user experience (e.g., faster page loads), categorize as Changed
- Skip docs-only commits (
README.md,CONTRIBUTING.md) unless they document a user-visible change (e.g., correcting a license is Fixed) Initial commitmessages: skip if the changelog is being created retroactively for an established project; include as Added if this is genuinely a new project with meaningful initial functionality
Execution Steps
- Find or create
CHANGELOG.mdin the repository root.- If creating, add the standard header.
- Determine the target section:
- If the changelog has an
## [Unreleased]section and no version argument was given, use it. - If a version argument was given, find or create
## [version] - YYYY-MM-DD. - If no
[Unreleased]exists and no version given, create## [Unreleased]below the header.
- If the changelog has an
- Collect recent changes:
- Determine scope using git tags first: find the most recent tag matching
v*or semver pattern. - If no tags exist, fall back to parsing the latest
## [x.y.z]heading in the changelog to identify the last documented version, then usegit logfrom that point. - If neither tags nor changelog versions exist, limit to the last 50 commits to avoid excessive analysis. The user can override scope by providing a commit range or tag as argument.
- Run
git log --no-mergesto get commits within the determined scope. - Run
git diffagainst the last version tag if available. - Run
git diff --cachedto collect staged but uncommitted changes. - Run
git diff(no arguments) to collect unstaged changes in the working tree. - Combine committed and uncommitted changes. When the only source is uncommitted changes (no new commits in scope), still generate entries from those changes.
- Determine scope using git tags first: find the most recent tag matching
- Analyze and categorize:
- Parse commit messages for type prefixes (
feat:,fix:, etc.). - Read diffs for commits without clear type prefixes.
- Group related commits into single entries.
- Skip merge commits and changelog-only commits.
- Skip commits that only touch CI config, documentation, or non-user-facing files (e.g.,
.github/,README.md,CHANGELOG.md) unless they represent meaningful user-visible changes.
- Parse commit messages for type prefixes (
- Write entries:
- Use clear, human-readable language.
- Start each entry with an imperative verb matching the section: Add, Change, Deprecate, Remove, Fix, Secure.
- Include relevant context (what component, what behavior).
- Prefix breaking changes with BREAKING: (detect via
!suffix on commit type, e.g.feat!:, orBREAKING CHANGE:in commit footer). - Order entries within a section by significance: most impactful changes first.
- Don't include commit hashes or author names.
- Insert into the changelog:
- Add section headers only for sections that have entries.
- Place new entries in the target section.
- Preserve all existing content below.
- Don't modify existing entries.
- Generate comparison links:
- Run
git remote get-url originto detect the repository URL. - Detect the hosting platform from the remote URL hostname and generate platform-appropriate links:
- GitHub (
github.com):https://github.com/user/repo/compare/v1.0.0...HEAD - GitLab (
gitlab.comor self-hosted):https://gitlab.com/user/repo/-/compare/v1.0.0...HEAD - Bitbucket (
bitbucket.org):https://bitbucket.org/user/repo/branches/compare/HEAD..v1.0.0
- GitHub (
- Add link references at the bottom of the changelog:
[Unreleased]: https://github.com/user/repo/compare/v1.0.0...HEAD [1.0.0]: https://github.com/user/repo/compare/v0.9.0...v1.0.0 - If there are no prior tags, use the initial commit hash as the base for the
[Unreleased]link. - Update existing link references when adding new versions.
- Skip this step if the remote URL cannot be parsed or is not available.
- Run
- Write to the changelog — auto-apply by default:
- Apply the changes directly using Edit (or Write for new files) without asking for confirmation.
- Exception — malformed changelog: If the existing file cannot be parsed (missing headers, broken markdown structure, unparseable version sections), stop and use AskUserQuestion to show the user what's wrong and ask how to proceed before overwriting.
Housekeeping
When invoked with consolidate (or when the user asks to "clean up the changelog", "consolidate entries", "tidy the changelog"), run a housekeeping pass on the existing CHANGELOG.md:
- Scan for duplicates: Find entries across sections that describe the same change in different words (e.g., "Add retry logic to API client" and "Add automatic retries for failed API requests"). Merge them into the strongest single entry, keeping it in the most appropriate section.
- Detect superseded entries: When a later entry makes an earlier one obsolete, remove the stale one. Common patterns:
- A feature was added, then rewritten — keep only the rewrite (or the final state).
- A bug was fixed, then the fix was reverted and re-fixed differently — keep only the final fix.
- A deprecation notice followed by actual removal — keep the removal, drop the deprecation (unless they're in different version sections).
- Tighten wording: Shorten verbose entries without losing meaning. Each entry should be one concise line.
- Preserve version boundaries: Never move entries between versioned sections (
## [x.y.z]). Housekeeping within## [Unreleased]is unrestricted. Within versioned sections, only merge duplicates and tighten wording — do not delete entries. - Apply changes: Apply the consolidated entries directly using Edit without asking for confirmation. The same malformed-changelog exception from step 8 applies here.
Examples
Example 1: Adding to Unreleased
Before:
## [Unreleased]
### Fixed
- Resolve timeout on large file uploadsAfter running /changelog:
## [Unreleased]
### Added
- Support for WebSocket connections in the API gateway
### Fixed
- Resolve timeout on large file uploads
- Correct off-by-one error in pagination logicExample 2: Creating a versioned release
Running /changelog 2.1.0:
## [2.1.0] - 2026-04-20
### Added
- Bulk import endpoint for market data
- Rate limiting middleware with configurable thresholds
### Changed
- Upgrade authentication flow to use PKCE
### Fixed
- Memory leak in connection pool during high trafficExample 3: Creating changelog from scratch
Running /changelog in a repo without CHANGELOG.md:
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Added
- Initial project setup with CLI interface
- Configuration file support
- Logging framework integrationError Handling
Handle these conditions gracefully:
- Not a git repository: Inform user and stop — do not attempt to create a changelog without git history
- Invalid version argument: Validate that the argument matches semver (
X.Y.Z); reject with a clear message if not - Malformed changelog: If the existing file cannot be parsed (missing headers, broken markdown structure, unparseable version sections), stop and use AskUserQuestion to show the user what's wrong and ask how to proceed before overwriting
- Git command failures: If
git logorgit difffails, report the error and stop rather than producing incomplete entries - No changes in scope: If scope detection finds zero commits and no uncommitted changes, inform the user — do not add empty sections
Anti-Patterns
- Raw commit messages: Don't paste commit messages verbatim; rewrite for humans
- Empty sections: Don't include section headers with no entries
- Overwriting: Never modify or delete existing changelog entries during normal operation (adding new entries). The only exception is
consolidatemode, which explicitly merges and cleans up entries - Implementation details: Focus on user-visible changes, not internal refactoring noise
- Duplicate entries: Check existing entries before adding new ones
- Unbounded history: Don't analyze the entire git history when there are no tags — cap at 50 commits
- CI/docs noise: Don't add entries for commits that only change CI config, linting rules, or documentation unless user-visible
- Future tense: Write entries as completed actions ("Add support for X"), not future plans ("Will add support for X")
- Unmarked breaking changes: Always clearly mark breaking changes (e.g., prefix with "BREAKING:")
- Stale comparison links: When adding a new version, update all comparison link references at the bottom of the file
- Unnecessary confirmation prompts: Don't ask for approval before writing — auto-apply is the default. Only stop and ask when the existing changelog is malformed and can't be parsed safely
- Cross-version consolidation: During housekeeping, never move or delete entries from versioned release sections — only consolidate within
[Unreleased]
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

