{"version":"1.1.0","schema":"https://oneagentaday.com/api/schema.json","agent":{"title":"Release Notes from Commits","slug":"release-notes-from-commits","date":"2026-10-16","issue":42,"category":"devtools","categoryLabel":"Dev Tools","tags":["release-notes","changelog","git","shipping"],"difficulty":"easy","runtimes":["ChatGPT","Claude","Gemini","Cursor"],"excerpt":"Paste your commit subjects. Get clean release notes: user-facing changes, internals separated, breaking changes called out.","problem":"You shipped. Now someone has to write the changelog. The commits are a mess of fix typo, wip, and three real features buried in the noise.","videoUrl":null,"url":"https://oneagentaday.com/agents/release-notes-from-commits","apiUrl":"https://oneagentaday.com/api/agents/release-notes-from-commits.json","promptUrl":"https://oneagentaday.com/agents/release-notes-from-commits/prompt.txt","configUrl":null,"configFilename":null,"license":"CC-BY-4.0","howItWorks":"You merged the PR. The tag is ready. Then someone asks for release notes and you stare at `wip`, `fix typo`, and three real features scattered across forty commits.\n\nThis agent turns a raw commit list into honest notes. It does not invent features you did not ship. User-facing changes come first. Chores and refactors stay in Internal. Breaking changes get called out with a migration hint when the commits say one.\n\n## What to paste\n\nCommit subjects since the last release (`git log <tag>..HEAD --oneline` works). Short bodies help when the subject is vague. Say who will read the notes (customers, API integrators, both). Skip marketing goals—the prompt forbids fluff.\n\n## What you get back\n\nFour blocks. What's new (user-facing). Fixes. Breaking changes, or \"None.\" Internal (chores, refactors, tests, docs that are not user-facing). If a commit is too thin to classify, it lands under Needs a human with a one-line question.","steps":[{"name":"Grab the commits","text":"Copy commit subjects (and short bodies if useful) since the last tag or release. `git log v2.3.0..HEAD --oneline` is enough. Drop pure WIP noise if you want; the agent will flag thin ones anyway."},{"name":"Paste the prompt","text":"New chat in ChatGPT, Claude, Gemini, or Cursor. Paste the prompt, then your commit list plus who the notes are for. If it invents a feature you did not commit, reply: only use facts from the pasted commits."},{"name":"Check the split","text":"User-facing notes should read like something a customer cares about. Internals/chores stay in their own section. Breaking changes get their own callout with what to do instead."},{"name":"Ship the notes","text":"Paste into GitHub Releases, a CHANGELOG.md entry, or the status page. Keep the commit list nearby so you can spot-check one more time before publish."}],"demo":[{"second":0,"label":"The pile","detail":"Nine days of commits: dark mode, Stripe retry, eslint bump, BREAKING /v1 removal, WIP billing sketch, typo fix, CSV export."},{"second":8,"label":"User-facing","detail":"Dark mode on settings. CSV invoice export. Error banner typo fixed. Stripe webhooks retry on rate limits."},{"second":16,"label":"Internals vs breaking","detail":"Chore and refactor stay out of the customer list. BREAKING: /api/v1 gone—migrate to /api/v2."},{"second":24,"label":"Paste-ready notes","detail":"A short release block: What's new, Fixes, For API integrators, and Internal—no invented features, no marketing fluff."}],"sampleInput":"Commits since v2.3.0 (main, last 9 days):\n\n- feat(settings): add dark mode toggle and persist preference\n- fix(billing): retry Stripe webhook on 429 with backoff\n- chore: bump eslint to 9.12\n- BREAKING: remove legacy /api/v1 endpoints (use /api/v2)\n- docs: update README install steps for pnpm\n- wip: billing page layout sketch\n- fix: typo in error banner (\"occured\" → \"occurred\")\n- feat(export): CSV download for invoice history\n- refactor: extract date helpers (no behavior change)\n- test: add webhook retry unit tests\n\nAudience: customers on the SaaS dashboard + a short note for API integrators.\nTone: plain, no marketing.\n","prompt":"You write release notes from git commits. You are precise and allergic to marketing fluff. You only describe what the commits actually show.\n\nINPUT\nA list of commits (subjects, optional bodies) since the last release, plus who will read the notes (customers, API integrators, internal, or a mix). Treat WIP and vague subjects as incomplete, not as features.\n\nRULES\n- Only use facts from the pasted commits. Never invent features, product names, metrics, or \"users will love X.\"\n- Separate user-facing notes from internal/chore/refactor/test/docs-only work.\n- Call out breaking changes clearly. If the commits name a replacement or migration path, include it; if not, say what is removed and that a migration path was not in the commits.\n- Merge duplicate or overlapping commits into one note when they are clearly the same change.\n- Drop pure noise (empty WIP with no outcome) into Needs a human instead of pretending it shipped.\n- No hype adjectives, no emoji spam, no \"We're excited to announce.\"\n- If the list is too thin for real notes, say so in two sentences and list the three questions that would unblock useful notes. Then stop.\n\nOUTPUT\n## What's new\nBullets. User-facing features and improvements only.\n\n## Fixes\nBullets. User-visible bugfixes. If none, write \"None.\"\n\n## Breaking changes\nBullets. Each: what broke, who it affects, and migration hint if present in the commits. If none, write \"None.\"\n\n## Internal\nBullets. Chores, refactors, tests, tooling, non-user docs. If none, write \"None.\"\n\n## Needs a human\nBullets. Commits too vague to classify, with one clarifying question each. If none, write \"None.\"","config":null}}