changelog-update
Generate changelog entries from commits for any project type
What this skill does
# Changelog Update
## Purpose
Generates changelog entries from git commits, categorizes changes into Added/Changed/Fixed/Breaking sections following configurable changelog format (default: keep-a-changelog), and updates or creates the changelog file for any project type.
## Input Context
Requires:
- **Project Configuration**: Output from `detect-project-type` skill
- **Version**: New version number (e.g., "1.2.0")
- **Custom Message** (optional): User-provided commit message overrides auto-generation
- **Last Tag**: Git tag of previous release (optional)
## Workflow
### 1. Load Changelog Configuration
Use configuration from `detect-project-type`:
- `changelog_file` - Path to changelog file (default: `CHANGELOG.md`)
- `changelog_format` - Format to use (default: `keep-a-changelog`)
- `tag_pattern` - For finding commits since last tag
### 2. Determine Changelog File Path
Use `changelog_file` from configuration:
```bash
changelog_file="CHANGELOG.md" # from config, can be:
# - CHANGELOG.md (standard)
# - HISTORY.md (alternative)
# - CHANGES.rst (Python projects)
# - NEWS.md (GNU projects)
# - {package}/CHANGELOG.md (monorepos)
```
Check if file exists. If not, create with initial structure based on format:
```markdown
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/).
```
### 3. Gather Commits
Get commits since last release tag:
```bash
if [ -n "$last_tag" ]; then
git log ${last_tag}..HEAD --oneline --no-merges
else
# First release - get all commits
git log --oneline --no-merges
fi
```
For monorepo projects, optionally filter commits by package directory:
```bash
# Filter commits that touched this package only
git log ${last_tag}..HEAD --oneline --no-merges -- packages/my-lib/
```
### 3. Categorize Commits
Parse each commit message and categorize:
**Added (new features):**
- `feat:` or `feat(scope):`
- Commit messages starting with "add", "create", "implement"
**Changed (modifications to existing features):**
- Commit messages starting with "update", "modify", "change", "refactor"
- `refactor:` prefix
**Fixed (bug fixes):**
- `fix:` or `fix(scope):`
- Commit messages starting with "fix", "correct", "resolve"
**Breaking Changes:**
- `BREAKING CHANGE:` in body
- `!` after type (e.g., `feat!:`)
- Extract breaking change description from body
**Uncategorized:**
- Other types (`chore:`, `docs:`, `test:`, `style:`) → skip or place in "Changed"
### 4. Format Changelog Entry
Generate entry following this format:
```markdown
## Version {version} - {date}
### Breaking Changes
- Description of breaking change 1
- Description of breaking change 2
### Added
- New feature description 1
- New feature description 2
### Changed
- Change description 1
- Change description 2
### Fixed
- Bug fix description 1
- Bug fix description 2
```
**Formatting rules:**
- Date format: YYYY-MM-DD (use today's date)
- Strip conventional commit prefixes from descriptions
- Capitalize first letter of each entry
- Remove trailing periods
- Skip empty sections
- If custom message provided, use it for the entire entry
### 5. Insert Entry into Changelog
Read existing changelog file, parse structure, and insert new entry:
- Place after the file header (before any existing version entries)
- Preserve all existing entries unchanged
- Maintain consistent formatting (2 blank lines between versions)
### 6. Generate Commit Message
Create a commit message from the changelog content:
```
Release {scope} v{version}
{changelog-entry-body}
Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
```
## Output Format
Return:
```
{
"changelog_path": "plugins/daily-carry/CHANGELOG.md",
"new_entry": "## Version 1.2.0 - 2026-01-12\n\n### Added\n- New deployment skill\n\n### Fixed\n- Version detection logic",
"commit_message": "Release plugin:daily-carry v1.2.0\n\nAdded:\n- New deployment skill\n\nFixed:\n- Version detection logic\n\nCo-Authored-By: Claude Sonnet 4.5 <[email protected]>",
"categories": {
"added": 1,
"changed": 0,
"fixed": 1,
"breaking": 0
},
"file_created": false
}
```
## Examples
### Example 1: Feature and Fix Commits
**Input:**
- Scope: `plugin:daily-carry`
- Version: `1.2.0`
- Last tag: `daily-carry-v1.1.0`
**Commits:**
```
feat: add deploy-otterstack command
fix: correct git push error handling
docs: update README with examples
```
**Generated Entry:**
```markdown
## Version 1.2.0 - 2026-01-12
### Added
- Add deploy-otterstack command
### Fixed
- Correct git push error handling
```
**Output:**
```
{
"changelog_path": "plugins/daily-carry/CHANGELOG.md",
"new_entry": "## Version 1.2.0 - 2026-01-12\n\n### Added\n- Add deploy-otterstack command\n\n### Fixed\n- Correct git push error handling",
"commit_message": "Release plugin:daily-carry v1.2.0\n\nAdded:\n- Add deploy-otterstack command\n\nFixed:\n- Correct git push error handling\n\nCo-Authored-By: Claude Sonnet 4.5 <[email protected]>",
"categories": {
"added": 1,
"changed": 0,
"fixed": 1,
"breaking": 0
},
"file_created": false
}
```
### Example 2: Breaking Change
**Input:**
- Scope: `marketplace`
- Version: `2.0.0`
**Commits:**
```
feat!: change marketplace schema structure
BREAKING CHANGE: marketplace.json now requires plugins array with explicit versions
```
**Generated Entry:**
```markdown
## Version 2.0.0 - 2026-01-12
### Breaking Changes
- marketplace.json now requires plugins array with explicit versions
### Added
- Change marketplace schema structure
```
### Example 3: Custom Message Override
**Input:**
- Scope: `variants`
- Version: `1.2.0`
- Custom message: "Update Android and TypeScript variants with new git workflow patterns"
**Generated Entry:**
```markdown
## Version 1.2.0 - 2026-01-12
- Update Android and TypeScript variants with new git workflow patterns
```
**Commit Message:**
```
Release variants v1.2.0
Update Android and TypeScript variants with new git workflow patterns
Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
```
### Example 4: First Release (No Commits to Parse)
**Input:**
- Scope: `plugin:new-plugin`
- Version: `1.0.0`
- No last tag
**Generated Entry:**
```markdown
## Version 1.0.0 - 2026-01-12
### Added
- Initial release of new-plugin
```
## Error Handling
- **Git errors**: Return error if git log fails
- **File write errors**: Return error if changelog file cannot be written
- **Invalid date**: Use current system date as fallback
- **Empty commits**: Generate minimal entry with "Initial release" or "Version bump"
## Integration Notes
This skill is invoked by the `/release` command in Phase 3. The command will:
1. Display the generated changelog entry
2. Allow user to edit before finalizing
3. Use the commit message for git operations in Phase 6
Related in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.