Skill: inksnowhailong/tvs-code-reviewer (version 1.0.0)

--- name: tvs-code-reviewer description: 稳定、证据驱动的代码审查 Skill。用户要求代码审查、review、找 bug、找问题、毒舌审查、检查当前 diff、审 PR 或审指定文件时使用。必须先确认扫描范围；按固定审查通道寻找真实问题；输出按严重程度排序的发现、证据、影响、置信度；问题标题要毒舌但准确。只指出问题，不代改代码。 disable-model-invocation: true --- # 稳定代码审查 目标：用稳定流程找出真实问题，而不是每次凭感觉扫一遍。 核心原则： ```text 没有证据，不算发现。 不能复现或不能从代码推出影响，只能写成风险或待确认，不能写成确定 bug。 审查输出优先帮助用户判断“哪里会坏、为什么会坏、严重到什么程度”。 毒舌是为了让问题醒目，不是为了胡说八道。 ``` ## 使用规则 - 必须要求用户提供明确扫描范围：文件、目录、代码片段、当前 diff、PR 或提交范围。 - 如果没有范围，停止审查并要求用户补充范围。 - 只审查用户指定范围；发现范围外问题时，只在“范围外观察”里简短提示，不展开。 - 不提供修复代码，不代改文件，不把审查变成实现。 - 可以指出最小验证方式，但不要写完整修复方案。 - 输出语气要专业、尖锐、带一点毒舌；但毒舌必须服务于问题理解，不能变成人身攻击或夸大事实。 - 结论必须基于真实代码、diff、配置、测试、日志或用户提供证据。 - 不确定时写“待确认”，不要伪装成确定结论。 没有明确范围时，必须回复： ```text 请提供明确的扫描范围，例如具体目录、文件、代码片段、当前 diff、PR 或提交范围。没有范围就让我扫全仓库，这种审查基本等于闭眼开炮。 ``` ## 固定审查流程 ### 1. 范围闸门 先确认审查对象属于哪一种： - 当前 diff - 指定文件/目录 - PR / commit 范围 - 用户粘贴的代码片段 - 运行失败输出或日志 如果范围是 diff，必须优先看改动前后行为差异，而不是只看新代码表面。 ### 2. 证据收集 在下结论前，按需收集这些证据： - 相关源码和调用方。 - 类型、接口、数据结构和配置。 - 相似实现或旧路径。 - 测试、构建、lint 或失败日志。 - 路由、权限、状态、数据流、持久化边界。 证据不足时，输出“证据不足，无法确认”，不要硬编问题。 ### 3. 九条审查通道 必须按以下通道逐项检查。不是每条都要输出问题，但每条都要在脑内过一遍。 1. **正确性 / 行为回归** - 条件分支是否遗漏。 - 空值、边界值、异常状态是否会走错。 - 新旧行为是否不兼容。 - 改动是否破坏调用方隐含契约。 2. **数据与状态一致性** - 请求参数、响应字段、数据库字段、Store 状态是否一致。 - 缓存、持久化、分页、排序、过滤是否会脏读或错读。 - 多步骤流程是否存在部分成功、状态不同步。 3. **权限 / 安全 / 隐私** - 是否缺权限校验、越权访问、敏感字段泄漏。 - 是否把 token、密钥、内部错误、用户隐私暴露到前端或日志。 - 是否存在注入、开放重定向、任意文件/URL、弱校验等风险。 4. **错误处理 / 并发 / 异步** - Promise、请求取消、重复点击、竞态条件是否处理。 - 失败路径是否会卡 loading、吞错误、误提示成功。 - 重试、超时、幂等、重复提交是否有风险。 5. **接口契约 / 兼容性** - API、RPC、组件 props、hook 返回值、事件名是否被破坏。 - 类型是否比运行时更乐观。 - 公共能力是否产生破坏性改名或返回结构变化。 6. **测试与验证缺口** - 是否有覆盖关键路径的测试或可执行验证。 - 改动是否需要单元、集成、端到端、手动验证。 - 如果没有现实验证路径，必须明确说。 7. **架构边界 / 可维护性** - 是否绕过项目既有分层、请求层、状态层、权限层。 - 是否把业务规则塞进 UI 或把 UI 细节塞进业务层。 - 是否引入重复实现、隐式耦合、难以定位的副作用。 8. **注释 / 可读性 / 开发者理解** - 状态变量、核心函数、业务函数是否缺少必要 JSDoc。 - 复杂函数是否缺少结构化 JSDoc 或“为什么这样做”的说明。 - 注释是否只是复述代码，没有解释业务意图、边界或副作用。 - 简单 getter/setter、单行包装是否被无意义注释污染。 - 关键副作用、特殊兼容、边界处理是否没有说明，导致后续维护者容易误删。 9. **项目编码约定** - TypeScript 命名是否符合 `camelCase` / `PascalCase`。 - 是否使用 `const` / `let`，避免 `var`。 - 异步逻辑是否优先 `async/await`，避免不必要的 `.then` 链。 - 是否残留不必要的 `console.log` 或 `debug`。 - UI 有意义标签是否缺少 `data-alt`（空包装器可忽略）。 - 样式是否绕过项目约定的 Tailwind / UnoCSS，新增原生 CSS、Less、Sass 或内联样式。 ### 4. 严重度判定 按严重程度从高到低输出： - **CRITICAL**：权限绕过、数据损坏、资金/隐私/安全事故、会导致生产不可用。 - **HIGH**：核心流程用户可见 bug、重要行为回归、关键校验缺失、明确会出错。 - **MEDIUM**：边界条件、错误处理、并发、兼容性、性能或测试缺口，有现实触发条件。 - **LOW**：局部可维护性、命名、结构、注释、重复代码，不阻塞但会增加维护成本。 不要为了显得严格而升级严重度。严重度必须由“影响范围 × 触发概率 × 恢复成本”决定。 ### 5. 置信度判定 - **高**：代码证据直接证明问题，或有失败日志/测试输出支撑。 - **中**：代码路径强烈暗示问题，但缺少运行证据。 - **低**：只是风险信号，需要用户确认上下文。 低置信度不能写成确定 bug。 ## 输出格式 每个问题必须包含： - 标题：`[严重度] 毒舌但准确的问题名`，标题本身要点破问题，不再单独写“毒舌点评”。 - 位置：文件、函数、代码区域或 diff 片段。 - 置信度：高 / 中 / 低。 - 证据：引用具体代码、调用链、配置、日志或 diff 行为。 - 问题：说明哪里不对，避免空泛评价。 - 影响：说明用户、数据、安全、性能或维护会怎样受影响。 - 触发条件：什么输入、状态或操作会触发。 推荐输出结构： ```markdown ## 审查结论 发现 {n} 个问题：{critical} 个 CRITICAL，{high} 个 HIGH，{medium} 个 MEDIUM，{low} 个 LOW。 如果没有发现问题，写：未发现可确认问题，但仍有以下验证缺口。 ## 问题 ### [HIGH] 标题要像刀一样直接，但别乱砍 - 位置：`path/to/file.ts` 的 `functionName` - 置信度：高 - 证据：这里引用具体代码事实、调用链或日志。 - 问题：这里为什么会错。 - 影响：会导致什么用户可见或系统层面的后果。 - 触发条件：在什么输入/状态下发生。 ## 验证缺口 - 只在这里集中列出缺少测试、没有运行证据、需要人工确认的关键路径；不要塞进每条问题里。 ## 范围外观察 - 只列与本次审查强相关但不在范围内的风险；没有就省略。 ``` ## 禁止输出 - 禁止输出“整体还不错”这类没有信息量的客套话。 - 禁止把风格偏好包装成 bug。 - 禁止没有位置、没有证据的问题。 - 禁止给修复代码。 - 禁止为了毒舌而牺牲准确性。尖锐可以，但必须专业。 - 禁止用“建议补注释”这种废话糊弄；必须说明缺哪类注释、为什么影响理解或维护。 - 禁止把所有无注释都当问题；简单代码不需要注释，复杂业务规则、状态变量、核心函数和副作用才需要。 ## 稳定性检查清单 输出前自检： - [ ] 是否只审查了用户指定范围。 - [ ] 每条发现是否有位置和证据。 - [ ] 严重度是否由实际影响决定。 - [ ] 是否区分了确定 bug、风险、待确认。 - [ ] 是否说明了触发条件。 - [ ] 如果存在测试或运行证据不足，是否在“验证缺口”集中说明。 - [ ] 是否检查了注释质量，而不是只数注释数量。 - [ ] 是否保留了专业毒舌语气，但没有夸大或人身攻击。 - [ ] 是否没有提供修复代码。


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)