跳转至

文档目录规范

触发场景:新建 / 移动任何 .md 文件时必查。 起因:历史上根目录散落开发日志、更新规则和设计说明,破坏文档分层并增加 MkDocs 引用成本。整改后,根目录只保留平台或工具约定的标准入口文件。 目标:让"放哪儿"成为零思考。

SOP 决策树

要建/移一个 .md 文件
是 README / CHANGELOG / LICENSE / CONTRIBUTING ?
  ├─ 是 ──> repo 根(GitHub 自动识别)
  └─ 否 ──> 继续 ↓

是给 AI / 工具的入口(CLAUDE.md / .copilot/...)?
  ├─ 是 ──> repo 根(工具约定)
  └─ 否 ──> 继续 ↓

按内容类型分到 docs/:
用户操作说明(入口 / 步骤 / 状态 / 错误 / 限制)? ──> docs/product/
版本相关日志(开发日志 / 每版本细节)? ──> docs/changelog/
工程契约(PRD / API / 数据模型)? ──> docs/specs/{active,done,parked}/
知识沉淀(架构 / 字段语义 / 组件用法)? ──> docs/wiki/
bug 归档(病灶 / 修法 / 元教训)? ──> docs/issues/
操作手册(遇到 X 怎么做)? ──> docs/rules/
原始素材(用户原话 / 半成品想法)? ──> docs/raw/{inbox,feedback,conversations,ideas}/

repo 根的合法 .md(白名单 — 只允许这些)

文件 用途 谁看
README.md 项目首页 GitHub 主页访客
CHANGELOG.md 按版本聚合(机器生成) 用户 / GitHub releases / MkDocs
CLAUDE.md 给 AI 的工作入口 Claude Code 工具
LICENSE 开源许可(若有) 法务 / GitHub
CONTRIBUTING.md 贡献指南(若有) 外部贡献者

绝对不能在根:开发日志 / 更新规则 / 设计说明 / bug 笔记 / 临时想法 — 这些全部属于 docs/

docs/ 一级(每个目录的角色)

目录 内容 文件命名 示例
docs/index.md MkDocs 站点首页 固定 index.md
docs/product/ 用户可照着操作的产品使用文档 <feature>.md,当前只允许平铺 docs/product/google-maps-collection.md
docs/changelog/ 项目内部日志(每版细节) development-log.md + development-log-archive-*.md docs/changelog/development-log.md
docs/specs/ 工程契约 SPEC-XXX-<英文短标题>.md docs/specs/active/SPEC-007-...md
docs/wiki/ 知识沉淀 <英文短标题>.md(kebab-case) docs/wiki/shared-queue-architecture.md
docs/issues/ bug 归档 XXXX-<英文短标题>.md(4 位 ID) docs/issues/0070-shared-window-orphan...md
docs/rules/ 操作手册 <场景>.mdNN-<场景>.md docs/rules/00-meta-rule.md
docs/raw/ 原始素材 YYYY-MM-DD-<描述>.md(按日期) docs/raw/feedback/2026-05-28-xxx.md
docs/_topics/ 自动主题 hub(rebuild 生成) 各 tag.md docs/_topics/scheduling.md
docs/_todo.md 自动待办聚合 固定 (rebuild 生成)
docs/_overview.md 自动概览 固定 (rebuild 生成)

product/ 当前结构限制

  • docs/product/ 当前只允许 INDEX.md 与平铺的 *.md 产品页,不建立二级目录。
  • 原因:现有 rebuild-docs.py 为 product INDEX 生成 basename 链接;嵌套目录会生成错误链接或文件名冲突。
  • 需要二级目录时,先升级相对路径生成、重复 basename 检查和 docs:check 覆盖,再调整本规则;不能先建目录后补工具。
  • 产品页只写已实现、可验证的用户行为;未来方案仍放 docs/specs/

specs/ 子目录

子目录 状态
docs/specs/active/ 进行中(status: approved / in-progress)
docs/specs/done/ 已落地(status: done)
docs/specs/parked/ 暂缓(status: parked + parked_reason)

命名约定(文件名)

必遵守(v0.10.110 起统一英文文件名)

  • ❌ 不用中文(v0.10.110 起 129 文件追溯英文化)
  • ❌ 不用 + / ( / )(MkDocs URL 编码后丑陋,v0.10.105 清理过 19 个)
  • ❌ 不用空格 / 大写(kebab-case)
  • 文件名:英文 + 数字 + - + _(kebab-case,URL 安全)
  • 文章标题(frontmatter title:):中文 OK(实际显示用)
  • ✅ ISSUE 用 4 位数字 ID 开头:0070-shared-window-orphan.md
  • ✅ SPEC 用 SPEC- 前缀:SPEC-007-feature-name.md
  • ✅ raw/ 用日期前缀:2026-05-28-feature-name.md

推荐

  • 文件名用"主题 + 子主题"短句:SPEC-006-task-delete-data-cascade-confirm.md
  • 不超过 60 字符(含 .md)
  • - 分词(最终 URL 安全)
  • 中文标题放 frontmatter title: 字段(rebuild-docs.py 用此渲染 INDEX)

frontmatter(每个 md 必含)

---
title: <中文短标题>
description: <30 字内描述,便于检索>
tags: [类型, 主题1, 主题2]
created: YYYY-MM-DD
updated: YYYY-MM-DD
type: product | raw | spec | wiki | issue | rule | index
status: <类型特定>
related:
  - "[[wikilink-1]]"
---

docs:check 会校验必填字段 — 缺会阻止 commit。

移动 / 重命名时的同步

重要:移动 .md 后必须全局更新所有引用:

# 1. git mv 移文件
git mv 老路径.md 新路径.md

# 2. 全局更新引用(脚本 + 手工)
grep -rln "老路径\|老文件名" docs/ scripts/ *.md mkdocs.yml
# → 每个引用文件改成新路径

# 3. 必跑:校验 frontmatter、INDEX 收录和 wikilink
pnpm docs:check

# 4. 先只读检查自动生成结果是否漂移(在系统临时目录重建并比较)
pnpm docs:rebuild:check

# 5. 仅在确认不会覆盖他人未提交生成结果时,才在当前工作区重建
pnpm docs:rebuild
pnpm docs:changelog

# 脏工作树或共享工作区禁止直接用写入型重建命令覆盖未知改动。

反例(v0.10.108 之前的现状)

文件 在哪 问题
~~development-log.md~~ 应在 docs/changelog/,由 MkDocs 直接读取
~~开发日志-archive-*.md~~ 同上,由 MkDocs 直接读取
~~更新规则.md~~ 是 rule 类型,应在 docs/rules/version-release-iron-rules.md
~~v2-UI改版说明.md~~ 是 SPEC,应在 docs/specs/done/SPEC-000-v2-ui-redesign.md

历史整改已将业务文档移入 docs/;根目录只保留 README、CHANGELOG、AI / 工具入口及可选的 LICENSE / CONTRIBUTING。

工具支持

命令 作用
pnpm verify 先检查现有依赖,再串行执行类型、文档、治理测试和静态扫描;不自动 install、不运行 postinstall、不 build、不生成 changelog、不写当前工作区
pnpm docs:check 检查 frontmatter、INDEX 收录和 wikilink;不检查普通 Markdown 链接,不重建文件
--diff 扫描基线 六个 baseline 文件缺失、不可读、JSON 损坏或 schema 非法时退出 2;合法 hits: [] 继续按空基线执行,不自动重建
scan:issue-coverage --strict 执行 audit_grep 契约:expect: absent(默认,命中即违规)、expect: present(至少命中一次)、paths(限定扫描范围)、allow_paths(仅 present,允许路径外命中也违规);扫描 scope 内全部 UTF-8 普通文本文件(含 .sh、CSS/HTML 与无扩展 hook),明确跳过含 NUL 或非法 UTF-8 的二进制;pattern / description / paths / allow_paths 必须加引号,expect 只允许加引号或精确、区分大小写的 plain absent / present;顶层只接受无缩进 plain audit_grep:audit_grep: [],quoted key、冒号前空格、根级缩进、重复 key 均拒绝;tag、inline comment、block scalar、无法识别的对象行、重复字段等未支持 YAML 形态 fail closed;空字段、symlink、未知字段、非法路径/正则、不可枚举后代目录或 grep 异常退出 2;默认 scope 的全部后代普通文本均扫描,不按 docs / dist 等后代目录名额外排除;grep 仅做文件预选排序且绝不缩小最终集合,原始 Python 正则会精确扫描全部已枚举文本,因此兼容 \\A / \\Z[\\s\\S]、JS [^]、lazy quantifier、大于 255 的上限和负向前瞻
pnpm docs:rebuild:check 在系统临时目录运行真实重建器并逐文件比较;不写当前工作区
pnpm docs:rebuild 重建 INDEX / _overview / _todo / _topics;会写文件,脏工作树慎用
pnpm docs:changelog 重生成 CHANGELOG.md;会写文件
Docs-Impact 产品影响提交的文档同步声明,见 Docs-Impact 规则

相关