This release is a pre-release and may not be stable for production use.
Agent Maintainer
Maintainability checks and repair-loop diagnostics for AI-assisted Python repositories.
Agent Maintainer is in beta. The core workflow is usable today, but starter files and defaults may change as it is tested across more Python repository layouts.
Agent Maintainer helps coding agents make smaller, safer, more reviewable code
changes. It wraps your existing quality tools in low-noise profiles, adds
change-budget and ratchet discipline, writes bounded diagnostics to
.verify-logs, and gives agents exact repair commands instead of dumping huge
logs into the chat.
Read more where it matters: quick start, first run walkthrough, diagnostics loop, tool map.
What It Is
Agent Maintainer is a repository maintenance control layer for AI-assisted software development. It checks whether changes are small enough to review, test-backed, type-checked, covered, diagnosable, and aligned with repository structure.
It is strongest when an AI agent is actively editing your repo: the agent gets a compact pass/fail summary, a run id, failed checks, and exact next commands while raw evidence stays in run-scoped artifacts.
Quick Start
Install the core toolset:
python -m pip install "agent-maintainer[core]"
Initialize a repo:
agent-maintainer init --track core --preset existing-app
Merge config/pyproject.agent-maintainer.toml into your pyproject.toml, tune
paths, then run:
agent-maintainer doctor
agent-maintainer verify --profile precommit
A healthy verification run is intentionally quiet:
PASS
If it fails, read the bounded repair note first:
cat .verify-logs/LAST_FAILURE.md
That note links to run-scoped logs and gives exact expansion/rerun commands.
Best First Experience: Try A Fresh Strict Repo
The clearest way to feel the value is to let an agent build something new under strict settings before entropy starts.
python -m pip install "agent-maintainer[core]"
agent-maintainer init --track agent --preset strict-new-repo
Then ask your coding agent to build a small package, add tests, and finish by running:
python3 -m agent_maintainer verify --profile precommit
The strict preset turns on the pressure that matters for AI-generated code: small functions, covered behavior, low complexity, no broad suppressions, architecture ownership, and test-backed source changes.
Deeper reads: fresh-strict, agent hooks, generated guidance.
Adoption Tracks
init separates files written from policy strictness.
| Track | Best For | Writes |
|---|---|---|
core |
A minimum useful local and CI maintenance loop. | Starter config, config/dev-dependencies.txt, pre-commit config, CI workflow. |
agent |
Repos where Codex, Claude Code, or other agents actively edit code. | Core plus AGENTS.md, generated guidance target, Codex hooks, Claude Code hooks. |
hardening |
Repos that want docs/config hygiene and security-adjacent surfaces too. | Agent plus Node-backed tooling metadata. |
Preview before writing:
agent-maintainer init --track agent --preset ai-agent-heavy --dry-run
Presets tune policy:
| Preset | Use When |
|---|---|
small-library |
A compact package can start with tighter budgets. |
existing-app |
An existing repo needs useful defaults without immediate strict-mode friction. |
ai-agent-heavy |
Agents frequently change code and source-only changes should fail. |
legacy-ratchet |
Existing debt should improve through ranked repair targets. |
strict-new-repo |
A clean repo can start strict with wemake and tighter budgets. |
team-small-python-lib |
Team-owned package wants small-library defaults. |
team-legacy-service |
Team-owned service needs legacy ratchets first. |
team-agent-heavy |
Team relies heavily on coding agents. |
team-security-sensitive |
Clean security-sensitive repo wants strict starter defaults. |
Read more: quick start, legacy ratchet, fresh strict, team policy templates.
Run Profiles
| Profile | Purpose |
|---|---|
fast |
Hook-friendly edit feedback. |
precommit |
Local completion gate before finishing a task. |
full |
Deeper review gate before larger changes. |
ci |
GitHub Actions-equivalent verification with branch comparison. |
security |
Security-oriented scans, including history-oriented secret scanning when configured. |
manual |
Slow or intentionally heavy checks such as Mutmut and Semgrep. |
Canonical commands:
python3 -m agent_maintainer verify --profile precommit
python3 -m agent_maintainer verify --profile full
python3 -m agent_maintainer verify --profile ci --base-ref origin/main --compare-branch origin/main
python3 -m agent_maintainer verify --profile security
python3 -m agent_maintainer verify --profile manual
Read more: tool map, diagnostics repair loop, verification cadence.
Supported Checks And Scans
Agent Maintainer does not replace these tools. It coordinates them, gives them stable profiles, captures artifacts, and turns failures into bounded repair context.
| Area | Supported Checks |
|---|---|
| Change control | Change budget, staged diff checks, cohesive change plans, source-without-test-change policy. |
| Size and structure | File length budgets, folder cohesion hints, suppression budget, required layout checks. |
| Formatting and lint | Ruff format/check, Pylint, wemake-python-styleguide. |
| Types and tests | Pyright, pytest, pytest-cov, coverage, diff-cover. |
| Complexity | Radon reports, Xenon complexity gate. |
| Architecture | Tach, Import Linter, Archguard decision notes and impact tools. |
| Dependency hygiene | deptry, vulture. |
| Python security | Bandit, pip-audit. |
| Secrets | Gitleaks current-tree, staged/range, and history modes. |
| Ecosystems | Python core/reference provider; experimental configured-command TypeScript/JavaScript provider. |
| SAST | Semgrep in manual profile when enabled. |
| Multi-ecosystem CVEs | OSV Scanner when enabled. |
| Containers/IaC | Trivy when relevant to the repo. |
| SBOM and licenses | CycloneDX Python SBOM, pip-licenses. |
| GitHub Actions | actionlint, zizmor. |
| Docs/config hygiene | markdownlint-cli2, yamllint, Taplo, check-jsonschema. |
| Mutation testing | Mutmut target ratchet, result ratchets, advisory deep sweep executor. |
| Agent repair loop | .verify-logs, context commands, repair plans, PR summaries, static HTML reports. |
Read more: optional gates, supported scans and agent use, ecosystem provider status, multi-ecosystem reviewability policy,
mutation testing, architecture policy, test intelligence.
Ratcheting: Improve Existing Repos Without Freezing Them
Legacy repos usually cannot become strict overnight. Agent Maintainer separates new regressions from old debt:
- changed-code coverage can block new untested work;
- suppression budget blocks new broad
noqa,type: ignore, and coverage escapes; - file-length and structure checks can warn before they block;
- ratchet commands rank the next repair targets;
- mutation target/result ratchets keep high-value mutation testing focused.
Useful commands:
python3 -m agent_maintainer ratchet status
python3 -m agent_maintainer ratchet next
python3 -m agent_maintainer test-intel mutation-results
python3 -m agent_maintainer test-intel mutation-sweep
Read more: ratcheting, mutation testing, cohesive change plans.
How Agents Should Use It
For agent-heavy repos, install the agent track and commit the generated
guidance:
agent-maintainer init --track agent --preset ai-agent-heavy
python3 -m agent_maintainer guidance
Then agents should follow this loop:
- Read
AGENTS.mdandAGENTS.agent-maintainer.md. - Make a small, coherent change.
- Run focused tests while editing.
- Run
python3 -m agent_maintainer verify --profile precommitbefore finishing. - If verification fails, inspect
.verify-logs/LAST_FAILURE.mdand use the suggestedcontextcommand instead of dumping raw logs. - For larger work, run
full,ci,security, andmanualonce before PR.
Helpful repair commands:
python3 -m agent_maintainer context failures --limit 20
python3 -m agent_maintainer context log pyright --tail 120
python3 -m agent_maintainer repair-plan
python3 -m agent_maintainer report html
Read more: agent hooks, context safety, diagnostics repair loop.
Trust Model
Agent Maintainer is designed to be safe to try:
- MIT licensed and open source.
- Package-first; downstream repos should not vendor
src/agent_maintainer. - Local-first verification; normal checks run against your repo and local tool outputs.
- Hooks no-op outside repos with
[tool.agent_maintainer]. - Output is bounded; raw logs live in
.verify-logs/runs/<run-id>/. - Secret scan artifacts are treated as sensitive/redacted diagnostics.
- CI uses least-privilege permissions and package-index publishing uses trusted publishing.
- This repo dogfoods strict settings, Python 3.11-3.14 compatibility, release checks, mutation ratchets, OSV, SBOM, licenses, docs/config hygiene, Codex hooks, and Claude Code hooks.
Read more: Release checklist, troubleshooting, 0.1.0b4 release notes.
Configuration
Configuration can live in pyproject.toml or in a neutral Agent Maintainer
config file. Python repos should usually keep using [tool.agent_maintainer]
in pyproject.toml; mixed or future non-Python repos can use
.agent-maintainer/config.toml or agent-maintainer.toml.
[tool.agent_maintainer]
mode = "custom"
architecture_tool = "import-linter"
source_roots = ["src"]
test_roots = ["tests"]
package_paths = ["src"]
coverage_source = ["src"]
require_tests = true
coverage_fail_under = 80
diff_cover_fail_under = 90
[tool.agent_maintainer.diagnostics]
enabled = true
log_dir = ".verify-logs"
run_history_limit = 10
Precedence is built-in defaults, mode defaults, file config, environment
variables, then CLI flags. When multiple file configs exist,
pyproject.toml [tool.agent_maintainer] wins; otherwise
.agent-maintainer/config.toml wins over agent-maintainer.toml.
Environment overrides use the AGENT_MAINTAINER_* prefix.
AGENT_MAINTAINER_SOURCE_ROOTS=src,tests python3 -m agent_maintainer doctor
Read more: quick start, structure cohesion, tool map.
Setup Recommendations
Ask Agent Maintainer to inspect the repo before choosing a track and preset:
python3 -m agent_maintainer assess setup
python3 -m agent_maintainer assess setup --json
The advisor recommends core, agent, or hardening; a starting preset;
optional gates that match repository evidence; and follow-up prompts a coding
agent should answer before tightening config.
Read more: setup advisor.
Reviewability Assessment
Inspect changed files by provider ecosystem and role without changing blocking policy:
python3 -m agent_maintainer assess reviewability
python3 -m agent_maintainer assess reviewability --json
This is advisory. In the current beta, blocking reviewability gates remain Python-backed while TypeScript/JavaScript policy adapters mature.
Read more:
multi-ecosystem reviewability policy.
Technical Debt Score
Generate an advisory maintenance-risk scorecard:
python3 -m agent_maintainer assess debt
python3 -m agent_maintainer assess debt --json
python3 -m agent_maintainer report html
The score is lower-is-better and decomposes into reviewability, tests/coverage,
type/style, architecture, dependencies/security, docs/config hygiene,
diagnostics, and ratchet/mutation maturity. It writes JSON and Markdown
artifacts under .verify-logs and appears in the verification summary and HTML
report when present.
Read more: Technical Debt Score.
Install From Source
For local development on Agent Maintainer itself:
git clone https://github.com/douglasmonsky/agent-maintainer.git
cd agent-maintainer
python -m pip install -e ".[core]"
agent-maintainer --help
Normal downstream repositories should use the package-first init flow rather
than copying src/agent_maintainer into application source trees.
Local Development
For this repo:
PYTHONPATH=src python3 -m agent_maintainer bootstrap
PYTHONPATH=src python3 -m agent_maintainer doctor --strict
PYTHONPATH=src python3 -m agent_maintainer verify --profile precommit
PYTHONPATH=src python3 -m agent_maintainer verify --profile full
Refresh the pinned dev lock after changing config/dev-dependencies.txt:
PYTHONPATH=src python3 -m agent_maintainer bootstrap
.venv/bin/python -m pip freeze --exclude-editable | sort > config/dev-lock.txt
Read more: Release checklist, troubleshooting, roadmap.
Further Reading
Example starter projects:
- Fresh-strict example
- Legacy-ratchet example
- Context-safe ratchet proof example
- Cohesive change-plan proof example
- Test-intelligence proof example
Measured fixture case studies:
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file agent_maintainer-0.1.0b5.tar.gz.
File metadata
- Download URL: agent_maintainer-0.1.0b5.tar.gz
- Upload date:
- Size: 270.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bc91af4206388188c91e88ccbca8bfe90e1e31cafd14ef4323c7a9c5fcd734c2
|
|
| MD5 |
fb4401f9ffb43e720e2c76426615df1a
|
|
| BLAKE2b-256 |
3f525ee50b51b120e22cfcf845c403ac811ab9f47da57dbf170e2bf10fd0221a
|
Provenance
The following attestation bundles were made for agent_maintainer-0.1.0b5.tar.gz:
Publisher:
publish.yml on douglasmonsky/agent-maintainer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agent_maintainer-0.1.0b5.tar.gz -
Subject digest:
bc91af4206388188c91e88ccbca8bfe90e1e31cafd14ef4323c7a9c5fcd734c2 - Sigstore transparency entry: 2058864201
- Sigstore integration time:
-
Permalink:
douglasmonsky/agent-maintainer@d09c73db82d8690a5ae49466be09eca6085c6b84 -
Branch / Tag:
refs/tags/v0.1.0b5 - Owner: https://github.com/douglasmonsky
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d09c73db82d8690a5ae49466be09eca6085c6b84 -
Trigger Event:
release
-
Statement type:
File details
Details for the file agent_maintainer-0.1.0b5-py3-none-any.whl.
File metadata
- Download URL: agent_maintainer-0.1.0b5-py3-none-any.whl
- Upload date:
- Size: 380.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5e9c38aa905689d2f19e10ab26fa608ca22362a826f7c75a3a36a13ca52d78cf
|
|
| MD5 |
6e0d4afc337251f0c2f8ff2f995017c3
|
|
| BLAKE2b-256 |
2028924d1958e249241e86b59b401f0211c3016798267ce80d50e3ef82947410
|
Provenance
The following attestation bundles were made for agent_maintainer-0.1.0b5-py3-none-any.whl:
Publisher:
publish.yml on douglasmonsky/agent-maintainer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agent_maintainer-0.1.0b5-py3-none-any.whl -
Subject digest:
5e9c38aa905689d2f19e10ab26fa608ca22362a826f7c75a3a36a13ca52d78cf - Sigstore transparency entry: 2058864334
- Sigstore integration time:
-
Permalink:
douglasmonsky/agent-maintainer@d09c73db82d8690a5ae49466be09eca6085c6b84 -
Branch / Tag:
refs/tags/v0.1.0b5 - Owner: https://github.com/douglasmonsky
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d09c73db82d8690a5ae49466be09eca6085c6b84 -
Trigger Event:
release
-
Statement type: