Production-minded local CLI for autonomous repo orchestration
Project description
Execforge
execforge is a local CLI that takes tasks from one repo and applies them to another repo.
How to think about it
Keep this simple mental model:
- Prompt source: where tasks come from (a git repo with task files)
- Project repo: the codebase that gets changed
- Agent: the execution profile that connects the two and runs tasks
That is the whole product loop.
Install
Choose one:
# recommended
pipx install execforge
# or
pip install execforge
# local dev
pip install -e .
Install with Python virtualenv (local dev):
# 1) create a virtual environment (Python 3.11+)
python -m venv .venv
# 2) activate it
# Windows (PowerShell)
.venv\Scripts\Activate.ps1
# Windows (cmd)
.venv\Scripts\activate.bat
# macOS/Linux
source .venv/bin/activate
# 3) upgrade packaging tools (recommended)
python -m pip install --upgrade pip setuptools wheel
# 4) install this project in editable mode
pip install -e .
# 5) verify CLI install
execforge --help
Check install:
execforge --help
Aliases also work: agent-orchestrator, orchestrator, agent-controlplane.
Quick start (workflow-first)
1) Initialize
execforge init
The init wizard guides setup for first prompt source, project repo, and agent.
2) Connect a task source
execforge prompt-source add prompts https://github.com/your-org/prompt-repo.git --branch main --folder-scope tasks
execforge prompt-source sync prompts
If remote branch is missing and you want Execforge to create/push it:
execforge prompt-source sync prompts --bootstrap-missing-branch
3) Connect a project repo
execforge project add app ~/src/my-app
4) Create an agent
execforge agent add app-agent prompts app --execution-backend multi
# ids also work if you prefer
execforge agent add app-agent 1 1 --execution-backend multi
5) Run the agent
One run:
execforge agent run app-agent
Continuous loop:
execforge agent loop app-agent
Loop defaults to new prompts only. If you want existing eligible tasks too:
execforge agent loop app-agent --all-eligible-prompts
6) Inspect results
execforge task list
execforge run list
execforge status
Daily workflow
execforge status
execforge prompt-source sync <source-name>
execforge agent run <agent-name>
execforge run list
If you want continuous polling:
execforge agent loop <agent-name>
Backends (Claude/Codex/OpenCode/Shell)
Backends are interchangeable execution options for task steps.
shellfor explicit commandsclaude,codex,opencodewhen those CLIs are installed and enabledmockfallback backend for local/dev flows
Tasks can express preferences per step, and Execforge routes each step to an available backend.
Task format
Tasks can be Markdown with YAML frontmatter or pure YAML.
---
id: quick-001
title: Create scaffold
status: todo
steps:
- id: create
type: shell
tool_preferences: [shell]
command: python -m pytest
- id: summarize
type: llm_summary
tool_preferences: [codex, claude, opencode, mock]
model: ollama/llama3.2
---
Create project scaffold.
For OpenCode steps, model maps to --model <provider/model>.
Optional task-level git overrides:
git:
base_branch: main
work_branch: agent/custom/quick-001
push_on_success: false
Defaults (when omitted):
base_branch: project repo default branchwork_branch:agent/<agent-name>/<task-id>push_on_success: agent push policy
Managing configs
App config
execforge config # defaults to config show
execforge config show
execforge config keys
execforge config set log_level DEBUG
execforge config set --set default_timeout_seconds=120 --set default_allow_push=true
execforge config reset default_timeout_seconds
execforge config reset --all
Sensitive values are masked in config show.
Agent config
execforge agent # defaults to agent list
execforge agent list # full JSON blocks
execforge agent update test-agent --set max_steps=40 --set push_policy=on-success
execforge agent update test-agent --set safety_settings.allow_push=true
execforge agent delete test-agent --yes
Commands by workflow
Setup
execforge initexecforge doctor
Prompt sources (task origin)
execforge prompt-source addexecforge prompt-source listexecforge prompt-source sync
Project repos (code targets)
execforge project addexecforge project list
Agents (execution profiles)
execforge agent addexecforge agent listexecforge agent list --compactexecforge agent updateexecforge agent deleteexecforge agent run <agent-name-or-id>execforge agent loop <agent-name-or-id>
Task and run inspection
execforge task listexecforge task inspect <task-id>execforge task set-status <task-id> <status>execforge task retry <task-id>execforge run listexecforge statusexecforge start
When nothing runs
If a run ends with noop, Execforge prints the reason and next step.
Common reasons:
- no task files were discovered in the prompt source scope
- all tasks are already in the current only-new baseline
- all tasks are already complete
- tasks exist but none are currently actionable
Useful fixes:
execforge prompt-source sync <source-name>
execforge task list
execforge agent loop <agent-name> --all-eligible-prompts
execforge agent loop <agent-name> --reset-only-new-baseline
--reset-only-new-baseline applies to the first loop run, then loop returns to normal only-new behavior.
Where state is stored
Execforge keeps state outside your project repos.
Default location:
- Linux:
~/.local/share/agent-orchestrator/ - macOS:
~/Library/Application Support/agent-orchestrator/ - Windows:
%LOCALAPPDATA%\agent-orchestrator\agent-orchestrator\
Override:
export AGENT_ORCHESTRATOR_HOME=~/.agent-orchestrator
More docs
docs/USAGE_WALKTHROUGH.md- practical end-to-end flowdocs/ARCHITECTURE.md- implementation layout
CI/CD and PyPI publish
This repo includes GitHub Actions pipelines:
.github/workflows/ci.yml- lint, tests, package build, andtwine check.github/workflows/publish-testpypi.yml- manual publish to TestPyPI.github/workflows/publish-pypi.yml- publish to PyPI on release (and manual dispatch)
Required repository secrets:
TEST_PYPI_API_TOKENfor TestPyPI publishingPYPI_API_TOKENfor PyPI publishing
Typical release flow:
# 1) bump version in pyproject.toml
# 2) commit and tag
git tag v0.1.1
git push origin main --tags
# 3) create/publish a GitHub Release for that tag
# -> triggers publish-pypi.yml
License
MIT (see LICENSE).
Project details
Release history Release notifications | RSS feed
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 execforge-0.1.1.tar.gz.
File metadata
- Download URL: execforge-0.1.1.tar.gz
- Upload date:
- Size: 36.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3e24c2deafaccba287116318bd5c55e7a18f008be2354edeb6d4bf7957e9465c
|
|
| MD5 |
8d4ec8412da53f99829891a863b7e87d
|
|
| BLAKE2b-256 |
70eebc983daa5b5c077c9b9417c936f3dfd8f872038349e059d06d81b2dc028b
|
File details
Details for the file execforge-0.1.1-py3-none-any.whl.
File metadata
- Download URL: execforge-0.1.1-py3-none-any.whl
- Upload date:
- Size: 47.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ac1acb76cc9b09cf320bccb830afe8bc8c6d3c342c44643903bafc84acd9fe76
|
|
| MD5 |
f0bbcc09d234da8aa3afa3839bd20816
|
|
| BLAKE2b-256 |
45512fb0d23892021e55e819cce6cd94c8d506ea6cb44a3dd79f54a6297db2be
|