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.
Full walkthrough: Getting Started.
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+forgeo initWizard 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 issue providers it offers a PAT or OAuth login (forgeo auth login → ~/.config/forgeo/tokens/); GitHub repository detection is automatic when possible, while Jira asks for its URL and JQL.
# 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)forgeo validate # dry run: config, repo, backlog, agent, locks
forgeo start # daemon in background, one cycle per interval_minutesEach cycle: pick task → run agent → commit/push (or REVIEW branch when review_mode: branch). Empty backlog → refactoring pass.
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 # stop daemon
forgeo restart # restart daemon
forgeo web # dashboard for all instancesforgeo 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.
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 mountsRepo is bind-mounted at the same path; task arrives as FORGEO_TASK. See Configuration.
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| 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).
pip install -e ".[dev]"
pytestSee CONTRIBUTING.md (quality gates: pytest, ruff check, mypy src/forgeo).
MIT — see LICENSE.


