CodeGraph CLI 完全解析:从 init 到 explore 的全部命令、参数与实现细节
CodeGraph 为 Claude Code、Cursor、Codex、Gemini、Copilot 等 AI 编码代理提供预构建的代码知识图谱,而其面向人类和脚本的入口就是 codegraph 命令行工具。本文基于仓库官方参考文档 CLI,结合 CLI 入口实现 与配套测试,逐一拆解每条命令的用途、可用 flag 与默认值,以及 init/index/sync 三种索引策略、explore/node 与 MCP 工具的同源关系、affected 的依赖追踪原理,帮助读者把 CodeGraph 完整嵌入日常开发流与 CI 流程。
全部命令一览
官方文档给出的命令总表如下(括号内为该命令接受的 flag):
codegraph # 运行交互式安装器
codegraph install # 运行安装器(显式)
codegraph uninstall # 从各 Agent 移除 CodeGraph(install 的逆操作)
codegraph init [path] # 初始化项目 + 构建图谱(一步完成)
codegraph uninit [path] # 移除项目中的 CodeGraph(--force 跳过确认)
codegraph index [path] # 从头全量重建索引(--force, --quiet, --verbose)
codegraph sync [path] # 增量更新(--quiet)
codegraph status [path] # 查看索引统计(--json)
codegraph unlock [path] # 删除阻塞索引的残留锁文件
codegraph query <search> # 搜索符号(--kind, --limit, --json)
codegraph explore <query> # 一次返回相关符号源码 + 调用路径(与 codegraph_explore MCP 工具同输出)
codegraph node <symbol|file> # 单个符号的源码 + 调用者,或按行号读取文件(与 codegraph_node 同输出)
codegraph files [path] # 展示文件结构(--format, --filter, --pattern, --max-depth, --json)
codegraph callers <symbol> # 查找调用某函数/方法的位置(--limit, --json)
codegraph callees <symbol> # 查找某函数/方法调用了哪些内容(--limit, --json)
codegraph impact <symbol> # 分析修改某符号影响到的代码(--depth, --json)
codegraph affected [files...] # 查找受变更影响的测试文件(详见下文)
codegraph daemon # 管理后台守护进程——选择一个停止(别名 daemons)
codegraph telemetry [on|off] # 查看或更改匿名使用统计
codegraph upgrade [version] # 更新到最新 release(--check, --force)
codegraph version # 打印已安装版本(也支持 -v, --version)
codegraph help [command] # 显示帮助,可针对单个命令
MCP 服务器(codegraph serve --mcp)由你的 Agent 自动拉起,无需手工运行;其工具清单与 CODEGRAPH_MCP_TOOLS 环境变量见 MCP Server 参考。
从源码看,这套命令注册在 src/bin/codegraph.ts 中,基于 commander 构建。除文档列出的命令外,还有三条隐藏命令不会出现在 --help 里:
serve(隐藏):stdio 形式的 MCP 服务器入口。安装器会把args: ['serve','--mcp']写进每个 Agent 的 MCP 配置,由 Agent 自行拉起。若人在 TTY 终端手敲serve --mcp,程序会打印提示并直接返回,避免"看起来挂死"的误解(见 src/bin/codegraph.ts#L1828-L1901);context(隐藏):buildContext公共 API 的 CLI 形态,接受--format markdown|json、--max-nodes、--no-code等参数,供脚本化集成使用(src/bin/codegraph.ts#L1262-L1310);prompt-hook(隐藏):Claude CodeUserPromptSubmit钩子入口,对结构性提问自动注入codegraph_explore结果,且任何失败路径都静默退出 0,绝不破坏用户的 prompt 流水线(src/bin/codegraph.ts#L1326-L1474)。
两个全局 flag --color / --no-color 在任意位置生效;管道输出、NO_COLOR 环境变量会自动禁用 ANSI 颜色(src/bin/codegraph.ts#L160-L164)。
路径解析规则:所有 [path] 参数都向上查找
多数命令接受可选的 [path] 参数。resolveProjectPath 的解析逻辑是:
- 将参数(或当前目录)解析为绝对路径;
- 若该目录已初始化(存在
.codegraph/codegraph.db,而非仅有.codegraph/),直接使用; - 否则沿父目录逐级向上,直到文件系统根,寻找最近的已初始化项目;
- 找不到则返回原路径,后续命令会报出带提示的错误(如
Run "codegraph init" first)。
这意味着在 monorepo 子目录、或已初始化项目的任意深层目录里执行 codegraph query ... 都能自动命中正确的索引,无需显式传 -p。
生命周期:install 与 uninstall
install 把 CodeGraph 的 MCP 服务器写入一个或多个 Agent 的配置(Claude Code、Cursor、Codex CLI、opencode、Hermes Agent、Gemini CLI、Antigravity IDE、Kiro、GitHub Copilot),支持以下 flag(src/bin/codegraph.ts#L2341-L2445):
| Flag | 说明 |
|---|---|
-t, --target <ids> |
目标 Agent,逗号分隔的 id,或 auto / all / none;默认交互式询问 |
-l, --location <where> |
global 或 local;默认交互式询问 |
-y, --yes |
非交互:默认 --location=global --target=auto 并自动放行 |
-i, --init |
配置完 Agent 后顺带在当前目录执行 codegraph init,实现"配置 + 建索引"一条命令;可与 --yes 组合做无值守引导 |
--no-permissions |
跳过写入 auto-allow 权限清单(仅 Claude Code) |
--print-config <id> |
只打印指定 Agent 的 MCP 配置片段后退出,不写任何文件 |
--refresh |
重写既有安装已配置的内容(说明段、MCP 条目、旧钩子清理),绝不新增 Agent;codegraph upgrade 会自动调用 |
Agent 目标定义位于 src/installer/targets/ 目录,registry.ts 汇总了全部可用 id。
uninstall 是 install 的逆操作:移除各 Agent 中的 MCP 条目、说明段与权限配置,但不删除 .codegraph/ 索引——删索引是 uninit 的职责。它额外提供 --keep-cli,仅清理 Agent 配置而保留 codegraph CLI 本体(src/bin/codegraph.ts#L2455-L2485)。
init、index 与 sync:三种索引策略
官方文档对此有一段关键说明,原文核心观点是:
codegraph init创建本地.codegraph/目录并在同一步构建完整图谱。(旧的-i/--indexflag 现在是 no-op,仅为不破坏既有脚本而保留。)此后文件 watcher 会自动保持图谱最新——index(从头全量重建)和sync(增量更新)只在 watcher 被禁用、或你在 Agent 会话之外用脚本操作索引时才需要。
init:一步完成
runInit 的流程是:
- 拒绝不安全的根目录——若路径看起来像用户主目录或文件系统根(会索引进缓存、其他项目甚至整盘,产生 GB 级索引),直接报错退出;确有需要可传
--force覆盖; - 若已初始化,提示改用
codegraph index或codegraph sync; - 创建
.codegraph/,随后在"命令监督"(命令被孤児化或主线程卡死时自我终止的看门狗)下执行首次全量索引; - 打印结果统计(文件数、节点/边数、耗时),错误文件会写入
.codegraph/errors.log; - 特殊场景:如果索引结果为 0 个节点且当前是 git 父仓库,
.gitignore恰好排除了承载代码的嵌套子仓库,CLI 会点名这些子仓库并交互式提议把它们的includeIgnored模式写入codegraph.json后重新索引,避免用户拿到"静默的 0 节点"结果(src/bin/codegraph.ts#L482-L544)。
init 的完整 flag(src/bin/codegraph.ts#L706-L715):
| Flag | 说明 |
|---|---|
-i, --index |
已废弃:索引现在默认执行,flag 仅为向后兼容保留 |
-f, --force |
路径像主目录/文件系统根时仍继续 |
-v, --verbose |
输出详细的 worker 生命周期与内存信息 |
-y, --yes |
非交互:跳过所有提示取默认值(脚本 / CI / 容器引导用) |
uninit [path] 删除 .codegraph/ 目录并顺带清理已安装的 git 同步钩子;-f, --force 跳过确认提示。
index:真正的"全量重建"
源码注释明确 index 走的是 RECREATE 路径——通过 CodeGraph.recreate(projectPath) 直接丢弃旧库与 WAL 从零重建,而不是打开旧图逐行删除(src/bin/codegraph.ts#L781-L873)。这是刻意的:先清空再索引的老做法曾报出"0 nodes",且在大索引上逐行 FTS 删除会把主线程卡到触发看门狗。因此文档中"Full re-index from scratch"的描述是准确的——其结果与一次全新 init 完全一致。flag 为 --force、--quiet(抑制进度输出)、--verbose。
sync:增量更新
sync 打开现有索引并只处理自上次索引以来的变更,完成后报告 Added / Modified / Removed 三类文件计数与节点更新数;无变更时输出 Already up to date(src/bin/codegraph.ts#L878-L935)。唯一的 flag 是 -q, --quiet,注释写明其用途是 git hook 场景——这也是 CodeGraph 安装 git 钩子自动同步时使用的模式。
查询命令族
官方文档指出:query、callers、callees、impact 均支持 --json 输出机器可读结果:
codegraph query UserService --kind class --limit 10
codegraph callers handleRequest --json
codegraph impact AuthMiddleware --depth 3
query:符号搜索
实现要点(src/bin/codegraph.ts#L1140-L1210):
- flag:
-p, --path <path>、-l, --limit <number>(默认 10)、-k, --kind <kind>(按节点类型过滤,如 function、class)、-j, --json; - 底层调用
cg.searchNodes(SQLite FTS/BM25),返回顺序即相关度排序; - 生成文件降权:CLI 复用了 MCP 搜索的降权策略——通过
generatedFilePredicate判定 protobuf/gRPC 等脚手架生成文件,命中时排到手工实现之后(src/bin/codegraph.ts#L1165-L1173); - 人读输出不打印分数:
score是无界的 BM25 数值,仅具相对排序意义,早期版本曾渲染成12042%之类的无意义百分比;现在人读视图只按排名展示,原始score保留在--json输出中。这一点有专门测试固化:tests/cli-query-command.test.ts 验证人读输出不含任何(\d+%),而--json仍带数值型score。
explore 与 node:MCP 工具的 CLI 同体
文档明确写道:
explore和node是codegraph_explore与codegraph_nodeMCP 工具的 CLI 面——输出完全相同——使得 subagent 与非 MCP 框架也能从 shell 触达图谱。
源码印证了这一"同体"设计:explore 直接把多词参数拼成 query,然后 new ToolHandler(cg) 调用 handler.execute('codegraph_explore', args),原样打印工具返回文本(src/bin/codegraph.ts#L1221-L1251)。存在这条 CLI 面是有明确理由的:Claude Code 的 Task 工具 subagent 不继承 MCP 工具,非 MCP 框架根本看不到 MCP——shell 命令是它们触达图谱的唯一通道。
explore的 flag:-p, --path、--max-files <number>(限制携带源码的文件数)。node接受可选位置参数,支持两种模式(src/bin/codegraph.ts#L1486-L1551):- 符号模式:
codegraph node parseToken—— 该符号的源码 + 调用者/被调用者线索; - 文件模式:
codegraph node -f src/auth.ts,或位置参数本身含/、\时自动识别为文件读取(带行号 + 依赖方,与 Read 工具对齐)。flag 有--file、--offset(1 基起始行)、--limit(最大行数)、--symbols-only(仅符号表 + 依赖方)。
- 符号模式:
两者共用一条"未初始化"提示:若目录没有索引,CLI 会明确告知 AI Agent"继续用你常规的工具,索引是用户的决定,不要自行执行"(src/bin/codegraph.ts#L1231)——这是对 Agent 行为边界的内建约束。
callers / callees / impact:图遍历
三者共享同一套查询模式:searchNodes 定位符号(最多 50 个候选)→ 仅保留精确名匹配(含 .、:: 后缀的成员名)→ 在多个精确匹配上合并去重遍历结果(src/bin/codegraph.ts#L1941-L2015)。
| 命令 | flag | 默认值 | 说明 |
|---|---|---|---|
callers <symbol> |
-p, -l, --limit, -j, --json |
limit=20 | 所有调用该符号的函数/方法 |
callees <symbol> |
-p, -l, --limit, -j, --json |
limit=20 | 该符号调用的所有函数/方法 |
impact <symbol> |
-p, -d, --depth, -j, --json |
depth=2 | 变更该符号的受影响半径 |
impact 有两个值得注意的实现细节(src/bin/codegraph.ts#L2098-L2190):--depth 会被钳制到 1~10(源码 Math.min(Math.max(depth, 1), 10)),超出即被截断;人读输出按文件分组展示受影响符号,--json 则输出 { symbol, depth, nodeCount, edgeCount, affected: [...] } 结构。
files:索引内的文件结构
codegraph files 从索引(而非扫盘)读取项目文件结构,flag 全表(src/bin/codegraph.ts#L1556-L1676):
| Flag | 默认 | 说明 |
|---|---|---|
-p, --path <path> |
cwd | 项目路径 |
--filter <dir> |
— | 只显示该目录下的文件(前缀匹配) |
--pattern <glob> |
— | glob 过滤(支持 **、*、?,见 globToRegex 实现) |
--format <format> |
tree |
tree / flat / grouped(按语言分组) |
--max-depth <number> |
不限 | tree 格式的最大目录深度 |
--no-metadata |
— | 隐藏语言、符号数等元数据 |
-j, --json |
— | 输出 [{path, language, nodeCount, size}] |
status:索引健康检查
codegraph status 的人读视图包含:项目路径、git worktree 索引错配警告、索引状态机(indexing/partial/failed 分别给出"被中途杀死/静默丢文件/构建失败"的修复提示)、待解析引用数 pendingRefs(非 0 说明有被打断的 resolution 路径,提示运行 sync)、文件/节点/边计数、DB 与 WAL 体积、后端与 journal 模式、按 kind 与语言的分布、以及待同步变更。
--json 输出与之对应的结构化字段(src/bin/codegraph.ts#L986-L1025),其中 index 子对象携带 builtWithVersion、currentExtractionVersion 与 reindexRecommended——当索引由旧引擎构建、存在迁移无法回填的数据时,CLI 会明确建议重跑 codegraph index。
affected:变更驱动的测试选择
官方文档将其描述为:
沿 import 依赖传递地追踪,找出受变更源文件影响的测试文件。更多选项与 CI 示例见 Affected Tests in CI。
该指南文档给出的用法与选项表(完整继承):
codegraph affected src/utils.ts src/api.ts # 文件作为参数
git diff --name-only | codegraph affected --stdin # 从 git diff 管道
codegraph affected src/auth.ts --filter "e2e/*" # 自定义测试文件模式
| 选项 | 说明 | 默认值 |
|---|---|---|
--stdin |
从 stdin 读取文件清单 | false |
-d, --depth <n> |
最大依赖遍历深度 | 5 |
-f, --filter <glob> |
识别测试文件的自定义 glob | 自动检测 |
-j, --json |
JSON 输出 | false |
-q, --quiet |
只输出文件路径 | false |
实现上的几个要点(src/bin/codegraph.ts#L2202-L2336):
- 路径归一化:输入统一转为"项目相对 + 正斜杠"形式,
./src/x.ts、绝对路径(包装脚本常传)、Windows 反斜杠路径都能命中同一索引文件(issue #825 的修复); - 内置测试识别:无
--filter时使用默认模式集/\.spec\./、/\.test\./、/__tests__/、/tests?/、/e2e/、/spec/;--filter提供 glob 时则完全取代默认集; - BFS 遍历:从每个变更文件出发,沿
getFileDependents的依赖边广度优先搜索,深度不超过--depth;变更文件本身是测试文件时直接计入; - 输出形态:
--json返回{ changedFiles, affectedTests, totalDependentsTraversed };--quiet仅逐行打印路径——这正是为管道设计的。CI 示例(来自指南文档):
#!/usr/bin/env bash
AFFECTED=$(git diff --name-only HEAD | codegraph affected --stdin --quiet)
if [ -n "$AFFECTED" ]; then
npx vitest run $AFFECTED
fi
对应行为测试见 tests/cli-affected-paths.test.ts。
daemon、unlock 与运维命令
daemon(别名 daemons)
交互式管理后台 MCP 守护进程:列出所有已验证存活的 daemon(pid、版本、运行时长、项目根),当前项目的 daemon 置顶并预选,回车即停止;输出非 TTY 时退化为纯列表打印(src/bin/codegraph.ts#L1782-L1823)。底层依赖 src/mcp/daemon-registry.ts 的 listVerifiedDaemons / stopDaemonAt / stopAllDaemons。
unlock
删除阻塞索引的陈旧锁:先清理 .codegraph/codegraph.lock,再调用 clearStaleDaemonArtifacts 清理遗留的 daemon 注册工件;两者皆无则提示"无事可做"(src/bin/codegraph.ts#L1906-L1932)。行为测试见 tests/cli-unlock.test.ts。
telemetry
codegraph telemetry [action],action 取 status(默认)、on、off(src/bin/codegraph.ts#L2490-L2529)。status 打印当前状态及其决策来源(DO_NOT_TRACK 环境变量、CODEGRAPH_TELEMETRY 环境变量、本地配置或默认值)、机器 ID 与配置文件路径;若环境变量覆盖了你的选择,会明确警告当前实际生效状态。收集范围严格限定为匿名使用统计(子命令名,不含代码、路径、参数),详见仓库根目录 TELEMETRY.md 与 src/telemetry/index.ts。源码中还可见一个细节:init/uninit/index/sync/upgrade 这组长命令才触发遥测冲刷,快速命令只在本地缓冲,不产生额外网络开销(src/bin/codegraph.ts#L221-L233)。
upgrade
自更新命令自动检测安装方式(install.sh/.ps1 捆绑包、npm 全局、npx 或源码检出)并就地升级,逻辑位于 src/upgrade/index.ts 与 src/upgrade/update-check.ts。flag:
| Flag | 说明 |
|---|---|
--check |
只检查是否有新版本,不安装 |
-f, --force |
已是目标版本也重新安装 |
[version] |
定位到指定版本;未传时还会读取 CODEGRAPH_VERSION 环境变量 |
version
codegraph version 打印 package.json 中的版本号(当前仓库为 1.6.0,见 package.json)。由于 commander 的 version 短 flag 是大写 -V,源码在解析前拦截了小写 -v 与 -version 两种拼法(src/bin/codegraph.ts#L145-L155),三者等价,行为由 tests/cli-version.test.ts 覆盖。
运行环境约束:Node 版本硬校验
CLI 入口在加载任何重模块之前就做 Node 版本硬校验(src/bin/codegraph.ts#L82-L107):
- Node ≥ 25 被硬性阻断:V8 的 turboshaft WASM JIT 存在 Zone 分配器 bug,编译 tree-sitter 大语法时可靠地 OOM 崩溃。此前的软警告会滚出屏幕、30 秒后才是 OOM,所以现在是直接退出;
- Node < 最低版本同样阻断:
package.json的engines声明node >=20.0.0 <25.0.0,而 npm 对 engines 只告警不拦截,因此 CLI 在入口处硬阻断,让package.json的声明真正生效; - 两种情况都可用环境变量
CODEGRAPH_ALLOW_UNSAFE_NODE覆盖(适用于自行修补过 V8 或测试未来修复的用户)。
另外两个启动阶段的行为值得了解:入口第一个 import 是 early-ppid——在启动器还活着时捕获 process.ppid,防止启动中途启动器被杀导致 PPID 看门狗永久失明;随后若未设置 --liftoff-only,进程会带该 flag 重新 exec 自身,避免 tree-sitter 大 WASM 语法在 Node ≥ 22 上触发 turboshaft Zone OOM(src/bin/codegraph.ts#L109-L114)。安装器目标与 init 组合的行为(--init 一键引导)由 tests/cli-install-init.test.ts 覆盖。
CLI 与 MCP 的分工模型
把上述命令放回整体架构,CodeGraph 的双面性就清晰了:
- Agent 面(MCP):安装器把
codegraph serve --mcp写入各 Agent 配置,默认只暴露一个强工具codegraph_explore(单次调用即返回相关符号源码、调用路径与影响半径),其余 7 个工具默认不列出、可用CODEGRAPH_MCP_TOOLS白名单恢复,详见 MCP Server 文档; - 人/脚本面(CLI):
explore、node与 MCP 工具共享同一个ToolHandler,输出逐字节一致;query/callers/callees/impact/files/status则以--json支撑脚本与 CI;init/sync/index/unlock/daemon是纯粹的运维命令。
这种"CLI 是 MCP 的投影"设计,使得不跑 MCP 的 harness(subagent、纯 shell 脚本、git hook、CI 流水线)也能获得与 Agent 完全一致的图查询能力——这正是官方文档将 explore/node 单列说明的原因。
小结
- CodeGraph CLI 覆盖完整生命周期:
install/uninstall(Agent 接线)→init(一步建图)→sync/index(增量/全量)→status/unlock/daemon(运维)→query/explore/node/callers/callees/impact/files/affected(查询)→upgrade(自更新); - 记住三个关键区分:
init一步完成初始化+首建索引(旧-iflag 已无意义);index是丢弃重建而非清空重灌;sync是 watcher 失效或脚本化场景下的增量手段; explore/node与同名 MCP 工具同源同输出,是给非 MCP 环境的等价入口;- 环境要求:Node 20~24(25+ 被硬阻断,可用
CODEGRAPH_ALLOW_UNSAFE_NODE覆盖); - 进一步阅读:MCP Server 参考、Affected Tests in CI、CLI 参考原文、CLI 源码。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00