🎁 Get the FREE AI Skills Starter GuideSubscribe →
BytesAgainBytesAgain
🦀 ClawHub

Ops Code Review

by @freepengyang

Code Review 安全扫描工具,自动化代码审计,支持 Django/Python、React+TypeScript、PHP 多语言。 自动识别代码仓库提交变更,调用安全扫描器进行规范检查和风险检测,报告推送飞书群。 支持 post-commit hook 增量扫描和定时全量扫描。 关键词:Code Revi...

Versionv1.0.11
Downloads466
Installs1
TERMINAL
clawhub install ops-code-review

📖 About This Skill


name: ops-code-review description: | Code Review 安全扫描工具,自动化代码审计,支持 Django/Python、React+TypeScript、PHP 多语言。 自动识别代码仓库提交变更,调用安全扫描器进行规范检查和风险检测,报告推送飞书群。 支持 post-commit hook 增量扫描和定时全量扫描。 关键词:Code Review SVN security scan Django React PHP 代码审计 代码扫描 安全检测 CI/CD 自动化 metadata: openclaw: requires: bins: [svn, bandit, pylint, npx, phpcs] env: - CODE_REVIEW_SVN_USER - CODE_REVIEW_SVN_PASS - CODE_REVIEW_FEISHU_CHAT_ID - CODE_REVIEW_CONFIG install: - id: svn kind: system label: "Install SVN (subversion)" command: "apt-get install subversion" - id: bandit kind: pip label: "Install Bandit (Python security scanner) — ⚠️ uses --break-system-packages" note: "⚠️ pip --break-system-packages affects system-wide packages. Prefer a virtual environment." package: "bandit --break-system-packages" - id: pylint kind: pip label: "Install Pylint (Python linter) — ⚠️ uses --break-system-packages" note: "⚠️ pip --break-system-packages affects system-wide packages. Prefer a virtual environment." package: "pylint --break-system-packages" - id: node kind: node label: "Install Node.js (for npx/eslint)" package: node - id: composer kind: system label: "Install Composer (PHP package manager) — ⚠️ download then execute, not pipe" command: "curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php && php /tmp/composer-setup.php -- --install-dir=/usr/local/bin --filename=composer && rm -f /tmp/composer-setup.php" note: "⚠️ Downloads installer to /tmp first before executing. Review the command before running; prefer isolated environment." - id: phpcs kind: composer label: "Install PHP CodeSniffer" package: squizlabs/php_codesniffer - id: typescript-eslint kind: node_global label: "Install typescript-eslint (ESLint parser for TS/TSX) — ⚠️ global npm install" note: "⚠️ Global npm install modifies host environment. Review before running."

Code Review Skill

首次使用前配置(必读)

1. 设置环境变量

Linux/Mac(加到 ~/.bashrc~/.zshrc):

export CODE_REVIEW_SVN_USER="你的SVN用户名"
export CODE_REVIEW_SVN_PASS="你的SVN密码"
export CODE_REVIEW_FEISHU_CHAT_ID="飞书群机器人chat_id"

OpenClaw 配置(推荐,写入 OpenClaw 环境变量): 在 OpenClaw 配置文件中添加:

{
  "env": {
    "CODE_REVIEW_SVN_USER": "你的SVN用户名",
    "CODE_REVIEW_SVN_PASS": "你的SVN密码",
    "CODE_REVIEW_FEISHU_CHAT_ID": "飞书群机器人chat_id"
  }
}

2. 配置仓库信息

创建配置文件(完整示例包含所有支持的仓库):

cat > config.json << 'EOF'
{
  "repos": {
    "ops_api": {
      "url": "http://your-svn/ops/dev/branches/branch_dev/ops_api",
      "lang": "django",
      "type": "incremental",
      "local": "/tmp/svn_repos/ops_api"
    },
    "ops_web": {
      "url": "http://your-svn/ops/dev/branches/branch_dev/ops_web",
      "lang": "react",
      "type": "incremental",
      "local": "/tmp/svn_repos/ops_web"
    },
    "ops_api_trunk": {
      "url": "http://your-svn/ops/dev/trunk/ops_api",
      "lang": "django",
      "type": "full",
      "local": "/tmp/svn_repos/ops_api_trunk"
    },
    "ops_web_trunk": {
      "url": "http://your-svn/ops/dev/trunk/ops_web",
      "lang": "react",
      "type": "full",
      "local": "/tmp/svn_repos/ops_web_trunk"
    },
    "gm": {
      "url": "http://your-svn/gm/trunk",
      "lang": "mixed",
      "type": "both",
      "local": "/tmp/svn_repos/gm"
    }
  }
}
EOF

将配置复制到运行时目录(必须):

cp -f config.json /tmp/code_review_config.json

注意config.json 不随 skill 上传,请根据实际 SVN 地址修改各仓库的 url 字段。

3. 检查工具依赖

python3 scripts/code_review.py check-deps

如有缺失工具,自动安装:

python3 scripts/code_review.py install-deps

能力概览

| 功能 | 说明 | |------|------| | 🔍 增量扫描 | post-commit 触发,只扫本次提交的文件 | | 📋 全量扫描 | 每周定时,扫描整个仓库 | | 🛠️ 多语言支持 | Django / React+TS / PHP | | 🔴 问题分级 | ERROR / WARNING / INFO 三级 | | 🛠️ 修复建议 | 具体代码修改方案,不只是说"有问题" | | 📤 飞书推送 | 报告发送到配置的飞书群 |

环境变量说明

| 变量名 | 必填 | 说明 | |--------|------|------| | CODE_REVIEW_SVN_USER | ✅ | SVN 只读用户名 | | CODE_REVIEW_SVN_PASS | ✅ | SVN 密码 | | CODE_REVIEW_FEISHU_CHAT_ID | ✅ | 飞书群 chat_id(机器人 webhook 或群 ID)| | CODE_REVIEW_CONFIG | ❌ | config.json 路径,默认为 /tmp/code_review_config.json(建议使用受保护目录如 ~/.config/code-review/config.json)|

使用方式

手动触发扫描

审计代码 incremental ops_api    # 增量扫描(只扫变更)
审计代码 full gm                 # 全量扫描指定仓库
审计代码 fullall                 # 全量扫描所有仓库
审计代码 sync                   # 同步所有 SVN 仓库
审计代码 check-deps             # 检查工具依赖

增量扫描流程(post-commit hook)

用户提交代码
    ↓
SVN post-commit hook 触发
    ↓
code_review.py incremental 
    ↓
SVN Manager 获取本次变更文件
    ↓
Analyzer 逐语言分析
    ↓
Report Generator 生成飞书格式报告
    ↓
推送到飞书群

全量扫描流程(定时任务)

每周定时触发
    ↓
code_review.py fullall
    ↓
遍历所有仓库,checkout 全量代码
    ↓
按语言全量扫描
    ↓
生成报告推送飞书

工具依赖

| 工具 | 用途 | 安装命令 | |------|------|----------| | svn | SVN 客户端 | apt-get install subversion | | bandit | Python 安全扫描 | pip install --break-system-packages bandit | | pylint | Python 代码检查 | pip install --break-system-packages pylint | | npx | 执行 ESLint | npm install -g npx | | composer | PHP 包管理器 | 下载安装脚本到 /tmp 后执行(不通过管道),最后清理安装文件 | | phpcs | PHP 代码规范 | composer global require squizlabs/php_codesniffer | | @typescript-eslint/* | ESLint 的 TypeScript 解析器 | npm install -g @typescript-eslint/parser @typescript-eslint/eslint-plugin typescript-eslint |

首次使用前必须运行工具检查,确保所有依赖就绪。

SVN Hook 部署

生成 hook 脚本

code_review.py setup-hooks

部署步骤

1. 在 SVN 服务器上找到仓库路径 2. 将生成的 post-commit 脚本放到 hooks/ 目录 3. 赋予执行权限:chmod +x hooks/post-commit 4. 确保 SVN 服务器能访问本 skill 的 scripts 目录

定时任务配置(OpenClaw Cron)

推荐使用 OpenClaw 内置 cron,比服务器 crontab 更方便管理:

{
  "schedule": { "kind": "cron", "expr": "0 3 * * 1", "tz": "Asia/Shanghai" },
  "payload": { "kind": "agentTurn", "message": "执行全量代码审计:\ncd /root/.openclaw/workspace/skills/code-review && python3 scripts/code_review.py fullall" },
  "sessionTarget": "isolated"
}

创建方式:告诉 OpenClaw "帮我创建一个每周一凌晨3点执行全量代码审计的定时任务"

报告示例

📊 代码审计报告
━━━━━━━━━━━━━━━━━━
🏷️ 仓库:运维后台后端 (Django)
📅 时间:2026-04-14 10:00
🔍 方式:🔄 增量扫描
📁 扫描文件:5
🐛 问题总数:3
  🔴 严重/错误:1
  🟡 警告:1
  🟢 提示:1
━━━━━━━━━━━━━━━━━━

🔴 严重 | models/user.py:45 └ [CUST-105] 敏感信息明文存储 └ 🛠️ 修复:使用环境变量或密钥管理服务,不要明文存储

🟡 警告 | views/order.py:88 └ [CUST-311] 潜在 SQL 拼接风险 └ 🛠️ 修复:使用参数化查询,避免字符串拼接查询语句

🟢 提示 | utils/helper.py:12 └ [CUST-324] 弱随机数生成 └ 🛠️ 修复:使用 os.urandom 或 secrets 模块替代 random

━━━━━━━━━━━━━━━━━━ ⚙️ 由 OpenClaw 代码审计 Skill 自动生成

注意事项

1. 敏感信息:SVN 账密和飞书群 ID 通过环境变量注入,不随 skill 上传 2. 首次使用:先配置环境变量 → 创建 config.json → 复制到 /tmp/code_review_config.json → 运行 check-deps → 运行 install-deps → 运行 sync 3. 工具缺失:记录在 /tmp/code_review_missing_tools.json,运行 install-deps 自动安装 4. 扫描效率:全量扫描较慢,建议放在低峰时段 5. 误报处理:如果某类问题确认为可接受的惯用写法,可以在报告中注明

ClawScan 安全自检清单

发布前用以下命令扫描所有脚本和引用文档:

grep -rE "(oc_[a-f0-9]+|http://[a-z]+\.[a-z]+|:[0-9]{4,5})" \
  scripts/ references/ --include="*.py" --include="*.md" --include="*.yml"

触发 ClawScan flag 的模式(立即修复):

  • oc_ 开头的真实飞书 ID → 改为 os.environ.get("CODE_REVIEW_FEISHU_CHAT_ID", "")
  • 内网 hostname(如 zabbix.ops.qiyujoy.com)→ 改为 os.environ.get("ZABBIX_URL", "")
  • 真实用户名默认值 → 改为 os.environ.get("XXX_USER", "") 空默认值
  • 任何 Base64 编码或明显凭据格式的字符串
  • 不触发 flag 的安全模式:

  • {{ MYSQL_PASSWORD }}(Ansible Jinja2 变量注入)
  • (尖括号包裹的占位符)
  • os.environ.get("XXX", "") 空默认值
  • 示例 URL 如 https://zabbix.example.comhttp://your-svn/ops/dev/branches/
  • 元数据声明要求: 所有运行时需要的环境变量必须在 frontmatter 的 metadata.openclaw.requires.env 中声明,包括非敏感的 CODE_REVIEW_CONFIG。敏感凭据变量(CODE_REVIEW_SVN_PASS 等)必须声明,但不赋值。