From 49ecbfb89e1b7df1f82169cd29355b1f987ccc00 Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Sat, 17 Oct 2026 20:25:05 +0800 Subject: [PATCH] docs(10): add D-09 review revision plans (10-07..10-12) --- .planning/ROADMAP.md | 10 +- .../phases/10-docs-restructure/10-07-PLAN.md | 152 ++++++++++++++++ .../phases/10-docs-restructure/10-08-PLAN.md | 159 ++++++++++++++++ .../phases/10-docs-restructure/10-09-PLAN.md | 153 ++++++++++++++++ .../phases/10-docs-restructure/10-10-PLAN.md | 151 ++++++++++++++++ .../phases/10-docs-restructure/10-11-PLAN.md | 170 ++++++++++++++++++ .../phases/10-docs-restructure/10-12-PLAN.md | 129 +++++++++++++ 7 files changed, 922 insertions(+), 2 deletions(-) create mode 100644 .planning/phases/10-docs-restructure/10-07-PLAN.md create mode 100644 .planning/phases/10-docs-restructure/10-08-PLAN.md create mode 100644 .planning/phases/10-docs-restructure/10-09-PLAN.md create mode 100644 .planning/phases/10-docs-restructure/10-10-PLAN.md create mode 100644 .planning/phases/10-docs-restructure/10-11-PLAN.md create mode 100644 .planning/phases/10-docs-restructure/10-12-PLAN.md diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index 673ea90..edf787c 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -547,14 +547,14 @@ Phases execute in numeric order: 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → | 7. 数据端缺陷修复 | 15/16 | Complete(07-16 superseded) | - | | 8. 测试重构与接口对齐 | 11/11 | Complete | 2026-10-08 | | 9. 最小浏览器可运行版本 | 15/16 | In Progress| | -| 10. 文档重构 | 0/6 | Planned | - | +| 10. 文档重构 | 0/12 | Planned | - | ### Phase 10: 文档重构 **Goal:** 重构过老、结构不佳、新人难懂的项目文档,面向多背景读者(完全新手 / 不懂代码的作者 / 有基础的作者 / AI Agent)提供分层指南。本阶段采用「伞阶段 + 增量派发」:每次只规划执行一个已派发的具体小任务。**第一批已派发 = 中级教程(`docs/intermediate/`,24 篇中文 markdown)+ 在 VitePress 站点注册它们 + 旧内容清空(D-04 并入本批)**(D-01..D-44)。 **Requirements**: (无专属需求 ID;以 `10-CONTEXT.md` 的 D-01..D-44 为需求基线,验收锚在 D-09:用户人工审阅 + 链接全部有效 + 构建通过) **Depends on:** Phase 9 -**Plans:** 6 plans(第一批:中级教程 24 篇 + 站点注册) +**Plans:** 12 plans(第一批:中级教程 24 篇 + 站点注册 + D-09 复审修订) Plans: - [ ] 10-01-PLAN.md — Wave 0:旧内容清空 + 站点注册(删除 `docs/guide`、`docs/dev`、`docs/logger`、`docs/api` 与首页 `docs/index.md`;清理 `config.ts` 旧 nav/sidebar 键并解除 apiSidebar/api 依赖;`api.ts` 加缺失目录守卫;新增 nav 入口 + `sidebar['/intermediate/']` 4 组/24 条;报告并等待 checkpoint) @@ -563,5 +563,11 @@ Plans: - [ ] 10-04-PLAN.md — 战斗 9 篇(`combat-overview` + 8 篇子系统;N-1/N-2/N-3/N-7 留余地) - [ ] 10-05-PLAN.md — 其他 3 篇(`events` / `replay-commands` / `data-plugins`) - [ ] 10-06-PLAN.md — 全批验收(构建通过 + 链接有效 + 交付 D-09 人工审阅) +- [ ] 10-07-PLAN.md — 目标性修正:D-09 复审 finding 1/3/4(讲清 `state` 获取、清除 legacy 泄漏 + 全批扫描、纠正修饰器定位;仅改 4 篇) +- [ ] 10-08-PLAN.md — 战斗组引导式·入门友好重写 finding 2/5(`combat-overview` 讲清「计算后怪物 / 为什么要 buildup / 为什么分阶段」+ 7 篇子系统;8 篇) +- [ ] 10-09-PLAN.md — 概念组 + 「其他」组引导式重写 finding 5(`src-tour`/`code-basics`/`hooks`/`events`/`replay-commands`/`data-plugins`;6 篇) +- [ ] 10-10-PLAN.md — 基础接口组引导式重写 finding 5(`hero-items`/`hero-equipment`/`hero-location`/`map-structure`/`map-tiles`/`flags`;6 篇) +- [ ] 10-11-PLAN.md — 读者视角审阅(persona 子代理)→ 问题清单 → 迭代修正(≤3 轮)→ 复审清零 +- [ ] 10-12-PLAN.md — 最终验收:修订后重跑全批验收 + D-09 复审(重跑 10-06 Task 2 门禁) **说明:** 每篇中级教程遵循 `10-CONTEXT.md` D-21..D-44 的逐篇要点与阅读顺序(4/8/9/3)。**旧内容删除已并入本批(D-04,Wave 0 / 10-01)**:删除 `docs/guide/*`、`docs/dev/*`、`docs/logger/*`、`docs/api/*` 与首页 `docs/index.md`,并清理 `docs/.vitepress/config.ts` 的旧 `nav`/`sidebar` 键。文档改动为 `docs/intermediate/*.md`(新增)、`docs/.vitepress/config.ts` 与 `docs/.vitepress/api.ts`(缺失目录守卫,保留按包生成机制)。构建命令 `cmd /c "pnpm exec tsx docs/.vitepress/init.ts && pnpm docs:build"`;`init.ts` 在 `docs/api/` 缺失时安全跳过。本机 PowerShell 禁止 `pnpm.ps1`,命令经 `cmd /c "..."` 执行。 diff --git a/.planning/phases/10-docs-restructure/10-07-PLAN.md b/.planning/phases/10-docs-restructure/10-07-PLAN.md new file mode 100644 index 0000000..959732c --- /dev/null +++ b/.planning/phases/10-docs-restructure/10-07-PLAN.md @@ -0,0 +1,152 @@ +--- +phase: 10-docs-restructure +plan: 07 +type: execute +wave: 7 +depends_on: [10-06] +gap_closure: true +files_modified: + - docs/intermediate/data-state-overview.md + - docs/intermediate/data-vs-render.md + - docs/intermediate/hero-attribute.md + - docs/intermediate/enemy-map-damage.md +autonomous: false +requirements: [] +user_setup: [] +estimate: + tokens: 24000 + raw_tokens: 16000 + tasks: 4 + confidence: low +must_haves: + truths: + - "`data-state-overview` 用平实语言解释主对象 `state` 是什么,并列出获取 `state` 的常见方式:框架作为参数传入(道具效果 `useEffect(item, state)`、插件 `awake(state, ...)` / `initialize` / `afterLoad`、事件环境 `env.state`)、从处理对象上取(`handler.state`)、存到自身对象上(`this.state`);不假定读者已懂「主对象」" + - "`data-vs-render` 不再出现 legacy 全局包裹接口的名称与示例(那段 `:::info` 被移除,或改写为不含该 legacy 接口名的表述,指引改为指向 `state` 与数据端本身)" + - "`enemy-map-damage` 不再出现旧主对象全局前缀的对象访问(第 52 行 `BetweenDamageView` 读取全局 flag `betweenAttackMax` 的表述改为不含旧全局前缀,仅保留 flag 名或改指 `state.flags`)" + - "全 24 篇经 legacy 扫描:除已修正处外,无其它 legacy 全局包裹接口(`Mota`)或旧主对象全局前缀对象访问;`core.jsonc` 等文件名不计入" + - "`hero-attribute` 的修饰器小节不再把修饰器框定为『临时』:标题与正文明确修饰器既可用于临时、也可用于永久加成;临时效果的做法是『不再需要时移除该修饰器』;保留原有正确的永久示例" + - "4 个被改文件仍为 kebab-case、CRLF、单 H1;构建通过且 dead-link 为 0" + artifacts: + - "docs/intermediate/data-state-overview.md" + - "docs/intermediate/data-vs-render.md" + - "docs/intermediate/hero-attribute.md" + - "docs/intermediate/enemy-map-damage.md" + key_links: + - "本计划是对 D-09 人工审阅 5 条 finding 中第 1、3、4 条的目标性修正(10-06 Task 2 未通过)" + - "`state` 获取方式的统一表述是本计划新增的口径,后续 10-08/10-09/10-10 的引导式重写须沿用,不得与之冲突" + - "保留 10-CONTEXT.md D-21(data-vs-render 不提反向推送)与 D-26(hero-attribute 的修饰器、save 语义)等已锁定内容" +--- + + +修正 D-09 人工审阅提出的第 1、3、4 条问题(`state` 获取方式未讲清、legacy 内容泄漏、修饰器被误框定为「临时」),并对这 4 个文件顺带做一次引导式表述调整,避免后续重写计划重复触碰。 + +Purpose: 让读者能真正看懂「`state` 从哪来」;清除 `docs/intermediate` 中的 legacy 痕迹;把修饰器的定位纠正为「临时与永久皆可」。这三条是**目标性**修正,不改变 D-21..D-44 锁定的内容范围。 +Output: 4 个修正后的 `docs/intermediate/*.md`;legacy 扫描结论。 + + + +@C:/Users/13194/.config/opencode/gsd-core/workflows/execute-plan.md +@C:/Users/13194/.config/opencode/gsd-core/templates/summary.md + + + +@.planning/phases/10-docs-restructure/10-CONTEXT.md +@.planning/phases/10-docs-restructure/10-RESEARCH.md +@.planning/phases/10-docs-restructure/10-PATTERNS.md + +**修正来源(D-09 复审 5 条 finding,本计划负责第 1、3、4 条):** +- **finding 1(`state` 获取)**:`data-state-overview` 未说清「数据端主对象 `state` 如何获取」;不同地方获得 `state` 的方式不同(函数参数传入 / `this.state` / `handler.state`)。必须用平实语言讲清常见获取方式,且不假定读者理解「主对象」是什么。 +- **finding 3(legacy 泄漏)**:`data-vs-render` 第 46 行写了 legacy 的全局包裹接口示例;该接口属 legacy,**不得出现在教程中**。并须扫描其它页面,清除任何其它 legacy 全局包裹接口或旧主对象全局前缀的对象访问。 +- **finding 4(修饰器被误标「临时」)**:`hero-attribute` 的标题「修饰器:临时的加减与百分比」与「如果只想施加一段**临时**的加成,应使用修饰器」表述有误——修饰器**既可用于临时、也可用于永久**;想实现临时效果,应在不再需要时**移除**该修饰器。保留原有正确的永久示例。 + +**写作约定与前置:** +- 骨架、kebab-case、CRLF、单 H1、无元叙述(D-16)、跳转链接 2–5 处/篇,沿用 10-PATTERNS 的约定。 +- 只改 `docs/intermediate/*.md`;**不**触碰 `docs/.vitepress/config.ts`(侧边栏已正确)与任何 `src/`、`packages/`、`packages-user/` 生产代码。 +- 本计划只处理这 4 个文件;其余文件由 10-08/10-09/10-10 处理,互不重叠。 +- 命令一律经 `cmd /c "..."` 执行(本机 PowerShell 禁止 `pnpm.ps1`)。 +- 越界项只记录、不实施(D-14)。 + + + + + + Task 0: 向用户汇报本修正计划并等待「可以执行」 + 向用户汇报:**要做什么**(对 D-09 复审第 1、3、4 条做目标性修正:讲清 `state` 获取方式、清除 legacy 泄漏、纠正修饰器定位)、**为什么**(10-06 Task 2 的 D-09 审阅未通过,这三条是明确缺陷)、**大致怎么做**(在 `data-state-overview` 用平实语言补「state 从哪来」;在 `data-vs-render` 移除 legacy 全局包裹接口示例并全批扫描其它 legacy 痕迹;在 `hero-attribute` 改写修饰器小节标题与表述;`enemy-map-damage` 去除旧主对象全局前缀引用;四篇顺带做引导式表述调整)、**影响范围**(仅改这 4 个 `docs/intermediate/*.md`,不改站点配置与生产代码)。停下等待用户明确回复「可以执行」四个字;未收到前不得改任何文件。 + 本计划内容:修正 D-09 复审第 1、3、4 条(state 获取 / legacy 泄漏 / 修饰器定位),仅改动 4 个 `docs/intermediate/*.md`。 + 阅读上面的「要做什么 / 为什么 / 大致怎么做 / 影响范围」四段,确认修正范围与做法无异议。 + 回复「可以执行」以继续;其它回复视为未批准,本计划停在此处。 + + 用户已回复「可以执行」。 + + 用户回复「可以执行」。 + + + + Task 1: 讲清 state 获取方式(data-state-overview) + docs/intermediate/data-state-overview.md + 重写/扩写 `data-state-overview.md`,落实 finding 1。要点:(1) 用平实语言解释「主对象 `state`」是什么——不要假定读者懂「主对象」这个概念,先说明它就像游戏的一个总开关/总目录,勇士、地图、怪物、战斗、Flag 等都挂在它下面。(2) 明确列出「`state` 从哪来」的常见方式,至少覆盖三类:① **框架作为参数传入**——道具效果 `useEffect(item, state)`、数据插件 `awake(state, ...)` / `initialize(state, ...)` / `afterLoad(state, ...)`、事件的 `env.state`;② **从处理对象上取**——如 `handler.state`(怪物/战斗上下文里的 handler 带 `state`);③ **存到自己的对象上**——自己写的类在构造函数里接收并保存 `state`,之后用 `this.state`。(3) 明确一句:教程后续代码示例里的 `state` 都假设它已在当前作用域中(由上述任一方式获得),因此示例不再重复来源。(4) 保留原有「常用对象与获取方式」表与 L0–L3 轻量分组标注(D-25)。顺带做引导式表述调整(finding 5 的手法:概念引导式书写,而非罗列)。遵守 kebab-case、CRLF、单 H1、无元叙述。Commit:`docs(10-07): 讲清 state 获取方式`。 + + $ErrorActionPreference='Stop'; $p='docs/intermediate/data-state-overview.md'; if(-not(Test-Path $p)){ Write-Error "MISSING $p" }; $raw=[IO.File]::ReadAllText((Resolve-Path $p)); if($raw -match "(? + non-zero exit, or output contains "MISSING", "LF-ONLY", "H1-COUNT", "NO-STATE-ACQ", or "NO-STATE" + + `data-state-overview` 用平实语言解释 `state` 并列出三条常见获取方式(参数传入 / `handler.state` / `this.state`,含 `env.state` 与插件参数);保留对象表与 L0–L3 标注;CRLF、单 H1。 + + + + Task 2: 清除 legacy 泄漏(data-vs-render、enemy-map-damage)+ 全批扫描 + docs/intermediate/data-vs-render.md, docs/intermediate/enemy-map-damage.md + 落实 finding 3。(1) `data-vs-render.md`:移除第 46 行附近那段 `:::info`(内容为「数据端需调用渲染端时要用某个 legacy 全局包裹接口包裹」的提示)。该 legacy 接口名**不得出现在正文任何位置**。改写方式:删掉该提示,或改为一句不含 legacy 接口名的平实说明(例如「数据端代码不应依赖渲染端内容;两端各自独立」),并保持 D-21(**不提**「渲染端不能反向推送」)。(2) `enemy-map-damage.md`:第 52 行 `BetweenDamageView` 读取全局 flag `betweenAttackMax` 的表述里带有旧主对象全局前缀(旧全局对象名以字母 `c` 开头);改为不含该前缀的表述——仅以 flag 名 `betweenAttackMax` 描述该行为,或改述为「读取全局 flag `betweenAttackMax`」。全句语义与 D-39 一致,不臆造新行为。(3) **全批 legacy 扫描**:对 `docs/intermediate/` 全部 24 篇逐篇扫描,找出任何其它 legacy 全局包裹接口名(`M` 开头的旧全局)与旧主对象全局前缀对象访问;文件名性质的出现(如 `core.jsonc`、`ICoreState`)**不算** legacy。发现的其它命中**只记录、报告给用户**(D-14),不在本计划擅自改写。两篇顺带做引导式表述调整。遵守 kebab-case、CRLF、单 H1、无元叙述。Commit:`docs(10-07): 清除 legacy 泄漏`。 + + $ErrorActionPreference='Stop'; foreach($p in @('docs/intermediate/data-vs-render.md','docs/intermediate/enemy-map-damage.md')){ if(-not(Test-Path $p)){ Write-Error "MISSING $p" }; $raw=[IO.File]::ReadAllText((Resolve-Path $p)); if($raw -match "(? + non-zero exit, or output contains "MISSING", "LF-ONLY", "H1-COUNT", "LEGACY-MOTA", "LEGACY-COREFLAGS", or "LOST-FLAG" + + `data-vs-render` 无 legacy 全局包裹接口名;`enemy-map-damage` 无旧主对象全局前缀、保留 flag 名 `betweenAttackMax`;全 24 篇 legacy 扫描结论已记录;两篇 CRLF、单 H1。 + + + + Task 3: 纠正修饰器定位(hero-attribute) + docs/intermediate/hero-attribute.md + 修正 `hero-attribute.md` 的 finding 4。(1) 标题 `## 修饰器:临时的加减与百分比` 改为不把修饰器等同于「临时」的表述(例如 `## 修饰器:属性加成` 或 `## 修饰器:数值与百分比加成`)。(2) 把「如果只想施加一段**临时**的加成,应使用**修饰器**」这句改写为正确表述:**修饰器既可用于永久加成、也可用于临时加成**(是否临时取决于你何时移除它);直接改基础属性会永久改变数值,而修饰器把加成独立出来、便于随时挂上或移除。(3) 明确「想要临时效果」的做法:先 `addModifier(...)`,在不再需要时用 `deleteModifier(...)` 移除,效果即消失。(4) **保留**原有正确的**永久示例**(攻击永久 +5 的 `ValueModifier`)。(5) 保留 D-26 的既有内容:`ValueModifier` / `PercentageModifier`、`getModifiableAttribute()`、`addModifier` / `deleteModifier`、`save` 参数与读档一致性 `:::warning`、`getAttribute()` / `getIsolatedAttribute()`、回指 `./hooks.md`。示例区那句「防御 -20% 临时:挂一个百分比修饰器,战斗结束后再删除」可保留为**临时用法**的示例(它是移除式临时的正例),但需与新表述一致。顺带做引导式表述调整。遵守 kebab-case、CRLF、单 H1、无元叙述。Commit:`docs(10-07): 纠正修饰器定位`。 + + $ErrorActionPreference='Stop'; $p='docs/intermediate/hero-attribute.md'; if(-not(Test-Path $p)){ Write-Error "MISSING $p" }; $raw=[IO.File]::ReadAllText((Resolve-Path $p)); if($raw -match "(? + non-zero exit, or output contains "MISSING", "LF-ONLY", "H1-COUNT", "BAD-MODIFIER-HEADING", "BAD-TEMP-FRAMING", or "NO-" + + `hero-attribute` 不再把修饰器框定为「临时」;明确修饰器临时/永久皆可,临时效果靠移除修饰器实现;保留永久示例与 `save` 语义;CRLF、单 H1。 + + + + + +## Trust Boundaries + +| Boundary | Description | +|----------|-------------| +| 构建期 markdown → 静态站点 | 正文由构建期静态渲染,无运行时输入 | +| 站点 → 浏览器读者 | 外链是唯一对外指向面(本篇不引入新外链) | + +## STRIDE Threat Register + +| Threat ID | Category | Component | Severity | Disposition | Mitigation Plan | +|-----------|----------|-----------|----------|-------------|-----------------| +| T-10-19 | Tampering / XSS | 4 篇 markdown 正文 | low | mitigate | 只写文本、代码块、表格;不引入原始 `