From workflow-skills
Sets up markdownlint-cli2 with pre-commit hooks and .markdownlint.json config for Markdown linting in repos, fixes errors like MD013/MD040/MD060, removes horizontal rules preserving YAML frontmatter.
npx claudepluginhub niracler/skill --plugin workflow-skillsThis skill uses the workspace's default tool permissions.
为仓库配置 markdown 格式检查(markdownlint + 水平线禁止)和 pre-commit hook。
Guides markdown linting with markdownlint-cli2: run checks, fix MD0XX errors, configure .markdownlint-cli2.jsonc rules/ignores, set up VS Code extension and GitHub Actions. Supports GFM/CommonMark for validation and workflows.
Configures markdownlint rules and options via JSON files, inline comments, and inheritance for consistent Markdown linting in Node.js projects.
Mandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
为仓库配置 markdown 格式检查(markdownlint + 水平线禁止)和 pre-commit hook。
| Tool | Type | Required | Install |
|---|---|---|---|
| Node.js | cli | Yes | brew install node or nodejs.org |
| markdownlint-cli2 | cli | Yes | npx markdownlint-cli2 (no install needed) |
| pre-commit | cli | No | uv tool install pre-commit --with pre-commit-uv or pipx install pre-commit or brew install pre-commit |
Do NOT proactively verify these tools on skill load. If a command fails due to a missing tool, directly guide the user through installation and configuration step by step.
不适用:
npx markdownlint-cli2 file.md,不需要走 setup 流程# 已有配置?跳到「检查/修复」
ls .markdownlint.json .pre-commit-config.yaml 2>/dev/null
.markdownlint.json:
{
"default": true,
"MD013": false,
"MD024": { "siblings_only": true },
"MD033": false,
"MD035": false,
"MD036": false,
"MD041": false,
"MD060": false
}
关闭规则说明:
| 规则 | 理由 |
|---|---|
| MD013 | CJK 文本和表格不适合行长度限制 |
| MD033 | 允许 <br>, <small> 等 inline HTML |
| MD035 | 水平线完全禁止,由独立脚本检查 |
| MD036 | 允许 bold 作视觉标题 |
| MD041 | YAML frontmatter 导致首行非标题 |
| MD060 | 表格管道符间距样式过于严格 |
按需追加禁用(根据仓库内容酌情添加):
| 规则 | 场景 | 理由 |
|---|---|---|
| MD025 | 仓库含导入/vendor 文档 | 协议文档常有多个 H1 |
| MD045 | 仓库含导入/vendor 文档 | vendor 文档图片无 alt text |
| MD051 | CJK 锚点链接 | #_中文标题 格式的片段不被识别 |
| MD056 | 复杂参考表格 | 合并行/变长列的表格触发误报 |
.pre-commit-config.yaml:
repos:
- repo: https://github.com/DavidAnson/markdownlint-cli2
rev: v0.21.0 # 运行 pre-commit autoupdate 获取最新
hooks:
- id: markdownlint-cli2
- repo: local
hooks:
- id: no-horizontal-rules
name: no horizontal rules outside frontmatter
entry: scripts/check-horizontal-rules.sh
language: script
types: [markdown]
创建后必须运行
pre-commit autoupdate,上面的 rev 可能已过时。
scripts/check-horizontal-rules.sh:
从 scripts/check-horizontal-rules.sh 复制,然后 chmod +x。
Windows 用户:
.sh脚本需要在 Git Bash 或 WSL 中运行。
.gitignore(如果没有):
node_modules/
.mypy_cache/
__pycache__/
--- 分隔线保留 YAML frontmatter 的 ---,删除其余所有水平线:
# 找出违规文件
bash scripts/check-horizontal-rules.sh $(find . -name '*.md' -not -path './node_modules/*')
# 提取违规文件列表(仅匹配 .md: 格式的行,避免捕获错误消息)
files=$(bash scripts/check-horizontal-rules.sh \
$(find . -name '*.md' -not -path './node_modules/*') 2>&1 \
| grep -E '\.md:[0-9]+:' | grep -oE '^[^:]+' | sort -u)
# 批量移除(保留 frontmatter)
for file in $files; do
awk 'NR == 1 && /^---[[:space:]]*$/ { print; fm = 1; next } fm && /^---[[:space:]]*$/ { print; fm = 0; next } !fm && /^[[:space:]]*[-*_][[:space:]]*[-*_][[:space:]]*[-*_][-*_ ]*$/ { next } { print }' "$file" > "$file.tmp" && mv "$file.tmp" "$file"
echo "Fixed: $file"
done
注意:grep 必须用
\.md:[0-9]+:过滤,否则脚本末尾的 "Error: ..." 错误消息会被当成文件名。
# 单仓库
npx markdownlint-cli2 --fix "**/*.md"
npx markdownlint-cli2 "**/*.md"
# monorepo(排除子仓库和依赖目录)
npx markdownlint-cli2 --fix "**/*.md" "#repos" "#node_modules"
npx markdownlint-cli2 "**/*.md" "#repos" "#node_modules"
--fix 无法修复的常见错误:
``` 加上语言标识(python、bash、yaml、text 等).markdownlint.json 中禁用对应规则先分析错误分布再决定策略:
# 按规则统计
npx markdownlint-cli2 "**/*.md" "#repos" "#node_modules" 2>&1 \
| grep -oE 'MD[0-9]+' | sort | uniq -c | sort -rn
# 按文件统计
npx markdownlint-cli2 "**/*.md" "#repos" "#node_modules" 2>&1 \
| grep -oE '^[^:]+' | sort | uniq -c | sort -rn | head -10
pre-commit install
# 两项检查全部通过(monorepo 加 "#repos" 排除子仓库)
npx markdownlint-cli2 "**/*.md" "#repos" "#node_modules"
bash scripts/check-horizontal-rules.sh $(find . -name '*.md' -not -path './repos/*' -not -path './node_modules/*')
# 测试 hook: 故意加 --- 到某 md 文件,git add + commit,应被拦截
npx markdownlint-cli2 "**/*.md" "#repos" "#node_modules" # 检查
npx markdownlint-cli2 --fix "**/*.md" "#repos" "#node_modules" # 自动修复
bash scripts/check-horizontal-rules.sh $(find . -name '*.md' -not -path './repos/*' -not -path './node_modules/*')
单仓库项目去掉
"#repos"即可。
| 问题 | 原因 | 修复 |
|---|---|---|
pre-commit: command not found | 未安装 | uv tool install pre-commit --with pre-commit-uv(推荐)或 pipx install pre-commit / brew install pre-commit |
| markdownlint 大量 MD060 错误 | 表格管道符间距 | .markdownlint.json 中 "MD060": false |
| 大量 MD056 错误 | vendor 文档复杂表格 | .markdownlint.json 中 "MD056": false |
| 大量 MD051 错误 | CJK 锚点链接 | .markdownlint.json 中 "MD051": false |
.sh 脚本在 Windows 无法执行 | Windows 不原生支持 Bash | 使用 Git Bash 或 WSL |
frontmatter --- 被误删 | awk 脚本问题 | 确认文件第 1 行是 --- 且紧接 YAML 内容 |
批量删除 HR 产生垃圾 .tmp 文件 | grep 捕获了脚本错误消息作为文件名 | 用 grep -E '\.md:[0-9]+:' 过滤,仅匹配文件路径行 |
--fix 未修复所有问题 | 部分规则无法自动修复 | 手动修复(通常是 MD040 缺少代码块语言,加 ```text 等) |