Skip to main content

sweat — Software Engineer August Tollerup

sweat is an autonomous software engineering agent. It runs on a schedule, picks unassigned tasks from Asana, implements them using Claude Code SDK, and opens GitHub pull requests — all without human intervention. A second agent reviews PRs, and a third audits code quality.


How It Works

cli.py start
 ├── ImplementerAgent (x N replicas, every hour)
 │    ├── 1. Fetch unassigned tasks from Asana
 │    ├── 2. Filter by work type, domain, estimated time
 │    ├── 3. Ask Claude to pick the most feasible task
 │    ├── 4. Assign task + post proposal comment in Asana
 │    ├── 5. Clone target GitHub repo to a temp dir
 │    ├── 6. Run Claude Code SDK (headless) to implement
 │    ├── 7. Commit + push branch, open GitHub PR
 │    └── 8. Post PR link back to Asana, clean up
 │
 ├── ReviewerAgent (every 60s)
 │    ├── 1. Poll open PRs on configured repos
 │    ├── 2. Skip self-authored and already-reviewed PRs
 │    └── 3. Run Claude Code SDK to review, post via GitHub API
 │
 └── CodeReviewerAgent (daily)
      ├── 1. Scan repo against quality standards doc
      ├── 2. Identify findings, deduplicate against existing tasks
      └── 3. Create Asana tasks for new findings

Project Structure

sweat/
├── cli.py                   # Entrypoint — runs all agent loops concurrently
├── config.py                # Env vars, agent definitions, project mappings
├── agents/
│   ├── base.py              # BaseAgent ABC with run_once()
│   ├── implementer.py       # Picks tasks, writes code, opens PRs
│   ├── reviewer.py          # Reviews open PRs
│   ├── code_reviewer.py     # Audits repo quality, creates tasks
│   └── registry.py          # Agent type registry
├── clients/
│   ├── asana.py             # Asana API wrapper
│   └── github.py            # GitHub API wrapper (PyGithub + GitPython)
├── agent.py                 # Claude Code SDK wrapper
├── task_selector.py         # Claude picks the most feasible task
├── task_filter.py           # Rule-based task filtering and sorting
├── task_claims.py           # In-memory lock to prevent duplicate claims
├── audit.py                 # Structured JSON audit log
├── telemetry.py             # OpenTelemetry traces + metrics (OTLP export)
├── prompts/
│   ├── task_prompt.py       # Implementation prompt builder
│   ├── review_prompt.py     # PR review prompt builder
│   └── code_review_prompt.py # Code quality audit prompt builder
├── knowledge/               # Persistent agent knowledge base
├── tests/                   # 96 unit tests (all external calls mocked)
├── Dockerfile               # Standalone container image
├── docker-compose.yml       # Single-service compose for deployment
└── pyproject.toml           # uv project config and dependencies

Quick Start

Prerequisites

  • Python 3.11+
  • uv package manager
  • Claude Code installed and authenticated
  • An Asana personal access token
  • A GitHub personal access token (or GitHub App, see below)

Install

git clone <repo-url> && cd sweat
uv sync

Configure

Copy .env.example to .env and fill in your credentials:

cp .env.example .env
ASANA_TOKEN=your_asana_personal_access_token
GITHUB_TOKEN=your_github_personal_access_token
ASANA_ASSIGNEE_GID=your_asana_user_gid
ANTHROPIC_API_KEY=your_anthropic_api_key

Then edit config.py to map your Asana projects to GitHub repos:

AGENTS = [
    {
        "id": "impl-myproject",
        "type": "implementer",
        "interval": 3600,
        "asana_assignee_gid": os.environ["ASANA_ASSIGNEE_GID"],
        "projects": [
            {
                "asana_project_id": "1234567890",
                "github_repo": "org/repo",
                "branch_prefix": "agent/",
            }
        ],
    },
    {
        "id": "reviewer-myproject",
        "type": "reviewer",
        "interval": 60,
        "projects": [
            {
                "github_repo": "org/repo",
                "branch_prefix": "agent/",
            }
        ],
    },
]

Run

# Start all agents (implementer + reviewer + code reviewer loops)
uv run python cli.py start

# Run reviewer agents once
uv run python cli.py review

# Run code review agents once
uv run python cli.py code-review

# View recent audit log
uv run python cli.py log --last 20

# Dry run (no side effects)
uv run python main.py --dry-run

Ctrl-C or SIGTERM shuts down cleanly.


Docker

sweat ships as a standalone Docker image. It does not bundle any observability infrastructure — bring your own Grafana Cloud, Datadog, or self-hosted OTel collector.

# Build
docker compose build

# Run (credentials in .env)
docker compose up -d

The compose file mounts a persistent volume for the audit log at /app/data/audit.jsonl.

Telemetry

sweat exports OpenTelemetry traces and metrics via OTLP gRPC. To enable, set OTEL_EXPORTER_OTLP_ENDPOINT in your .env:

OTEL_EXPORTER_OTLP_ENDPOINT=https://otlp.your-provider.com:4317

If the variable is unset, telemetry is silently disabled — no errors, no overhead.

Exported metrics:

Metric Type Description
sweat.agent.runs Counter Total run_once() cycles
sweat.agent.errors Counter Failed run_once() cycles
sweat.agent.run_duration_s Histogram Duration per cycle
sweat.tasks.implemented Counter Tasks successfully implemented
sweat.prs.opened Counter PRs opened
sweat.prs.reviewed Counter PRs reviewed
sweat.claude.calls Counter Claude SDK invocations
sweat.claude.call_duration_s Histogram Claude SDK call duration

Testing

uv run pytest -v

96 tests, all run in under a second. No real API calls — Asana, GitHub, and Claude SDK are mocked at the interface boundary.


Dependencies

Package Purpose
claude-agent-sdk Task selection + headless Claude Code execution
asana Asana REST API client
PyGithub GitHub API (PR creation, reviews)
GitPython Git operations (clone, branch, push)
python-dotenv .env file loading
opentelemetry-api Telemetry API
opentelemetry-sdk Telemetry SDK
opentelemetry-exporter-otlp-proto-grpc OTLP gRPC exporter

Metadata

Release files for sweat-agent 0.1.7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sweat-agent 0.1.7
File Size Uploaded Provenance
sweat_agent-0.1.7.tar.gz 185.6 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for sweat-agent 0.1.7
File Interpreter ABI Platform
sweat_agent-0.1.7-py3-none-any.whl Python 3 none any Details

Total release size: 245.6 kB

Release files / sweat_agent-0.1.7.tar.gz

Download URL sweat_agent-0.1.7.tar.gz
Size 185.6 kB
Tags Source
SHA-256 checksum
How to use checksums
cf84217d14d51e337ef56486cff9eb47a1e40c86f75e9bc09a18f9b67d9ba556
BLAKE2b-256 checksum
How to use checksums
a8b9108a0a6f1917c6eabaaab0b9b9fcde39450a56bf9ec0026fa679c7ab1b2f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 23, 2026.

Transparency log

Release files / sweat_agent-0.1.7-py3-none-any.whl

Download URL sweat_agent-0.1.7-py3-none-any.whl
Size 60.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4185f2e85da51e16027f1e255430f8c85b958a4153066a18e317d3eac0441eed
BLAKE2b-256 checksum
How to use checksums
a90d5d6a5adc29c0efb6e3fc7ec511cae629d948a1606f4454233d1498b2c658
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 23, 2026.

Transparency log

Security for sweat-agent 0.1.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for sweat_agent-0.1.7.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 23, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page