Skip to main content

Your code evolves while you sleep. 🦉 Spec-driven autonomous coding loop.

Project description

owloop — Your code evolves while you sleep

PyPI MIT License Python 3.10+ CI Website

Your code evolves while you sleep.


owloop is a spec-driven autonomous coding loop for Claude Code. You write specs, start the loop, and wake up to clean commits.

Each iteration spawns a fresh agent with zero accumulated context, verifies every acceptance criterion with real shell commands, and only commits when they pass.

owloop run → pick spec → fresh agent → verify with shell → commit → next spec → 🌅

Quick Start

uv tool install owloop        # or: pip install owloop

owloop init                    # scaffolds .owloop/ directory
owloop spec "refactor error handling"   # agent scans code, drafts spec, asks for approval
owloop run                     # start the loop — Ollie takes it from here
All commands
Command Description
owloop init Initialize project (creates .owloop/, .gitignore entries)
owloop spec "goal" Turn a goal into a concrete spec via agent clarification
owloop check Validate all specs before running (pre-flight linter)
owloop run Start the autonomous loop with TUI
owloop run -n 20 Limit to 20 iterations
owloop run --max-tokens 200000 Stop after token budget reached
owloop run --idle-timeout 1800 Kill hung agent after 30 min silence
owloop status Show specs and completion progress
owloop report Generate AI-powered HTML summary report
owloop report --no-ai Generate fast, offline report
owloop spec-from-issue 42 Generate a spec from a GitHub issue
owloop version Show installed version

How It Works

%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#d4a025', 'primaryTextColor': '#0b1026', 'primaryBorderColor': '#3a4270', 'lineColor': '#3a4270', 'secondaryColor': '#121a2e', 'tertiaryColor': '#121a2e', 'fontFamily': 'Inter, system-ui, sans-serif' }}}%%
graph LR
    A["🦉 Pick spec"]:::owl --> B["fresh agent context"]:::neutral
    B --> C{"DONE?"}:::neutral
    C -- yes --> D["✅ Commit"]:::neutral --> E{"More specs?"}:::neutral
    C -- no --> R["🔄 Retry ≤3"]:::retry --> A
    E -- yes --> A
    E -- no --> F["🌅 Complete"]:::done

    classDef owl fill:#d4a025,stroke:#d4a025,color:#0b1026
    classDef done fill:#8fd19e33,stroke:#8fd19e,color:#f2ecd8
    classDef retry fill:#e0777d33,stroke:#e0777d,color:#f2ecd8
    classDef neutral fill:#121a2e,stroke:#3a4270,color:#f2ecd8
Property How
Fresh context Each iteration is a brand-new claude -p process. No context rot.
Deterministic completion grep for <promise>DONE</promise> — no AI judgment needed.
Worktree isolation Runs in a separate git worktree. Your main checkout stays untouched.
Auto Mode --permission-mode auto: asks before risky moves, never YOLO.
Token budget cap --max-tokens stops the run before costs spiral.
AI reports owloop report produces a reviewable HTML artifact after each run.
More features
  • Cross-iteration notesrun-notes.md carries learnings between iterations.
  • Fix-loop detection — same files modified 3+ rounds triggers a death-spiral warning.
  • Sleep prevention — keeps your machine awake during overnight runs (macOS / Linux / Windows).
  • Pre-flight lintingowloop check validates specs before the loop starts.

Specs

Specs are constraint-oriented: define what to do, what's off-limits, and make every acceptance criterion a shell command.

# Spec: Extract ValidationError Handling

## Priority: 1

## Requirements
- Extract repeated `except ValidationError` blocks into a single `@app.errorhandler`

## Acceptance Criteria
- [ ] grep -c "except ValidationError" backend/app/api/*.py  →  ≤ 5
- [ ] uv run ruff check backend/  →  0 errors

## Exclusions
- Do NOT change API response formats
- Do NOT touch models/, schemas/, services/

If you can write a shell command that verifies "done", it's a good owloop task. If "done" requires a human to look and decide, it's not.

Compared To

owloop Claude Code /goal
Completion signal grep (deterministic) Haiku model (probabilistic)
Context Fresh per iteration Same session
Specs Constraint-oriented Free-form
Best for Backlog of verifiable tasks One focused task

FAQ

When should I use owloop instead of /goal?

/goal is great for one task in one sitting. owloop is for backlogs — a queue of specs, each run in a fresh context, unattended overnight. If you're clearing twenty lint categories or migrating a whole module, owloop scales further than one long session.

Is this safe to run on production code?

owloop runs in a separate git worktree with --permission-mode auto. Your main branch stays clean. Treat every overnight run as a PR to review in the morning, not a deploy.

Development

uv sync --group dev          # install dev dependencies
uv run pytest -q             # run tests with coverage
uv run ruff check src/owloop tests
uv run mypy src/owloop tests

Brand

owloop's identity — Ollie the owl, the night/amber palette, and the "your code evolves while you sleep" story — is documented in .github/BRAND.md.

Credits

Inspired by and built upon:

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

owloop-0.3.1.tar.gz (428.6 kB view details)

Uploaded Source

Built Distribution

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

owloop-0.3.1-py3-none-any.whl (64.2 kB view details)

Uploaded Python 3

File details

Details for the file owloop-0.3.1.tar.gz.

File metadata

  • Download URL: owloop-0.3.1.tar.gz
  • Upload date:
  • Size: 428.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for owloop-0.3.1.tar.gz
Algorithm Hash digest
SHA256 9c69d3664fd4e199b3761ef39076da7d85f91740735c3724b588b4b2d92d8cd4
MD5 2643a6e45932b0c6691df013a2ff1bbe
BLAKE2b-256 f3f9a3d44f814f0f0a246cf4c0d9f831cd31ed1ca84e162212508aed68dcf98a

See more details on using hashes here.

Provenance

The following attestation bundles were made for owloop-0.3.1.tar.gz:

Publisher: release.yml on caoergou/owloop

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

File details

Details for the file owloop-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: owloop-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 64.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for owloop-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 4c13ce9e8a6ff2e2a0f0539ce1c72b3a381f0ec9d28541aea277a772d523dbab
MD5 a2c7ef7f5d95997bee77acc209b799cf
BLAKE2b-256 f6851d1cb3aea9b51452276a478d38ff956dcbfbe4abe6587a7464802b1185f1

See more details on using hashes here.

Provenance

The following attestation bundles were made for owloop-0.3.1-py3-none-any.whl:

Publisher: release.yml on caoergou/owloop

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