From changelog
Generate or update CHANGELOG.md files by reading git history. Use this skill whenever the user wants to document what changed in their project — whether they say "create a changelog", "update the changelog", "write release notes", "what's new since v1.2", "document changes for this release", "prep the changelog before we ship", or anything else about recording or summarizing code changes for a version or release. Also use it when the user asks to reformat an existing CHANGELOG to Keep a Changelog format. Works for single repos and monorepos. Always prefer this skill over improvising — it handles deduplication, categorization, and format detection correctly.
npx claudepluginhub dan323/easier-life-skills --plugin changelogThis skill uses the workspace's default tool permissions.
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.
Creates new Angular apps using Angular CLI with flags for routing, SSR, SCSS, prefixes, and AI config. Follows best practices for modern TypeScript/Angular development. Use when starting Angular projects.
Generates Angular code and provides architectural guidance for projects, components, services, reactivity with signals, forms, dependency injection, routing, SSR, ARIA accessibility, animations, Tailwind styling, testing, and CLI tooling.
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
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.
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:
"Your existing
CHANGELOG.mduses a different format than Keep a Changelog. How would you like to proceed?
- Keep your current format — I'll append new entries matching your existing style.
- Switch to Keep a Changelog — I'll reformat the file and add new entries in that format.
Please reply with 1 or 2."
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.