maycur-ai-code-analyzer — 代码分析
链路第三环:消费 clue/clue.md + logs/*.json,定位涉及项目与代码位置,梳理数据流,给出疑似根因点,产出 code/code-analysis.md 供 root-cause-analyzer 消费。
Claude vs 脚本分工
| 角色 | 职责 |
|---|---|
| Claude | 读 clue/logs 提项目 → opser 拿真实分支 → gitlaber fetch 到 repos/ → codegraph init → 用 codegraph/Read 分析 → 写 code-analysis.md |
| 无 Python 脚本 | 代码语义分析是 Claude 强项,不写脚本 |
代码准备流程(opser + gitlaber fetch + codegraph init)
① 提取涉及项目
从上游物料提取项目线索:
clue/clue.md— 项目名字段(若 bug-clue 已识别)logs/sls-logs.json— 日志中的 service.name / logger 名logs/langfuse-trace.json— trace metadata 中的 service.name- 独立模式:用户直接给
② 对每个项目:分支确认 + 拉取 + 索引
# 1. opser 确认真实分支(基于环境+项目,Ops 部署平台返回)
python <opser-dir>/scripts/opser.py git-info --project <P> --env <E>
# → Markdown 表格:git 仓库地址 + 分支 + commit
# 2. gitlaber 拉取代码到 repos/{project}/(不用 file/commits 在线查)
python <gitlaber-dir>/jihulab.py fetch <group/project> --branch <opser返回的分支>
# 不存在 → clone;已存在 → pull
# 3. codegraph 可用且 .codegraph/ 不存在 → 建索引
cd <bug_dir>/repos/{project} && codegraph init -i
关键约束:
- opser 是分支真相源,gitlaber 的
env set手动映射不再使用 - opser 失败 → 报错让用户确认,不 fallback 到猜分支
- 禁止
gitlaber file/gitlaber commits在线查询(性能差、token 贵),必须先 fetch 到本地
分析优先级
| 优先级 | 条件 | 工具 |
|---|---|---|
| 1 | repos/{project}/.codegraph/ 存在 |
codegraph MCP(AST 索引) |
| 2 | repos 有代码但无 .codegraph | Read / Grep(fallback) |
| 3 | repos 空 + 拉取失败 | 报错,不臆测 |
codegraph 常用 query:
codegraph_search— 找符号定义codegraph_callers/codegraph_callees— 调用关系codegraph_trace— 跨函数数据流codegraph_context— 任务上下文
输入源
| 来源 | 提取什么 |
|---|---|
clue/clue.md |
异常关键字(NPE/timeout)、entCode、env、项目名 |
logs/sls-logs.json |
堆栈中的 file:line、logger 名、service.name |
logs/langfuse-trace.json |
trace observation name → 代码函数映射 |
logs/discovered_trace_ids |
跨系统关联键 |
| 用户输入(独立模式) | 项目名 + 环境 + 异常描述 |
核心动作:异常关键字 + 堆栈/trace → 反推源码位置 → 用 codegraph/grep 验证。
执行流程
- 接收
{bug_dir}或独立模式用户输入 - 模式探测:
{bug_dir}/clue/clue.md和{bug_dir}/logs/都存在 → 编排模式- 都不存在 → 独立模式(AskUserQuestion 收集项目名/环境/异常描述)
- 部分存在 → 用已有物料 + AskUserQuestion 补齐缺失项
- 读 clue.md + logs/*.json(或用户输入)提取项目列表 + 异常线索
- 对每个项目:
- opser
git-info拿真实分支 - gitlaber
fetch/pull到repos/{project}/ - codegraph
init -i(若可用且未索引)
- opser
- 用 codegraph(首选)/ Read+Grep(fallback)分析涉及代码
- 综合异常线索 + 代码结构 → 梳理数据流 → 定位疑似根因点
- 写
code/code-analysis.md - 流程结束
物料产出 code/code-analysis.md
# 代码分析:bug-{id}
## 涉及项目
- project: <name>
- repo: <group/project>
- branch: <opser 返回的真实分支>
- commit: <拉取时的 commit hash>
## 定位文件
- `src/foo/bar.py:42` — ServiceA.handle() 入口
- `src/foo/baz.py:88` — DB 写入点
## 数据流
入口 → ServiceA.handle → RepoA.save → DB
↓
[异常点] NullPointerException @ baz.py:88
## 疑似根因点
1. **[高置信]** `baz.py:88` — save() 未判空导致 NPE(依据:日志堆栈 + 代码结构)
2. **[中置信]** `bar.py:42` — 入口参数未校验
3. **[低置信]** ...
## 查询记录
- codegraph_search "save" → RepoA.save
- codegraph_callers RepoA.save → ServiceA.handle
- grep "NullPointerException" → 无显式抛出点
- opser: project=AIR env=prod branch=master
- gitlaber: fetched group/proj @ abc1234
字段说明:
- 涉及项目:opser/gitlaber 的拉取记录(分支可追溯,下游可验证版本)
- 定位文件:每行一个,附简短角色说明
- 数据流:含异常点的执行链路(文字+箭头,不画图)
- 疑似根因点:分级(高/中/低置信),每个含代码依据
- 查询记录:用了什么工具、查了什么(过程可追溯)
边界
- 不做线索收集(bug-clue-analyzer 职责)
- 不做日志/trace 查询(log-analyzer 职责)
- 不做根因综合与方案给出(root-cause-analyzer 职责)
- 不做在线代码查询(强制本地化)
- 不做 git 提交/MR(code-manager/code-dever 职责,P1)
- 不写 Python 脚本(纯 Claude 分析)
依赖
- opser(
opser.py git-info):项目环境→真实 git 分支 - gitlaber(
jihulab.py fetch/pull):代码拉取(不用 file/commits 在线查) - codegraph(MCP 工具):本地代码 AST 索引(可选但推荐)
- bug-clue-analyzer(上游):
clue/clue.md - log-analyzer(上游):
logs/*.json