code-read-deep-file
从用户明确给出的单个源文件出发,只读不改地通读整个文件,产出文件级结构化中文阅读报告(定位 / 职责概述 / 构成清单 Outline / 对外接口 / 内部结构与协作 / 依赖与消费方 / 关键数据与状态 / 重点方法选读 / 明显问题),并生成两张 Mermaid 图——① 文件内结构图、② 文件级依赖关系图。采用『地图优先 + 选择性深读』:先铺开全文件全景(列全所有类/函数及其职责),再只
SKILL.md.claude/skills/code-read-deep-file/SKILL.md
GitHub深度代码阅读 · 文件级 (code-read-deep-file)
从用户明确给出的单个源文件出发,只读不改地把这个文件读透: 识别语言 → 列全文件里有什么(Outline 地图)→ 看内部怎么协作 → 反查它依赖谁、被谁用 → 挑 1~3 个关键成员选择性深读 → 顺手记录明显的逻辑/流程硬伤,最后产出一份结构化、规范化的中文阅读报告,内含两张 Mermaid 图。
报告遵循固定的 9 段结构:定位 → 职责概述 → 构成清单 → 对外接口 → 内部结构与协作 → 依赖与消费方 → 关键数据与状态 → 重点方法选读 → 问题。
与方法级
code-read-deep-function是兄弟 skill,形成 文件 → 方法 的缩放层级: 本 skill 给"全景地图 + 结构/依赖图 + 选择性深读",谁要深挖某个方法的完整调用链/数据流,改用code-read-deep-function。
核心定位
- 文件驱动:分析对象永远是"一个源文件",不是一个方法、一个模块、一个项目。
- 地图优先,不逐方法深挖:先铺开全文件全景,再选择性下钻 1~3 个关键成员;其余只在 Outline 里一句话带过。
- 只读不改:全程不编辑任何业务代码,只产出报告(符合仓库与全局规则)。
- 阅读导向,不是质量审查:问题部分只报"读代码时顺手可见的逻辑/流程硬伤",不做安全/性能/规范的全维度审查(那是
code-review-deep-zh)。 - 多语言:先识别语言,再按该语言习惯解析构件与依赖。注意 Python/JS/TS/Go 一个文件常含多个类与多个顶层函数。
硬性前置:必须是「单个文件」
这是本 skill 能否启动的闸门,先判定,再做其他任何事。
只接受单个源文件。 输入形态:相对/绝对路径(src/order/OrderService.java)或文件名(OrderService.java)。
以下输入不走本 skill:
- 给了单个方法入口
类名.方法名(如OrderService.createOrder),或想深挖某方法的调用链/数据流。- 标准回应:
你给的是单个方法入口,深挖某个方法的调用链/数据流请用
code-read-deep-function(读类名.方法名)。 如果你想读懂的是整个文件,请告诉我文件名/路径,例如OrderService.java。
- 标准回应:
- 要读整个模块 / 整个目录 / 整个项目 / 全代码库。
- 标准回应:
本 skill 只针对单个文件通读。请告诉我具体要读哪个文件(路径或文件名),例如
OrderService.java。 (整模块 / 整目录 / 整项目的通读不在本 skill 范围内。)
- 标准回应:
文件名多处命中时,列出候选路径让用户选,不擅自挑(详见
references/file-mapping-rules.md)。
何时使用 / 何时不用
使用本 skill:
- 用户给出了单个文件(路径/文件名),想读懂/梳理这整个文件。
- 用户想要这个文件的结构图或依赖关系图。
- 用户想知道文件里有哪些类/函数及其职责(要一张 Outline 地图)。
- 用户想知道这个文件依赖谁(上游)、被谁用(下游消费方)。
不要用本 skill(改走对应能力):
- 给的是单个方法入口
类名.方法名、要深挖某方法 →code-read-deep-function。 - 要读整个模块/目录/项目 → 不适用,先要求收敛到单个文件。
- 代码质量审查、安全审计、性能审查、合并前审查 →
code-review-deep-zh。 - 只是给代码加注释 →
code-annotating。 - 只要一句话解释一小段代码、不需要图和清单 →
/explain命令。 - 调试排查具体 bug → systematic-debugging。
- 编写新功能/新代码 → code-vibe-workflow。
工作流程
按顺序执行,不要跳阶段。详细规则按需加载对应 references/ 文件。
必要时加载
references/reading-lenses.md——测试即规格 / git 历史 / 运行期证据 / 框架感知 四个补充阅读视角;用了哪个就在报告相应段落注明证据来源。
digraph code_read_deep_file {
"收到请求" [shape=ellipse];
"是单个文件?" [shape=diamond];
"方法入口?改道方法级skill / 整模块?要求收敛" [shape=box];
"阶段1 语言识别+文件定位" [shape=box];
"文件名唯一命中?" [shape=diamond];
"列候选路径请用户选" [shape=box];
"阶段2 Outline提取(构成清单)" [shape=box];
"阶段3 内部结构与协作(结构图)" [shape=box];
"阶段4 依赖+消费方反查(依赖图)" [shape=box];
"阶段5 选择性深读(1~3个,深挖委派)" [shape=box];
"阶段6 问题识别(仅逻辑/流程硬伤)" [shape=box];
"阶段7 确认输出位置+生成报告+自检" [shape=box];
"收到请求" -> "是单个文件?";
"是单个文件?" -> "方法入口?改道方法级skill / 整模块?要求收敛" [label="否"];
"是单个文件?" -> "阶段1 语言识别+文件定位" [label="是"];
"阶段1 语言识别+文件定位" -> "文件名唯一命中?";
"文件名唯一命中?" -> "列候选路径请用户选" [label="多命中"];
"列候选路径请用户选" -> "阶段2 Outline提取(构成清单)";
"文件名唯一命中?" -> "阶段2 Outline提取(构成清单)" [label="唯一"];
"阶段2 Outline提取(构成清单)" -> "阶段3 内部结构与协作(结构图)";
"阶段3 内部结构与协作(结构图)" -> "阶段4 依赖+消费方反查(依赖图)";
"阶段4 依赖+消费方反查(依赖图)" -> "阶段5 选择性深读(1~3个,深挖委派)";
"阶段5 选择性深读(1~3个,深挖委派)" -> "阶段6 问题识别(仅逻辑/流程硬伤)";
"阶段6 问题识别(仅逻辑/流程硬伤)" -> "阶段7 确认输出位置+生成报告+自检";
}
阶段 1:语言识别 + 文件定位
- 闸门检查:确认输入是单个文件;是方法入口则改道
code-read-deep-function,是整模块/项目则要求收敛。 - 识别语言:按扩展名判定(
.java/.kt/.py/.ts/.go/.cs…)。 - 定位文件:给路径直接 Read;只给文件名用 Glob 找
**/<文件名>,多命中列候选让用户选;记录总行数 LOC。 - 详见
references/file-mapping-rules.md(语言识别 + 文件定位)。
阶段 2:Outline 提取(构成清单)—— 文件级地图核心
扫描全文件,枚举所有顶层构件(类/接口/枚举/顶层函数/导出常量),每项记 kind + 可见性 + file:line + 一句话定位。
- 只列不展开:此阶段不追调用链、不贴代码;大文件尤其克制。
- 有类的语言按"类 → 其方法"分组;无类语言按"导出/内部函数 + 常量"分组。
- 详见
references/file-mapping-rules.md(Outline 提取规则)。 - 产出:构成清单 →「构成清单 Outline」段。
阶段 3:内部结构与协作(→ ① 结构图)
梳理文件内部各构件如何协作:公共方法→私有 helper、类间持有/继承/实现、找出主干。
- 剪枝:trivial(getter/setter/toString/日志)不进图;跨文件依赖留给阶段 4。
- 产出:文件内结构关系 → ① 结构图(OO 用
classDiagram,无类语言用flowchart)。
阶段 4:依赖与消费方反查(→ ② 依赖关系图)
- 上游:解析 import/using/require,列出本文件依赖的内部文件与第三方;外部 IO(DB/HTTP/MQ/缓存/文件)单列。
- 下游:全库 Grep 谁 import/引用本文件的导出符号;框架反射/注解入口(路由/定时/监听)按注解判断"由框架调用";测试消费方单独标注。
- 详见
references/file-mapping-rules.md(依赖反查 / 消费方反查)。 - 产出:上游+下游 → ② 依赖关系图。
阶段 5:选择性深读(1~3 个关键成员,深挖委派)
挑最多 3 个最值得读的成员做中等深度详读(优先级:用户点名 > 对外 API 入口 > 业务主干 > 复杂度最高)。
- 讲清职责、关键分支/状态、在文件内的协作、触达的外部 IO。
- 止于本文件:完整调用链/数据流不在这里展开,每个成员附"深挖 →
code-read-deep-function类名.方法名"。 - 详见
references/file-mapping-rules.md(选择性深读的挑选标准)。
阶段 6:问题识别(仅逻辑 / 流程硬伤)
通读过程中顺手记录明显的逻辑/流程问题,分三级(🔴 阻断 / 🟡 建议 / 🔵 提示),每条带 file:line + 证据 + 一句话影响。
- 范围严格限定为逻辑/流程硬伤(空指针、未处理异常、空 catch、死循环、不可达死分支、资源未释放、并发竞态、返回值被忽略等)。
- 不做安全/性能/规范的全维度审查——那是
code-review-deep-zh。 - 判定清单见
references/problem-checklist.md。
阶段 7:报告生成(输出位置由用户指定 + 规范化自检)
- 先确认输出位置与文件名——由用户指定,不自作主张:
- 询问报告写到哪个目录、用什么文件名;
- 用户未指定时,给出建议默认(如
docs/code-read-deep-file/<文件名>-YYYYMMDD.md)并请其确认; - 用户也可选择仅在对话中输出、不落文件。
- 按
references/report-template.md的 9 段结构 + 格式规范生成 Markdown(含两张 Mermaid 图)。 - 规范化自检(见下)后再交付/写文件。
报告结构(9 段)
完整模板与格式规范见 references/report-template.md。九段固定顺序:
- 定位 —— 文件
相对路径、语言、LOC、包/命名空间、系统分层角色、文件类型(含几个类/几个顶层函数)。 - 职责概述 —— 文件整体职责一句话,是否单一职责(混杂则点出,仅提示不做架构评审)。
- 构成清单 Outline —— 表格列全文件内所有构件(kind/可见性/
file:line/一句话定位),按类分组。 - 对外接口 Public API —— 导出/公共面(消费方契约)vs 内部 helper。
- 内部结构与协作 —— 内嵌 ① 结构图(Mermaid)。
- 依赖与消费方 —— 上游依赖 + 下游消费方;内嵌 ② 依赖关系图(Mermaid)。
- 关键数据与状态 —— 核心数据结构/类型、关键字段/模块级状态。
- 重点方法选读 —— 1~3 个关键成员中等深度详读,每个附"深挖→
code-read-deep-function"。 - 问题 —— 明显逻辑/流程硬伤清单(分级 +
file:line+ 证据 + 影响)。
两张 Mermaid 图的写法约定
全部用 Mermaid 代码块(```mermaid),保证可在 Markdown/GitHub/IDE 直接渲染。
① 结构图(文件内部结构):OO 语言用 classDiagram,无类语言用 flowchart。
- 展示文件内的类/成员与它们的协作关系;trivial 成员不入图。
classDiagram
class OrderService {
+createOrder(req) OrderVO
-toEntity(order) OrderPO
}
OrderService --> OrderDao : 调用
OrderService --> InventoryClient : HTTP
② 依赖关系图(文件级依赖):用 flowchart LR。
- 中心节点是本文件;左侧是下游消费方,右侧是上游依赖与外部系统;第三方用不同样式区分。
flowchart LR
U1[OrderController] --> F[OrderService.java]
F -->|import| D1[OrderDao.java]
F -->|HTTP| EXT[(库存服务)]
LIB[spring-web]:::ext -.-> F
classDef ext fill:#eee,stroke:#999;
规范化自检(交付前必过)
生成报告后,对照以下清单逐项确认,不达标就修正:
- 9 段标题齐全、顺序正确、层级一致(
##段标题、###子项)。 - 两张 Mermaid 图均存在且语法可渲染(节点/边闭合,无非法字符)。
- 「构成清单 Outline」覆盖文件内全部顶层构件,无遗漏(漏列要声明)。
- 所有"代码摘录"和"问题"条目都带
file:line,用相对路径。 - 「重点方法选读」不超过 3 个,每个都附"深挖 →
code-read-deep-function"委派标注。 - 问题分级用统一标记(🔴 阻断 / 🟡 建议 / 🔵 提示),每条含证据 + 影响,且只报逻辑/流程硬伤。
- 报告聚焦于这一个文件,未扩散成整模块/整项目通读,也未退化成逐方法深挖。
- 中文表述,术语前后一致;剪枝/省略处已注明边界。
与其他能力的边界(避免重叠)
| 能力 | 它做什么 | 与本 skill 的区别 |
|---|---|---|
code-read-deep-function(skill) |
从单个方法入口深挖完整调用链/数据流 | 本 skill 读整个文件给地图,深挖委派给它 |
/explain(命令) |
纯文本解释一小段代码 | 本 skill 出图、列全文件清单、结构化报告 |
code-annotating |
给代码加注释(会改文件) | 本 skill 不改码、产报告 |
code-review-deep-zh |
10 维度深度质量审查 | 本 skill 是阅读理解、不做全维度审查 |
增量更新与阅读索引(可选)
- 增量更新:若用户指定的输出位置已存在上一版报告,先读旧报告、对比当前代码变化做增量更新(显式标注「新增 / 变化 / 移除」),而非从零重写。
- 阅读索引:可在
docs/code-read-deep/INDEX.md累积「已读清单」(粒度 | 对象 | 报告路径 | 日期),让重复阅读沉淀为项目知识;首次写入时创建该文件。
常见错误
- 越界通读:把"读一个模块/一个目录/一个项目"当成本 skill 的活 —— 错。必须是单个文件,否则不适用。
- 退化成逐方法深挖:对文件里每个方法都跑一遍完整调用链 —— 错。只选 1~3 个深读,其余进 Outline,深挖委派方法级 skill。
- Outline 漏列:只列"主类"、漏掉文件里其他类/顶层函数 —— 错。清单必须覆盖全文件构件。
- 越权改码:边读边改/重构/加注释 —— 错。本 skill 只读不改。
- 越界报问题:把安全/性能/风格都报进去 —— 错。只报逻辑/流程硬伤,其余交
code-review-deep-zh。 - 自作主张存盘:不问用户就把报告写到某处 —— 错。输出位置与文件名由用户指定。
- 方法入口误吃:用户给的是
类名.方法名还硬当文件读 —— 错。改道code-read-deep-function。