关于 game-review
用于游戏代码库的只读审查技能,检查工程风险、叙事一致性和范围偏移,并按类别输出带文件位置及修复建议的问题。
主要功能
- 01读取项目计划与构建记录
- 02审查 TypeScript 工程风险
- 03检查世界设定与任务一致性
- 04发现偏离 MVP 范围的实现
- 05输出问题、修复建议及技能引用
适用场景
- 01审查身份验证或支付代码
- 02检查多人游戏状态处理
- 03核对任务与世界设定文档
- 04发现超出 MVP 计划的功能
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ fcsouza/ agent-skills --skill game-review安装后在 Claude Code 中输入/game-review确认已加载。
详细介绍
游戏审查 — 代码审计员
前置条件
- 根据检测到的代码领域应用相关的工程和设计技能(见阶段 0)
阶段 0 — 加载上下文(静默)
- 如果
docs/mvp-first-draft.md存在,则读取它(提供用于比较的架构意图) - 如果
docs/build-registry.md存在,则读取它(记录已构建与模拟实现的内容) - 根据用户消息确定范围:
- 如果提供了组件名称或路径:聚焦于
src/[component]/或指定路径 - 如果未提供:审查整个
src/
- 如果提供了组件名称或路径:聚焦于
- 扫描目标范围,识别其中包含的技术领域(身份验证、支付、WebSocket、Redis、BullMQ、任务等)
- 仅应用与检测到的领域相关的技能:
- 检测到身份验证 → 应用
betterauth-integration技能 - 检测到支付/Stripe → 应用
stripe-game-payments技能 - 检测到 WebSocket/游戏状态 → 应用
game-state-sync技能 - 检测到 Redis → 应用
redis-game-patterns技能 - 检测到 BullMQ → 应用
bullmq-game-queues技能 - 检测到任务/叙事代码 → 应用
quest-narrative-coherence技能 - 检测到数据库/Drizzle → 应用
postgres-game-schema技能 - 检测到匹配系统 → 应用
matchmaking-system技能 - 检测到分析功能 → 应用
gameplay-analytics技能
- 检测到身份验证 → 应用
阶段 1 — 工程审查
读取目标范围中的所有 TypeScript 文件。应用以下检查。对于每项发现,记录:严重级别、文件路径、行号(近似值)、描述、修复建议,以及违反的技能。
状态权威性(多人游戏/WebSocket 代码)
- 🔴 严重:任何信任客户端提供的
message.userId或message.playerId的 WebSocket 处理程序 — 必须从服务端会话中确定身份 - 🔴 严重:任何由客户端消息直接触发、未经服务端验证的游戏状态变更
- 🟡 警告:游戏循环的 Tick 频率超过 60Hz,且没有合理说明
数据库 / 架构
- 🔴 严重:在 Drizzle 的
sql标签辅助函数之外使用原始 SQL 模板字面量(sql\SELECT...``)— 必须使用 Drizzle 类型化查询构建器 - 🟡 警告:面向玩家的表(players、inventory、characters)缺少
deletedAt软删除列 - 🟡 警告:将本应放在 JSONB 中的游戏专属属性硬编码为列名(例如,将
manaPoints、fireResistance设为顶层列) - 🟢 建议:事件/日志表缺少
(playerId, type)复合索引
身份验证与会话
- 🔴 严重:任何通过读取
req.body.userId或req.query.userId来识别操作者的端点 — 必须使用auth.api.getSession()并从会话中确定身份 - 🔴 严重:验证 JWT 时未检查是否过期
- 🟡 警告:
/auth/login或/auth/signup路由没有速率限制 - 🟡 警告:将管理员/版主角色存储在 Cookie 或 JWT 声明中(每次请求都必须从数据库中获取)
支付(Stripe)
- 🔴 严重:任何在结账成功重定向(GET
/success)时触发的购买发放逻辑 — 必须由 Webhook 驱动 - 🔴 严重:Webhook 处理程序未调用
stripe.webhooks.constructEvent()来验证签名 - 🔴 严重:客户端代码中引用了 Stripe 密钥(
public/、client/、frontend/中的任何文件) - 🟡 警告:缺少对
checkout.session.completed事件的幂等性检查 — Webhook 重放可能导致奖励重复发放
作业队列(BullMQ)
- 🟡 警告:BullMQ 处理器未配置
attempts— 所有作业都应有重试策略 - 🟡 警告:BullMQ 处理器未配置
backoff— 应使用指数退避 - 🟢 建议:考虑添加
removeOnComplete和removeOnFail选项,以防止队列膨胀
Redis
- 🟡 警告:Redis 键不符合
{entity}:{id}:{field}命名约定 - 🟡 警告:Redis 中存储的会话键没有设置
EXPIRE— 临时状态必须设置 TTL - 🟢 建议:排行榜有序集合应使用
ZADD NX或GT,仅在分数提升时更新
常规安全
- 🔴 严重:在源文件中硬编码任何
.env值或机密 - 🔴 严重:使用用户输入调用
eval()或Function()构造函数 - 🟡 警告:接受用户控制数据的 API 端点缺少输入验证
Phase 2 — 叙事一致性检查
如果 docs/world-lore.md 和 docs/quest-registry.md 均不存在,则输出:
📋 叙事一致性检查:已跳过(未找到 docs/quest-registry.md — 运行 game-quest 技能以创建该文件)
然后跳到 Phase 3。
如果其中任一文件存在:
- 读取
docs/world-lore.md和docs/quest-registry.md - 扫描源文件中的任务 ID、角色名称、阵营名称和地点名称
- 检查:代码中是否有任何硬编码的任务/角色/阵营/地点字符串与世界设定中登记的信息相矛盾?
- 标记:
⚠️ 设定冲突:src/quests/main.ts 中引用了角色 "Mira",但该角色未登记在 quest-registry.md 中
Phase 3 — MVP 范围偏移检查
如果 docs/mvp-first-draft.md 不存在,则输出:
📋 范围审查:已跳过(未找到 docs/mvp-first-draft.md — 请先运行 game-architect 技能)
然后跳到 Phase 4。
- 读取
docs/mvp-first-draft.md中的第 10 节(不在范围内) - 扫描
src/,查找明确延期的功能是否已实现 - 标记:
⚠️ 范围偏移:[功能] 在 [文件] 中实现,但在 MVP 计划第 10 节中列为不在范围内
同时检查 docs/build-registry.md,查找标记为“已构建”但未出现在 MVP 构建顺序(第 9 节)中的组件——这些可能属于过度设计。
Phase 4 — 报告输出
输出结构化审查报告:
# Game Review Report
Scope: [path reviewed]
Generated: [timestamp]
## Summary
🔴 Critical: X | 🟡 Warning: Y | 🟢 Suggestion: Z
然后按类别(工程、叙事、范围)列出所有发现。对于每项发现:
### [🔴/🟡/🟢] [Title]
**File:** `src/path/to/file.ts` (line ~42)
**Issue:** [what's wrong]
**Fix:** [concrete fix description]
**Skill ref:** [→ stripe-game-payments: webhook-first fulfillment]
最后以以下内容结尾:
## Next Steps
- Fix all 🔴 CRITICAL issues before committing
- Review the [top-violation-category] skill for correct patterns
- Run the game-build skill to rebuild any component with critical violations
如果某个类别未发现问题,则输出:
### ✅ [Category] — No issues found
严格约束
- 绝不修改代码——这是只读审计命令。仅输出发现。
- 绝不报告误报——如果某种模式看似违规,但结合上下文可以接受,则跳过或降级为 🟢
- 始终链接到技能——每项发现都必须引用定义正确模式的技能
- 具体明确——每项发现都必须包含文件路径和大致行号
- 优先保证信号质量——5 个真实的严重问题比 30 条噪声建议更有价值
评论
支持 Markdown