skills/changelog-generator/SKILL.md
Parse git history and produce or update a CHANGELOG.md following the Keep a Changelog convention. Supports Conventional Commits, basic prefix conventions, and unstructured commit messages. Intelligently categorizes changes, detects breaking changes, links to PRs/issues, and handles both initial generation and incremental updates. **Triggers — use this skill when:** - User asks to "generate", "create", "update", or "write" a changelog - User mentions "CHANGELOG", "changelog", "release notes" - User says "document changes", "what changed since last release" - User wants to "prepare a release" and needs a changelog entry - User asks to "clean up" or "reformat" an existing changelog **Covers:** Any git-based project. Handles Conventional Commits (feat/fix/chore), Angular convention, basic prefixes (Add/Fix/Remove), and freeform commit messages. Outputs Keep a Changelog format with optional Common Changelog enhancements.
npx skillsauth add espennilsen/pi changelog-generatorInstall 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.
Parse a project's git history and produce a high-quality CHANGELOG.md following the Keep a Changelog convention.
A changelog is for humans, not machines. It answers: "What meaningful changes happened between version X and version Y?" Raw commit logs fail at this because they contain noise — typo fixes, merge commits, CI tweaks, and refactors that don't affect users. This skill filters signal from noise and writes entries that a user or contributor can actually understand.
Before generating anything, understand the project's commit and versioning patterns.
# 1. Check if we're in a git repo
git rev-parse --is-inside-work-tree 2>/dev/null
# 2. Get all tags (versions) sorted by date
git tag --sort=-creatordate | head -30
# 3. Detect versioning scheme
# SemVer: v1.2.3 or 1.2.3
# CalVer: 2025.01, 2025-01-15
# Other: named releases, build numbers
git tag --sort=-creatordate | head -10
# 4. Detect commit convention
# Sample recent commits to identify the pattern
git log --oneline -30
# 5. Check for existing changelog
cat CHANGELOG.md 2>/dev/null
cat HISTORY.md 2>/dev/null
cat CHANGES.md 2>/dev/null
# 6. Check for existing config that hints at convention
cat .commitlintrc* commitlint.config.* 2>/dev/null # Commitlint
cat .czrc .cz.toml 2>/dev/null # Commitizen
cat cliff.toml 2>/dev/null # git-cliff
cat .versionrc* 2>/dev/null # standard-version
# 7. Get remote URL for PR/issue links
git remote get-url origin 2>/dev/null
# 8. Package manifest for current version
cat package.json 2>/dev/null | grep '"version"'
cat pyproject.toml 2>/dev/null | grep 'version'
cat Cargo.toml 2>/dev/null | grep '^version'
Extract from the analysis:
| Fact | How to determine |
|------|-----------------|
| Commit convention | Pattern match on recent commits (see detection rules below) |
| Versioning scheme | Tag format analysis |
| Latest version/tag | Most recent tag |
| Remote URL | git remote get-url origin — needed for PR/issue links |
| Existing changelog | Check for CHANGELOG.md or variants |
| Unreleased commits | Commits since the latest tag |
Analyze the last 30–50 commits to detect which convention is in use. Apply these rules in order:
Conventional Commits / Angular
Pattern: ^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\(.+\))?!?:
Example: feat(auth): add OAuth2 support
Example: fix!: resolve race condition in queue
→ If >50% of commits match this pattern, use Conventional Commits parsing.
Basic Prefix
Pattern: ^(Add|Fix|Remove|Update|Change|Deprecate|Security)[: ]
Example: Add user export feature
Example: Fix login redirect loop
→ If >50% of commits match this pattern, use basic prefix parsing.
Freeform / No Convention → If neither pattern dominates, use AI-assisted categorization (see Phase 3).
Report the detected convention to the user before proceeding.
Extract commits for the target range and categorize them.
# All commits since last tag (for Unreleased section)
git log $(git describe --tags --abbrev=0 2>/dev/null)..HEAD \
--pretty=format:"%H|%s|%b|%an|%ae|%aI" 2>/dev/null
# Commits between two tags (for a specific version)
git log v1.1.0..v1.2.0 \
--pretty=format:"%H|%s|%b|%an|%ae|%aI"
# If no tags exist, get all commits
git log --pretty=format:"%H|%s|%b|%an|%ae|%aI"
# Get PR/merge info if available
git log --merges --oneline -20
Map commits to Keep a Changelog categories:
| Keep a Changelog Category | Conventional Commits types | Basic prefixes | Description |
|---------------------------|---------------------------|----------------|-------------|
| Added | feat | Add, Create, Implement | New features |
| Changed | refactor, perf, style | Change, Update, Refactor, Improve | Changes to existing functionality |
| Deprecated | — (detect from message) | Deprecate | Soon-to-be removed features |
| Removed | — (detect from message) | Remove, Delete, Drop | Removed features |
| Fixed | fix | Fix, Resolve, Correct | Bug fixes |
| Security | — (detect from message) | Security | Vulnerability fixes |
Do NOT include these in the changelog unless they have user-facing impact:
Merge branch..., Merge pull request...) — extract the PR title insteadci:, build:, changes only to .github/workflows/)chore:, dependency bumps without breaking changes)style: that don't affect behavior)chore: bump version to...)When commits don't follow a convention, categorize by analyzing the message content:
Flag breaking changes regardless of convention:
! after type/scope, or BREAKING CHANGE: in footerMark breaking entries with BREAKING: prefix in the changelog.
Transform raw commit data into human-readable changelog entries.
(#123), ([#123](url))(@username) for non-core contributors- Add dark mode support with automatic system preference detection (#142)
- **BREAKING:** Remove deprecated `v1/users` endpoint; use `v2/users` instead (#138)
- Fix memory leak in WebSocket connection handler (#145)
# 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
- Description of new feature (#PR)
### Fixed
- Description of bug fix (#PR)
## [1.2.0] - 2025-09-15
### Added
- Add OAuth2 authentication support (#89)
- Add CSV export for user data (#92)
### Changed
- Improve query performance for large datasets (#91)
### Fixed
- Fix timezone handling in scheduled reports (#88)
- Fix incorrect pagination count on filtered results (#90)
### Removed
- **BREAKING:** Remove legacy XML API endpoint (#87)
## [1.1.0] - 2025-06-01
### Added
- ...
[Unreleased]: https://github.com/user/repo/compare/v1.2.0...HEAD
[1.2.0]: https://github.com/user/repo/compare/v1.1.0...v1.2.0
[1.1.0]: https://github.com/user/repo/compare/v1.0.0...v1.1.0
# Changelog — only one H1## [1.2.0] - 2025-09-15 — square brackets around version, ISO date### Added, ### Changed, etc. — only use categories that have entriesYYYY-MM-DD — no exceptionsNo existing changelog. Generate the full history.
# Get tags in chronological order
git tag --sort=creatordate
# Get date of a tag
git log -1 --format=%aI v1.0.0
A CHANGELOG.md already exists. Add new entries.
## [Unreleased] (or at the top if no Unreleased)Never modify existing entries unless the user explicitly asks for a reformat.
User has a messy or inconsistent changelog. Rewrite to match the standard.
User wants to create a changelog entry for an upcoming release.
## [Unreleased] to the new version sectionIf the project has no tags, treat all commits as unreleased. Ask the user if they want to:
## [Unreleased] section## [0.1.0] retroactively from the initial commitIf the project is a monorepo with multiple packages:
git log -- packages/package-name/If the project uses squash merges, the PR title becomes the commit message. These are often well-written and can be used directly as changelog entries.
If there are >500 commits to process:
For projects that haven't reached 1.0:
After generating, verify:
# Changelog)## [X.Y.Z] - YYYY-MM-DD### Added, ### Changed, etc.git log --oneline. Curate and rewrite.The final output should be:
Always write the changelog as a file so the user can review and commit it directly.
tools
# pi-a2a Long-Running Tasks Skill ## Overview The pi-a2a extension supports **long-running tasks** that can execute for hours or days without timeouts. This is essential for: - Data processing pipelines - Batch operations - Research and aggregation tasks - External API jobs with unpredictable duration - Any A2A task that exceeds the standard timeout ## When to Use **Use long-running tasks when:** - Task execution time is unpredictable or known to exceed 10 minutes - The remote agent is proc
development
Orchestrate cmux terminal panes — split terminals, run parallel processes, read output from other panes, and use the built-in browser. Use when working inside cmux and you need to run a dev server, watch tests, spawn sub-agents, or preview web pages.
testing
Review UI designs and implementations for accessibility, consistency, usability, and visual quality. Use when asked to review a design, audit accessibility, check UI consistency, compare implementation against mockups, or evaluate a user interface.
tools
Create, review, and improve skills for Pi agents. A skill is a folder with a SKILL.md that teaches an agent specialized workflows, domain knowledge, or tool integrations. Use when asked to create a new skill, improve an existing skill, review a skill for quality, scaffold a skill from a workflow, or convert documentation into a skill. Also triggers on "make a skill for", "build a skill", "skill for [topic]", "teach the agent to", or "package this workflow as a skill".