Loading...
Loading...
Generate and maintain changelogs following Keep a Changelog format. Analyzes git commits, categorizes changes, and produces well-structured release notes.
npx skill4agent add toilahuongg/shopify-agents-kit changelog# Get commits since last tag
git log $(git describe --tags --abbrev=0 2>/dev/null || echo "")..HEAD --pretty=format:"%h %s" --no-merges
# Get all tags for reference
git tag --sort=-version:refname | head -10# 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
- New features
### Changed
- Changes in existing functionality
### Deprecated
- Soon-to-be removed features
### Removed
- Removed features
### Fixed
- Bug fixes
### Security
- Vulnerability fixes
## [1.1.0] - 2024-01-26
### Added
- New `zustand-state` skill for state management
- New `form-validation` skill with Zod + Conform integration
- New `security-hardening` skill for Shopify apps
### Changed
- Updated `shopify-developer` agent with new skills
- Updated `tech-lead` agent with security-hardening skill
## [1.0.4] - 2024-01-20
### Fixed
- Initial stable release
[Unreleased]: https://github.com/user/repo/compare/v1.1.0...HEAD
[1.1.0]: https://github.com/user/repo/compare/v1.0.4...v1.1.0
[1.0.4]: https://github.com/user/repo/releases/tag/v1.0.4| Commit Prefix | Changelog Category |
|---|---|
| Added |
| Fixed |
| Changed (Documentation) |
| Changed (Formatting) |
| Changed |
| Changed (Performance) |
| (Usually omitted) |
| Changed (Build system) |
| (Usually omitted) |
| (Usually omitted) |
| Removed or Fixed |
| Security |
| Deprecated |
| Removed |
# Get commits since last release
git log v1.0.4..HEAD --pretty=format:"%H|%s|%an|%ad" --date=short
# Or since a specific date
git log --since="2024-01-01" --pretty=format:"%H|%s|%an|%ad" --date=shortinterface ChangeEntry {
category: 'Added' | 'Changed' | 'Deprecated' | 'Removed' | 'Fixed' | 'Security';
description: string;
commit: string;
scope?: string;
breaking?: boolean;
}
function categorizeCommit(message: string): ChangeEntry | null {
const conventionalRegex = /^(\w+)(?:\(([^)]+)\))?(!)?:\s*(.+)$/;
const match = message.match(conventionalRegex);
if (!match) return null;
const [, type, scope, breaking, description] = match;
const categoryMap: Record<string, ChangeEntry['category']> = {
feat: 'Added',
fix: 'Fixed',
docs: 'Changed',
style: 'Changed',
refactor: 'Changed',
perf: 'Changed',
security: 'Security',
deprecate: 'Deprecated',
remove: 'Removed',
};
return {
category: categoryMap[type] || 'Changed',
description,
scope,
breaking: !!breaking,
};
}function generateChangelog(entries: ChangeEntry[], version: string, date: string): string {
const grouped = groupBy(entries, 'category');
const order = ['Added', 'Changed', 'Deprecated', 'Removed', 'Fixed', 'Security'];
let output = `## [${version}] - ${date}\n\n`;
for (const category of order) {
if (grouped[category]?.length) {
output += `### ${category}\n`;
for (const entry of grouped[category]) {
const scope = entry.scope ? `**${entry.scope}:** ` : '';
const breaking = entry.breaking ? '⚠️ BREAKING: ' : '';
output += `- ${breaking}${scope}${entry.description}\n`;
}
output += '\n';
}
}
return output;
}| Change Type | Version Bump | Example |
|---|---|---|
Breaking changes ( | MAJOR | 1.0.0 → 2.0.0 |
New features ( | MINOR | 1.0.0 → 1.1.0 |
Bug fixes ( | PATCH | 1.0.0 → 1.0.1 |
| Other changes | PATCH | 1.0.0 → 1.0.1 |
function suggestVersionBump(entries: ChangeEntry[], currentVersion: string): string {
const [major, minor, patch] = currentVersion.split('.').map(Number);
if (entries.some(e => e.breaking)) {
return `${major + 1}.0.0`;
}
if (entries.some(e => e.category === 'Added')) {
return `${major}.${minor + 1}.0`;
}
return `${major}.${minor}.${patch + 1}`;
}# 1. Generate changelog for unreleased changes
git log $(git describe --tags --abbrev=0)..HEAD --oneline
# 2. Update CHANGELOG.md with new version section
# 3. Commit changelog
git add CHANGELOG.md
git commit -m "docs: update changelog for v1.2.0"
# 4. Create version tag
git tag -a v1.2.0 -m "Release v1.2.0"
# 5. Push with tags
git push --follow-tags# Extract latest version section from CHANGELOG.md
sed -n '/^## \[1\.2\.0\]/,/^## \[/p' CHANGELOG.md | head -n -1
# Create GitHub release
gh release create v1.2.0 --title "v1.2.0" --notes-file release-notes.md{
"version": "1.1.0",
"date": "2024-01-26",
"changes": {
"added": [
"New `zustand-state` skill for state management",
"New `form-validation` skill with Zod + Conform integration"
],
"changed": [
"Updated `shopify-developer` agent with new skills"
],
"fixed": [],
"security": []
}
}# Release v1.1.0
## Highlights
- 🎉 3 new skills added for better Shopify development
## What's New
- **zustand-state**: State management with Zustand
- **form-validation**: Form validation with Zod + Conform
- **security-hardening**: Security best practices
## Improvements
- Updated agents with new skill integrations
---
Full changelog: https://github.com/user/repo/blob/main/CHANGELOG.md# View commits since last tag
git log $(git describe --tags --abbrev=0)..HEAD --oneline
# View commits between two tags
git log v1.0.0..v1.1.0 --oneline
# Get commit count by type
git log --oneline | grep -E "^[a-f0-9]+ (feat|fix|docs):" | wc -l
# List all contributors since last release
git log $(git describe --tags --abbrev=0)..HEAD --format="%an" | sort -u
# Generate commit list with dates
git log --since="2024-01-01" --pretty=format:"- %s (%ad)" --date=short/changelog # Generate for unreleased changes
/changelog 1.2.0 # Generate for specific version
/changelog --since=v1.0.0 # Changes since specific tag
/changelog --format=json # Output as JSON