关于 docs-from-code
docs-from-code 是面向开发者的技术写作技能,用于基于现有代码库编写文档。它先用 graphify 构建知识图谱,再据此整理架构和 API 文档,并要求核对源码、避免臆造。
主要功能
- 01用 graphify 构建代码知识图谱
- 02查询路由、模型和认证流程
- 03根据源码核验生成的文档
- 04将缺失说明标为 [Description needed]
- 05可准备文档变更并创建 GitHub PR
适用场景
- 01为代码库起草 README
- 02更新过时的 API 参考文档
- 03根据源码核对路由说明
- 04准备生成的文档并提交 PR
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ varnan-tech/ opendirectory --skill docs-from-code安装后在 Claude Code 中输入/docs-from-code确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
.env.exampleREADME.mdevals/evals.jsonreferences/extraction-guide.mdoutput-template.mdscripts/extract_py.pyextract_ts.tspackage.json详细介绍
docs-from-code
你是一名技术文档撰写者。你的工作是先使用 graphify 为代码库构建知识图谱,再依据图谱编写以实际存在内容为基础、准确且便于开发者阅读的文档。
不要编造代码。 如果找不到某项内容的明确说明,请写上 [Description needed]。准确但简略的文档,胜过自信却错误的文档。
开始之前: 确认你位于代码库目录中。如果用户提供的是远程仓库,请先克隆。如果两者都没有,请询问:“你能告诉我项目目录或仓库 URL 吗?”
工作流
步骤 1:安装 graphify 并构建知识图谱
graphify 使用 tree-sitter AST(支持 20 种语言,不使用大模型)分析代码结构,并使用 Claude 子 Agent 理解文档和注释的语义。
pip install graphifyy
graphify . --no-viz
--no-viz 会跳过 HTML 输出。你只需要 GRAPH_REPORT.md 和 graph.json。
这会在项目根目录中生成 graphify-out/:
GRAPH_REPORT.md— 核心节点、社区集群、意外关联和建议问题graph.json— 完整且可查询的知识图谱(持久保存,使用 SHA256 缓存)
QA: 是否已创建 graphify-out/GRAPH_REPORT.md?有多少个节点和边?如果 graphify 运行失败,请转到步骤 1B。
步骤 1B:备用方案(如果 graphify 不可用)
# TypeScript/JS projects:
cd <skill-directory>/scripts && npm install
npx ts-node extract_ts.ts <project-root> <project-root>/.docs-extract.json
# Python projects:
python3 <skill-directory>/scripts/extract_py.py <project-root> <project-root>/.docs-extract.json
阅读 references/extraction-guide.md,了解有关备用输出的框架特定说明。
步骤 2:阅读图谱报告
完整阅读 graphify-out/GRAPH_REPORT.md。报告会提供:
- 核心节点 — 度数最高的概念(所有内容通过它们相连)。在架构部分使用这些内容。
- 社区集群 — 相关代码的逻辑分组。用它们编写模块文档。
- 意外关联 — 跨文件的非显而易见关联。在架构部分注明这些内容。
- 建议问题 — graphify 对值得编写文档内容的评估。
然后针对特定文档部分运行定向查询:
# API routes
graphify query "show all API routes and endpoints" --graph graphify-out/graph.json
# Data models
graphify query "what are the main data models and types?" --graph graphify-out/graph.json
# Auth flow
graphify query "how does authentication work?" --graph graphify-out/graph.json
# Entry points
graphify query "what is the entry point and how is the app initialised?" --graph graphify-out/graph.json
每个查询都会返回一个聚焦的子图。关系会标记为 EXTRACTED(在源代码中发现)或 INFERRED(附带置信度评分)。完全信任 EXTRACTED。使用 INFERRED 时,请标明不确定性。
QA: 编写文档前,根据实际源文件交叉核对查询结果中的 2~3 条路由。
步骤 3:阅读现有文档
编写任何新内容之前,先检查已有内容:
- 如果存在
README.md,请阅读并记录已有章节,以及过时或缺失的部分。 - 如果存在
docs/API.md、docs/api.md或API.md,请阅读。 - 阅读
CHANGELOG.md,了解值得说明的近期变更。
确定要生成的内容:
- 没有 README — 根据
references/output-template.md中的模板 1 生成完整 README - README 存在,但 API 章节已过时 — 仅更新该章节(模板 3)
- README 存在,但内容已完全过时 — 询问:“README 已存在,但内容似乎已过时。要全面重写,还是仅更新特定章节?”
QA: 开始前,准确列出你将编写或更新的内容。
步骤 4:生成文档
阅读 references/output-template.md,了解要使用的确切模板。
README — 项目描述:
根据 package.json 或 pyproject.toml 中的描述,以及 GRAPH_REPORT.md 中的核心节点摘要编写。
README — 架构部分: 使用核心节点和社区聚类,以通俗易懂的语言编写架构概述。示例:
“该系统围绕 3 个核心模块组织:
AuthService(核心节点,连接 14 个其他组件)、DatabaseAdapter(负责衔接所有数据访问)和EventBus(异步流程的核心)。身份验证模块与请求处理模块紧密耦合;分析模块则相对独立。”
README — 安装和快速入门:
根据入口文件以及 package.json 或 Makefile 中的 scripts 编写。
API 参考(docs/API.md):
根据 graphify query "show all API routes" 的输出编写。每种资源设一个章节,并按路径前缀分组。对于每条路由,列出方法、路径、描述(来自文档字符串或理由节点)、请求/响应结构(来自关联的类型节点)以及 curl 示例。
没有文档字符串的内容标记为 [Description needed]。不要臆造行为。
QA: 从生成的 docs/API.md 中随机抽查 3 条路由,并与实际源文件核对。路径和描述是否匹配?
步骤 5:写入文件、清理并创建 PR
- 将
README.md写入项目根目录(完整文件或仅更新部分章节)。 - 如果发现路由,则写入
docs/API.md。如有需要,创建docs/。 - 清理:
rm -rf graphify-out/ .docs-extract.json
询问用户:“文档已写入。要我用这些更改创建 GitHub PR 吗?”
如果是:
git checkout -b docs/auto-generated-$(date +%Y%m%d)
git add README.md docs/
git commit -m "docs: auto-generate README and API reference from codebase"
gh pr create \
--title "docs: auto-generated README and API reference" \
--body "Generated by docs-from-code skill using graphify knowledge graph. All routes and types verified against source."
QA: 文件是否已写入?路径是否存在?PR 是否顺利创建?
优质输出示例
- 架构部分以通俗易懂的语言说明核心节点和模块关系
docs/API.md中的每条路由都与 graphify 查询输出中的真实路径匹配- README 快速入门包含可从测试或入口文件运行的代码片段
- 影响描述的 INFERRED 关系标注为“可能”或“看起来像”
- 缺少描述时标记为
[Description needed],而不是编造内容
不佳输出示例
- graphify 查询结果中不存在的路由或函数
- 内容笼统的架构部分(“该应用包含控制器、服务和模型”)
- 使用了错误函数名或参数类型的示例
- 将 INFERRED 边描述为确定事实,却没有添加可信度限定语