Royi15/Bug-Hunter-Agent

GitHub: Royi15/Bug-Hunter-Agent

一款利用 AI 自动为源代码生成对抗性单元测试、在沙箱中执行测试失败后自动分析并修复缺陷的命令行工具。

Stars: 0 | Forks: 0

# 🐛 Bug Hunter Agent 一款由 AI 驱动的 CLI 工具,能自动为您的源代码生成单元测试并执行它们。当测试失败时,它会生成详细的错误报告,尝试通过 AI 生成修复方案,并通过重新运行相同的测试来验证修复效果。该循环将重复进行,直到测试通过或您选择停止。 由 **Gemini 3.1 Flash Lite** 通过免费的 Google AI Studio API 提供支持。 ## 🚀 工作原理 该 Agent 会将您的源文件通过六个阶段的 pipeline 进行处理: ``` ┌─────────────────────────────────────────────────────┐ │ Your Source Code │ └─────────────────────────┬───────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────┐ │ 1. Code Ingestion │ │ - Validates file extension against supported │ │ language list │ │ - Reads the source file from disk │ └─────────────────────────┬───────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────┐ │ 2. Test Generation (Gemini 3.1 Flash Lite) │ │ - Verifies the content is real source code │ │ - Derives expected behaviour from function │ │ names, docstrings, and type hints — NOT from │ │ tracing through the implementation │ │ - Generates adversarial unit tests │ └─────────────────────────┬───────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────┐ │ 3. Test Executor │ │ - Saves generated tests to bug_hunter_output/ │ │ - Runs pytest / jest locally OR in Docker │ │ - Captures stdout and stderr │ └──────────────┬──────────────────────┬───────────────┘ │ │ [PASSED] [FAILED] │ │ ▼ ▼ Save logs & end ┌──────────────────────────────┐ │ 4. Error Analysis Engine │ │ (Gemini 3.1 Flash Lite) │ │ - Source + Tests + Log │ │ - Root-cause analysis │ └──────────────┬───────────────┘ │ ▼ ┌──────────────────────────────┐ │ 5. Artifacts │ │ bug_hunter_output/ │ │ ├── test_generated.py │ │ ├── terminal_output.log │ │ └── REPORT.md │ └──────────────┬───────────────┘ │ ▼ ┌──────────────────────────────┐ │ 6. Code Fixer │ │ (Gemini 3.1 Flash Lite) │ │ │ │ User picks: │ │ 1. Do nothing │ │ 2. Save fix as a new file │ │ 3. Overwrite original file │ └──────────────┬───────────────┘ │ ▼ ┌──────────────────────────────┐ │ Verification │ │ Re-runs the same tests on │ │ the fixed code (no new API │ │ call — zero extra tokens) │ └──────┬───────────────┬───────┘ │ │ [PASSED] [FAILED] │ │ ▼ ▼ Done! Re-analyse & loop back to step 6 ``` ## 🛠️ 环境要求 - Python 3.9+ - 一个免费的 **Gemini API key**(见下文) - 用于 Python 文件的 `pytest`,用于 JS/TS 文件的 `jest`(仅在**本地**执行时需要) - **Docker Desktop** *(可选)* — 用于在沙盒隔离的容器中执行(参见 [Docker 支持](#docker-support)) - **Bash** — hooks 运行所必需(见下文说明) ### Windows 上的 Bash 这些 hooks 是 shell 脚本,需要一个 `bash` 解释器。在 **macOS 和 Linux** 上,系统已自带该环境。在 **Windows** 上,您需要以下之一: - **Git for Windows** *(推荐 — 您可能已经安装了)* — 会自动安装 Git Bash 并将 `bash.exe` 添加到您的 PATH 中。可在 [git-scm.com](https://git-scm.com/download/win) 下载。 - **WSL (Windows Subsystem for Linux)** — Windows 内部的完整 Linux 环境。在管理员权限的 PowerShell 中运行 `wsl --install` 进行启用。 要在安装后验证 bash 是否可用,请在终端中运行: ``` bash --version ``` 如果您看到版本号,说明 hooks 可以正常工作。如果提示找不到命令,请先安装 Git for Windows。 ## ⚙️ 安装说明 ### 1. 获取免费的 Gemini API key 前往 **[Google AI Studio](https://aistudio.google.com/app/apikey)**,使用您的 Google 账号登录,然后点击 **Create API Key**。完全免费 — 无需信用卡。 ### 2. 克隆并安装依赖 ``` git clone cd Bug-Hunter-Agent pip install -r requirements.txt ``` ### 3. 添加您的 API key 在主根目录下打开一个 `.env` 文件并输入: ``` GEMINI_API_KEY=your_actual_key_here ``` ### 4. (可选) 安装 pytest 如果您尚未安装: ``` pip install pytest ``` ## 用法 ``` python bug_hunter.py ``` **示例:** ``` python bug_hunter.py mycode.py python bug_hunter.py src/utils.js python bug_hunter.py lib/parser.ts ``` **输出示例 — 测试失败,已应用并验证修复:** ``` ══════════════════════════════════════════════════════ Bug Hunter Agent ══════════════════════════════════════════════════════ Docker is available. Where would you like to run the tests? 1. Run locally (uses your system Python / Node) 2. Run in Docker (isolated container — make sure Docker is running) Your choice (1/2): 1 [1/4] Ingested 'mycode.py' (Python, 842 chars) [2/4] Generating tests with gemini-3.1-flash-lite... 7 test case(s) planned via pytest [3/4] Running: python -m pytest bug_hunter_output/test_generated_code.py -v --tb=short Tests FAILED (exit 1) [4/4] Analyzing failures with Gemini 3.1 Flash Lite... ────────────────────────────────────────────────────── Bugs found. What would you like to do? ────────────────────────────────────────────────────── 1. Do nothing — keep the original file as-is 2. Create a copy — save the fixed code to a new file 3. Fix in place — overwrite the original file ────────────────────────────────────────────────────── Your choice (1/2/3): 2 [FIX] Requesting fix from Gemini... [FIX] Fixed copy saved to: mycode_fixed.py [VERIFY] Re-running existing tests against the fixed code... Tests PASSED (exit 0) [VERIFY] All tests passed — fix confirmed! ══════════════════════════════════════════════════════ Artifacts saved to: bug_hunter_output/ test_generated_code.py (unit tests) terminal_output.log (raw console log) REPORT.md (bug analysis) Fixed copy: mycode_fixed.py ══════════════════════════════════════════════════════ ``` ## 🐳 Docker 支持 每次运行 Agent 时,系统都会询问您是在本地还是在隔离的 Docker 容器中执行生成的测试。该决定会根据您机器上安装的软件自动做出。 ### 提示的工作原理 **如果安装了 Docker Desktop:** ``` Docker is available. Where would you like to run the tests? 1. Run locally (uses your system Python / Node) 2. Run in Docker (isolated container — make sure Docker is running) Your choice (1/2): ``` 选择 **2** 会立即检查 Docker daemon 是否确实在运行。如果已安装 Docker Desktop 但未打开,Agent 会停止运行并提示清晰的信息,而不是静默失败: ``` [ERROR] Docker is installed but the daemon is not running. Please open Docker Desktop and try again. ``` **如果未安装 Docker:** ``` [WARNING] Docker is not installed on this machine. Tests will run locally using your system Python / Node. Proceed locally? (Y/N): ``` 回答 **N** 将正常退出。回答 **Y** 将像往常一样继续在本地执行。 ### 容器内运行的内容 | Framework | Docker image | 测试的安装方式 | |-----------|-------------|------------------------| | pytest | `python:3.11-slim` | `pip install pytest`(如果存在 `requirements.txt` 则加上 `-r requirements.txt`) | | jest | `node:18-slim` | `npm install jest --save-dev` | Agent 会将源文件和生成的测试文件复制到一个临时目录中,将其作为 `/app` 挂载到容器内部,运行测试并捕获输出。每次运行后容器都会被销毁(`--rm`)。 ### 安装 Docker 在 [docker.com/get-started](https://www.docker.com/get-started) 免费下载 **Docker Desktop**。支持 Windows、macOS 和 Linux 平台。 ## 输出文件 所有输出都会写入 `bug_hunter_output/` 目录(已被 gitignore 忽略)。 | 文件 | 描述 | |------|-------------| | `test_generated_code.py` | Gemini 生成的对抗性单元测试套件 | | `terminal_output.log` | 最近一次测试运行的原始 stdout + stderr | | `REPORT.md` | 错误报告 — 仅在测试失败时创建 | `REPORT.md` 包含针对每个 bug 的详细分析:失败原因、根本原因以及带有代码示例的具体修复建议。 ## 代码修复与验证循环 当测试失败时,Agent 会提供三个选项: | 选项 | 处理方式 | |--------|-------------| | **1 — 不进行操作** | 退出。原文件保持不变。 | | **2 — 创建副本** | Gemini 的修复方案会保存为您原文件旁边的 `_fixed.`。永远不会修改原文件。 | | **3 — 原地修复** | Gemini 的修复方案将直接覆盖原文件。 | 保存任何修复方案后,Agent 会自动针对修复后的代码重新运行**相同的测试** — 无需新的 API 调用,也不会消耗额外的 token。如果测试仍然失败,将重新分析错误并再次显示菜单。您可以继续迭代,或者随时选择选项 1 停止。 ## 支持的语言 | 扩展名 | 语言 | 测试运行器 | |-----------|----------|-------------| | `.py` | Python | pytest | | `.js` | JavaScript | jest | | `.ts` | TypeScript | jest | | `.c` | C | pytest | | `.cpp` | C++ | pytest | | `.java` | Java | pytest | | `.go` | Go | pytest | | `.rs` | Rust | pytest | | `.rb` | Ruby | pytest | | `.php` | PHP | pytest | | `.cs` | C# | pytest | | `.kt` | Kotlin | pytest | | `.swift` | Swift | pytest | 扩展名不受支持的文件在进行任何 API 调用之前会立即被拒绝。扩展名受支持但内容并非代码(如随机文本、普通文章、数据文件)的文件会在 Gemini 的内容验证步骤中被拒绝。 ## 🪝 开发者 Hooks 本项目为想要使用 **Claude Code** 处理代码库的开发者配备了完整的 hooks 系统。这些 hooks 与运行 `bug_hunter.py` 毫无关系 — 它们旨在保护开发环境本身。每当 Claude Code 编辑文件、运行命令或结束会话时,hooks 都会自动拦截这些操作,以强制执行安全规则、防止破坏性操作、备份您的文件并总结活动情况。 所有 hooks 都位于 `.claude/hooks/` 中。它们在 `.claude/settings.json` 中注册,并在您使用 Claude Code 处理本项目时自动触发。 ### Hook 概览 | Hook | 事件 | 触发器 | 功能说明 | |------|-------|---------|--------------| | `pre_command_firewall.sh` | PreToolUse | Bash | 阻止匹配危险正则表达式模式的命令 | | `pre_rate_limiter.sh` | PreToolUse | Bash | 统计每个会话的命令数;达到限制时先警告后阻止 | | `pre_commit_validator.sh` | PreToolUse | Bash | 强制要求遵循约定的 commit 消息格式 | | `pre_secrets_guard.sh` | PreToolUse | Read | 阻止 AI 助手读取 `secret_files.txt` 中列出的文件 | | `post_auto_backup.sh` | PostToolUse | Edit / Write | 为每个已编辑的文件创建带有时间戳的备份 | | `post_syntax_checker.sh` | PostToolUse | Edit / Write | 对保存的文件运行语法检查器 (bash/python/gcc) | | `post_session_summary.sh` | Stop | — | 会话结束时打印格式化的活动报告 | ### Hook 详情 #### `pre_command_firewall.sh` 从 `config/dangerous_patterns.txt` 读取正则表达式模式,并阻止任何匹配的 Bash 命令。如果命令被阻止,AI 助手会收到一条错误消息,说明匹配了哪个模式,并被要求使用更安全的替代方案。 **要添加被阻止的模式**,请打开 `config/dangerous_patterns.txt` 并添加一行: ``` # 阻止关闭机器 shutdown\s+ ``` #### `pre_rate_limiter.sh` 使用 `data/.command_count` 跟踪当前会话中运行的 Bash 命令总数。当计数超过 `WARNING_THRESHOLD` 时发出警告,并在达到 `MAX_COMMANDS` 时完全阻止。 **要在会话中途重置计数器**,请创建文件 `data/.reset_commands`(hook 会在下次运行时自动将其删除): ``` touch .claude/hooks/data/.reset_commands ``` #### `pre_commit_validator.sh` 拦截 `git commit -m "..."` 调用并强制执行以下三项规则: 1. 消息必须以 `config/commit_prefixes.txt` 中的有效前缀开头 2. 消息长度必须在 10 到 72 个字符之间 3. 消息不得以句号结尾 如果未找到前缀,hook 会分析暂存区的 diff 并建议一个前缀: - 新文件 → `feat:` - 测试/spec 文件 → `test:` - Markdown 文件 → `docs:` - 删除多于插入 → `refactor:` **要添加新的有效前缀**,请将其添加到 `config/commit_prefixes.txt`(每行一个)。 #### `pre_secrets_guard.sh` 阻止 AI 助手读取 `config/secret_files.txt` 中列出的任何文件。匹配是基于后缀且不区分大小写的,因此 `.env` 会拦截 `project/.env`、`C:\Users\..\.env` 等。 **要保护其他文件**,请将条目添加到 `config/secret_files.txt`: ``` .env my_credentials.json private_key.pem ``` #### `post_auto_backup.sh` 每次执行 Edit 或 Write 操作后,将修改后的文件复制到 `data/.backups/.`。每个文件仅保留最近的 `MAX_BACKUPS` 个副本;较旧的副本会被自动删除。 所有备份活动都会记录到 `data/session_.log` 中。 #### `post_syntax_checker.sh` 每次执行 Edit 或 Write 操作后,根据文件类型运行相应的语法检查器: | 扩展名 | 检查器 | |-----------|---------| | `.sh`, `.bash` | `bash -n` | | `.py` | `python3 -m py_compile` | | `.c`, `.h` | `gcc -fsyntax-only` | | 其他所有类型 | 静默跳过 | 语法错误将作为警告报告(exit 1) — 它们不会阻断会话。 #### `post_session_summary.sh` 开发会话结束时,读取 `data/session_.log` 并打印格式化的摘要: ``` ════════════════════════════════════════ SESSION SUMMARY REPORT ════════════════════════════════════════ Session: abc123 Period: 2025-05-27 14:00:00 -> 2025-05-27 14:42:17 ── Activity ───────────────────────── Total actions: 18 Backups made: 9 Syntax checks: 9 Syntax errors: 0 ── Most Edited Files ──────────────── 1. bug_hunter.py (6 edits) 2. hooks.conf (2 edits) 3. requirements.txt (1 edit) ── File Types ─────────────────────── .py files: 7 .sh files: 2 ``` ## Hook 配置参考 所有配置文件均位于 `.claude/hooks/config/`。 ### `hooks.conf` 控制速率限制器和备份轮换: ``` # 每个 session 在被阻止前允许的最大 Bash 命令数 MAX_COMMANDS=50 # 达到此阈值时发出警告(必须 < MAX_COMMANDS) WARNING_THRESHOLD=40 # 每个文件保留的最大带时间戳 backups 数量 MAX_BACKUPS=5 ``` ### `dangerous_patterns.txt` 每行一个 POSIX 扩展正则表达式。匹配任何模式的命令都将被阻止。以 `#` 开头的行是注释。 ``` # 默认阻止的内容示例: rm\s+-rf\s+/ # recursive delete of root dd\s+if= # raw disk writes curl.*\|\s*(ba)?sh # piping remote scripts to shell ``` ### `commit_prefixes.txt` 每行一个约定式 commit 前缀。任何不以 `: ` 开头的 `git commit -m` 消息都将被阻止。 ``` feat fix docs refactor test chore ``` ### `secret_files.txt` 每行一个文件名后缀(不区分大小写)。AI 助手无法读取任何路径以列出的条目结尾的文件。 ``` .env .env.local .env.production .env.staging ``` ## 在本地测试 Hooks 使用 `hook_runner.sh` 即可模拟任何 hook 链,而无需活跃的实时会话: ``` # 测试 command 防火墙 — 应该阻止 echo '{"tool_name":"Bash","tool_input":{"command":"rm -rf /"},"session_id":"test"}' \ | bash .claude/hooks/hook_runner.sh PreToolUse Bash # 测试安全 command — 应该通过 echo '{"tool_name":"Bash","tool_input":{"command":"ls -la"},"session_id":"test"}' \ | bash .claude/hooks/hook_runner.sh PreToolUse Bash # 测试编辑后的 backup + syntax check 链 echo '{"tool_name":"Edit","tool_input":{"file_path":"bug_hunter.py"},"session_id":"test"}' \ | bash .claude/hooks/hook_runner.sh PostToolUse Edit ``` ## 📂 项目结构 ``` Bug-Hunter-Agent/ ├── bug_hunter.py Main agent ├── requirements.txt ├── .env Your API key (never committed) ├── .gitignore └── .claude/ ├── settings.json Registers hooks with Claude Code └── hooks/ ├── pre_command_firewall.sh ├── pre_rate_limiter.sh ├── pre_commit_validator.sh ├── pre_secrets_guard.sh ├── post_auto_backup.sh ├── post_syntax_checker.sh ├── post_session_summary.sh ├── hook_runner.sh Local hook simulator ├── hooks_config.txt hook_runner.sh routing table ├── config/ │ ├── hooks.conf │ ├── dangerous_patterns.txt │ ├── commit_prefixes.txt │ └── secret_files.txt └── data/ Runtime only — gitignored ├── .backups/ ├── .command_count └── session_.log ``` ## ❌ 常见错误 | 错误 | 原因 | 修复方法 | |-------|-------|-----| | `GEMINI_API_KEY is not set` | 缺少 `.env` 或 key 为空 | 将您的 key 添加到 `.env` 中 | | `Rate limit exceeded` | 达到免费层级限制 | 等待约 1 分钟后重试 | | `Invalid API key` | `.env` 中的 key 错误 | 从 Google AI Studio 重新复制 | | `Unsupported file type` | 扩展名不在支持列表中 | 使用受支持语言的文件 | | `Gemini rejected the file` | 文件扩展名正确但并非真正的代码 | 传入实际的源代码文件 | | 测试中出现 `ModuleNotFoundError` | 源文件不在 Python 路径中 | Agent 会自动设置 `PYTHONPATH` — 请确保您从项目根目录运行 | | `Docker is installed but the daemon is not running` | Docker Desktop 已关闭 | 打开 Docker Desktop 并等待其完成启动,然后重试 | | Docker 输出中出现 `UnicodeDecodeError` | 系统区域设置不匹配 | 已在内部处理 — 输出将作为 UTF-8 读取并使用替换字符 | | Docker 运行长时间卡住 | 首次使用时正在拉取镜像 | 等待约 60 秒;镜像缓存后后续运行会很快 |
标签:AI编程, Docker, IPv6支持, SOC Prime, 代码修复, 单元测试, 安全规则引擎, 安全防御评估, 开发工具, 请求拦截, 逆向工具