Skip to content

📄 本页由源文件 skills/dev-flow/references/call-graph-spec.md 自动投影生成(单一权威源)。请勿直接编辑本页。

调用链路图规范(Call Graph Spec)

本文件是 dev-flow 中「代码调用/依赖关系可视化」的唯一权威来源。 多个步骤(step-1/2/3/6/7/iteration-fix)引用此规范,新增/修改须在此处统一维护。

定位与理念

  • 目标:把步骤 1~2 的「上下游依赖」、步骤 3 的「改动边界」、步骤 6 的「调用方分析」、步骤 7 的「改动链路」从纯文字列表升级为可视化图,让 AI 和人都能快速建立心智模型
  • 与流程自身图区分flow-graph.md 描述 dev-flow 流程节点;本规范描述 用户代码的调用关系
  • 产出物真实性:不强制所有任务画图,仅在能提升理解效率时才画;简单任务(单文件、无上下游)不画
  • 灵感来源:Aider repo-map、Claude Code Repo Map、dependency-cruiser、madge、C4 Component diagram 等业界实践

触发矩阵(AI 自动判断)

场景条件格式是否必画
极简模式准入通过step-3 极简模式启用❌ 不画
单文件无上下游related_files_count ≤ 2upstream_deps.length === 0❌ 不画
小型改动related_files_count ≤ 3upstream_deps.length ≤ 1文本树✅ 画
中型改动related_files_count > 3 或 存在分支条件渲染文本树 + Mermaid✅ 画
修改公共函数/组件step-6 V7 检测到调用方 > 5Mermaid 辐射图✅ 强制
跨模块改动涉及 ≥ 3 个独立模块Mermaid(含 subgraph 分组)✅ 画
迭代修复已有工作上下文 + 新增改动增量文本树(只画 Delta)✅ 画
步骤 7 / devlog最终交付复用 step-1 的图(如有)🟡 推荐

格式 A:文本树(默认格式)

优势:0 渲染依赖、Token 友好、任何 Markdown/终端都可见 适用:≤ 10 节点的简单调用链路

模板

text
{入口文件/组件} ({关键上下文,如所在模块})
└─ <{子组件} {关键 props}>      ← [操作类型] {备注}
└─ {孙组件/函数} ({关键条件})
├─ {分支 1}              ← [核心改]
└─ {分支 2}

操作类型标记(与 step-2 三级影响程度对齐)

标记含义对应 step-2 字段
[核心改]本次直接修改impact_levels.core
[联动]受影响需同步调整impact_levels.linked
[仅验证]不改但需验证不受影响impact_levels.verify_only
[新增]新建节点files_to_create
[删除]移除节点

完整示例

text
main-module / App.tsx
└─ <Avatar someParam={someParam} />         ← [核心改] 新增 props
└─ Avatar.tsx (external-lib)            ← [联动] 第三方库,仅传参
└─ Section.tsx                       ← [联动]
└─ isCondA ?
├─ CompA                 ← [核心改] 支持新功能
└─ CompB               ← [仅验证]

格式 B:Mermaid(复杂场景)

优势:多入口/分支/分组天然呈现;GitHub/GitLab/文档平台/主流 Markdown 均原生渲染 适用:> 10 节点、跨模块、多分支、辐射式调用方分析

基础模板(graph TD)

跨模块分组模板(含 subgraph)

辐射图模板(step-6 V7 专用)

修改公共函数/组件时,展示改动节点为圆心、调用方为外围的风险拓扑

说明:调用方节点的样式标注受影响程度(🔴 签名变更导致破坏 / 🟡 行为变更需验证 / 🟢 仅内部实现变更)。

格式 C:增量调用图(迭代修复专用)

原则:只画 Delta(本轮相对上轮的新增/删除节点),不重绘全量

text
[增量] Round 3(提测反馈修复)

+ Section.tsx::handleChange   [新增方法]
± CompA.tsx (line 45-60)      [修改核心逻辑]

- deprecated-util.ts             [删除]

格式 D:改动边界标注(step-3 制定方案时使用)

原则:不新画图,在 step-1 已有的调用图上叠加边界标注,清晰表达"本次改动改什么/联动什么/只验证什么"。

标注语义(三级影响度,与 impact_levels 完全对齐)

标注emoji语义对应 impact_levels
核心改✏️本节点代码被直接修改core
联动🔗本节点代码不改,但依赖/被依赖的节点改了,需联动验证linked
仅验证👁️本节点无改动无依赖,仅作为回归验证范围verify_only

文本树标注示例

text
src/component/Search/
├── index.tsx          ✏️ 核心改(修复邮箱正则)
├── types.ts           🔗 联动(字段类型可能需要调整)
└── __tests__/
└── index.test.tsx 👁️ 仅验证(需补单测)

Mermaid 标注示例

text
graph TD
A[List.tsx]:::verify --> B[Search.tsx]:::core
B --> C[utils.ts]:::linked
classDef core fill:#ffeb3b,stroke:#f57c00,stroke-width:3px
classDef linked fill:#b3e5fc,stroke:#0277bd
classDef verify fill:#e0e0e0,stroke:#616161,stroke-dasharray:3 3

❌ 反模式(禁止)

  • 禁止在 step-3 重绘调用图(应复用 step-1 输出)
  • 禁止标注比 impact_levels 字段多或少(二者必须一一对应)
  • 禁止省略 emoji 前缀(影响可读性)

绘制指引(AI 必读)

数据来源

信息来源
节点(文件/组件/函数名)step-1 related_files 表格、codebase_search 结果
边(调用关系)grep_search import/调用点、AST 符号引用
关键 props / 传参步骤 1 阅读组件 JSX 时记录
条件分支步骤 1 阅读条件渲染代码时记录
操作类型step-2 impact_levels 字段

节点信息密度(重要)

每个节点应至少包含文件名;有价值时附加:

  • 所在模块/包(如 external-lib
  • 关键 props/参数(如 someParam={someParam}
  • 关键条件(如 isCondA
  • 改动位置(如 :L45-60

禁止事项

  • 禁止编造不存在的调用关系——每条边必须对应真实 import / 调用
  • 禁止为了好看扩充节点——只画与本次改动有关的链路
  • 禁止省略关键分支——条件渲染的两个分支如都受影响,必须都画出
  • 禁止在极简模式下画图——遵循触发矩阵,避免给简单任务增加 Token 负担
  • 禁止替换事实性上下游列表——调用图是补充upstream_deps/downstream_deps 数组仍须输出

引用与复用链路

text
step-1  ──画图──▶ [调用链路图]

├─▶ step-2(上下游依赖节引用)
├─▶ step-3(复杂度 ≥ 中时标注改动边界)
├─▶ step-6 V7(调用方>5 时升级为辐射图)
├─▶ iteration-fix(增量图,只画 Delta)
└─▶ step-7/devlog(作为交付物标配)

复用原则:step-1 画的图是唯一真相源;后续步骤基于它标注/增强/增量,禁止重画。

与知识库的联动(未来迭代,P3)

长期规划:每次 dev-flow 画的调用图自动归档到 ~/.codebuddy/knowledge/{project}/call-graphs/{模块}.md; 下次命中同模块时,step-1 直接读取已有图作为冷启动基线,只画增量变化。 当前版本先不落地,保留扩展点。

版本

版本日期变更
v1.02026-04-23初版:文本树 + Mermaid 双格式 + 触发矩阵 + 引用链路

基于「单一权威源」哲学构建 —— 文档由源文件投影生成