{
  "markdown": "# undercover\n\nA Claude Code plugin that creates a test coverage feedback loop using the [undercover](https://github.com/grodowski/undercover) gem.\n\n## What it does\n\nAfter running tests, Claude automatically runs `undercover` to find untested code changes, then writes tests for any gaps, looping until coverage passes.\n\nUnlike total coverage percentages, undercover checks **only the lines you changed**, so the feedback is always relevant to the work at hand.\n\n## Installation\n\n**From marketplace:**\n```\n/plugin marketplace add grodowski/undercover-claude\n/plugin install undercover@undercover-ci\n```\n\n**From local clone (development):**\n```\n/plugin marketplace add /path/to/undercover-claude\n/plugin install undercover@undercover-ci\n```\n\n## Prerequisites\n\nYour Ruby project needs SimpleCov configured to generate `coverage/coverage.json`. You don't have to wire this up by hand — let the skill do it.\n\n### Quick Setup\n\nInside Claude Code, run the setup prompt:\n\n```\n/coverage set up coverage for this project\n```\n\nClaude adds `simplecov` and `undercover` to your Gemfile, wires `SimpleCov::Formatter::Undercover` into `spec_helper.rb`/`test_helper.rb`, creates `.undercover` with a compare ref, runs `bundle install`, and runs your tests once to generate coverage data — then you're ready for the feedback loop.\n\n## How It Works\n\nThe plugin installs a skill that instructs Claude to run `undercover` after every test run and act on the results:\n\n1. Run tests\n2. Run `undercover` or `undercover --include-files \"app/models/foo.rb\"` when testing a subset of files\n3. If gaps found: write tests (or remove dead code)\n4. Repeat until undercover exits 0\n\n## Usage\n\nInvoke `/coverage` inside Claude Code. Type what you want to do after\nthe command and the skill routes to the right guide (it defaults to the feedback\nloop if you say nothing):\n\n- `/coverage set up coverage` — SimpleCov setup instructions\n- `/coverage set up CI` — CI with UndercoverCI or GitHub Actions\n- `/coverage parallel tests` — coverage merging for parallel runners\n- `/coverage check this PR` — read and address UndercoverCI feedback on a PR\n\n### Feature branches and CI\n\nBy default undercover checks uncommitted changes only. For feature branches and CI, set a compare ref in `.undercover` or use the `--compare` flag:\n\n```\n-c origin/main\n```\n\n### Addressing UndercoverCI feedback on a PR\n\nWhen coverage is reported on a GitHub PR by [UndercoverCI](https://undercover-ci.com),\nthe warnings live in the `coverage` check's annotations — which `gh pr view` and the\nGitHub MCP server don't expose. The skill instructs Claude to pull them directly with\n`gh api`, then fix the gaps and verify locally with `--compare`.\n\n## Files\n\n```\nundercover-claude/\n├── .claude-plugin/\n│   ├── plugin.json           # Plugin manifest\n│   └── marketplace.json      # Marketplace catalog (self-hosting)\n├── skills/\n│   └── coverage/\n│       ├── SKILL.md          # Feedback loop + router (loads on every invocation)\n│       └── references/       # Guides loaded on demand\n│           ├── setup.md      # SimpleCov + Gemfile + .undercover + permissions\n│           ├── ci.md         # GitHub Actions / CircleCI / UndercoverCI / merging\n│           ├── pr-feedback.md # Reading UndercoverCI PR annotations via gh api\n│           └── skipping.md   # :nocov:, add_filter, --exclude-files\n└── README.md\n```\n\n## License\n\nMIT\n",
  "bytes": 3369,
  "sha": "fd32dfb6bb8e1d353be22b6fbbeac7886516a2e327671bece7a2b591cd013ea2",
  "repo_slug": "grodowski/undercover-claude",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_grodowski_undercover_claude_undercover_f88802a4/readme"
}