Imported from dunwu/skillbox (
skills/markdown-doc-guide/SKILL.md). Install upstream withnpx skills add dunwu/skillbox --skill markdown-doc-guide. Copyright stays with the author.
中文技术文档格式化规范
规范内容主要来自:阮一峰的项目 document-style-guide。
本 Skill 约束 AI 在编辑 Markdown 文档时的质量,确保所有输出符合统一的文档标准。
触发场景
当用户出现以下任一意图时,必须激活本 Skill:
- "格式化这篇 markdown" / "美化文档" / "按规范整理" / "按文档规范格式化"
- "编辑 .md 文件"
- 英文触发词:format markdown / beautify document / polish doc / edit .md
- 任何涉及修改 Markdown 文档内容的请求
核心原则
- 段落边界神圣不可侵犯:禁止把由空行分隔的独立段落合并成一段连续文本。
- 只做排版、不改语义:不增删原文含义,不替换同义词,不调整句子结构。
- 链接路径原样保留:
[文本](路径)中()内的路径字符串必须原样保留。 - 代码块内部只读:可以修正代码块的语言标注,但禁止改动代码块内的任何字符。
- 结构只读:不增删章节标题、不删除注释、不改列表与段落的互相转换、不改 HTML/VuePress 特殊语法块的属性和结构。
执行工作流
Step 0:🔴 CHECKPOINT · 前置检查与失败处理
读取目标文件前,必须完成以下前置检查。任一检查失败时,按对应分支处理:
| 检查项 | 通过条件 | 失败分支(if → then → fallback) |
|---|---|---|
| 文件可读性 | 文件成功读取,内容非空 | if 读取失败或内容为空 → then 向用户报告"文件无法读取或内容为空"并请求确认路径 → fallback 终止本次格式化 |
| 文件编码 | 文件为 UTF-8 编码(无乱码) | if 检测到非 UTF-8 编码导致乱码 → then 向用户报告编码问题并请求确认 → fallback 仅处理无乱码部分,乱码段保持原样 |
| Frontmatter 格式 | --- 开闭标记完整且 YAML 可解析 |
if Frontmatter 开闭标记不完整或 YAML 解析报错 → then 将整个 Frontmatter 视为普通文本,不做任何修改 → fallback 向用户报告 Frontmatter 异常 |
| 文件规模 | 文件 ≤ 500 行 | if 文件超过 500 行 → then 按逻辑章节分块处理,每块完成后执行 Step 3 校验 → fallback 向用户报告文件规模并建议分块处理 |
🛑 未通过本 CHECKPOINT,不得进入 Step 1。前置检查失败时必须向用户报告,不得静默跳过或猜测修复。
Step 1:读取并分区
输入:通过 Step 0 检查的文件原始内容。
读取目标文件后,先标记出以下区域,不同区域适用不同规则:
| 区域 | 标记方式 | 适用规则 |
|---|---|---|
| Frontmatter | --- ... --- |
保持原样,不做任何修改 |
| 段落 | 由空行分隔的文本块 | 格式化的主要对象:空格、标点、术语 |
| 代码块 | ``` 包裹的块 |
只检查/修正语言标注,不动内部内容 |
| 行内代码 | ` 包裹的片段 |
保持原样,不添加空格 |
| 链接 / 图片 | [文本](路径) /  |
路径原样保留;文本部分按段落规则处理 |
| 表格 | ` | ... |
| HTML / 特殊语法块 | ::: tabs、<!-- -->、VuePress 组件等 |
保持结构和属性原样,只处理块内纯文本 |
| 注释 | <!-- ... --> |
保持原样,不做任何修改 |
输出:分区标记完成后的文件结构图,供后续步骤按区域差异化处理。
Step 2:🔴 CHECKPOINT · 高风险扫描 + 按优先级应用规范
🔴 进入规则应用前,先扫描目标文件是否存在以下高风险元素。若存在,按对应策略处理后再继续。
| 高风险情况 | 处理策略 |
|---|---|
| 包含 Mermaid / PlantUML / HTML 块 | 保持块结构原样,仅处理块内节点/纯文本的中英文空格和术语 |
| 包含复杂表格(≥ 5 列或 ≥ 10 行) | 逐行处理单元格文本,处理前后逐行比对表结构是否被破坏 |
| 包含大量行内代码或链接 | 批量校验路径和代码内容是否被改动,每 10 处做一次抽样比对 |
| 包含嵌套代码块(代码块内引用代码块) | 外层代码块内容保持原样,不尝试解析内层 |
未通过本 CHECKPOINT 扫描,不得进入规则应用。
通过扫描后,同一处文本同时命中多条规则时,按以下优先级执行:
- 段落保护:soft line break 只能在段落内部归一化为空格,不能跨段落合并。
- 标点符号:中文语句用全角标点;纯英文整句用半角标点;点号不出现在行首和标题末尾。
- 字间距:
- 全角中文与半角英文/数字之间加半角空格。
- 英文与全角标点之间不加空格。
- 行内代码、链接路径、命令参数中的空格保持原样。
- 术语统一:将混用或不规范的术语改为规范形式(详见下文「术语统一表」)。
- 代码块语言标注:
- 命令行工具 / JVM 参数 / shell 脚本 →
shell - 纯输出 / 日志 / thread dump →
text - Java 代码 →
java - 已有正确标注的,不重复修改。
- 命令行工具 / JVM 参数 / shell 脚本 →
- 文件末尾:确保文件以单个换行符(
\n)结尾。
Step 3:🔴 CHECKPOINT · 三不校验 + 结构校验(if-then fallback)
修改完成后,必须逐项确认。若校验失败,按以下三段式处理:
🛑 本 CHECKPOINT 为硬性门禁:所有校验项全部通过前,禁止进入 Step 4。
| 校验项 | 触发条件(if) | 一线修复(then) | 仍失败兜底(fallback) |
|---|---|---|---|
| 不合并段落 | 发现空行消失,多个段落连成一段 | 按原文空行位置重新拆分段落 | 回退整个文件到修改前状态 |
| 不改链接路径 | [文本](路径) 中的路径字符串与原文不一致 |
恢复该链接路径为原文 | 删除该处修改,保留原文链接 |
| 不动代码块内容 | 代码块内部字符(空格、大小写、标点)与原文不一致 | 恢复该代码块内容,仅保留语言标注修改 | 回退整个代码块到原文,包括语言标注 |
| 不增删章节标题 | 标题(# 开头的行)数量或层级与原文不一致 |
恢复被删除的标题,删除新增的标题 | 回退整个文件到修改前状态 |
| 不改注释内容 | <!-- ... --> 内容与原文不一致 |
恢复注释为原文 | 回退整个文件到修改前状态 |
| 不改列表结构 | 列表项数量或层级(-/*/1.)与原文不一致 |
恢复列表结构为原文 | 回退整个文件到修改前状态 |
| 不改 HTML/VuePress 属性 | HTML 标签属性或 ::: 守卫属性与原文不一致 |
恢复属性为原文 | 回退整个文件到修改前状态 |
| 文件结构完整性(防拼接) | 文件中出现 ≥ 2 组 frontmatter、≥ 2 个 H1 标题、或旧内容被追加到新内容尾部 | 截断文件,仅保留新写入的完整内容,删除拼接的旧内容 | 回退整个文件到修改前状态,改用 SearchReplace 逐段替换而非 Write 全量覆盖 |
所有兜底操作执行后,必须重新从 Step 1 开始检查,确保修复没有引入新的违规。
Step 4:输出变更摘要
向用户汇报时包含:
- 修改的文件数量
- 主要变更类型(如:修复空格、统一术语、修正代码块语言标注)
- 明确说明"已保留段落边界、链接路径、代码块内容、章节标题、注释、列表结构和 HTML 属性"
Step 5:🔴 STOP · 歧义处理
遇到以下情况,必须 🛑 STOP 并询问用户,不得自主决定:
- 用户原文明显违反规范但可能是故意为之(如标题末尾的句号、艺术化排版)。
- 同一处存在多种规范解释且无法按"冲突裁决表"判定。
- 用户要求"只改某一部分"但范围不清晰。
- 无法判定某段文本属于"中文语句"还是"纯英文整句"(参见下文「语句类型判定规则」)。
红灯清单(禁止做)
以下行为绝对禁止:
| 红灯行为 | 正确做法 |
|---|---|
| 把空行分隔的独立段落合并成一段 | soft line break 只归一化到段内空格 |
修改 [文本](路径) 或  中的路径字符串 |
路径原样保留,连全半角都不改 |
| 在代码块内部增删空格、改大小写、换标点 | 代码块内容保持原样 |
把命令行选项如 -gc、-XX:+UseG1GC 强行大写 |
命令/参数保持原样,说明文字才大写 |
| 删除文件末尾的单个换行 | 文件必须以 \n 结尾 |
无差别替换所有小写 java/jvm 为大写 |
仅对普通说明文字中的专有名词做大写处理 |
| 把英文书名/电影名的双引号改为书名号(原文是英文时) | 仅当英文改用中文表达时才改 |
| 修改 frontmatter 的字段名或值 | frontmatter 保持原样 |
新增或删除章节标题(# 开头的行) |
标题数量和层级必须与原文一致 |
删除或修改 HTML 注释(<!-- -->) |
注释内容原样保留 |
| 将列表改为段落或将段落改为列表 | 列表/段落结构保持原样 |
修改 HTML 标签属性或 VuePress ::: 守卫属性 |
属性原样保留,仅处理块内纯文本 |
| 修改表格的列数或行数 | 表格结构保持原样,仅处理单元格内文本 |
语句类型判定规则
标点符号规则依赖"中文语句"和"纯英文整句"的判定。按下表执行:
| 文本特征 | 语句类型 | 标点规则 | 示例 |
|---|---|---|---|
| 全部为英文字符(含英文标点) | 纯英文整句 | 使用半角标点 | This is a Spring Boot application. |
| 包含 ≥ 1 个中文字符 | 中文语句 | 使用全角标点 | 这是一个 Spring Boot 应用。 |
| 中英混合但以中文为主句框架 | 中文语句 | 使用全角标点 | 该模块基于 Spring Boot 构建,支持 RESTful API。 |
| 英文短语嵌入中文语境 | 中文语句 | 英文短语内部保留半角标点,外层用全角标点 | 请使用 curl 命令发送 HTTP 请求。 |
| 独立英文整句(前后无中文) | 纯英文整句 | 使用半角标点 | See API Reference for details. |
判定模糊时,触发 Step 5 🛑 STOP 歧义处理,不得自行推断。
术语统一适用范围界定
术语统一仅适用于普通说明文字。按下表界定适用与不适用范围:
| 适用(做术语替换) | 不适用(保持原样) |
|---|---|
| 独立段落中的说明文字 | 代码块内部(包括语言标注后的全部内容) |
| 表格单元格中的说明文字 | 行内代码 ` 包裹的内容 |
| 列表项中的说明文字 | 链接路径 () 内的字符串 |
引用块 > 中的说明文字 |
命令参数(如 -XX:+UseG1GC、jstat -gc) |
| Mermaid/PlantUML 节点文本中的说明文字 | Frontmatter 字段值 |
| HTML/VuePress 块内纯文本 | HTML 标签属性值、::: 守卫属性值 |
判定模糊时(如表格单元格同时包含行内代码和说明文字),仅对说明文字部分做术语替换,行内代码部分保持原样。
冲突裁决表
当规则冲突时,按以下优先级执行:
| 冲突场景 | 优先规则 | 说明 |
|---|---|---|
| 中英文空格规则 vs. 链接路径保护 | 链接路径保护优先 | 路径字符串内部不加空格 |
| 专有名词大写 vs. 代码块内容 | 代码块内容保持原样 | 命令/参数/输出中的大小写不动 |
| 全角标点 vs. 纯英文整句 | 纯英文整句用半角标点 | 例如整句英文引用保留 . 而非 。 |
| 规范建议 vs. 用户原始段落结构 | 用户原始结构优先 | 不主动拆分或合并段落 |
| 术语统一 vs. 代码块 / 行内代码 | 代码块 / 行内代码保持原样 | 仅普通文本做术语替换 |
| 长句拆分建议 vs. 原文语义 | 原文语义优先 | 不替用户改写句子结构 |
| 术语统一 vs. HTML 属性值 | HTML 属性值保持原样 | 属性内的专有名词不做大写处理 |
术语统一表
以下术语在普通说明文字中必须统一为右侧规范形式(代码块、行内代码、命令参数、链接路径除外):
| 不规范/混用 | 规范形式 |
|---|---|
| 年轻代 | 新生代 |
| 年老代、old 代 | 老年代 |
| minor gc | Minor GC |
| mixed gc | Mixed GC |
| full gc | Full GC |
| Hotspot | HotSpot |
| Intellij Idea | IntelliJ IDEA |
| Jvm、jvm | JVM |
| java(指 Java 语言/平台时) | Java |
| jni | JNI |
| linux | Linux |
| tomcat | Tomcat |
| jetty | Jetty |
| servlet | Servlet |
如需扩展术语表,参考 references/terminology.md。
自检清单
修改完成后,必须逐项确认:
- 没有合并由空行分隔的独立段落。
- 没有修改任何
[文本](路径)或中的路径。 - 没有改动任何代码块或行内代码的内部字符。
- 没有新增或删除任何章节标题。
- 没有删除或修改任何 HTML 注释。
- 没有将列表改为段落或将段落改为列表。
- 没有修改 HTML 标签属性或 VuePress 守卫属性。
- 没有修改表格的列数或行数。
- 中文语句使用全角标点,纯英文整句使用半角标点。
- 中英文/数字之间已按规则添加或保持半角空格。
- 常见术语已按「术语统一表」统一(仅普通说明文字)。
- 代码块语言标注正确(shell / text / java 等)。
- 文件以单个换行符结尾。
- 已输出变更摘要。
- 文件结构完整性:仅 1 组 frontmatter(2 个
---)、仅 1 个#H1 标题、无旧内容拼接。 - Write 全量覆盖后已读回验证,确认旧内容未被追加到新内容尾部。
详细规约参考:
- 标题:references/title.md
- 文本:references/text.md
- 段落:references/paragraph.md
- 数值:references/number.md
- 标点符号:references/marks.md
- 文档体系:references/structure.md
- 术语表:references/terminology.md
文档模板
当用户需要从零创建某类中文技术文档时,优先使用对应模板。模板本身已符合本 Skill 的格式规范,生成后只需按实际内容填空,无需再整体格式化。
| 模板 | 路径 | 适用场景 | 核心章节 |
|---|---|---|---|
| 项目说明文档 | references/templates/project-template.md | README / 模块总览 | 概述、架构设计、技术选型、核心功能、快速开始、部署运维、开发规范 |
| API 文档 | references/templates/api-template.md | RESTful / gRPC / GraphQL 接口 | 概述、接口列表、接口详情、数据模型、变更记录 |
| 设计文档 | references/templates/design-doc-template.md | HLD / LLD / 技术方案 | 背景与目标、方案概述、详细设计、数据设计、非功能设计、风险与待决事项 |
| 架构决策记录 | references/templates/adr-template.md | ADR / 技术选型 | 状态、上下文、决策、备选方案、后果、关联决策 |
| 面试题文档 | references/templates/interview-template.md | 面试备战手册、知识点梳理 | 难度分级、重要度标记、精炼答案、精辟总结、知识覆盖度评估 |
| 技术笔记 | references/templates/tech-note-template.md | 学习笔记、知识沉淀、专题分析 | 引言概述、核心概念、原理剖析、实战案例、最佳实践、踩坑记录 |
| README 导航索引 | references/templates/readme-nav-template.md | 模块/目录 README、文档站点导航 | 章节描述(引用块)、关键词标签、文章列表、多级 README 同步规范 |
使用方式:
- 根据目标文档类型选择对应模板。
- 保留章节结构,删除示例占位内容,替换为实际内容。
- 按本 Skill 规范检查空格、标点、术语和代码块语言标注。
- 完成后执行「自检清单」。