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.
Files changed (49) hide show
  1. execforge-0.1.0/LICENSE +21 -0
  2. execforge-0.1.0/PKG-INFO +367 -0
  3. execforge-0.1.0/README.md +327 -0
  4. execforge-0.1.0/pyproject.toml +37 -0
  5. execforge-0.1.0/setup.cfg +4 -0
  6. execforge-0.1.0/src/execforge.egg-info/PKG-INFO +367 -0
  7. execforge-0.1.0/src/execforge.egg-info/SOURCES.txt +47 -0
  8. execforge-0.1.0/src/execforge.egg-info/dependency_links.txt +1 -0
  9. execforge-0.1.0/src/execforge.egg-info/entry_points.txt +5 -0
  10. execforge-0.1.0/src/execforge.egg-info/requires.txt +9 -0
  11. execforge-0.1.0/src/execforge.egg-info/top_level.txt +1 -0
  12. execforge-0.1.0/src/orchestrator/__init__.py +4 -0
  13. execforge-0.1.0/src/orchestrator/__main__.py +5 -0
  14. execforge-0.1.0/src/orchestrator/backends/__init__.py +1 -0
  15. execforge-0.1.0/src/orchestrator/backends/base.py +29 -0
  16. execforge-0.1.0/src/orchestrator/backends/factory.py +53 -0
  17. execforge-0.1.0/src/orchestrator/backends/llm_cli_backend.py +87 -0
  18. execforge-0.1.0/src/orchestrator/backends/mock_backend.py +34 -0
  19. execforge-0.1.0/src/orchestrator/backends/shell_backend.py +49 -0
  20. execforge-0.1.0/src/orchestrator/cli/__init__.py +1 -0
  21. execforge-0.1.0/src/orchestrator/cli/main.py +971 -0
  22. execforge-0.1.0/src/orchestrator/config.py +272 -0
  23. execforge-0.1.0/src/orchestrator/domain/__init__.py +1 -0
  24. execforge-0.1.0/src/orchestrator/domain/types.py +77 -0
  25. execforge-0.1.0/src/orchestrator/exceptions.py +18 -0
  26. execforge-0.1.0/src/orchestrator/git/__init__.py +1 -0
  27. execforge-0.1.0/src/orchestrator/git/service.py +202 -0
  28. execforge-0.1.0/src/orchestrator/logging_setup.py +53 -0
  29. execforge-0.1.0/src/orchestrator/prompts/__init__.py +1 -0
  30. execforge-0.1.0/src/orchestrator/prompts/parser.py +91 -0
  31. execforge-0.1.0/src/orchestrator/reporting/__init__.py +1 -0
  32. execforge-0.1.0/src/orchestrator/reporting/console.py +197 -0
  33. execforge-0.1.0/src/orchestrator/reporting/events.py +44 -0
  34. execforge-0.1.0/src/orchestrator/reporting/selection_result.py +15 -0
  35. execforge-0.1.0/src/orchestrator/services/__init__.py +1 -0
  36. execforge-0.1.0/src/orchestrator/services/agent_runner.py +831 -0
  37. execforge-0.1.0/src/orchestrator/services/agent_service.py +122 -0
  38. execforge-0.1.0/src/orchestrator/services/project_service.py +47 -0
  39. execforge-0.1.0/src/orchestrator/services/prompt_source_service.py +65 -0
  40. execforge-0.1.0/src/orchestrator/services/run_service.py +42 -0
  41. execforge-0.1.0/src/orchestrator/services/step_executor.py +100 -0
  42. execforge-0.1.0/src/orchestrator/services/task_service.py +155 -0
  43. execforge-0.1.0/src/orchestrator/storage/__init__.py +1 -0
  44. execforge-0.1.0/src/orchestrator/storage/db.py +29 -0
  45. execforge-0.1.0/src/orchestrator/storage/models.py +95 -0
  46. execforge-0.1.0/src/orchestrator/utils/__init__.py +1 -0
  47. execforge-0.1.0/src/orchestrator/utils/process.py +44 -0
  48. execforge-0.1.0/src/orchestrator/validation/__init__.py +1 -0
  49. execforge-0.1.0/src/orchestrator/validation/pipeline.py +52 -0
@@ -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.
@@ -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`).