293 lines
6.8 KiB
Markdown
293 lines
6.8 KiB
Markdown
---
|
||
description: Update existing CHANGELOG.md with new entries from recent commits
|
||
---
|
||
|
||
# Update Changelog
|
||
|
||
## Objective
|
||
|
||
Update existing CHANGELOG.md with new version entries based on recent git commits, maintaining standards and proper version sequencing.
|
||
|
||
## Activated Skills
|
||
|
||
1. **`changelog-standards`** (document-generator) - changelog format and structure
|
||
2. **`version-validation`** (document-generator) - Versioning rules and validation
|
||
3. **`git-history-analysis`** (document-generator) - Git commit parsing patterns
|
||
|
||
## Parameters
|
||
|
||
- `--path` (optional): Changelog location (auto-detects if not specified)
|
||
- `--style` (optional): Inherit from existing changelog or specify `standard`/`detailed`
|
||
- `--since` (optional): Git ref to start from (default: last version tag or last changelog entry)
|
||
- `--new-version` (optional): Version for new release (auto-increment if not provided)
|
||
- `--tier` (optional): Update tier annotation (Prototype, MVP, Production)
|
||
- `--draft` (optional): Add to [Unreleased] section instead of creating versioned release
|
||
|
||
## Process
|
||
|
||
### 1. Locate and Read Changelog
|
||
|
||
Locate changelog file:
|
||
- If `--path` specified: Use that location
|
||
- Otherwise auto-detect from standard locations:
|
||
- `CHANGELOG.md` (root)
|
||
- `docs/CHANGELOG.md`
|
||
- `docs/changelog/YYYY.md` (current year)
|
||
- Search for `**/CHANGELOG.md` or `**/changelog/*.md`
|
||
|
||
If not found:
|
||
```
|
||
❌ No CHANGELOG.md found
|
||
|
||
Run /document-generator:generate-changelog to create one first.
|
||
```
|
||
|
||
Read and parse existing changelog:
|
||
- Extract current version
|
||
- Detect version type (SemVer vs CalVer)
|
||
- Identify format (single-file vs yearly)
|
||
- Detect style (standard vs detailed) from existing structure
|
||
|
||
### 2. Determine Commit Range
|
||
|
||
**Find last version**:
|
||
```bash
|
||
# From changelog
|
||
grep -E "^## \[" CHANGELOG.md | head -n 2 | tail -n 1
|
||
|
||
# From git tags
|
||
git describe --tags --abbrev=0 2>/dev/null
|
||
```
|
||
|
||
**Get commits since last version**:
|
||
```bash
|
||
# If last tag exists
|
||
git log LAST_TAG..HEAD --no-merges --pretty=format:"%h|%s|%ad" --date=short
|
||
|
||
# If no tags (first release since changelog creation)
|
||
git log --since="$(git log -1 --format=%ai CHANGELOG.md)" --no-merges --pretty=format:"%h|%s|%ad" --date=short
|
||
```
|
||
|
||
If no new commits:
|
||
```
|
||
ℹ️ No new commits since last version
|
||
|
||
Changelog is up-to-date.
|
||
```
|
||
|
||
### 3. Analyze New Commits
|
||
|
||
Parse commit messages, categorize into sections, filter noise, group related changes, and transform to user-facing language.
|
||
|
||
**Extract PR/issue numbers** from commit messages to include as links.
|
||
|
||
### 4. Determine New Version
|
||
|
||
**If `--new-version` specified**: Use that (validate with `version-validation` skill)
|
||
|
||
**If `--draft` flag**: Add to [Unreleased] section
|
||
|
||
**Otherwise, auto-increment**:
|
||
|
||
**For SemVer**:
|
||
- If "feat" or "Added" entries → Increment MINOR (2.1.0 → 2.2.0)
|
||
- If only "fix" or "Fixed" entries → Increment PATCH (2.1.0 → 2.1.1)
|
||
- If breaking changes detected → Suggest MAJOR (2.1.0 → 3.0.0)
|
||
|
||
**For CalVer (Year.Minor)**:
|
||
- Same year → Increment MINOR (2025.1 → 2025.2)
|
||
- New year → Reset to YEAR.1 (2024.5 → 2025.1)
|
||
|
||
**Ask user for confirmation**:
|
||
```
|
||
Based on commits, I suggest version: [suggested-version]
|
||
|
||
Changes detected:
|
||
- X new features (Added)
|
||
- Y bug fixes (Fixed)
|
||
- Z improvements (Changed)
|
||
|
||
What version should I use?
|
||
1. [suggested-version] (recommended)
|
||
2. Specify custom version
|
||
3. Add to [Unreleased] instead
|
||
```
|
||
|
||
### 5. Insert New Version Section
|
||
|
||
Format new entry based on detected or specified style:
|
||
|
||
**Standard style**:
|
||
```markdown
|
||
## [NEW_VERSION] - YYYY-MM-DD [TIER]
|
||
|
||
### Added
|
||
- Feature description (#PR)
|
||
|
||
### Changed
|
||
- Improvement description (#PR)
|
||
|
||
### Fixed
|
||
- Bug fix (#PR)
|
||
```
|
||
|
||
**Detailed style**:
|
||
```markdown
|
||
## [NEW_VERSION] - YYYY-MM-DD [TIER]
|
||
|
||
### Highlights
|
||
- Major capability added
|
||
- Significant improvement made
|
||
|
||
### Detailed Notes
|
||
|
||
#### Added
|
||
- Feature with technical context (#PR)
|
||
|
||
#### Changed
|
||
- Change with rationale (#PR)
|
||
|
||
#### Fixed
|
||
- Fix with context (#PR)
|
||
```
|
||
|
||
**Insert location**:
|
||
- After "## [Unreleased]" section
|
||
- Before previous version entries
|
||
- Maintain reverse chronological order
|
||
|
||
**Update [Unreleased] section**:
|
||
- Remove entries that moved to new version
|
||
- Keep any remaining draft entries
|
||
|
||
### 6. Update Version Comparison Links
|
||
|
||
At bottom of changelog, add/update links:
|
||
|
||
```markdown
|
||
[NEW_VERSION]: https://github.com/ORG/REPO/compare/vOLD_VERSION...vNEW_VERSION
|
||
[OLD_VERSION]: https://github.com/ORG/REPO/compare/vPREV_VERSION...vOLD_VERSION
|
||
```
|
||
|
||
Extract repo URL from:
|
||
```bash
|
||
git config --get remote.origin.url
|
||
```
|
||
|
||
### 7. Write Updated Changelog
|
||
|
||
Validate with `version-validation` skill:
|
||
- Version format correct
|
||
- Chronological ordering maintained
|
||
- No version skips
|
||
- Dates are valid
|
||
|
||
Write updated file back to original location.
|
||
|
||
### 8. Provide Guidance
|
||
|
||
```
|
||
✓ Updated CHANGELOG.md with version NEW_VERSION
|
||
|
||
Changes:
|
||
- Added: X entries
|
||
- Changed: Y entries
|
||
- Fixed: Z entries
|
||
|
||
Next steps:
|
||
1. Review the new changelog entries
|
||
2. Commit changes: git add CHANGELOG.md
|
||
3. Tag release: git tag vNEW_VERSION
|
||
4. Push with tags: git push --tags
|
||
```
|
||
|
||
## Output Format
|
||
|
||
**Console** (default): Display summary and next steps
|
||
|
||
**Markdown** (if `--output` specified): Save updated changelog
|
||
|
||
## Special Cases
|
||
|
||
### Draft Mode (--draft)
|
||
|
||
Add to [Unreleased] instead of creating versioned release:
|
||
|
||
```markdown
|
||
## [Unreleased]
|
||
|
||
### Added
|
||
- New feature in development
|
||
|
||
### Fixed
|
||
- Bug fix awaiting release
|
||
```
|
||
|
||
Use this when:
|
||
- Changes not ready for release
|
||
- Accumulating changes before version bump
|
||
- Working in feature branch
|
||
|
||
### Empty Unreleased Section
|
||
|
||
If [Unreleased] section exists but is empty, preserve it:
|
||
|
||
```markdown
|
||
## [Unreleased]
|
||
|
||
## [1.2.0] - 2025-11-11
|
||
```
|
||
|
||
### Multiple Version Formats
|
||
|
||
If changelog contains both CalVer and SemVer (migration scenario):
|
||
- Detect most recent format
|
||
- Warn user about mixed formats
|
||
- Suggest standardizing
|
||
|
||
## Examples
|
||
|
||
**Basic usage**:
|
||
```bash
|
||
/document-generator:update-changelog
|
||
→ Auto-detects last version, suggests next version, updates changelog
|
||
```
|
||
|
||
**With specific version**:
|
||
```bash
|
||
/document-generator:update-changelog --new-version=2.1.0
|
||
→ Creates version 2.1.0 entry with recent commits
|
||
```
|
||
|
||
**Draft mode**:
|
||
```bash
|
||
/document-generator:update-changelog --draft
|
||
→ Adds commits to [Unreleased] section
|
||
```
|
||
|
||
**With tier annotation**:
|
||
```bash
|
||
/document-generator:update-changelog --new-version=1.0.0 --tier=MVP
|
||
→ Creates [1.0.0] [MVP] entry
|
||
```
|
||
|
||
**Since specific ref**:
|
||
```bash
|
||
/document-generator:update-changelog --since=v1.5.0
|
||
→ Includes all commits since v1.5.0 tag
|
||
```
|
||
|
||
**Custom location**:
|
||
```bash
|
||
/document-generator:update-changelog --path=docs/CHANGELOG.md
|
||
→ Updates changelog at docs/CHANGELOG.md
|
||
```
|
||
|
||
## Constraints
|
||
|
||
- Token budget: Keep concise, delegate to skills
|
||
- Preserve existing changelog structure
|
||
- Maintain chronological order
|
||
- Validate all version increments
|
||
- No data loss - backup approach recommended
|