--- name: changelog-generator description: Draft Rove release notes as Changesets. Writes user-facing entries as `.changeset/*.md` files for `@sma1lboy/rove` (consumed into `packages/rove/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. metadata: internal: true --- # Changelog Generator (Rove) Drafts release notes as **Changesets** — one `.changeset/.md` file per change — in Rove's house style. The release (via `changeset version`) later consumes them into [`packages/rove/CHANGELOG.md`](../../../packages/rove/CHANGELOG.md) and the GitHub release body. See [`docs/RELEASING.md`](../../../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) ### File format — a changeset, not a CHANGELOG edit - Do **not** hand-edit `packages/rove/CHANGELOG.md` or invent a `## [Unreleased]` section — that file is generated. - Each change is a new file `.changeset/.md` (the `changeset` CLI names it; if writing by hand, any unique kebab name works). Shape: ```markdown --- "@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 value `patch` | `minor` | `major`. - Default to `patch` for every change, including features and pre-1.0 breaking changes. Use `minor` or `major` only when the user explicitly requests that bump in the current turn. - The bump type *is* the category — Changesets groups output under `### Minor Changes` / `### Patch Changes` automatically. Don't write `### Added`/`### Fixed` headings 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 `changeset` CLI: `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 `
` tag. Soft-wrapped text renders as a narrow column broken every ~70 chars on the live release page, which looks broken. ### 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/rove/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 1. Find the cut point: the latest `## []` heading in `packages/rove/CHANGELOG.md`, or the last `v*` tag. 2. Run `git log --no-merges ..HEAD --pretty=format:'%h %s%n%b%n---'` to get the commit set, and check `.changeset/*.md` for changes that already have one (don't duplicate). 3. 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. 4. Prefer `bun run changeset` so the CLI writes the file; only hand-author the `.changeset/.md` if scripting a batch. 5. Commit each changeset with the change it describes, and list the files in your report. ## Example output (a changeset file) `.changeset/swift-pandas-cheer.md`: ```markdown --- "@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/rove/CHANGELOG.md` or recreating a `## [Unreleased]` section — it's generated from changesets. - ❌ 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 log` without filtering. Most commits are noise. - ❌ Touching the version number in `package.json` — `changeset version` (run at release time) owns that.