Skip to main content

repo-contract — AI Agent Governance Layer

repo-contract is a lightweight, portable Python package and command-line tool that acts as an enforceable governance layer for AI coding agents (such as Claude Code, Cursor, Codex, Windsurf, Aider, etc.).

It allows repositories to declare machine-checkable architectural, safety, and workflow rules. The engine deterministically validates proposed agent plans (pre-edit) and git diff patches (post-edit) to ensure compliance before code is modified or merged.

Why Governance?

AI agents are excellent at generating edits, but often fail to respect repository-specific constraints:

  • Scope Creep: Editing unrelated components or refactoring large sub-systems.
  • Architectural Regressions: Importing internal database handlers directly into view controllers.
  • Workflow Breaches: Editing crucial functionality without adding corresponding tests.
  • Safety Violations: Reading/modifying forbidden files (.env, secrets/) or sensitive directories.

Rather than trying to help agents "understand more code" or storing synthetic meaning, repo-contract focuses on enforcing negative constraints, which empirical studies show is the most effective way to shape safe agent workflows.


Key Features

  • YAML/TOML Contracts: Declarative policy schema containing architecture layers, safety paths, agent limits, and test mappings.
  • Python Module Inspector: AST-based import resolution (both absolute and relative package paths).
  • Plan Validation: Pre-checks an agent's text/markdown plan block, extracting planned files and verifying safety boundaries before edits begin.
  • Diff Validation: Analyzes git patches/diffs to catch forbidden imports, path violations, test gaps, and file counts.
  • Dependency Guard: Warns when a diff adds imports of external packages that are not declared in pyproject.toml / requirements.txt / setup.py — a common AI-agent failure mode.
  • Unrelated Refactor Detection: Identifies whether modifications span disjoint, unconnected modules in the import graph (connected components analysis).
  • Deterministic Engine: 100% deterministic rules with clear, human-readable explanations and JSON-RPC outputs.
  • MCP Server Integration: Stdio-based Model Context Protocol (MCP) server wrapper that exposes validators directly as tools for AI assistants.

Installation

# Clone the repository
git clone https://github.com/your-org/repo-contract.git
cd repo-contract

# Install in editable mode
pip install -e .

Quick Start

1. Initialize the Contract

Create a default configuration file in your repository:

repo-contract init
# Generates repo-contract.yaml

2. Configure Rules

Modify repo-contract.yaml (or TOML equivalent) to define your rules:

version: 1

project:
  name: my-app
  src_root: "my_app"  # Directory containing python package modules

architecture:
  layers:
    - name: ui
      paths: ["my_app/ui/**"]
      # Entries may be layer names ("db"), dotted module prefixes ("my_app.db"),
      # or path prefixes ("my_app/db") — all three are equivalent.
      cannot_import: ["my_app/db"] # UI layer cannot import DB layer directly
    - name: db
      paths: ["my_app/db/**"]
      cannot_import: ["my_app/ui"]

workflow:
  required_tests:
    # Require corresponding test file to be modified when source is modified
    - when_paths_match: ["my_app/**/*.py"]
      require: ["tests/**/test_*.py"]

safety:
  forbidden_paths:
    - ".env"
    - "secrets/**"
  approval_required_for:
    - "my_app/auth/**"

agent:
  max_files_per_change: 6
  forbid_unrelated_refactors: true

dependencies:
  # Warn when a diff adds imports of packages not declared in the
  # project's dependency files (pyproject.toml / requirements.txt / setup.py)
  check_undeclared: true

3. Run Validation

Scan Codebase

Scan the entire repository for static layer boundary violations or missing tests:

repo-contract scan

Validate Agent Plan (Pre-edit)

Pass the agent's proposed plan (as raw text or from a file) to ensure they aren't touching forbidden files or planning changes that are too broad:

repo-contract check-plan "I will edit my_app/auth/login.py and .env to configure authentication."
# Fails because .env is forbidden and auth/ requires approval.

# Or validate a plan saved to a file:
repo-contract check-plan plan.md

If the argument is a path to an existing file it is read as a plan file; otherwise it is treated as raw plan text (use --text to force raw-text interpretation).

Validate Git Diff (Post-edit / CI Gate)

Check uncommitted working tree edits, a specific git commit range, or a patch file:

# Validate local uncommitted edits
repo-contract check-diff

# Validate staging changes
repo-contract check-diff --staged

# Validate range (e.g. CI run)
repo-contract check-diff HEAD~1..HEAD

# Validate a patch file
repo-contract check-diff my-change.patch

Model Context Protocol (MCP) Integration

You can run repo-contract as a stdio-based MCP Server in your favorite editor (like Cursor, Claude Desktop, or Windsurf) by adding this command to your configuration:

{
  "mcpServers": {
    "repo-contract": {
      "command": "python",
      "args": ["-m", "repo_contract.mcp.server"],
      "cwd": "/path/to/your/project"
    }
  }
}

Exposed Tools

  • scan_repository: Runs structural checks on the current workspace.
  • check_plan: Analyzes the agent's textual/markdown plan, extracting planned files and validating bounds before edits begin.
  • check_diff: Checks current uncommitted working directory edits.

License

MIT License.

Download files

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

Source Distribution

repo_contract-0.2.0.tar.gz (33.9 kB view details)

Uploaded Source

Built Distribution

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

repo_contract-0.2.0-py3-none-any.whl (29.9 kB view details)

Uploaded Python 3

File details

Details for the file repo_contract-0.2.0.tar.gz.

File metadata

  • Download URL: repo_contract-0.2.0.tar.gz
  • Upload date:
  • Size: 33.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for repo_contract-0.2.0.tar.gz
Algorithm Hash digest
SHA256 b03d095dd9780b55eea89d5d9b2bb48ab2df0c4e7794120bb3732e68e6c8ff4c
MD5 a0bbd6d6b080674f8febe9e6bb2a86fc
BLAKE2b-256 fb63cf6055a5a57435aa3e14311d0d8e9130a1880e0d5a59a40ec481c9b50a62

See more details on using hashes here.

Provenance

The following attestation bundles were made for repo_contract-0.2.0.tar.gz:

Publisher: publish.yml on dager23/RepoContract

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file repo_contract-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: repo_contract-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 29.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for repo_contract-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0bb358a604ed4ebadb3b13cfd7c9ee6bc3eab9023e0945b6fc78c737482dc7fa
MD5 8e991c938610aaafb130ccd3861b51db
BLAKE2b-256 8f794939eb8cb6559b41ebb371601abc54d291a993df7d42e0c5e229fc092180

See more details on using hashes here.

Provenance

The following attestation bundles were made for repo_contract-0.2.0-py3-none-any.whl:

Publisher: publish.yml on dager23/RepoContract

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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