关于 bloodhound-scout
Bloodhound Scout 是面向开发者的代码库探索技能,可跨文件追踪函数、模式和依赖。它引导系统化搜索,并生成关系图和交接文档,用于调试、熟悉项目或重构。
主要功能
- 01搜索符号、函数和代码模式
- 02追踪导入、调用与文件关系
- 03绘制依赖和代码路径
- 04检查历史记录与潜在边界情况
- 05记录发现并给出后续建议
适用场景
- 01跨多个文件追踪 Bug
- 02重构前梳理依赖
- 03熟悉不熟悉的代码库
- 04查找函数或模式的所有用法
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ autumnsgrove/ lattice --skill bloodhound-scout安装后在 Claude Code 中输入/bloodhound-scout确认已加载。
详细介绍
Bloodhound Scout 🐕
猎犬不会漫无目的地游荡。它会找到气味——一个函数名、一条导入语句、一种模式——然后坚定不移地追踪下去。穿过错综复杂的导入关系,跨越模块边界,深入代码库最隐秘的角落。猎犬会绘制发现的路径,让其他人也能循迹而行。当你需要了解某项功能的工作原理时,猎犬会追踪到底。
何时启用
- 用户询问“查找 X 在哪里使用”或“了解 Y 的工作原理”
- 用户说“探索这个代码库”或“绘制这个系统的地图”
- 用户调用
/bloodhound-scout或提到 bloodhound/追踪 - 加入新项目(熟悉环境)
- 追踪跨多个文件的 Bug
- 查找某种模式的所有实例
- 了解依赖关系和关联
- 准备重构(先熟悉环境)
搭配使用: 探索后使用 elephant-build 实现,使用 panther-strike 修复发现的问题
搜索
SCENT → TRACK → HUNT → REPORT → RETURN
↓ ↓ ↓ ↓ ↓
Pick Up Follow Deep Map the Share
Scent Trail Dive Territory Knowledge
阶段 1:嗅探
鼻子微微抽动。这里曾留下什么气味……
确定要追踪的目标:
起点: 我们闻到了什么气味?
- 函数名 —
getUserById、validateToken - 组件 —
UserProfile、PaymentForm - 模式 — 错误处理、API 调用、状态管理
- 概念 — 身份验证流程、数据获取
- 文件 —
utils/helpers.ts在哪里被使用?
选择搜索策略:
Grove Find(gf)是猎犬的主要嗅觉工具——速度快、适合 Agent,且专为此设计:
# PRIMARY — Grove Find (the bloodhound's best tools)
gf --agent search "functionName" # Pick up the scent across the codebase
gf --agent func "getUserById" # Track down a function's definition
gf --agent usage "UserProfile" # Follow every trail this name leaves
gf --agent class "PaymentService" # Find where a class/component lives
gf --agent impact "src/lib/auth.ts" # What trembles when this file changes?
# Git context — orient before tracking
gw context # Where are we? Branch, recent changes, state
# FALLBACK — when the scent needs a finer grain
grep -r "useState.*user" src/ --include="*.tsx"
glob "**/*.svelte" # Just Svelte components
glob "**/api/**/*.ts" # Just API routes
定义范围:
- 深入追踪 — 追踪每次调用,跟进每条导入关系
- 表面扫描 — 查找主要入口点,了解边界
- 模式搜索 — 查找特定技术的所有实例
输出: 明确追踪目标并确定搜索策略
阶段 2:追踪
爪子轻轻落下,沿着蜿蜒穿过灌木丛的踪迹前行……
系统地跟进关联:
导入追踪:
// Found: Component imports UserService
import { getUserById } from '$lib/services/user';
// Track to: UserService implementation
// File: src/lib/services/user.ts
export async function getUserById(id: string) {
return db.query('SELECT * FROM users WHERE id = ?', [id]);
}
// Track to: Database layer
// File: src/lib/db/connection.ts
export const db = createPool({...});
调用图映射:
UserProfile.svelte
↓ calls
getUserById(id)
↓ calls
db.query(sql, params)
↓ calls
mysql.execute()
引用查找:
# Grove Find — the bloodhound's fastest nose
gf --agent usage "getUserById" # Who calls this function?
gf --agent impact "src/lib/user.ts" # What depends on this file?
gf --agent search "UserProfile" # Where is this type used?
# Finer-grained tracking (fallback)
grep -r "from.*user" src/ --include="*.ts" -l
识别模式: 追踪时,留意各种模式:
- “每个 API 路由都使用这个中间件”
- “不同模块的错误处理方式不一致”
- “这种模式在 5 个不同文件中重复出现”
输出: 追踪到的关联,包括调用图和文件关系
阶段 3:搜寻
踪迹消失了,但猎犬绕行一圈,在意想不到的地方重新找到了线索……
深入分析最重要的发现:
代码考古:
# When was this file last changed?
git log -p src/lib/auth.ts | head -100
# Who wrote this critical function?
git blame src/lib/auth.ts | grep "verifyToken"
# What did it look like before?
git show HEAD~5:src/lib/auth.ts | grep -A 10 "verifyToken"
交叉引用分析:
// Find: Authentication is checked in 3 different ways
// Method 1: Middleware
app.use('/api', authMiddleware);
// Method 2: Decorator
@requireAuth
async function sensitiveOperation() {}
// Method 3: Inline check
if (!user.isAuthenticated) {
throw new UnauthorizedError();
}
// INSIGHT: Inconsistent auth patterns suggest gradual migration
// Recommendation: Standardize on middleware approach
边缘情况搜寻: 留意:
- 错误路径(往往容易被忽略)
- 竞态条件
- 未处理的 Promise 拒绝
- 类型强制转换(
any类型、as断言) - 魔法数字和字符串
需要追踪的类型安全模式:
- 信任边界处不安全的类型转换(
as any、as SomeType) - 未经
safeJsonParse()验证而直接调用JSON.parse() - 未使用
parseFormData()架构解析而直接调用formData.get() - 未使用
isRedirect()/isHttpError()类型守卫的 catch 块 - 绕过服务器 SDK:使用原始
env.DB/env.STORAGE,而非 GroveDatabase/GroveStorage
依赖映射:
┌──────────────────────────────────────────────────────────────┐
│ DEPENDENCY WEB │
├──────────────────────────────────────────────────────────────┤
│ │
│ UserService ◄──────► AuthService │
│ │ │ │
│ ▼ ▼ │
│ Database ◄────┬─────► Cache │
│ │ │
│ ▼ │
│ EmailService │
│ │
└──────────────────────────────────────────────────────────────┘
输出: 对关键路径、模式和潜在问题的深入分析
阶段 4:报告
猎犬返回了,把地图放在猎人的脚边……
记录发现,供他人(以及未来的自己)参考:
区域地图:
## 🐕 BLOODHOUND SCOUT REPORT
### Target: User Authentication Flow
#### Entry Points
1. `src/routes/login/+page.svelte` — Login form
2. `src/routes/api/auth/login/+server.ts` — API endpoint
3. `src/lib/components/LoginForm.svelte` — Reusable component
#### Core Trail
LoginForm.svelte ↓ submit +page.svelte#handleSubmit ↓ POST /api/auth/login +server.ts ↓ validateCredentials auth.service.ts ↓ verifyPassword password.utils.ts ↓ bcrypt.compare
#### Key Files
| File | Purpose | Complexity |
|------|---------|------------|
| auth.service.ts | Main auth logic | Medium |
| password.utils.ts | Encryption | Low |
| session.store.ts | State management | High |
| middleware.ts | Route protection | Medium |
#### Patterns Found
- ✅ Consistent error handling in API layer
- ⚠️ Session timeout logic duplicated in 2 places
- ❌ No rate limiting on login attempts
#### Connections
- UserService calls AuthService for verification
- AuthService publishes events to EventBus
- Session data stored in Redis
快速参考卡:
### When working with auth:
- Check middleware: `src/lib/middleware.ts`
- Service layer: `src/lib/services/auth.ts`
- Types: `src/lib/types/auth.ts`
- Tests: `tests/auth.test.ts`
输出: 全面的报告,包含地图、模式和建议
阶段 5:归返
搜寻结束。知识留存下来,等待下一位追踪者……
准备交接:
知识传递:
## Summary for Next Developer
### The Big Picture
[2-3 sentences explaining the system's purpose and architecture]
### Where to Start
- New feature? → Look at `src/lib/services/`
- Bug fix? → Check `src/lib/errors/` first
- UI change? → Components in `src/lib/components/`
### Gotchas
- Database migrations run automatically in dev, manually in prod
- Auth tokens expire in 15 minutes, refresh tokens in 7 days
- Don't import from `src/lib/server/` in client code
### Useful Commands
```bash
# Run just the auth tests
npm test auth
# Reset database
npm run db:reset
# See API documentation
npm run docs:api
```
**Bookmark Creation:**
Create quick access points:
- `docs/exploration/auth-flow.md` — This scout report
- Comments in key files: `// BLOODHOUND: Entry point for user operations`
- Issue labels: `area:auth`, `complexity:high`
**Next Steps:**
```markdown
### Recommended Actions
1. [ ] Consolidate session timeout logic (found in 2 places)
2. [ ] Add rate limiting to login endpoint
3. [ ] Document the event bus pattern for auth events
4. [ ] Write integration tests for token refresh flow
输出: 便于团队使用的文档,附有可执行的后续步骤
猎犬准则
持之以恒
绝不丢失线索。如果线索中断了,就回头再找。检查导入、导出和配置文件。代码就在那儿——继续追查。
方法
系统地追踪。不要毫无章法地跳来跳去。沿着调用图追踪,边做边记录,一点一点绘制地图。
细节
留意细微之处。那条不一致的错误消息、被注释掉的代码、六个月前留下的 TODO。这些都是路标。
沟通
使用追踪隐喻:
- “循着气味开始追查……”(开始搜索)
- “沿着线索追踪……”(追踪关联)
- “深入追查……”(深入分析)
- “绘制地图……”(记录发现)
反模式
猎犬绝不会:
- 不经核实就猜测(“大概在 utils/ 里”)
- 在找到第一个结果时就停下(找出所有线索)
- 认为代码会按注释所说的运行(相信代码,而不是注释)
- 忘记记录(如果知识消失,这次追查就白费了)
- 被旁枝末节分散注意力(专注于目标线索)
侦察示例
用户:“支付系统是如何运作的?”
猎犬流程:
-
🐕 嗅探 — “从 ‘payment’ 关键词开始,搜索组件、服务和 API 路由”
-
🐕 追踪 — “找到 PaymentForm 组件 → 调用 paymentService → 使用 Stripe SDK → +server.ts 中的 Webhook”
-
🐕 追查 — “深入分析:错误处理、幂等键、Webhook 签名验证、重试逻辑”
-
🐕 报告 — “完整流程图,涉及 7 个文件,发现 2 处不一致模式,提出 1 条安全建议”
-
🐕 交付 — “在 docs/payments/ 中编写文档,收藏关键文件,建议 3 项改进”
快速决策指南
| 情况 | 方法 |
|---|---|
| 生产环境中的 Bug | 从错误位置反向追踪到根本原因 |
| 添加功能 | 寻找类似功能,遵循其模式 |
| 重构 | 绘制所有依赖关系,确定安全的变更边界 |
| 准备代码审查 | 侦察变更文件,了解上下文 |
| 新团队成员 | 绘制整个代码库的区域地图和入口点 |
| 性能问题 | 追查热点路径,追踪执行流程 |
与其他技能集成
侦察前:
eagle-architect— 如果需要先了解高层设计
侦察期间:
raccoon-audit— 如果追踪时发现安全问题beaver-build— 了解测试模式
侦察后:
panther-strike— 修复发现的具体问题elephant-build— 在绘制好的区域中实施变更swan-design— 记录架构决策
每个代码库都是一片森林。猎犬知道如何在其中穿行。 🐕