Files
planet/.claude/commands/docs.md
2026-04-30 09:41:08 +08:00

9.2 KiB
Raw Permalink Blame History

description, argument-hint, allowed-tools
description argument-hint allowed-tools
分析本次 git 变更,在 docs/technical/zh/ 中新建或更新对应的技术文档 可选:指定要记录的主题,或留空自动从 git diff 推断
Read
Edit
Write
Bash
Glob
Grep

/docs — 技术文档写入工作流

目标

根据当前 git 变更(或用户指定主题)在 docs/technical/zh/ 中写入或更新技术文档,记录为什么这样做,而不只是记录做了什么。

执行步骤

Step 1 — 理解变更范围

git diff HEAD --stat          # 变更文件一览
git diff HEAD --name-only     # 变更文件列表
git log --oneline -10         # 近期 commit 上下文

$ARGUMENTS 指定了主题,优先聚焦该主题;否则从文件列表和 diff stat 推断变更主题。不要默认读取完整仓库 diff只对决定文档主题所需的文件读取 focused diff

git diff HEAD -- <path>
rg -n "class |def |function |export |router|@router|interface |type " <path>

Step 2 — 确认文档范围

分析变更,判断:

  1. 应写几篇文档:单一主题写一篇,跨领域变更可拆分(如后端性能优化 + 运维启动脚本分开写)
  2. 是新建还是更新:检查 docs/technical/zh/ 中是否已有相关文档
  3. 文档命名:按 领域-主题-副题.md 格式,全小写,用连字符,如:
    • backend-datasources-api-performance.md
    • ops-planet-sh-startup.md
    • earth-bgp-context.md
ls docs/technical/zh/          # 查看现有文档

先输出写作计划供用户确认(若变更明确且范围小,可直接执行):

文档计划:
  新建docs/technical/zh/ops-planet-sh-startup.md — planet.sh 启动性能优化
  更新docs/technical/zh/backend-datasources-api-performance.md — 补充并行化细节

Step 2.5 — 覆盖范围检查

写文档前必须按变更类型检查配套文档,不要只更新一篇专题文档:

  • 用户可见流程变化:更新 docs/technical/zh/manual.md,通常也更新 docs/technical/zh/quickstart.md
  • manual.mdquickstart.md 这类用户手册存在英文版时,同步更新 docs/technical/en/...,至少避免英文版与中文版互相矛盾。
  • 控制台页面职责、路由入口、表格/抽屉/设置页行为变化:更新 docs/technical/zh/frontend-admin-frontend-context.md
  • Earth 前端行为、HUD、巡航、图层、图例、交互变化更新 docs/technical/zh/earth-frontend-context.md
  • 新增 Earth 图层、调整 renderOrder、半径/高度偏移、深度策略、拾取策略、legend mode、图层面板顺序或启动加载顺序更新 docs/technical/zh/earth-render-layer-order.md
  • Earth 图层视觉样式、颜色、图例符号语义变化:若影响样式索引,同步更新 docs/technical/zh/earth-layer-style-reference.md
  • 采集器、数据源、凭证、设置页、连接检查、scheduler、后端 API 变化:更新相关后端文档,优先检查 docs/technical/zh/backend-collectors.md 和 datasource/settings 专题文档。
  • 如果某个旧 plan 的假设已经被当前实现推翻,在对应 docs/plans/*.md 增加现状修正或更新该段,不要让计划文档继续给出相反方向。
  • 新增 technical 文档后,如果需要被发现,更新 docs/technical/zh/README.md
  • 如果 technical 文档需要在公开 Docs 页面显示,或从 technical README 链接进入,必须同步更新 frontend/src/pages/Docs/docs-content.tsDOCS_METADATA。前端使用这份白名单,docs/technical/{zh,en}/ 中存在 .md 文件并不会自动生成路由。
  • 公开 technical 文档必须按同名文件维护中英文双语版本:docs/technical/zh/<name>.mddocs/technical/en/<name>.md。如果某篇文档刻意只保留单语,完成说明中必须明确写出原因。
  • 对本次变更提取旧词做 stale search例如旧 tab 名、旧路由职责、旧认证假设、改名前 UI 文案:
rg -n "旧文案|旧路由职责|旧认证假设" docs/technical docs/plans

Step 3 — 写文档

遵循以下原则:

记录 WHY不只记录 WHAT

  • 好:将戳文件从 /tmp 移到 ~/.cache/planet/,因为 WSL 重启后 /tmp 被清空
  • 差:修改了 AI_PROVIDER_BUILD_STAMP_FILE 的值

必须包含的内容

  • 背景/问题:改动之前存在什么问题,为什么要改
  • 核心设计决策及其理由
  • 关键代码片段(用 diff 或 before/after 展示)
  • 相关文件列表

格式要求

  • 使用 ##### 分级,不要超过三级
  • 代码块注明语言python / bash / typescript / sql
  • 表格用于对比多个选项或列出参数
  • 中文写作,技术术语保留英文原文
  • docs/technical/zh/ 中的文档不得用英文原文占位;如果存在 docs/technical/en/ 对应文件,禁止逐字复制成中文文件
  • 中文文档内部链接应指向 docs/technical/zh/...,除非明确引用英文专属文档
  • 公开文档的 Markdown 链接显示文字应使用可读标题,不要直接暴露 manual.mdearth-frontend-context.md 这类裸文件名

文档结构模板

# 标题(说明做了什么)

## 背景

为什么要做这个改动,改动前存在什么问题。

## 核心变更

### 子主题一

before/after 或决策说明 + 关键代码

### 子主题二

...

## 相关文件

- `path/to/file.py` — 简短说明

Step 4 — 验证

  • 读一遍写好的文档,确认逻辑清晰、代码片段无明显错误
  • rg --filestest -e 确认文档中的文件路径在项目中真实存在,避免凭记忆判断:
  • 检查中文文档没有误复制英文版:
python - <<'PY'
from pathlib import Path
same = []
for en in sorted(Path("docs/technical/en").glob("*.md")):
    zh = Path("docs/technical/zh") / en.name
    if zh.exists() and en.read_text() == zh.read_text():
        same.append(en.name)
if same:
    raise SystemExit("identical en/zh docs: " + ", ".join(same))
print("no identical en/zh docs")
PY
  • 检查中文文档内部链接没有继续指向无语言目录:
rg -n "/home/ray/dev/linkong/planet/docs/technical/(?!zh|en)" docs/technical/zh --pcre2
  • 检查公开文档链接已进入 Docs 前端白名单。凡是 docs/technical/{zh,en}/README.md 中链接到的 technical .md,都必须存在于 DOCS_METADATA
python - <<'PY'
import re
from pathlib import Path

metadata = Path("frontend/src/pages/Docs/docs-content.ts").read_text()
known = set(re.findall(r"'([^']+\.md)':\s*\{", metadata))
known.add("README.md")

missing = []
for readme in [Path("docs/technical/zh/README.md"), Path("docs/technical/en/README.md")]:
    if not readme.exists():
        continue
    for href in re.findall(r"\]\(([^)]+\.md)\)", readme.read_text()):
        path = Path(href)
        if "docs/technical/" not in href:
            continue
        filename = path.name
        if filename not in known:
            missing.append(f"{readme}: {filename}")

if missing:
    raise SystemExit("docs README links missing DOCS_METADATA: " + ", ".join(missing))
print("docs README links are whitelisted")
PY
  • 检查公开文档双语同名文件齐备。除 README.md 外,所有白名单文档都应同时存在 zh/en 文件,除非本次说明中明确豁免:
python - <<'PY'
import re
from pathlib import Path

metadata = Path("frontend/src/pages/Docs/docs-content.ts").read_text()
filenames = sorted(set(re.findall(r"'([^']+\.md)':\s*\{", metadata)) - {"README.md"})
missing = []
for filename in filenames:
    for lang in ("zh", "en"):
        path = Path("docs/technical") / lang / filename
        if not path.exists():
            missing.append(str(path))
if missing:
    raise SystemExit("missing bilingual docs: " + ", ".join(missing))
print("public docs have zh/en file pairs")
PY
  • 检查公开文档里没有用裸 .md 文件名当链接标题。这个命令在 polished public docs 中应无输出:
rg -n "\[[^]]+\.md\]\(" docs/technical/zh docs/technical/en
# 对文档中提到的关键路径做快速验证
ls <mentioned_paths>

如需检查大量链接,优先用确定性提取:

rg -n "\]\(([^)]+)\)" docs/technical/zh/<doc>.md

Step 5 — 完成确认

输出摘要:

✓ 新建docs/technical/zh/ops-planet-sh-startup.md约 xxx 字)
✓ 更新docs/technical/zh/backend-datasources-api-performance.md

注意事项

  • 不要写流水账式的"改了 A、改了 B、改了 C",要写改动背后的约束和权衡
  • 不要在文档中引用 PR 号、issue 号、或当前对话——这些会随时间失效
  • 代码片段保持简洁,只保留说明问题的关键部分,省略无关样板代码
  • 如果某个变更已有文档记录,优先在原文档中追加,而不是新建
  • 公开 technical 文档没有注册 DOCS_METADATADocs 页面不会显示;不要只创建 .md 文件就结束。
  • 公开 technical 文档默认需要 zh/en 同名文件,不要只补一个语言版本。
  • 链接可见文字使用文档标题或语义标题,不要使用裸文件名。
  • 文档是给未来的开发者看的,假设读者熟悉项目但不了解这次改动的背景