patch-notes — Claude Code skill: player-facing patch notes
Turns git history and internal changelogs into player-facing patch notes, rewriting developer language for players.
npx skills add Donchitos/Claude-Code-Game-Studios --skill patch-notes -a claude-codeWhat patch-notes does
The skill reads the release changelog at production/releases/[version]/changelog.md, checks docs/CHANGELOG.md for the version entry, and falls back to git log between the previous tag and the current one. Changes land in player-facing categories: new content, gameplay changes, quality of life, bug fixes grouped by system, performance, known issues. Output style comes from --style: brief, detailed or full.
Before it reads anything, the skill checks that the history belongs to this game. Every commit in the range gets classified as Game, framework/maintenance or unclear, and only Game commits make it into the copy. That filter earns its place: a session-hook timeout rendered as a patch note reads as a real fix about lost progress in a game with no save system at all. Zero Game commits means the skill stops instead of writing.
No changelog for the version and an empty git log also stop the run — generate the internal changelog with /changelog [version] first. Tone guidance is pulled from .claude/docs/technical-preferences.md, docs/PATCH-NOTES-STYLE.md and design/community/tone-guide.md; a template is looked up in docs/patch-notes-template.md and .claude/docs/templates/patch-notes-template.md. Automation mode resolves from modes.automation in project.local.yaml or project.yaml.
What it helps with
- draft player-facing patch notes from a release's git history
- keep hook and CI commits out of player copy
- rewrite "refactored damage calculation pipeline" into plain language
- group bug fixes by system: combat, UI, networking
- match the tone guide the project already uses
Example prompts for the agent
- /patch-notes 1.2.0
- /patch-notes 1.2.0 --style brief
- /patch-notes 1.2.0 --style full
How to install patch-notes
1Skills CLI (Vercel)
npx skills add Donchitos/Claude-Code-Game-Studios --skill patch-notes -a claude-code2Manually: put the files in place
~/.claude/skills/patch-notes/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/patch-notes/
1Skills CLI (Vercel)
npx skills add Donchitos/Claude-Code-Game-Studios --skill patch-notes -a codex2Manually: put the files in place
.agents/skills/patch-notes/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add Donchitos/Claude-Code-Game-Studios --skill patch-notes -a cursor2Manually: put the files in place
.cursor/skills/patch-notes/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install Donchitos/Claude-Code-Game-Studios patch-notes2Manually: put the files in place
.github/skills/patch-notes/SKILL.md1Skills CLI (Vercel)
npx skills add Donchitos/Claude-Code-Game-Studios --skill patch-notes -a gemini-cli2Platform CLI
gemini skills install https://github.com/Donchitos/Claude-Code-Game-Studios --path .claude/skills/patch-notesManually: put the files in place
.devin/skills/patch-notes/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add Donchitos/Claude-Code-Game-Studios --skill patch-notes -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about patch-notes
How do I install patch-notes in Claude?
Run npx skills add Donchitos/Claude-Code-Game-Studios --skill patch-notes -a claude-code. The skill lands at ~/.claude/skills/patch-notes/SKILL.md.
What does patch-notes do?
It builds player-facing patch notes from changelogs and git history, translating developer wording into player communication. Categories cover new content, gameplay, quality of life, fixes, performance and known issues.
Why does the skill refuse to generate notes?
It stops when no commit in the range is a Game commit, or when there is neither a version changelog nor a docs/CHANGELOG.md entry nor git log data. In the second case, run /changelog [version] first.
Source text
SKILL.md · MIT
---
name: patch-notes
description: "Player-facing patch notes from git history and changelogs. Translates developer language into player communication."
argument-hint: "[version] [--style brief|detailed|full]"
user-invocable: true
allowed-tools: Read, Glob, Grep, Write, Bash(bash "*/.claude/skills/patch-notes/../../hooks/yaml-helper.sh" resolve_config *), Bash(git log *)
model: sonnet
---
!`bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation`
**Automation mode**: Resolve `modes.automation` (`project.local.yaml` →
`project.yaml` → default `collaborative`). Every `AskUserQuestion` call and
every file write follows `.claude/docs/automation-modes.md`
(collaborative asks always · guided major-only · autonomous logs and proceeds;
`automation_always_ask` categories always prompt).
# Patch Notes
## Provenance check — before reading any history
**Confirm the history you are about to read belongs to THIS game.** Run this
before Phase 2 and stop if it fails.
1. Sample the recent log: `git log --oneline -20`. **If it is empty or git is
unavailable, skip this check** — there is nothing to classify, and Phase 2's
no-changelog-data branch is the right stop.
2. **Classify every commit in the range, one at a time**, into exactly one of:
- **Game** — changes the game the player plays: mechanics, content, balance,
art, audio, UI, a bug in any of those.
- **Framework / maintenance** — changes CCGS itself or the project's tooling:
subjects naming skills, hooks, agents, the test plan, CI, the framework's
own docs. **Excluded from player-facing notes, but not a reason to stop.**
- **Unclear** — treat as framework. A commit you cannot confidently place is
not one to write player copy from.
3. Then decide from the counts:
- **At least one Game commit** → proceed, using **only** those. Say how many
of how many you used, so the reader can see the filter ran.
- **Zero Game commits** → stop, using the message below, and give the count (0 of how many) so the reader can see the filter ran.
> **Filter per commit; do not stop on a repo that merely contains maintenance
> work.** Every project built on this framework accumulates commits touching
> hooks, CI and skills — the game repo *is* the framework repo, so a repo-level
> stop fires on virtually every real project. The danger is not that such
> commits *exist*; it is that they get **rendered as player-facing copy**.
> Excluding them addresses that exactly, and a repo-level stop does not.
Corroborate before you proceed, cheaply: the Game commits should name systems
that appear in `design/` and the code root (`src/`, `Assets/` or `Source/`). If
they name a product those directories
never mention, that is the real wrong-history signal — stop.
If **no** commit in the range is this game's, say so and stop:
> "The git history in this repo does not appear to belong to [game]: 0 of the [N]
> recent commits are Game commits. The recent
> commits describe [what they actually describe]. I cannot generate release notes
> from it — point me at the right history, or supply the change list directly."
Verdict: **BLOCKED** — stop here without generating notes.
**Why this is a hard stop, not a warning.** Framework-internal commits rendered
as player copy read as real changes: a session-hook timeout becomes *"Fixed an
issue where progress from your last session could be lost on launch"* in a game
with **no save system**. That copy is fluent, plausible, and entirely false. A
reader cannot tell the difference; only this check can.
---
## Phase 1: Parse Arguments
- `version`: the release version to generate notes for (e.g., `1.2.0`)
- `--style`: output style — `brief` (bullet points), `detailed` (with context), `full` (with developer commentary). Default: `detailed`.
If no version is provided, ask the user before proceeding.
---
## Phase 2: Gather Change Data
- Read the internal changelog at `production/releases/[version]/changelog.md` if it exists
- Also check `docs/CHANGELOG.md` for the relevant version entry
- Run `git log` between the previous release tag and current tag/HEAD as a fallback
- Read sprint retrospectives in `production/sprints/` for context
- Read any balance change documents in `design/balance/`
- Read bug fix records from QA if available
**If no changelog data is available** (neither `production/releases/[version]/changelog.md`
nor a `docs/CHANGELOG.md` entry for this version exists, and git log is empty or unavailable):
> "No changelog data found for [version]. Run `/changelog [version]` first to generate the
> internal changelog, then re-run `/patch-notes [version]`."
Verdict: **BLOCKED** — stop here without generating notes.
---
## Phase 2b: Detect Tone Guide and Template
**Tone guide detection** — before drafting notes, check for writing style guidance:
1. Check `.claude/docs/technical-preferences.md` for any "tone", "voice", or "style"
fields or sections.
2. Check `docs/PATCH-NOTES-STYLE.md` if it exists.
3. Check `design/community/tone-guide.md` if it exists.
4. If any source contains tone/voice/style instructions, extract them and apply
them to the language and framing of the generated notes.
5. If no tone guidance is found anywhere, default to:
player-friendly, non-technical language; enthusiastic but not hyperbolic;
focus on what the player experiences, not what the developer changed.
**Template detection** — check whether a patch notes template exists:
1. Glob for `docs/patch-notes-template.md` and `.claude/docs/templates/patch-notes-template.md`.
2. If found at either location, read it and use it as the output structure for Phase 4
instead of the built-in style templates (Brief / Detailed / Full). Fill in the
template's sections with the categorized data, mapping each category to the
template section that means the same (New Content → its new-features section,
Bug Fixes → its fixes section); a category with no matching section goes under
the closest one, never dropped. Keep the template's header and footer text
as written. Say in the output which template was used — and, when `--style`
was passed, that the template replaced it.
3. If not found, use the built-in style templates as defined in Phase 4.
---
## Phase 3: Categorize and Translate
Categorize all changes into player-facing categories:
- **New Content**: new features, maps, characters, items, modes
- **Gameplay Changes**: balance adjustments, mechanic changes, progression changes
- **Quality of Life**: UI improvements, convenience features, accessibility
- **Bug Fixes**: grouped by system (combat, UI, networking, etc.)
- **Performance**: optimization improvements players might notice
- **Known Issues**: transparency about unresolved problems
Translate developer language to player language:
- "Refactored damage calculation pipeline" → "Improved hit detection accuracy"
- "Fixed null reference in inventory manager" → "Fixed a crash when opening inventory"
- "Reduced GC allocations in combat loop" → "Improved combat performance"
- Remove purely internal changes that don't affect players
- Preserve specific numbers for balance changes (damage: 50 → 45)
---
## Phase 4: Generate Patch Notes
### Brief Style
```markdown
# Patch [Version] — [Title]
**New**
- [Feature 1]
- [Feature 2]
**Changes**
- [Balance/mechanic change with before → after values]
**Fixes**
- [Bug fix 1]
- [Bug fix 2]
**Known Issues**
- [Issue 1]
```
### Detailed Style
```markdown
# Patch [Version] — [Title]
*[Date]*
## Highlights
[1-2 sentence summary of the most exciting changes]
## New Content
### [Feature Name]
[2-3 sentences describing the feature and why players should be excited]
## Gameplay Changes
### Balance
| Change | Before | After | Reason |
| ---- | ---- | ---- | ---- |
| [Item/ability] | [old value] | [new value] | [brief rationale] |
### Mechanics
- **[Change]**: [explanation of what changed and why]
## Quality of Life
- [Improvement with context]
## Bug Fixes
### Combat
- Fixed [description of what players experienced]
### UI
- Fixed [description]
### Networking
- Fixed [description]
## Performance
- [Improvement players will notice]
## Known Issues
- [Issue and workaround if available]
```
### Full Style
Includes everything from Detailed, plus:
```markdown
## Developer Commentary
### [Topic]
> [Developer insight into a major change — why it was made, what was considered,
> what the team learned. Written in first-person team voice.]
```
---
## Phase 5: Review Output
Check the generated notes for:
- No internal jargon (replace technical terms with player-friendly language)
- No references to internal systems, tickets, or sprint numbers
- Balance changes include before/after values
- Bug fixes describe the player experience, not the technical cause
- Tone matches the game's voice (adjust formality based on game style)
---
## Phase 6: Save Patch Notes
Present the completed patch notes to the user along with: a count of changes by category, and any internal changes that were excluded (for review).
Ask: "May I write these patch notes to `docs/patch-notes/[version].md`, and an
archive copy to `production/releases/[version]/patch-notes.md`?"
If yes, write both files, creating the directories if needed.
If no, write nothing.
---
## Phase 7: Next Steps
Verdict: **COMPLETE** — patch notes generated and saved. (If the write was
declined: Verdict: **COMPLETE** — patch notes generated and shown, not saved.)
- Run `/release-checklist` to verify all other release gates are met before publishing.
- Share the patch notes draft with the community-manager for tone review before posting publicly.
© Donchitos · MIT · Donchitos/Claude-Code-Game-Studios