Version Release Workflow This skill is a router. The detailed steps live in . Scope Boundary (Important) This skill is only for: 1. Release branch / PR workflow 2. CI trigger constraints ( ) 3. GitHub Release note writing This skill is not for writing .\ If the user asks for website changelog pages, load . Mandatory Companion Skill For every execution, you MUST load and apply: - Overview The primary development branch is canary . All day-to-day development happens on canary. When releasing, canary is merged into main. After merge, automatically handles tagging, version bumping, creating a Git…

\\\n | sort -u > /tmp/release_prs.txt\n```\n\nHard rules:\n\n- Every `(#XXXX)` you write in the body **must** appear in `/tmp/release_prs.txt`. No exceptions.\n- Never infer a PR number from a feature description. If you remember \"the KB BM25 PR was around #14501\", that memory is wrong about half the time. Look up the commit hash by feature keyword and read its actual subject.\n- If your terminal truncates long subjects (any wrapper that compresses output, e.g. `rtk`), bypass it. With `rtk` use `rtk proxy git log …`. Verify with `wc -l /tmp/release_prs.txt` — the count must match `git log $PREV_TAG..HEAD --no-merges --pretty=format:'%h' | wc -l` minus the few commits without a PR ref. A mismatch of >5% means subjects are being silently truncated.\n\n### 3. Metrics must come from git counts\n\n```bash\nPR_COUNT=$(wc -l \u003c /tmp/release_prs.txt | tr -d ' ')\n\nCOMMIT_COUNT=$(git log \"$PREV_TAG..origin/release/weekly-{YYYYMMDD}\" --no-merges --pretty=format:'%h' | wc -l | tr -d ' ')\n\nCONTRIBUTOR_COUNT=$(git log \"$PREV_TAG..origin/release/weekly-{YYYYMMDD}\" --no-merges --pretty=format:'%an' \\\n | sort -u \\\n | grep -viE '^(lobehubbot|LobeHub Bot|renovate\\[bot\\])

Version Release Workflow This skill is a router. The detailed steps live in . Scope Boundary (Important) This skill is only for: 1. Release branch / PR workflow 2. CI trigger constraints ( ) 3. GitHub Release note writing This skill is not for writing .\ If the user asks for website changelog pages, load . Mandatory Companion Skill For every execution, you MUST load and apply: - Overview The primary development branch is canary . All day-to-day development happens on canary. When releasing, canary is merged into main. After merge, automatically handles tagging, version bumping, creating a Git…

\\\n | wc -l | tr -d ' ')\n```\n\nIf a number cannot be confidently derived, omit it — never guess.\n\n### 4. Author-to-handle resolution\n\nGit `%an` is the commit author display name, not the GitHub handle. For each author you mention, confirm the handle:\n\n```bash\ngh pr view \"$PR_NUMBER\" --repo lobehub/lobe-chat --json author --jq '.author.login'\n```\n\nUse the result for `@handle`. Then classify each author per the `LobeHub team roster` below; community first, team after.\n\n### 5. Pre-publish verification (mandatory)\n\nBefore `gh pr create` / `gh pr edit --body-file`, diff body PR refs against the canonical set:\n\n```bash\ngrep -oE '#[0-9]+' release_body.md | sort -u > /tmp/body_prs.txt\nsed 's/[()]//g' /tmp/release_prs.txt > /tmp/release_prs_clean.txt\n\necho \"=== In body but NOT in actual range (must be EMPTY) ===\"\ncomm -23 /tmp/body_prs.txt /tmp/release_prs_clean.txt\n```\n\nEmpty diff = OK. Any output = the body cites a PR that wasn't merged in this range. Stop and fix before publishing.\n\nAlso verify the metrics line in the body matches the computed values (`PR_COUNT`, `CONTRIBUTOR_COUNT`) and that `**Full Changelog**` uses `$PREV_TAG`, not some older tag.\n\n## Canonical Structure (Long-Form: Minor / Weekly)\n\nFollow this section order for **Minor** and **Weekly** releases unless the user asks otherwise. For **Hotfix** and **DB Migration**, see § Variants for Shorter Releases below — the canonical structure does not apply.\n\n1. `# 🚀 LobeHub Release (\u003cYYYYMMDD>)`\n2. Metadata lines:\n - `Release Date`\n - `Since \u003cPrevious Version>` metrics\n3. One quoted release thesis (single paragraph, 1-2 lines)\n4. `## ✨ Highlights` (6-12 bullets for major releases; 3-8 for weekly)\n5. Domain blocks with optional `###` subsections:\n - `## 🏗️ Core Agent & Architecture` (or equivalent product core)\n - `## 📱 Platforms / Integrations`\n - `## 🖥️ CLI & User Experience`\n - `## 🔧 Tooling`\n - `## 🔒 Security & Reliability`\n - `## 📚 Documentation` (optional if meaningful)\n6. `## 👥 Contributors`\n7. `**Full Changelog**: \u003cprev>...\u003ccurrent>`\n\nUse `---` separators between major blocks for long releases.\n\n## Variants for Shorter Releases\n\nThe Canonical Structure above is for **long-form** (Minor / Weekly). Two short-form variants override it.\n\n### Hotfix Variant\n\nA hotfix targets one regression and ships fast. The body is short and operator-focused — no Highlights, no domain blocks, no Contributors line.\n\nRequired sections, in order:\n\n1. `# 🚀 LobeHub Release (\u003cYYYYMMDD>)`\n2. `**Hotfix Scope:**` — one line summarizing the regression scope (e.g. `Agent topic-switching regression — stale chat state on agent change`). Replaces the long-form `Release Date` / `Since vX.Y.Z` metrics.\n3. One quoted thesis (single paragraph, 1-2 lines) describing what is now restored.\n4. `## 🐛 What's Fixed` — 1-3 bullets, each `**\u003csymptom>** — \u003cfix in one sentence>. (#PR)`. No root-cause prose; that lives in the commit message.\n5. `## ⚙️ Upgrade` — short notes for self-hosted (pull image / restart, schema or env changes) and cloud (usually \"applied automatically\").\n6. `## 👥 Owner` — single `@handle` for the PR author, resolved via `gh pr view \"$PR\" --json author --jq '.author.login'`. Never hardcoded.\n\nHard rules specific to hotfix:\n\n- **No Highlights / domain blocks / Contributors / Full Changelog** — these add noise to a one-shot fix.\n- **No metric line** — `Since vX.Y.Z` doesn't apply; the body cites the single PR (or 1-3 PRs) directly.\n- **Owner ≠ Contributors** — one author, listed under § Owner. Not a flat handle list.\n- See `changelog-example/hotfix.md` for the canonical template.\n\n### DB Migration Variant\n\nDatabase schema changes that need to be released independently. Operator impact is the headline.\n\nRequired sections, in order:\n\n1. `# 🚀 LobeHub Release (\u003cYYYYMMDD>)` + scope line\n2. **Migration overview** — what tables / columns are added, modified, or removed\n3. **Operator impact** — backwards-compatible? required actions for self-hosted?\n4. **Rollback / backup note** — how to recover\n5. `## 👥 Owner` — single PR author, resolved via `gh pr view`\n\nSee `changelog-example/db-migration.md` for the canonical template.\n\n## Writing Rules (Hard)\n\n1. **No fabricated metrics**: all numbers must be traceable.\n2. **No vague headline bullets**: each bullet must include capability + impact.\n3. **No internal-only framing**: phrase from user/operator perspective.\n4. **Security must be explicit** when security-sensitive fixes are present.\n5. **PR/issue linkage**: use `(#1234)` when IDs are available.\n6. **Terminology consistency**: same feature/provider name across sections.\n7. **Do not bury migration or breaking changes**: elevate to dedicated section or callout.\n\n## Style Rules (Long-Form)\n\n1. Start with an \"everyday use\" framing, not implementation internals.\n2. Mix narrative sentence + evidence bullets.\n3. Keep bullets compact but informative:\n - Good: `**Fast Mode (`/fast`)** — Priority routing for OpenAI and Anthropic, reducing latency on supported models. (#6875, #6960)`\n4. Use bold only for capability names, not for whole sentences.\n5. Keep heading depth ≤ 3 levels.\n\n## Release Size Heuristics\n\n- **Minor / major milestone release**\n - Long-form structure with multiple domain blocks.\n - `Highlights` usually 8-12 bullets.\n- **Weekly patch release**\n - Long-form skeleton with reduced subsection count.\n - `Highlights` usually 4-8 bullets.\n- **Hotfix release**\n - Short-form (see § Variants → Hotfix). No Highlights, no domain blocks, no Contributors.\n - 1-3 fix bullets. Body should fit on one screen.\n- **DB migration release**\n - Short-form (see § Variants → DB Migration).\n - Must include `Migration overview`, operator impact, and rollback/backup note.\n\n## Contributor Ordering\n\nRender contributors as a **single flat list** (no separate \"Community\" / \"Core Team\" subsections). Order: **community contributors first, team members after**. Within each group, sort by PR count desc. Bots (`@lobehubbot`, `renovate[bot]`) go on a separate \"maintenance\" line.\n\n**LobeHub team roster** — anyone in this list is a team member; anyone not in this list is a community contributor:\n\n- @arvinxx\n- @Innei\n- @tjx666 (commit author name: YuTengjing)\n- @LiJian\n- @Neko\n- @Rdmclin2\n- @AmAzing129\n- @sudongyuer (commit author name: Tsuki)\n- @rivertwilight (commit author name: René Wang)\n- @CanisMinor\n- @cy948 (commit author name: Rylan Cai)\n\n> **Resolving handles** — git author names (e.g. `YuTengjing`) are not always the GitHub handle. Verify via `gh pr view \"$PR\" --json author` or `gh api search/users -f q='\u003cemail>'` before listing.\n\nIf a new contributor appears who is not on this list, treat them as community by default and ask the user whether to add them to the roster.\n\n## Template\n\n```md\n# 🚀 LobeHub Release (\u003cYYYYMMDD>)\n\n**Release Date:** \u003cMonth DD, YYYY> \n**Since \u003cPrevious Version>:** \u003cN merged PRs> · \u003cN resolved issues> · \u003cN contributors>\n\n> \u003cOne release thesis sentence: what this release unlocks in practice.>\n\n---\n\n## ✨ Highlights\n\n- **\u003cCapability A>** — \u003cWhat changed and why it matters>. (#1234)\n- **\u003cCapability B>** — \u003cWhat changed and why it matters>. (#2345)\n- **\u003cCapability C>** — \u003cWhat changed and why it matters>. (#3456)\n\n---\n\n## 🏗️ Core Product & Architecture\n\n### \u003cSubdomain>\n\n- \u003cConcrete change + impact>. (#...)\n- \u003cConcrete change + impact>. (#...)\n\n---\n\n## 📱 Platforms / Integrations\n\n- \u003cPlatform update + impact>. (#...)\n- \u003cCompatibility/reliability fix + impact>. (#...)\n\n---\n\n## 🖥️ CLI & User Experience\n\n- \u003cUser-facing workflow improvement>. (#...)\n- \u003cQuality-of-life fix>. (#...)\n\n---\n\n## 🔧 Tooling\n\n- \u003cTool/runtime improvement>. (#...)\n\n---\n\n## 🔒 Security & Reliability\n\n- **Security:** \u003chardening or vulnerability fix>. (#...)\n- **Reliability:** \u003cstability/performance behavior improvement>. (#...)\n\n---\n\n## 👥 Contributors\n\nHuge thanks to **\u003cN contributors>** who shipped **\u003cN merged PRs>** this cycle.\n\n@\u003ccommunity-handle> · @\u003ccommunity-handle> · @\u003cteam-handle> · @\u003cteam-handle>\n\nPlus @lobehubbot and renovate[bot] for maintenance.\n\n---\n\n**Full Changelog**: \u003cprevious_tag>...\u003ccurrent_tag>\n```\n\n## Quick Checklist\n\n### Long-Form (Minor / Weekly)\n\n- [ ] `PREV_TAG` is `git describe --tags --abbrev=0 origin/main` (latest semver), not the last weekly's tag\n- [ ] Every `(#XXXX)` in the body appears in `/tmp/release_prs.txt` (verified via `comm -23`)\n- [ ] `Since v…` line uses `$PREV_TAG`; PR / contributor counts match `wc -l` on the computed sets\n- [ ] `**Full Changelog**` uses `$PREV_TAG...release/weekly-\u003cYYYYMMDD>` (or `…v{x.y.z}` for minor)\n- [ ] Author handles resolved via `gh pr view --json author`, not assumed from `%an`\n- [ ] Uses top metadata and a clear release thesis\n- [ ] Includes `Highlights` plus domain-grouped sections\n- [ ] Every major bullet states both change and user/operator impact\n- [ ] Security and reliability updates are explicitly surfaced (when present)\n- [ ] Contributor credits and compare range are included\n- [ ] All numbers and claims are verifiable\n\n### Hotfix\n\n- [ ] `**Hotfix Scope:**` line replaces metrics line\n- [ ] Single quoted thesis describes what is restored (operator-facing, not internal)\n- [ ] `## 🐛 What's Fixed` has 1-3 bullets, each `**\u003csymptom>** — \u003cfix>. (#PR)` with PR ref verified to exist and be merged\n- [ ] `## ⚙️ Upgrade` notes self-hosted action and cloud auto-apply\n- [ ] `## 👥 Owner` is a single `@handle` resolved via `gh pr view \"$PR\" --json author`\n- [ ] No Highlights / domain blocks / Contributors / Full Changelog included\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":14154,"content_sha256":"f8d8b752e79b2ae650873e022726332d1cb3f67ffcb044d2eae8669d828abada"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Version Release Workflow","type":"text"}]},{"type":"paragraph","content":[{"text":"This skill is a router. The detailed steps live in ","type":"text"},{"text":"references/","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Scope Boundary (Important)","type":"text"}]},{"type":"paragraph","content":[{"text":"This skill is only for:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Release branch / PR workflow","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"CI trigger constraints (","type":"text"},{"text":"auto-tag-release.yml","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"GitHub Release note writing","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"This skill is ","type":"text"},{"text":"not","type":"text","marks":[{"type":"strong"}]},{"text":" for writing ","type":"text"},{"text":"docs/changelog/*.mdx","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"},{"type":"br"},{"text":"If the user asks for website changelog pages, load ","type":"text"},{"text":"../docs-changelog/SKILL.md","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Mandatory Companion Skill","type":"text"}]},{"type":"paragraph","content":[{"text":"For every ","type":"text"},{"text":"/version-release","type":"text","marks":[{"type":"code_inline"}]},{"text":" execution, you MUST load and apply:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"../microcopy/SKILL.md","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Overview","type":"text"}]},{"type":"paragraph","content":[{"text":"The primary development branch is ","type":"text"},{"text":"canary","type":"text","marks":[{"type":"strong"}]},{"text":". All day-to-day development happens on canary. When releasing, canary is merged into main. After merge, ","type":"text"},{"text":"auto-tag-release.yml","type":"text","marks":[{"type":"code_inline"}]},{"text":" automatically handles tagging, version bumping, creating a GitHub Release, and syncing back to the canary branch.","type":"text"}]},{"type":"paragraph","content":[{"text":"Only two release types are used in practice (major releases are extremely rare and can be ignored):","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Type","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Use Case","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Frequency","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Source Branch","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"PR Title Format","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Version","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Reference","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Minor","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Feature iteration release","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"~Every 4 weeks","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"canary","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"🚀 release: v{x.y.0}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Manually set","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/minor-release.md","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Patch","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Weekly release / hotfix / model / DB migration","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"~Weekly or as needed","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"canary or main","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Custom (e.g. ","type":"text"},{"text":"🚀 release: 20260222","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Auto patch +1","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/patch-release-scenarios.md","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"paragraph","content":[{"text":"For writing the release-note body (any release type), see ","type":"text"},{"text":"references/release-notes-style.md","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Auto-Release Trigger Rules (","type":"text"},{"text":"auto-tag-release.yml","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]},{"type":"paragraph","content":[{"text":"After a PR is merged into main, CI determines whether to release based on the following priority:","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"1. Minor Release (Exact Version)","type":"text"}]},{"type":"paragraph","content":[{"text":"PR title matches ","type":"text"},{"text":"🚀 release: v{x.y.z}","type":"text","marks":[{"type":"code_inline"}]},{"text":" -> uses the version number from the title.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"2. Patch Release (Auto patch +1)","type":"text"}]},{"type":"paragraph","content":[{"text":"Triggered by the following priority:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Branch name match","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"hotfix/*","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"release/*","type":"text","marks":[{"type":"code_inline"}]},{"text":" -> triggers directly (skips title detection)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Title prefix match","type":"text","marks":[{"type":"strong"}]},{"text":": PRs with the following title prefixes will trigger:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"style","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"💄 style","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"feat","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"✨ feat","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"fix","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"🐛 fix","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"refactor","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"♻️ refactor","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"hotfix","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"🐛 hotfix","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"🩹 hotfix","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"build","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"👷 build","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"3. No Trigger","type":"text"}]},{"type":"paragraph","content":[{"text":"PRs that don't match any conditions above (e.g. ","type":"text"},{"text":"docs","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"chore","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"ci","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"test","type":"text","marks":[{"type":"code_inline"}]},{"text":") will not trigger a release when merged into main.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Post-Release Automated Actions","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Bump ","type":"text","marks":[{"type":"strong"}]},{"text":"package.json","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" — commits ","type":"text"},{"text":"🔖 chore(release): release version v{x.y.z} [skip ci]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Create annotated tag","type":"text","marks":[{"type":"strong"}]},{"text":" — ","type":"text"},{"text":"v{x.y.z}","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Create GitHub Release","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Dispatch ","type":"text","marks":[{"type":"strong"}]},{"text":"sync-main-to-canary","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" — syncs main back to canary","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Agent Action Guide","type":"text"}]},{"type":"paragraph","content":[{"text":"When the user requests a release:","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Precheck (applies to all release types)","type":"text"}]},{"type":"paragraph","content":[{"text":"Before creating the release branch, verify the source branch:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Weekly Release","type":"text","marks":[{"type":"strong"}]},{"text":" (","type":"text"},{"text":"release/weekly-*","type":"text","marks":[{"type":"code_inline"}]},{"text":"): must branch from ","type":"text"},{"text":"canary","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"All other release/hotfix branches","type":"text","marks":[{"type":"strong"}]},{"text":": must branch from ","type":"text"},{"text":"main","type":"text","marks":[{"type":"code_inline"}]},{"text":"; run ","type":"text"},{"text":"git merge-base --is-ancestor main \u003cbranch> && echo OK","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If the branch is based on the wrong source, recreate from the correct base","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Routing","type":"text"}]},{"type":"paragraph","content":[{"text":"Pick the right reference and follow it end-to-end:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Minor release","type":"text","marks":[{"type":"strong"}]},{"text":" → ","type":"text"},{"text":"references/minor-release.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Patch release","type":"text","marks":[{"type":"strong"}]},{"text":" (weekly / hotfix / model launch / DB migration) → ","type":"text"},{"text":"references/patch-release-scenarios.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Writing the PR body / release notes","type":"text","marks":[{"type":"strong"}]},{"text":" (any release type) → ","type":"text"},{"text":"references/release-notes-style.md","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Hard Rules (apply to every release type)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Do NOT","type":"text","marks":[{"type":"strong"}]},{"text":" manually modify ","type":"text"},{"text":"package.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" version — CI handles it.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Do NOT","type":"text","marks":[{"type":"strong"}]},{"text":" manually create tags — CI handles them.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Minor PR title format is strict (","type":"text"},{"text":"🚀 release: v{x.y.z}","type":"text","marks":[{"type":"code_inline"}]},{"text":").","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Patch PRs do not need an explicit version number.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keep release facts accurate; do not invent metrics or availability statements. Release-note inputs (compare base, PR refs, contributor list) ","type":"text"},{"text":"must be derived from ","type":"text","marks":[{"type":"strong"}]},{"text":"git","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" per ","type":"text"},{"text":"references/release-notes-style.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" § Computing Inputs — never from memory or descriptions.","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"version-release","author":"@skillopedia","source":{"stars":78061,"repo_name":"lobehub","origin_url":"https://github.com/lobehub/lobehub/blob/HEAD/.agents/skills/version-release/SKILL.md","repo_owner":"lobehub","body_sha256":"9ed468a5f842684f04d2be054bd2eefaa69013d1c14c8cb64fd2a689b7eadf03","cluster_key":"24917ff138908ac60c797a13ce21a5a577fc38c0c525ffb189e07ed3fe2fd384","clean_bundle":{"format":"clean-skill-bundle-v1","source":"lobehub/lobehub/.agents/skills/version-release/SKILL.md","attachments":[{"id":"da31fb10-b970-5a00-8e55-4d1ffcf5adc9","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/da31fb10-b970-5a00-8e55-4d1ffcf5adc9/attachment.md","path":"references/changelog-example/db-migration.md","size":1795,"sha256":"c8121f97743c723d6dca09da9fb8a309d0717cd2bc1b7d09cc9cbff9046cb9d3","contentType":"text/markdown; charset=utf-8"},{"id":"6b301840-b283-5fbe-94c0-aa6873aee576","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/6b301840-b283-5fbe-94c0-aa6873aee576/attachment.md","path":"references/changelog-example/hotfix.md","size":967,"sha256":"1b5fe0f4e78d9b6db7066495761b3b18b44ac7ea437ecfbd63560b611bdbd242","contentType":"text/markdown; charset=utf-8"},{"id":"4eed9009-4f4f-53b4-b301-fb53625a53bb","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4eed9009-4f4f-53b4-b301-fb53625a53bb/attachment.md","path":"references/changelog-example/weekly-release.md","size":3751,"sha256":"79a614a460b458e7e94e4240b5f8ace8d8ff314de666da5ce7f546411bef5a86","contentType":"text/markdown; charset=utf-8"},{"id":"31df543e-785c-5b23-b7b2-0b5ecc9f6227","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/31df543e-785c-5b23-b7b2-0b5ecc9f6227/attachment.md","path":"references/minor-release.md","size":1796,"sha256":"68180f82d7c5617a86bf3c7d7da54c2de905ef0d4aa8f9b67351da69679b575a","contentType":"text/markdown; charset=utf-8"},{"id":"21009d89-5d94-5247-90d8-318e6f3679e0","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/21009d89-5d94-5247-90d8-318e6f3679e0/attachment.md","path":"references/patch-release-scenarios.md","size":4205,"sha256":"35e501b3c25e45e8db37c2dd74ca1c13d4e92a12b1e5bdcac0afdc09252a56f2","contentType":"text/markdown; charset=utf-8"},{"id":"83d65172-8f9f-518c-9609-202766a20095","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/83d65172-8f9f-518c-9609-202766a20095/attachment.md","path":"references/release-notes-style.md","size":14154,"sha256":"f8d8b752e79b2ae650873e022726332d1cb3f67ffcb044d2eae8669d828abada","contentType":"text/markdown; charset=utf-8"}],"bundle_sha256":"f559056ca707d93c1b0075e127fd7885ad3921fbcfb655e82db97260fad84e1d","attachment_count":6,"text_attachments":6,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":2,"skill_md_path":".agents/skills/version-release/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"integrations-apis","category_label":"Integrations"},"exact_dupes_collapsed_into_this":1},"version":"v1","category":"integrations-apis","import_tag":"clean-skills-v1","description":"Version release workflow — release process and GitHub Release notes (not docs/changelog pages).","argument-hint":"[minor|patch] [version?]","disable-model-invocation":true}},"renderedAt":1782979374581}

Version Release Workflow This skill is a router. The detailed steps live in . Scope Boundary (Important) This skill is only for: 1. Release branch / PR workflow 2. CI trigger constraints ( ) 3. GitHub Release note writing This skill is not for writing .\ If the user asks for website changelog pages, load . Mandatory Companion Skill For every execution, you MUST load and apply: - Overview The primary development branch is canary . All day-to-day development happens on canary. When releasing, canary is merged into main. After merge, automatically handles tagging, version bumping, creating a Git…