# Sourcebot Search

> Explicitly-invoked skill for searching and summarizing code across repositories via the Sourcebot MCP server (sourcebot.micoplatform.com). Load ONLY when the user explicitly names Sourcebot — e.g. 用 sourcebot / 使用 sourcebot / 走 sourcebot / sourcebot 一下 / via sourcebot / use sourcebot / ask sourcebot — or when a rule routes here on those triggers. Do NOT auto-load from ambient phrases like "跨仓库 / 在 CodeLib 里 / 多个项目"; in those cases keep using local Grep/Read unless the user opts in. Picks the right Sourcebot tool (grep / glob / list_tree / read_file / find_symbol_definitions / find_symbol_references / get_diff / list_commits / ask_codebase) and produces a concise answer with linked code references.

- Skill: `bubu4me/sourcebot-search` (Agent Skill)
- Install (CLI): `npx skillmds@latest add bubu4me/sourcebot-search`
- Raw SKILL.md: https://api.skillmd.com/api/skills/bubu4me/sourcebot-search/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: bubu4me (https://skillmd.com/u/bubu4me)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/bubu4me/sourcebot-search

---


# 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 — 收敛仓库范围（可选但推荐）

跨仓库搜会很慢/噪声大。先收敛：

```json
// 例：只在以 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\\|Histogram)\\(\\"order_` |

辅助参数：

- `include: "*.go"` 只看 Go；`include: "*.{proto,thrift}"` 多扩展
- `path: "internal/svip"` 把范围收到子目录
- `limit: 50`（默认 100）；命中爆炸时调小再细化 pattern

### Step 4 — read_file 取证

不要把整个文件搬出来。命中行号 ±20 行就够：

```json
{"repo": "github.com/mico/mico-shorts-api", "path": "internal/svip/check.go", "offset": 80, "limit": 60}
```

### Step 5 — 交叉引用（按需）

定位一个函数后，看哪些上游调它：

```json
{"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. 输出模板（给用户看）

```markdown
## 结论
[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. 常见坑

1. **大小写敏感**：`grep` 永远是 case-sensitive。要忽略大小写就在 pattern 里写 `(?i)Foo`。
2. **Repo 全名**：`repo` 参数必须包括 host。不确定先 `list_repos`。
3. **默认分支**：不指定 `ref` 时走默认分支；要在 feature 分支上查务必传 `ref`。
4. **`ask_codebase` 不是免费调用**：会消耗 LLM token + 几十秒；**不要并发或循环调它**。
5. **`read_file` 单次 ≤500 行**：大文件分页 `offset`/`limit`。
6. **不要让 grep 命中过万**：先窄化 `include` / `path` / `repo`，避免被截断后误判"全公司没人用"。
7. **只读**：Sourcebot MCP 全部都是读类工具，不会写仓库；本 skill 也不要再去衍生写操作。

## 6. 一个完整示例

> 用户："在 CodeLib 里查一下 SVIP 等级判断逻辑各服务有没有不一致的地方，给我一个对比"

1. `list_repos {"query": "mico"}` → 拿到 `mico-shorts-api` / `mius-game-go` / `mico-payment-center` 等候选
2. `grep {"pattern": "\\bSvipLevel\\b", "include": "*.go", "limit": 50}` 全局看哪些 repo 命中
3. 对每个命中 repo：`find_symbol_definitions {"symbol": "CheckSvipLevel", "repo": "..."}` 拿到定义
4. `read_file` 各自抽 30 行关键实现
5. 套用 §4 模板的"跨仓库差异"表回答；引用全部带 `repo + path + line`

