{
  "markdown": "# Forge\n\n[![Anthropic Published](https://img.shields.io/badge/Anthropic-Officially%20Published-ff6b35?logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTIgMkw0IDIwaDQuNUwxMiA4bDMuNSAxMkgyMEwxMiAyeiIgZmlsbD0id2hpdGUiLz48L3N2Zz4=)](https://claude.com/plugins)\n[![Claude Code Plugin](https://img.shields.io/badge/Claude%20Code-Plugin-blue)](https://claude.com/plugins)\n\nAdversarial code hardening for Claude Code. Spawns a Builder agent to implement and a Breaker agent to attack it with tests. Loops until the Breaker can't break it.\n\n<img width=\"2816\" height=\"1536\" alt=\"Forge: Builder and Breaker agents in an adversarial loop\" src=\"https://github.com/user-attachments/assets/11b67200-27f3-4419-adba-b658df6de1bb\" />\n\n\n## The fight\n\nYou give Forge a task. Two agents enter. One builds. One breaks. \nThe loop stops when the Breaker dies.\n\n**The Builder** writes the code. It implements your feature, handles the edge cases it can think of, and calls it done.\n\n**The Breaker** reads everything the Builder wrote and tries to destroy it. It writes adversarial tests — not opinions, not suggestions, *tests that fail*. Null inputs. Malformed tokens. Boundary values. Auth bypasses. Every test is a punch. Every failure is proof.\n\nThe Builder gets the failing tests back. It can't delete them. It can't weaken them. It has to *fix the code* until every test passes.\n\nThen the Breaker goes again. Harder this time, because the obvious bugs are gone. It digs deeper — race conditions, resource leaks, unicode edge cases, things you'd never think to test.\n\nThis continues until one of two things happens:\n- **The Breaker can't produce a failing test.** The code survives. Forge is complete.\n- **Max rounds hit.** The fight is over. Whatever's left unfixed gets reported.\n\nThe Breaker's tests stay in your repo forever. They're not throwaway review comments — they're a permanent adversarial test suite that protects your code from here on out.\n\n## Quick start\n\n```\n/forge implement JWT authentication with refresh tokens --rounds 5\n```\n\n## What the Breaker attacks\n\nIn order of severity:\n- Crashes and unhandled exceptions\n- Security issues (injection, auth bypass, path traversal)\n- Boundary conditions (zero, negative, huge, empty, unicode)\n- Race conditions and concurrency\n- Resource leaks\n- Contract violations (does the code actually do what was asked?)\n\n## Why not just use code review?\n\nCode review gives opinions. Forge gives proof.\n\nA review comment says \"this might have a null pointer issue.\" A Breaker test calls the function with `None` and shows you the traceback. The Builder can't wave it away — it has to make the test pass.\n\n## Example fight\n\n```\nForge complete: passed\n\nRounds: 3/5\nBuilder files: src/auth/service.py, src/auth/tokens.py\nBreaker tests:\n  Round 1: tests/adversarial/test_auth_breaker_r1.py (4 tests)\n  Round 2: tests/adversarial/test_auth_breaker_r2.py (2 tests)\n  Round 3: tests/adversarial/test_auth_breaker_r3.py (1 test)\n\nRound 1: Builder implemented password reset flow\n         Breaker found 4 issues, 3 failing tests\nRound 2: Builder fixed 3 issues\n         Breaker found 1 new edge case, 1 failing test\nRound 3: Builder fixed edge case\n         Breaker: all tests pass, no new issues found\n\nAdversarial test suite: tests/adversarial/ (7 tests across 3 files)\nCheckpoint: forge/pre-20260324-1430 (rollback with: git reset --hard forge/pre-20260324-1430)\n```\n\n## Installation\n\n```\n/plugin install forge@claude-plugins-official\n```\n\n## Usage\n\n```\n/forge <task description> [--rounds N] [--harden] [--test-dir <path>]\n```\n\n- `--rounds N` — max rounds in the fight (default: 5)\n- `--harden` — skip the Builder in round 1 and attack existing code directly; use this to harden code that already exists rather than implementing something new\n- `--test-dir <path>` — override where adversarial tests are written (default: auto-detected from project conventions)\n- **Git projects:** auto-stashes any uncommitted changes before starting and restores them after; creates a `forge/pre-<timestamp>` tag so you can roll back with `git reset --hard`\n- **Non-git projects:** snapshots the project to `/tmp/forge-backup-<timestamp>/` before round 1; restore with `cp -r /tmp/forge-backup-<timestamp>/. .`\n- If max rounds are hit without the Breaker running dry, Forge stops and reports what remains unfixed\n\n## Supported stacks\n\nAuto-detects from config files:\n- Python (pytest)\n- Node.js/TypeScript (jest, vitest, mocha)\n- Rust (cargo test)\n- Go (go test)\n- Ruby (rspec, minitest)\n\n## License\n\nMIT\n",
  "bytes": 4638,
  "sha": "86c6b350171931b3068caeceb129f4428d8a453cef9996be3fbac4e6cec88f71",
  "repo_slug": "utkarshjain98/forge",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_utkarshjain98_forge_forge_00fb7dcd/readme"
}