Sourcebot 跨仓库检索 + 总结
公司内 Sourcebot 实例:https://sourcebot.micoplatform.com,已通过 sourcebot MCP server 接入 Cursor。
本 skill 教 agent 如何编排 Sourcebot 工具去做"跨仓库检索 → 读源 → 总结",
而不是把它当成一个普通 grep 调一次完事。
1. 什么时候用 Sourcebot(而不是 ripgrep / Cursor 索引)
满足任意一条就走 Sourcebot:
- 用户提到"在 CodeLib / 在所有微服务 / 在 mico 全部仓库里查"
- 涉及 2 个及以上仓库,或不确定代码在哪个 repo
- 要找符号定义/引用,但目标 repo 不在当前 workspace
- 需要审计一个模式(safe-set 调用、metric 名、err code、SQL 写法)公司范围影响
- 需要跨仓库总结某个能力的实现差异(例:每个服务怎么打点 / 怎么校验 token)
只在当前 workspace 单仓内搜,且已开过该 repo → 用本地 Grep / Glob 更快,不要走 Sourcebot。
2. 工具速查(来自 sourcebot MCP)
| 用途 | 工具 | 关键参数 |
|---|---|---|
| 关键字 / 正则搜内容 | grep |
pattern(正则,大小写敏感),可加 repo / include / path / ref / limit |
| 按文件名/路径找文件 | glob |
pattern(如 **/*.proto、src/**/*.test.ts) |
| 看仓库目录树 | list_tree |
repo 必填,可设 depth(≤10) |
| 读文件 | read_file |
repo + path,可 offset/limit(单次最多 500 行) |
| 列已索引的 repo | list_repos |
query 模糊匹配;按 pushed desc 找最近活跃的 |
| 找符号定义 | find_symbol_definitions |
symbol + repo(必须指定 repo) |
| 找符号引用 | find_symbol_references |
symbol + repo(必须指定 repo) |
| 看 commit 历史 | list_commits |
repo + 可选 query/since/author |
| 比 diff | get_diff |
repo + base + head |
| 自然语言问代码库 | ask_codebase |
query + 可选 repos(agent 自行 search/read,慢但答案完整) |
Repo 名规则:必须是 fully-qualified,如 github.com/mico/mico-shorts-api,不是 mico-shorts-api。
不确定时先 list_repos {"query": "shorts"} 拿到准确名。
3. 标准检索 → 总结工作流
复制这个 checklist 到当前会话,逐步推进:
- [ ] Step 1: 拆解问题,决定 grep / glob / find_symbol / ask_codebase 哪个起手
- [ ] Step 2: 必要时先 list_repos 锁定候选仓库范围
- [ ] Step 3: 执行第一轮检索,看命中文件列表
- [ ] Step 4: 用 read_file 抽 1~3 个代表性文件的关键片段
- [ ] Step 5: 如有交叉引用需求,find_symbol_references 补一刀
- [ ] Step 6: 按"输出模板"写总结 + 引用
Step 1 — 起手工具决策树
- 用户给了字面量字符串/错误码/常量(如
"131006"、OrderStatusPaid) →grep起手,pattern走字面量,必要时加\b - 用户给了符号名且明确在哪个 repo
→
find_symbol_definitions/find_symbol_references起手 - 用户问的是**"概念性问题"**("这套 SVIP 逻辑怎么实现的?")
→
ask_codebase起手,让它自己钻;拿到答案后再read_file验证关键片段 - 用户要找特定文件类型/命名(如
**/*.proto、*Dockerfile) →glob起手
Step 2 — 收敛仓库范围(可选但推荐)
跨仓库搜会很慢/噪声大。先收敛:
// 例:只在以 mico- 开头的 repo 里搜
{"query": "mico-"}
把命中的 repo 列表记下来,后续 grep 用 repo: "github.com/.../mico-shorts-api" 精搜。
Step 3 — grep 写法
Sourcebot 的 grep 是 正则 + 大小写敏感。常用:
| 目的 | pattern 示例 |
|---|---|
| 字面量带词边界 | \\bOrderStatusPaid\\b |
| 多个候选 | (VipLevel|SvipLevel)\\. |
| 函数定义(Go) | ^func\\s+\\(\\w+\\s+\\*?\\w+\\)\\s+CheckSvip\\( |
| metric 调用 | `metrics\.(Counter\ |
辅助参数:
include: "*.go"只看 Go;include: "*.{proto,thrift}"多扩展path: "internal/svip"把范围收到子目录limit: 50(默认 100);命中爆炸时调小再细化 pattern
Step 4 — read_file 取证
不要把整个文件搬出来。命中行号 ±20 行就够:
{"repo": "github.com/mico/mico-shorts-api", "path": "internal/svip/check.go", "offset": 80, "limit": 60}
Step 5 — 交叉引用(按需)
定位一个函数后,看哪些上游调它:
{"symbol": "CheckSvipLevel", "repo": "github.com/mico/mico-shorts-api"}
注意:find_symbol_* 只在单 repo 内工作;要跨仓库追用法,对每个候选 repo 各调一次。
Step 6 — ask_codebase 的取舍
ask_codebase 后端跑一个 agent 自动 search+read,几十秒级,适合开放式总结题,
不要拿它做"找一行代码"这种小事。给的答案带 markdown 引用,可直接采纳但关键论断仍要回查 read_file 验证,
特别是版本/字段名/枚举值,避免被它幻觉出来。
4. 输出模板(给用户看)
## 结论
[1~3 句话回答用户问题,不堆代码]
## 证据
- `<repo>` `path/to/file.go:120-145` — 这里实现了 X 逻辑
- 关键点:[一句话提炼]
- `<repo>` `path/to/other.go:32` — Y 只在这里被引用
## 跨仓库差异(如适用)
| Repo | 实现方式 | 备注 |
| --- | --- | --- |
| mico-shorts-api | … | … |
| mius-game-go | … | … |
## 后续建议
- [可选] 如果要改,最小改动点:…
引用格式统一用 `<repo>` `path:startLine-endLine` 这种(Sourcebot 的 web UI 也能直接打开)。
5. 常见坑
- 大小写敏感:
grep永远是 case-sensitive。要忽略大小写就在 pattern 里写(?i)Foo。 - Repo 全名:
repo参数必须包括 host。不确定先list_repos。 - 默认分支:不指定
ref时走默认分支;要在 feature 分支上查务必传ref。 ask_codebase不是免费调用:会消耗 LLM token + 几十秒;不要并发或循环调它。read_file单次 ≤500 行:大文件分页offset/limit。- 不要让 grep 命中过万:先窄化
include/path/repo,避免被截断后误判"全公司没人用"。 - 只读:Sourcebot MCP 全部都是读类工具,不会写仓库;本 skill 也不要再去衍生写操作。
6. 一个完整示例
用户:"在 CodeLib 里查一下 SVIP 等级判断逻辑各服务有没有不一致的地方,给我一个对比"
list_repos {"query": "mico"}→ 拿到mico-shorts-api/mius-game-go/mico-payment-center等候选grep {"pattern": "\\bSvipLevel\\b", "include": "*.go", "limit": 50}全局看哪些 repo 命中- 对每个命中 repo:
find_symbol_definitions {"symbol": "CheckSvipLevel", "repo": "..."}拿到定义 read_file各自抽 30 行关键实现- 套用 §4 模板的"跨仓库差异"表回答;引用全部带
repo + path + line