agentleFS
THEROCKSSSTHEROCKSSS/hermes-skills-portfolio/skills/changelog-generator/SKILL.md

changelog-generator

Skill1 starsChanged 3 months agoMITView on GitHub

Use when the user wants a changelog for their project, wants release notes generated from git history, or asks "make a changelog", "generate release notes", or "what changed since v1.0" — requires a git repo with conventional commit messages (feat:, fix:, refactor:, docs:).

99 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use api-test-suite-builder, fda-consultant-specialist and 10 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • Arnav-0Skill

    api-test-suite-builder

    Use when the user asks to generate API tests, create integration test suites, test REST endpoints, or build contract tests.

    Also in 7 projects that use this

  • Hussain-ElfalahSkill

    fda-consultant-specialist

    Also in 5 projects that use this

  • csiddhant796-blipSkill

    karpathy-coder

    Use when writing, reviewing, or committing code to enforce Karpathy's 4 coding principles — surface assumptions before coding, keep it simple, make surgical changes, define verifiable goals. Triggers on "review my diff", "check complexity", "am I overcomplicating this", "karpathy check", "before I commit", or any code quality concern where the LLM might be overcoding.

    Also in 5 projects that use this

  • Hussain-ElfalahSkill

    quality-manager-qmr

    Also in 5 projects that use this

  • csiddhant796-blipSkill

    self-eval

    Honestly evaluate AI work quality using a two-axis scoring system. Use after completing a task, code review, or work session to get an unbiased assessment. Detects score inflation, forces devil's advocate reasoning, and persists scores across sessions.

    Also in 6 projects that use this

  • ComposioHQSkill

    meeting-notes-and-actions

    Turn meeting transcripts or rough notes into crisp summaries with decisions, risks, and owner-tagged action items; use for Zoom/Meet/Teams transcripts, call notes, or long meeting chats to generate share-ready outputs.

    Also in 4 projects that use this

  • +4 more from Hussain-Elfalah

The file

We split this skill into the rules it gives an agent

2 rules. 0 are common, 1 is distinctive, and 1 is very specific to this project.

  • 0

    Common

    Most of the 93 edited versions we read keep these.

  • 1

    Distinctive

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Write to CHANGELOG.md or return as string

    line 125
  2. Distinctive:

    Cherry-picked commits appear twice: If the same commit is cherry-picked across branches, it has a different hash on each branch and shows …

    line 133

“Common” is measured: kept by at least 6 in 10 of the 93 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

changelog-generator

Overview

Generate a formatted changelog from git commit history. The agent reads commits, categorizes them by type (feat, fix, refactor, docs), and produces a Keep a Changelog-format document.

When to Use

  • The user wants a changelog for their project.
  • The user wants to generate release notes from commits.
  • The user says "make a changelog", "generate release notes", or "what changed since v1.0".

Prerequisites

The project must be a git repository with conventional commit messages (feat:, fix:, refactor:, docs:, chore:).

Generate from Commits

import subprocess
import re
from collections import defaultdict

def get_commits(since: str = "", repo_path: str = ".") -> list:
    """Get commits with hash, date, and message."""
    cmd = ["git", "log", "--pretty=format:%H|%ai|%s"]
    if since:
        cmd.insert(2, f"{since}..HEAD")

    result = subprocess.run(cmd, cwd=repo_path, capture_output=True, text=True)
    commits = []
    for line in result.stdout.strip().split("\n"):
        if "|" in line:
            parts = line.split("|", 2)
            commits.append({
                "hash": parts[0][:8],
                "date": parts[1][:10],
                "message": parts[2]
            })
    return commits

def categorize_commits(commits: list) -> dict:
    """Categorize commits by conventional commit type."""
    categories = defaultdict(list)
    for commit in commits:
        msg = commit["message"]
        match = re.match(r'(\w+)(\([^)]+\))?:\s*(.+)', msg)
        if match:
            cat = match.group(1)
            scope = match.group(2) or ""
            desc = match.group(3)
            categories[cat].append({
                "hash": commit["hash"],
                "scope": scope.strip("()"),
                "description": desc,
            })
        else:
            categories["other"].append({
                "hash": commit["hash"],
                "scope": "",
                "description": msg,
            })
    return dict(categories)

def generate_changelog(since: str = "", repo_path: str = ".") -> str:
    """Generate a Keep a Changelog formatted document."""
    commits = get_commits(since, repo_path)
    categorized = categorize_commits(commits)

    # Category display names and order
    category_map = {
        "feat": "Added",
        "fix": "Fixed",
        "refactor": "Changed",
        "docs": "Documentation",
        "chore": "Maintenance",
        "test": "Testing",
        "perf": "Performance",
        "other": "Other",
    }

    changelog = "# Changelog\n\n"
    for cat_key in ["feat", "fix", "refactor", "perf", "docs", "test", "chore", "other"]:
        if cat_key in categorized:
            display = category_map.get(cat_key, cat_key)
            changelog += f"## {display}\n\n"
            for item in categorized[cat_key]:
                scope = f"**{item['scope']}**: " if item["scope"] else ""
                changelog += f"- {scope}{item['description']} ({item['hash']})\n"
            changelog += "\n"

    return changelog

Conventional Commit Types

TypeMaps toDescription
feat:AddedNew features
fix:FixedBug fixes
refactor:ChangedCode restructuring
perf:PerformancePerformance improvements
docs:DocumentationDocumentation changes
test:TestingTest additions/changes
chore:MaintenanceBuild, deps, config

Workflow

  1. Determine the range (since last tag, since a date, or all history)
  2. Get commits with git log
  3. Categorize by conventional commit prefix
  4. Format as a Keep a Changelog document
  5. Write to CHANGELOG.md or return as string

Common Pitfalls

  1. Non-conventional commits fall into "Other". Commits without feat:/fix: prefixes get dumped in the catch-all bucket. Encourage the team to use conventional commits for better categorization, or the changelog will be mostly "Other".
  2. Merge commits clutter the output. Merge commit messages (e.g. "Merge branch 'main'") add noise. Filter them with --no-merges in the git log command before categorizing.
  3. Squashed commits lose their history. A squash-merged PR collapses many commits into one message; the changelog reflects only the squash message, not the individual changes.
  4. since must be a valid git ref. Pass a tag name (v1.0.0), a commit hash, or a date — an arbitrary string that isn't a real ref makes git log silently return the full history instead of erroring.
  5. Cherry-picked commits appear twice. If the same commit is cherry-picked across branches, it has a different hash on each branch and shows up as a duplicate entry. Deduplicate by commit message text, not hash, when merging changelogs across branches.

Verification Checklist

  • generate_changelog() was actually run against the target repo and returned non-empty output (not just defined)
  • The since argument, if provided, is a real tag/commit/date confirmed to exist in the repo
  • Merge commits were excluded (--no-merges) unless the user wants them included
  • Output was spot-checked against git log --oneline for the same range to confirm no commits were silently dropped
  • Written output file (if any) matches Keep a Changelog section ordering: Added, Fixed, Changed, Performance, Documentation, Testing, Maintenance, Other

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.