Files
gh-bradleyboehmke-brads-mar…/commands/update-changelog.md
2025-11-29 18:01:55 +08:00

293 lines
6.8 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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