Draft Rove release notes as Changesets. Writes user-facing entries as `.changeset/*.md` files for `@sma1lboy/rove` (consumed into `packages/kobe/CHANGELOG.md` at release time). Use when the user asks for "changelog", "release notes", "what changed", "add a changeset", or before cutting a version. Enforces Rove's no-soft-wrap rule so GitHub release pages render flowing text.
Install
npx skillscat add sma1lboy/rove/changelog-generator Install via the SkillsCat registry.
Changelog Generator (Rove)
Drafts release notes as Changesets — one .changeset/<name>.md file per change — in Rove's house style. scripts/release.sh (via changeset version) later consumes them into `packages/kobe/CHANGELOG.md` and the GitHub release body. See `docs/RELEASING.md` for the full flow.
When to use
- The user says "draft changelog", "write release notes", "add a changeset", "what changed since v0.X.Y", or similar.
- After landing a user-facing change that has no changeset yet (e.g. it was committed before this skill existed, or in a batch that skipped them).
- Before cutting a release tag — to backfill changesets for anything user-facing that slipped through, so the generated notes are complete.
Rove project conventions (load-bearing)
Every rule in this section overrides the generic guidance further down.
File format — a changeset, not a CHANGELOG edit
Do not hand-edit
packages/kobe/CHANGELOG.mdor invent a## [Unreleased]section — that file is generated.Each change is a new file
.changeset/<two-words-random>.md(thechangesetCLI names it; if writing by hand, any unique kebab name works). Shape:--- "@sma1lboy/rove": patch --- Single-line user-facing summary. This text lands verbatim under the next release and in the GitHub release body.The canonical frontmatter bump key is
@sma1lboy/rove, with valuepatch|minor|major.Default to
patchfor every change, including features and pre-1.0 breaking changes. Useminorormajoronly when the user explicitly requests that bump in the current turn.The bump type is the category — Changesets groups output under
### Minor Changes/### Patch Changesautomatically. Don't write### Added/### Fixedheadings yourself.One changeset per coherent change. A batch that did three user-visible things → three changesets (or one with three bullets if they're one feature). Prefer the
changesetCLI:bun run changeset(interactive) writes the file for you.
HARD RULE — no soft wraps
Every bullet, every paragraph in a changeset body must be on a single line. Do not wrap at column 70/80/whatever. The line can be 400 chars long; that's fine.
Why: GitHub renders release bodies with GFM's hard-break extension. Each newline inside a list item or paragraph becomes a <br> tag. Soft-wrapped text renders as a narrow column broken every ~70 chars on the live release page, which looks broken (KOB-13).
Voice
- Present tense, user-perspective. "Add X", "Fix Y", "Move Z" — not "Added X", not "I added X".
- Lead with what changed, not why. The why goes in a follow-up clause if it's non-obvious.
- Short bold lead-in for headlines (
**The thing** — explanation...) is the established pattern. - Reference internal anchors with backticks (`task.new`, `ctrl+,`, `packages/kobe/src/foo.ts`) rather than prose.
Filtering
Pull in: features, behaviour changes the user can see/feel, bug fixes affecting user-visible behaviour, distribution / packaging / install changes.
Skip: pure refactors, internal test additions (UNLESS a milestone), CLAUDE.md / docs / skills / memory / agent-config tweaks, dependency bumps with no behaviour delta, CI tweaks (unless a new gate the user cares about). A change that needs no release can still record that explicitly with bun run changeset -- --empty.
When in doubt, ask "would a Rove user reading this on github.com/Sma1lboy/rove/releases care?" If no → skip (or empty changeset).
How to draft
- Find the cut point: the latest
## [<version>]heading inpackages/kobe/CHANGELOG.md, or the lastv*tag. - Run
git log --no-merges <last-tag>..HEAD --pretty=format:'%h %s%n%b%n---'to get the commit set, and check.changeset/*.mdfor changes that already have one (don't duplicate). - Group the un-covered user-facing changes. Write one changeset file per coherent change, each with the right bump type and a single-line summary per the rules above.
- Prefer
bun run changesetso the CLI writes the file; only hand-author the.changeset/<name>.mdif scripting a batch. - Surface the new changeset file(s) and ask the user to skim before committing them.
Example output (a changeset file)
.changeset/swift-pandas-cheer.md:
---
"@sma1lboy/rove": patch
---
**The Tasks pane fills its tmux pane and adapts to its width** — the task list now stretches to 100% of the pane as you drag the tmux split. On a narrow pane the secondary columns step aside so the task name stays readable: the branch label drops first, then the changes chip, and the title ellipsises only when it must.Note: the summary is one long line. No newlines inside it. That's the only reliable way to make the GitHub release page render flowing text.
What to avoid
- ❌ Hand-editing
packages/kobe/CHANGELOG.mdor recreating a## [Unreleased]section — it's generated from changesets now. - ❌ Soft-wrapping a changeset summary at column 70 because "it looks nicer in the editor". Render-time soft-wrap exists for a reason.
- ❌ Changesets like "Refactor X to use Y pattern" — internal change, skip (or
--empty). - ❌ Auto-generating from
git logwithout filtering. Most commits are noise. - ❌ Touching the version number in
package.json—changeset version(run byscripts/release.sh) owns that.