with one click
audit
项目代码审计 使用 agent teams 按模块并行审计模块化/健壮性/安全性/优化/完成度/调用链/设计一致性/功能完善度/前端运行时验证
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
项目代码审计 使用 agent teams 按模块并行审计模块化/健壮性/安全性/优化/完成度/调用链/设计一致性/功能完善度/前端运行时验证
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
| name | audit |
| description | 项目代码审计 使用 agent teams 按模块并行审计模块化/健壮性/安全性/优化/完成度/调用链/设计一致性/功能完善度/前端运行时验证 |
当用户请求代码审计/code audit/代码质量检查时加载此技能
主 Agent (与用户直接对话的 Agent) 禁止执行任何实际操作 包括但不限于:
主 Agent 的授权允许职责:
audit_checklist.py 等审计管理脚本所有实际的代码阅读/分析/修改操作 必须委派给对应的 subagent/team-agent 执行
这样做的目的是维持主 Agent 的 context 清洁度 避免大量代码内容污染主对话上下文 确保主 Agent 能在整个审计过程中保持有效的协调能力
.audit/
├── config.yaml # 审计配置 (排除规则/模块映射)
├── checklist.yaml # 审计进度清单 (含 sha256)
├── modules/
│ ├── {module-name}.md # 模块设计意图文档 (跨审计轮次保留)
│ ├── {module-name}-components.md # 拆分文件 (当单文件超 500 行时)
│ ├── {module-name}-api.md # 拆分文件 (按职责域拆分)
│ └── ...
每个 .audit/modules/*.md 文件 不得超过 500 行 超过时必须按职责域拆分为多个文件:
拆分策略:
{module}.md 保留: 路径/职责/设计意图/对外接口/依赖关系/架构规则{module}-components.md (如组件数量多 可继续按页面拆分){module}-api.md{module}-components-kag.md拆分文件之间通过文件名前缀关联 主文件中用 ## 参见 列出所有拆分文件路径
审计开始前 先检查 .audit/checklist.yaml 是否存在:
python ~/.claude/skills/audit/scripts/audit_checklist.py verify [root] 检查审计状态audited 则告知用户: "上一轮审计已全部完成 是否开启新一轮审计?"
checklist.yaml 保留 modules/ 设计文档和 config.yamlpending 文件且 sha256 一致 → 跳过 Phase 1 直接从 Phase 2 继续审计未完成的文件python ~/.claude/skills/audit/scripts/audit_checklist.py refresh [root] 自动更新状态python ~/.claude/skills/audit/scripts/audit_checklist.py summary [root] 输出当前进度.audit/modules/) 作为上下文传给审计 Agent分两步执行: 先总览 再按模块并行深入
派发一个 Explore Agent 扫描项目整体结构:
扫描当前项目的目录结构和代码组织
识别所有独立模块/子系统及其边界
要求:
1. 列出所有顶层模块目录
2. 每个模块的职责 (根据目录名/文件内容推断)
3. 每个模块的大致代码量 (文件数)
4. 模块间的依赖关系 (import/require 方向)
5. 跳过 node_modules/dist/build 产物/vendor/target
输出格式:
| 模块名 | 路径 | 职责 | 文件数 | 主要依赖 |
总览完成后 执行初始化配置 (config.yaml + checklist) 确定模块列表
根据 config.yaml 中的 module_map 为每个模块启动一个独立的 Explore Agent 并行生成/更新设计文档
每个 Explore Agent 的 prompt:
深入扫描以下模块 生成设计意图文档
模块: {模块名}
路径: {模块路径列表 (module_map 中映射到该模块的所有目录)}
职责: {从总览结果中提取的职责}
要求:
1. 阅读该模块下所有源代码文件
2. 按照设计文档模板生成完整描述
3. 识别对外接口/依赖关系/架构规则
4. 前端模块需描述每个组件的视觉元素/交互逻辑/数据流
5. 后端模块需描述每个接口的入口/调用链/副作用
6. 将结果写入 .audit/modules/{module-name}.md
7. 单个文件不得超过 500 行 超过时按职责域拆分为多个文件
- 拆分文件命名: {module-name}-{domain}.md (如 creator-frontend-components.md)
- 主文件末尾用 ## 参见 列出所有拆分文件路径
所有模块 Explore Agent 同时启动 最大化并行度
Explore 完成后 执行以下初始化:
如果 .audit/config.yaml 不存在 运行:
python ~/.claude/skills/audit/scripts/audit_checklist.py init [root]
生成默认 config.yaml 然后根据 Explore 结果 编辑 config.yaml 添加项目特定的排除规则和模块映射
config.yaml 格式:
exclude_dirs:
- ".claude"
- ".vscode"
- "agent-prompt"
- "some-generated-dir"
exclude_files:
- "some-specific-file.js"
module_map:
"ocs/bridge": "bridge"
"ocs/core": "bridge"
"ocs/inject": "bridge"
"ocs/iframe": "bridge"
"ocs/kag": "kag"
"ocs/panel": "panel"
"creator/src-tauri": "creator-backend"
"creator/src": "creator-frontend"
Step 2 的 Explore Agent 会在 .audit/modules/ 下为各自模块创建或更新设计文档
如果 .audit/modules/{module-name}.md 已存在 则在已有内容基础上更新 而非覆盖
每个模块文档格式:
# {模块名}
## 路径
{模块路径}
## 职责
{从 Explore 结果提取的职责描述 + 代码分析得出的详细职责}
## 设计意图
{根据代码结构/命名/导出推断的设计意图}
{为什么以这种方式组织? 解决什么问题?}
## 对外接口
{模块导出的所有接口/函数/类/常量 按用途分组}
## 依赖关系
- 依赖: {该模块依赖的其他模块 标注具体引用了哪些接口}
- 被依赖: {依赖该模块的其他模块 标注被引用了哪些接口}
## 架构规则
{从 CLAUDE.md/rules/ 中提取的与该模块相关的架构约束}
## 前端页面描述 (仅前端模块)
### 页面/组件列表
{列出每个组件}
### 每个组件的详细描述
#### {组件名}
**视觉元素:**
- 列出页面上的每一个可见元素 (标题/按钮/输入框/列表/图标/分隔线等)
- 每个元素的位置 / 样式特征 / 条件渲染逻辑
- 响应式布局行为 (不同屏幕尺寸)
**样式美化:**
- CSS 变量/主题依赖
- 动画/过渡效果
- 特殊样式处理 (暗色模式/RTL/滚动行为)
**交互逻辑:**
- 每个可交互元素 (按钮/链接/输入/拖拽) 绑定的事件处理函数
- 事件 → 处理函数 → store action → API 调用 的完整调用链
- 条件分支和不同状态下的行为
**数据流:**
- 组件 props / inject / store 依赖
- computed / watch / 响应式数据的来源和流向
- 与父组件/子组件/兄弟组件的数据通信方式
## 后端接口描述 (仅后端模块)
### 接口列表
{列出每个暴露的接口/command}
### 每个接口的详细描述
#### {接口名}
**入口:**
- 请求参数类型和验证规则
- 权限要求
**完整调用链:**
- 入口函数 → 中间处理层 → 数据访问层 → 返回 的完整路径
- 每一步的输入输出类型
- 错误处理和回滚逻辑
**副作用:**
- 数据库读写操作
- 文件系统操作
- 外部服务调用
- 事件/通知触发
python ~/.claude/skills/audit/scripts/audit_checklist.py generate [项目根目录]
脚本从 .audit/config.yaml 读取项目特定的排除规则 结合内置的通用排除规则 扫描文件并生成 checklist
其他命令:
python audit_checklist.py verify [root] # 检查所有文件 sha256 是否变更
python audit_checklist.py refresh [root] # 更新 sha256 标记 stale/modified
python audit_checklist.py mark <module|filepath> [root] # 标记模块或文件为已审计 (自动 rehash)
python audit_checklist.py summary [root] # 显示审计进度
python audit_checklist.py pending [module] [root] # 列出待审计文件
python audit_checklist.py init [root] # 生成默认 config.yaml
checklist.yaml 格式:
created: "2026-03-19T12:00:00Z"
summary:
total: 128
audited: 0
pending: 128
stale: 0
modified: 0
modules:
bridge:
- path: "ocs/bridge/api.js"
sha256: "a1b2c3d4..."
status: pending
- path: "ocs/bridge/core.js"
sha256: "e5f6a7b8..."
status: pending
kag:
- path: "ocs/kag/adapter.js"
sha256: "c9d0e1f2..."
status: audited
status 取值:
pending - 未审计audited - 已审计 sha256 与当前文件一致stale - 已审计但文件已被修改 (sha256 不匹配) 需重新审计modified - 上次未完成审计且文件已变更 需重新审计每个模块启动一个独立的 Agent 并行审计 这是 agent teams 模式:
每个 Agent 收到的 prompt 必须包含:
.audit/modules/{module-name}.md 读取)你是代码审计专家 对以下模块进行深度审计
模块: {模块名}
路径: {模块路径}
职责: {模块职责描述}
## 模块设计意图
{从 .audit/modules/{module-name}.md 读取的完整内容}
## 相关模块设计意图
{依赖/被依赖模块的设计文档摘要}
## 审计维度
### 1. 模块化 + 系统化 + 解耦合度
检查项:
- 模块是否有明确的单一职责
- 模块间是否通过接口/协议通信 而非直接访问内部实现
- 是否存在循环依赖或跨层依赖 (Core 依赖 UI)
- 共享逻辑是否提取到公共模块 而非重复实现
- 是否存在平行系统 (多个模块做同一件事)
- 全局可变状态的使用情况
- 导出接口是否最小化 (不暴露内部实现)
### 2. 健壮性
检查项:
- 边界条件处理 (空值/零值/溢出/越界)
- 错误传播是否完整 (是否有静默吞错误)
- 异步操作的错误处理 (未捕获的 Promise/panic)
- 资源释放 (事件监听器/定时器/连接)
- 类型安全 (any 滥用/类型断言/未检查类型转换)
- 数据校验 (反序列化/外部输入/格式转换)
- 竞态条件 (并发访问共享状态)
### 3. 安全性
检查项:
输入/输出安全:
- 注入攻击 (XSS/SQL 注入/命令注入/模板注入/原型链污染)
- 未转义的用户输入直接拼接到 HTML/SQL/Shell/eval
- 敏感数据泄露 (错误信息/日志/响应体中暴露内部路径/堆栈/凭据)
- 不安全的反序列化 (JSON.parse 未校验/pickle/yaml.load)
- SSRF (服务端请求伪造 用户可控 URL 未做白名单校验)
- 路径遍历 (用户输入拼接文件路径未规范化)
内存安全:
- 缓冲区溢出/越界读写 (Rust unsafe 块/C FFI/Wasm 边界)
- Use-after-free / double-free (手动内存管理场景)
- 未限制的内存增长 (无上限的缓存/队列/历史记录)
- 大对象未及时释放 (闭包捕获/事件监听器泄漏)
- ArrayBuffer/TypedArray 越界访问
- Wasm 线性内存与 JS 堆的交互边界检查
硬件/运行时安全:
- 侧信道攻击面 (时序攻击: 字符串比较未用恒定时间比较)
- 不安全的随机数 (Math.random 用于安全场景而非 crypto.getRandomValues)
- 加密误用 (弱哈希算法/ECB 模式/硬编码 IV/密钥)
- WebWorker/SharedArrayBuffer 的 Spectre 缓解 (COOP/COEP headers)
漏洞防御:
- 依赖链安全 (已知 CVE 的依赖版本)
- 权限最小化 (过度请求的 API 权限/文件系统权限)
- CSP/CORS 配置 (过于宽松的策略)
- iframe 沙箱逃逸 (sandbox 属性/postMessage origin 校验)
- 供应链攻击面 (动态加载的外部脚本/CDN 资源未做 SRI)
### 4. 优化程度
检查项:
- 算法复杂度 (是否存在 O(n²) 或更差的可优化算法)
- 内存分配 (不必要的拷贝/临时对象/大数组)
- 重复计算 (可缓存但未缓存的结果)
- 热路径性能 (高频调用函数的效率)
- 数据结构选择 (是否使用了合适的数据结构)
- 惰性加载 (是否有可延迟的初始化/加载)
- DOM 操作效率 (如适用: 批量更新/虚拟滚动/防抖)
### 5. 完成度
检查项:
- 未完成的功能 (空函数体/stub 实现/placeholder 返回值)
- TODO/FIXME/HACK/XXX/TEMP 标记的待办项
- 未实现的接口方法或抽象方法
- 被注释掉的代码块 (判断是遗留还是未完成)
- 声明但未使用的导出/变量/函数
- 部分实现的特性分支 (只完成了一半的逻辑)
发现问题后: 直接完成实现 而非仅报告
### 6. 调用链完整性
检查项:
- 函数/方法被声明但从未被调用 (死代码 vs 缺失调用)
- 事件注册后无对应的触发点 或触发后无对应的监听
- 回调/Promise 链中断 (未 resolve/reject/未 await/未处理返回值)
- 模块导出的接口在消费方未正确引用 (重命名后未同步)
- 数据流断裂 (上游产出的数据下游未消费 或下游期望的数据上游未提供)
- 条件分支导致的不可达代码路径
- 生命周期钩子缺失 (注册了 init 但没有对应的 destroy/cleanup)
发现问题后: 修复断裂的调用链 补全缺失的连接
### 7. 设计一致性
检查项:
- 实现是否符合 CLAUDE.md 和 rules/ 中定义的架构规则
- 同类功能是否采用一致的模式 (如错误处理/状态管理/通信方式)
- 命名约定是否统一 (同一概念在不同模块中的命名)
- API 风格是否一致 (参数顺序/返回值格式/异步模式)
- 与模块声明的职责是否匹配 (是否越权或缺位)
- 数据模型在各层之间的映射是否正确
发现问题后: 按照设计规则修正实现 使其与预期一致
### 8. 功能完善度 (设计层面)
这不是代码质量审计 而是产品/设计层面的审计 需要从用户视角审视
检查项:
- 功能缺失: 根据模块设计意图 是否有应该存在但未实现的功能
- 交互死角: 用户可能触发但没有处理的操作路径 (如空状态/边界情况/异常流程)
- 反馈缺失: 操作后是否有足够的视觉/状态反馈 (loading/success/error/empty)
- 可发现性: 功能是否能被用户自然地发现和使用 (隐藏过深/入口不明显)
- 一致性: 同类操作在不同页面/组件中的行为是否一致
- 容错性: 用户误操作时是否有确认/撤销机制
- 数据完整性: 增删改查流程是否闭环 (能创建但不能删除/能编辑但不能保存)
- 状态同步: 多视图/多组件间的数据是否保持一致 (一处修改其他处是否更新)
发现问题后: 报告缺失功能和设计问题 给出具体的改进建议 对可直接修复的问题立即修复
### 9. 前端运行时验证 (仅前端模块)
对包含 UI 组件的模块 进行运行时级别的验证:
#### 9a. 交互路径模拟
读取每个组件的模板/JSX 识别所有可交互元素:
- 按钮 (@click / onClick)
- 表单输入 (v-model / onChange)
- 链接/导航 (router-link / href)
- 下拉菜单/弹窗触发器
- 拖拽/手势操作
- 键盘快捷键
对每个交互元素:
1. 追踪其绑定的事件处理函数
2. 验证处理函数是否存在且逻辑完整
3. 检查处理函数中的条件分支是否都有对应的 UI 反馈
4. 确认异步操作有 loading/error 状态处理
#### 9b. 逻辑单元测试
为每个组件/composable 的核心逻辑构建单元测试:
- 状态管理逻辑 (store actions/mutations/getters)
- 数据转换/格式化函数
- 表单验证规则
- 条件渲染逻辑
- 计算属性/派生状态
测试要求:
- 覆盖正常路径 + 边界情况 + 错误路径
- 测试文件放在对应模块目录下的 `__tests__/` 或 `tests/`
- 使用项目已有的测试框架 (vitest / jest)
#### 9c. API 接口验证
对所有调用后端接口的代码:
1. 识别接口调用点 (fetch / axios / tauri invoke)
2. 根据代码中的参数构造和响应处理 推断接口的请求/响应格式
3. 检查请求参数构造是否完整 (必填字段是否遗漏/类型是否匹配)
4. 检查响应处理是否覆盖所有可能的状态码和数据格式:
- 成功响应的数据解析
- 错误响应的处理 (4xx/5xx)
- 网络错误/超时的处理
- 空数据/null 响应的处理
5. 如果可以访问后端 (如 Tauri commands) 构造测试数据发送请求 验证:
- 请求是否被正确接收
- 响应值是否符合前端代码的期望格式
- 错误情况下的返回值是否被前端正确处理
发现问题后: 补全缺失的错误处理/状态处理 修复接口对接问题
## 审计完成后更新 checklist
每个 Agent 审计完一个模块后 主 Agent 使用脚本更新 checklist:
```bash
python ~/.claude/skills/audit/scripts/audit_checklist.py mark <module-name> [root]
脚本自动:
audited单文件标记:
python ~/.claude/skills/audit/scripts/audit_checklist.py mark <file-path> [root]
每个模块 Agent 按以下格式返回审计结果给主 Agent:
{关键发现 每条一行}
{关键发现 每条一行}
{关键发现 每条一行}
{关键发现 每条一行}
{未完成项列表 标注已修复/待修复}
{断裂点列表 标注已修复/待修复}
{偏差点列表 标注已修复/待修复}
{缺失功能/交互问题列表 标注已修复/待修复}
{交互死角/测试覆盖/API 对接问题列表}
| # | 严重度 | 维度 | 文件:行号 | 描述 | 建议 |
|---|
评分标准:
### Phase 3: 主 Agent 汇总
收集所有模块 Agent 的审计结果后:
1. 生成项目级审计总表
| 模块 | 模块化 | 健壮性 | 安全性 | 优化 | 完成度 | 调用链 | 设计一致性 | 功能完善 | 前端验证 | 高优问题数 |
|---|
{识别跨模块的系统性问题 如重复实现/循环依赖/不一致的模式}
{按影响范围和严重度排序的 top 10 问题}
2. 将完整审计报告输出给用户
3. 如果所有模块所有维度均为 A 且无待修复问题 → **审计通过 流程终止**
4. 否则 → 进入 Phase 4
### Phase 4: 自动修复
汇总完成后 **无需询问用户** 立即开始修复所有发现的问题
#### 修复策略
1. 从审计结果中收集所有需要修复的问题
2. 按模块/文件分组 按严重度排序 (CRITICAL > HIGH > MEDIUM > LOW)
3. 识别问题间的依赖关系:
- 跨模块问题优先于模块内问题
- 接口变更优先于实现变更
- 基础设施变更优先于业务逻辑变更
4. 将无依赖冲突的修复任务并行派发给尽可能多的 Agent
#### 派发规则
- 每个 Agent 负责一个模块或一组相关文件的修复
- 同一文件不能被多个 Agent 同时修改
- 跨模块问题由专门的 Agent 处理 (如重构共享模块/统一接口)
- Agent 类型选择:
- 代码修复 → general-purpose Agent
- 构建错误 → build-error-resolver Agent
- 重构/去重 → refactor-cleaner Agent
#### Agent prompt 模板
你是代码修复专家 根据审计结果修复以下问题
模块: {模块名} 设计文档: {从 .audit/modules/{module}.md 读取}
| # | 严重度 | 维度 | 文件:行号 | 描述 | 建议 | {该模块的问题子表}
#### 修复完成后
1. 运行 `python ~/.claude/skills/audit/scripts/audit_checklist.py refresh [root]` 更新修复后的文件 sha256
2. 汇总修复结果输出给用户:
| 模块 | 修复数 | CRITICAL | HIGH | MEDIUM | LOW | 失败 |
|---|
{列出需要人工介入的问题及原因}
3. 如果有构建相关的修改 运行构建验证
### Phase 5: 循环审计 (审计-修复-复审 循环)
修复完成后 **自动进入下一轮审计** 无需用户确认
#### 循环流程
Phase 2 (审计) → Phase 3 (汇总) → Phase 4 (修复) → Phase 5 (复审判定) ↑ │ └───────────── 仍有问题 ←───────────────────────────────┘
#### 复审规则
1. 运行 `audit_checklist.py refresh [root]` 将修复过的文件标记为 stale
2. **仅对 stale 文件所属模块** 重新派发审计 Agent (不重审未变更的模块)
3. 复审 Agent 收到的 prompt 额外包含:
- 上一轮该模块的审计报告 (避免重复报告已知且无法修复的问题)
- 本轮修复记录 (验证修复是否正确 是否引入新问题)
4. 收集复审结果 回到 Phase 3 汇总
#### 终止条件
循环在满足 **任一** 条件时终止:
| 条件 | 说明 |
|------|------|
| 零问题 | 所有模块所有维度均为 A 且无待修复问题 |
| 修复收敛 | 连续两轮的问题列表完全相同 (修复未产生效果 剩余问题需人工介入) |
| 轮次上限 | 达到 5 轮循环 (防止无限循环) |
#### 终止时输出
总轮次: {N} 终止原因: {零问题 / 修复收敛 / 轮次上限}
| 模块 | 模块化 | 健壮性 | 安全性 | 优化 | 完成度 | 调用链 | 设计一致性 | 功能完善 | 前端验证 |
|---|
{列出所有未能自动修复的问题 标注原因和建议的人工修复方案}
## 注意事项
- 只审计源代码 跳过 node_modules/dist/build 产物/vendor/target
- 优先关注高频调用路径和核心逻辑
- 关注移动端和低端设备的性能影响
- 审计结果要具体到文件和行号 不要泛泛而谈
- 维度 5/6/7 (完成度/调用链/设计一致性) 是修复型审计: 发现问题后直接修复 而非仅报告
- 模块设计文档是审计的重要上下文 审计 Agent 必须先阅读再审计
- checklist.yaml 是审计进度的唯一真相源 每次审计前必须检查
- sha256 用于检测文件变更 确保审计结果与代码版本对应
- 修复阶段自动执行 不需要询问用户确认
- 修复 Agent 数量不限 尽可能并行以提高效率
- 设计文档跨审计轮次保留 重新审计时只更新不删除
- 排除规则分两层: 脚本内置通用规则 + `.audit/config.yaml` 项目特定规则