Skip to main content

buildwright

The craftsman who builds per the spec — one model per agent: mechanical steps go to the local model (cheap, fast), important decisions to the remote one (strong). The role→model mapping is configuration, not code — switching models touches zero lines of pipeline.

Install

uv tool install buildwright      # once published to PyPI
# or for development:
uv sync

Division of roles (one tool, one job)

Piece Role Where it lives
LangGraph the ORDER of the steps (graph, state, retries) graph.py
PydanticAI EACH STEP (agent with structured output) agents.py
LiteLLM WHO serves the model (optional proxy, fallbacks) litellm/config.yaml
Langfuse WHETHER IT WORKED (traces, scores) observability.py

The pipeline

START → plan (local)  →  execute (remote)  →  review (local)  →  END
        Plan struct.      final answer        Review struct.

Each node is a PydanticAI agent; the model is decided by the role in Settings (BW_ROLE_*), resolved against the models.yaml registry.

Quickstart

uv sync
cp .env.example .env          # adjust BW_ROLE_* and keys

uv run buildwright models     # list local and remote models
uv run buildwright roles      # role -> model mapping
uv run buildwright ask "write a snake game in python with pygame"

With no endpoints available, ask fails naming the exact model and the missing env var.

Local and remote models

The whole registry speaks OpenAI-compatible (models.yaml):

  • local/qwen3 → Ollama at localhost:11434/v1
  • local/llamacpp → llama-server at localhost:8080/v1 (your GGUF)
  • remote/gpt-4o-mini, gpt-4o → OpenAI (key via OPENAI_API_KEY)
  • remote/claude-sonnet → Anthropic's OpenAI-compat layer
  • litellm/* → via the LiteLLM proxy (see docker-compose.yml)

Registry resolution: BW_MODELS_FILE > project-local ./models.yaml > the models.yaml bundled with the package. Adding a model = adding 5 lines. Reassigning one to an agent = changing a BW_ROLE_* in .env.

Optional full stack (LiteLLM + Langfuse + Ollama)

With Docker, docker compose up -d brings up LiteLLM (routing/fallbacks), Langfuse (traces) and Ollama. Langfuse keys show up in its admin UI; copy them to .env and tracing turns itself on (without keys, the tracer is a no-op).

Publishing to PyPI

Trusted publishing — no API tokens:

  1. Create github.com/jordimarsal/buildwright and push main.
  2. On pypi.org: Add a pending publisher → owner jordimarsal, repo buildwright, workflow release.yml, environment pypi.
  3. git tag v0.1.0 && git push --tags → the workflow runs uv build and publishes.

Harness runtime

In a project initialized with harness:

buildwright harness status                          # board + planned routing (read-only)
buildwright harness run                             # ONE supervised implementer batch
buildwright harness run --feature f3_dashboard      # specific feature
  • status parses and schema-validates harness/feature_list.json (protocol v1) and shows the board plus which model each role would use.
  • run (phase 1) picks the first in_progress feature, takes the next pending batch of tasks.md (capped at 4, harness discipline), confirms with you, and runs the implementer — with read/write/edit/list and an allowlisted run_command — inside an isolated git worktree (.buildwright/, locally excluded). When it finishes it verifies on disk: checkbox states re-read and git status --porcelain diffed. It never merges and never flips feature status: review with git -C <worktree> diff.
  • Command allowlist defaults are built in; extend or retime via an optional project-owned harness/runtime.yaml:
extra_allowed_commands:
  - terraform plan
command_timeout_s: 300

The unattended multi-phase design lives in docs/specs/2026-10-27-harness-runtime-design.md.

Tests

uv run pytest        # offline: pydantic-ai's TestModel, zero network

Anti-mess rules

  1. Everything speaks OpenAI protocol; PydanticAI never imports litellm.
  2. One agent = one node = one job. No agents inside agents.
  3. Tracing registered exactly once (observability.py); never scattered.
  4. Offline evals in CI rule; Langfuse is production monitoring.
  5. Each piece joins when it has a real trigger (fallbacks→LiteLLM, non-linear flow→LangGraph is already in).

Metadata

Release files for buildwright 0.3.0

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

Source distribution (sdist)

Source distribution for buildwright 0.3.0
File Size Uploaded Provenance Actions
buildwright-0.3.0.tar.gz 183.4 kB With provenance Details for buildwright-0.3.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for buildwright 0.3.0
File Interpreter ABI Platform Actions
buildwright-0.3.0-py3-none-any.whl Python 3 none any Details for buildwright-0.3.0-py3-none-any.whl

Total release size: 202.0 kB

Release files / buildwright-0.3.0.tar.gz

Download URL buildwright-0.3.0.tar.gz
Size 183.4 kB
Tags Source
SHA-256 checksum
How to use checksums
10d88d5e4985a1e62ed958786708dbd43940443049e5ac1b02c140c13472c446
BLAKE2b-256 checksum
How to use checksums
f9d8990c69703cbbb2f8a69d565c8b45d6ab9dfcc50ae2e2a8c35c971ad8f89d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Oct 27, 2026.

Transparency log

Release files / buildwright-0.3.0-py3-none-any.whl

Download URL buildwright-0.3.0-py3-none-any.whl
Size 18.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1c78f63c460373844ac47deee79dfcb873215f1aeda0181ef4172f482ed27501
BLAKE2b-256 checksum
How to use checksums
3c55551168c966e051ee7af3626fad917d3bc17cd19252808b527ffb4abda6af
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Oct 27, 2026.

Transparency log

Security for buildwright 0.3.0

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 buildwright-0.3.0.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 Oct 27, 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.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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