Forgeo is a software factory for your coding agent.
Give it a backlog and an agent CLI — Forgeo picks the next runnable task, runs the agent, and commits the result. It tracks progress in plain files and a web dashboard, and only interrupts you when a human decision is needed.
- One task at a time — oldest
OPENtask whose dependencies areCOMPLETED(or arun_atschedule).REVIEWblocks dependants but not independent tasks. - Agent-agnostic — any CLI that reads
FORGEO_TASK(aider, Claude, custom script). - Refactors when idle — runs a refactoring pass when the backlog is empty.
- Handles failure gracefully —
BLOCKEDfor human input (BLOCKER.md),FAILEDwith retry policy, snapshots for file backlogs, Telegram/webhook notifications. - Optional review —
review_mode: branchcommits toforgeo/review/TASK-001, marksREVIEW, pushes and waits for human merge →Complete.
Requires a terminal, a git repo, and an agent CLI.
Quickstart
Full walkthrough: Getting Started.
1. Install
Pick one (no root; re-run to upgrade):
brew install lucaGazzola/forgeo/forgeo # Homebrew, no Python needed
curl -fsSL https://forgeo.org/install.sh | bash # binary or pip fallback
pipx install forgeo-cli # Python 3.11+
2. Init
forgeo init
Wizard in your project root. Creates forgeo.yaml and .forgeo/ (backlog, logs, blockers). Prompts for backlog provider (file / github / gitlab / jira / http) and agent command. For github it auto-detects owner/repo and can persist GITHUB_TOKEN to ~/.config/forgeo/.
3. Fill the backlog
# file provider: edit .forgeo/backlog.json (see Backlog format)
# github/gitlab/jira/http: configured in forgeo.yaml, then:
forgeo validate
# or add tasks from the dashboard:
forgeo web # http://0.0.0.0:8790 (use -d to keep it running)
4. Start
forgeo validate # dry run: config, repo, backlog, agent, locks
forgeo start # daemon in background, one cycle per interval_minutes
Each cycle: pick task → run agent → commit/push (or REVIEW branch when review_mode: branch). Empty backlog → refactoring pass.
Day-to-day
forgeo status # config, counts, next task, daemon state, last outcome
forgeo once # one cycle in foreground, no daemon
forgeo run --task TASK-012 # run a specific OPEN task now
forgeo stop / restart # stop or restart daemon
forgeo web # dashboard for all instances
forgeo web is open by default on 0.0.0.0:8790. On a shared host use forgeo web --token for bearer auth — see Web console.
Docker sandbox
Run the agent isolated:
agent_sandbox: docker
agent_sandbox_image: your-image # must contain agent CLI + sh
agent_sandbox_network: none # default, no network
agent_sandbox_mounts: [~/.claude] # read-only mounts
Repo is bind-mounted at the same path; task arrives as FORGEO_TASK. See Configuration.
Multiple repos
One config per repo, fully independent (own backlog, logs, locks). Use the instance registry:
forgeo instance add site-a --config /path/to/site-a/forgeo.yaml
forgeo start --name site-a
forgeo list # all instances
forgeo web # aggregate dashboard
Documentation
| Topic | Doc |
|---|---|
| Install, init, first cycle | Getting Started |
All forgeo.yaml keys |
Configuration |
| Task schema & statuses | Backlog format |
| Agent env, exit codes, timeouts | Agent contract |
| All CLI commands | CLI reference |
| Dashboard & HTTP API | Web console & HTTP API |
Backlog providers: file · HTTP · Jira · GitHub · GitLab — file/HTTP exchange the full document; Jira/GitHub/GitLab sync issues individually. File backlogs are snapshotted (backlog.json.bak) before each run and restored if corrupt.
Dashboard: forgeo web aggregates every instance. For file/http it is the primary editor; for jira/github/gitlab it is a read-mostly mirror (links to native issues, surfaces BLOCKED/FAILED reasons and retry state).
Develop
pip install -e ".[dev]"
pytest
See CONTRIBUTING.md (quality gates: pytest, ruff check, mypy src/forgeo).
License
MIT — see LICENSE.
Metadata
Release files for forgeo-cli 0.11.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| forgeo_cli-0.11.0.tar.gz | 1.1 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| forgeo_cli-0.11.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.3 MB
Release files / forgeo_cli-0.11.0.tar.gz
| Download URL | forgeo_cli-0.11.0.tar.gz |
|---|---|
| Size | 1.1 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0c9c03caf11f3f060b8cdf06c486e516d48064fe5fa241f2a8a8fcbedc13ec1a
|
|
BLAKE2b-256 checksum How to use checksums |
a7c3a7a5af948b088b5c646e6b0ebf6ddd6e684e2b50ba6af3866c267e8f2181
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Aug 31, 2026.
Transparency logRelease files / forgeo_cli-0.11.0-py3-none-any.whl
| Download URL | forgeo_cli-0.11.0-py3-none-any.whl |
|---|---|
| Size | 154.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
52b376d0aef3111b566f1d4e17973a4d4147188d57c571475413538042ee3a8c
|
|
BLAKE2b-256 checksum How to use checksums |
cc7037c801c651d7ff165820496f6a4f953181f08c2696cba544c14fff451ad5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Aug 31, 2026.
Transparency log