chore(release): prepare v0.2.99 notes and refine release formatting

- Add v0.2.99 release notes in all four supported languages
- Limit GitHub Release notes to English followed by Simplified Chinese
- Preserve all translations in app update manifests
- Update release documentation and tests
This commit is contained in:
lzt404 committed 2026-09-19 20:42:30 +08:00
1 parent cb7c701f04
commit bc8b34f9f1
12 files changed
+86 -32

No files matched your search

+1 -1
View File
@@ -49,7 +49,7 @@ APIMart 是一个低成本的 AI 图像与视频生成 API 平台——GPT-Image
每次启动软件时,软件和内核会各自在后台自动检查一次更新;之后每进入 **版本管理** 页面 5 次(第 5、10、15 次,以此类推)自动检查一次,也可随时通过各自的 **检查更新** 按钮手动检查。页面内部刷新不重复计数,重启软件后次数归零。修改下载源不会自动检查更新,重新进入页面也会保留已保存的下载源。检查不会自动下载或安装更新。
**版本管理** 页面同时展示当前界面语言的最新版软件更新说明,升级后仍可查看。发布者在 [`docs/release-notes/`](docs/release-notes/README.md) 中按版本分别编辑简体中文、繁体中文、英文和日文 Markdown,CI 会将内容用于 GitHub Release 正文和应用更新清单。当前语言的说明缺失时直接提示,不回退到其他语言。
**版本管理** 页面同时展示当前界面语言的最新版软件更新说明,升级后仍可查看。发布者在 [`docs/release-notes/`](docs/release-notes/README.md) 中按版本分别编辑简体中文、繁体中文、英文和日文 Markdown,CI 生成的 GitHub Release 正文仅按英文、简体中文的顺序展示,应用更新清单保留四种语言中已编写的正文。当前语言的说明缺失时直接提示,不回退到其他语言。
### OAuth 账号授权
+4 -4
View File
@@ -3,7 +3,7 @@
每个版本建立与发布 tag 同名的目录,分别维护四份 Markdown:
```text
docs/release-notes/v0.2.98/
docs/release-notes/v0.2.99/
zh-CN.md # 简体中文
zh-TW.md # 繁體中文
en.md # English
@@ -26,11 +26,11 @@ docs/release-notes/v0.2.98/
- 描述修复的问题。
```
将说明文件随代码提交到运行发布工作流的提交中,再发布对应 tag。不要把文案写进 CI YAML。当前的 `v0.2.98/` 是本次功能的待发布说明,实际发布其他版本时请同步调整目录名。
将说明文件随代码提交到运行发布工作流的提交中,再发布对应 tag。不要把文案写进 CI YAML。目录名必须与实际发布 tag 一致。
发布流程读取这些文件后生成两份输出:GitHub Release 正文按语言分节展示;Windows、Linux、macOS 更新清单的 `releaseNotes` 保存语言到 Markdown 的映射,例如 `{"zh-CN":"## 新增\n…","en":"## Added\n…"}`。应用检查版本时一并获取,切换界面语言会立即切换到对应正文,无需额外请求。清单中的发布日期使用本次生成清单的时间。
发布流程读取这些文件后生成两份输出:GitHub Release 正文只展示英文和简体中文,英文在前、中文在后;Windows、Linux、macOS 更新清单的 `releaseNotes` 保留四种语言中已编写的正文,保存语言到 Markdown 的映射,例如 `{"zh-CN":"## 新增\n…","en":"## Added\n…"}`。应用检查版本时一并获取,切换界面语言会立即切换到对应正文,无需额外请求。清单中的发布日期使用本次生成清单的时间。
**不做语言或内容回退。** 文件不存在或只有空白时,清单不包含该语言的正文,应用直接提示“暂未获取到当前语言的更新说明”。即使其他语言有内容,也不会代替显示。GitHub Release 对应语言一节同样显示缺失提示。不会读取旧的单文件正文、已有 Release 文本或 GitHub 自动生成内容来补齐。
**不做语言或内容回退。** 文件不存在或只有空白时,清单不包含该语言的正文,应用直接提示“暂未获取到当前语言的更新说明”。即使其他语言有内容,也不会代替显示。GitHub Release 的简体中文或英文正文缺失时,对应一节同样显示缺失提示。不会读取旧的单文件正文、已有 Release 文本或 GitHub 自动生成内容来补齐。
旧清单没有按语言组织的 `releaseNotes` 时,同样显示提示,不影响版本检查和升级。已经更新到最新版也能继续查看当前语言的说明。
-5
View File
@@ -1,5 +0,0 @@
## Added
- The version management page now shows software release notes and the latest version's publication date.
- Release notes can be expanded or collapsed, with a link to the full release page.
- Release notes follow the interface language. A message is shown when notes in that language are unavailable.
-5
View File
@@ -1,5 +0,0 @@
## 新機能
- バージョン管理ページに更新内容を追加しました。最新版の変更点と公開日を確認できます。
- 更新内容の展開と折りたたみに対応し、リリースページへのリンクを追加しました。
- 更新内容は画面の言語に合わせて表示されます。その言語の内容がない場合はメッセージを表示します。
-5
View File
@@ -1,5 +0,0 @@
## 新增
- 版本管理页新增软件更新说明,可直接查看最新版的更新内容和发布日期。
- 更新说明支持展开与收起,并提供完整发布说明入口。
- 更新说明随界面语言切换;当前语言的内容暂缺时直接显示提示。
-5
View File
@@ -1,5 +0,0 @@
## 新增
- 版本管理頁新增軟體更新說明,可直接查看最新版的更新內容和發布日期。
- 更新說明支援展開與收合,並提供完整發布說明入口。
- 更新說明隨介面語言切換;缺少目前語言的內容時會直接顯示提示。
+16
View File
@@ -0,0 +1,16 @@
## Added
- The version management page now shows software release notes and the latest version's publication date.
- Release notes support Simplified Chinese, Traditional Chinese, English, and Japanese, following the interface language. Notes can be expanded or collapsed, with a link to the full release page. Missing translations show a notice instead of another language's content.
## Improved
- Improved horizontal scrolling in request details on the usage records page, fixing lag and content jumping back during rapid dragging. Scroll positions and ranges stay synchronized when resizing the window or columns, or changing visible columns.
- Updated logging guidance to explain which failed requests are recorded and remind users to turn off "Write logs to files" when no longer needed to avoid excessive storage use.
## Fixed
- Fixed saving Claude and Codex connections that share an API key and base URL but use different model mappings or priorities. Identical configurations are still rejected as duplicates. ([#276](https://github.com/router-for-me/EasyCLIProxyAPI/issues/276))
- Fixed interference between connections sharing an API key when editing, toggling, reordering, deleting, or managing remarks. Existing remarks are preserved and migrated, and actions target only the selected connection.
- Improved configuration restoration when disconnecting agent integrations, preserving settings users changed after connecting. Custom Claude Code subagent models and Claude Desktop Cowork network access settings are also preserved.
- Fixed removal of the provider configuration when restoring Codex's native configuration or disconnecting the integration, retaining the configuration needed by historical sessions.
+16
View File
@@ -0,0 +1,16 @@
## 新機能
- バージョン管理ページに更新内容を追加しました。最新版の変更点と公開日を確認できます。
- 更新内容は簡体字中国語、繁体字中国語、英語、日本語に対応し、画面の言語に合わせて表示されます。展開・折りたたみとリリースページへのリンクに対応します。選択した言語の内容がない場合は、別の言語に切り替えず案内を表示します。
## 改善
- 使用記録ページのリクエスト詳細で横スクロールを改善し、素早くドラッグした際の反応の遅れや表示位置が戻る問題を修正しました。ウィンドウサイズ、列幅、表示する列を変更した際も、スクロール位置と範囲を同期します。
- ログ設定の説明を更新し、記録対象となるエラーリクエストの範囲と、ストレージの過剰な使用を避けるために不要になったら「ログファイルへ書き込む」を無効にすることを案内します。
## 修正
- API キーとベース URL が同じでも、モデルのマッピングや優先度が異なる Claude・Codex の接続設定を保存できるようにしました。完全に同じ設定は引き続き重複として扱います。([#276](https://github.com/router-for-me/EasyCLIProxyAPI/issues/276))
- 同じ API キーを使用する接続の編集、有効・無効の切り替え、並べ替え、削除、メモ管理が他の接続に影響する問題を修正しました。既存のメモを保持して移行し、選択した接続だけを操作します。
- エージェント連携解除時の設定復元を改善し、連携後にユーザーが変更した設定を保持します。Claude Code のカスタムサブエージェントモデルと Claude Desktop の Cowork ネットワークアクセス設定も保持します。
- Codex の元の設定への復元や連携解除時にプロバイダー設定が削除される問題を修正し、過去のセッションに必要な設定を保持します。
+16
View File
@@ -0,0 +1,16 @@
## 新增
- 版本管理页新增软件更新说明,可直接查看最新版的更新内容和发布日期。
- 更新说明支持简体中文、繁体中文、英文和日文,随界面语言切换,支持展开、收起和查看完整发布说明。当前语言的内容暂缺时直接显示提示,不切换到其他语言。
## 优化
- 优化使用记录页请求明细的横向滚动,修复快速拖动时响应滞后、内容回跳的问题;调整窗口大小、列宽或显示列时,滚动位置和范围保持同步。
- 更新日志设置说明,提示错误请求的记录范围,并提醒及时关闭“写入日志文件”,避免占用过多存储空间。
## 修复
- 修复同密钥、同基础地址但模型映射或优先级不同的 Claude、Codex 接入条目无法保存的问题。完全相同的配置仍会提示重复。([#276](https://github.com/router-for-me/EasyCLIProxyAPI/issues/276))
- 修复共享密钥条目在编辑、启停、排序、删除及备注管理时可能相互影响的问题,保留并迁移已有备注,避免误改或误删其他条目。
- 改进智能体解除接入时的配置恢复,保留用户在接入后自行修改的设置;保留 Claude Code 自定义子智能体模型和 Claude Desktop 的 Cowork 网络访问设置。
- 修复 Codex 恢复原生配置或解除接入时移除提供商配置的问题,保留历史会话所需的配置。
+16
View File
@@ -0,0 +1,16 @@
## 新增
- 版本管理頁新增軟體更新說明,可直接查看最新版的更新內容和發布日期。
- 更新說明支援簡體中文、繁體中文、英文及日文,隨介面語言切換,支援展開、收合及查看完整發布說明。缺少目前語言的內容時會直接顯示提示,不會切換至其他語言。
## 優化
- 改善使用記錄頁請求明細的水平捲動,修正快速拖曳時反應延遲、內容跳回的問題;調整視窗大小、欄寬或顯示欄位時,捲動位置與範圍保持同步。
- 更新日誌設定說明,提示錯誤請求的記錄範圍,並提醒及時關閉「寫入日誌檔案」,避免占用過多儲存空間。
## 修正
- 修正使用相同金鑰、相同基礎位址,但模型對應或優先順序不同的 Claude、Codex 連線項目無法儲存的問題。完全相同的設定仍會提示重複。([#276](https://github.com/router-for-me/EasyCLIProxyAPI/issues/276))
- 修正共用金鑰的項目在編輯、啟停、排序、刪除及備註管理時可能互相影響的問題,保留並遷移既有備註,避免誤改或誤刪其他項目。
- 改善智慧代理解除連線時的設定還原,保留使用者在連線後自行修改的設定;保留 Claude Code 自訂子代理模型及 Claude Desktop 的 Cowork 網路存取設定。
- 修正 Codex 還原原生設定或解除連線時移除供應商設定的問題,保留歷史工作階段所需的設定。
+2 -1
View File
@@ -40,7 +40,8 @@ export function validateReleaseNotes(notes) {
export function releaseNotesBody(notes) {
validateReleaseNotes(notes);
return `${releaseNotesLanguages.map(({ locale, label, missing }) => (
const languages = ['en', 'zh-CN'].map((locale) => releaseNotesLanguages.find((language) => language.locale === locale));
return `${languages.map(({ locale, label, missing }) => (
`# ${label}\n\n${notes[locale]?.trim() || missing}`
)).join('\n\n---\n\n')}\n`;
}
+15 -6
View File
@@ -30,7 +30,7 @@ describe('localized release notes publication', () => {
}
expect(await resolveReleaseNotes({ root, tag: '1.2.3' })).toEqual(translations);
const body = releaseNotesBody(translations);
for (const text of Object.values(translations)) expect(body).toContain(text.trim());
expect(body).toBe(`# English\n\n${translations.en.trim()}\n\n---\n\n# 简体中文\n\n${translations['zh-CN']}`);
}));
test('never copies another language into a missing or blank translation', () => withNotesRoot(async (root, directory) => {
@@ -38,7 +38,7 @@ describe('localized release notes publication', () => {
await writeFile(join(directory, 'en.md'), ' \n');
const notes = await resolveReleaseNotes({ root, tag: 'v1.2.3' });
expect(notes).toEqual({ 'zh-CN': '## 新增\n\n- 中文独有正文。\n' });
const englishSection = releaseNotesBody(notes).split('# English\n\n')[1].split('\n\n---')[0];
const englishSection = releaseNotesBody(notes).split('# English\n\n')[1].split('\n\n---\n\n')[0].trim();
expect(englishSection).toBe('Release notes for this version are not available in English.');
expect(englishSection).not.toContain('中文独有正文');
}));
@@ -58,8 +58,16 @@ describe('localized release notes publication', () => {
}
});
test('CLI creates matching localized JSON and multilingual Release body', () => withNotesRoot(async (root, directory) => {
await writeFile(join(directory, 'en.md'), '## Added\n\n- Release notes.\n');
test('CLI preserves all translations in JSON and publishes only English then Chinese in the Release body', () => withNotesRoot(async (root, directory) => {
const translations = {
'zh-CN': '## 新增\n\n- 更新说明。\n',
'zh-TW': '## 新增\n\n- 更新說明。\n',
en: '## Added\n\n- Release notes.\n',
ja: '## 新機能\n\n- 更新内容。\n',
};
for (const [locale, body] of Object.entries(translations)) {
await writeFile(join(directory, locale + '.md'), body);
}
const script = fileURLToPath(new URL('../scripts/release-notes.mjs', import.meta.url));
const jsonPath = join(root, 'notes.json');
const bodyPath = join(root, 'notes.md');
@@ -69,8 +77,9 @@ describe('localized release notes publication', () => {
expect(result.status).toBe(0);
expect(result.stderr).toBe('');
const notes = JSON.parse(await readFile(jsonPath, 'utf8'));
expect(notes).toEqual({ en: '## Added\n\n- Release notes.\n' });
expect(await readFile(bodyPath, 'utf8')).toBe(releaseNotesBody(notes));
expect(notes).toEqual(translations);
const body = await readFile(bodyPath, 'utf8');
expect(body).toBe(`# English\n\n${translations.en.trim()}\n\n---\n\n# 简体中文\n\n${translations['zh-CN']}`);
}));
test('rejects tags that could escape the release notes directory', () => withNotesRoot(async (root) => {