Skip to main content

LLM-based code review tool that finds issues tests and linters miss

Project description

Vet : Verify Everything

PyPi License: AGPL v3 Build Status Discord

Vet is a standalone verification tool for code changes and coding agent behavior.

It reviews git diffs, and optionally an agent's conversation history, to find issues that tests and linters often miss. Vet is optimized for use by humans, CI, and coding agents.

Why Vet

  • Verification for agentic workflows: "the agent said it ran tests" is not the same as "all tests ran successfully".
  • CI-friendly safety net: catches classes of problems that may not be covered by existing tests.
  • Bring-your-own-model: can run against hosted providers or local/self-hosted OpenAI-compatible endpoints.

Installation

pip install verify-everything

Or install from source:

pip install git+https://github.com/imbue-ai/vet.git

Quickstart

Run Vet in the current repo:

vet "Implement X without breaking Y"

Compare against a base ref/commit:

vet "Refactor storage layer" --base-commit main

Using Vet with Coding Agents

Vet ships as an agent skill that coding agents like OpenCode and Codex can discover and use automatically. When installed, agents will proactively run vet after code changes and include conversation history for better analysis.

Install the skill

curl -fsSL https://raw.githubusercontent.com/imbue-ai/vet/main/install-skill.sh | bash

You will be prompted to choose between:

  • Project level: installs into .agents/skills/vet/ and .claude/skills/vet/ at the repo root (run from your repo directory)
  • User level: installs into ~/.agents/, ~/.opencode/, ~/.claude/, and ~/.codex/ skill directories, discovered globally by all agents
Manual installation

Project Level

From the root of your git repo:

for dir in .agents .claude; do
  mkdir -p "$dir/skills/vet/scripts"
  for file in SKILL.md scripts/export_opencode_session.py scripts/export_codex_session.py scripts/export_claude_code_session.py; do
    curl -fsSL "https://raw.githubusercontent.com/imbue-ai/vet/main/skills/vet/$file" \
      -o "$dir/skills/vet/$file"
  done
done

User Level

for dir in ~/.agents ~/.opencode ~/.claude ~/.codex; do
  mkdir -p "$dir/skills/vet/scripts"
  for file in SKILL.md scripts/export_opencode_session.py scripts/export_codex_session.py scripts/export_claude_code_session.py; do
    curl -fsSL "https://raw.githubusercontent.com/imbue-ai/vet/main/skills/vet/$file" \
      -o "$dir/skills/vet/$file"
  done
done

Security note

The --history-loader option executes the specified shell command as the current user to load the conversation history. It is important to review history loader commands and shared config presets before use.

GitHub PRs (Actions)

Vet can run on pull requests using the reusable GitHub Action.

Create .github/workflows/vet.yml:

name: Vet

permissions:
  contents: read
  pull-requests: write

on:
  pull_request:
    types: [opened, edited, synchronize, reopened]

jobs:
  vet:
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-latest
    env:
      ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
    steps:
      - uses: actions/checkout@v4
        with:
          ref: ${{ github.event.pull_request.head.sha }}
          fetch-depth: 0
      - uses: imbue-ai/vet@main
        with:
          agentic: false

The action handles Python setup, vet installation, merge base computation, and posting the review to the PR. ANTHROPIC_API_KEY must be set as a repository secret when using Anthropic models (the default). See action.yml for all available inputs.

How it works

Vet snapshots the repo and diff, optionally adds a goal and agent conversation, runs LLM checks, then filters/deduplicates findings into a final list of issues.

architecture

Output & exit codes

  • Exit code 0: no issues found
  • Exit code 1: unexpected runtime error
  • Exit code 2: invalid usage/configuration error
  • Exit code 10: issues found

Output formats:

  • text
  • json
  • github

Configuration

Model configuration

Vet supports custom model definitions using OpenAI-compatible endpoints via JSON config files searched in:

  • $XDG_CONFIG_HOME/vet/models.json (or ~/.config/vet/models.json)
  • .vet/models.json at your repo root

Example models.json

{
  "providers": {
    "openrouter": {
      "name": "OpenRouter",
      "api_type": "openai_compatible",
      "base_url": "https://openrouter.ai/api/v1",
      "api_key_env": "OPENROUTER_API_KEY",
      "models": {
        "gpt-5.2": {
          "model_id": "openai/gpt-5.2",
          "context_window": 400000,
          "max_output_tokens": 128000,
          "supports_temperature": true
        },
        "kimi-k2": {
          "model_id": "moonshotai/kimi-k2",
          "context_window": 131072,
          "max_output_tokens": 32768,
          "supports_temperature": true
        }
      }
    }
  }
}

Then:

vet "Harden error handling" --model gpt-5.2

Configuration profiles (TOML)

Vet supports named profiles so teams can standardize CI usage without long CLI invocations.

Profiles set defaults like model choice, enabled issue codes, output format, and thresholds.

See the example in this project.

Custom issue guides

You can customize the guide text for the issue codes via guides.toml. Guide files are loaded from:

  • $XDG_CONFIG_HOME/vet/guides.toml (or ~/.config/vet/guides.toml)
  • .vet/guides.toml at your repo root

Example guides.toml

[logic_error]
suffix = """
- Check for integer overflow in arithmetic operations
"""

[insecure_code]
replace = """
- Check for SQL injection: flag any string concatenation or f-string formatting used to build SQL queries rather than parameterized queries
- Check for XSS: flag user-supplied data rendered into HTML templates without proper escaping or sanitization
- Check for path traversal: flag file operations where user input flows into file paths without validation against directory traversal (e.g. ../)
- Check for insecure cryptography: flag use of deprecated or weak algorithms (e.g. MD5, SHA1 for security purposes, DES, RC4)
- Check for hardcoded credentials: flag passwords, API keys, or tokens embedded directly in source code
"""

Section keys must be valid issue codes (vet --list-issue-codes). Each section supports three optional fields: prefix (prepends to built-in guide), suffix (appends to built-in guide), and replace (fully replaces the built-in guide). prefix and suffix can be used together, but replace is mutually exclusive with the other two. Guide text should be formatted as a list.

Community

Join the Imbue Discord for discussion, questions, and support. For bug reports and feature requests, please use GitHub Issues.

License

This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0-only).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

verify_everything-0.1.13.tar.gz (188.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

verify_everything-0.1.13-py3-none-any.whl (242.1 kB view details)

Uploaded Python 3

File details

Details for the file verify_everything-0.1.13.tar.gz.

File metadata

  • Download URL: verify_everything-0.1.13.tar.gz
  • Upload date:
  • Size: 188.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for verify_everything-0.1.13.tar.gz
Algorithm Hash digest
SHA256 ea4e22b649647b4b7ced26c7cdb62e32a211307df38ab72ca28231f6dd012c29
MD5 d7f447859cd85b0d9de4de483b963fb1
BLAKE2b-256 9fb720547ece9431e8490a38dbc5c2b905c7aa0a73baf6cdd4ee0d0ce47e1777

See more details on using hashes here.

File details

Details for the file verify_everything-0.1.13-py3-none-any.whl.

File metadata

File hashes

Hashes for verify_everything-0.1.13-py3-none-any.whl
Algorithm Hash digest
SHA256 dcb6eefc0d891716f41f28be2af9b4ae62acc19ad5383c82ac430766009da277
MD5 f08c41693bc8d8e9fcad07f2581ba0a3
BLAKE2b-256 e834a41b8cd137ea9802a4e84bae095225cc4117973095fa724009c7bbc3ae96

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page