Skip to content

Commit eae3fb9

Browse files
committed
fix: stabilize cms news editing
1 parent 532b887 commit eae3fb9

22 files changed

Lines changed: 89 additions & 28 deletions

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file.
44

55
## [Unreleased]
66

7+
## [1.3.2] - 2026-05-03
8+
9+
### Changed
10+
- Bumped the package version from `1.3.1` to `1.3.2` for CMS stability hardening.
11+
- Tightened the news CMS slug guidance so generated slugs start with a lowercase letter and keep the date out of the field.
12+
13+
### Fixed
14+
- Added stable `slug` frontmatter to existing news files so editing old entries in Decap no longer requires guessing a slug.
15+
- Removed CMS validation test residue from the archived news sample.
16+
- Extended content validation to catch missing or invalid news CMS slugs and known CMS test residue before build.
17+
718
## [1.3.1] - 2026-05-03
819

920
### Added

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ src/content/news/<slug>.en.md
163163

164164
```md
165165
---
166+
slug: "my-news"
166167
date: "2026-03-25"
167168
title:
168169
zh: "中文标题"
@@ -222,6 +223,7 @@ venue: "Conference Name"
222223
- `1.2.1`:CMS 试点收口 / ops hardening,补 locale/news 校验与启用前置条件硬化
223224
- `1.3.0`:CMS 文件管理后台,扩展到新闻、成员、论文、招生与现有项目文件
224225
- `1.3.1`:CMS 线上启用跟进,补 Cloudflare Worker OAuth 代理部署包与生产环境变量验收说明
226+
- `1.3.2`:CMS 稳定性补丁,补齐旧新闻 `slug`、清理后台测试残留,并收紧新闻 slug 校验
225227

226228
## License
227229

README_EN.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ Minimal body file:
163163

164164
```md
165165
---
166+
slug: "my-news"
166167
date: "2026-03-25"
167168
title:
168169
zh: "中文标题"
@@ -223,6 +224,7 @@ venue: "Conference Name"
223224
- `1.2.1`: CMS pilot closure / ops hardening, plus locale/news validation and CMS enablement hardening
224225
- `1.3.0`: CMS file management for news, members, papers, recruitment pages, and existing project files
225226
- `1.3.1`: CMS live enablement follow-up with a Cloudflare Worker OAuth proxy package and production environment validation notes
227+
- `1.3.2`: CMS stability patch that adds stable legacy news slugs, removes CMS test residue, and tightens news slug validation
226228

227229
## License
228230

docs/content-edit-guide.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ src/content/news/2026-03-25-my-news.en.md
104104
新闻文件示例:
105105
```md
106106
---
107+
slug: "my-news"
107108
date: "2026-03-25"
108109
title:
109110
zh: "中文标题"
@@ -116,9 +117,12 @@ title:
116117
CMS 试点启用后的编辑步骤:
117118

118119
1. 打开站点的 `/admin/`
119-
2. 新建一条 `news` 草稿,填写 `slug``date`、中英文标题和正文
120-
3. 保存草稿后,通过 GitHub Pull Request 走审核
121-
4. 审核通过后合并,站点会自动重新构建
120+
2. 新建或打开一条 `news` 草稿,填写 `slug``date`、中英文标题和正文
121+
3. `slug` 使用小写英文、数字和连字符,必须以小写字母开头;不要把日期写进 `slug`
122+
4. 点击 `Save`,确认左上角从 unsaved 变成 saved
123+
5. 把状态从 `Draft` 改成 `Ready`
124+
6. 点击 `Publish` -> `Publish now`,让 CMS 创建 GitHub Pull Request
125+
7. 检查 GitHub PR 和 Cloudflare Pages 预览,审核通过后合并,站点会自动重新构建
122126

123127
如果 CMS 还没启用,继续沿用当前的 Markdown 文件更新流程即可。手动新增新闻时仍要维护一对 `.zh.md` / `.en.md` 文件,并保证两边 `date``title.zh``title.en` 一致。
124128

docs/content-ops-checklist.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ git push origin content/YYYYMMDD-topic
7474
- `*.zh.md`
7575
- `*.en.md`
7676
- 必填字段:
77+
- `slug`
7778
- `date`
7879
- `title.zh/en`
7980

@@ -88,10 +89,13 @@ git push origin content/YYYYMMDD-topic
8889
## D. `1.3.0` CMS 文件管理启用后
8990

9091
- 编辑入口固定为 `/admin/`
92+
- 新闻 `slug` 必须以小写字母开头,只使用小写英文、数字和连字符;CMS 会用日期生成文件名前缀,所以 `slug` 字段里不要再写日期
93+
- 编辑旧新闻时优先保留后台里已有的 `slug`,避免改动公开 URL
9194
- 新闻、成员、论文可新增 / 编辑 / 删除
9295
- 招生与合作只编辑固定页面,不新增 / 删除
9396
- 项目只编辑现有 overview/background 文件,不新增 / 删除项目
9497
- 内容同学保存后会生成可审阅的 GitHub Pull Request,而不是直接写入 `main`
98+
- 发布流程是 `Save` -> 状态改为 `Ready` -> `Publish` -> `Publish now`,随后到 GitHub PR 和 Cloudflare Pages 预览确认
9599
- 编辑者需要目标仓库的写权限
96100
- `1.3.1` 起,GitHub 登录依赖 `ops/cms-oauth-worker/` 中的 Cloudflare Worker OAuth 代理
97101
- 首次线上闭环建议只微调已发布的 `v1.3.0` 新闻,验证登录、PR、预览和合并,不新增测试新闻

docs/go-live-rehearsal.md

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
- 本地内容闭环已推进:已新增双语上线演练新闻,并清理一批明显会误导上线验收的假邮箱、`example.com` 外链和虚假成果表述。
88
- `1.3.0` 已将 CMS 从 `news` 扩展到新闻、成员、论文、招生固定页与现有项目文件。
99
- `1.3.1` 新增 Cloudflare Worker OAuth 代理部署包,用于补齐线上 Decap CMS GitHub 登录前提。
10-
- 线上 CMS 登录、GitHub PR 创建、Cloudflare Pages 预览与合并上线仍需要在配置好 OAuth App、Worker secrets 和 Pages 环境变量后完成。
10+
- 线上 CMS 登录、GitHub PR 创建、Cloudflare Pages 预览、合并上线与生产验证已在 2026-05-03 完成。
11+
- `1.3.2` 跟进清理首次后台验收留下的测试文字,并为旧新闻补齐稳定 `slug` frontmatter。
1112

1213
## 2. 本地已完成证据
1314

@@ -26,19 +27,20 @@
2627
- `npm run test:seo` 通过
2728
- `npm run verify` 通过
2829
- 构建备注:Astro content sync 仍会输出少量 duplicate id warning,但本轮未导致 build、smoke 或 SEO 失败;后续可单独评估 content cache / collection sync 清理。
30+
- 线上闭环证据:CMS 创建的真实内容 PR 已触发 Cloudflare Pages 预览并合并上线,`v1.3.1` 已作为线上启用版本发布。
2931

3032
## 3. 线上验收清单
3133

3234
| 项目 | 当前状态 | 上线前动作 |
3335
|---|---|---|
34-
| `CMS_GITHUB_REPO` | 待线上核验 | 确认指向目标 GitHub 仓库 |
36+
| `CMS_GITHUB_REPO` | 已验证 | 确认指向目标 GitHub 仓库 |
3537
| `CMS_BRANCH` | 默认为 `main` | 如生产分支不是 `main`,在 Pages 环境变量中覆盖 |
36-
| `CMS_OAUTH_BASE_URL` | 待线上核验 | 确认 OAuth 代理可访问,并与回调地址匹配 |
37-
| `PUBLIC_SITE_URL` | 待线上核验 | 确认生产域名、canonical、Open Graph 与 hreflang 一致 |
38-
| GitHub OAuth App | 待线上创建 | Homepage 指向 Worker base URL,callback 指向 `<Worker base URL>/callback` |
39-
| Worker secrets | 待线上配置 | `GITHUB_OAUTH_ID``GITHUB_OAUTH_SECRET` 必须作为 Cloudflare Worker secrets |
40-
| GitHub 写权限 | 待线上核验 | 确认内容编辑者能通过 Decap 创建 PR |
41-
| Cloudflare Pages 预览 | 待线上核验 | 确认 CMS 生成 PR 后能触发预览构建 |
38+
| `CMS_OAUTH_BASE_URL` | 已验证 | 确认 OAuth 代理可访问,并与回调地址匹配 |
39+
| `PUBLIC_SITE_URL` | 已验证 | 确认生产域名、canonical、Open Graph 与 hreflang 一致 |
40+
| GitHub OAuth App | 已创建 | Homepage 指向 Worker base URL,callback 指向 `<Worker base URL>/callback` |
41+
| Worker secrets | 已配置 | `GITHUB_OAUTH_ID``GITHUB_OAUTH_SECRET` 必须作为 Cloudflare Worker secrets |
42+
| GitHub 写权限 | 已验证 | 确认内容编辑者能通过 Decap 创建 PR |
43+
| Cloudflare Pages 预览 | 已验证 | 确认 CMS 生成 PR 后能触发预览构建 |
4244

4345
## 4. 手动 CMS 验收步骤
4446

@@ -53,6 +55,5 @@
5355

5456
- 成员、论文、项目和招生仍缺真实素材;当前只做了误导性占位清理与替换清单。
5557
- `/admin/` 依赖外部 Decap bundle,供应链加固仍是独立后续任务。
56-
- OAuth Worker 已有部署包,但生产环境仍需要真实 GitHub OAuth App client ID / secret。
5758
- 真实 PR 审核时如果发现字段不顺手,只记录问题;本轮不扩展 CMS schema。
58-
- Astro duplicate id warning 尚未在 T-0015 范围内处理,因为当前统一验收链路仍通过
59+
- 首次 CMS 验收留下的测试文字已在 `1.3.2` 分支清理,并加入内容校验防回归

docs/roadmap.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Roadmap
22

3-
更新时间:2026-05-03(1.3.1 CMS live enablement
3+
更新时间:2026-05-03(1.3.2 CMS stability hardening
44

55
## 1.0.1 基线修复
66

@@ -66,6 +66,14 @@
6666
- 使用已发布的 `v1.3.0` 新闻完成一次真实 CMS 编辑 PR、预览、合并闭环
6767
- 不扩展 CMS 内容模型,不引入数据库或服务端内容 API
6868

69+
## 1.3.2 CMS 稳定性补丁
70+
71+
已完成:
72+
- 为旧新闻补齐稳定 `slug` frontmatter,避免 Decap 编辑既有条目时要求手工猜 slug
73+
- 清理首次 CMS 验收留下的测试文字,避免测试内容进入长期生产内容
74+
- 收紧新闻 `slug` 提示、校验和 smoke 检查,要求以小写字母开头,不包含日期前缀
75+
- 文档补充 Save -> Ready -> Publish now 的后台发布流程说明
76+
6977
## T-0015 真实上线闭环演练
7078

7179
已完成:

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "double-duck-lab",
33
"type": "module",
4-
"version": "1.3.1",
4+
"version": "1.3.2",
55
"private": true,
66
"scripts": {
77
"dev": "astro dev",

scripts/smoke-build.mjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,8 @@ const checks = [
117117
'publish_mode: editorial_workflow',
118118
'media_folder: public/uploads',
119119
'public_folder: /uploads',
120+
'Start with a lowercase letter',
121+
'^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$',
120122
'structure: multiple_files',
121123
' - name: news',
122124
' - name: members',

0 commit comments

Comments
 (0)