diff --git a/.gitignore b/.gitignore index d6dc4c5..a0345f4 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ node_modules/ dist/ .worktree/ .vitepress-dist/ +.opencode \ No newline at end of file diff --git a/assets/skills/flow-code/SKILL.md b/assets/skills/flow-code/SKILL.md index 759a18b..fa91df6 100644 --- a/assets/skills/flow-code/SKILL.md +++ b/assets/skills/flow-code/SKILL.md @@ -19,24 +19,46 @@ description: 分支 → 编码 + 单测 → PR 提交 ### 2. 检查 ADR 约束 阅读相关 ADR,确保实现方案不违反已有架构决策。 -### 3. 分支 → 编码 → 单测 → PR +### 3. 分支 → 编码 → 单测 ```bash git checkout -b feat/ # 实现代码 + 单元测试 npm test +``` + +### 4. 文档同步检查 +完成编码后,逐项检查以下文档是否需要同步更新: + +``` +## 文档同步检查清单 +□ guides/quickstart.md — 安装方式或前置条件有变化吗? +□ guides/configuration.md — 新增/修改了配置项吗? +□ guides/usage.md — 命令或行为有变化吗? +□ guides/architecture.md — 架构或流程有变化吗? +□ docs/dev/guides/contributing.md — 开发流程有变化吗? +``` + +- 逐项评估,无需修改的跳过 +- 需要修改的文档随代码一起提交到同一个 PR +- PR body 中列出已同步的文档 + +### 5. 提交 PR +```bash git commit -m "feat(): " mkdir -p docs/dev/handoff echo "Closes #<issue-num>" > docs/dev/handoff/pr-body.md gh pr create --title "<title>" --body-file docs/dev/handoff/pr-body.md ``` -### 4. 更新开发文档 +### 6. 更新开发文档 如涉及 API 变更 → 更新 `docs/dev/api/` 如涉及数据模型变更 → 更新 `docs/dev/db/` ## Output - 代码已推送 - PR 已创建并关联 Sub Issue(PR body 含 `Closes #<issue-num>`) +- 文档同步 checklist 已完成 +- 已同步的文档随 PR 提交 - dev docs 已更新 ## 上下文管理 diff --git a/assets/skills/flow-review/SKILL.md b/assets/skills/flow-review/SKILL.md index bbffd41..0b7df12 100644 --- a/assets/skills/flow-review/SKILL.md +++ b/assets/skills/flow-review/SKILL.md @@ -23,7 +23,13 @@ gh pr view <pr-number> --json title,body,files - 检查相关 ADR(`docs/adr/`)— 确认代码是否遵循架构决策 - 确认规格来源:commit 消息中的 Issue 引用或 `docs/prd/` / `docs/dev/specs/` -### 3. 双轴审查 +### 3. 文档同步确认 +确认 PR 中是否包含文档同步: +- 检查 PR body 是否列出已同步的文档 +- 检查 `docs/guides/` 和 `docs/dev/guides/` 是否有相应变更 +- 如涉及配置/API 变更但文档未同步 → 标记为阻断性问题 + +### 4. 双轴审查 并行检查两个维度: **规范轴(Normative)** — 代码是否符合文档化的编码标准? @@ -31,8 +37,15 @@ gh pr view <pr-number> --json title,body,files **规格轴(Specification)** — 代码是否忠实实现了需求? 对照 PRD(`docs/prd/`)和设计方案(`docs/dev/specs/`)验证。 +- 如发现实现与设计偏差 → 追加到 `docs/dev/changelog/<YYYY-MM-DD-NNN-slug>.md` + +### 5. 合并前检查 +在合并前确认以下项: +- 文档同步已完成(`docs/guides/` 已更新或无需更新) +- changelog 已记录偏差(如有) +- CI 已通过 -### 4. 发表审查意见 +### 6. 发表审查意见 发现阻断性问题: ```bash gh pr review <pr-number> --request-changes --body "..." @@ -42,13 +55,13 @@ gh pr review <pr-number> --request-changes --body "..." gh pr review <pr-number> --approve --body "..." ``` -### 5. 等待 CI + 自动合并 +### 7. 等待 CI + 自动合并 ```bash gh pr checks <pr-number> --watch gh pr merge <pr-number> --squash --delete-branch ``` -### 6. 关闭关联 Sub Issue +### 8. 关闭关联 Sub Issue 如果 PR body 未包含 `Closes #<num>`(或 PR 合并后 GitHub 未自动关闭),手动关闭: ```bash gh issue close <issue-num> --comment "已完成,已合并至 main" @@ -58,6 +71,7 @@ gh issue close <issue-num> --comment "已完成,已合并至 main" - PR 已审查 - PR 已合并(条件满足时) - 关联 Sub Issue 已关闭 +- changelog 已记录偏差(如有) ## 后续 - **/release** — 发布(如所有 PR 已合并) diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index fc47fc8..fd77932 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -28,6 +28,33 @@ function getSidebar(): DefaultTheme.Sidebar { link: `/${dir}/${name}`, }) } else if (statSync(fullPath).isDirectory()) { + // Special handling for dev/tasks/ — feature subdirectories with date prefix + if (dir === 'dev' && entry === 'tasks') { + const featureDirs = readdirSync(fullPath).sort().filter(e => { + if (e.startsWith('.')) return false + return statSync(join(fullPath, e)).isDirectory() + }) + if (featureDirs.length > 0) { + const taskItems: DefaultTheme.SidebarItem[] = featureDirs.map(fd => { + const fdPath = join(fullPath, fd) + const fdFiles = readdirSync(fdPath).sort().filter(e => e.endsWith('.md')) + const displayName = fd + .replace(/^\d{4}-\d{2}-\d{2}-\d{3}-/, '') + .replace(/-/g, ' ') + .replace(/\b\w/g, c => c.toUpperCase()) + return { + text: displayName, + collapsed: true, + items: fdFiles.map(f => ({ + text: f.replace('.md', '').replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase()), + link: `/${dir}/${entry}/${fd}/${f.replace('.md', '')}`, + })), + } + }) + items.push({ text: 'Tasks', collapsed: false, items: taskItems }) + } + continue + } const subEntries = readdirSync(fullPath).sort().filter(e => e.endsWith('.md')) if (subEntries.length > 0) { items.push({ diff --git a/docs/adr/2026-07-10-doc-sync-and-task-org.md b/docs/adr/2026-07-10-doc-sync-and-task-org.md new file mode 100644 index 0000000..38eb0db --- /dev/null +++ b/docs/adr/2026-07-10-doc-sync-and-task-org.md @@ -0,0 +1,103 @@ +# ADR 0004: 文档同步流程与任务目录组织 + +**状态:** Proposed +**日期:** 2026-07-10 +**上级:** [ADR 0003](/adr/2026-07-10-jekyll-to-vitepress) + +## 背景 + +项目当前存在两个组织性问题: + +1. **任务目录混乱**:`docs/dev/tasks/` 下 14 个 `.md` 文件平铺,分别属于 "docs-and-pages" 和 "vitepress-migration" 两个 feature,无法区分归属、依赖关系和创建顺序 +2. **文档同步缺失**:代码变更后 `docs/guides/` 用户文档没有同步机制,可能导致文档与代码脱节 + +## 决策 + +### 1. 任务目录采用 `YYYY-MM-DD-NNN-slug/` 命名格式 + +**格式**:`YYYY-MM-DD-NNN-slug/`,如 `2026-07-09-001-docs-and-pages/` + +**选择理由**: + +| 方案 | 排序 | 可读性 | 扩展性 | 结论 | +|------|------|--------|--------|------| +| `NNN-slug/`(仅编号) | 按编号无序(编号可能跨天) | 简洁 | 同一天多个 feature 时编号冲突 | ❌ | +| `YYYY-MM-DD-slug/`(日期+slug) | 按时间排序 | 清晰 | 同一天多个 feature 无法区分 | ❌ | +| `YYYY-MM-DD-NNN-slug/`(日期+编号+slug) | 字典序=时间序 | 清晰 | 每天独立编号,无限扩展 | ✅ | + +**关键点**: +- `YYYY-MM-DD` 放在最前面,利用字符串字典序等于时间序的特性,无需额外排序逻辑 +- `NNN` 从 `001` 开始,每天独立递增,解决同一天多个 feature 的命名冲突 +- `slug` 提供人类可读的描述,方便 `git mv` 后快速定位 + +**备选方案**: +- 纯编号(`001-docs-and-pages/`):简洁但跨天时编号不连续,排序无意义 +- UUID 前缀:完全放弃可读性,不适合人工浏览的目录结构 + +### 2. 设计态(tasks/)与实现态(changelog/)分离 + +**决策**:新增 `docs/dev/changelog/` 目录,与 `docs/dev/tasks/` 分离。 + +**设计态(tasks/)**: +- 记录原始设计意图和任务拆解 +- 在 `/design` 和 `/tasks` 阶段创建 +- 一旦创建,**不再修改**(保留设计原貌) + +**实现态(changelog/)**: +- 记录实际实现与设计的偏差 +- 在 `/review` 阶段由 reviewer 追加 +- 每个 feature 一个 changelog 文件,生命周期与 feature 绑定 + +**分离理由**: +- 保留原始设计意图,便于复盘和审计 +- 避免在同文件中混入"设计"和"实际"导致信息混乱 +- 变更追溯清晰:tasks 看设计,changelog 看偏差 + +**备选方案**: +- 在 task 文件中直接追加偏差记录:会污染原始设计,不利于对比 +- 不记录偏差:失去可追溯性,不符合工程实践 + +### 3. 文档同步嵌入 flow-code 而非独立 command + +**决策**:将文档同步检查作为 flow-code 技能内的固定步骤,而非独立的 `/doc-sync` 命令。 + +**理由**: +- 文档同步是编码流程的有机组成部分,不是独立活动 +- 独立 command 增加认知负担(8 个变 9 个 command),且容易遗漏 +- 嵌入 flow-code 确保每次编码后自动触发检查,无需开发者记忆 +- 符合"一个 slash command 完成一件事"的设计原则 + +**备选方案**: +- 独立 `/doc-sync` 命令:增加命令数量,且可能被跳过 +- 嵌入 flow-review:发现太晚,应在编码阶段就完成同步 + +### 4. 人工 checklist 而非自动检测 + +**决策**:文档同步使用人工 checklist 评估,不做自动检测。 + +**理由**: +- 代码变更与文档影响的映射本质上是语义判断,无法机械推导 +- 自动检测需要维护代码→文档的映射规则,投入产出比低 +- 人工 checklist 简单可靠,开发者最了解自己的变更影响范围 +- 对于 4 个 guides 文档的规模,人工评估成本极低 + +**未来扩展**:当文档规模增长到 20+ 个文件时,可考虑 AI 辅助分析 diff 并推荐受影响的文档,但最终仍由人工确认。 + +## 后果 + +### 正向 + +- 任务目录按 feature 组织,按时间排序,一目了然 +- 设计意图与实现偏差分离记录,可追溯 +- 文档同步嵌入编码流程,不会遗漏 +- 所有变更仅影响内部文件组织,对最终用户透明 + +### 风险 + +- 旧 task 文件路径的外部引用(如有)会 404 — 影响极小,文档站尚未广泛传播 +- `getSidebar()` 新增嵌套目录处理逻辑,增加维护成本 — 但仅限 `dev/tasks` 一个特殊路径 +- Changelog 依赖 reviewer 自觉追加 — 通过 flow-review 技能强制检查 + +## 技术方案 + +详见 [文档同步流程与任务目录重构 — 技术方案](/dev/specs/doc-sync-workflow) \ No newline at end of file diff --git a/docs/dev/changelog/2026-07-09-001-docs-and-pages.md b/docs/dev/changelog/2026-07-09-001-docs-and-pages.md new file mode 100644 index 0000000..091c46b --- /dev/null +++ b/docs/dev/changelog/2026-07-09-001-docs-and-pages.md @@ -0,0 +1,15 @@ +# Changelog: Docs and Pages + +> 对应 tasks: `docs/dev/tasks/2026-07-09-001-docs-and-pages/` + +## 实现偏差 + +(PR 合并前由 reviewer 追加) + +## 未实现项 + +(如适用) + +## 额外实现项 + +(如适用) diff --git a/docs/dev/changelog/2026-07-10-001-vitepress-migration.md b/docs/dev/changelog/2026-07-10-001-vitepress-migration.md new file mode 100644 index 0000000..0779b71 --- /dev/null +++ b/docs/dev/changelog/2026-07-10-001-vitepress-migration.md @@ -0,0 +1,15 @@ +# Changelog: Vitepress Migration + +> 对应 tasks: `docs/dev/tasks/2026-07-10-001-vitepress-migration/` + +## 实现偏差 + +(PR 合并前由 reviewer 追加) + +## 未实现项 + +(如适用) + +## 额外实现项 + +(如适用) diff --git a/docs/dev/out-of-scope.md b/docs/dev/out-of-scope.md index b8501cd..5f3c648 100644 --- a/docs/dev/out-of-scope.md +++ b/docs/dev/out-of-scope.md @@ -17,3 +17,12 @@ - 自定义域名配置 - 多语言支持 - 文档内容重写/重组 — 仅迁移,不修改内容 + +## 文档同步流程与任务目录重构 + +以下需求在访谈中明确排除,记录于此供后续参考: + +- 自动检测代码变更影响哪些文档(AI 辅助但最终人工判断) +- specs/ 技术方案自动更新 — 设计阶段产物,代码阶段不改 +- adr/ 架构决策记录自动更新 — 设计偏离时单独更新 +- task 文件修改 — 保留原始设计意图,变更记入 changelog diff --git a/docs/dev/specs/doc-sync-workflow.md b/docs/dev/specs/doc-sync-workflow.md new file mode 100644 index 0000000..056903c --- /dev/null +++ b/docs/dev/specs/doc-sync-workflow.md @@ -0,0 +1,311 @@ +# 文档同步流程与任务目录重构 — 技术方案 + +## 概述 + +解决两个问题: +1. 代码变更后 `docs/guides/` 用户文档缺少同步机制 +2. `docs/dev/tasks/` 下所有 task 文件平铺,无法区分 feature 归属 + +## 1. 任务目录重构 + +### 1.1 目标结构 + +``` +docs/dev/tasks/ +├── 2026-07-09-001-docs-and-pages/ +│ ├── DAG.md +│ ├── architecture-doc.md +│ ├── configuration-guide.md +│ ├── quickstart-guide.md +│ ├── readme-update.md +│ ├── site-index-and-config.md +│ ├── usage-guide.md +│ └── pages-deployment-workflow.md +└── 2026-07-10-001-vitepress-migration/ + ├── DAG.md + ├── vitepress-init.md + ├── homepage-config.md + ├── content-migration.md + ├── sidebar-nav-config.md + ├── cicd-update.md + └── jekyll-cleanup.md +``` + +### 1.2 目录命名格式 + +`YYYY-MM-DD-NNN-slug/` + +- `YYYY-MM-DD`:创建日期,确保按时间排序 +- `NNN`:当天编号,从 `001` 开始递增,同一天有多个 feature 时区分 +- `slug`:简短 feature 描述(kebab-case) + +### 1.3 文件归属映射 + +**2026-07-09-001-docs-and-pages/(7 个文件)** + +| 现有文件 | 目标路径 | +|----------|----------| +| `docs/dev/tasks/architecture-doc.md` | `docs/dev/tasks/2026-07-09-001-docs-and-pages/architecture-doc.md` | +| `docs/dev/tasks/configuration-guide.md` | `docs/dev/tasks/2026-07-09-001-docs-and-pages/configuration-guide.md` | +| `docs/dev/tasks/quickstart-guide.md` | `docs/dev/tasks/2026-07-09-001-docs-and-pages/quickstart-guide.md` | +| `docs/dev/tasks/readme-update.md` | `docs/dev/tasks/2026-07-09-001-docs-and-pages/readme-update.md` | +| `docs/dev/tasks/site-index-and-config.md` | `docs/dev/tasks/2026-07-09-001-docs-and-pages/site-index-and-config.md` | +| `docs/dev/tasks/usage-guide.md` | `docs/dev/tasks/2026-07-09-001-docs-and-pages/usage-guide.md` | +| `docs/dev/tasks/pages-deployment-workflow.md` | `docs/dev/tasks/2026-07-09-001-docs-and-pages/pages-deployment-workflow.md` | + +> 注:该 feature 无 DAG.md,因为 `docs-and-pages` 在引入 DAG 模式之前完成。 + +**2026-07-10-001-vitepress-migration/(7 个文件)** + +| 现有文件 | 目标路径 | +|----------|----------| +| `docs/dev/tasks/DAG.md` | `docs/dev/tasks/2026-07-10-001-vitepress-migration/DAG.md` | +| `docs/dev/tasks/vitepress-init.md` | `docs/dev/tasks/2026-07-10-001-vitepress-migration/vitepress-init.md` | +| `docs/dev/tasks/homepage-config.md` | `docs/dev/tasks/2026-07-10-001-vitepress-migration/homepage-config.md` | +| `docs/dev/tasks/content-migration.md` | `docs/dev/tasks/2026-07-10-001-vitepress-migration/content-migration.md` | +| `docs/dev/tasks/sidebar-nav-config.md` | `docs/dev/tasks/2026-07-10-001-vitepress-migration/sidebar-nav-config.md` | +| `docs/dev/tasks/cicd-update.md` | `docs/dev/tasks/2026-07-10-001-vitepress-migration/cicd-update.md` | +| `docs/dev/tasks/jekyll-cleanup.md` | `docs/dev/tasks/2026-07-10-001-vitepress-migration/jekyll-cleanup.md` | + +### 1.4 getSidebar() 更新方案 + +`docs/.vitepress/config.ts` 中 `getSidebar()` 需做以下修改: + +**变更点**:`dev/tasks/` 目录下的子目录不再是 `.md` 文件,而是 `YYYY-MM-DD-NNN-slug/` 格式的 feature 目录。需要新增一层嵌套处理。 + +**方案**:对 `dev/tasks/` 做特殊处理——遍历其子目录,为每个 feature 目录生成一个可折叠的侧边栏分组,显示名称时正则剥离日期前缀。 + +**核心代码**(替换现有 `dev/tasks` 处理逻辑): + +```ts +// 在 getSidebar() 中,处理 dev/tasks/ 的特殊逻辑 +if (dir === 'dev' && entry === 'tasks') { + const featureDirs = readdirSync(fullPath).sort().filter(e => { + if (e.startsWith('.')) return false + return statSync(join(fullPath, e)).isDirectory() + }) + if (featureDirs.length > 0) { + const taskItems: DefaultTheme.SidebarItem[] = featureDirs.map(fd => { + const fdPath = join(fullPath, fd) + const fdFiles = readdirSync(fdPath).sort().filter(e => e.endsWith('.md')) + // 正则剥离日期前缀:2026-07-09-001- → '' + const displayName = fd + .replace(/^\d{4}-\d{2}-\d{2}-\d{3}-/, '') + .replace(/-/g, ' ') + .replace(/\b\w/g, c => c.toUpperCase()) + return { + text: displayName, + collapsed: true, + items: fdFiles.map(f => ({ + text: f.replace('.md', '').replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase()), + link: `/${dir}/${entry}/${fd}/${f.replace('.md', '')}`, + })), + } + }) + items.push({ + text: 'Tasks', + collapsed: false, + items: taskItems, + }) + } + continue // 跳过正常的目录处理(因为 tasks 子目录不包含 .md 文件) +} +``` + +**替换位置**:`getSidebar()` 函数中,`for (const entry of entries)` 循环内,在 `statSync(fullPath).isDirectory()` 分支中,对 `dir === 'dev' && entry === 'tasks'` 做特殊处理。 + +**正则说明**:`/^\d{4}-\d{2}-\d{2}-\d{3}-/` 匹配 `2026-07-10-001-` 前缀,剥离后剩余 `vitepress-migration`,再经过 `replace(/-/g, ' ')` 和 `replace(/\b\w/g, c => c.toUpperCase())` 转换为 `Vitepress Migration`。 + +**排序**:`readdirSync(fullPath).sort()` 保证按字符串排序,即 `YYYY-MM-DD-NNN` 的字典序等于时间序。 + +### 1.5 导航栏更新 + +`docs/.vitepress/config.ts` 中移除指向具体 task 文件的导航链接(如 `/dev/tasks/pages-deployment-workflow`),因为 tasks 由侧边栏自动生成,无需在导航栏硬编码。 + +## 2. Changelog 目录方案 + +### 2.1 目录结构 + +``` +docs/dev/changelog/ +├── 2026-07-10-001-vitepress-migration.md +└── 2026-07-09-001-docs-and-pages.md +``` + +### 2.2 文件命名 + +`<YYYY-MM-DD-NNN-feature-slug>.md`,与 `docs/dev/tasks/` 下的 feature 目录名一一对应。 + +### 2.3 内容格式模板 + +```markdown +# Changelog: <feature-title> + +> 对应 tasks: `docs/dev/tasks/<YYYY-MM-DD-NNN-slug>/` + +## 实现偏差 + +| 设计项 | 预期 | 实际 | 原因 | +|--------|------|------|------| +| ... | ... | ... | ... | + +## 未实现项 + +- ... + +## 额外实现项 + +- ... +``` + +### 2.4 生命周期 + +1. **创建时机**:`/tasks` 完成后,创建空的 changelog 文件(仅含标题和 tasks 链接) +2. **追加时机**:`/review` 阶段,reviewer 发现实现与设计偏差时追加 delta 记录 +3. **最终化**:PR 合并前,reviewer 确认 changelog 完整 + +## 3. 文档同步流程(Doc Sync) + +### 3.1 嵌入位置 + +作为 flow-code 技能的第 4 步,在 "分支 → 编码 → 单测" 之后,"PR" 之前: + +``` +分支 → 编码 → 单测 → 文档同步检查 → PR +``` + +### 3.2 流程步骤 + +1. flow-code 自动输出文档同步 checklist +2. 开发者逐项评估,标记需要更新的文档 +3. 需要修改的文档随代码一起提交到同一个 PR +4. PR body 中列出已同步的文档 + +### 3.3 Checklist 模板 + +```markdown +## 文档同步检查清单 + +□ guides/quickstart.md — 安装方式或前置条件有变化吗? +□ guides/configuration.md — 新增/修改了配置项吗? +□ guides/usage.md — 命令或行为有变化吗? +□ guides/architecture.md — 架构或流程有变化吗? +□ docs/dev/guides/contributing.md — 开发流程有变化吗? +``` + +### 3.4 flow-code 技能更新 + +在 `assets/skills/flow-code/SKILL.md` 中: + +**Workflow 部分**,在步骤 3(分支→编码→单测→PR)和步骤 4(更新开发文档)之间插入新步骤 4: + +```markdown +### 4. 文档同步检查 + +完成编码后,逐项检查以下文档是否需要同步更新: + +\`\`\` +## 文档同步检查清单 +□ guides/quickstart.md — 安装方式或前置条件有变化吗? +□ guides/configuration.md — 新增/修改了配置项吗? +□ guides/usage.md — 命令或行为有变化吗? +□ guides/architecture.md — 架构或流程有变化吗? +□ docs/dev/guides/contributing.md — 开发流程有变化吗? +\`\`\` + +- 逐项评估,无需修改的跳过 +- 需要修改的文档随代码一起提交到同一个 PR +- PR body 中列出已同步的文档 +``` + +原步骤 4(更新开发文档)重编号为步骤 5。 + +**Output 部分**,追加: +```markdown +- 文档同步 checklist 已完成 +- 已同步的文档随 PR 提交 +``` + +## 4. flow-review 更新方案 + +### 4.1 新增审查维度 + +在 `assets/skills/flow-review/SKILL.md` 的 Workflow 中,步骤 3(双轴审查)之前插入新步骤 3',原步骤 3 重编号为 4: + +```markdown +### 3. 文档同步确认 + +确认 PR 中是否包含文档同步: +- 检查 PR body 是否列出已同步的文档 +- 检查 `docs/guides/` 和 `docs/dev/guides/` 是否有相应变更 +- 如涉及配置/API 变更但文档未同步 → 标记为阻断性问题 +``` + +### 4.2 Changelog 追加 + +在步骤 4(双轴审查)中,规格轴追加子步骤: + +```markdown +**规格轴(Specification)** — 代码是否忠实实现了需求? +对照 PRD(`docs/prd/`)和设计方案(`docs/dev/specs/`)验证。 +- 如发现实现与设计偏差 → 追加到 `docs/dev/changelog/<YYYY-MM-DD-NNN-slug>.md` +``` + +### 4.3 合并前检查清单 + +在步骤 5(等待 CI + 自动合并)之前插入: + +```markdown +### 5. 合并前检查 + +在合并前确认以下项: +- 文档同步已完成(`docs/guides/` 已更新或无需更新) +- changelog 已记录偏差(如有) +- CI 已通过 +``` + +## 5. 迁移计划 + +### 5.1 执行步骤 + +| 步骤 | 操作 | 验证 | 影响 | +|------|------|------|------| +| 1 | 创建 `docs/dev/tasks/2026-07-09-001-docs-and-pages/` 目录 | 目录存在 | 新建 | +| 2 | 移动 7 个 docs-and-pages 文件到新目录 | 文件已移动,原位置已空 | 移动 7 文件 | +| 3 | 创建 `docs/dev/tasks/2026-07-10-001-vitepress-migration/` 目录 | 目录存在 | 新建 | +| 4 | 移动 7 个 vitepress-migration 文件(含 DAG.md)到新目录 | 文件已移动,原位置已空 | 移动 7 文件 | +| 5 | 创建 `docs/dev/changelog/` 目录 | 目录存在 | 新建 | +| 6 | 创建空 changelog 文件 | 2 个 `.md` 文件存在 | 新建 2 文件 | +| 7 | 更新 `docs/.vitepress/config.ts` 中 `getSidebar()` | `npm run docs:dev` 侧边栏正确显示 | 修改 1 文件 | +| 8 | 更新导航栏链接 | 导航栏无死链 | 修改 1 文件 | +| 9 | 更新 `assets/skills/flow-code/SKILL.md` | 技能文档包含 doc sync 步骤 | 修改 1 文件 | +| 10 | 更新 `assets/skills/flow-review/SKILL.md` | 技能文档包含 changelog 和文档确认 | 修改 1 文件 | +| 11 | 构建验证 | `npm run docs:build` 成功,无 dead link | — | + +### 5.2 风险评估 + +| 风险 | 影响 | 对策 | +|------|------|------| +| 外部引用旧 task 文件路径 | 旧链接 404 | VitePress 站点尚未广泛传播,影响极小;如有外部引用再添加重定向 | +| 拼音 slug 在侧边栏显示不佳 | 显示不友好 | 使用 PRD 中的英文 slug(已确认) | +| 嵌套目录导致 `getSidebar()` 逻辑复杂 | 维护成本 | 仅对 `dev/tasks` 做特殊处理,不影响其他目录 | +| `readdirSync` 对嵌套目录执行路径假设 | 构建失败 | 步骤 11 的构建验证覆盖此场景 | + +## 6. 影响范围 + +| 文件 | 操作 | 说明 | +|------|------|------| +| `docs/dev/tasks/*.md`(14 个) | 移动 | 按 feature 重组到子目录 | +| `docs/.vitepress/config.ts` | 修改 | `getSidebar()` 适配新结构 + 导航栏更新 | +| `assets/skills/flow-code/SKILL.md` | 修改 | 新增文档同步步骤 | +| `assets/skills/flow-review/SKILL.md` | 修改 | 新增 changelog + 文档确认 | +| `docs/dev/changelog/`(2 个 .md) | 新建 | 空 changelog 模板 | +| `docs/dev/tasks/2026-07-09-001-docs-and-pages/` | 新建 | 目录 | +| `docs/dev/tasks/2026-07-10-001-vitepress-migration/` | 新建 | 目录 | + +## 7. Out of Scope + +- 自动检测代码变更影响哪些文档(AI 辅助但最终人工判断) +- specs/ 技术方案自动更新 — 设计阶段产物,代码阶段不改 +- adr/ 架构决策记录自动更新 — 设计偏离时单独更新 +- task 文件修改 — 保留原始设计意图,变更记入 changelog \ No newline at end of file diff --git a/docs/dev/tasks/architecture-doc.md b/docs/dev/tasks/2026-07-09-001-docs-and-pages/architecture-doc.md similarity index 100% rename from docs/dev/tasks/architecture-doc.md rename to docs/dev/tasks/2026-07-09-001-docs-and-pages/architecture-doc.md diff --git a/docs/dev/tasks/configuration-guide.md b/docs/dev/tasks/2026-07-09-001-docs-and-pages/configuration-guide.md similarity index 100% rename from docs/dev/tasks/configuration-guide.md rename to docs/dev/tasks/2026-07-09-001-docs-and-pages/configuration-guide.md diff --git a/docs/dev/tasks/pages-deployment-workflow.md b/docs/dev/tasks/2026-07-09-001-docs-and-pages/pages-deployment-workflow.md similarity index 100% rename from docs/dev/tasks/pages-deployment-workflow.md rename to docs/dev/tasks/2026-07-09-001-docs-and-pages/pages-deployment-workflow.md diff --git a/docs/dev/tasks/quickstart-guide.md b/docs/dev/tasks/2026-07-09-001-docs-and-pages/quickstart-guide.md similarity index 100% rename from docs/dev/tasks/quickstart-guide.md rename to docs/dev/tasks/2026-07-09-001-docs-and-pages/quickstart-guide.md diff --git a/docs/dev/tasks/readme-update.md b/docs/dev/tasks/2026-07-09-001-docs-and-pages/readme-update.md similarity index 100% rename from docs/dev/tasks/readme-update.md rename to docs/dev/tasks/2026-07-09-001-docs-and-pages/readme-update.md diff --git a/docs/dev/tasks/site-index-and-config.md b/docs/dev/tasks/2026-07-09-001-docs-and-pages/site-index-and-config.md similarity index 100% rename from docs/dev/tasks/site-index-and-config.md rename to docs/dev/tasks/2026-07-09-001-docs-and-pages/site-index-and-config.md diff --git a/docs/dev/tasks/usage-guide.md b/docs/dev/tasks/2026-07-09-001-docs-and-pages/usage-guide.md similarity index 100% rename from docs/dev/tasks/usage-guide.md rename to docs/dev/tasks/2026-07-09-001-docs-and-pages/usage-guide.md diff --git a/docs/dev/tasks/DAG.md b/docs/dev/tasks/2026-07-10-001-vitepress-migration/DAG.md similarity index 99% rename from docs/dev/tasks/DAG.md rename to docs/dev/tasks/2026-07-10-001-vitepress-migration/DAG.md index ec6606d..30bc3ab 100644 --- a/docs/dev/tasks/DAG.md +++ b/docs/dev/tasks/2026-07-10-001-vitepress-migration/DAG.md @@ -87,4 +87,4 @@ A (VitePress 初始化) | VitePress 内部链接处理与 Jekyll 不同 | 部分链接 404 | 构建后检查 dead link,任务 C 中修正 | C | | `actions/deploy-pages` 需要 Pages Source 设为 "GitHub Actions" | 部署失败 | PR 中注明需手动配置仓库 Settings | E | | `dev/tasks/` 7 个文件侧边栏过长 | 导航体验差 | 默认折叠(`collapsed: true`) | D | -| ESM 项目 `"type": "module"` 与配置文件兼容性 | 配置加载失败 | VitePress `.ts` 配置文件与 ESM 兼容 | A | \ No newline at end of file +| ESM 项目 `"type": "module"` 与配置文件兼容性 | 配置加载失败 | VitePress `.ts` 配置文件与 ESM 兼容 | A | diff --git a/docs/dev/tasks/cicd-update.md b/docs/dev/tasks/2026-07-10-001-vitepress-migration/cicd-update.md similarity index 100% rename from docs/dev/tasks/cicd-update.md rename to docs/dev/tasks/2026-07-10-001-vitepress-migration/cicd-update.md diff --git a/docs/dev/tasks/content-migration.md b/docs/dev/tasks/2026-07-10-001-vitepress-migration/content-migration.md similarity index 100% rename from docs/dev/tasks/content-migration.md rename to docs/dev/tasks/2026-07-10-001-vitepress-migration/content-migration.md diff --git a/docs/dev/tasks/homepage-config.md b/docs/dev/tasks/2026-07-10-001-vitepress-migration/homepage-config.md similarity index 100% rename from docs/dev/tasks/homepage-config.md rename to docs/dev/tasks/2026-07-10-001-vitepress-migration/homepage-config.md diff --git a/docs/dev/tasks/jekyll-cleanup.md b/docs/dev/tasks/2026-07-10-001-vitepress-migration/jekyll-cleanup.md similarity index 100% rename from docs/dev/tasks/jekyll-cleanup.md rename to docs/dev/tasks/2026-07-10-001-vitepress-migration/jekyll-cleanup.md diff --git a/docs/dev/tasks/sidebar-nav-config.md b/docs/dev/tasks/2026-07-10-001-vitepress-migration/sidebar-nav-config.md similarity index 100% rename from docs/dev/tasks/sidebar-nav-config.md rename to docs/dev/tasks/2026-07-10-001-vitepress-migration/sidebar-nav-config.md diff --git a/docs/dev/tasks/vitepress-init.md b/docs/dev/tasks/2026-07-10-001-vitepress-migration/vitepress-init.md similarity index 100% rename from docs/dev/tasks/vitepress-init.md rename to docs/dev/tasks/2026-07-10-001-vitepress-migration/vitepress-init.md diff --git a/docs/dev/tasks/2026-07-10-002-doc-sync-workflow/DAG.md b/docs/dev/tasks/2026-07-10-002-doc-sync-workflow/DAG.md new file mode 100644 index 0000000..02a1af9 --- /dev/null +++ b/docs/dev/tasks/2026-07-10-002-doc-sync-workflow/DAG.md @@ -0,0 +1,24 @@ +--- +title: "文档同步流程与任务目录重构 — DAG" +status: "pending" +parent: "https://github.com/devcxl/opencode-cabbage/issues/25" +--- + +## DAG 拓扑 + +``` +A (目录重组) ─── B (getSidebar 适配) +C (changelog 创建) +D (flow-code 更新) +E (flow-review 更新) +``` + +## 任务列表 + +| 批次 | 任务 | 依赖 | 可并行 | +|------|------|------|--------| +| Batch 1 | A. 目录重组 | 无 | ✓ | +| Batch 1 | C. changelog 创建 | 无 | ✓ | +| Batch 1 | D. flow-code 更新 | 无 | ✓ | +| Batch 1 | E. flow-review 更新 | 无 | ✓ | +| Batch 2 | B. getSidebar 适配 | A | — | diff --git a/docs/dev/tasks/2026-07-10-002-doc-sync-workflow/changelog-creation.md b/docs/dev/tasks/2026-07-10-002-doc-sync-workflow/changelog-creation.md new file mode 100644 index 0000000..338681d --- /dev/null +++ b/docs/dev/tasks/2026-07-10-002-doc-sync-workflow/changelog-creation.md @@ -0,0 +1,43 @@ +--- +title: "C. 创建 changelog 目录" +status: "pending" +parent: "https://github.com/devcxl/opencode-cabbage/issues/25" +--- + +## 描述 + +创建 `docs/dev/changelog/` 目录,为现有的两个 feature 创建空 changelog 文件。 + +## 验收标准 + +- [ ] `docs/dev/changelog/` 目录已创建 +- [ ] `docs/dev/changelog/2026-07-09-001-docs-and-pages.md` 存在,含标题和 tasks 链接 +- [ ] `docs/dev/changelog/2026-07-10-001-vitepress-migration.md` 存在,含标题和 tasks 链接 + +## 实现要点 + +### 文件模板 + +```markdown +# Changelog: <feature-title> + +> 对应 tasks: `docs/dev/tasks/<YYYY-MM-DD-NNN-slug>/` + +## 实现偏差 + +(PR 合并前由 reviewer 追加) + +## 未实现项 + +(如适用) + +## 额外实现项 + +(如适用) +``` + +### 执行 + +```bash +mkdir -p docs/dev/changelog +``` diff --git a/docs/dev/tasks/2026-07-10-002-doc-sync-workflow/flow-code-update.md b/docs/dev/tasks/2026-07-10-002-doc-sync-workflow/flow-code-update.md new file mode 100644 index 0000000..60ac87f --- /dev/null +++ b/docs/dev/tasks/2026-07-10-002-doc-sync-workflow/flow-code-update.md @@ -0,0 +1,41 @@ +--- +title: "D. flow-code 技能更新(文档同步检查)" +status: "pending" +parent: "https://github.com/devcxl/opencode-cabbage/issues/25" +--- + +## 描述 + +在 `assets/skills/flow-code/SKILL.md` 中新增"文档同步检查"子步骤,作为编码后 PR 前的固定步骤。 + +## 验收标准 + +- [ ] flow-code workflow 包含新的步骤 4:文档同步检查 +- [ ] 步骤中包含完整的 checklist 模板(5 个文档) +- [ ] 原步骤 4(更新开发文档)重编号为 5 +- [ ] Output 中追加文档同步相关描述 + +## 实现要点 + +在步骤 3 和步骤 4 之间插入: + +```markdown +### 4. 文档同步检查 + +完成编码后,逐项检查以下文档是否需要同步更新: + +``` +## 文档同步检查清单 +□ guides/quickstart.md — 安装方式或前置条件有变化吗? +□ guides/configuration.md — 新增/修改了配置项吗? +□ guides/usage.md — 命令或行为有变化吗? +□ guides/architecture.md — 架构或流程有变化吗? +□ docs/dev/guides/contributing.md — 开发流程有变化吗? +``` + +- 逐项评估,无需修改的跳过 +- 需要修改的文档随代码一起提交到同一个 PR +- PR body 中列出已同步的文档 +``` + +原步骤 4 重编号为 5。 diff --git a/docs/dev/tasks/2026-07-10-002-doc-sync-workflow/flow-review-update.md b/docs/dev/tasks/2026-07-10-002-doc-sync-workflow/flow-review-update.md new file mode 100644 index 0000000..2f78ab8 --- /dev/null +++ b/docs/dev/tasks/2026-07-10-002-doc-sync-workflow/flow-review-update.md @@ -0,0 +1,49 @@ +--- +title: "E. flow-review 技能更新(changelog + 文档确认)" +status: "pending" +parent: "https://github.com/devcxl/opencode-cabbage/issues/25" +--- + +## 描述 + +更新 `assets/skills/flow-review/SKILL.md`,新增文档同步确认步骤和 changelog 追加职责。 + +## 验收标准 + +- [ ] flow-review 包含"文档同步确认"步骤(检查 PR body 和 docs/ 变更) +- [ ] 规格审查中包含 changelog 追加子步骤 +- [ ] 合并前检查清单包含文档同步和 changelog 确认 +- [ ] 步骤编号正确更新 + +## 实现要点 + +### 新增步骤 3:文档同步确认 + +```markdown +### 3. 文档同步确认 + +确认 PR 中是否包含文档同步: +- 检查 PR body 是否列出已同步的文档 +- 检查 `docs/guides/` 和 `docs/dev/guides/` 是否有相应变更 +- 如涉及配置/API 变更但文档未同步 → 标记为阻断性问题 +``` + +### 规格轴追加 + +在规格审查中追加: +``` +- 如发现实现与设计偏差 → 追加到 `docs/dev/changelog/<YYYY-MM-DD-NNN-slug>.md` +``` + +### 合并前检查 + +在步骤 5(等待 CI)前插入: + +```markdown +### 5. 合并前检查 + +在合并前确认以下项: +- 文档同步已完成(`docs/guides/` 已更新或无需更新) +- changelog 已记录偏差(如有) +- CI 已通过 +``` diff --git a/docs/dev/tasks/2026-07-10-002-doc-sync-workflow/sidebar-update.md b/docs/dev/tasks/2026-07-10-002-doc-sync-workflow/sidebar-update.md new file mode 100644 index 0000000..601d0d6 --- /dev/null +++ b/docs/dev/tasks/2026-07-10-002-doc-sync-workflow/sidebar-update.md @@ -0,0 +1,56 @@ +--- +title: "B. getSidebar() 适配新目录结构" +status: "pending" +parent: "https://github.com/devcxl/opencode-cabbage/issues/25" +--- + +## 描述 + +更新 `docs/.vitepress/config.ts` 中 `getSidebar()` 函数,适配新的 `YYYY-MM-DD-NNN-slug/` 嵌套目录结构,并更新导航栏中的 tasks 链接。 + +## 验收标准 + +- [ ] `getSidebar()` 能正确遍历 `dev/tasks/` 下的 feature 子目录 +- [ ] 侧边栏显示 feature 名称时已剥离日期前缀(如 `2026-07-10-001-vitepress-migration` → `Vitepress Migration`) +- [ ] feature 目录默认折叠(`collapsed: true`) +- [ ] 导航栏中不再硬编码指向具体 task 文件的链接 +- [ ] `npm run docs:build` 构建成功 + +## 依赖 + +Task A(目录重组)完成后才能执行 + +## 实现要点 + +参考技术方案 1.4 节代码: + +```ts +if (dir === 'dev' && entry === 'tasks') { + const featureDirs = readdirSync(fullPath).sort().filter(e => { + if (e.startsWith('.')) return false + return statSync(join(fullPath, e)).isDirectory() + }) + if (featureDirs.length > 0) { + const taskItems = featureDirs.map(fd => { + const fdPath = join(fullPath, fd) + const fdFiles = readdirSync(fdPath).sort().filter(e => e.endsWith('.md')) + const displayName = fd + .replace(/^\d{4}-\d{2}-\d{2}-\d{3}-/, '') + .replace(/-/g, ' ') + .replace(/\b\w/g, c => c.toUpperCase()) + return { + text: displayName, + collapsed: true, + items: fdFiles.map(f => ({ + text: f.replace('.md', '').replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase()), + link: `/${dir}/${entry}/${fd}/${f.replace('.md', '')}`, + })), + } + }) + items.push({ text: 'Tasks', collapsed: false, items: taskItems }) + } + continue +} +``` + +同时移除导航栏配置中的 `/dev/tasks/pages-deployment-workflow` 等硬编码链接。 diff --git a/docs/dev/tasks/2026-07-10-002-doc-sync-workflow/task-dir-restructure.md b/docs/dev/tasks/2026-07-10-002-doc-sync-workflow/task-dir-restructure.md new file mode 100644 index 0000000..9096240 --- /dev/null +++ b/docs/dev/tasks/2026-07-10-002-doc-sync-workflow/task-dir-restructure.md @@ -0,0 +1,35 @@ +--- +title: "A. 任务目录重组" +status: "pending" +parent: "https://github.com/devcxl/opencode-cabbage/issues/25" +--- + +## 描述 + +将 `docs/dev/tasks/` 下平铺的 14 个文件按 feature 迁移到 `YYYY-MM-DD-NNN-slug/` 子目录中。 + +## 验收标准 + +- [ ] `docs/dev/tasks/2026-07-09-001-docs-and-pages/` 目录已创建,包含 7 个 .md 文件 +- [ ] `docs/dev/tasks/2026-07-10-001-vitepress-migration/` 目录已创建,包含 7 个 .md 文件(含 DAG.md) +- [ ] `docs/dev/tasks/` 根目录下无残留的平铺 .md 文件 +- [ ] `git mv` 操作,保留 git 历史 + +## 实现要点 + +### 文件归属 + +**2026-07-09-001-docs-and-pages/** +- architecture-doc.md, configuration-guide.md, quickstart-guide.md, readme-update.md, site-index-and-config.md, usage-guide.md, pages-deployment-workflow.md + +**2026-07-10-001-vitepress-migration/** +- DAG.md, vitepress-init.md, homepage-config.md, content-migration.md, sidebar-nav-config.md, cicd-update.md, jekyll-cleanup.md + +### 执行 + +```bash +mkdir -p docs/dev/tasks/2026-07-09-001-docs-and-pages +mkdir -p docs/dev/tasks/2026-07-10-001-vitepress-migration +git mv docs/dev/tasks/architecture-doc.md docs/dev/tasks/2026-07-09-001-docs-and-pages/ +# ... 全部移动 +``` diff --git a/docs/prd/doc-sync-workflow.md b/docs/prd/doc-sync-workflow.md new file mode 100644 index 0000000..94af0fd --- /dev/null +++ b/docs/prd/doc-sync-workflow.md @@ -0,0 +1,121 @@ +# 文档同步流程与任务目录重构 + +## 概述 + +当前项目存在两个问题: + +1. **文档同步缺失**:代码变更后,用户文档(`docs/guides/`)没有自动化的同步机制,导致文档与最新功能脱节 +2. **任务目录混乱**:所有 feature 的 task 文件平铺在 `docs/dev/tasks/` 下,无法区分属于哪个需求,也看不出依赖关系和创建顺序 + +## 用户故事 + +- 作为**开发者**,我希望在实现功能后有一个明确的文档同步检查流程,确保用户文档与代码一致 +- 作为**项目维护者**,我希望任务文件按 feature 组织,能按时间排序且清楚归属 +- 作为**代码审查者**,我希望知道实际实现与设计之间的偏差,并记录到 changelog + +## In Scope + +### 1. 任务目录重构 + +``` +docs/dev/tasks/ +├── 2026-07-09-001-docs-and-pages/ +│ ├── architecture-doc.md +│ ├── configuration-guide.md +│ ├── pages-deployment-workflow.md +│ ├── quickstart-guide.md +│ ├── readme-update.md +│ ├── site-index-and-config.md +│ └── usage-guide.md +├── 2026-07-10-001-vitepress-migration/ +│ ├── DAG.md +│ ├── vitepress-init.md +│ ├── homepage-config.md +│ ├── content-migration.md +│ ├── sidebar-nav-config.md +│ ├── cicd-update.md +│ └── jekyll-cleanup.md +``` + +- 目录命名格式:`YYYY-MM-DD-NNN-slug/` + - `NNN` 从 `001` 开始,每天独立递增 + - `slug` 简短描述 feature +- `getSidebar()` 正则剥离日期前缀,显示纯名称 +- 现有平铺文件迁移到对应 feature 目录 + +### 2. 新增 changelog 目录 + +``` +docs/dev/changelog/ +└── 2026-07-10-001-vitepress-migration.md +``` + +- 记录实际实现与设计的偏差 +- reviewer 在 PR 合并前追加 +- 格式:`<feature-slug>.md` + +### 3. 文档同步流程(doc sync) + +作为 flow-code 技能中的固定步骤: + +``` +分支 → 编码 → 单测 → 文档同步检查 → PR +``` + +文档同步检查步骤: + +1. flow-code 技能自动输出文档同步 checklist: + +``` +## 文档同步检查清单 +□ guides/quickstart.md — 安装方式或前置条件有变化吗? +□ guides/configuration.md — 新增/修改了配置项吗? +□ guides/usage.md — 命令或行为有变化吗? +□ guides/architecture.md — 架构或流程有变化吗? +□ docs/dev/guides/contributing.md — 开发流程有变化吗? +``` + +2. 开发者逐项评估,无需修改的跳过 +3. 需要修改的文档随代码一起提交到同一个 PR +4. PR body 中列出已同步的文档 + +### 4. 更新 `getSidebar()` 配置 + +- 适配新的 `YYYY-MM-DD-NNN-slug/` 目录结构 +- tasks 目录名在侧边栏中显示纯 slug + +### 5. 更新 flow-code skill 文档 + +- 加入文档同步步骤 +- 加入 checklist 模板 + +### 6. 更新 flow-review skill 文档 + +- 加入 changelog 追加职责 +- reviewer 合并前检查文档同步是否完成 + +## Out of Scope + +- 自动检测代码变更影响哪些文档(AI 辅助但最终人工判断) +- specs/ 技术方案自动更新 — 设计阶段产物,代码阶段不改 +- adr/ 架构决策记录自动更新 — 设计偏离时单独更新 +- task 文件修改 — 保留原始设计意图,变更记入 changelog + +## 验收标准 + +- [x] 任务文件已按 `YYYY-MM-DD-NNN-slug/` 目录重组 +- [x] `getSidebar()` 适配新目录结构,tasks 侧边栏按日期排序 +- [x] flow-code skill 包含文档同步检查步骤 +- [x] flow-review skill 包含 changelog 追加和文档同步确认职责 +- [x] changelog 目录已创建,reviewer 合并前追加 delta 记录 +- [x] 现有 task 文件全部迁移无遗漏 + +## 优先级 + +| 项 | 优先级 | +|----|--------| +| 任务目录重构 | P0 | +| flow-code + doc sync 步骤 | P0 | +| getSidebar() 适配 | P0 | +| changelog 目录 | P1 | +| flow-review 更新 | P1 |