Files
msd-core/docs/zh-CN/references/ui-brand.md
Tom Boucher cf15682d1c enhance(#3028): responsive Markdown separators instead of fixed-width rules (#3789)
* feat(#3028): responsive Markdown separators instead of fixed-width rules

Stage banners, checkpoints, completion and error panels used fixed-width
runs of box-drawing characters -- a 53-column heavy rule and a 62-column
double-line box. Those runs are ordinary text to a Markdown-rendering
host, so in a narrower pane they wrap and the border comes apart from
the heading it framed.

Shipped content now emits an ATX heading for a titled section and a
blank-line-delimited --- for a break between sections, both of which
adapt to the available width. The same convention is applied to the
three code sites that built these strings at runtime: the UAT
checkpoint renderer, the milestone-close audit report, and the TDD
review checkpoint table.

Removing the box also removes its only reason to exist -- the
east-asian-width padding helpers that kept its right border aligned
(checkpointBoxLine, displayWidth, isWideCodePoint, ZERO_WIDTH_MARK_RE,
CHECKPOINT_BOX_WIDTH). RTL directional isolation is unchanged.

The convention is specified in gsd-core/references/ui-brand.md and
enforced across all shipped content by tests/responsive-separators.test.cjs.

Refs #3028

* test(#3028): pin the heading form in checkpoint and audit-report assertions

These suites asserted the exact box borders and the 62-column padded
banner interior. With the box gone they assert the ### heading form,
the --- break and the bolded instruction line, and each now carries a
positive assertion that no box character remains -- which is what pins
the fix rather than merely tolerating it.

Language coverage is converted, not dropped: Japanese, Chinese, Korean,
Hindi and Arabic all still assert their rendered banner, and the Arabic
case still asserts the RTL directional isolates the box removal must
not disturb. Adds a case for a banner longer than the old inner width,
which previously produced a ragged border and now has none.

Refs #3028

* chore(#3028): acknowledge execute-plan.md growth from the checkpoint display spec

The checkpoint_protocol display spec described the drawn box; it now
describes the heading, the --- break and the bolded action prompt,
which costs 22 bytes (40111 -> 40133, 827 under the cap).

Appended to the existing #3370 fragment rather than filed as a new one:
a growth ack keys on the bare filename and #3370 already declares
execute-plan.md, so a second source naming it would be a hard
duplicate-key error. Same supersede-by-append route #3370 took for the
spent #2652 fragment.

Refs #3028

* docs(#3028): state the load-bearing half of the separator rule, and amend the zh-CN reference

Review found three things.

The rule as first written demanded a blank line above AND below every
---. Only the one above is load-bearing: it is what stops CommonMark
reading the rule as a setext underline for the line above. The one below
is cosmetic, because a thematic break is a leaf block. The rule now says
that, with the reason, instead of asserting a stricter form the content
does not keep.

The zh-CN reference had received the mechanical box-to-heading swap but
none of the prose behind it: it still claimed a 62-character checkpoint
width and still listed --- among forbidden mixed banner styles, so it
contradicted the convention it was translating. It now carries the
separator section, the setext reasoning, the unconditional-vs-per-runtime
rationale and a corrected anti-pattern list, in Chinese.

The user guide asserted that a heading is not a degradation anywhere.
That is an assertion, not a demonstration. It now says what was actually
traded away in a plain terminal, points at the recorded rationale, and
invites the report that would justify the capability flag instead.

Refs #3028

* chore(#3028): backfill changeset PR number

Refs #3028

---------

Co-authored-by: sim <sim@local>
2026-08-23 22:38:12 -04:00

4.7 KiB
Raw Blame History

UI 品牌规范

面向用户的 GSD 输出的视觉模式。编排器通过 @ 引用此文件。

分隔符与横幅

绝不要输出固定宽度的制表符(box-drawing)长串。 由 ━、─、═ 组成的长串,对渲染 输出的宿主而言只是普通文本。当窗格比该长串更窄时,它会折行,多余的字符落到第二行,于是边框 与它本应框住的标题就散开了。Markdown 会自适应可用宽度,53 个字符的横线不会。

只有三种形式,没有其他:

需求 输出
带标题的区块 —— 阶段、检查点、完成、错误 ### {标题}(ATX 标题)
两个区块之间的分隔 单独一行的 ---,其上方必须有一个空行
带边框的信息面板 ### {标题},随后各行以普通文本列出

--- 上方的空行是关键,不是排版讲究。 紧跟在一行文本下方的 --- 会被解析为该行的 setext 标题下划线,而不是分隔线 —— 那条横线会把上面那行"吞掉"。空行才使它成为分隔线。 (--- 下方的空行是可选的:分隔线是叶子块,后面的内容无论如何都会另起一块。)

阶段横幅只用标题,不要在其上方加 ---。 ATX 标题本身就是分隔,而且不会像裸的 --- 那样被误解析。

为什么是统一形式,而非按运行时区分

曾考虑过引入 rendersMarkdown 能力键:终端类运行时保留线条图形,Markdown 宿主使用 Markdown。该方案被否决 —— 它需要在每个运行时描述符及解析器中新增一个键,并且会留下两套必须 永远保持同步的输出约定,正是本仓库已记录的"分叉"缺陷类别。在纯终端里,标题与分隔线所承载的 结构与原来的横线对并无二致,却不必锁定宽度,因此第二套约定并无收益。若将来确实出现需要线条 图形的运行时,届时再依据该证据添加此键。


阶段横幅

用于主要工作流过渡。

### GSD ► {阶段名称}

阶段名称(大写):

  • QUESTIONING(提问)
  • RESEARCHING(研究)
  • DEFINING REQUIREMENTS(定义需求)
  • CREATING ROADMAP(创建路线图)
  • PLANNING PHASE {N}(规划阶段 {N})
  • EXECUTING WAVE {N}(执行波次 {N})
  • VERIFYING(验证)
  • PHASE {N} COMPLETE ✓(阶段 {N} 完成)
  • MILESTONE COMPLETE 🎉(里程碑完成)

检查点面板

需要用户操作。

### CHECKPOINT: {类型}

{内容}

---

**→ {操作提示}**

类型:

  • CHECKPOINT: 需要验证 → → 输入 "approved" 或描述问题
  • CHECKPOINT: 需要决策 → → 选择: option-a / option-b
  • CHECKPOINT: 需要操作 → → 完成后输入 "done"

状态符号

✓  完成 / 通过 / 已验证
✗  失败 / 缺失 / 阻塞
◆  进行中
○  待处理
⚡ 自动批准
⚠  警告
🎉 里程碑完成(仅在横幅中)

进度显示

阶段/里程碑级别:

进度: ████████░░ 80%

任务级别:

任务: 2/4 完成

计划级别:

计划: 3/5 完成

生成指示器

◆ 正在生成研究员...

◆ 并行生成 4 个研究员...
  → 技术栈研究
  → 功能研究
  → 架构研究
  → 陷阱研究

✓ 研究员完成: STACK.md 已写入

下一步区块

始终在主要完成后。

---

## ▶ 下一步

**{标识符}: {名称}** — {单行描述}

`{可复制粘贴的命令}`

<sub>`/clear` 优先 → 全新上下文窗口</sub>

---

**也可选:**
- (根据工作流选填可选命令,例如 `/gsd-progress --next`)

---

错误面板

### ERROR

{错误描述}

**修复方法:** {解决步骤}

表格

| 阶段 | 状态 | 计划 | 进度 |
|------|------|------|------|
| 1    | ✓    | 3/3  | 100% |
| 2    | ◆    | 1/4  | 25%  |
| 3    | ○    | 0/2  | 0%   |

反模式

  • 用 ━、─、═ 的固定宽度长串作分隔符 —— 在窄窗格中会折行
  • 用双线制表符(U+2554、U+2557、U+255A、U+255D、U+2551、U+2560、U+2563)画的边框面板 —— 边框会独立于内容折行。此处以码位命名而非直接展示,因为守卫检查会拒绝这些字符出现在任何 随包分发的内容中。
  • 紧跟在一行文本下方、中间没有空行的 --- —— 那是 setext 标题下划线而非分隔线,会把上面 那行吞掉
  • 把标题夹在两条横线之间 —— 标题本身就是分隔
  • 混合横幅样式(===、***)
  • 横幅中缺少 GSD ► 前缀
  • 随机 emoji(🚀、✨、💫)
  • 完成后缺少下一步区块

由 tests/responsive-separators.test.cjs 强制执行。