Skip to main content

Autonomous GitHub repository maintenance powered by Copilot

Project description

Caretaker

Autonomous GitHub repository management powered by Copilot and github app.

Caretaker Avatar

Documentation: https://ianlintner.github.io/caretaker/

One issue. No CLI. No tooling. Paste a setup issue into your repo, assign it to @copilot, walk away. Your repo is now autonomously maintained.


How It Works

  1. You paste a setup issue into your repo and assign it to @copilot
  2. Copilot reads our SETUP_AGENT.md, analyzes your repo, and opens a PR with everything configured
  3. You merge the PR
  4. The orchestrator runs daily via GitHub Actions, managing PRs, issues, and upgrades

The orchestrator uses Copilot as its execution engine — it observes your repo state, decides what needs to happen, and delegates code changes to Copilot via structured comments.


Setup

1. Create a new issue in your repo:

Tip: Visit the Getting Started docs and use the copy button on the code block below to copy the issue template in one click.

## Setup Caretaker

@copilot Please set up the caretaker system for this repository.

### Instructions

1. Read the setup guide at:
   https://github.com/ianlintner/caretaker/blob/main/setup-templates/SETUP_AGENT.md

2. Follow the instructions in that guide exactly.

3. After creating all files, open a single PR with the changes.
   Title: "chore: setup caretaker"

### Context

This repo uses the caretaker system for automated repo management.
See: https://github.com/ianlintner/caretaker

2. Assign the issue to @copilot

3. Review and merge the PR that Copilot opens

4. Add COPILOT_PAT from a write-capable user for Copilot hand-offs, and ANTHROPIC_API_KEY for enhanced AI features

COPILOT_PAT should be a fine-grained PAT that belongs to a real user or machine user with write access to the repository. Caretaker uses that token for:

  • API-based assignment of issues to GitHub Copilot
  • PR comments that @copilot must see as coming from a write-capable identity rather than github-actions[bot]

What Gets Installed

After setup, your repo has:

.github/
  copilot-instructions.md         ← Copilot project memory (appended)
  agents/
    maintainer-pr.md              ← PR agent persona
    maintainer-issue.md           ← Issue agent persona
    maintainer-upgrade.md         ← Upgrade agent persona
  maintainer/
    config.yml                    ← Repo-specific settings
    .version                      ← Pinned version

No Python. No Node. No vendored code. No GitHub Actions workflow either — all execution happens server-side, driven by App webhooks. Just config and Copilot instructions.


Features

Coding backends

When an agent needs to make a code change, it routes through the ExecutorDispatcher, which picks one of four backends per dispatch:

  • Copilot@copilot hand-off comment (the legacy default).
  • Foundry — in-process LLM tool loop, drives Azure AI Foundry or any LiteLLM-compatible provider directly from mcp_backend.
  • HandoffAgent — tags the PR/issue and lets claude-code-action or opencode_local GitHub Actions run asynchronously.
  • K8s Job — durable per-task pod for long-running work; brokered through Azure Service Bus and the caretaker-job-dispatcher deployment.

Three labels override per-item: agent:custom, agent:copilot, agent:quarantine.

Core Agents

These eleven agents handle the day-to-day repository workload. Seven additional specialist agents (review, principal, refactor, perf, migration, test, bootstrap) are documented in docs/agents.md.

PR Agent

  • Monitors all open PRs in real-time
  • Detects and triages CI failures (test, lint, build, type errors)
  • Requests fixes from Copilot via structured comments
  • Retry loop with escalation after max attempts
  • Auto-merge for Copilot, Dependabot, and human PRs (configurable)
  • Handles flaky test detection and CI re-runs
  • Review state analysis and auto-approval (configurable)

Issue Agent

  • Triages incoming issues (bug, feature, question, duplicate, stale)
  • Dispatches implementable issues through the configured coding backend
  • Tracks issue → PR → merge lifecycle
  • Auto-closes answered questions and stale issues (configurable)
  • Escalates complex issues to repo owners

DevOps Agent

  • Monitors default-branch CI failures
  • Automatically creates fix issues for build/test failures
  • Deduplicates similar issues with cooldown periods
  • Routes fixes through the configured coding backend

Self-Heal Agent

  • Detects mcp_backend and dispatcher failures
  • Creates self-diagnosis issues
  • Reports bugs to upstream caretaker repository (configurable)
  • Ensures the system can maintain itself

Security Agent

  • Triages Dependabot alerts
  • Monitors code scanning findings
  • Tracks secret scanning alerts
  • Filters by severity thresholds
  • Creates remediation issues with context

Dependency Agent

  • Reviews Dependabot PRs
  • Auto-merges patch and minor updates (configurable)
  • Posts dependency update digests
  • Smart merge strategies by update type

Docs Agent

  • Reconciles merged PRs into changelog updates
  • Maintains documentation freshness
  • Configurable lookback period
  • Optional README updates

Charlie Agent

  • Cleans up duplicate caretaker-managed issues and PRs
  • Closes abandoned work after 14-day default window
  • Prevents operational clutter accumulation
  • Exempt label support for critical work

Stale Agent

  • Warns and closes stale issues and PRs (60+ days default)
  • Deletes merged branches automatically
  • Configurable stale thresholds
  • Exempt labels for pinned or security work

Escalation Agent

  • Creates human escalation digest issues
  • Aggregates work requiring maintainer attention
  • Configurable targets and notification
  • Tracks escalation age and priority

Upgrade Agent

  • Detects new caretaker releases
  • Creates upgrade issues for the configured coding backend to execute
  • Supports multiple strategies: auto-minor, auto-patch, latest, pinned
  • Handles breaking vs. non-breaking upgrades
  • Version pinning via .version file
  • Preview channel support

Advanced Features

Goal Engine (Experimental)

  • Quantitative goal-based agent dispatch
  • Measures repository health across dimensions:
    • CI health (green builds on main and PRs)
    • PR lifecycle velocity
    • Security posture
    • Self-health monitoring
  • Scores each goal from 0.0 (unmet) to 1.0 (satisfied)
  • Prioritizes agents based on goal impact
  • Detects divergence and critical states
  • Tracks goal history for trend analysis

Memory Store

  • Disk-backed SQLite storage for agent memory
  • Persistent deduplication across runs
  • Namespaced memory for different agent concerns
  • Automatic snapshot generation for auditing
  • Bounded storage with configurable limits

Optional: Claude Integration

Add ANTHROPIC_API_KEY to unlock enhanced AI features:

  • CI log analysis — better at parsing long, noisy logs
  • Architectural review — understands complex code review comments
  • Issue decomposition — breaks down multi-faceted bugs
  • Upgrade impact analysis — assesses breaking change risk

Optional: OpenRouter Integration

Set OPENROUTER_API_KEY (or its accepted alias OPEN_ROUTER_API_KEY) and provider: openrouter in .github/maintainer/config.yml to route LLM calls through OpenRouter, which gives you:

  • 300+ models behind one key — DeepSeek R1, Gemini, Llama, Qwen, GLM, plus all the proprietary frontier models.
  • Per-feature model routing — pin different caretaker features to different best-fit models via feature_models.
  • Web-grounded analysis — append :online to a model string to add a web search step before the completion. Caretaker ships this as the default for upgrade_impact_analysis, migration_analysis, and migration_plan so release-note and breaking-change context comes from current sources rather than stale model knowledge.

Sample config:

llm:
  provider: openrouter
  default_model: openrouter/anthropic/claude-sonnet-4.6
  feature_models:
    ci_log_analysis:
      model: openrouter/deepseek/deepseek-r1
    principal_architecture_review:
      model: openrouter/anthropic/claude-opus-4.6

Cost note: :online adds OpenRouter's web-search step (~$4 per 1k searches) on top of the model call. The caretaker.llm.online=true OTel span attribute lets you break out web-grounded spend in cost dashboards.

When provider: openrouter is set, every model string must begin with openrouter/. Caretaker rejects bare model names at config-load to prevent the silent bypass to Anthropic-direct that LiteLLM otherwise performs.


What's new

Fleet registry (opt-in)

Each consumer repo's successful caretaker run can POST a small heartbeat to a central caretaker backend so an operator sees every managed repository in one dashboard — without running an org-wide GitHub crawl.

Enable in .github/maintainer/config.yml:

fleet_registry:
  enabled: true
  endpoint: https://<your-caretaker-backend>/api/fleet/heartbeat

See docs/fleet-registry.md for architecture, payload shape, and HMAC-signed delivery.

Custom coding agent

Small tasks (lint fixes, trivial test failures, review comments) no longer have to go to copilot-swe-agent[bot]. A configurable executor routes them to caretaker's own Foundry tool-loop or to an anthropics/claude-code-action hand-off, with a size-budget guard and an explicit escalation path back to Copilot.

Three routing labels let operators steer individual items:

  • agent:custom — force the custom executor.
  • agent:copilot — force the legacy path.
  • agent:quarantine — refuse dispatch (for hostile or confusing issues).

On AKS deployments, the MCP backend exposes POST /api/admin/agent-tasks which spawns a short-lived batch/v1 Job per dispatch. See docs/custom-coding-agent-plan.md for the full design, phased rollout, size budget, and security model; docs/custom-coding-agent-e2e.md for the operator runbook.


Configuration

See setup-templates/templates/config-default.yml for the full config schema.

Key settings:

pr_agent:
  auto_merge:
    copilot_prs: true # Auto-merge Copilot PRs
    dependabot_prs: true # Auto-merge dependency updates
  copilot:
    max_retries: 2 # Fix attempts before escalation

issue_agent:
  auto_assign_bugs: true # Auto-assign simple bugs to Copilot
  auto_assign_features: false

devops_agent:
  target_branch: main # Monitor default branch CI
  max_issues_per_run: 3 # Prevent issue spam
  dedup_open_issues: true

security_agent:
  min_severity: medium # Filter by severity
  include_dependabot: true
  include_code_scanning: true
  include_secret_scanning: true

dependency_agent:
  auto_merge_patch: true
  auto_merge_minor: true
  post_digest: true

charlie_agent:
  stale_days: 14 # Short janitorial window for caretaker-managed work
  close_duplicate_issues: true
  close_duplicate_prs: true

stale_agent:
  stale_days: 60 # General stale threshold
  close_after: 14
  delete_merged_branches: true

upgrade_agent:
  strategy: auto-minor # auto-minor | auto-patch | latest | pinned
  channel: stable # stable | preview

goal_engine:
  enabled: false # Experimental: goal-driven dispatch
  goal_driven_dispatch: false # Reorder agents by goal impact
  divergence_threshold: 3 # Runs before triggering alerts

memory_store:
  enabled: true # Persistent agent memory
  db_path: .caretaker-memory.db
  max_entries_per_namespace: 1000

Architecture

The orchestrator runs server-side on AKS, not in your repo. Three deployable processes split the work:

GitHub App webhooks
  │
  ▼
mcp_backend (FastAPI x2, AKS)
  │   ├── HMAC + allow-list
  │   ├── dedup + rate-limit
  │   └── Redis Streams ──► agent router ──► ExecutorDispatcher
  │                                              │
  │                                              ├──► Copilot @-mention (legacy)
  │                                              ├──► Foundry  (in-process LLM tool loop)
  │                                              ├──► HandoffAgent  (opencode_local / claude-code-action)
  │                                              └──► Azure Service Bus ──► caretaker-job-dispatcher
  │                                                                              │
  │                                                                              ▼
  │                                                                         per-task K8s Job
  │                                                                              │
  ▼                                                                              ▼
MongoDB / Cosmos · Neo4j · SQLite                                          git push + PR comment

Eighteen agents live behind the dispatcher, grouped by trigger (event-driven, scheduled, dispatch-time / advisory). The orchestrator never writes code itself — it routes to one of four coding backends.

For diagrams of the runtime topology, webhook event pipeline, durable coding-job lifecycle, and full agent inventory, see docs/architecture.md.


Development

# Clone and install
git clone https://github.com/ianlintner/caretaker.git
cd caretaker
pip install -e ".[dev]"

# Run tests
pytest tests/ -v

# Lint
ruff check src/ tests/
ruff format --check src/ tests/

# Type check
mypy src/

License

MIT

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

caretaker_github-0.29.4.tar.gz (821.8 kB view details)

Uploaded Source

Built Distribution

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

caretaker_github-0.29.4-py3-none-any.whl (935.5 kB view details)

Uploaded Python 3

File details

Details for the file caretaker_github-0.29.4.tar.gz.

File metadata

  • Download URL: caretaker_github-0.29.4.tar.gz
  • Upload date:
  • Size: 821.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for caretaker_github-0.29.4.tar.gz
Algorithm Hash digest
SHA256 7df387aa4139b47c2a0aae9d18de992de18680ce950eda2cdf0d3f6692c1043a
MD5 f63c6442645a78730fc2d1fba07d252e
BLAKE2b-256 417458257799b6b3c82e03166e59a90df83b81c0c9baf936ac60f441177392e7

See more details on using hashes here.

File details

Details for the file caretaker_github-0.29.4-py3-none-any.whl.

File metadata

File hashes

Hashes for caretaker_github-0.29.4-py3-none-any.whl
Algorithm Hash digest
SHA256 99933f942bb7a6a4cd7675bec4b7ed52882b3ea9b7109e55843b0f8d29664280
MD5 be041a257c581463d7e0f26132e1570f
BLAKE2b-256 761c4292c740c0da9c43a9c6e271de7a00c8b8f3bb3361a98feb99ce804d8af7

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