Markdown 规范与 Lint
让 Agent 在撰写或批量修复文档时遵循统一 Markdown 风格,并与 markdownlint、Prettier 或项目 .markdownlint.json 对齐。
本页为 Agent 提供 Markdown 质量管理的完整参考:.markdownlint.json 配置文件、markdown-link-check 死链检测与 CI 集成、代码块规范(fenced + 语言标注)、文档风格指南关键规则,以及 SKILL 片段。
在 SKILL 中写明标题层级(单一 H1、逻辑递进 H2/H3)、列表前后空行、围栏代码块必须带语言标签、链接用相对路径;区分「必须修复(阻断 CI)」与「建议项(warning)」,避免 Agent 随意改风格。
markdownlint 完整配置文件
项目根目录 .markdownlint.json 配置,覆盖最常见规则;根据项目需要调整 false(关闭)或具体参数:
// .markdownlint.json
{
"default": true,
"MD001": true, // 标题层级递增(H1→H2→H3,不跳级)
"MD003": { "style": "atx" }, // 统一用 # ## ### 风格
"MD004": { "style": "dash" }, // 无序列表统一用 -
"MD007": { "indent": 2 }, // 列表缩进 2 空格
"MD010": { "code_blocks": false }, // 禁止 Tab(代码块除外)
"MD013": false, // 关闭行宽限制(由 Prettier 接管)
"MD022": true, // 标题上下各空一行
"MD024": { "siblings_only": true }, // 同级兄弟标题不重名
"MD025": true, // 全文唯一 H1
"MD031": true, // 围栏代码块前后空行
"MD032": true, // 列表前后空行
"MD033": false, // 允许 HTML(如 <details><summary>)
"MD040": true, // 围栏代码块必须有语言标签
"MD041": true, // 首行为 H1(部分模板可设为 false)
"MD051": true, // 锚点链接片段必须存在
"MD055": { "style": "consistent" } // 表格分隔线风格一致
}
死链检查:markdown-link-check 配置:
// .mlc-config.json(markdown-link-check 配置)
{
"ignorePatterns": [
{ "pattern": "^https://localhost" },
{ "pattern": "^https://internal\\.example\\.com" }
],
"replacementPatterns": [
{ "pattern": "^/", "replacement": "{{BASEURL}}/" }
],
"httpHeaders": [
{ "urls": ["https://github.com"], "headers": { "Accept-Encoding": "zstd,br,gzip,deflate" } }
],
"timeout": "20s",
"retryOn429": true,
"retryCount": 3,
"aliveStatusCodes": [200, 206]
}
// package.json scripts
// "check:links": "find docs -name '*.md' | xargs markdown-link-check --config .mlc-config.json"
CI 集成(GitHub Actions):
# .github/workflows/docs-lint.yml
name: Docs Lint
on:
pull_request:
paths: ['**/*.md', 'docs/**']
jobs:
markdownlint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20' }
- run: npm ci
- run: npx markdownlint-cli2 "**/*.md" "#node_modules"
link-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20' }
- run: npm i -g markdown-link-check
- run: find docs -name '*.md' | xargs markdown-link-check -c .mlc-config.json
- 与仓库配置对齐:优先读取
.markdownlint.json,不在 SKILL 里重复矛盾规则。 - 与 Prettier 并用时:prose wrap、list 样式由谁负责写清楚,避免两工具打架。
规则与 SKILL 映射
下表为常见 markdownlint 规则与 SKILL 中应写清的约定对应关系;具体启用与否以仓库配置为准。
| 规则 | 含义摘要 | SKILL 应交代 |
|---|---|---|
MD001 |
标题层级逐级递增,避免跳级。 | 是否允许从 H2 直接到 H4;文档模板若固定 H1 由站点生成则注明。 |
MD003 / MD004 |
标题风格、无序列表符号一致。 | 统一 - 或 *,与 Prettier 配置一致。 |
MD013 |
行宽上限(若启用)。 | 最大列数或声明由 Prettier prose wrap 接管。 |
MD022 / MD031 / MD032 |
标题与列表周围空行。 | 要求「标题上下空行」「列表前后空行」,减少渲染抖动。 |
MD040 |
围栏代码块须带语言标签。 | 默认语言(如 text)是否可接受。 |
MD041 |
首行应为一级标题。 | 若 README 由模板拼 H1,在 SKILL 写豁免策略。 |
MD051 |
链接片段存在性(部分配置)。 | 锚点命名规范、是否校验站内链接。 |
CI 集成
将 markdownlint 放进与 TypeScript/ESLint 同级的 PR 检查,Agent 才能在「绿 CI」约束下改文档。
- markdownlint-cli2:在 package.json 脚本中跑
markdownlint-cli2 "**/*.md",配置指向 .markdownlint-cli2.jsonc;适合与 npm 生态一体。 - GitHub Actions:单独 job 或在
lintjob 中串行执行;缓存node_modules以缩短时间。 - pre-commit:本地钩子跑同一命令,减少 push 后才发现的失败。
- 与 Prettier:CI 中顺序建议先 Prettier(若格式化 md)再 markdownlint,或在文档中约定「只由一方改空格/换行」。
Agent 修复流程
将「读配置 → 摘要 → 分批修复 → 校验」写进 SKILL,便于模型按顺序执行。
[ 读取 .markdownlint* / Prettier / CI 脚本名 ]
│
▼
[ 扫描:违规摘要 + 按文件分组 ]
│
┌────────┴────────┐
▼ ▼
[ 自动可修项 batch ] [ 需人审项单独列出 ]
│ │
└────────┬──────────┘
▼
[ 应用补丁 / 小步 commit ]
│
▼
[ 本地或 CI:markdownlint + 约定命令 ]
│
┌────────┴────────┐
▼ ▼
[ 通过 ] [ 失败则回滚该批 ]
│
▼
[ 对照规则 ID 再改一版 ]
标题层级检查(围栏内忽略)
粘贴草稿 Markdown:统计行数、检测 ATX 标题(# … ######)在层级上是否跳级(类似 MD001 的直观版);``` 围栏内的 # 不计入。
SKILL 片段
可直接复制为技能正文骨架,再替换为仓库真实路径与脚本。
---
name: markdown-lint
description: 按项目规则规范化 Markdown 并对接 markdownlint
---
# 规则
- 标题:唯一 H1,H2/H3 不跳级(MD001/MD025)
- 列表:统一用 - 符号,前后空行(MD004/MD032)
- 代码块:全部用围栏(```lang),禁止无语言标注的围栏(MD040)
- 链接:内部链接用相对路径;锚点 ID 用小写连字符
- 行宽:由 Prettier 接管,关闭 MD013
- 表格:列分隔线对齐,每行列数一致
# 步骤
1. 读取 .markdownlint.json / .markdownlint-cli2.jsonc(优先项目配置)
2. 运行扫描:npx markdownlint-cli2 "**/*.md" "#node_modules"
3. 输出违规摘要,按文件分组(规则 ID + 行号 + 描述)
4. 自动修复:markdownlint-cli2 --fix(仅安全可修复项)
5. 人工审查:跳级标题、缺语言标注的代码块、破损链接
6. 死链检查:find docs -name '*.md' | xargs markdown-link-check -c .mlc-config.json
7. 小步 commit,每批修复独立 commit 便于 revert