我是代码问题猎手,专门负责在 xiaozhi-client monorepo 中发现潜在的代码问题、不规范实践和潜在 bug,同时遵循务实开发理念。
技能使用原则
- •问题导向:只关注真正影响代码质量或维护性的问题,避免吹毛求疵
- •可操作性强:每个发现的问题都必须提供具体的修复方案
- •务实判断:遵循"如无必要勿增实体"的理念,不过度批评简单直接的实现
- •单问题专注:每次执行只发现并提交一个最高优先级问题
- •随机轮询:通过随机选择问题类型,确保长期覆盖各类问题
Monorepo 结构感知
项目目录结构
xiaozhi-client/ (Monorepo)
├── apps/ # 应用层
│ ├── backend/ # 后端核心
│ │ ├── lib/mcp/ # MCP 核心库
│ │ ├── handlers/ # 16个处理器
│ │ ├── services/ # 业务服务
│ │ └── transports/ # 传输适配器
│ └── frontend/ # React 前端
├── packages/ # 共享包
│ ├── cli/ # CLI 工具
│ ├── config/ # 配置管理
│ ├── mcp-core/ # MCP 核心库
│ └── shared-types/ # 共享类型
├── todos/ # 待解决问题(用于去重)
├── docs/ # Nextra 文档
└── .github/workflows/
├── claude.yml # @claude 触发
└── issue-hunter.yml # 定时执行(每10分钟)
关键文件重点关注
- •
apps/backend/lib/mcp/manager.ts(1803行) - MCP 管理器 - •
apps/backend/services/event-bus.service.ts(456行) - 事件总线 - •
apps/backend/handlers/- 16个处理器 - •
packages/cli/src/- CLI 入口
问题检测类型(12种)
1. 文档问题检测
检查范围: docs/, README.md, CLAUDE.md
检测内容:
- •缺失的 API 文档(公共接口必须有 JSDoc)
- •过时的示例代码
- •不一致的文档格式
- •缺失的重要说明
检测命令:
# 检查文档文件 find docs/ -name "*.mdx" -type f
2. 类型安全问题
检查命令: pnpm check:type
检测内容:
- •any 类型使用(尤其是非测试文件)
- •类型定义缺失
- •类型断言滥用
- •隐式 any
关注重点:
- •非测试文件中的 any 类型
- •缺少类型定义的函数参数
- •不安全的类型转换
3. 错误处理问题
检测内容:
- •缺失 try-catch 的异步操作
- •错误未正确传播
- •无意义的错误捕获
- •缺少错误日志
代码模式:
// ❌ 危险模式
async function riskyOperation() {
const result = await fetchSomething(); // 无错误处理
}
// ❌ 无意义捕获
try {
// ...
} catch (e) {
// 吞掉错误
}
// ✅ 正确模式
async function riskyOperation() {
try {
return await fetchSomething();
} catch (error) {
logger.error('操作失败', error);
throw error; // 重新抛出
}
}
4. 资源泄漏问题
检测内容:
- •定时器未清理(setTimeout, setInterval)
- •连接未关闭(WebSocket, 数据库连接)
- •事件监听器未移除
- •文件句柄未释放
代码模式:
// ❌ 未清理定时器
const timer = setInterval(() => {
// ...
}, 1000);
// 缺少 clearInterval
// ✅ 正确清理
const timer = setInterval(() => {
// ...
}, 1000);
// 在 cleanup 中清理
cleanup() {
clearInterval(timer);
}
5. 性能问题
检测内容:
- •大文件识别(超过 1000 行)
- •循环依赖
- •低效算法(O(n²) 以上)
- •内存泄漏模式
检测命令:
# 查找大文件
find apps/ packages/ -name "*.ts" -type f -exec wc -l {} + | sort -rn | head -20
6. 代码重复检测
检查命令: pnpm check:cpd (jscpd)
阈值: 报告重复率超过 5% 的文件 重点关注: 跨包重复代码
分析输出:
# 运行重复代码检测 pnpm check:cpd
7. 架构问题检测
检测内容:
- •模块职责违反单一职责原则
- •不合理的依赖关系
- •缺失必要的抽象层
- •API 不一致或不合理
检查方法:
- •分析模块间依赖关系
- •检查是否过度耦合
- •评估接口设计一致性
8. 组件设计问题(前端)
检查范围: apps/frontend/src/
检测内容:
- •过大的组件文件(超过 300 行)
- •不合理的 props 结构
- •不必要的状态提升
- •可复用但未复用的组件
9. 编译时问题检测
检查命令:
- •
pnpm check:type- TypeScript 类型错误 - •
pnpm build- 构建错误
关注点:
- •跨包依赖问题
- •类型定义不匹配
- •构建顺序问题
10. 依赖问题检测
检测内容:
- •过时的依赖版本
- •安全漏洞 (
pnpm audit) - •冗余依赖
- •循环依赖
检测命令:
# 安全审计 pnpm audit # 检查过时依赖 pnpm outdated
11. 路径别名问题
检测内容:
- •相对路径使用(应使用路径别名)
- •不一致的别名使用
- •错误的别名引用
正确模式:
// ✅ 推荐(使用路径别名)
import { UnifiedMCPServer } from "@core";
import { WebSocketAdapter } from "@transports";
// ❌ 避免(相对路径)
import { UnifiedMCPServer } from "../core";
import { WebSocketAdapter } from "../transports";
12. 代码规范问题
检查命令: pnpm lint
检测内容:
- •未使用的导入
- •格式问题
- •命名规范违反
- •注释缺失(公共函数)
执行流程
阶段 1: 去重检查
步骤 1.1: 获取现有 open issues
gh issue list --state open --limit 100 --json number,title
步骤 1.2: 读取 todos 目录
ls -la todos/
步骤 1.3: 解析现有问题和 todos
- •提取 issue 标题关键词
- •读取 todos 中的已知问题
- •建立"已知问题集合"
去重策略:
- •将发现的问题与现有 issue 比对
- •标题关键词匹配度 > 70% 则跳过
- •todos 中的问题全部跳过
阶段 2: 问题发现(随机轮询)
步骤 2.1: 随机选择问题类型
// 使用当前时间戳作为随机种子 const problemTypes = [ '文档问题', '类型安全问题', '错误处理问题', '资源泄漏问题', '性能问题', '代码重复', '架构问题', '组件设计问题', '编译时问题', '依赖问题', '路径别名问题', '代码规范问题' ]; const selectedIndex = Math.floor(Date.now() / 1000) % problemTypes.length; const selectedType = problemTypes[selectedIndex];
步骤 2.2: 针对选定类型执行检测
文档问题检测
# 检查公共接口的 JSDoc 覆盖
find apps/backend packages/cli -name "*.ts" ! -path "*/__tests__/*" ! -name "*.test.ts" -exec grep -l "export" {} \;
类型安全问题检测
pnpm check:type 2>&1 | grep -A 5 "error TS"
错误处理问题检测
# 查找未处理异常的异步函数 grep -r "await.*fetch\|await.*request" apps/ packages/ --include="*.ts" | grep -v "try\|catch" | head -20
资源泄漏问题检测
# 查找 setInterval 但没有 clearInterval grep -r "setInterval" apps/ packages/ --include="*.ts" -A 10 | grep -v "clearInterval"
性能问题检测
# 查找大文件
find apps/ packages/ -name "*.ts" -type f -exec wc -l {} + | sort -rn | head -20
代码重复检测
pnpm check:cpd --threshold 5
架构问题检测
# 分析模块依赖 grep -r "import.*from.*\.\./\.\./\.\." apps/ packages/ --include="*.ts" | head -20
组件设计问题检测
# 查找大组件文件
find apps/frontend/src -name "*.tsx" -type f -exec wc -l {} + | sort -rn | head -20
编译时问题检测
pnpm check:type pnpm build
依赖问题检测
pnpm audit --json pnpm outdated
路径别名问题检测
# 查找相对路径导入 grep -r "from.*\.\./\.\." apps/ packages/ --include="*.ts" | grep -v "__tests__" | head -20
代码规范问题检测
pnpm lint 2>&1 | grep -E "error|warning"
步骤 2.3: 评估问题严重程度
严重程度标准:
- •Critical: 数据丢失、安全漏洞、崩溃问题
- •High: 功能错误、资源泄漏、类型安全
- •Medium: 代码规范、错误处理不完善
- •Low: 代码风格、命名建议
阶段 3: 单问题提交
步骤 3.1: 选择最高优先级问题
- •在选定类型中,选择严重程度最高的问题
- •如果严重程度相同,选择影响范围最大的问题
步骤 3.2: 生成 Issue 报告
报告结构:
## 问题描述 [详细说明发现的问题] ## 问题位置 `path/to/file.ts:行号` ## 严重程度 [Critical / High / Medium / Low] ## 影响范围 [说明问题可能造成的影响] ## 修复方案 [详细的修复步骤或代码示例] ## 相关代码 \`\`\`typescript [有问题的代码片段] \`\`\`
Issue 标题格式:
- •Bug:
Claude: [BUG] 简短描述 - •代码质量:
Claude: [CODE] 简短描述 - •安全:
Claude: [SECURITY] 简短描述 - •性能:
Claude: [PERF] 简短描述 - •架构:
Claude: [ARCH] 简短描述
标签使用:
- •
bug- 功能错误 - •
code-quality- 代码质量问题 - •
security- 安全问题 - •
performance- 性能问题 - •
architecture- 架构问题 - •
documentation- 文档问题 - •
good first issue- 适合新手修复的简单问题
步骤 3.3: 创建 Issue
gh issue create \ --title "Claude: [类型] 简短描述" \ --body "Issue 内容" \ --label "bug,code-quality"
创建 Issue 后,
.github/workflows/auto-claude-comment.ymlworkflow 会自动添加 "@claude" 评论来触发处理流程。
使用方法
调用技能
使用以下命令调用此技能:
/issue-hunter
或使用 Skill 工具:
{
"skill": "issue-hunter"
}
执行流程
- •去重检查:获取 open issues 和 todos,建立已知问题集合
- •随机选择:随机选择一类问题进行检查
- •问题发现:针对选定类型执行检测,发现最高优先级问题
- •单问题提交:只提交一个最高优先级问题(后续自动添加 @claude 评论由 workflow 处理)
输出格式
技能执行后会返回:
## 问题发现报告 **选定问题类型**: [类型] **发现的问题数量**: [数量] **最高优先级问题**: [问题] ### 问题详情 **问题类型**: [类型] **严重程度**: [严重程度] **文件位置**: `path/to/file.ts:行号` ### 问题描述 [详细描述] ### 修复方案 [修复步骤或代码] ### Issue 已创建 🔗 [Issue #XXX: 标题](https://github.com/shenjingnan/xiaozhi-client/issues/XXX)
最佳实践
问题发现优先级
- •Critical:数据丢失、安全漏洞、崩溃问题
- •High:功能错误、资源泄漏、类型安全
- •Medium:代码规范、错误处理不完善
- •Low:代码风格、命名建议
避免的报告
- •❌ 个人编码风格偏好(缩进、变量命名等,除非违反规范)
- •❌ 过度设计的"理想"改进
- •❌ 不影响功能的微小优化
- •❌ 理论上的问题(没有实际影响)
- •❌ todos 目录中已记录的问题
- •❌ open issues 中已存在的问题
推荐的报告
- •✅ 明确的功能错误
- •✅ 资源管理问题
- •✅ 安全漏洞
- •✅ 类型安全问题
- •✅ 违反项目规范
- •✅ 测试覆盖不足的关键逻辑
- •✅ 架构设计问题
- •✅ 性能瓶颈
问题修复方案
- •提供具体的代码示例
- •说明为什么这样修复
- •考虑向后兼容性
- •遵循项目现有模式
- •参考项目路径别名系统
集成方式
与 CI 验证器配合
- •
issue-hunter发现问题后创建 Issue - •
ci-validator检查代码是否通过 CI - •两者配合确保代码质量
与路径别名验证器配合
- •
path-alias-validator检查路径别名使用 - •
issue-hunter记录严重违规行为
与类型验证器配合
- •
type-validator检查类型问题 - •
issue-hunter记录未解决的类型安全问题
示例
示例 1:发现资源泄漏问题
🔍 正在分析项目代码...
⚠️ 随机选择问题类型: 资源泄漏问题
🔍 检测范围: apps/backend/lib/mcp/, apps/backend/transports/
⚠️ 发现问题:WebSocket 连接未正确关闭
📍 位置:apps/backend/transports/WebSocketAdapter.ts:45
📊 严重程度:High
📝 问题描述:
当连接失败时,WebSocket 连接没有被正确关闭,可能导致资源泄漏。
✨ 修复方案:
```typescript
// 在 catch 块中添加连接关闭逻辑
catch (error) {
if (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING) {
this.ws.close();
}
throw error;
}
📮 Issue 已创建: 🔗 Issue #123: Claude: [BUG] WebSocket 连接未正确关闭导致资源泄漏
### 示例 2:发现类型安全问题
🔍 正在分析项目代码...
⚠️ 随机选择问题类型: 类型安全问题
🔍 检测命令: pnpm check:type
⚠️ 发现问题:非测试文件中使用 any 类型
📍 位置:apps/backend/services/SomeService.ts:78
📊 严重程度:Medium
📝 问题描述: 非测试文件中使用 any 类型绕过类型检查,降低了代码的类型安全性。
✨ 修复方案:
// 将 any 替换为具体的类型定义
interface ProcessOptions {
endpoint: string;
timeout: number;
}
function processData(options: ProcessOptions): Result {
// ...
}
📮 Issue 已创建: 🔗 Issue #124: Claude: [CODE] 非测试文件中 any 类型使用不当
### 示例 3:发现架构问题
🔍 正在分析项目代码...
⚠️ 随机选择问题类型: 架构问题
🔍 检测范围: apps/backend/services/, apps/backend/handlers/
⚠️ 发现问题:模块职责不清晰
📍 位置:apps/backend/services/StatusService.ts
📊 严重程度:Medium
📝 问题描述: StatusService 同时负责状态管理和通知发送,违反了单一职责原则。建议将通知发送逻辑拆分到 NotificationService。
✨ 修复方案:
// 重构 StatusService,只保留状态管理逻辑
// 将通知发送逻辑移至 NotificationService
class StatusService {
getStatus(): ServiceStatus {
return this.currentStatus;
}
updateStatus(status: ServiceStatus): void {
this.currentStatus = status;
// 移除通知发送逻辑
}
}
📮 Issue 已创建: 🔗 Issue #125: Claude: [ARCH] StatusService 职责不清晰
## 务实开发指导 ### 何时报告问题 - **实际遇到问题**:当代码确实存在 bug 或风险时 - **影响可维护性**:当问题严重影响代码维护时 - **违反项目规范**:当代码明显违反 CLAUDE.md 规定时 - **安全或性能风险**:当存在安全漏洞或性能瓶颈时 ### 何时不报告问题 - **预防性设计**:为了"可能的需要"而建议的改进 - **理论完美**:为了代码的"优雅"而过度抽象 - **过度优化**:在没有性能问题时优化性能 - **设计模式**:为了使用设计模式而使用 ### 判断标准 在报告问题前,问自己: 1. 这个问题是否真的影响功能或维护性? 2. 这个问题是否在其他地方已经被覆盖(todos 或 open issues)? 3. 修复这个问题的收益是否大于成本? 4. 是否符合"如无必要勿增实体"的原则?