Help us improve
Share bugs, ideas, or general feedback.
From docs
Generates or updates CHANGELOG.md files by reading git history, with deduplication, categorization, and Keep a Changelog formatting. Works for single repos and monorepos.
npx claudepluginhub dan323/easier-life-skills --plugin docsHow this skill is triggered — by the user, by Claude, or both
Slash command
/docs:changelogsonnetThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Generate and maintain CHANGELOG.md files by combining committed git history with any staged or unstaged changes. Follows the [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) format. Works for single-package repos and monorepos alike.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Applies a firm's KYC/AML rules grid to parsed onboarding records: assigns risk rating, checks required documents, outputs rule outcomes with citations, and routes for escalation.
Designs test strategies and plans with testing pyramid. Covers APIs, frontend, data pipelines, infrastructure; outputs plans including coverage targets, examples, and gaps.
Share bugs, ideas, or general feedback.
Generate and maintain CHANGELOG.md files by combining committed git history with any staged or unstaged changes. Follows the Keep a Changelog format. Works for single-package repos and monorepos alike.
Before doing any work, call TaskCreate for each phase below. Call TaskUpdate (status in_progress) when you begin a phase and TaskUpdate (status completed) when you finish it.
Abort immediately if the current directory is not inside a git repository:
git rev-parse --is-inside-work-tree 2>/dev/null || echo "NOT_GIT"
If the output is NOT_GIT, stop and tell the user: "This skill only works inside a git repository."
git rev-parse --show-toplevel
Look for workspace files or multiple package manifests one level deep:
# Common monorepo signals
ls package.json pnpm-workspace.yaml lerna.json rush.json nx.json \
go.work Cargo.toml pyproject.toml 2>/dev/null
# Count package manifests in subdirectories
find . -maxdepth 3 \( -name "package.json" -o -name "go.mod" \
-o -name "Cargo.toml" -o -name "pyproject.toml" \) \
! -path "*/node_modules/*" ! -path "*/.git/*" | head -30
Monorepo rules:
CHANGELOG.md per package directory.CHANGELOG.md at the repo root.package.json that only contains a "workspaces" key (no "name" / "version") counts as an orchestrator, not a real package.For each target directory (root for single, each package dir for monorepo):
packages/api/CHANGELOG.md).# Extract the most recent SHA that appears in the existing changelog (if any)
grep -oE '[0-9a-f]{7,40}' path/to/CHANGELOG.md 2>/dev/null | head -1
Alternatively, look for version headings (## [1.2.3]) and map them to git tags:
git tag --list | sort -V | tail -5
<sha>..HEAD as the range.Inspect the existing CHANGELOG.md (if present) and classify its format before writing anything.
Keep a Changelog signals (all of the following should be present):
## [Unreleased] or ## [x.y.z] - YYYY-MM-DD heading pattern### Added, ### Fixed, ### Changed, etc.[x.y.z]: https://...Different format signals (any of the following):
## 2024-01-15 or # v1.2.0Decision:
If the file does not exist yet → proceed with Keep a Changelog format, no prompt needed.
If the file exists and matches Keep a Changelog → proceed silently.
If the file exists and uses a different format → stop and ask the user via AskUserQuestion before doing anything else. Use a single-select question with two options:
question: "Your existing CHANGELOG.md uses a different format than Keep a Changelog. How would you like to proceed?"
header: "Format choice"
multiSelect: false
options:
- label: "Keep current format"
description: "Append new entries matching your existing style — no reformatting."
- label: "Switch to Keep a Changelog"
description: "Reformat the file and add new entries in Keep a Changelog format."
Wait for the answer before continuing. Apply the chosen strategy to all changelog files in the same run (don't ask again for each package in a monorepo).
For each target, gather committed and uncommitted changes separately. Skip things like .gitignore, README.md, or other non-code files unless they are relevant to the package directory. The changelog should never self-document its own changes (i.e. ignore commits that only change the CHANGELOG.md file itself).
# Commits touching files under this package directory
git log --no-merges --pretty=format:"%H %s" [<range>] -- <package-dir>/
# For the root / single project
git log --no-merges --pretty=format:"%H %s" [<range>]
Fetch the diff stat per commit to understand which files changed:
git show --stat --no-patch <sha>
Improving vague commit messages: If a commit subject is too generic to be useful in a changelog (e.g. "wip", "fix", "stuff", "updates", "misc", "changes", single words, or anything under ~15 characters), don't use it as-is. Instead, look at what actually changed:
git show --stat <sha> # which files changed
git diff <sha>^ <sha> -- <file> # what changed in a specific file (for small diffs)
Use this context to write a short, informative entry describing what changed rather than copying the commit message. For example, "wip" on src/auth.js might become "Add JWT token validation". Keep entries concise (one line), written from the user's perspective.
# Staged changes
git diff --cached --stat
# Unstaged tracked changes
git diff --stat
# Untracked new files
git ls-files --others --exclude-standard
Group these under a special ## [Unreleased] section.
Before adding any entry, verify it does not already appear in the existing changelog:
Map commit messages (and diff summaries for uncommitted work) to changelog categories using the following heuristics:
| Keywords / Patterns | Category |
|---|---|
feat, add, new, implement | Added |
fix, bug, patch, correct, resolve | Fixed |
change, update, improve, refactor, perf, optimise | Changed |
deprecat | Deprecated |
remov, delet, drop | Removed |
secur, vuln, CVE | Security |
| anything else | Changed |
For Conventional Commits (feat:, fix:, chore:, etc.) use the prefix directly.
git describe --tags --abbrev=0 2>/dev/nullUnreleased for all committed changes as well.[Unreleased].Golden rule: never discard existing content. Every write must be an append/prepend operation on top of what is already there. Use the Edit tool (not Write) when the file already exists.
Template for a new file:
# 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/).
## [Unreleased]
### Added
- Short description of new feature (abc1234)
### Fixed
- Short description of fix (def5678)
## [1.2.0] - 2026-01-15
### Added
- ...
### Changed
- ...
[Unreleased]: https://github.com/owner/repo/compare/v1.2.0...HEAD
[1.2.0]: https://github.com/owner/repo/compare/v1.1.0...v1.2.0
Rules for Keep a Changelog:
- <description> (<7-char-sha>) for committed work; no SHA for uncommitted.### Fixed if there are no fixes).# Changelog header (and its blurb lines, if present), before any existing ## [...] section. Never replace existing sections.## [Unreleased] section already exists in the file, add entries inside it rather than creating a duplicate.# Changelog — <package-name>.Study the existing file to infer its conventions:
Reproduce those conventions exactly for new entries. Prepend the new block at the top of the entry list (after any document title/intro), preserving everything below it verbatim.
If the format uses categories but different names (e.g. "New Features" instead of "Added"), continue using those names.
git remote get-url origin 2>/dev/null
Convert SSH URLs (git@github.com:owner/repo.git) to HTTPS for the comparison links.
After writing the file(s), print a brief summary:
Updated CHANGELOG.md files:
✓ CHANGELOG.md — 3 new entries (2 committed, 1 uncommitted)
✓ packages/api/CHANGELOG.md — 5 new entries (all committed)
No new changes detected in:
— packages/ui/CHANGELOG.md (already up to date)
If no files needed updating, say so clearly rather than creating empty changelogs.