manastalukdar/ai-devstudio/changelog-auto

Trust tier 2
  • community
LLM review pending
Source check pending

Checking that the SKILL.md file is still in the repository.

Auto-generate changelogs from commit history

Install

npx vskill@latest install manastalukdar/ai-devstudio/changelog-auto

SKILL.md

Automatic Changelog Generator

I'll generate professional changelogs from your git commit history, organized by version and category.

Arguments: $ARGUMENTS - version range, tag names, or changelog format

Changelog Philosophy

  • User-Focused: Written for end users, not developers
  • Categorized: Features, fixes, breaking changes
  • Semantic Versioning: Follow semver principles
  • Keep a Changelog: Follow keepachangelog.com format

Phase 1: Commit Analysis

First, let me analyze your git history:

bash
#!/bin/bash
# Analyze git commit history for changelog generation
analyze_git_history() {
echo "=== Git History Analysis ==="
echo ""
# 1. Check if we're in a git repo
if ! git rev-parse --git-dir > /dev/null 2>&1; then
echo "❌ Not a git repository"
exit 1
fi
# 2. Get latest tag
LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null)
if [ -z "$LATEST_TAG" ]; then
echo "No tags found. Analyzing all commits..."
COMMIT_RANGE="HEAD"
else
echo "Latest tag: $LATEST_TAG"
COMMIT_RANGE="$LATEST_TAG..HEAD"
fi
# 3. Count commits by type
echo ""
echo "Commits since $LATEST_TAG:"
git log $COMMIT_RANGE --oneline | wc -l
echo ""
echo "Breakdown by type:"
echo " Features: $(git log $COMMIT_RANGE --oneline | grep -c '^[a-f0-9]* feat' || echo 0)"
echo " Fixes: $(git log $COMMIT_RANGE --oneline | grep -c '^[a-f0-9]* fix' || echo 0)"
echo " Docs: $(git log $COMMIT_RANGE --oneline | grep -c '^[a-f0-9]* docs' || echo 0)"
echo " Refactor: $(git log $COMMIT_RANGE --oneline | grep -c '^[a-f0-9]* refactor' || echo 0)"
echo " Chore: $(git log $COMMIT_RANGE --oneline | grep -c '^[a-f0-9]* chore' || echo 0)"
# 4. Check for breaking changes
BREAKING_COUNT=$(git log $COMMIT_RANGE --oneline | grep -c '!' || echo 0)
if [ $BREAKING_COUNT -gt 0 ]; then
echo ""
echo "⚠️ WARNING: $BREAKING_COUNT breaking changes detected"
fi
}
analyze_git_history

Phase 2: Version Detection

I'll determine the next version number:

bash
#!/bin/bash
# Determine next version using semantic versioning
determine_next_version() {
local commit_range="$1"
# Get current version
CURRENT_VERSION=$(git describe --tags --abbrev=0 2>/dev/null || echo "0.0.0")
echo "Current version: $CURRENT_VERSION"
# Parse version
IFS='.' read -r MAJOR MINOR PATCH <<< "${CURRENT_VERSION#v}"
# Check for breaking changes
HAS_BREAKING=$(git log $commit_range --oneline | grep -E '(^[a-f0-9]* \w+!:|BREAKING CHANGE:)' || echo "")
# Check for features
HAS_FEATURES=$(git log $commit_range --oneline | grep '^[a-f0-9]* feat' || echo "")
# Check for fixes
HAS_FIXES=$(git log $commit_range --oneline | grep '^[a-f0-9]* fix' || echo "")
# Determine version bump
if [ ! -z "$HAS_BREAKING" ]; then
NEXT_VERSION="$((MAJOR + 1)).0.0"
BUMP_TYPE="MAJOR (breaking changes)"
elif [ ! -z "$HAS_FEATURES" ]; then
NEXT_VERSION="$MAJOR.$((MINOR + 1)).0"
BUMP_TYPE="MINOR (new features)"
elif [ ! -z "$HAS_FIXES" ]; then
NEXT_VERSION="$MAJOR.$MINOR.$((PATCH + 1))"
BUMP_TYPE="PATCH (bug fixes)"
else
NEXT_VERSION="$CURRENT_VERSION"
BUMP_TYPE="NONE (no releasable changes)"
fi
echo ""
echo "Next version: v$NEXT_VERSION"
echo "Bump type: $BUMP_TYPE"
echo ""
echo "$NEXT_VERSION"
}
NEXT_VERSION=$(determine_next_version "$COMMIT_RANGE")

Phase 3: Changelog Generation

I'll generate the changelog in Keep a Changelog format:

bash
#!/bin/bash
# Generate changelog from git commits
generate_changelog() {
local version="$1"
local commit_range="$2"
local output_file="${3:-CHANGELOG.md}"
echo "Generating changelog for version $version..."
# Start changelog
cat > "$output_file.new" << EOF
# 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.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [${version}] - $(date +%Y-%m-%d)
EOF
# Extract breaking changes
BREAKING=$(git log $commit_range --grep='BREAKING CHANGE' --format='- %s' || echo "")
if [ ! -z "$BREAKING" ]; then
echo "### ⚠️ BREAKING CHANGES" >> "$output_file.new"
echo "" >> "$output_file.new"
git log $commit_range --grep='BREAKING CHANGE' --format='- %s%n%b' | \
sed 's/^BREAKING CHANGE: //' | \
sed '/^$/d' >> "$output_file.new"
echo "" >> "$output_file.new"
fi
# Extract features
FEATURES=$(git log $commit_range --oneline | grep '^[a-f0-9]* feat' || echo "")
if [ ! -z "$FEATURES" ]; then
echo "### Added" >> "$output_file.new"
echo "" >> "$output_file.new"
git log $commit_range --oneline --format='- %s' | \
grep '^- feat' | \
sed 's/^- feat[(:]*/- /' | \
sed 's/^- feat /- /' | \
sed 's/:.*//' >> "$output_file.new"
echo "" >> "$output_file.new"
fi
# Extract fixes
FIXES=$(git log $commit_range --oneline | grep '^[a-f0-9]* fix' || echo "")
if [ ! -z "$FIXES" ]; then
echo "### Fixed" >> "$output_file.new"
echo "" >> "$output_file.new"
git log $commit_range --oneline --format='- %s' | \
grep '^- fix' | \
sed 's/^- fix[(:]*/- /' | \
sed 's/^- fix /- /' | \
sed 's/:.*//' >> "$output_file.new"
echo "" >> "$output_file.new"
fi
# Extract performance improvements
PERF=$(git log $commit_range --oneline | grep '^[a-f0-9]* perf' || echo "")
if [ ! -z "$PERF" ]; then
echo "### Performance" >> "$output_file.new"
echo "" >> "$output_file.new"
git log $commit_range --oneline --format='- %s' | \
grep '^- perf' | \
sed 's/^- perf[(:]*/- /' | \
sed 's/^- perf /- /' >> "$output_file.new"
echo "" >> "$output_file.new"
fi
# Extract refactoring
REFACTOR=$(git log $commit_range --oneline | grep '^[a-f0-9]* refactor' || echo "")
if [ ! -z "$REFACTOR" ]; then
echo "### Changed" >> "$output_file.new"
echo "" >> "$output_file.new"
git log $commit_range --oneline --format='- %s' | \
grep '^- refactor' | \
sed 's/^- refactor[(:]*/- /' | \
sed 's/^- refactor /- /' >> "$output_file.new"
echo "" >> "$output_file.new"
fi
# Extract deprecations
DEPRECATED=$(git log $commit_range --grep='deprecate' -i --format='- %s' || echo "")
if [ ! -z "$DEPRECATED" ]; then
echo "### Deprecated" >> "$output_file.new"
echo "" >> "$output_file.new"
echo "$DEPRECATED" >> "$output_file.new"
echo "" >> "$output_file.new"
fi
# Extract removals
REMOVED=$(git log $commit_range --oneline | grep -E '^[a-f0-9]* (remove|delete)' -i || echo "")
if [ ! -z "$REMOVED" ]; then
echo "### Removed" >> "$output_file.new"
echo "" >> "$output_file.new"
git log $commit_range --oneline --format='- %s' | \
grep -E '^- (remove|delete)' -i | \
sed 's/^- remove[(:]*/- /' | \
sed 's/^- delete[(:]*/- /' >> "$output_file.new"
echo "" >> "$output_file.new"
fi
# Add comparison link
if [ ! -z "$LATEST_TAG" ]; then
REPO_URL=$(git remote get-url origin | sed 's/\.git$//')
echo "[${version}]: ${REPO_URL}/compare/${LATEST_TAG}...v${version}" >> "$output_file.new"
fi
# Prepend to existing changelog if it exists
if [ -f "$output_file" ]; then
echo "" >> "$output_file.new"
tail -n +2 "$output_file" >> "$output_file.new"
fi
mv "$output_file.new" "$output_file"
echo "✓ Changelog generated: $output_file"
}
generate_changelog "$NEXT_VERSION" "$COMMIT_RANGE" "CHANGELOG.md"

Phase 4: Enhanced Changelog Formats

I can generate different changelog formats:

Standard Format (Keep a Changelog)
markdown
# Changelog
## [2.1.0] - 2026-01-25
### Added
-User profile customization
-Dark mode support
-Export data to CSV
### Fixed
-Login timeout issue
-Memory leak in image processing
-Incorrect timezone handling
### Changed
-Improved search performance by 40%
-Updated UI components to new design system
### Deprecated
-Old API endpoints (v1) - use v2 instead
### Removed
-Legacy payment processor integration
### Security
-Fixed XSS vulnerability in user comments
-Updated dependencies with security patches
[2.1.0]: https://github.com/user/repo/compare/v2.0.0...v2.1.0
GitHub Releases Format
markdown
## What's Changed
### 🚀 Features
*Add user profile customization by @username in #123
*Implement dark mode support by @username in #124
*Add CSV export functionality by @username in #125
### 🐛 Bug Fixes
*Fix login timeout issue by @username in #126
*Resolve memory leak in image processing by @username in #127
*Correct timezone handling by @username in #128
### ⚡ Performance
*Improve search performance by 40% by @username in #129
### 🔒 Security
*Fix XSS vulnerability in comments by @username in #130
**Full Changelog**: https://github.com/user/repo/compare/v2.0.0...v2.1.0
Detailed Format (with descriptions)
bash
#!/bin/bash
# Generate detailed changelog with commit bodies
generate_detailed_changelog() {
local version="$1"
local commit_range="$2"
cat > CHANGELOG.md.new << EOF
# Changelog
## [${version}] - $(date +%Y-%m-%d)
### Added
EOF
# Features with descriptions
git log $commit_range --format='%h|||%s|||%b' | grep '^[a-f0-9]*|||feat' | while IFS='|||' read -r hash subject body; do
echo "#### $(echo $subject | sed 's/^feat[(:]*//' | sed 's/^feat //')" >> CHANGELOG.md.new
if [ ! -z "$body" ]; then
echo "$body" | sed 's/^/ /' >> CHANGELOG.md.new
fi
echo " ([$(echo $hash | cut -c1-7)](https://github.com/user/repo/commit/$hash))" >> CHANGELOG.md.new
echo "" >> CHANGELOG.md.new
done
# Fixes with descriptions
echo "### Fixed" >> CHANGELOG.md.new
echo "" >> CHANGELOG.md.new
git log $commit_range --format='%h|||%s|||%b' | grep '^[a-f0-9]*|||fix' | while IFS='|||' read -r hash subject body; do
echo "#### $(echo $subject | sed 's/^fix[(:]*//' | sed 's/^fix //')" >> CHANGELOG.md.new
if [ ! -z "$body" ]; then
echo "$body" | sed 's/^/ /' >> CHANGELOG.md.new
fi
echo " ([$(echo $hash | cut -c1-7)](https://github.com/user/repo/commit/$hash))" >> CHANGELOG.md.new
echo "" >> CHANGELOG.md.new
done
}

Phase 5: Changelog Validation

I'll validate the generated changelog:

bash
#!/bin/bash
# Validate changelog quality
validate_changelog() {
local changelog="$1"
echo "=== Changelog Validation ==="
echo ""
# Check for required sections
if ! grep -q "## \[" "$changelog"; then
echo "⚠️ WARNING: No version headers found"
else
echo "✓ Version headers present"
fi
# Check for dates
if ! grep -q "[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}" "$changelog"; then
echo "⚠️ WARNING: No dates found"
else
echo "✓ Dates present"
fi
# Check for categories
CATEGORIES=("Added" "Changed" "Deprecated" "Removed" "Fixed" "Security")
for category in "${CATEGORIES[@]}"; do
if grep -q "### $category" "$changelog"; then
count=$(grep -c "^- " "$changelog" | grep -A 20 "### $category" || echo 0)
echo "✓ $category: found"
fi
done
# Check for empty sections
if grep -q "### .*\n\n###" "$changelog"; then
echo "⚠️ WARNING: Empty sections detected"
fi

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewNot runA model review is scheduled for the next rescan.

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
1
7-day trend score
8

Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/manastalukdar/ai-devstudio/changelog-auto/badge)](https://verified-skill.com/skills/manastalukdar/ai-devstudio/changelog-auto)

Something wrong with this skill or its page? Tell us.