使用与技术说明

CODRAX 使用与技术说明

CODRAX —— Code Of Deterministic Reasoning, Anchored eXplanation.

推理确定,解释锚定。每条结论落到代码,每段推理可以复核。

确定性诚实,不是态度,是契约。

这份文档以怎么用为主:四条上手路径、八个典型使用场景(每个都带可照抄的问法和怎么读答案)、提问技巧; 末尾用一小节速览它内部怎么工作。想看完整机制设计的工程读者,请直接读仓库里的 docs/architecture.md

一句话看懂 CODRAX

CODRAX 是一个代码分析 + Log/Trace 分析 + 变更提议工具。默认运行在读模式, 围绕可复核证据回答代码行为、崩溃根因、性能卡顿、默认配置、模块职责等问题,全程不碰源文件; 开启写模式后,由 Auto Pilot沙箱工作区(隔离出来的临时改动区,不直接动主仓)里 自动探索、应用、验证;计划 → 改动 → 验证 是它内部的三段。

可以把它当成什么

  • 一个会读仓库、会追证据、会给引用的高级分析助手。
  • 一个适合新人熟悉系统、线上排障、架构讲解的工程工作台。

不该把它当成什么

  • 不是“模型直连仓库”的聊天壳。
  • 不是靠文风自信来制造正确感的问答器。

一个正确预期

  • 它承诺的不是“永远秒答”,而是“能证实的尽量证实,证不实的明确标边界”。
  • 价值在于更稳地把复杂问题拆清楚。

四种使用形态

形态适合什么
边问边查交互控制台,适合摸清陌生系统、连续追问。
一次分析单次请求 -r "…",适合脚本和持续集成。
现场输入挂日志或性能文件,先分诊再追代码。
安全改动写模式先在沙箱验证,不直接改主仓。

安装与开始之前

真正开始提问之前,有三件事要先准备好:装好 codrax、配好大模型凭证, 然后进到你要分析的代码仓库里启动它。三步走完,就能问出第一个问题。

第一步 · 装好 codrax

从源码构建。需要 CGO 工具链(tree-sitter 语法解析):macOS 先 xcode-select --install,Debian / Ubuntu 装 gcc musl-tools

git clone https://github.com/hanchaoqun/codrax.git
cd codrax && make   # 输出 ./codrax

建议把 codrax 所在目录加进 PATH,这样在任何地方都能直接敲 codrax 启动:

echo 'export PATH="/path/to/codrax:$PATH"' >> ~/.bashrc   # bash
echo 'export PATH="/path/to/codrax:$PATH"' >> ~/.zshrc    # zsh
exec "$SHELL" -l

第二步 · 配置 providers.yaml(连接大模型)

codrax 自己不含大模型,要连一个 OpenAI 兼容的 LLM 服务 —— OpenAI、DeepSeek、Qwen、本地 vLLM / Ollama 都可以。 把配置样例复制成 providers.yaml放在和 codrax 可执行文件同一个目录下:

cp providers.yaml.example providers.yaml

最小配置只需要填 4 个字段:

llm:
  default:
    provider: openai                 # 协议名;兼容服务都填 openai
    api_key: "sk-xxx"                 # 你的 API key
    model: "your-model-id"            # 例如 gpt-4o-mini / deepseek-chat
    base_url: "https://api.openai.com/v1"

缺字段会怎样:这 4 个字段缺任何一个,codrax 启动时会直接报错并告诉你缺的是哪个 —— 它不会偷偷连任何公网地址。需要按 agent 分别换模型时,再加 agents: 段即可。

第三步 · 进入你的代码仓库再启动

⚠ 这一点最容易被忽略,但最关键

codrax 把「你启动它时所在的目录」当作要分析的代码仓库。它不会弹窗问你「要分析哪个项目」—— 默认分析的就是当前工作目录(等价 --repo .)。

所以正确用法是:cd 进你想分析的项目根目录,再运行 codrax如果在别的目录启动,它就会去分析那个目录。

cd /path/to/your/project   # ① 先进入你要分析的代码仓库
codrax                     # ② 再启动,它会索引「当前目录」这个仓库

启动后 codrax 会在当前目录建一个 .codrax/ 子目录,存放日志、对话记忆和缓存等运行产物。 读模式下它只读你的源码、从不修改;所有运行产物都集中在这一个隐藏目录里,一条 .gitignore 就能排除。

随后你就进入了交互控制台(REPL):看到提示符 ❯❯ 之后,直接打字提问、回车即可。 /help 列出全部命令,/exit 退出。下一节会展开讲不同的使用路径。

快速上手:4 条路径

不用一次学全。先挑一条最贴近你当前需求的路径开始,其它三条用到再看。

路径一 · 交互控制台

直接对话式提问,适合陌生仓库摸底、连续追问、边看边缩小范围。控制台会自动保留上下文记忆。

codrax
# 然后直接提问:
订单状态为什么没有更新?
如果继续追查,下一步应该先看哪一层?

路径二 · 单次请求

一条命令、一个答案,适合脚本、持续集成(CI)、批量分析,或只要一个明确结论就结束的场景。

codrax -r "退款单为什么会被重复创建?
如果证据不足请明确说明。"

路径三 · 日志 / 性能现场分诊

把崩溃日志或性能 trace 作为附件喂进来。日志会先走日志分诊,性能现场会先走性能分诊—— 这里的“分诊”就是先把现场信息分类整理,再决定从哪里查起。

codrax --log crash.log -r "解释最可能根因"
codrax --htrace perf.trace -r "为什么这个页面会掉帧?"

路径四 · 写模式 Auto Pilot

明确要改什么时用。描述目标即可,Auto Pilot 自动探索、拆批、应用、验证;低 / 中风险不打断,高风险才暂停审批,合回主仓仍需显式动作。所有写入只发生在沙箱工作区。

codrax --mode=write -r "修复回调幂等问题并补测试"
# 只想先看计划、不落地:显式用 plan 阶段
codrax --mode=write --write-phase=plan -r "修复回调幂等问题并补测试" --plan-out plan.json

建议:把交互控制台当成探索工作台,把单次请求 -r 当成稳定分析入口。 多仓父目录下可用 --multi-repo=true 自动发现子仓,再用 --focus 固定本轮目标仓。

典型使用场景

下面八个场景覆盖了绝大多数日常用法,也是这份文档的主体。每个场景都给出三样东西: 你会怎么问(可以原样照抄的问法)、屏幕上会发生什么怎么读答案。 例子里的文件名、函数名、仓库名都是占位符,换成你项目里的实际名字即可。

场景①接手陌生仓库,快速建立架构认知

你会怎么问

cd /path/to/repo && codrax
# 然后直接提问:
这个项目分几层?各模块的职责是什么?
要理解订单创建流程,先看哪几个文件?

屏幕上会发生什么

首次启动会先索引仓库;提问后能看到任务列表和「正在…」过程行——它在读哪些文件、搜什么关键词都是透明的;最后是分层解释加一串 file:line 引用。

怎么读答案:先看它引用了哪些文件——那就是这个仓库的骨架清单。追问时直接指着答案里的名字继续问(「A 和 B 之间怎么交互?」),交互控制台会带着上下文记忆走,越问越窄。

场景②线上 panic / 异常日志定位

你会怎么问

codrax --log /tmp/panic.txt -r "这个 panic 哪来的?"
# 容器日志直接从管道喂进来:
kubectl logs pod/foo | codrax --log - -r "排查这个 crash"
# REPL 里附加后连续追问:
/log /tmp/panic.txt
这个 panic 哪来的?

屏幕上会发生什么

附加成功后提示符带 [log] 粘性标签。日志先被解析成结构化栈帧和故障信号(panic / 异常 / traceback / sanitizer 报告等),再据此去仓里读真正相关的文件——不是把日志当一段普通文本。

怎么读答案:答案按「候选根因 / 已排除 / 仍缺证据」组织,栈帧对齐到当前代码行。两份日志对比用 --log a.log --log b.log;CI 构建路径和本地仓对不上时,用 --log-source-prefix /build/src/ 剥掉前缀再匹配。

场景③性能卡顿 trace 分析

你会怎么问

# 抓一段 trace(HarmonyOS 示例;Android 用 atrace)
hdc shell hitrace -t 5 graphic > /tmp/htrace.txt
# 提问尽量给足三要素:进程/线程名(或 pid/tid)+ 时间窗 + 想要的结论形态
codrax --htrace /tmp/htrace.txt -r "com.example.app 12345 主线程在 \
  34579.472s 到 34579.476s 的短窗卡顿:主要等待来自哪条依赖/唤醒 \
  关系?链上线程状态和调度资源背景是什么?只分析这份 trace,不读代码"
# REPL 里则先 /htrace 附加,再按同样方式追问:
/htrace /tmp/htrace.txt
RenderThread 在 34579.47s 到 34579.59s 内为什么掉帧?在等谁唤醒?

屏幕上会发生什么

提示符带 [trace] 标签;性能现场先被分诊,自动抽出掉帧、阻塞、启动等关键信号。支持 HiTrace / atrace / systrace / perfetto 文本格式;二进制 HiTrace 先用 /htrace convert 转成文本。

怎么读答案:提问给足三要素——进程/线程名(或 pid/tid)、时间窗、想要的结论形态(在等谁 / 唤醒链 / 占比排名)——答案会明显更准;只说"为什么慢"也能跑,但系统要花更多轮先替你圈范围。答案会结合 runnable、D-state / IO、binder、频点和 perf 调用栈拆等待与唤醒链,指出卡顿最可能出在哪个阶段、还缺什么证据。前后两份 trace 对比也可以:在问题里分别点名两个文件即可。

场景④跨仓 workspace:找调用链与接口消费方

你会怎么问

cd ~/workspace && codrax   # 父目录下多个独立 git 仓
/repos                     # 看发现了哪些子仓
/repos focus api-go-aabbccdd
/repos focus web-frontend-eeff0011
api-go 暴露的 /v1/user 接口在
web-frontend 哪些组件被消费?

屏幕上会发生什么

启动 banner 会显示发现了几个子仓;/repos 列出各仓的语言和状态,focus 后提示符带 [focus:…] 标签。跨仓的接口消费方、调用链查询在被 focus 的子仓之间直接命中。

怎么读答案:只问单个子仓时不需要任何额外操作——问题里提到子仓名就会自动路由;跨子仓问题先把相关子仓都 focus 进来。注意:写模式必须 cd 进具体子仓运行,一次只改一个仓。

场景⑤配置 / 行为溯源

你会怎么问

codrax -r "config.yaml 里 timeout 字段的默认值是多少?"
# 或在控制台里连续追问:
这个值在哪里被读进来?
命令行参数能覆盖它吗?优先级是怎样的?

屏幕上会发生什么

这类「精确值」问题走的是最严的路:必须找到唯一的定义与解析链才会给出具体数值,答案附定义处和覆盖点的引用。

怎么读答案:留意答案里「显式定义 / 推断 / 证据不足」的区分——提问时也可以直接要求它这样区分。查不到唯一定义时它会明确说,而不是报一个像样的数。

场景⑥数据文件盘点与核对

你会怎么问

codrax --mode=data -r "汇总当前目录 CSV 的
数值字段总和,只输出数字"
# 或描述规则让它去关联核对:
把 records.tsv 和 reference.jsonl 按共同键关联,
列出字段不一致的前 20 条,输出 Markdown 表格。

屏幕上会发生什么

数据任务是独立的一条只读路径:系统先列出材料目录(路径、表头、行数、样例),再由受限的确定性执行器读文件算结果——清洗、过滤、去重、关联、汇总都可以,输出严格按你要求的格式。

怎么读答案:想核对就看随附的材料消费记录和对账摘要——哪些文件被读了、每条结果怎么来的都有账;完整审计产物落在 .codrax/data-audit/ 目录。

场景⑦写模式小修小补

你会怎么问

codrax --mode=write -r "修复回调幂等问题并补测试"
# REPL 里:单次写用 /write,持续写模式用 /mode write
/write 给 parseConfig 补上空值检查和对应测试

屏幕上会发生什么

Auto Pilot 自动探索、拆小批次、应用、跑验证;低 / 中风险不打断,高风险暂停并显示计划、风险和差异,等你 /approve/reject;验证失败会小批量自动重规划。全程只写隔离的沙箱工作区。

怎么读答案:整个过程主仓一直不动。确认没问题后 /merge 把改动收回主仓(需要 codrax.yamlpipeline_keep_worktree_on_success: true 保留工作区);只想先看计划不落地,用 --write-phase=plan

场景⑧无头 / CI 单次提问

你会怎么问

codrax --request "main 函数定义在哪个文件?"
codrax -r "项目目录布局是怎样的?" > overview.md
# 结合管道做自动化排障:
kubectl logs pod/foo | codrax --log - -r "分析这次 crash"

屏幕上会发生什么

一条命令、一个答案,跑完即退出,适合脚本和持续集成;输出重定向到文件即可归档。--repo / --branch 可以指定别处的仓库和分支。

怎么读答案:脚本化调用时,建议在请求里写明「如果证据不足请明确说明」——拿到的要么是带引用的结论,要么是一句诚实的边界说明,两者都可以直接进流程。

怎么提问效果最好

同样一个工具,问法不同,效果差别很大。这一节是“使用效果的分水岭”。

更推荐这样提问

  • 是什么 + 由什么决定 + 失败边界在哪
  • 请区分显式定义、推断补全和证据不足
默认超时时间到底是多少?
如果找不到,请明确说明是推断,
还是当前证据不足。

更推荐这样阅读答案

  • 先看它引用了什么文件,再看它怎么总结。
  • 分清哪些是已证实的,哪些只是尽力推断的。
启动提示 → 任务列表 / 处理中
→ 系统决策推演 → 最终答案 + 引用

不要只问“这是什么”,尽量问“它怎么工作、由什么决定、哪些情况会让它失效”。 如果是在多仓父目录提问,顺手说明目标仓,或先用 /repos 看清子仓列表。

机制速览:为什么答案可信

CODRAX 不是把问题直接丢给大模型。一句话的问题会先被编成结构化的「调查任务单」, 之后的调查顺序、停止条件、引用合法性和答案放行全部由确定性代码接管——模型交原料,系统定放行。 这一节只讲结论,够建立正确预期即可。

问题先被编成任务单

查什么、按什么顺序查、查到什么程度算够、答案必须长什么样,动手前先定下来;几条候选假设并列排查,各自带成立条件和打掉条件,谁先查不靠感觉。

只引用真正读过的内容

「搜到」不等于「读到」。允许引用的清单只来自真正打开过的文件,每条引用还要回到源码逐条核对落点——编造或对不上的引用进不了正文。

证据不足就停下

连续几轮没有新证据会强制扩大搜索,再不行就降级收尾:讲清「已证实 / 已排除 / 仍缺证据」,绝不把不确定包装成确定。「会停下」本身就是能力。

写模式受同一套边界

计划、改动、验证彼此隔离,所有写入只发生在沙箱工作区;风险分级决定要不要打断你,合并回主仓永远是你的显式动作。

想深入内部机制?流水线各阶段、假设规划、引用校验和答案验收规则的完整设计,都在仓库的 docs/architecture.md——工程读者请直接读它,这里不再展开。

写模式 Auto Pilot:能改,但不莽撞

写模式不是“放开让模型改文件”。日常主路径是 Auto Pilot:你描述目标,系统自动探索、拆成小批次、生成有界计划、在沙箱里应用、跑验证,失败按 typed 证据小批量 replan。 计划 → 改动 → 验证 仍是它内部的三段,每段权限都不同;所有写入只发生在独立沙箱工作区——主仓旁边一块临时隔离施工区,怎么改都不碰主仓当前版本。

风险分级审批 · 不是每次都拦

  • 低 / 中风险:Auto Pilot 自动应用 + 验证,不打断你。
  • 高风险:暂停并显示计划 / 差异,等你 /approve/reject
  • critical:直接拒绝;合回主仓也始终需要显式动作。

执行边界 · 只能按计划落地

  • 改动范围保护:计划没写的模块,执行时不能突然去改。
  • 改动顺序保护:有依赖关系的改动必须按顺序落地。
  • 跨仓写入保护:一次写模式只能改一个子仓。

验证阶段像工程流水线,不是聊天补救:会跑静态检查、预编译检查和测试工具探测; run_tests 自动探测 12 类常见测试工具。验证失败时,Auto Pilot 把失败摘要、测试结果和嫌疑文件作为 typed 证据, 交给 controller 小批量 replan,再 apply 再 verify。成功后还可以保留沙箱工作区继续复核;想只看计划不落地,用 --write-phase=plan

CODRAX 不是让模型替你“装懂代码”,
而是让系统在可验证契约里,
把分析做实、把引用做牢、把不确定说清。

想深入到每一个命令、每一项配置?请继续看 完整使用手册

/EOF