Automatically append a summary of every completed Claude Code task to CHANGELOG.md, following Keep a Changelog 1.1.0 conventions (https://keepachangelog.com/en/1.1.0/). Trigger this skill at the END of EVERY prompt turn in Claude Code, without exception, after all file changes or actions have been completed. This includes: creating files, editing code, running commands, refactoring, fixing bugs, adding features, modifying configs, writing tests, or any other meaningful action. Even if the task was small (e.g. a one-line fix), still log it. The only exception is when the prompt produced zero file changes and zero observable side-effects (e.g. a pure read/explain request).
Write a concise, human-readable entry to CHANGELOG.md after every
Claude Code task that produces observable changes.
Run after finishing the main task, as the very last step of a turn. Skip only when:
CHANGELOG.md itself (avoid
recursive entries).CHANGELOG.md# From the project root:
ls CHANGELOG.md 2>/dev/null || echo "MISSING"
If missing, create it with this exact header:
# 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]
Map what was done to one or more Keep a Changelog subsection types:
| Type | Use when… |
|---|---|
Added | New files, features, endpoints, components, commands |
Changed | Modified existing behaviour, refactors, renames, updates |
Deprecated | Something marked for removal in a future release |
Removed | Files deleted, features removed, dead code cleaned up |
Fixed | Bug fixes, error handling, typo corrections |
Security | Vulnerability patches, dependency security upgrades |
A single turn may produce entries in multiple subsections.
Locate the ## [Unreleased] section (always the first version block).
Insert new bullets at the top of the appropriate subsection(s),
creating the subsection heading if it doesn't already exist.
Format rules:
- <imperative-verb> <what> [in/for <scope>] [– <why/impact>]Good examples:
### Added
- Add `UserCard` component with avatar, name, and role fields
- Add `/api/v1/health` endpoint returning JSON status
### Fixed
- Fix null-pointer crash in `AuthService.login` when token is expired
### Changed
- Refactor `database.ts` connection pool to use async/await throughout
- Update `prettier` to v3 and apply new formatting rules project-wide
### Removed
- Remove deprecated `legacyMode` flag from CLI options
Bad examples (avoid):
- Claude added a new file ← references AI
- Made some changes to the code ← vague
- Fixed stuff ← vague
- feat: add user card ← git commit style, not changelog style
Use str_replace (preferred) or a targeted sed/awk script.
Never rewrite the entire file; only insert the new bullets.
Pattern with str_replace — insert a new subsection under
[Unreleased] when that subsection doesn't exist yet:
## [Unreleased]
→
## [Unreleased]
### Added
- Add …
When ## [Unreleased] already has the target subsection, insert the
bullet(s) immediately after the subsection heading line.
After writing, quickly read back the modified section to confirm:
## [Unreleased] → ### Added …)[Unreleased] section accumulates changes until a release is
cut — never add a date to it.[Unreleased] to [x.y.z] - YYYY-MM-DD and
open a fresh [Unreleased] above it.YYYY-MM-DD) when versioned releases are created.[Unreleased]: …compare/vX…HEAD)
are optional but recommended; add them when a git remote is known.# 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
- …
### Changed
- …
### Fixed
- …