---
name: cm-security
description: 用户运行 cm-security，或要求代码安全扫描、漏洞检查、密钥泄露排查、依赖漏洞检查时使用。默认检查当前分支相对主分支及已跟踪未提交修改，结合业务地图复核；--all 检查全部已跟踪文件。只报告问题，不自动修复、安装、升级或发布。安装自检用 cm-check，功能测试与覆盖率用 cm-test。
---

# cm-security — 代码安全扫描与业务复核

先读 `../../runtime/project-context.md` 和 [执行合同](references/scan-contract.md)。
本 Skill 是独立只读安全入口；不改变 cm-test、任务完成门禁或发布授权。
Codex 用 `$cm-security`，Claude Code 用 `/cm-security`；macOS/Linux 兼容 `/cm:security`。

## 用法

```text
$cm-security
$cm-security {项目路径}
$cm-security {项目路径} --all
$cm-security {项目路径} --semgrep-rules {已审查的外部本地规则文件}
$cm-security {项目路径} --osv-db {外部离线数据库缓存目录}
```

## 执行

1. 省略项目时解析当前 Git 仓库根。显式路径也定位到该仓库根；无 Git/HEAD、主分支缺失或有歧义时停止并说明，不猜基准，不自动 fetch。`--all` 不要求主分支，但仍要求 Git/HEAD。
2. 先确认地图在 Git index 中为普通已跟踪文件，再加载业务地图，只读核对受影响的入口、调用方、权限与数据流。地图缺失、陈旧或失真时，从相关代码补足本次分析，标明缺口；不自动全仓重建或更新地图。
3. 从当前 Skill 位置解析 `{CM_WORKFLOW_ROOT}`，逐项传参数，禁止拼接用户文本为 shell 命令：

```bash
node "{CM_WORKFLOW_ROOT}/scripts/cm-security.mjs" --project "{项目根}" {已解析的可选参数}
```

4. 保留 JSON 的范围、digest、工具状态、遗漏和 findings。退出码 1 表示发现候选问题，3 表示检查仍不完整，均需继续上下文复核；2 表示阻断，只汇报阻断原因。0 可能是 NO_CHANGES，不是安全认证。
5. 对 selected 中每个路径做轻量 AI 复核。先看改动及调用链，再看扫描候选；只加载相关代码，禁止默认加载整套外部审计 Skill。命中或触及鉴权、支付、跨租户、命令/文件/网络边界时，沿该路径深入。
6. 逐项核验输入是否可控、现有防护是否有效、受影响业务及复现条件。分别检查工作区与不同的暂存版本；删除或改名必须结合基准版本和调用方，不能只看剩余文件。引用 `revision + 文件:行号`。
7. 对越权、注入、路径穿越、SSRF、敏感信息暴露、依赖漏洞给出有证据的判断。工具输出只算候选；没有测试或一般最佳实践不足以认定漏洞。无需主动执行 PoC、项目脚本、安装依赖或访问业务服务。
8. 按同样参数追加 `--inventory` 再运行脚本，与第一次 digest 对比。发生变化时标记 BLOCKED/证据过期；不替用户回滚。此复核只覆盖所选源码/暂存与地图，未读路径不能声称已核验。
9. 输出简短结论与报告。报告用 `mktemp -d` 在项目外创建本次专用目录，记录 JSON 中的脱敏字段与 AI 结论；不要写入任意传入源码目录或 tasks/specs。默认扫描不自动修复、不安装、不提交、不上传给额外服务；需要修复时将证据交给用户决定。

## 报告

```text
安全检查：FINDINGS / REVIEWED_PARTIAL / NO_CHANGES / BLOCKED
范围：基准 → 当前分支 + 已跟踪暂存/工作区，或全部已跟踪文件
业务地图：已核验 / 部分核验 / 缺失 / 陈旧
发现：严重程度、文件:行号、受影响业务、证据与修复建议
工具覆盖：逐个列版本、完成/缺失/失败/未配置与遗漏
AI 复核：已复核路径、未复核路径、已确认/待验证/误报理由
源码一致性：一致 / 变化 / 未能确认
报告：绝对路径
```

存在候选问题时使用 FINDINGS，并分清已确认与待验证；源码漂移或范围不可信优先 BLOCKED。
无发现但规则、依赖数据库、语言或 AI 覆盖不完整时使用 REVIEWED_PARTIAL。
即使所选检查全完成，也只能说明本轮未发现问题，不能输出“没有漏洞”或替代独立 Review。
未跟踪文件只报告数量，不读取；需要包含时由用户明确选择并另行确认范围，不自动 git add。
