Agent skill

Update Changelog

by penpot in penpot/penpot

Update the project CHANGES.md with issues from a given GitHub milestone, with correct categorization and references.

MPL-2.0Auto-check passedDevelopment

Install Update Changelog

skills CLI
$ npx skills add penpot/penpot --skill update-changelog -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install penpot/penpot update-changelog --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/penpot/penpot.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/update-changelog .claude/skills/update-changelog && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
update-changelog
GitHub stars
61k
Token cost
~3.5k tokens
SKILL.md length
1,658 words
Files
1
Skills in repo
24
Repo updated
First seen
Licence
MPL-2.0

At a glance

Update the project CHANGES.md with issues from a given GitHub milestone, with correct categorization and references.

  • Works in 9 steps: Determine the target version → Fetch all issues in the milestone → Identify missing entries (optional) → …
  • Tasks that involve Project management
  • SKILL.md covers When to Use, Prerequisites, Workflow and Key Principles
  • Calls python3 and gh

What it does

Update Changelog is an agent skill from penpot/penpot. Update the project CHANGES.md with issues from a given GitHub milestone, with correct categorization and references.

Its SKILL.md is about 3.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Project management and Changelog and release notes. It works with GitHub. The repository describes itself as: Penpot: The open-source design platform for Product teams that need scalable collaboration. The licence is MPL-2.0.

When your agent uses it

  • Tasks that involve Project management
  • Tasks that involve Changelog and release notes

Example prompts

  • “/update-changelog”

Requirements

  • Python 3

Workflow steps

9 steps, taken from the step headings in SKILL.md.

  1. Determine the target version
  2. Fetch all issues in the milestone
  3. Identify missing entries (optional)
  4. Fetch additional PR details when needed
  5. Categorize entries — strictly by issue type, never by labels or emoji
  6. Read the current CHANGES.md and run pre-flight checks
  7. Build the description text
  8. Cross-reference milestone PRs against the changelog
  9. Generate the anomaly report

What it can do on your machine

Read from SKILL.md and the folder at commit 10955f1. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • python3
    • gh

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use gh, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Update Changelog loads about 3.5k tokens when it runs. Until then it costs about 33 tokens; SKILL.md has 1,658 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~33
When it runs · the whole SKILL.md, loaded when a task matches
~3.5k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from penpot/penpot at commit 10955f1, republished under its MPL-2.0 licence (© penpot). 1,658 words, ~3,494 tokens.

Download SKILL.mdSave it as .claude/skills/update-changelog/SKILL.md (or your agent's skills folder).
name
update-changelog
description
Update the project CHANGES.md with issues from a given GitHub milestone, with correct categorization and references.

Skill: update-changelog

Update CHANGES.md with entries for all issues and PRs in a given GitHub milestone. Each entry references the user-facing issue (not the PR) as the primary link, with the fix PR inline on the same line.

When to Use

  • Before a new release, to populate the changelog with all fixed issues
  • When new issues are added to an existing milestone and the changelog needs to be refreshed
  • To ensure every entry follows the correct format for the changelog

Prerequisites

  • gh CLI authenticated (gh auth status)
  • Python 3.8+
  • scripts/gh.py for GitHub queries, scripts/changelog.py for changelog checks (run python3 scripts/changelog.py <command> --help for usage)

Workflow

1. Determine the target version

The version is typically a semver string like 2.15.3. Confirm with the user if not specified.

2. Fetch all issues in the milestone
bash
# All closed issues (default)
python3 scripts/gh.py issues "2.16.0"

# Include open issues too
python3 scripts/gh.py issues "2.16.0" --state all

# Exclude entries that should not go in the changelog
python3 scripts/gh.py issues "2.16.0" --exclude "release blocker,no changelog"

Exclusion rules (issue-level):

  • no changelog label — chore/refactor work, no entry needed
  • release blocker label — blocked issues not yet ready for changelog
  • Task issue type — internal chores, not user-facing; excluded by gh.py (use --include-tasks to override)
  • Rejected project status — issues with "Rejected" status on the "Main" project board are excluded by gh.py (use --include-rejected to override). This status is independent of the GitHub issue state.

Exclusion rules (PR-level): PRs with these labels stay out regardless of their linked issue's labels: release blocker, no issue required.

Each entry carries number, title, state, issue_type, labels, closing_prs, and project_status.

3. Identify missing entries (optional)
bash
python3 scripts/gh.py issues "2.16.0" --exclude "release blocker,no changelog" --compare CHANGES.md

Returns only milestone issues not yet referenced in the changelog. Note: it compares issues only. For unreferenced merged PRs, use the cross-reference in step 8.

4. Fetch additional PR details when needed
bash
# One or more PR numbers (also: --file prs.txt, or --stdin)
python3 scripts/gh.py prs 9179 9204 9311

# All merged PRs in a milestone (default); --state all/open/closed for others
python3 scripts/gh.py prs --milestone "2.16.0"

Returns number, title, body, state, merged_at, author, labels, and closing_issues. Milestone mode uses paginated GraphQL (100 per page).

5. Categorize entries — strictly by issue type, never by labels or emoji

Use the Issue Type field (issue_type in the gh.py output). No separate query is needed.

⚠️ CRITICAL: Never use labels or title emoji prefixes for categorization. Labels like bug/enhancement and prefixes like :bug:/:sparkles: are often wrong or missing. issue_type is the single source of truth.

issue_type valueChangelog section
Bug### :bug: Bugs fixed
Feature or Enhancement### :sparkles: New features & Enhancements
TaskExclude — internal chores, not user-facing
null (not set)Fallback to labels: bug label → bugs, otherwise enhancements

Breaking changes override everything: an issue with the breaking change label goes under ### :boom: Breaking changes & Deprecations, no matter its issue type. This and release highlight below are the only label-based rules — explicit exceptions to the "never by labels" principle above. The :boom: subsection goes first in the version, before :rocket: (matching the existing precedent).

Highlights come from the release highlight label: an issue with that label also gets an entry under ### :rocket: Epics and highlights, on top of its regular entry (usually :sparkles:). In the section being refreshed, :rocket: lists exactly the labelled issues: never pick highlights yourself and never keep an unlabelled entry there. Product decides the highlights by labelling issues on GitHub, so a regeneration cannot undo that choice. Older version sections are left as they are.

Community attribution: if the issue or its fix PR has the community contribution label, add (by @<github_username>) on the entry line, before the issue/PR references. Use the PR author (the author field from step 4), not the issue author:

markdown
- Fix description of the bug (by @username) [#<ISSUE>](...) (PR: [#<PR>](...))

Only closed issues are included, even if open ones are tracked in the milestone.

Pairing rules:

PatternChangelog format
Closed issue + one or more fix PRsPrimary link = issue, PRs inline comma-separated
PR with no linked issueLink the issue if a matching closed one exists in the milestone; otherwise skip (the issue is the changelog unit)
Closed issue with no fix PR in milestoneLink the issue directly, no PR reference

False-positive associations: a PR may wrongly claim to close an issue from another context (ancient PR, cross-project reference). If titles are clearly unrelated or the PR predates the issue by years, treat it as a data glitch and skip it.

5a. Verify PR merge status before writing

A closed issue may list closing PRs that were closed without merging (e.g. a superseded community PR). Only merged PRs go in the changelog:

bash
python3 scripts/changelog.py check-merged <ALL_PR_NUMBERS>
# also accepts: --file prs.txt, or numbers via --stdin

If a closing PR is closed-unmerged, find the merged PR that superseded it (other PRs in the issue's closing list, similar titles, or pointers in the closed PR's timeline) and reference that one instead.

5b. Security advisory (GHSA) entries

Advisories fixed in a release go in the changelog even though they are neither milestone issues nor PRs. The GHSA ID and description come from the user or the release notes — never from the milestone fetch.

markdown
- Fix <user-facing description> (https://github.com/penpot/penpot/security/advisories/GHSA-XXXX-XXXX-XXXX)

Rules: place under ### :bug: Bugs fixed with no issue or PR link; do not fetch or verify the URL (it may be draft/unpublished and 404); write the description in imperative mood from the advisory title. These entries are invisible to the automation — add them by hand, and in step 9 apply only the backport/duplicate check to them.

6. Read the current CHANGES.md and run pre-flight checks

Newest version goes at the top, right after the # CHANGELOG header:

markdown
## <VERSION>

### :boom: Breaking changes & Deprecations

- <breaking change or deprecation> [#<ISSUE>](https://github.com/penpot/penpot/issues/<ISSUE>) (PR: [#<PR>](https://github.com/penpot/penpot/pull/<PR>))

### :bug: Bugs fixed

- Fix description of the bug [#<ISSUE>](https://github.com/penpot/penpot/issues/<ISSUE>) (PR: [#<PR>](https://github.com/penpot/penpot/pull/<PR>))
- Fix another bug (by @contributor) [#<ISSUE>](https://github.com/penpot/penpot/issues/<ISSUE>) (PR: [#<PR>](https://github.com/penpot/penpot/pull/<PR>))

### :sparkles: New features & Enhancements

- Add new feature description [#<ISSUE>](https://github.com/penpot/penpot/issues/<ISSUE>) (PR: [#<PR>](https://github.com/penpot/penpot/pull/<PR>))

Format details: entries start with - plus a short imperative description; PR refs stay inline ((PR: [#<N>](<url>)), comma-separated for several); (by @<username>) goes before the issue link; only include non-empty sections; blank line between a section's last entry and the next title; never duplicate an entry from an earlier version section (the earlier version wins for backports).

Pre-flight checks — fix violations directly in CHANGES.md before writing the new section. Reconcile every existing entry (any version section) and every milestone candidate against the current milestone state (re-fetch, do not trust cached data):

  1. Duplicate across versions → remove from the current section.
  2. Stale milestone assignment (issue moved out of this milestone) → remove the entry (or drop it if the section does not exist yet).
  3. Newly applied exclusion labels (no changelog, release blocker) → remove the entry.
  4. Issue no longer closed/deleted/Rejected → remove the entry.
  5. Unmerged or moved PR reference → fix the reference or remove the entry (a PR merged in a different milestone is a step-9 anomaly, do not silently remove it).
  6. Issue type changed to Task → remove the entry.
  7. Breaking change misplaced (issue has the breaking change label but sits in another section) → move the entry to :boom:.
  8. Highlight out of sync (:rocket: entry without the release highlight label, or a labelled issue missing from :rocket:) → remove the :rocket: entry or add it (step 7b). The regular entry stays.
  9. Missing valid issues (closed, non-excluded, unreferenced anywhere) → add them to the current section per step 5.
Show full SKILL.md (574 more words)Show less
7. Build the description text

Derive it from the issue title, not the PR title. Strip leading emoji prefixes (:bug:, :sparkles:, :tada:) and describe the user-facing behavior:

Issue titleChangelog description
Plugin API token methods fail with schema validation error on PROFix Plugin API token methods failing with schema validation error on PRO
Comment content is not sanitized before rendering, enabling stored XSSSanitize comment content on rendering
Custom uploaded font family names are not sanitizedSanitize font family names on custom uploaded fonts

Insert the new version section right after the # CHANGELOG header with the edit tool and enough context for a unique match.

7b. Populate :rocket: Epics and highlights from the label

List the milestone issues that pass step 2 exclusions and carry the release highlight label:

bash
python3 scripts/gh.py issues "2.16.0" --exclude "release blocker,no changelog" \
  | python3 -c "import sys,json; [print(i['number'], i['title']) for i in json.load(sys.stdin) if 'release highlight' in i['labels']]"

Create the subsection if missing (place it before ### :sparkles:) with one entry per labelled issue, same text and references as its regular entry. Every :rocket: entry MUST carry issue AND PR references. If no issue is labelled, leave :rocket: out and tell the user: the highlights are product's call, not the agent's. To change them, add or remove the label on GitHub and re-run; never edit :rocket: by hand.

8. Cross-reference milestone PRs against the changelog
bash
python3 scripts/changelog.py cross-ref "<MILESTONE>" [--changes CHANGES.md]

Lists merged milestone PRs missing from the changelog section (decide per PR: add it or confirm its exclusion labels) and warns about CLOSED (unmerged) PRs in the milestone. GHSA entries never appear here — that absence is expected.

9. Generate the anomaly report
bash
python3 scripts/changelog.py report "<MILESTONE>" [--changes CHANGES.md --output CHANGES-ISSUES.md]

Overwrites CHANGES-ISSUES.md with the current state. Every number renders as a full [#N](https://github.com/penpot/penpot/issues/N) or [#N](https://github.com/penpot/penpot/pull/N) link.

An anomaly is a milestone mismatch or a :boom: mislabel (the changelog pairing is misleading and a human must judge intent):

  1. Issue in this milestone, referenced PR in another milestone (or none).
  2. PR in this milestone, closed issue in another milestone — except an issue with no milestone, which belongs to another (probably private) project and is neither anomaly nor changelog candidate.
  3. :boom: entry whose issue lacks the breaking change label. These stay listed in the report and in the changelog: either label the issue or move the entry to its regular section.
  4. :rocket: out of sync with the release highlight label. Step 6 pre-flight should have fixed it: if it shows up, re-run the workflow.

Highlight gaps are warnings, not anomalies: missing :rocket: on a released X.Y.0 (patches never carry highlights); :rocket: entry without issue AND PR references. Gaps never count toward the anomaly total.

Anything else is a rule violation, not a report item: fix it in step 6 pre-flight. If one shows up in the report, re-run the workflow.

Key Principles

  • Issue = changelog unit, PR = implementation detail inline.
  • Latest version first, below the # CHANGELOG header.
  • Issue Type decides the section — exclusively, except breaking change label → :boom: first, and release highlight label → also :rocket:.
  • User-facing descriptions in imperative mood.
  • Community attribution uses the PR author, placed before the issue link.
  • Only closed issues; Rejected project status excludes.
  • no changelog and Task stay out.
  • Multiple fix PRs go comma-separated inline.
  • Duplicates: the earlier version section wins.
  • Taiga references: resolve to the GitHub issue via description text or PRs mentioning the Taiga URL, then link issue + PR.
  • GHSA entries live under :bug: with only the advisory URL (see 5b).
  • Re-fetch before editing; prefer scripts/gh.py over raw gh api.
  • Verify PR merge status (check-merged); PR-level exclusions apply.
  • Cross-reference PRs, not just issues (cross-ref); watch for false-positive PR-to-issue links.

© penpot, MPL-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/update-changelog of penpot/penpot.

Open the folder on GitHubat commit 10955f1

Compare with similar skills

Update Changelog next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Update Changelog compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Update Changelog this skillpenpot/penpot61k—~3.5kAutomated safety check: PassMPL-2.0
Release Note Generationsmith-chem-wisc/MetaMorpheus109—~1.4kAutomated safety check: PassMIT
Skia Analystmono/SkiaSharp5.6k—~1.6kAutomated safety check: PassMIT
Release Create Tracker Issuepytorch/test-infra113—~2.7kAutomated safety check: PassCustom licence
Cutting A ReleaseTriliumNext/Trilium38k—~3.2kAutomated safety check: PassAGPL-3.0
Mole CLI Release Flowtw93/Mole70k—~2.6kAutomated safety check: PassGPL-3.0

Similar skills

  • Release Note Generation

    smith-chem-wisc/MetaMorpheus

    Toolkit for generating PowerToys release notes from GitHub milestone PRs or commit ranges.

    109 GitHub stars~1.4k tokensUpdated 3 days ago
    DevelopmentAuto-check passed
  • Skia Analyst

    mono/SkiaSharp

    Analyze Skia features for SkiaSharp - produces a unified analysis of what shipped (upstream engine benefits, PR links, migration guides) and what's missing (impact/priority/effort scoring, hidden…

    5.6k GitHub stars~1.6k tokensUpdated today
    DevelopmentAuto-check passed
  • Generate (and optionally open) a PyTorch release tracker / cherry-pick tracking issue from a release announcement, like https://github.com/pytorch/pytorch/issues/180506.

    113 GitHub stars~2.7k tokensUpdated today
    AI & LLM EngineeringAuto-check passed
  • Cutting A Release

    TriliumNext/Trilium

    A skill your agent uses when cutting, preparing, or debugging a Trilium release — bumping the monorepo version, tagging, or diagnosing a failed "Release" workflow run.

    38k GitHub stars~3.2k tokensUpdated today
    DevelopmentAuto-check passed
  • Runbook for assessing and executing a Mole CLI release: distribution channels, pre-flight checks, capital-V tags, build artifacts and the handoff to curated release notes.

    70k GitHub stars~2.6k tokensUpdated today
    DevelopmentAuto-check passed
  • Draft Release Notes

    jamiepine/voicebox

    Writes or refreshes the Unreleased section of CHANGELOG.md as a themed narrative built from the commits, PRs and diff since the last version tag.

    57k GitHub stars~941 tokensUpdated 3 days ago
    DevelopmentAuto-check passed

More from penpot/penpot

All 24 skills in this repo
  • Hardens code against vulnerabilities. An agent skill from penpot/penpot.

    61k GitHub starsUsed in 6 repos~4.7k tokens
    Auto-check: notes
  • Create PR

    penpot/penpot

    PR flow — open a new PR for the current task branch (validates base branch, commits, issue and push state) or update an existing PR's title or description to match Penpot conventions.

    61k GitHub stars~1.4k tokensUpdated yesterday
    Auto-check passed
  • Bat Cat

    penpot/penpot

    A cat clone with syntax highlighting, line numbers, and Git integration - a modern replacement for cat.

    61k GitHub starsUsed in 2 repos~1.1k tokens
    Auto-check passed
  • Local CI

    penpot/penpot

    Run local CI-style checks with ./scripts/ci (lint, tests, format) per monorepo module.

    61k GitHub stars~822 tokensUpdated yesterday
    Auto-check passed
  • Ste

    penpot/penpot

    Write or rewrite text in ASD-STE100 Simplified Technical English.

    61k GitHub stars~1.5k tokensUpdated yesterday
    Auto-check passed
  • Code review criteria — the five review axes, core principles, severity format, and verdict for reviewing code changes.

    61k GitHub stars~3.6k tokensUpdated yesterday
    Auto-check passed

Works with

Categories

Questions about Update Changelog

What does Update Changelog do?

Update the project CHANGES.md with issues from a given GitHub milestone, with correct categorization and references. Update Changelog is an agent skill from penpot/penpot.md with issues from a given GitHub milestone, with correct categorization and references.

When should I use Update Changelog?

Update Changelog fits situations like: tasks that involve Project management; tasks that involve Changelog and release notes.

How do I install Update Changelog in Claude Code?

Run `npx skills add penpot/penpot --skill update-changelog -a claude-code`. Or copy the skill folder (.agents/skills/update-changelog in penpot/penpot) into .claude/skills/update-changelog in your project. Claude Code loads it when a task matches its description.

How do I install Update Changelog in Codex?

Run `npx skills add penpot/penpot --skill update-changelog -a codex`. Or copy the skill folder (.agents/skills/update-changelog in penpot/penpot) into .agents/skills/update-changelog in your project. Codex loads it when a task matches its description.

Can I use Update Changelog in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add penpot/penpot --skill update-changelog -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/update-changelog, .gemini/skills/update-changelog, .github/skills/update-changelog and .opencode/skills/update-changelog in your project.

What does Update Changelog need to run?

Going by SKILL.md and its folder, Update Changelog needs the command-line tools its instructions call (python3 and gh). Our summary lists: Python 3.

Does Update Changelog access the network?

SKILL.md contains no URLs. Its commands use gh, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Update Changelog safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Update Changelog use?

Update Changelog is published under the MPL-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Update Changelog use?

About 3.5k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Update Changelog?

Skills that share tags, products or a category with Update Changelog: Release Note Generation (smith-chem-wisc/MetaMorpheus, 109 stars), Skia Analyst (mono/SkiaSharp, 5.6k stars), Release Create Tracker Issue (pytorch/test-infra, 113 stars) and Cutting A Release (TriliumNext/Trilium, 38k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Update Changelog?

penpot (a GitHub organization) maintains it in penpot/penpot, which has 60,869 GitHub stars. The repository holds 24 skills in this directory. The repository was last updated on October 9, 2026.

Source: penpot/penpot on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.