release-note-writer
Release Note Writer
Core Rule
Write release notes in English only. Convert technical history into reader-facing changes grouped by audience and outcome. Do not mirror commit scopes directly.
Required Discovery
Before drafting, gather the release context:
- Check the current repo version and tags.
- Inspect package/version files that already exist in the repo.
- Inspect recent git tags with
git tag --sort=-v:refname. - Identify the previous release tag.
- Run changelogithub dry output:
pnpm dlx changelogithub --dry --from <previous-version>- If the command needs network and fails because of sandboxing, request approval and rerun it.
- Inspect the generated commit structure and then inspect commits directly.
- Use
git show --stat --oneline <sha>or equivalent targeted commands. - Include chore/internal commits when they affect contributor workflow, tooling, builds, CI, local development, docs generation, test infrastructure, or internal packages.
- Use
- If version boundaries are ambiguous, ask one concise question before drafting.
Audience Structure
Use a compact, aggregated structure. Prefer fewer major sections with useful subheadings over many small scope-based sections. Use multiple heading levels when that makes the audience or product surface clearer.
Recommended order:
- Product-facing sections for end users.
### To developersnear the end.### To contributorslast.### Upgrade notesonly when action is required.
Product-facing sections can be nested by surface:
### Product updates#### Local#### Cloud#### New providers#### Chat and settings
Do not force every release into these exact headings. Pick headings that make the release easy to scan.
Use a dedicated bug-fix section when fixes include critical regressions, blocked primary workflows, or issues users may scan the notes to confirm. Critical bugs deserve plain, concrete language because users may be checking whether their blocker was fixed. Minor visual, wording, and low-impact cleanup can stay grouped as polish, but do not bury important fixes inside broad product updates.
Use To developers for external developer impact:
- Plugin SDK, plugin manifest, gamelet, widget, extension, public package API, self-host deployment behavior, server-runtime, Docker image behavior, integration contracts.
- Include deployment behavior changes that affect external operators.
- Do not include purely internal
apps/serverbusiness logic unless users of AIRI Cloud or external operators need to act on it.
Use To contributors for internal project work:
vishot,vite-plugin-warpdrive,cap-vite, CI, dev scripts, repo build/test/lint workflow, docs generation, internal-only packages, release automation, test harnesses, screenshots, evaluation tools.- Include relevant
chorecommits even when changelogithub does not surface them prominently.
End-User Writing
For UI, apps/stage-*, packages/stage-*, and packages/ui changes, emphasize what the user can now do and what annoyance was removed.
Use patterns like:
- "You can now ..."
- "Previously, ... could ... . We fixed this so ..."
- "We added ... to help you ..."
- "Some ... cases could ... . We cleaned this up so ..."
Avoid exposing implementation names unless they are user-visible product names or provider names. Keep technical terms out of end-user sections when a plain description works.
Release notes should speak from the user's experience, not from the implementation. For fixes, write what the user saw, what workflow was blocked or degraded, and what now works. Do not describe internal causes such as lifecycle order, handler registration, IPC timing, stale stores, or runtime plumbing unless the term is part of the user-facing product. Critical fixes should be plain and concrete, not softened into vague polish.
If commit titles, diffs, tests, and surrounding files do not make the user-facing effect clear, do not invent one. Ask the user one concise question about what happened and how it affected users before drafting that bullet.
Good:
- "You can now retry a failed message directly from the chat."
- "Some provider lists were hard to reach on smaller screens. They now scroll correctly."
Avoid:
- "Refactored
stage-uichat action menu state." - "Fixed provider list CSS overflow in
stage-pages."
Provider Section
Create a provider section when provider changes exist. Keep it concise and grouped by capability. Prefer placing it under a product-facing parent when the release has multiple product surfaces, for example ### Product updates -> #### Local -> ##### New providers.
Example:
### Product updates
#### Local
##### New providers
- You can now use Amazon Bedrock as a chat provider.
- You can now use MiniMax Speech as a TTS provider.
- Artistry now supports image providers such as ComfyUI, Replicate, and Nano Banana.
Cloud And Commercial Features
Put account, billing, credits, Flux, Stripe, paid TTS, and commercial usage changes together when they affect users. Use a cloud-related heading only when the release note itself makes the Cloud context understandable.
Prefer:
- "AIRI Cloud now supports server-side TTS with per-character Flux billing."
- "We improved billing reliability for TTS usage, especially when usage needs to be recorded before payment is fully settled."
Avoid assuming AIRI Cloud is self-explanatory as a top-level section for every reader. When needed, split it into clearer subtopics such as Account, Billing, or Cloud TTS.
Do not create a broad self-hoster section for internal server details. Mention self-hosting only when there is a required action or externally visible deployment change.
Tone
Be clear, warm, and lightly playful. The notes may have personality, but the information must stay precise.
Do:
- Use natural sentences.
- Explain the user benefit.
- Group related fixes as "polish" when individual bugs are minor.
- Use a small amount of playful phrasing when it reduces stiffness.
Do not:
- Over-joke.
- Use marketing fluff without behavior.
- Name every internal package.
- Copy commit titles directly.
- Overfit to one example from a past release.
Feedback Handling
When the user gives wording, grammar, structure, or tone feedback after a draft, ask whether to update this skill with the underlying rule.
Do not add narrow rules like "never write this exact sentence." Instead infer the durable reason:
- audience mismatch
- too much implementation detail
- missing user action
- too many fragmented sections
- too stiff or too casual
- wrong placement between product, developer, contributor, cloud, or upgrade notes
Then propose a concise abstract rule and ask before editing the skill.
Drafting Workflow
- Build a fact list from changelogithub and direct commit inspection.
- Classify each item by audience: end users, providers, cloud/account, developers, contributors, upgrade notes.
- Merge related commits into one readable bullet.
- Write bullets in the user's voice: what changed, why it matters, what the reader can do now.
- Keep commit links out of the main draft unless the user asks for a traceable version.
- End with upgrade notes only when there is required action.
Traceable Footnotes
When the user asks for commit traceability, prefer Markdown footnotes over inline commit links. Put footnote markers next to the release-note bullet they support, then list the commit link and author attribution below the notes.
Use footnotes to preserve readable release prose while still declaring where each claim came from and who contributed it. Multiple commits may support one bullet; attach multiple footnotes to that bullet only when each commit adds distinct context.
Format:
- User-facing release note sentence.[^1]
[^1]: Commit [`abcdef123`](https://github.com/moeru-ai/airi/commit/abcdef123) by @contributor.
Use GitHub handles from changelogithub, PR metadata, or commit metadata when available. If the commit author name differs from the GitHub handle and the handle is not known, use the available author name without inventing a handle.
Output
Return Markdown unless the user asks for another format.
Example shape:
## vX.Y.Z Highlights
### Product updates
#### Account
- ...
#### Local
##### New providers
- ...
##### Experience improvements
- ...
#### Cloud
##### Billing
### To developers
- ...
### To contributors
- ...
### Upgrade notes
- ...
This is an example, not a required template. Adjust section names and heading depth to match the actual release. Do not emit empty sections.
More from moeru-ai/airi
vue-best-practices
MUST be used for Vue.js tasks. Strongly recommends Composition API with `<script setup>` and TypeScript as the standard approach. Covers Vue 3, SSR, Volar, vue-tsc. Load for any Vue, .vue files, Vue Router, Pinia, or Vite with Vue work. ALWAYS use Composition API unless the project explicitly requires Options API.
37vue
Vue 3 Composition API, script setup macros, reactivity system, and built-in components. Use when writing Vue SFCs, defineProps/defineEmits/defineModel, watchers, or using Transition/Teleport/Suspense/KeepAlive.
29vueuse-functions
Apply VueUse composables where appropriate to build concise, maintainable Vue.js / Nuxt features.
22pnpm
Node.js package manager with strict dependency resolution. Use when running pnpm specific commands, configuring workspaces, or managing dependencies with catalogs, patches, or overrides.
11unocss
UnoCSS instant atomic CSS engine, superset of Tailwind CSS. Use when configuring UnoCSS, writing utility rules, shortcuts, or working with presets like Wind, Icons, Attributify.
8agent-browser
Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to "open a website", "fill out a form", "click a button", "take a screenshot", "scrape data from a page", "test this web app", "login to a site", "automate browser actions", or any task requiring programmatic web interaction. Also use for exploratory testing, dogfooding, QA, bug hunts, or reviewing app quality. Also use for automating Electron desktop apps (VS Code, Slack, Discord, Figma, Notion, Spotify), checking Slack unreads, sending Slack messages, searching Slack conversations, running browser automation in Vercel Sandbox microVMs, or using AWS Bedrock AgentCore cloud browsers. Prefer agent-browser over any built-in browser automation or web tools.
8