@chengzhao-dev/dsh-quarto-book 0.6.17 → 0.6.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.en.md +1 -1
  2. package/README.md +3 -3
  3. package/lib/tools/pass-report.js +6 -5
  4. package/lib/tools/render-check.js +1 -1
  5. package/package.json +2 -2
  6. package/skills/designing-theme/SKILL.md +24 -12
  7. package/skills/writing-quarto/SKILL.md +52 -39
  8. package/skills/writing-quarto/examples/02-structure-shape.md +1 -1
  9. package/skills/writing-quarto/examples/03-excerpt-lead.md +19 -0
  10. package/skills/writing-quarto/examples/04-paragraph-cases.md +17 -13
  11. package/skills/writing-quarto/examples/06-wording-cases.md +1 -1
  12. package/skills/writing-quarto/examples/07-layout-list.md +17 -1
  13. package/skills/writing-quarto/quarto/authoring.md +3 -3
  14. package/skills/writing-quarto/quarto/comments.md +1 -0
  15. package/skills/writing-quarto/quarto/coords.md +1 -1
  16. package/skills/writing-quarto/quarto/prose.md +2 -3
  17. package/skills/writing-quarto/quarto/refactor.md +3 -3
  18. package/skills/writing-quarto/quarto/terminal.md +2 -0
  19. package/skills/writing-quarto/references/book-journey.md +14 -14
  20. package/skills/writing-quarto/references/fence-semantics.md +6 -6
  21. package/skills/writing-quarto/references/personas.md +15 -0
  22. package/skills/writing-quarto/references/rules-cards.md +3 -3
  23. package/skills/writing-quarto/references/token-budget.md +2 -2
  24. package/skills/writing-quarto/scripts/testing-content.py +83 -2
  25. package/skills/writing-quarto/scripts/verifying-content.py +251 -4
  26. package/skills/writing-quarto/steps/01-task.md +25 -42
  27. package/skills/writing-quarto/steps/02-structure.md +29 -54
  28. package/skills/writing-quarto/steps/03-blocks.md +112 -133
  29. package/skills/writing-quarto/steps/04-paragraphs.md +2 -1
  30. package/skills/writing-quarto/steps/05-sentences.md +45 -70
  31. package/skills/writing-quarto/steps/06-wording.md +11 -9
  32. package/skills/writing-quarto/steps/07-layout.md +3 -1
  33. package/skills/writing-quarto/steps/08-reread.md +9 -26
  34. package/skills/writing-quarto/steps/09-check.md +4 -3
package/README.en.md CHANGED
@@ -29,7 +29,7 @@ Both skills are discovered from the package's `skills/` directory and loaded on
29
29
  2. Open a session in the book repository. `_quarto.yml` needs a standalone `type: book` line, and the book needs at least one `.qmd` or `.md` chapter source; only then do both skill names appear.
30
30
  3. Call a skill: `writing-quarto` for prose, `designing-theme` for the theme.
31
31
 
32
- Replace `--profile` with the profile you actually run. The desktop app always runs the `desktop` profile, and that profile is owned by the app, so `dsh --profile desktop` is rejected; install or upgrade with `dsh plugin --profile desktop add <package>`, and use the app's Settings → Plugins → Add plugin only if the app refuses that write. To pin a version, write `npm:@chengzhao-dev/dsh-quarto-book@0.6.17`; to follow a GitHub tag, write `github:chengzhao-dev/dsh-quarto-book#v0.6.17`.
32
+ Replace `--profile` with the profile you actually run. The desktop app always runs the `desktop` profile, and that profile is owned by the app, so `dsh --profile desktop` is rejected; install or upgrade with `dsh plugin --profile desktop add <package>`, and use the app's Settings → Plugins → Add plugin only if the app refuses that write. To pin a version, write `npm:@chengzhao-dev/dsh-quarto-book@0.6.19`; to follow a GitHub tag, write `github:chengzhao-dev/dsh-quarto-book#v0.6.19`.
33
33
 
34
34
  Upgrading from the old unscoped package `dsh-quarto-book` (removed from npm with 0.3.4, so this only affects profiles that installed it earlier): remove it from the same profile first with `dsh plugin --profile <profile> remove dsh-quarto-book`, then add the scoped package. Keeping both installed registers `writing-quarto` and `designing-theme` twice at the same rank 550.
35
35
 
package/README.md CHANGED
@@ -29,7 +29,7 @@
29
29
  2. 在书仓库里打开会话。`_quarto.yml` 要有独立一行的 `type: book`,书根至少有一个 `.qmd` 或 `.md` 章节源文件;两个技能名这时才会出现。
30
30
  3. 调用技能:写正文用 `writing-quarto`,改主题用 `designing-theme`。
31
31
 
32
- `--profile` 换成你实际运行的那个 profile。桌面应用固定跑 `desktop` profile,且该 profile 由应用独占管理,`dsh --profile desktop` 直接启动会被拒绝;安装或升级用 `dsh plugin --profile desktop add <包>`,应用拒绝写入时再走「设置 → 插件 → 添加插件」。需要固定版本时写 `npm:@chengzhao-dev/dsh-quarto-book@0.6.17`,跟 GitHub 标签时写 `github:chengzhao-dev/dsh-quarto-book#v0.6.17`。
32
+ `--profile` 换成你实际运行的那个 profile。桌面应用固定跑 `desktop` profile,且该 profile 由应用独占管理,`dsh --profile desktop` 直接启动会被拒绝;安装或升级用 `dsh plugin --profile desktop add <包>`,应用拒绝写入时再走「设置 → 插件 → 添加插件」。需要固定版本时写 `npm:@chengzhao-dev/dsh-quarto-book@0.6.19`,跟 GitHub 标签时写 `github:chengzhao-dev/dsh-quarto-book#v0.6.19`。
33
33
 
34
34
  从旧的无作用域包 `dsh-quarto-book` 升级(该包已随 0.3.4 从 npm 删除,只影响之前装过它的 profile):先在同一个 profile 里 `dsh plugin --profile <profile> remove dsh-quarto-book`,再装新包。两个包同时留着会以相同的 rank 550 各注册一遍 `writing-quarto` 和 `designing-theme`。
35
35
 
@@ -50,7 +50,7 @@
50
50
 
51
51
  ### 写章节
52
52
 
53
- 在 `type: book` 的仓库里加载 `writing-quarto`,按 `SKILL.md` 的九步执行。每一步只打开同号的一个 `steps/` 文件;判不准才读 `examples/` 里同号的案例;要排图、查渲染或全仓重构才打开 `quarto/`。
53
+ 在 `type: book` 的仓库里加载 `writing-quarto`,按 `SKILL.md` 判操作并走九步。每一步只打开同号的一个 `steps/` 文件;判不准才读 `examples/` 里同号的案例;要排图、查渲染或全仓改写才打开 `quarto/`。
54
54
 
55
55
  书仓库根目录的 `README.md` 是说明页,不是章节:只走第 5–8 步,不套第 1–4 步的任务与结构骨架,不写「常见错误」「自测问题」,不调 `quarto_render_check`。`README.en.md` 同样处理。
56
56
 
@@ -71,7 +71,7 @@ python scripts/checking-prose.py --root <book>
71
71
  python scripts/checking-names.py --root <book>
72
72
  ```
73
73
 
74
- `checking-prose.py` 只报中文混排里能直接判断的问题;`checking-names.py` 只在全仓重构时加跑。日常章节检查跑前三条即可。
74
+ `checking-prose.py` 只报中文混排里能直接判断的问题;`checking-names.py` 只在全仓改写时加跑。日常章节检查跑前三条即可。
75
75
 
76
76
  渲染后的 Callout、HTML 产物与 DOM 结构约定由 `quarto_render_check` 调包内脚本完成,不用手跑 `checking-callouts.py`、`checking-output.py` 或 `checking-dom.py`;`designing-theme` 的 `scripts/checking-layout.py` 在渲染后的 HTML 上检查溢出、对比度和页面结构。`apply()` 不在加载时跑这些脚本,也不跑 `quarto render`。
77
77
 
@@ -1,10 +1,10 @@
1
- // `quarto_pass_report`:把一次写作或主题润色的结果压成固定行数的卡片。
1
+ // `quarto_pass_report`:把一次写作、改写、润色或主题调整的结果压成固定行数的卡片。
2
2
  //
3
3
  // 入参是闭集:模式、文件、步骤、未改项、检查状态都只能取登记过的值。
4
4
  // 卡片由工具自己拼接,返回的文本就是卡片本身,不附章节原文,也不贴改写后的句子。
5
5
  // 没改也要出卡,这样「插件没跑」和「跑了但没改」在会话里分得开。
6
6
  export const PASS_SKILLS = ['writing-quarto', 'designing-theme'];
7
- export const PASS_MODES = ['polish', 'rewrite', 'theme', 'skipped'];
7
+ export const PASS_MODES = ['write', 'rewrite', 'polish', 'theme', 'skipped'];
8
8
  export const HELD_ITEMS = ['fences', 'facts', 'css', 'prose'];
9
9
  export const CHECK_NAMES = ['content', 'html', 'layout'];
10
10
  export const CHECK_STATUSES = ['pass', 'fail', 'skip'];
@@ -25,8 +25,9 @@ export const WRITING_STEPS = {
25
25
  /** 主题步骤表的名字,与 `skills/designing-theme/references/theme-spine.md` 逐字对应。 */
26
26
  export const THEME_STEPS = ['定表面', '定字体', '定尺度', '定颜色', '定组件', '通过检查'];
27
27
  const MODE_LABELS = {
28
- polish: '增量润色',
29
- rewrite: '全章重构',
28
+ write: '写作',
29
+ rewrite: '改写',
30
+ polish: '润色',
30
31
  theme: '主题',
31
32
  skipped: '未执行',
32
33
  };
@@ -247,7 +248,7 @@ const RESULT_SCHEMA = {
247
248
  export function registerPassReportTool(tools) {
248
249
  tools.register({
249
250
  name: 'quarto_pass_report',
250
- description: '一次写作或主题润色收尾时调用一次,生成短回执卡;卡片即回执,不在回复里重复。参数是闭集:skill、mode、files(每条带 path 与 edits)、steps(各步 edits 合计等于 files 合计)、held、checks、skip_reason。没改动时传空 files、steps 与 0;不适用时 executed:false、mode:skipped,并写 skip_reason。',
251
+ description: '把一次写作、改写、润色或主题调整的改动压成一张回执卡,卡片即回执,不写文件。',
251
252
  parameters: {
252
253
  type: 'object',
253
254
  additionalProperties: false,
@@ -744,7 +744,7 @@ function refusedResult(warning) {
744
744
  export function registerRenderCheckTool(tools) {
745
745
  tools.register({
746
746
  name: 'quarto_render_check',
747
- description: '只在 Quarto Book 项目中使用:检查渲染输出目录,按需运行一次 quarto render,并检查 HTML 可用性。先传 dry_run:true;不安全时最多改一次 output-dir 再查。dry_run:false 只调用一次,成功才返回 html_report。非书项目直接拒绝,不启动渲染。',
747
+ description: '检查 Quarto Book 的渲染输出目录、最多运行一次 quarto render 并返回 HTML 可用性报告,非书项目直接拒绝。',
748
748
  parameters: {
749
749
  type: 'object',
750
750
  additionalProperties: false,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@chengzhao-dev/dsh-quarto-book",
3
- "version": "0.6.17",
4
- "description": "把一份 Quarto Book 写成可读、可查、可发布的中文技术书:九步章节写作、结构/链接/图表检查、统一主题与渲染验收。 · Write, check, and publish a Chinese Quarto Book: nine-step chapter writing, structure/link/figure checks, a consistent theme, and render acceptance.",
3
+ "version": "0.6.19",
4
+ "description": "把一份 Quarto Book 写成可读、可查、可发布的中文技术书:九步章节写作、结构/链接/图表检查、统一主题与渲染验收。",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
7
7
  "exports": {
@@ -1,26 +1,37 @@
1
1
  ---
2
2
  name: designing-theme
3
- description: 维护 Quarto Book 阅读主题:颜色、字体、字号、行距、表格与 Callout 样式、导航;不用于章节正文
3
+ description: 维护 Quarto Book 阅读主题时使用:颜色、字体、字号、行距、表格与 Callout 样式、导航;不用于章节正文。
4
4
  metadata:
5
5
  short-description: 维护 Quarto 图书主题
6
6
  ---
7
7
 
8
- # Skill: designing-theme
8
+ # designing-theme
9
9
 
10
- 维护本技能自带的 Quarto Book 主题资产,入口是 `assets/theme/`。这套主题属于本插件,不与其他仓库共享同一套文件;项目若另有权威副本,以项目 `_quarto.yml` 实际引用的路径为准。
10
+ 本技能维护插件自带的 Quarto Book 主题资产,入口是 `assets/theme/`。这套资产属于本插件,不与其他仓库共享同一套文件;项目若另有权威副本,以项目 `_quarto.yml` 实际引用的路径为准。
11
11
 
12
12
  ## 适用场景
13
13
 
14
14
  - 调整颜色、字体、间距、导航、Callout 或落地页样式。
15
15
  - 新增 palette 或页面组件样式。
16
- - **不适用**:`.qmd` 正文写法(转 `writing-quarto`);书里项目的业务领域内容(由项目自己的技能负责)。
17
- - 项目带有 `.agents/skills/quarto-book-project/SKILL.md` 时,先读它的「主题与过滤器路径」,只改 `_quarto.yml` 实际引用的书内副本;没有就跳过。书内副本默认在 `theme/`,过滤器在 `filters/`。
18
- - 编码与行尾跟 `writing-quarto` 的 `quarto/encoding.md`:UTF-8 无 BOM、样式文件用 LF;`.bat`/`.cmd` 才用 CRLF。
16
+ - 不适用:`.qmd` 正文写法(转 `writing-quarto`);书里项目的业务领域内容(由项目自己的技能负责)。
17
+
18
+ 项目有 `.agents/skills/quarto-book-project/SKILL.md` 时,先读它的「主题与过滤器路径」,只改 `_quarto.yml` 实际引用的书内副本;没有就跳过。书内副本默认在 `theme/`,过滤器在 `filters/`。
19
+
20
+ 编码与行尾跟 `writing-quarto` 的 `quarto/encoding.md`:UTF-8 无 BOM、样式文件用 LF;`.bat`/`.cmd` 才用 CRLF。
19
21
 
20
22
  ## 任务路由
21
23
 
22
24
  任何主题任务先读 `references/theme-spine.md`(步骤唯一入口)。增量任务只走被改组件所在的那一步,再加第 6 步「通过检查」;从定表面到通过检查依次走完只用于新主题或用户明确要求整体调整。
23
25
 
26
+ | 步 | 名称 | 产出 | 文件 |
27
+ | --- | --- | --- | --- |
28
+ | 1 | 定表面 | 这次动的是正文、代码、Callout 还是导航 | `references/theme-spine.md` |
29
+ | 2 | 定字体 | 字体栈与字形来源 | `references/theme-spine.md` |
30
+ | 3 | 定尺度 | 字号台阶、行长与间距 | `references/theme-spine.md` |
31
+ | 4 | 定颜色 | 语义色、明暗分层与对比度 | `references/theme-spine.md` |
32
+ | 5 | 定组件 | 表格、Callout、代码块与导航 | `references/theme-spine.md` |
33
+ | 6 | 通过检查 | 布局、对比度与整本渲染 | `references/theme-spine.md` |
34
+
24
35
  ## 加载与结束
25
36
 
26
37
  - 只改 `_quarto.yml` 实际引用的主题文件;不打开章节正文,也不打开章节以外的实现文件。
@@ -29,12 +40,13 @@ metadata:
29
40
  - `scripts/checking-layout.py` 通过并完成一次整本渲染后,在同一轮结束 goal,不把没失败的步骤留到下一轮。
30
41
  - 不探测同 profile 的其他插件,也不把它们写成依赖;子会话按自己的 cwd 重新判定门禁。
31
42
 
32
- | 任务 | 读取 |
33
- | --- | --- |
34
- | 主题的分层、令牌与组件边界 | `references/theme-system.md` |
35
- | 色板接线与暗色分层 | `assets/theme/palettes/flexoki/meta.md` |
36
- | 结构尺度令牌 | `assets/theme/css/tokens.css` 头注释 |
37
- | 字体、栏宽与阅读表面的取舍理由 | `knowledge/reading-surface.md` |
43
+ ## 文件职责
44
+
45
+ - `references/theme-spine.md`:主题步骤的唯一入口与每步的检查点。
46
+ - `references/theme-system.md`:令牌、组件边界与分层规则。
47
+ - `knowledge/reading-surface.md`:字体、栏宽与阅读表面的取舍理由。
48
+ - `assets/theme/`:palette、CSS 与可被 `_quarto.yml` 直接消费的资产。
49
+ - `scripts/`:布局测量与检查。
38
50
 
39
51
  ## P0 硬约束
40
52
 
@@ -1,68 +1,81 @@
1
1
  ---
2
2
  name: writing-quarto
3
- description: 写作、布局、排版与润色 Quarto Book 章节:任务与结构、内容块与表格、段落与句子、中英混排与术语、改 qmd 代码围栏与块后解说、检查与渲染;不用于改主题样式与只改 .cpp。
3
+ description: 写作、改写、润色或检查 Quarto Book 章节时使用;不用于改主题样式与只改 .cpp。
4
4
  metadata:
5
- short-description: 润色中文 Quarto 图书章节
5
+ short-description: 写作、改写与润色中文 Quarto 章节
6
6
  ---
7
7
 
8
- # Skill: writing-quarto
8
+ # writing-quarto
9
9
 
10
- 承载 `.qmd` 写法与 Book 结构约定。正文九步:增量任务只开对应一步,全章重构走九步,只读审查只报告不改文件。判不准才开步骤点名的 `examples/` 案例,排图与查渲染开 `quarto/`;插件开发资料不属读者正文。
10
+ 本技能负责 Quarto Book 的读者正文:`content/**/*.qmd`、`index.qmd` 与 `_quarto.yml` 的章节结构。主题样式走 `designing-theme`,C++ 源码走 `developing-cpp`,书里的业务事实由项目技能提供。
11
11
 
12
12
  ## 适用场景
13
13
 
14
- - 新建或修改 `content/**/*.qmd` 章节、`index.qmd` 或 `_quarto.yml`;内容与链接核对走本技能 `scripts/` 下的脚本,HTML 是否可用走 `quarto_render_check` 工具。
15
- - **不适用**:改主题样式、颜色或字体(转 `designing-theme`);讲解书里项目的业务领域知识(那是项目正文的职责,不是本技能)。
16
- - 项目带有 `.agents/skills/quarto-book-project/SKILL.md` 时,读完本技能再读它,并只按它指向的 `writing/` 文件读章节对照;没有就跳过,不要凭猜测补书名、章节名和术语。书内 `context/` 下的旧通用副本不再打开,写法以本技能为准。
17
- - 书仓库根目录的 `README.md` 只走第 5–8 步:它是仓库说明页,不是章节;不套第 1–4 步的任务与结构骨架,不写「常见错误」「自测问题」,不调 `quarto_render_check`。第 8 步发现问题只退回第 5、6、7 步。`README.en.md` 同样处理;`CHANGELOG.md`、`LICENSE`、`AGENTS.md` 不在写作范围。这条只在书仓库里适用(技能本身由 Book 门禁触发)。
14
+ - 新建、改写、润色或只读审查章节正文。
15
+ - 调整章题、二级标题、内容块顺序、段落、句子、用词与版式。
16
+ - 核对正文里的代码围栏与源文件是否一致。
18
17
 
19
- ## 加载与结束
18
+ 不适用:主题颜色、字体、导航与页面样式;只改 `.cpp`;书里项目的业务知识本身。
20
19
 
21
- - 一次激活只做一类文件:章节或主题。写章节时只打开项目技能或 `_quarto.yml` 点名的章节;围栏保持原样,不为逐字核对去读实现文件。
22
- - 项目提供作用域命令就先跑它,只读它列出的文件;渲染产物、构建目录与 Quarto 缓存不读。
23
- - 增量任务只开本文件、当前一步与这一步点名的一个文件;同轮不把同号案例、其余步骤和条文一起打开。
24
- - 同一文件最多退回上一步一次;第二次仍失败就停在检查输出上,不重走整段。
25
- - 项目技能列出检查命令时只跑那一条;没有就跑本技能 `scripts/` 下的内容与链接检查。退出码为 0 就在同一轮结束 goal,不把没失败的步骤留到下一轮。
26
- - 不探测同 profile 的其他插件,也不把它们写成依赖;子会话按自己的 cwd 重新判定门禁,不把技能正文塞进子代理提示。
20
+ 项目有 `.agents/skills/quarto-book-project/SKILL.md` 时,先读本技能,再读项目技能,只按它指向的章节对照与术语表读;没有就跳过,不猜书名、章节名与术语。
21
+
22
+ `README.md` 与 `README.en.md` 只走第 5–8 步:它们是说明页,不套任务与结构骨架,不写「常见错误」「自测问题」,不调 `quarto_render_check`;发现问题只退回第 5–7 步。`CHANGELOG.md`、`LICENSE`、`AGENTS.md` 不在写作范围。
27
23
 
28
- ## 整书走法
24
+ ## 三种操作
29
25
 
30
- 改多章或排目录时,先读 `references/book-journey.md`:先定全书主线与章节次序,再逐章走九步,最后做全书一致性回读。只润色一章时不读它。
26
+ 一次只选一种,`mode` 只填一个;范围(单点、整章、全书)是任务属性,不单独占一个操作。只读审查不改文件,不调渲染与回执。
31
27
 
32
- 单章与整书共用同一套九步,不另造一套章节规则;项目有章节表时以项目表为准。技能文件体量受 `references/token-budget.md` 约束,新增整书规则只写进 `book-journey.md`。
28
+ | 操作 | 什么时候选 | 从哪步进 | `mode` |
29
+ | --- | --- | --- | --- |
30
+ | 写作(起稿) | 缺任务、结构或可观察行为 | 第 1 步;新章走到第 4 步 | `write` |
31
+ | 改写 | 事实与行为不变,块段或顺序不对 | 从被打破的步重走,可到第 9 步 | `rewrite` |
32
+ | 润色 | 只改句子和用词 | 第 5–8 步;段像清单先走第 4 步 | `polish` |
33
33
 
34
- ## 三种走法
34
+ 三种操作共守:不新增事实、数字、命令、结论、引文与出处;不把「可能」「通常」「在本书里」改成确定;保留否定、条件、范围、时间与归属;围栏里的代码、命令、路径、URL 与 YAML 不改。润色只删换词;改写可删可换序,但不发明事实。只读审查按九步逐条报告行号、规则出处与改法。
35
35
 
36
- 增量任务只走对应步骤,只改不合格处。全章重构走九步:第 1–2 步定删留,第 3–4 步拆块段,第 5–7 步逐句改。只读审查不改文件,按九步逐条报告行号、规则出处与改法。
36
+ ## 加载规则
37
+
38
+ - 一次激活只做一类文件:章节或主题。写章节时只打开项目技能或 `_quarto.yml` 点名的章节;围栏注释与源文件不一致时回源改围栏,不读无关实现。
39
+ - 只开本文件、当前一步与该步点名的一个文件;第 8 步只开 `steps/08-reread.md`。同轮不把同号案例、其余步骤和条文一起打开。
40
+ - 判不准才开步骤点名的 `examples/` 案例;`references/` 是完整条文,只在排错、整书重构或步骤明确指向时打开。
41
+ - `quarto/` 只在排图、查渲染、写围栏或核对 qmd 语法时按需打开,不整目录读。
42
+ - 同一文件最多退回上一步一次;第二次仍失败就停在检查输出上,不重走整段。
43
+ - 句子与条文、项目技能或既有正文冲突时,先列冲突位置、原句与出处,由用户选一条;不自行取舍或默认采用计划。
44
+ - 不探测同 profile 的其他插件,也不把它们写成依赖;子会话按自己的 cwd 重新判定门禁,不把技能正文塞进子代理提示。
37
45
 
38
- 三种走法共守:不新增原文没有的事实、数字、命令、性能结论、引文和出处;不把「可能」「通常」「在本书里」改成确定说法;保留否定、条件、范围、时间和归属;围栏里的代码、命令、路径、URL 与 YAML 不改。增量润色只删除和换词;全章重构可删可换序,但不能发明事实。
46
+ 改多章或排目录时,先读 `references/book-journey.md`:先定全书主线与章节次序,再逐章判操作走对应步骤,最后做全书一致性回读。单章与整书共用同一套九步,不另造章节规则;项目有章节表时以项目表为准。
39
47
 
40
- ## 九步
48
+ ## 九步地图
41
49
 
42
- 九步按四个写作域分:写作 1–2,布局 3–4 与 7,润色 5–6 与 8,排版归主题技能;第 9 步是检查与渲染。跨域改动按「写作 → 布局 → 润色」的顺序推进,前一步落定再进下一步。
50
+ 操作定入口,域定层次;九步按四域分:写作 1–2,布局 3–4 与 7,润色 5–6 与 8,排版归主题。跨域按写作→布局→润色推进,前步落定再进。
43
51
 
44
- 1. 定任务:写出读者做完能完成的那件事,再列这一章要覆盖的任务。规则在 `steps/01-task.md`。
45
- 2. 定结构:排页面骨架、二级标题和篇幅预算,只定删留、标题与章题对齐。规则在 `steps/02-structure.md`。
46
- 3. 排列内容块:导语、围栏、收束与 Callout 的次序,一个围栏只放正在讲的那一块。规则在 `steps/03-blocks.md`,表格写法见 `quarto/tables.md`;围栏给声明还是给定义,按 `references/fence-semantics.md` 判。
47
- 图注写在图下、图前只写引出关系;三类图的统一写法见 `quarto/figures.md`。
48
- 4. 定段落:一段一个关键,下一句接住上一句的新信息;段间衔接落在话题切换处。规则在 `steps/04-paragraphs.md`。
49
- 5. 定句子:主语选执行者,对象先行,一句一动作。规则在 `steps/05-sentences.md`。
50
- 6. 定用词:统一术语、主动语态和语气。规则在 `steps/06-wording.md`。
51
- 7. 定版式:标点、中英混排、列表和加粗。规则在 `steps/07-layout.md`。
52
- 8. 回读并退回:按现象判断属于哪一步,先按 `references/priority.md` 判冲突,再退回那一步改。规则在 `steps/08-reread.md`。
53
- 9. 检查与渲染:先核对内容与链接,再调 `quarto_render_check` 渲染并检查 HTML。规则在 `steps/09-check.md`。
52
+ | 步 | 名称 | 产出 | 文件 |
53
+ | --- | --- | --- | --- |
54
+ | 1 | 定任务 | 读者做完能完成的一件事 | `steps/01-task.md` |
55
+ | 2 | 定结构 | 页面骨架、二级标题与篇幅 | `steps/02-structure.md` |
56
+ | 3 | 排列内容块 | 导语、围栏、收束与 Callout 的次序 | `steps/03-blocks.md` |
57
+ | 4 | 定段落 | 一段一个关键,句间接住新信息 | `steps/04-paragraphs.md` |
58
+ | 5 | 定句子 | 主语是执行者,一句一动作 | `steps/05-sentences.md` |
59
+ | 6 | 定用词 | 术语、语态与语气统一 | `steps/06-wording.md` |
60
+ | 7 | 定版式 | 标点、中英混排、列表与加粗 | `steps/07-layout.md` |
61
+ | 8 | 回读并退回 | 按现象找到该退的步 | `steps/08-reread.md` |
62
+ | 9 | 检查与渲染 | 内容与链接检查,HTML 可用 | `steps/09-check.md` |
54
63
 
55
- ## 规则卡
64
+ ## 文件职责
56
65
 
57
- 改句子、改块、改标题时,按需打开 `references/rules-cards.md` 的一张卡(C01–C30)查正例与反例,不整份读。卡是结论的紧凑副本,步骤文件仍是权威;两者冲突时以步骤为准。
66
+ - `steps/`:每步的唯一权威;同一事实不在本文件复述。
67
+ - `references/`:跨步骤的完整条文(优先级、规则卡、整书旅程、围栏语义、人物、预算)。
68
+ - `examples/`:案例;只开步骤点名的一份。
69
+ - `references/rules-cards.md`:改句子、块或标题时按需开一张卡(C01–C30),不整份读;卡是步骤的紧凑副本,冲突时以步骤为准。
70
+ - `quarto/`:qmd 语法、表格、图、mermaid、终端、编码、渲染与作者工具。
71
+ - `scripts/`:内容、链接、混排与结构检查。
58
72
 
59
73
  ## 完成判据
60
74
 
61
- - [ ] 本轮点名的文件走完它对应的步骤,改动落在正文里;不要求九步全走。
62
- - [ ] 本轮检查命令退出码为 0;通过后按「加载与结束」在同一轮结束 goal。
63
- - [ ] 内容与链接核对通过:项目技能列了检查命令时按它执行,否则跑本技能 `scripts/verifying-content.py` 与 `checking-links.py`。
75
+ - [ ] 本轮点名的文件走完它对应的步骤;不要求九步全走。
76
+ - [ ] 检查命令退出码为 0;项目有检查命令就按它跑,没有就跑本技能 `scripts/` 下的检查。
64
77
  - [ ] 新人能按正文独立完成任务:前置、动作、结果与失败出口齐全,术语首用有解释;清单见 `quarto/readability.md`。
65
78
  - [ ] 混排自查通过:`scripts/checking-prose.py --root <book>` 无高置信问题。
66
79
  - [ ] 调 `quarto_render_check`:`dry_run: true` 最多 2 次,确认 `safe_to_render`;`dry_run: false` 最多 1 次,确认 `html_report.usable` 为 true。不手跑 `quarto render`,也不截图 PNG。
67
- - [ ] 收尾调用一次 `quarto_pass_report`:`skill` 填 `writing-quarto`,`mode` 填 `polish` 或 `rewrite`,文件与步骤的改动次数、未改项、检查结论照实填。卡片就是回执,回复里不再复述;没改也传 0,当前文件不是章节时传 `executed: false`。
80
+ - [ ] 收尾调用一次 `quarto_pass_report`:`skill` 填 `writing-quarto`,`mode` 填 `write`、`rewrite` 或 `polish`,改动次数、未改项与检查结论照实填。卡片就是回执,回复里不再复述;没改也传 0,当前文件不是章节时传 `executed: false`。
68
81
  - [ ] 只读审查:不改文件,不调 `quarto_render_check`、`quarto_pass_report`,报告写清行号、规则出处与改法。
@@ -22,7 +22,7 @@
22
22
 
23
23
  ## 定结构:标题只留对象名
24
24
 
25
- 条文见 `steps/02-structure.md`「标题字数」「形式规则」。两个旧标题都在旧字数上限内,仍是一句步骤说明:指示、过程动词和关系词把真正的对象挤到末尾;目录、侧栏和页内 TOC 需要的是对象名,不是把导语缩进标题。改写在定结构:先圈出目录里要扫到的对象,删掉指示、过程和数量,再检查同级句式是否一致。
25
+ 条文见 `steps/02-structure.md`「标题分层」「形式规则」。两个旧标题都在旧字数上限内,仍是一句步骤说明:指示、过程动词和关系词把真正的对象挤到末尾;目录、侧栏和页内 TOC 需要的是对象名,不是把导语缩进标题。改写在定结构:先圈出目录里要扫到的对象,删掉指示、过程和数量,再检查同级句式是否一致。
26
26
 
27
27
  **定结构(示例章「记下流程数据」下两个三级标题):**
28
28
 
@@ -174,3 +174,22 @@ constexpr bool IsInRange(Position position) {
174
174
  ```
175
175
 
176
176
  判定信号:章引言(第一个 `##` 之前)出现两个及以上 `.qmd` 链接;除承接上一章的那一个之外,其余都在正文有对应的「首次真正用到」的句子可以迁入。`verifying-content.py` 对引言多余章节链接直接报错。
177
+
178
+ ## 声明注释摘一半
179
+
180
+ 围栏只留概述行,把 `@param`、`@return` 与空 `///` 行删掉。
181
+
182
+ ```text
183
+ 不佳(围栏只剩第一行):
184
+ /// 检查两个坐标是否相同。
185
+ [[nodiscard]] constexpr bool operator==(CellPosition lhs, CellPosition rhs) noexcept {
186
+
187
+ 改写(整段照抄):
188
+ /// 检查两个坐标是否相同。
189
+ ///
190
+ /// @param lhs 左操作数。
191
+ /// @return 相同返回 true。
192
+ [[nodiscard]] constexpr bool operator==(CellPosition lhs, CellPosition rhs) noexcept {
193
+ ```
194
+
195
+ 围栏注释是源文件的前缀。条文见 `steps/03-blocks.md`「摘录与源文件注释」。
@@ -148,19 +148,10 @@
148
148
 
149
149
  ## 接口、调用场合与实现细节的次序
150
150
 
151
- 以示例章的只读接口节为对照。表格已经列出 `Get`、`IsEmpty`、`IsFull` 的返回与边界,下一段却用「读格子、判空格、判满盘」代替函数名,紧接着又插 `Get` 的实现;读者还没看完三个接口的调用场合,就被带到单个函数的越界细节。
151
+ 以示例章的只读接口节为对照。声明围栏里给了 `Get`、`IsEmpty`、`IsFull` 三个查询,接着却把 `Get` 的实现拆到下一个 `###`;读者刚看完三个接口的返回与边界,又被带回越界细节。
152
152
 
153
153
  ```text
154
- 不佳(函数名被中文动作替代,用法和实现夹在一起):
155
- `Get`、`IsEmpty`、`IsFull` 都只读面板。读格子、判空格、判满盘是三件不同的事。
156
- `Get` 的边界判断与 `std::array::at` 相同,越界时抛 `std::out_of_range`。异常消息先写来源,再写失败条件与实际值。
157
- `Get` 和 `IsEmpty` 都先检查坐标。调用方按场合选择:
158
- - 终端逐行调用 `Get`。
159
- - 测试用 `Get` 核对空格、已有值与越界坐标。
160
- ```
161
-
162
- ```text
163
- 改写(先三个接口与调用场合,再单列 Get 的越界处理):
154
+ 不佳(声明与实现被小节拆开,标题盖住同类查询):
164
155
  `Get`、`IsEmpty`、`IsFull` 都只读面板,区别在返回什么、越界怎么处理:
165
156
  | 接口 | 返回 | 边界 |
166
157
  ...
@@ -170,11 +161,24 @@
170
161
  - `IsFull` 用来判断是否满盘。
171
162
 
172
163
  ### Get 的越界处理
173
-
174
164
  `Get` 越界时抛 `std::out_of_range`。相关异常如下:
175
165
  ```
176
166
 
177
- 判定信号:同一段先用函数名、再用「读格子/判空格」一套中文动作;表格后没有先把三个接口的用法讲完,就插进某一个函数的实现;实现句还带着「与 `std::array::at` 相同」这类比较。处理:函数名作名词,返回、边界、调用场合先成组讲完;单个函数的实现另起小节,只留读者需要知道的异常与必要代码,实现比较和通用异常组织法删掉。
167
+ ```text
168
+ 改写(Get 的声明与实现同节,另外两个查询单独成节):
169
+ `IsEmpty` 与 `IsFull` 都只读面板,区别在返回什么、边界怎么处理:
170
+ | 接口 | 返回 | 边界 |
171
+ | `IsEmpty` | 空面板格子为 `true` | 越界或已有棋子时返回 `false` |
172
+ | `IsFull` | 九个格子都有棋子时为 `true` | 不判断谁获胜 |
173
+ 调用方按场合选择:
174
+ - 判断单个格子是否为空时调用 `IsEmpty`。
175
+ - `IsFull` 用来判断是否满盘。
176
+
177
+ ### Get 的读取与越界
178
+ `Get` 合法坐标返回格子类型,越界时抛 `std::out_of_range`。声明和实现都放在这一节。
179
+ ```
180
+
181
+ 判定信号:同一段先用函数名、再用「读格子/判空格」一套中文动作;声明围栏在一个 `###`、实现却被拆到另一个 `###`;标题用「只读接口」盖住同章其他只读函数。处理:函数名作名词,返回、边界、调用场合按查询分组;一个函数的声明和实现留在同一个 `###`;`###` 点名这一节实际讲解的操作或对象,不用总称;通用异常组织法删掉。
178
182
 
179
183
  ## GetWinner 的三段删前样本
180
184
 
@@ -149,7 +149,7 @@ state.h 里 `private:` 下的 ToFlatIndex 只写函数名与参数表,函数
149
149
 
150
150
  ## 口语开场与规划套话
151
151
 
152
- 语气的完整标准见 `steps/06-wording.md`;以下两例是重构示例项目全书时的定稿对照。
152
+ 语气的完整标准见 `steps/06-wording.md`;以下两例是改写示例项目全书时的定稿对照。
153
153
 
154
154
  开场把讲义口换成书面陈述(首章):
155
155
 
@@ -70,7 +70,23 @@
70
70
  - **数据项被占用**:`PlacePiece` 返回 `false`,状态面板保持不变,调用方另选数据项就行。
71
71
  ```
72
72
 
73
- 判定信号:同一列表内最长项冒号后字数 ≥ 最短项 × 2,或引导词相差 ≥ 4;长项的第二句删掉后主线仍闭合。章级定稿对照见 `examples/08-appendix.md`「列表项长度均衡定稿」。
73
+ 以 01 规则章的落子规则列表改稿前为对照(有序步骤同样受字数带约束):
74
+
75
+ ```text
76
+ 不佳(第 3 项先写「程序检查输入」再展开三种失败,长度超过最短项两倍):
77
+ 1. 程序显示当前棋盘,提示轮到谁落子。
78
+ 2. 玩家给出两个 0 到 2 的行列号,要落的棋盘格子必须为空。
79
+ 3. 程序检查输入。行列越界、棋盘格子已被占用或格式错误时,程序说明原因并保持棋盘不变。随后要求重新输入。
80
+ 4. 输入有效时写入棋盘格子,随后判定胜负。
81
+
82
+ 改写(第 3 项收成一句,四项落在同一字数带):
83
+ 1. 程序显示当前棋盘,提示轮到谁落子。
84
+ 2. 玩家给出两个 0 到 2 的行列号,要落的棋盘格子必须为空。
85
+ 3. 越界、占用或格式错误时,程序说明原因并要求重新输入,棋盘保持不变。
86
+ 4. 输入有效时写入棋盘格子,随后判定胜负。
87
+ ```
88
+
89
+ 判定信号:同一列表内最长项可见字数 ≥ 最短项 × 2(有引导词时另看引导词相差 ≥ 4);长项的第二句删掉后主线仍闭合。章级定稿对照见 `examples/08-appendix.md`「列表项长度均衡定稿」。
74
90
 
75
91
  ## 公式与换算讲解段
76
92
 
@@ -22,9 +22,9 @@
22
22
  - 新手必须掌握的内容和引言说明放正文。引言用连贯段落交代动机、范围和全章路线。代码块前交代本步目标、执行环境和预期变化,三级标题内部次序见「三级标题最小模块」;收束段只写共同契约、结果和少量解释;块内 `//` / `#` 注释已写明的意图不在块后同义复述(对照见 `examples/03-block-after.md`「块后复述注释」)。Callout 只承载非主线且确有独立价值的风险、版本差异或可选替代;不重复正文动作或成功判据,不用于装饰层级,也不放进引言。
23
23
  - 需要失败分支时,先用 `## 常见错误` 按症状列出 `###`,再用 `## 自测问题` 承载自测题,最后以 `## 本章回顾` 收束。不设置章末集中式资料区。
24
24
 
25
- ## 重构与事实核对
25
+ ## 改写与事实核对
26
26
 
27
- 重构默认在原文基础上进行:先读取原文件、相关引用和任务边界,再局部调整结构、表达和衔接。只有用户明确要求,或原结构无法安全修复时,才删除后重新生成。目录、文件名、版本号、命令输出和工程结构等可从磁盘获得的内容,必须先实际获取。无法确认时只写检查方法,不伪造事实。
27
+ 改写默认在原文基础上进行:先读取原文件、相关引用和任务边界,再局部调整结构、表达和衔接。只有用户明确要求,或原结构无法安全修复时,才删除后重新生成。目录、文件名、版本号、命令输出和工程结构等可从磁盘获得的内容,必须先实际获取。无法确认时只写检查方法,不伪造事实。
28
28
 
29
29
  局部删除或移动内容后必须回读切口,并为后文仍引用的动作保留「触发时机 → 状态变化及原因 → 可观察结果 → 下一步」的最短闭环。后文出现悬空的「然后、因此、此时、重启、再次」等承接时必须重写切口,不能只按表面冗余删除过渡句。
30
30
 
@@ -133,6 +133,6 @@ Callout 个数见 `steps/02-structure.md`,本段不写数字;`warning` 只
133
133
 
134
134
  ### 交叉引用
135
135
 
136
- 图、表、公式或 Callout 需要按编号引用时,标签写法、前缀与书内编号规则见 `quarto/crossrefs.md`。本项目是纯 HTML 中文书,`number-sections: false`,章节标题不写 `{#sec-...}`;跨章节引用用章节标题链接,不写「第 N 章」。引用前确认目标页面存在,改标题后按「重构与事实核对」重新核对。
136
+ 图、表、公式或 Callout 需要按编号引用时,标签写法、前缀与书内编号规则见 `quarto/crossrefs.md`。本项目是纯 HTML 中文书,`number-sections: false`,章节标题不写 `{#sec-...}`;跨章节引用用章节标题链接,不写「第 N 章」。引用前确认目标页面存在,改标题后按「改写与事实核对」重新核对。
137
137
 
138
138
  需要渲染与链接依据时,读 `quarto/render.md` 与 `quarto/mermaid.md`;图注、原生 SVG 与图前句的分工读 `quarto/figures.md`。
@@ -9,6 +9,7 @@
9
9
  - `.qmd` 不设文件头声明注释,也不写函数、参数或返回值注释。章节的任务、边界和读者对象由导语与二级标题承担,注释不重复。
10
10
  - 正文里不保留被注释掉的旧段落、旧链接或旧围栏。要留历史就交给 Git,不在源文件里堆注释。
11
11
  - 代码围栏逐字摘自源文件,围栏里的注释属于源文件;正文不解释这些注释,只补注释没写到的工程关系。
12
+ - 源文件的 `@file`、`@brief` 文件头不进读者正文。
12
13
 
13
14
  ## YAML
14
15
 
@@ -1,6 +1,6 @@
1
1
  # 坐标轴网格图的生成约定
2
2
 
3
- 坐标轴类网格图(状态面板行列、二维数组下标)用共享绘图助手生成 SVG,不用 Mermaid 硬画网格。流程图与坐标图的分工、页面围栏写法、解释器与 CI 依赖都在本文件;token 预算的排除口径见 `steps/02-structure.md`「计数口径」。
3
+ 坐标轴类网格图(状态面板行列、二维数组下标)用共享绘图助手生成 SVG,不用 Mermaid 硬画网格。流程图与坐标图的分工、页面围栏写法、解释器与 CI 依赖都在本文件;token 预算的排除口径见 `steps/02-structure.md`「分层上限」。
4
4
 
5
5
  ## 与 Mermaid 的分工
6
6
 
@@ -34,13 +34,12 @@
34
34
  - 相邻两句共享主语或动作时并成一句,用逗号或分号连接;主语或动作换了才保留句号。
35
35
  - 列举三项以上用顿号;列举项本身含逗号或分句时,各项之间用分号,末项用「和」或句号。
36
36
  - 冒号前必须是总说或提示语;冒号后的内容离开前文能读成完整一句。
37
+ - 前半是一个动作、后半说明这个动作失败时怎样,用全角冒号引出说明,不用分号把说明当成并列分句。
37
38
  - 同一列表的末项标点统一:都用句号,或都不带句号。
38
39
 
39
40
  反例:`Board` 只保存九个棋盘格子。落子、满盘、成线与赢家都从这些格子得出。写入前先检查坐标。声明在工程目录的 board.h。实现放在 board.cpp。
40
41
 
41
- 改写:`Board` 从九个棋盘格子得出四类结果:坐标是否越界、棋盘是否已满、是否连成三个、赢家是谁。写入前先检查坐标;接口声明在工程目录的 board.h,实现放在 board.cpp。
42
-
43
- 判定信号:同一段连续 4 个以上句号且多数句子短于 15 字;顿号串在分句之间;声明与实现各占一句,只剩位置碎片。
42
+ 改写与判定见 `steps/04-paragraphs.md`「章节核心不漂移」;本节只留这个标点反例:句号把共享主语的相邻短句切碎后,读者读到的是位置碎片,不是机制。
44
43
 
45
44
  ## 空格
46
45
 
@@ -1,6 +1,6 @@
1
- # 全仓 QMD 重构
1
+ # 全仓 QMD 改写
2
2
 
3
- 用于同时重构根入口、part 入口和全部 `content/**/*.qmd` 的任务。它补充单章写作规则,不替代章节骨架和领域路由。
3
+ 用于同时改写根入口、part 入口和全部 `content/**/*.qmd` 的任务。它补充单章写作规则,不替代章节骨架和领域路由。
4
4
 
5
5
  ## 范围
6
6
 
@@ -20,6 +20,6 @@
20
20
 
21
21
  ## 收尾
22
22
 
23
- 全仓重构后,核对导航与路由表、标题层级、章节链接、源码摘录、命令和输出。先运行增量验证定位问题,再对所有 QMD 执行全量 `verifying-content.py`,最后在仓库根目录渲染 Book。按章推进时,每一章的出口是 `verifying-content.py --root <书根> --paths <该章>`;全部章节通过之后才 `render`。涉及知识库时同步索引、健康检查和评测;涉及代码时用实际构建、CTest 或示例验证核对文档。
23
+ 全仓改写后,核对导航与路由表、标题层级、章节链接、源码摘录、命令和输出。先运行增量验证定位问题,再对所有 QMD 执行全量 `verifying-content.py`,最后在仓库根目录渲染 Book。按章推进时,每一章的出口是 `verifying-content.py --root <书根> --paths <该章>`;全部章节通过之后才 `render`。涉及知识库时同步索引、健康检查和评测;涉及代码时用实际构建、CTest 或示例验证核对文档。
24
24
 
25
25
  ## 本项目边界
@@ -54,6 +54,8 @@
54
54
 
55
55
  终端画面、构建日志和机器协议分开展示,不把它们混成一个成功判据。终局示例先交代触发场景,再展示真实输出;代码块后的正文只解释读者需要观察的稳定部分。机器协议示例要说明消费对象、稳定字段及其与人类文本的关系,不能用“输出类似如下”代替实际验收依据。
56
56
 
57
+ 章节里的可交互演示只保留渲染后页面上能操作的 HTML,不嵌终端转录,也不解释当前构建还不会打印;终端的实测输出只写在专门讲终端的那一章。
58
+
57
59
  ## 成功判据三件套
58
60
 
59
61
  输出不稳定或篇幅过长的命令,不展示完整输出,改给可核对的判据。三条按可得性写,不必凑齐:
@@ -1,6 +1,6 @@
1
1
  # 整本书的写作次序
2
2
 
3
- 单章润色看一章;整书重构先看这本书要带读者完成什么,再决定章节次序。本文件只定整书层的判断,单章规则仍在 `steps/`。
3
+ 单章润色看一章;整书改写先看这本书要带读者完成什么,再决定章节次序。本文件只定整书层的判断,单章规则仍在 `steps/`。
4
4
 
5
5
  ## 先定一条主线
6
6
 
@@ -23,26 +23,26 @@
23
23
  - **总览章**写整体形状:交代对象在全局里的位置、彼此关系与阅读路线,可以点名后章对象,但不展开它的数据与函数。
24
24
  - **对象章**只写本章对象:数据成员、构造后的状态、公开接口与实现选择。后章才展开的类型名、个数标题、块后归属段不写;「留在某类型」「由某类得出」「不放进本章」这类归属句整句删除。
25
25
  - 对象章内的互斥结果写成无序列表,每项「情形:结果」,列表后停止;标题点名这一节的实体,不数条目(`八条线` 拆成 `线坐标表`、`成线判断`)。
26
- - 总览章与对象章的分界见项目章节表;本书 `01-rules.qmd`、`02-mapping-layout.qmd`、`viewing-program.qmd` 与两份 index 是总览,`03` 起各章是对象章。
26
+ - 总览章与对象章的分界见项目章节表;项目没有章节表时,规则、结构与导航类章用总览写法,讲具体类型或函数的章用对象写法。
27
27
  - 整书遍同时统一陈述范围:部分页使用项目名与「这一部分」,不把单个样例抬成全书;只有书首页概括全书。页首导语不复述目录与章节卡片,卡片入口只写章节标题与一句交付结果。
28
28
 
29
- ## 以井字棋书为例
29
+ ## 阶段示例
30
30
 
31
- | 阶段 | 章节 | 交给下一章的结果 |
32
- | --- | --- | --- |
33
- | 规则 | 对局规则 | 一局怎样算结束 |
34
- | 结构 | 工程结构、程序结构 | 文件与类的整体形状 |
35
- | 数据 | 棋盘、对局 | 格子、坐标、落子后的状态 |
36
- | 决策 | 电脑落子 | 电脑怎样选一格 |
37
- | 交互 | 终端程序、程序入口 | 人怎样下一局 |
38
- | 质量 | 调试、测试、构建与运行 | 改动后怎样确认没坏 |
39
- | 收束 | 局面快照 | 一局怎样保存与还原 |
31
+ | 阶段 | 交给下一章的结果 |
32
+ | --- | --- |
33
+ | 规则 | 一局怎样算结束 |
34
+ | 结构 | 文件与类的整体形状 |
35
+ | 数据 | 对象、坐标与操作后的状态 |
36
+ | 决策 | 程序怎样选择下一步 |
37
+ | 交互 | 人怎样完成一次操作 |
38
+ | 质量 | 改动后怎样确认没坏 |
39
+ | 收束 | 怎样保存与还原一次过程 |
40
40
 
41
- 这张表只是示例。项目有自己的章节表时,以 `.agents/skills/quarto-book-project/writing/chapter-map.md` 为准;没有就按上面的阶段顺序推,不猜项目事实。
41
+ 这张表只示例阶段顺序。项目有自己的章节表时,以 `.agents/skills/quarto-book-project/writing/chapter-map.md` 为准;没有就按上面的阶段顺序推,不猜项目事实。
42
42
 
43
43
  ## 插件层怎么配合
44
44
 
45
45
  - 整书规划先读本文件与项目章节表,再逐章加载 `steps/`;不要一次读完九步。
46
- - 单章判不准时才开 `examples/`;排图、查渲染或全仓重构才开 `quarto/`。
46
+ - 单章判不准时才开 `examples/`;排图、查渲染或全仓改写才开 `quarto/`。
47
47
  - 全仓检查用 `scripts/`,渲染验收用 `quarto_render_check`;两件事都放在最后一遍,不在骨架遍执行。
48
48
  - 文件体量受 `references/token-budget.md` 约束;新增整书规则只写进本文件,不复制到各步。
@@ -7,16 +7,16 @@
7
7
  | 素材 | 围栏里是什么 | 正文可以讲什么 |
8
8
  | --- | --- | --- |
9
9
  | 声明围栏 | `.h` 里的签名、成员、类定义 | 契约:参数、返回值、异常、边界、副作用、与其它接口的分工 |
10
- | 定义围栏 | `.cpp`(或头文件里的函数体)里的实现 | 机制:用了哪个函数、什么表达式、是否复制、扫描顺序、为什么这样写 |
10
+ | 定义围栏 | `.cpp`(或头文件里的函数体)里的实现 | 机制:用了哪个函数、什么表达式、是否复制、按什么次序 |
11
11
 
12
- 判据只有一句:**删掉定义文件,这句话还成立吗?** 成立是契约,不成立是实现。
12
+ 判据只有一句:**删掉定义文件,这句话还成立吗?** 成立是契约,不成立是实现。正文不要求比较没采用的写法。
13
13
 
14
14
  ## 三种合法配对
15
15
 
16
16
  | 配对 | 围栏 | 正文 | 用在 |
17
17
  | --- | --- | --- | --- |
18
18
  | 契约型 | 声明 | 契约文字 | 定义平凡:单行 `return`、一跳转发、两行赋值 |
19
- | 机制型 | 声明 + 定义 | 实现文字 | 定义非平凡,需要讲分支、算法或取舍 |
19
+ | 机制型 | 声明 + 定义 | 实现文字 | 定义非平凡,需要讲分支、算法或步骤 |
20
20
  | 纯定义型 | 定义 | 实现文字 | 定义就在头文件(`constexpr`、模板),或声明已在本章前文出现过 |
21
21
 
22
22
  补充一条**组合转发例外**:同一小节里几个一跳转发的定义可以合并成一个短围栏,正文讲它们如何组合;合并后仍遵守「正文只讲围栏里看得到的代码」。
@@ -32,9 +32,9 @@
32
32
  ## 平凡定义的判定
33
33
 
34
34
  - 平凡:单次比较、单个 `return`、两行赋值、纯委托(`return Other();`)、只做一次边界检查后返回。
35
- - 不平凡:含循环或分支组合、更新状态、与别的类型协作、需要解释「为什么不用另一种写法」。
35
+ - 不平凡:含循环或分支组合、更新状态、与别的类型协作、需要讲清做了什么、按什么次序。
36
36
 
37
- 平凡判例:`IsInRange` 的 `return row >= 0 && row < kRows && col >= 0 && col < kCols;`、`IsFull` 的 `none_of` 一行。
37
+ 平凡判例:`IsInRange` 的边界比较、`IsFull` 的 `none_of` 一行。
38
38
 
39
39
  ## 正反例(棋盘章的真实片段)
40
40
 
@@ -71,5 +71,5 @@ GameResult Game::JudgeAfterPlace(const Board& board, Player player) {
71
71
  ## 与其它规则的关系
72
72
 
73
73
  - **代码块门槛**(`steps/03-blocks.md`):平凡实现不出围栏;本文件给的是「已经决定要讲」时该怎么配围栏。
74
- - **正文与注释分工**:契约与边界写进 `///`,正文不转述;实现文字只补围栏里没有的上下文(为什么这样组合、和谁配合)。
74
+ - **正文与注释分工**:契约与边界写进 `///`,正文不转述;实现文字只补围栏里没有的上下文(怎么组合、和谁配合)。
75
75
  - **检查器**:`scripts/verifying-content.py` 按 `###` 小节扫描,只有 `.h` 围栏而正文出现实现词时报 `decl-without-def`;「常见错误」「自测问题」「本章回顾」与表格行豁免。
@@ -0,0 +1,15 @@
1
+ # 回读人格
2
+
3
+ 第 8 步回读按章型选一副眼光;规则仍由各步骤与条文负责,这里只指向。
4
+
5
+ ## C++ 文档
6
+
7
+ 本书主专业。围栏与源码一致,不把章节写成语言课,函数声明和实现留在同一个 `###`。块后写表达式做了什么,不写作者动机。细则见 `steps/02-structure.md`、`steps/06-wording.md`、`references/fence-semantics.md`。
8
+
9
+ ## 中文技术写作
10
+
11
+ 一段说完一件事。禁止「意图很直接」「这样写是为了」「不用猜」这类向读者解释作者为什么没选另一种写法的句子。已有禁令以 `steps/06-wording.md` 为准。
12
+
13
+ ## 路由
14
+
15
+ 有代码摘录、以类型或函数为主体的章用「C++ 文档」;规则、流程与导航页用「中文技术写作」。具体章型看项目章节表;没有章节表时按本章是否交付可编译对象判断。