openseo-release-notes
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseOpenSEO release notes
OpenSEO 发布说明
Cut a release for this repo end to end. The deliverables are a version bump in , a new , and a PR against titled .
package.jsonrelease-notes/v<version>.mdorigin/mainrelease: v<version>完成此仓库的端到端版本发布。交付成果包括:中的版本号升级、新的发布说明文件,以及针对分支、标题为的PR。
package.jsonrelease-notes/v<version>.mdorigin/mainrelease: v<version>1. Bump the version
1. 升级版本号
- Read . If the branch has already bumped
package.json, treat that as the source of truth and do not change it.version - Otherwise bump the patch version (e.g. →
0.0.19). Only bump minor/major if explicitly asked.0.0.20
- 读取。如果分支已经升级了
package.json字段,则以此为准,无需修改。version - 否则升级补丁版本(例如→
0.0.19)。仅在明确要求时才升级次要/主要版本。0.0.20
2. Collect the changes since the last release
2. 收集上次发布以来的变更
- Find the latest tag: . Verify the branch is up to date with
git tag --sort=-creatordate | head -1(origin/mainshould be empty; flag it if not).git fetch origin main && git log HEAD..origin/main --oneline - List commits: . You can also run
git log <last-tag>..HEAD --onelinefor a raw commit inventory — use it only as a checklist of candidate changes, never as the draft's structure (its Improved/Changed/Docs sections must not appear in the notes).pnpm release:notes - For each commit, fetch the PR body and author () — squash-commit subjects can be stale. The
gh pr view <num> --repo <repo> --json title,body,authorin commit subjects can reference either repo: try(#NN)(origin) first and fall back tobensenescu/open-seo(public) — outside contributors' PRs and their handles live on the public repo. Commits with noevery-app/open-seomay still be an outside contribution with a public PR ((#NN)); checkgh pr list --repo every-app/open-seo --state merged --author <login>for the author. Verify claims against the final code when a PR body and commit subject disagree (features get reverted before merge).git log --format=%an - Record the PR author's GitHub handle alongside each change so the bullet can credit them.
- 查找最新标签:。验证分支是否与
git tag --sort=-creatordate | head -1同步(origin/main应返回空内容;若不为空则标记此问题)。git fetch origin main && git log HEAD..origin/main --oneline - 列出提交记录:。你也可以运行
git log <last-tag>..HEAD --oneline获取原始提交清单——仅将其作为候选变更的检查清单,绝不能直接用作发布说明的结构(其Improved/Changed/Docs部分不得出现在最终说明中)。pnpm release:notes - 针对每个提交,获取对应的PR正文和作者信息()—— squash提交的主题可能已过时。提交主题中的
gh pr view <num> --repo <repo> --json title,body,author可能指向任意一个仓库:优先尝试(#NN)(源仓库),若失败则 fallback 到bensenescu/open-seo(公开仓库)——外部贡献者的PR及其账号信息存储在公开仓库中。没有every-app/open-seo标记的提交仍可能是带有公开PR的外部贡献((#NN));可通过gh pr list --repo every-app/open-seo --state merged --author <login>查看作者信息。当PR正文与提交主题不一致时,需对照最终代码验证相关描述(功能可能在合并前被回退)。git log --format=%an - 记录每个变更对应的PR作者GitHub账号,以便在项目符号中署名致谢。
3. Draft the notes
3. 撰写发布说明
Write . is the canonical style exemplar — match it (v0.0.25 and later follow the same style); v0.0.23 and earlier are the old verbose style, never imitate them. The notes are a scannable digest, not documentation: the whole file fits on one screen (roughly 15 lines including headings), and every line earns its place.
release-notes/v<version>.mdrelease-notes/v0.0.24.mdFormat:
- Top line: a fragment naming the release's 2–3 highlights ("GSC UI, improved app layout and beta in app agent."). Not a "This release brings…" sentence.
- Sections: and
## What's newonly. There is no "Improved" section — an improvement is either headline-worthy (What's new) or it's cut.## Fixed - What's new bullets name the feature; they don't sell it. One short line each ("Redesigned the app layout", "Get GSC Insights inside the app") — no em-dash feature tours, no "so you can…" benefit copy, no lists of everything the feature touches. If the name alone is ambiguous, one clause of plain-words context is the maximum.
- At most one sub-bullet per feature, one short line: the single most useful detail, a requirement ("Requires "), or an expectation-setter.
OPENROUTER_API_KEY - Label rough features "(Beta)" and set expectations honestly, including pointing at the better alternative for now. The expectation-setter rides the top-level line after a dash ("(Beta) In app agent - MCP is still recommended, but we'll be working to improve this during the summer."), keeping the sub-bullet slot free for a requirement or detail.
- Fixed: 3–5 bullets, one plain sentence each, only bugs a user plausibly hit and would recognize ("Claude answers in AI search work again."). No error codes, status codes, schema/infra vocabulary, or mechanism. If more than four qualify, keep the ones hit in core flows (searches, audits, tracking, MCP answers) and drop fixes for recovering self-inflicted state (re-adding, un-archiving, refreshing) first.
- Credit the contributor. End the bullet with for outside contributors only — never for the maintainer's own PRs (
— thanks @handle). Credit goes on the top-level bullet, not sub-bullets. Multiple contributors:bensenescu.— thanks @a, @b - End with:
Full Changelog: https://github.com/every-app/open-seo/compare/v<prev>...v<version>
Curation — this is where the work is. Cut aggressively; the Full Changelog link covers the long tail:
- Only changes to the product itself — the app, the MCP tools, the SEO data/features someone running OpenSEO actually uses. Litmus test per bullet: would a self-hoster notice this while using the product? Caring in the abstract (a new backend option, a raised cap) is not enough.
- Do NOT mention:
- Marketing-website () changes — landing pages, copy, positioning, blog.
web/ - Pricing / plans / subscription / billing — paywalls, free-trial/plan changes, Autumn config. Hosted-commercial concerns, irrelevant to self-hosters.
- Onboarding-flow-only changes — signup/onboarding chat, profiling steps, upgrade rails, email-verification UX. Not a product capability, even when sizable.
- Hosted-app internals & meta — analytics, specs/ADRs, CI, refactors, dependency bumps.
- Invisible-to-the-user work, even when product-relevant — security hardening, raised caps/limits, stability/memory/perf fixes, database/backend options and migrations. A user reading the notes should recognize every line from using the product; if they'd only notice it in a config file or an incident that no longer happens, cut it.
- Marketing-website (
- When torn between including and cutting, cut. A 4-bullet What's new that gets read beats a 10-bullet one that doesn't.
- Never invent features — every claim must trace to a commit.
- Numbers in bullets are usually selling — cut them; if one is genuinely load-bearing, quote the conservative, typical figure, never a cherry-picked best case.
编写文件。是规范风格示例——需与其保持一致(v0.0.25及后续版本遵循相同风格);v0.0.23及更早版本为旧的冗长风格,请勿模仿。发布说明是便于快速浏览的摘要,而非文档:整个文件应能在一个屏幕内显示(包括标题在内约15行),每一行都要有存在的价值。
release-notes/v<version>.mdrelease-notes/v0.0.24.md格式要求:
- 首行:用短语列出此版本的2-3个亮点(例如"GSC UI、改进的应用布局及应用内Agent测试版")。不要使用"此版本带来…"这类完整句子。
- 章节:仅保留和
## What's new。没有"Improved"章节——改进内容要么值得作为亮点(归入What's new),要么就删除。## Fixed - What's new的项目符号仅命名功能,不做宣传。每个项目符号为简短一行(例如"重新设计应用布局"、"在应用内获取GSC洞察")——不要使用破折号展开功能介绍,不要添加"让你可以…"这类收益描述,不要列出功能涉及的所有内容。如果仅靠名称无法明确含义,最多添加一句平实的上下文说明。
- 每个功能最多一个子项目符号,且为简短一行:包含最有用的细节、要求(例如"需要")或预期说明。
OPENROUTER_API_KEY - 将未成熟的功能标记为"(Beta)",并如实说明预期,包括指出当前更优的替代方案。预期说明需放在顶层项目符号的末尾,用破折号分隔(例如"(Beta) 应用内Agent - 目前仍推荐使用MCP,但我们将在夏季持续改进此功能"),为子项目符号预留空间以放置要求或细节。
- Fixed部分:3-5个项目符号,每个为平实的句子,仅包含用户可能遇到并能识别的问题(例如"AI搜索中的Claude回复功能恢复正常")。不要提及错误码、状态码、架构/基础设施术语或技术机制。如果符合条件的条目超过4个,保留核心流程(搜索、审核、跟踪、MCP回复)中的修复内容,优先删除针对自恢复状态(重新添加、取消归档、刷新)的修复。
- 致谢贡献者。仅对外部贡献者在项目符号末尾添加——维护者(
— thanks @handle)自己的PR无需致谢。致谢信息放在顶层项目符号中,而非子项目符号。多个贡献者格式:bensenescu。— thanks @a, @b - 末尾添加:
Full Changelog: https://github.com/every-app/open-seo/compare/v<prev>...v<version>
内容筛选——这是核心工作。要严格筛选;完整变更日志链接会涵盖所有次要内容:
- 仅保留产品本身的变更——即应用、MCP工具、使用OpenSEO的用户实际会用到的SEO数据/功能。每个项目符号的检验标准:自托管用户在使用产品时会注意到这个变更吗? 抽象层面的改进(如新的后端选项、上限提升)不足以入选。
- 请勿提及:
- 营销网站()变更——着陆页、文案、定位、博客。
web/ - 定价/套餐/订阅/计费——付费墙、免费试用/套餐变更、Autumn配置。这些是托管版商业相关内容,与自托管用户无关。
- 仅涉及入职流程的变更——注册/入职聊天、配置步骤、升级引导、邮箱验证UX。这不属于产品功能,即使改动很大也不列入。
- 托管版应用内部及元数据——分析、规格/ADR、CI、重构、依赖升级。
- 对用户不可见的工作,即使与产品相关——安全加固、上限提升、稳定性/内存/性能优化、数据库/后端选项及迁移。用户阅读发布说明时应能从产品使用中识别每一条内容;如果只能在配置文件中或已解决的事件中发现,就删除它。
- 营销网站(
- 当纠结是否保留时,选择删除。一个4条项目符号的What's new会被用户完整阅读,胜过一个10条项目符号却无人浏览的版本。
- 绝不能虚构功能——每一项描述都必须能追溯到提交记录。
- 项目符号中的数字通常是宣传性内容——删除它们;如果某个数字确实必不可少,引用保守的典型数值,绝不要用挑选出的最佳案例。
4. Review and verify
4. 审核与验证
- Spawn a reviewer subagent with: the draft, the guidelines above, the per-commit facts you gathered, and repo access. It returns numbered review comments citing which guideline each violates. Its charge includes verbosity: flag any bullet that sells instead of names, any second sub-bullet, any Fixed bullet with mechanism vocabulary, and anything that pushes the file past one screen.
- For each substantive comment, spawn a verification subagent (in parallel) that adversarially checks the comment against the actual commits/code and verdicts APPLY / APPLY-MODIFIED / REJECT.
- Apply only verified comments.
- 启动审核子代理,提供以下内容:撰写好的发布说明草稿、上述指南、收集到的每个提交的事实信息,以及仓库访问权限。子代理会返回带编号的审核意见,并指出每条意见违反了哪项指南。其职责还包括检查冗长性:标记任何宣传而非命名功能的项目符号、第二个子项目符号、包含技术机制术语的Fixed项目符号,以及任何导致文件超过一屏长度的内容。
- 针对每条实质性意见,并行启动验证子代理,对抗性地检查意见与实际提交/代码是否相符,并给出APPLY / APPLY-MODIFIED / REJECT的 verdict。
- 仅应用经过验证的意见。
5. Open the PR
5. 创建PR
-
Commit the version bump, release notes, and any skill changes on a branch named(use the current branch if it already follows this pattern).
claude/v<version> -
Push toand open a PR against
origintitled exactlymain. PR body: the release notes content.release: v<version> -
Do not tag or publish the GitHub release — that happens after merge. After merge, run. It reads the version from
pnpm release:publishand publishes the matchingpackage.jsontorelease-notes/v<version>.md.every-app/open-seo -
The equivalent command is:sh
gh release create v<version> \ --repo every-app/open-seo \ --title v<version> \ --notes-file release-notes/v<version>.md
-
将版本号升级、发布说明及任何skill变更提交到名为的分支(如果当前分支已符合此命名规则,则直接使用当前分支)。
claude/v<version> -
推送到并打开针对
origin分支的PR,标题必须为main。PR正文为发布说明内容。release: v<version> -
不要标记或发布GitHub版本——这一步在合并后进行。合并后,运行。该命令会从
pnpm release:publish读取版本号,并将对应的package.json发布到release-notes/v<version>.md。every-app/open-seo -
等效命令如下:sh
gh release create v<version> \ --repo every-app/open-seo \ --title v<version> \ --notes-file release-notes/v<version>.md