AgentMachinist
Local-first agentic build & CI/CD for solo developers. AgentMachinist bridges GitHub issues to local coding harnesses — Claude Code, OpenCode, PI, or Codex — through a three-phase, human-in-the-loop pipeline that runs on your Mac.
New here? Start with the Getting Started guide.
Prefer a visual tour? Open docs/onboarding.html in a
browser — a self-contained illustrated handbook of the pipeline and its
principles.
GitHub issue (label: agent-task)
│
▼
Phase 1 · SPEC harness writes .machinist/specs/issue-<n>-spec.md
│ → branch agent/issue-<n> → draft PR (Closes #<n>)
▼
Phase 2 · APPROVE you review the spec; apply label machinist:approved
│ (or comment /machinist-execute on the PR)
▼
Phase 3 · EXECUTE local daemon implements the spec in an isolated
worktree, runs your tests, pushes to the PR branch,
and marks it ready for review
The agent never merges anything. You approve the spec before code is written, and you review the PR before it lands.
Install
uv tool install agentmachinist # or: uv tool install git+https://github.com/vscarpenter/AgentMachinist
Prerequisites: gh (authenticated), git, and at
least one coding harness CLI (claude, opencode, pi, or codex).
Quickstart
In the repository you want agents to work on:
machinist init # writes machinist.yaml, .machinist/, and GitHub workflows
machinist spec 42 # Phase 1 for issue #42 (or let `watch` pick it up)
machinist watch # daemon: polls for labeled issues and approved PRs
machinist run 42 # Phase 3 for an approved spec
Configuration (machinist.yaml)
version: 1
harness:
name: claude-code # claude-code | opencode | pi | codex
command: null # optional executable override
timeout_minutes: 30 # Phase 3 implementation budget
spec_timeout_minutes: 10 # Phase 1 spec budget
github:
repo: null # "owner/repo"; null = derived from origin
labels:
trigger: agent-task
approved: "machinist:approved"
poll_interval_seconds: 60
workspace:
root: ~/.machinist/workspaces
strategy: worktree # worktree | clone
cleanup: on_success # always | on_success | never
branch_prefix: agent/
tests:
command: null # e.g. "pytest -q"; null skips the test gate
Unknown keys are rejected — typos fail loudly instead of being ignored.
How approval works
The single source of truth is the machinist:approved label on the draft PR.
Apply it by hand, or comment /machinist-execute on the PR — the bundled
machinist-approve.yml workflow converts that comment into the label (only
for repo owners, members, and collaborators). Draft → Ready for Review is
reserved as the agent's signal that implementation is complete.
Spec generation: local or CI
Both paths run the same machinist spec <n> command:
- Local (default):
machinist watchsees theagent-tasklabel and generates the spec on your machine using your existing harness login. - CI: the bundled
machinist-spec.ymlworkflow runs it in GitHub Actions when an issue is labeled — works while your Mac sleeps, but requires anANTHROPIC_API_KEYrepository secret.
Status
v0.1 (M3): all three phases work end-to-end — init, spec, run,
status, and the watch daemon (--once for a single cron-friendly pass).
The pipeline has dogfooded itself: its own getting-started guide was specced,
approved, implemented, test-gated, and merged by the pipeline (issue #1 →
PR #3). See docs/superpowers/specs/ for the design.
Releasing (maintainer notes)
Publishing uses PyPI Trusted Publishing
— no tokens. One-time setup: on pypi.org under Publishing, add a pending
publisher for project agentmachinist (owner vscarpenter, repo
AgentMachinist, workflow release.yml, environment pypi). After that,
each release is: bump version in pyproject.toml, commit, then create a
GitHub Release for tag v<version> — the release workflow builds and
publishes automatically.
License
MIT — see LICENSE.
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 agentmachinist-0.1.0.tar.gz.
File metadata
- Download URL: agentmachinist-0.1.0.tar.gz
- Upload date:
- Size: 61.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
768bbb3bf981dc0077ffb2dcf14dddd7376c9aa460eba85d4fb72ced28ccde22
|
|
| MD5 |
cfcef30f0a87afe549dcdad0a37caf41
|
|
| BLAKE2b-256 |
8fc012195a9e3533cbe340d70cb677b9e998c8f65f5df56066d17e4c53c2f148
|
File details
Details for the file agentmachinist-0.1.0-py3-none-any.whl.
File metadata
- Download URL: agentmachinist-0.1.0-py3-none-any.whl
- Upload date:
- Size: 23.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3142e1e3896492c43d1ecfd384add96dffb72ace2f92fcaffdfb0b3898dc7b15
|
|
| MD5 |
865a9a248e7daf11a45d03c3626f5bcb
|
|
| BLAKE2b-256 |
99871bd7b66b22cdde2ea44ae2fd5eb4fc9c8d1f2dcc76eb1c6c3242a2f99a04
|