execforge 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- execforge-0.1.0/LICENSE +21 -0
- execforge-0.1.0/PKG-INFO +367 -0
- execforge-0.1.0/README.md +327 -0
- execforge-0.1.0/pyproject.toml +37 -0
- execforge-0.1.0/setup.cfg +4 -0
- execforge-0.1.0/src/execforge.egg-info/PKG-INFO +367 -0
- execforge-0.1.0/src/execforge.egg-info/SOURCES.txt +47 -0
- execforge-0.1.0/src/execforge.egg-info/dependency_links.txt +1 -0
- execforge-0.1.0/src/execforge.egg-info/entry_points.txt +5 -0
- execforge-0.1.0/src/execforge.egg-info/requires.txt +9 -0
- execforge-0.1.0/src/execforge.egg-info/top_level.txt +1 -0
- execforge-0.1.0/src/orchestrator/__init__.py +4 -0
- execforge-0.1.0/src/orchestrator/__main__.py +5 -0
- execforge-0.1.0/src/orchestrator/backends/__init__.py +1 -0
- execforge-0.1.0/src/orchestrator/backends/base.py +29 -0
- execforge-0.1.0/src/orchestrator/backends/factory.py +53 -0
- execforge-0.1.0/src/orchestrator/backends/llm_cli_backend.py +87 -0
- execforge-0.1.0/src/orchestrator/backends/mock_backend.py +34 -0
- execforge-0.1.0/src/orchestrator/backends/shell_backend.py +49 -0
- execforge-0.1.0/src/orchestrator/cli/__init__.py +1 -0
- execforge-0.1.0/src/orchestrator/cli/main.py +971 -0
- execforge-0.1.0/src/orchestrator/config.py +272 -0
- execforge-0.1.0/src/orchestrator/domain/__init__.py +1 -0
- execforge-0.1.0/src/orchestrator/domain/types.py +77 -0
- execforge-0.1.0/src/orchestrator/exceptions.py +18 -0
- execforge-0.1.0/src/orchestrator/git/__init__.py +1 -0
- execforge-0.1.0/src/orchestrator/git/service.py +202 -0
- execforge-0.1.0/src/orchestrator/logging_setup.py +53 -0
- execforge-0.1.0/src/orchestrator/prompts/__init__.py +1 -0
- execforge-0.1.0/src/orchestrator/prompts/parser.py +91 -0
- execforge-0.1.0/src/orchestrator/reporting/__init__.py +1 -0
- execforge-0.1.0/src/orchestrator/reporting/console.py +197 -0
- execforge-0.1.0/src/orchestrator/reporting/events.py +44 -0
- execforge-0.1.0/src/orchestrator/reporting/selection_result.py +15 -0
- execforge-0.1.0/src/orchestrator/services/__init__.py +1 -0
- execforge-0.1.0/src/orchestrator/services/agent_runner.py +831 -0
- execforge-0.1.0/src/orchestrator/services/agent_service.py +122 -0
- execforge-0.1.0/src/orchestrator/services/project_service.py +47 -0
- execforge-0.1.0/src/orchestrator/services/prompt_source_service.py +65 -0
- execforge-0.1.0/src/orchestrator/services/run_service.py +42 -0
- execforge-0.1.0/src/orchestrator/services/step_executor.py +100 -0
- execforge-0.1.0/src/orchestrator/services/task_service.py +155 -0
- execforge-0.1.0/src/orchestrator/storage/__init__.py +1 -0
- execforge-0.1.0/src/orchestrator/storage/db.py +29 -0
- execforge-0.1.0/src/orchestrator/storage/models.py +95 -0
- execforge-0.1.0/src/orchestrator/utils/__init__.py +1 -0
- execforge-0.1.0/src/orchestrator/utils/process.py +44 -0
- execforge-0.1.0/src/orchestrator/validation/__init__.py +1 -0
- execforge-0.1.0/src/orchestrator/validation/pipeline.py +52 -0
execforge-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Matt
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
execforge-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: execforge
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Production-minded local CLI for autonomous repo orchestration
|
|
5
|
+
Author: Open Source Contributors
|
|
6
|
+
License: MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2026 Matt
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
The above copyright notice and this permission notice shall be included in all
|
|
18
|
+
copies or substantial portions of the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
SOFTWARE.
|
|
27
|
+
|
|
28
|
+
Requires-Python: >=3.11
|
|
29
|
+
Description-Content-Type: text/markdown
|
|
30
|
+
License-File: LICENSE
|
|
31
|
+
Requires-Dist: typer>=0.12.0
|
|
32
|
+
Requires-Dist: SQLAlchemy>=2.0.0
|
|
33
|
+
Requires-Dist: PyYAML>=6.0
|
|
34
|
+
Requires-Dist: platformdirs>=4.2.0
|
|
35
|
+
Requires-Dist: rich>=13.7.0
|
|
36
|
+
Provides-Extra: dev
|
|
37
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
38
|
+
Requires-Dist: ruff>=0.5.0; extra == "dev"
|
|
39
|
+
Dynamic: license-file
|
|
40
|
+
|
|
41
|
+
# Execforge
|
|
42
|
+
|
|
43
|
+
`execforge` is a local CLI that takes tasks from one repo and applies them to another repo.
|
|
44
|
+
|
|
45
|
+
## How to think about it
|
|
46
|
+
|
|
47
|
+
Keep this simple mental model:
|
|
48
|
+
|
|
49
|
+
- **Prompt source**: where tasks come from (a git repo with task files)
|
|
50
|
+
- **Project repo**: the codebase that gets changed
|
|
51
|
+
- **Agent**: the execution profile that connects the two and runs tasks
|
|
52
|
+
|
|
53
|
+
That is the whole product loop.
|
|
54
|
+
|
|
55
|
+
## Install
|
|
56
|
+
|
|
57
|
+
Choose one:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# recommended
|
|
61
|
+
pipx install execforge
|
|
62
|
+
|
|
63
|
+
# or
|
|
64
|
+
pip install execforge
|
|
65
|
+
|
|
66
|
+
# local dev
|
|
67
|
+
pip install -e .
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Install with Python virtualenv (local dev):
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
# 1) create a virtual environment (Python 3.11+)
|
|
74
|
+
python -m venv .venv
|
|
75
|
+
|
|
76
|
+
# 2) activate it
|
|
77
|
+
# Windows (PowerShell)
|
|
78
|
+
.venv\Scripts\Activate.ps1
|
|
79
|
+
# Windows (cmd)
|
|
80
|
+
.venv\Scripts\activate.bat
|
|
81
|
+
# macOS/Linux
|
|
82
|
+
source .venv/bin/activate
|
|
83
|
+
|
|
84
|
+
# 3) upgrade packaging tools (recommended)
|
|
85
|
+
python -m pip install --upgrade pip setuptools wheel
|
|
86
|
+
|
|
87
|
+
# 4) install this project in editable mode
|
|
88
|
+
pip install -e .
|
|
89
|
+
|
|
90
|
+
# 5) verify CLI install
|
|
91
|
+
execforge --help
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Check install:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
execforge --help
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Aliases also work: `agent-orchestrator`, `orchestrator`, `agent-controlplane`.
|
|
101
|
+
|
|
102
|
+
## Quick start (workflow-first)
|
|
103
|
+
|
|
104
|
+
### 1) Initialize
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
execforge init
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
The init wizard guides setup for first prompt source, project repo, and agent.
|
|
111
|
+
|
|
112
|
+
### 2) Connect a task source
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
execforge prompt-source add prompts https://github.com/your-org/prompt-repo.git --branch main --folder-scope tasks
|
|
116
|
+
execforge prompt-source sync prompts
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
If remote branch is missing and you want Execforge to create/push it:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
execforge prompt-source sync prompts --bootstrap-missing-branch
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### 3) Connect a project repo
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
execforge project add app ~/src/my-app
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 4) Create an agent
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
execforge agent add app-agent prompts app --execution-backend multi
|
|
135
|
+
|
|
136
|
+
# ids also work if you prefer
|
|
137
|
+
execforge agent add app-agent 1 1 --execution-backend multi
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 5) Run the agent
|
|
141
|
+
|
|
142
|
+
One run:
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
execforge agent run app-agent
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Continuous loop:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
execforge agent loop app-agent
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Loop defaults to new prompts only. If you want existing eligible tasks too:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
execforge agent loop app-agent --all-eligible-prompts
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### 6) Inspect results
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
execforge task list
|
|
164
|
+
execforge run list
|
|
165
|
+
execforge status
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Daily workflow
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
execforge status
|
|
172
|
+
execforge prompt-source sync <source-name>
|
|
173
|
+
execforge agent run <agent-name>
|
|
174
|
+
execforge run list
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
If you want continuous polling:
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
execforge agent loop <agent-name>
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## Backends (Claude/Codex/OpenCode/Shell)
|
|
184
|
+
|
|
185
|
+
Backends are interchangeable execution options for task steps.
|
|
186
|
+
|
|
187
|
+
- `shell` for explicit commands
|
|
188
|
+
- `claude`, `codex`, `opencode` when those CLIs are installed and enabled
|
|
189
|
+
- `mock` fallback backend for local/dev flows
|
|
190
|
+
|
|
191
|
+
Tasks can express preferences per step, and Execforge routes each step to an available backend.
|
|
192
|
+
|
|
193
|
+
## Task format
|
|
194
|
+
|
|
195
|
+
Tasks can be Markdown with YAML frontmatter or pure YAML.
|
|
196
|
+
|
|
197
|
+
```markdown
|
|
198
|
+
---
|
|
199
|
+
id: quick-001
|
|
200
|
+
title: Create scaffold
|
|
201
|
+
status: todo
|
|
202
|
+
steps:
|
|
203
|
+
- id: create
|
|
204
|
+
type: shell
|
|
205
|
+
tool_preferences: [shell]
|
|
206
|
+
command: python -m pytest
|
|
207
|
+
- id: summarize
|
|
208
|
+
type: llm_summary
|
|
209
|
+
tool_preferences: [codex, claude, opencode, mock]
|
|
210
|
+
model: ollama/llama3.2
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
Create project scaffold.
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
For OpenCode steps, `model` maps to `--model <provider/model>`.
|
|
217
|
+
|
|
218
|
+
Optional task-level git overrides:
|
|
219
|
+
|
|
220
|
+
```yaml
|
|
221
|
+
git:
|
|
222
|
+
base_branch: main
|
|
223
|
+
work_branch: agent/custom/quick-001
|
|
224
|
+
push_on_success: false
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Defaults (when omitted):
|
|
228
|
+
|
|
229
|
+
- `base_branch`: project repo default branch
|
|
230
|
+
- `work_branch`: `agent/<agent-name>/<task-id>`
|
|
231
|
+
- `push_on_success`: agent push policy
|
|
232
|
+
|
|
233
|
+
## Managing configs
|
|
234
|
+
|
|
235
|
+
### App config
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
execforge config # defaults to config show
|
|
239
|
+
execforge config show
|
|
240
|
+
execforge config keys
|
|
241
|
+
execforge config set log_level DEBUG
|
|
242
|
+
execforge config set --set default_timeout_seconds=120 --set default_allow_push=true
|
|
243
|
+
execforge config reset default_timeout_seconds
|
|
244
|
+
execforge config reset --all
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
Sensitive values are masked in `config show`.
|
|
248
|
+
|
|
249
|
+
### Agent config
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
execforge agent # defaults to agent list
|
|
253
|
+
execforge agent list # full JSON blocks
|
|
254
|
+
execforge agent update test-agent --set max_steps=40 --set push_policy=on-success
|
|
255
|
+
execforge agent update test-agent --set safety_settings.allow_push=true
|
|
256
|
+
execforge agent delete test-agent --yes
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Commands by workflow
|
|
260
|
+
|
|
261
|
+
### Setup
|
|
262
|
+
|
|
263
|
+
- `execforge init`
|
|
264
|
+
- `execforge doctor`
|
|
265
|
+
|
|
266
|
+
### Prompt sources (task origin)
|
|
267
|
+
|
|
268
|
+
- `execforge prompt-source add`
|
|
269
|
+
- `execforge prompt-source list`
|
|
270
|
+
- `execforge prompt-source sync`
|
|
271
|
+
|
|
272
|
+
### Project repos (code targets)
|
|
273
|
+
|
|
274
|
+
- `execforge project add`
|
|
275
|
+
- `execforge project list`
|
|
276
|
+
|
|
277
|
+
### Agents (execution profiles)
|
|
278
|
+
|
|
279
|
+
- `execforge agent add`
|
|
280
|
+
- `execforge agent list`
|
|
281
|
+
- `execforge agent list --compact`
|
|
282
|
+
- `execforge agent update`
|
|
283
|
+
- `execforge agent delete`
|
|
284
|
+
- `execforge agent run <agent-name-or-id>`
|
|
285
|
+
- `execforge agent loop <agent-name-or-id>`
|
|
286
|
+
|
|
287
|
+
### Task and run inspection
|
|
288
|
+
|
|
289
|
+
- `execforge task list`
|
|
290
|
+
- `execforge task inspect <task-id>`
|
|
291
|
+
- `execforge task set-status <task-id> <status>`
|
|
292
|
+
- `execforge task retry <task-id>`
|
|
293
|
+
- `execforge run list`
|
|
294
|
+
- `execforge status`
|
|
295
|
+
- `execforge start`
|
|
296
|
+
|
|
297
|
+
## When nothing runs
|
|
298
|
+
|
|
299
|
+
If a run ends with noop, Execforge prints the reason and next step.
|
|
300
|
+
|
|
301
|
+
Common reasons:
|
|
302
|
+
|
|
303
|
+
- no task files were discovered in the prompt source scope
|
|
304
|
+
- all tasks are already in the current only-new baseline
|
|
305
|
+
- all tasks are already complete
|
|
306
|
+
- tasks exist but none are currently actionable
|
|
307
|
+
|
|
308
|
+
Useful fixes:
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
execforge prompt-source sync <source-name>
|
|
312
|
+
execforge task list
|
|
313
|
+
execforge agent loop <agent-name> --all-eligible-prompts
|
|
314
|
+
execforge agent loop <agent-name> --reset-only-new-baseline
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
`--reset-only-new-baseline` applies to the first loop run, then loop returns to normal only-new behavior.
|
|
318
|
+
|
|
319
|
+
## Where state is stored
|
|
320
|
+
|
|
321
|
+
Execforge keeps state outside your project repos.
|
|
322
|
+
|
|
323
|
+
Default location:
|
|
324
|
+
|
|
325
|
+
- Linux: `~/.local/share/agent-orchestrator/`
|
|
326
|
+
- macOS: `~/Library/Application Support/agent-orchestrator/`
|
|
327
|
+
- Windows: `%LOCALAPPDATA%\agent-orchestrator\agent-orchestrator\`
|
|
328
|
+
|
|
329
|
+
Override:
|
|
330
|
+
|
|
331
|
+
```bash
|
|
332
|
+
export AGENT_ORCHESTRATOR_HOME=~/.agent-orchestrator
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
## More docs
|
|
336
|
+
|
|
337
|
+
- `docs/USAGE_WALKTHROUGH.md` - practical end-to-end flow
|
|
338
|
+
- `docs/ARCHITECTURE.md` - implementation layout
|
|
339
|
+
|
|
340
|
+
## CI/CD and PyPI publish
|
|
341
|
+
|
|
342
|
+
This repo includes GitHub Actions pipelines:
|
|
343
|
+
|
|
344
|
+
- `.github/workflows/ci.yml` - lint, tests, package build, and `twine check`
|
|
345
|
+
- `.github/workflows/publish-testpypi.yml` - manual publish to TestPyPI
|
|
346
|
+
- `.github/workflows/publish-pypi.yml` - publish to PyPI on release (and manual dispatch)
|
|
347
|
+
|
|
348
|
+
Required repository secrets:
|
|
349
|
+
|
|
350
|
+
- `TEST_PYPI_API_TOKEN` for TestPyPI publishing
|
|
351
|
+
- `PYPI_API_TOKEN` for PyPI publishing
|
|
352
|
+
|
|
353
|
+
Typical release flow:
|
|
354
|
+
|
|
355
|
+
```bash
|
|
356
|
+
# 1) bump version in pyproject.toml
|
|
357
|
+
# 2) commit and tag
|
|
358
|
+
git tag v0.1.1
|
|
359
|
+
git push origin main --tags
|
|
360
|
+
|
|
361
|
+
# 3) create/publish a GitHub Release for that tag
|
|
362
|
+
# -> triggers publish-pypi.yml
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
## License
|
|
366
|
+
|
|
367
|
+
MIT (see `LICENSE`).
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
# Execforge
|
|
2
|
+
|
|
3
|
+
`execforge` is a local CLI that takes tasks from one repo and applies them to another repo.
|
|
4
|
+
|
|
5
|
+
## How to think about it
|
|
6
|
+
|
|
7
|
+
Keep this simple mental model:
|
|
8
|
+
|
|
9
|
+
- **Prompt source**: where tasks come from (a git repo with task files)
|
|
10
|
+
- **Project repo**: the codebase that gets changed
|
|
11
|
+
- **Agent**: the execution profile that connects the two and runs tasks
|
|
12
|
+
|
|
13
|
+
That is the whole product loop.
|
|
14
|
+
|
|
15
|
+
## Install
|
|
16
|
+
|
|
17
|
+
Choose one:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# recommended
|
|
21
|
+
pipx install execforge
|
|
22
|
+
|
|
23
|
+
# or
|
|
24
|
+
pip install execforge
|
|
25
|
+
|
|
26
|
+
# local dev
|
|
27
|
+
pip install -e .
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Install with Python virtualenv (local dev):
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# 1) create a virtual environment (Python 3.11+)
|
|
34
|
+
python -m venv .venv
|
|
35
|
+
|
|
36
|
+
# 2) activate it
|
|
37
|
+
# Windows (PowerShell)
|
|
38
|
+
.venv\Scripts\Activate.ps1
|
|
39
|
+
# Windows (cmd)
|
|
40
|
+
.venv\Scripts\activate.bat
|
|
41
|
+
# macOS/Linux
|
|
42
|
+
source .venv/bin/activate
|
|
43
|
+
|
|
44
|
+
# 3) upgrade packaging tools (recommended)
|
|
45
|
+
python -m pip install --upgrade pip setuptools wheel
|
|
46
|
+
|
|
47
|
+
# 4) install this project in editable mode
|
|
48
|
+
pip install -e .
|
|
49
|
+
|
|
50
|
+
# 5) verify CLI install
|
|
51
|
+
execforge --help
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Check install:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
execforge --help
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Aliases also work: `agent-orchestrator`, `orchestrator`, `agent-controlplane`.
|
|
61
|
+
|
|
62
|
+
## Quick start (workflow-first)
|
|
63
|
+
|
|
64
|
+
### 1) Initialize
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
execforge init
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
The init wizard guides setup for first prompt source, project repo, and agent.
|
|
71
|
+
|
|
72
|
+
### 2) Connect a task source
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
execforge prompt-source add prompts https://github.com/your-org/prompt-repo.git --branch main --folder-scope tasks
|
|
76
|
+
execforge prompt-source sync prompts
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
If remote branch is missing and you want Execforge to create/push it:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
execforge prompt-source sync prompts --bootstrap-missing-branch
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 3) Connect a project repo
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
execforge project add app ~/src/my-app
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### 4) Create an agent
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
execforge agent add app-agent prompts app --execution-backend multi
|
|
95
|
+
|
|
96
|
+
# ids also work if you prefer
|
|
97
|
+
execforge agent add app-agent 1 1 --execution-backend multi
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### 5) Run the agent
|
|
101
|
+
|
|
102
|
+
One run:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
execforge agent run app-agent
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Continuous loop:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
execforge agent loop app-agent
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Loop defaults to new prompts only. If you want existing eligible tasks too:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
execforge agent loop app-agent --all-eligible-prompts
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### 6) Inspect results
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
execforge task list
|
|
124
|
+
execforge run list
|
|
125
|
+
execforge status
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Daily workflow
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
execforge status
|
|
132
|
+
execforge prompt-source sync <source-name>
|
|
133
|
+
execforge agent run <agent-name>
|
|
134
|
+
execforge run list
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
If you want continuous polling:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
execforge agent loop <agent-name>
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Backends (Claude/Codex/OpenCode/Shell)
|
|
144
|
+
|
|
145
|
+
Backends are interchangeable execution options for task steps.
|
|
146
|
+
|
|
147
|
+
- `shell` for explicit commands
|
|
148
|
+
- `claude`, `codex`, `opencode` when those CLIs are installed and enabled
|
|
149
|
+
- `mock` fallback backend for local/dev flows
|
|
150
|
+
|
|
151
|
+
Tasks can express preferences per step, and Execforge routes each step to an available backend.
|
|
152
|
+
|
|
153
|
+
## Task format
|
|
154
|
+
|
|
155
|
+
Tasks can be Markdown with YAML frontmatter or pure YAML.
|
|
156
|
+
|
|
157
|
+
```markdown
|
|
158
|
+
---
|
|
159
|
+
id: quick-001
|
|
160
|
+
title: Create scaffold
|
|
161
|
+
status: todo
|
|
162
|
+
steps:
|
|
163
|
+
- id: create
|
|
164
|
+
type: shell
|
|
165
|
+
tool_preferences: [shell]
|
|
166
|
+
command: python -m pytest
|
|
167
|
+
- id: summarize
|
|
168
|
+
type: llm_summary
|
|
169
|
+
tool_preferences: [codex, claude, opencode, mock]
|
|
170
|
+
model: ollama/llama3.2
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
Create project scaffold.
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
For OpenCode steps, `model` maps to `--model <provider/model>`.
|
|
177
|
+
|
|
178
|
+
Optional task-level git overrides:
|
|
179
|
+
|
|
180
|
+
```yaml
|
|
181
|
+
git:
|
|
182
|
+
base_branch: main
|
|
183
|
+
work_branch: agent/custom/quick-001
|
|
184
|
+
push_on_success: false
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Defaults (when omitted):
|
|
188
|
+
|
|
189
|
+
- `base_branch`: project repo default branch
|
|
190
|
+
- `work_branch`: `agent/<agent-name>/<task-id>`
|
|
191
|
+
- `push_on_success`: agent push policy
|
|
192
|
+
|
|
193
|
+
## Managing configs
|
|
194
|
+
|
|
195
|
+
### App config
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
execforge config # defaults to config show
|
|
199
|
+
execforge config show
|
|
200
|
+
execforge config keys
|
|
201
|
+
execforge config set log_level DEBUG
|
|
202
|
+
execforge config set --set default_timeout_seconds=120 --set default_allow_push=true
|
|
203
|
+
execforge config reset default_timeout_seconds
|
|
204
|
+
execforge config reset --all
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Sensitive values are masked in `config show`.
|
|
208
|
+
|
|
209
|
+
### Agent config
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
execforge agent # defaults to agent list
|
|
213
|
+
execforge agent list # full JSON blocks
|
|
214
|
+
execforge agent update test-agent --set max_steps=40 --set push_policy=on-success
|
|
215
|
+
execforge agent update test-agent --set safety_settings.allow_push=true
|
|
216
|
+
execforge agent delete test-agent --yes
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Commands by workflow
|
|
220
|
+
|
|
221
|
+
### Setup
|
|
222
|
+
|
|
223
|
+
- `execforge init`
|
|
224
|
+
- `execforge doctor`
|
|
225
|
+
|
|
226
|
+
### Prompt sources (task origin)
|
|
227
|
+
|
|
228
|
+
- `execforge prompt-source add`
|
|
229
|
+
- `execforge prompt-source list`
|
|
230
|
+
- `execforge prompt-source sync`
|
|
231
|
+
|
|
232
|
+
### Project repos (code targets)
|
|
233
|
+
|
|
234
|
+
- `execforge project add`
|
|
235
|
+
- `execforge project list`
|
|
236
|
+
|
|
237
|
+
### Agents (execution profiles)
|
|
238
|
+
|
|
239
|
+
- `execforge agent add`
|
|
240
|
+
- `execforge agent list`
|
|
241
|
+
- `execforge agent list --compact`
|
|
242
|
+
- `execforge agent update`
|
|
243
|
+
- `execforge agent delete`
|
|
244
|
+
- `execforge agent run <agent-name-or-id>`
|
|
245
|
+
- `execforge agent loop <agent-name-or-id>`
|
|
246
|
+
|
|
247
|
+
### Task and run inspection
|
|
248
|
+
|
|
249
|
+
- `execforge task list`
|
|
250
|
+
- `execforge task inspect <task-id>`
|
|
251
|
+
- `execforge task set-status <task-id> <status>`
|
|
252
|
+
- `execforge task retry <task-id>`
|
|
253
|
+
- `execforge run list`
|
|
254
|
+
- `execforge status`
|
|
255
|
+
- `execforge start`
|
|
256
|
+
|
|
257
|
+
## When nothing runs
|
|
258
|
+
|
|
259
|
+
If a run ends with noop, Execforge prints the reason and next step.
|
|
260
|
+
|
|
261
|
+
Common reasons:
|
|
262
|
+
|
|
263
|
+
- no task files were discovered in the prompt source scope
|
|
264
|
+
- all tasks are already in the current only-new baseline
|
|
265
|
+
- all tasks are already complete
|
|
266
|
+
- tasks exist but none are currently actionable
|
|
267
|
+
|
|
268
|
+
Useful fixes:
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
execforge prompt-source sync <source-name>
|
|
272
|
+
execforge task list
|
|
273
|
+
execforge agent loop <agent-name> --all-eligible-prompts
|
|
274
|
+
execforge agent loop <agent-name> --reset-only-new-baseline
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
`--reset-only-new-baseline` applies to the first loop run, then loop returns to normal only-new behavior.
|
|
278
|
+
|
|
279
|
+
## Where state is stored
|
|
280
|
+
|
|
281
|
+
Execforge keeps state outside your project repos.
|
|
282
|
+
|
|
283
|
+
Default location:
|
|
284
|
+
|
|
285
|
+
- Linux: `~/.local/share/agent-orchestrator/`
|
|
286
|
+
- macOS: `~/Library/Application Support/agent-orchestrator/`
|
|
287
|
+
- Windows: `%LOCALAPPDATA%\agent-orchestrator\agent-orchestrator\`
|
|
288
|
+
|
|
289
|
+
Override:
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
export AGENT_ORCHESTRATOR_HOME=~/.agent-orchestrator
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
## More docs
|
|
296
|
+
|
|
297
|
+
- `docs/USAGE_WALKTHROUGH.md` - practical end-to-end flow
|
|
298
|
+
- `docs/ARCHITECTURE.md` - implementation layout
|
|
299
|
+
|
|
300
|
+
## CI/CD and PyPI publish
|
|
301
|
+
|
|
302
|
+
This repo includes GitHub Actions pipelines:
|
|
303
|
+
|
|
304
|
+
- `.github/workflows/ci.yml` - lint, tests, package build, and `twine check`
|
|
305
|
+
- `.github/workflows/publish-testpypi.yml` - manual publish to TestPyPI
|
|
306
|
+
- `.github/workflows/publish-pypi.yml` - publish to PyPI on release (and manual dispatch)
|
|
307
|
+
|
|
308
|
+
Required repository secrets:
|
|
309
|
+
|
|
310
|
+
- `TEST_PYPI_API_TOKEN` for TestPyPI publishing
|
|
311
|
+
- `PYPI_API_TOKEN` for PyPI publishing
|
|
312
|
+
|
|
313
|
+
Typical release flow:
|
|
314
|
+
|
|
315
|
+
```bash
|
|
316
|
+
# 1) bump version in pyproject.toml
|
|
317
|
+
# 2) commit and tag
|
|
318
|
+
git tag v0.1.1
|
|
319
|
+
git push origin main --tags
|
|
320
|
+
|
|
321
|
+
# 3) create/publish a GitHub Release for that tag
|
|
322
|
+
# -> triggers publish-pypi.yml
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
## License
|
|
326
|
+
|
|
327
|
+
MIT (see `LICENSE`).
|