EN summary: file path = doc ID = published URL, no
id:/sidebar_position:frontmatter, no number-prefixed filenames,title:is the only page-title source (no body# H1), images live in a sibling<doc-name>.assets/folder, and everydocs/**/*.mdneeds a mirror in each locale docs tree unless an explicit single-source fallback is configured. Runpnpm run checkbefore opening a PR — it enforces all of this. For locale-aware code conventions see agents/i18n.md.
本文档记录本仓库的文档结构约定,帮助人类贡献者和 AI Agent 在不读遍全部历史讨论的情况下,正确地新增/修改文档。
改动 src/ 下的 React 代码或 docusaurus.config.js 之前,另见 agents/i18n.md——那里记录了多语言相关的代码约定(不要写死语言名、原生 <a> 要补 baseUrl、文案一律走 <Translate> 等),每条都对应一个真实踩过的坑。
| 关注点 | 唯一来源 |
|---|---|
| URL / doc ID | 文件路径本身(不使用 id:、不使用数字前缀) |
页面标题 / 侧边栏文字 / <title> |
frontmatter title:(可选 sidebar_label: 用于侧边栏简称) |
| 侧边栏排序 | sidebars.js,三个 sidebar(use/dev/change)均为显式列表 |
| 图片 | <文档名>.assets/ 同级目录 |
| 内部链接 | 指向 .md 文件的相对路径(构建时会校验) |
| URL 不变契约 | 提交的 scripts/url-inventory.txt,每次 PR 由 CI 校验 |
为什么这样做:过去 id:/sidebar_position:/数字前缀/README.md 四种机制同时存在,导致侧边栏文字和页面标题可能不一致(例如"VSCode 扩展开发脚本" vs 页面实际标题"使用 VSCode 开发脚本"),且文件名与 URL 无法直接对应。现在文件路径就是 URL,看文件名就知道页面在哪。
- 在
docs/<section>/下创建xxx.md(不要加数字前缀,不要用README.md——除非确实是该目录的落地页,此时用index.md)。 - frontmatter 只写
title:(必需)和可选的sidebar_label:;不要写id:或sidebar_position:。 - 正文不要再写一个
# 标题作为 H1——title:会自动渲染为页面标题。 - 在
sidebars.js对应的数组里加一行"section/xxx"(除非这是一个故意不出现在侧边栏的隐藏页面,如use/install_comple)。 - 在
i18n/<locale>/docusaurus-plugin-content-docs/current/<section>/xxx.md为各非默认 locale 创建镜像,路径和文件名必须完全一致;scripts/check-config.json中声明的单一来源 fallback 路径除外。 - 图片放在
docs/<section>/xxx.assets/下,用./xxx.assets/foo.png引用;纯 UI 截图等语言无关的图片,英文版可以用@site/docs/<section>/xxx.assets/foo.png直接复用中文版的图片,不必重复存一份二进制文件。俄语版沿用英文截图,统一写@site/i18n/en/docusaurus-plugin-content-docs/current/<section>/xxx.assets/foo.png——i18n/ru/下不放任何图片二进制,避免同一张图在仓库里存三份。 - 跑一次
pnpm run build && pnpm run check,确认全部检查通过。
change/ 下的版本文件(v1.x.md)不使用数字前缀排序;在 sidebars.js 的 change 数组里手动插入新版本号(数组顺序即侧边栏顺序,新版本插在最前面)。change/beta-changelog.md 是 Beta 版本的单独更新日志。更新中文源文时仍需同步英文版本;俄语路由由 Docusaurus 直接回退到英文文档树,不要在 i18n/ru/.../change/ 中恢复一份会漂移的副本。
以下 URL 被扩展程序硬编码调用,任何重构都不能改变它们:
/docs/script_installation//docs/use/install_comple/(install_comple是历史拼写,故意保留,不是笔误)/uninstall/
scripts/check-url-inventory.mjs 会在每次 pnpm run build 后对比 scripts/url-inventory.txt;如果你的改动导致路由变化,CI 会失败并列出具体差异。新增路由是允许的(比如加一个 redirect),但需要在同一个 PR 里用 node scripts/check-url-inventory.mjs --write 更新这个文件,让 review 能看到你有意添加了什么。
| 中文 | English | Русский |
|---|---|---|
| 脚本猫 | ScriptCat | ScriptCat |
| 用户脚本 | user script | пользовательский скрипт |
| 后台脚本 | background script | фоновый скрипт |
| 定时脚本 | scheduled script | скрипт по расписанию |
| 定时任务 | scheduled task | задача по расписанию |
| 油猴 | Tampermonkey | Tampermonkey |
英文标题结构应尽量与中文一一对应(标题层级、顺序一致),这样跨语言的锚点链接更容易对齐;注意 Docusaurus 生成的锚点是基于渲染后的英文标题文本,不是中文锚点的直接翻译(例如 ## Scheduled Script (\@crontab`)生成的锚点是#scheduled-script-crontab`,需要用构建产物核实,不要凭感觉猜。
pnpm run build # 构建 zh-Hans/en/ru,onBrokenLinks/onBrokenAnchors 设置为 throw
pnpm run check # 依次跑 URL / fallback 产物 / i18n 覆盖率 / frontmatter 检查
pnpm run check:urls # 单独跑 URL 不变契约检查
pnpm run check:fallbacks # 单独检查 production build 中的 locale 单一来源 fallback
pnpm run check:i18n # 单独跑所有 locale 的文档配对及 fallback 例外检查
pnpm run check:frontmatter # 单独跑 title/id/sidebar_position/H1 规范检查