第 06 期 | 代码库雷达:用自然语言进行 Repository 探索

更新于 2026/4/5

🎯 学习目标

学完本期你将掌握:

  1. 用自然语言替代 grep/find 进行语义化代码搜索
  2. 理解 Claude Code 如何组合 Glob + Grep + Read 进行深度探索
  3. Plan Mode 在代码审计中的实战应用

📖 核心概念讲解

6.1 传统搜索 vs 语义化搜索

维度 传统方式 Claude Code
搜索文件名 find . -name "*.tsx" Glob(**/*.tsx)
搜索内容 grep -r "TODO" src/ Grep("TODO" in src/**)
理解上下文 ❌ 只返回行号 ✅ 解释代码意图
跨文件关联 ❌ 需手动串联 ✅ 自动追踪调用链
架构理解 ❌ 需人工抽象 ✅ 生成架构图

6.2 三步探索法

  Step 1: 鸟瞰          Step 2: 定位          Step 3: 深潜
  ┌────────────┐       ┌────────────┐       ┌────────────┐
  │ "整体架构   │──────►│ "支付模块   │──────►│ "Stripe    │
  │  是怎样的?" │       │  在哪里?"   │       │  回调怎么   │
  │             │       │             │       │  处理的?"   │
  │ Tools:      │       │ Tools:      │       │ Tools:      │
  │ Glob + Read │       │ Grep + Glob │       │ Read (多文件)│
  └────────────┘       └────────────┘       └────────────┘

💻 模拟 Claude TUI 交互

场景 1:鸟瞰 — 快速了解项目全貌

$ cd ~/company-monorepo
$ claude --permission-mode plan

╭─ 🔒 Plan Mode ──────────────────────────────────────╮
│  Safe exploration — no files will be modified         │
╰──────────────────────────────────────────────────────╯

> 给我一个这个项目的完整架构概览

╭─ Claude ─────────────────────────────────────────────╮
│                                                      │
│  🔍 Tool: Glob (**/package.json)                     │
│  → Found 8 packages (monorepo)                       │
│                                                      │
│  🔍 Tool: Read (package.json)                        │
│  → Workspace root: Turborepo + pnpm                  │
│                                                      │
│  🔍 Tool: Glob (apps/**/src/index.*)                 │
│  → 3 applications found                              │
│                                                      │
│  🔍 Tool: Read (apps/web/package.json)               │
│  🔍 Tool: Read (apps/api/package.json)               │
│  🔍 Tool: Read (apps/admin/package.json)             │
│  🔍 Tool: Glob (packages/*)                          │
│                                                      │
│  ## 🏗️ 项目架构                                      │
│                                                      │
│  **类型**: Turborepo Monorepo (pnpm workspaces)      │
│                                                      │
│  **应用层 (apps/)**                                   │
│  ├── `web/`    → Next.js 14 前端 (App Router)        │
│  ├── `api/`    → Express + Prisma REST API           │
│  └── `admin/`  → Astro SSR 管理后台                   │
│                                                      │
│  **共享层 (packages/)**                               │
│  ├── `ui/`        → React 组件库 (Radix + Tailwind)  │
│  ├── `db/`        → Prisma schema + 生成客户端        │
│  ├── `config/`    → ESLint / TS 配置共享             │
│  └── `utils/`     → 公用工具函数                      │
│                                                      │
│  **技术栈**                                           │
│  • 前端: React 19 + Next.js 14 + Tailwind CSS       │
│  • 后端: Express + Prisma + PostgreSQL               │
│  • 构建: Turborepo + pnpm                            │
│  • 部署: Vercel (web) + Railway (api)                │
│                                                      │
╰──────────────────────────────────────────────────────╯

场景 2:定位 — 找到特定功能的入口

> 用户注册的逻辑在哪里?涉及哪些文件?

╭─ Claude ─────────────────────────────────────────────╮
│                                                      │
│  🔍 Tool: Grep ("register" across apps/api/src/**)  │
│  → 7 matches in 4 files                              │
│                                                      │
│  🔍 Tool: Grep ("signup" across apps/web/src/**)     │
│  → 5 matches in 3 files                              │
│                                                      │
│  🔍 Tool: Read (apps/api/src/routes/auth.ts)         │
│  🔍 Tool: Read (apps/api/src/services/user.ts)       │
│  🔍 Tool: Read (apps/web/src/app/signup/page.tsx)    │
│                                                      │
│  ## 用户注册调用链                                    │
│                                                      │
│  ```                                                 │
│  前端                          后端                   │
│  ─────                         ─────                  │
│  signup/page.tsx                                      │
│    └── useSignup() hook                               │
│        └── POST /api/auth/register                   │
│            └── routes/auth.ts:L45                    │
│                └── UserService.create()              │
│                    ├── 密码 bcrypt 加密               │
│                    ├── Prisma user.create()           │
│                    ├── 发送验证邮件                    │
│                    └── 返回 JWT token                 │
│  ```                                                 │
│                                                      │
│  **关键文件清单**:                                    │
│  1. `apps/web/src/app/signup/page.tsx` — 注册表单    │
│  2. `apps/web/src/hooks/useSignup.ts` — 前端 Hook   │
│  3. `apps/api/src/routes/auth.ts:L45` — 路由处理     │
│  4. `apps/api/src/services/user.ts` — 业务逻辑      │
│  5. `packages/db/prisma/schema.prisma` — User 模型   │
│                                                      │
╰──────────────────────────────────────────────────────╯

场景 3:深潜 — 追查具体实现细节

> 密码加密用的什么算法?salt rounds 是多少?
  验证邮件是怎么发送的?

╭─ Claude ─────────────────────────────────────────────╮
│                                                      │
│  🔍 Tool: Grep ("bcrypt" across apps/api/**)         │
│  🔍 Tool: Read (apps/api/src/services/user.ts)       │
│  🔍 Tool: Grep ("sendEmail\|mailer\|smtp"            │
│           across apps/api/**)                         │
│  🔍 Tool: Read (apps/api/src/lib/email.ts)           │
│  🔍 Tool: Read (apps/api/.env.example)               │
│                                                      │
│  ## 密码加密                                         │
│  • 算法: **bcrypt** (via `bcryptjs` 包)              │
│  • Salt rounds: **12** (定义在 user.ts:L8)           │
│  • 代码: `await bcrypt.hash(password, 12)`           │
│                                                      │
│  ## 邮件发送                                         │
│  • 服务: **Resend** (非 SMTP,使用 API 调用)         │
│  • 封装在: `apps/api/src/lib/email.ts`               │
│  • 模板: 使用 React Email (`@react-email/components`)│
│  • 环境变量: `RESEND_API_KEY` (见 .env.example)      │
│                                                      │
│  ⚠️ 注意: salt rounds=12 对生产环境合适,           │
│  但单元测试中可能导致速度慢,建议测试环境降低到 4。   │
│                                                      │
╰──────────────────────────────────────────────────────╯

💻 代码演示:探索的高效 Prompt

# 鸟瞰级别
claude -p "给我这个项目的架构概览,包括技术栈和目录结构"
claude -p "这个项目有哪些主要的数据模型?画出 ER 图的文字版"

# 定位级别
claude -p "哪个文件负责处理用户登录?"
claude -p "所有调用了 Stripe API 的文件有哪些?"
claude -p "找出所有标记了 TODO 或 FIXME 的地方"

# 深潜级别
claude -p "解释 src/middleware/rateLimit.ts 的限流算法"
claude -p "从 checkout 按钮被点击开始,追踪整个支付流程"

# 代码审计
claude -p "检查 src/api/ 下是否有 SQL 注入风险"
claude -p "审查认证模块的安全性,列出所有潜在漏洞"

🔧 涉及的 Tools

工具 探索阶段 典型用法
Glob 鸟瞰 Glob(**/*.ts) 发现项目结构
Read 深潜 Read(package.json) 读取具体文件
Grep 定位 Grep("stripe" in src/**) 全文搜索
Bash 辅助 Bash(wc -l src/**/*.ts) 统计代码量
WebFetch 外部参考 抓取第三方库文档辅助分析

📝 本期要点回顾

  1. 用自然语言探索代码库比 grep 更高效,因为 Claude 能 理解语义
  2. 遵循 鸟瞰 → 定位 → 深潜 的三层探索法
  3. Plan Mode 适合陌生代码库的安全探索(零风险)
  4. Claude 会自动组合多个搜索工具,追踪跨文件的调用链
  5. Print Mode (-p) 可以快速输出分析结果到终端

🔗 参考资料