execforge 0.1.0__tar.gz → 0.1.2__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/src/execforge.egg-info → execforge-0.1.2}/PKG-INFO +92 -45
- {execforge-0.1.0 → execforge-0.1.2}/README.md +91 -44
- {execforge-0.1.0 → execforge-0.1.2}/pyproject.toml +1 -1
- {execforge-0.1.0 → execforge-0.1.2/src/execforge.egg-info}/PKG-INFO +92 -45
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/__init__.py +1 -1
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/config.py +17 -29
- {execforge-0.1.0 → execforge-0.1.2}/LICENSE +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/setup.cfg +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/execforge.egg-info/SOURCES.txt +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/execforge.egg-info/dependency_links.txt +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/execforge.egg-info/entry_points.txt +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/execforge.egg-info/requires.txt +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/execforge.egg-info/top_level.txt +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/__main__.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/backends/__init__.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/backends/base.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/backends/factory.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/backends/llm_cli_backend.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/backends/mock_backend.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/backends/shell_backend.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/cli/__init__.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/cli/main.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/domain/__init__.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/domain/types.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/exceptions.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/git/__init__.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/git/service.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/logging_setup.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/prompts/__init__.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/prompts/parser.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/reporting/__init__.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/reporting/console.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/reporting/events.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/reporting/selection_result.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/services/__init__.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/services/agent_runner.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/services/agent_service.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/services/project_service.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/services/prompt_source_service.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/services/run_service.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/services/step_executor.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/services/task_service.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/storage/__init__.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/storage/db.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/storage/models.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/utils/__init__.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/utils/process.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/validation/__init__.py +0 -0
- {execforge-0.1.0 → execforge-0.1.2}/src/orchestrator/validation/pipeline.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: execforge
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.2
|
|
4
4
|
Summary: Production-minded local CLI for autonomous repo orchestration
|
|
5
5
|
Author: Open Source Contributors
|
|
6
6
|
License: MIT License
|
|
@@ -63,6 +63,9 @@ pipx install execforge
|
|
|
63
63
|
# or
|
|
64
64
|
pip install execforge
|
|
65
65
|
|
|
66
|
+
# npm (requires Python 3.11+ installed)
|
|
67
|
+
npm install -g execforge
|
|
68
|
+
|
|
66
69
|
# local dev
|
|
67
70
|
pip install -e .
|
|
68
71
|
```
|
|
@@ -256,43 +259,87 @@ execforge agent update test-agent --set safety_settings.allow_push=true
|
|
|
256
259
|
execforge agent delete test-agent --yes
|
|
257
260
|
```
|
|
258
261
|
|
|
259
|
-
##
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
-
|
|
264
|
-
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
-
|
|
282
|
-
|
|
283
|
-
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
-
|
|
290
|
-
|
|
291
|
-
-
|
|
292
|
-
|
|
293
|
-
-
|
|
294
|
-
|
|
295
|
-
-
|
|
262
|
+
## Complete command + config reference (grouped by task)
|
|
263
|
+
|
|
264
|
+
```text
|
|
265
|
+
Setup and health
|
|
266
|
+
- execforge init [--interactive/--no-interactive]
|
|
267
|
+
Initialize app home, SQLite DB, and run first-time setup wizard.
|
|
268
|
+
- execforge start
|
|
269
|
+
Print the guided first-time command sequence.
|
|
270
|
+
- execforge status
|
|
271
|
+
Show setup counts and last run summary.
|
|
272
|
+
- execforge doctor
|
|
273
|
+
Check app paths, SQLite access, and git environment.
|
|
274
|
+
|
|
275
|
+
Prompt sources (task origin repos)
|
|
276
|
+
- execforge prompt-source add <name> <repo-url> [branch] [folder_scope] [sync_strategy] [clone_path]
|
|
277
|
+
Register a prompt source definition.
|
|
278
|
+
- execforge prompt-source list
|
|
279
|
+
List configured prompt sources.
|
|
280
|
+
- execforge prompt-source sync <name-or-id> [--bootstrap-missing-branch]
|
|
281
|
+
Pull/clone source and discover task files.
|
|
282
|
+
|
|
283
|
+
Project repos (code targets)
|
|
284
|
+
- execforge project add <name> <local-path> [default_branch] [allowed_branch_pattern]
|
|
285
|
+
Register a local git repo as an execution target.
|
|
286
|
+
- execforge project list
|
|
287
|
+
List configured project repos.
|
|
288
|
+
|
|
289
|
+
Agents (execution profiles)
|
|
290
|
+
- execforge agent
|
|
291
|
+
Alias for execforge agent list.
|
|
292
|
+
- execforge agent add <name> <prompt-source-name-or-id> <project-name-or-id> [options]
|
|
293
|
+
Create an agent linked to one prompt source and one project.
|
|
294
|
+
- execforge agent list [--compact]
|
|
295
|
+
List agents (JSON blocks or one-line compact view).
|
|
296
|
+
- execforge agent update <agent-name-or-id> --set key=value [--set key=value ...]
|
|
297
|
+
Update agent fields and nested JSON config.
|
|
298
|
+
- execforge agent delete <agent-name-or-id> [--yes]
|
|
299
|
+
Delete an agent and its run history.
|
|
300
|
+
- execforge agent run <agent-name-or-id> [--verbose] [--debug]
|
|
301
|
+
Execute one run cycle.
|
|
302
|
+
- execforge agent loop <agent-name-or-id> [interval_seconds] [max_iterations] [--verbose] [--debug] [--only-new-prompts/--all-eligible-prompts] [--reset-only-new-baseline]
|
|
303
|
+
Run continuously on a polling interval.
|
|
304
|
+
|
|
305
|
+
Tasks and runs
|
|
306
|
+
- execforge task list [status]
|
|
307
|
+
List discovered tasks, optionally filtered by status.
|
|
308
|
+
- execforge task inspect <task-id>
|
|
309
|
+
Show parsed task details and steps.
|
|
310
|
+
- execforge task set-status <task-id> <status>
|
|
311
|
+
Set status to one of: todo, ready, in_progress, done, failed, blocked.
|
|
312
|
+
- execforge task retry <task-id>
|
|
313
|
+
Shortcut that sets task status back to todo.
|
|
314
|
+
- execforge run list [limit]
|
|
315
|
+
Show recent run history rows.
|
|
316
|
+
|
|
317
|
+
App config commands
|
|
318
|
+
- execforge config
|
|
319
|
+
Alias for execforge config show.
|
|
320
|
+
- execforge config show
|
|
321
|
+
Show current app config and key paths.
|
|
322
|
+
- execforge config keys
|
|
323
|
+
List editable app config keys and defaults.
|
|
324
|
+
- execforge config set <key> <value>
|
|
325
|
+
Set one config key.
|
|
326
|
+
- execforge config set --set key=value [--set key=value ...]
|
|
327
|
+
Set multiple config keys in one command.
|
|
328
|
+
- execforge config reset <key> [<key> ...]
|
|
329
|
+
Reset selected keys to defaults.
|
|
330
|
+
- execforge config reset --all
|
|
331
|
+
Reset all app config keys to defaults.
|
|
332
|
+
|
|
333
|
+
Editable app config keys (execforge config set)
|
|
334
|
+
- log_level: string, default INFO
|
|
335
|
+
- default_timeout_seconds: integer, default 900
|
|
336
|
+
- default_require_clean_tree: boolean, default true
|
|
337
|
+
- default_allow_push: boolean, default false
|
|
338
|
+
|
|
339
|
+
Common agent update keys (execforge agent update --set ...)
|
|
340
|
+
- Top-level: name, execution_backend, task_selector_strategy, push_policy, autonomy_level, max_steps, active
|
|
341
|
+
- Nested JSON maps: model_settings.<key>, safety_settings.<key>, commit_policy.<key>
|
|
342
|
+
```
|
|
296
343
|
|
|
297
344
|
## When nothing runs
|
|
298
345
|
|
|
@@ -337,25 +384,25 @@ export AGENT_ORCHESTRATOR_HOME=~/.agent-orchestrator
|
|
|
337
384
|
- `docs/USAGE_WALKTHROUGH.md` - practical end-to-end flow
|
|
338
385
|
- `docs/ARCHITECTURE.md` - implementation layout
|
|
339
386
|
|
|
340
|
-
## CI/CD and
|
|
387
|
+
## CI/CD and package publish
|
|
341
388
|
|
|
342
389
|
This repo includes GitHub Actions pipelines:
|
|
343
390
|
|
|
344
|
-
- `.github/workflows/ci.yml` - lint, tests, package build,
|
|
391
|
+
- `.github/workflows/ci.yml` - lint, tests, Python package build, `twine check`, and npm package dry-run
|
|
345
392
|
- `.github/workflows/publish-testpypi.yml` - manual publish to TestPyPI
|
|
346
|
-
- `.github/workflows/publish-pypi.yml` - publish to PyPI on release (and manual dispatch)
|
|
393
|
+
- `.github/workflows/publish-pypi.yml` - publish to PyPI and npm on release (and manual dispatch)
|
|
347
394
|
|
|
348
|
-
|
|
395
|
+
Publishing auth:
|
|
349
396
|
|
|
350
|
-
- `
|
|
351
|
-
- `
|
|
397
|
+
- `.github/workflows/publish-pypi.yml` uses Trusted Publishing (OIDC) for both PyPI and npm; no `PYPI_API_TOKEN` or `NPM_TOKEN` secret is required once trusted publishers are configured on each registry.
|
|
398
|
+
- `.github/workflows/publish-testpypi.yml` currently uses `TEST_PYPI_API_TOKEN`.
|
|
352
399
|
|
|
353
400
|
Typical release flow:
|
|
354
401
|
|
|
355
402
|
```bash
|
|
356
403
|
# 1) bump version in pyproject.toml
|
|
357
404
|
# 2) commit and tag
|
|
358
|
-
git tag v0.1.
|
|
405
|
+
git tag v0.1.2
|
|
359
406
|
git push origin main --tags
|
|
360
407
|
|
|
361
408
|
# 3) create/publish a GitHub Release for that tag
|
|
@@ -23,6 +23,9 @@ pipx install execforge
|
|
|
23
23
|
# or
|
|
24
24
|
pip install execforge
|
|
25
25
|
|
|
26
|
+
# npm (requires Python 3.11+ installed)
|
|
27
|
+
npm install -g execforge
|
|
28
|
+
|
|
26
29
|
# local dev
|
|
27
30
|
pip install -e .
|
|
28
31
|
```
|
|
@@ -216,43 +219,87 @@ execforge agent update test-agent --set safety_settings.allow_push=true
|
|
|
216
219
|
execforge agent delete test-agent --yes
|
|
217
220
|
```
|
|
218
221
|
|
|
219
|
-
##
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
-
|
|
224
|
-
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
-
|
|
242
|
-
|
|
243
|
-
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
-
|
|
250
|
-
|
|
251
|
-
-
|
|
252
|
-
|
|
253
|
-
-
|
|
254
|
-
|
|
255
|
-
-
|
|
222
|
+
## Complete command + config reference (grouped by task)
|
|
223
|
+
|
|
224
|
+
```text
|
|
225
|
+
Setup and health
|
|
226
|
+
- execforge init [--interactive/--no-interactive]
|
|
227
|
+
Initialize app home, SQLite DB, and run first-time setup wizard.
|
|
228
|
+
- execforge start
|
|
229
|
+
Print the guided first-time command sequence.
|
|
230
|
+
- execforge status
|
|
231
|
+
Show setup counts and last run summary.
|
|
232
|
+
- execforge doctor
|
|
233
|
+
Check app paths, SQLite access, and git environment.
|
|
234
|
+
|
|
235
|
+
Prompt sources (task origin repos)
|
|
236
|
+
- execforge prompt-source add <name> <repo-url> [branch] [folder_scope] [sync_strategy] [clone_path]
|
|
237
|
+
Register a prompt source definition.
|
|
238
|
+
- execforge prompt-source list
|
|
239
|
+
List configured prompt sources.
|
|
240
|
+
- execforge prompt-source sync <name-or-id> [--bootstrap-missing-branch]
|
|
241
|
+
Pull/clone source and discover task files.
|
|
242
|
+
|
|
243
|
+
Project repos (code targets)
|
|
244
|
+
- execforge project add <name> <local-path> [default_branch] [allowed_branch_pattern]
|
|
245
|
+
Register a local git repo as an execution target.
|
|
246
|
+
- execforge project list
|
|
247
|
+
List configured project repos.
|
|
248
|
+
|
|
249
|
+
Agents (execution profiles)
|
|
250
|
+
- execforge agent
|
|
251
|
+
Alias for execforge agent list.
|
|
252
|
+
- execforge agent add <name> <prompt-source-name-or-id> <project-name-or-id> [options]
|
|
253
|
+
Create an agent linked to one prompt source and one project.
|
|
254
|
+
- execforge agent list [--compact]
|
|
255
|
+
List agents (JSON blocks or one-line compact view).
|
|
256
|
+
- execforge agent update <agent-name-or-id> --set key=value [--set key=value ...]
|
|
257
|
+
Update agent fields and nested JSON config.
|
|
258
|
+
- execforge agent delete <agent-name-or-id> [--yes]
|
|
259
|
+
Delete an agent and its run history.
|
|
260
|
+
- execforge agent run <agent-name-or-id> [--verbose] [--debug]
|
|
261
|
+
Execute one run cycle.
|
|
262
|
+
- execforge agent loop <agent-name-or-id> [interval_seconds] [max_iterations] [--verbose] [--debug] [--only-new-prompts/--all-eligible-prompts] [--reset-only-new-baseline]
|
|
263
|
+
Run continuously on a polling interval.
|
|
264
|
+
|
|
265
|
+
Tasks and runs
|
|
266
|
+
- execforge task list [status]
|
|
267
|
+
List discovered tasks, optionally filtered by status.
|
|
268
|
+
- execforge task inspect <task-id>
|
|
269
|
+
Show parsed task details and steps.
|
|
270
|
+
- execforge task set-status <task-id> <status>
|
|
271
|
+
Set status to one of: todo, ready, in_progress, done, failed, blocked.
|
|
272
|
+
- execforge task retry <task-id>
|
|
273
|
+
Shortcut that sets task status back to todo.
|
|
274
|
+
- execforge run list [limit]
|
|
275
|
+
Show recent run history rows.
|
|
276
|
+
|
|
277
|
+
App config commands
|
|
278
|
+
- execforge config
|
|
279
|
+
Alias for execforge config show.
|
|
280
|
+
- execforge config show
|
|
281
|
+
Show current app config and key paths.
|
|
282
|
+
- execforge config keys
|
|
283
|
+
List editable app config keys and defaults.
|
|
284
|
+
- execforge config set <key> <value>
|
|
285
|
+
Set one config key.
|
|
286
|
+
- execforge config set --set key=value [--set key=value ...]
|
|
287
|
+
Set multiple config keys in one command.
|
|
288
|
+
- execforge config reset <key> [<key> ...]
|
|
289
|
+
Reset selected keys to defaults.
|
|
290
|
+
- execforge config reset --all
|
|
291
|
+
Reset all app config keys to defaults.
|
|
292
|
+
|
|
293
|
+
Editable app config keys (execforge config set)
|
|
294
|
+
- log_level: string, default INFO
|
|
295
|
+
- default_timeout_seconds: integer, default 900
|
|
296
|
+
- default_require_clean_tree: boolean, default true
|
|
297
|
+
- default_allow_push: boolean, default false
|
|
298
|
+
|
|
299
|
+
Common agent update keys (execforge agent update --set ...)
|
|
300
|
+
- Top-level: name, execution_backend, task_selector_strategy, push_policy, autonomy_level, max_steps, active
|
|
301
|
+
- Nested JSON maps: model_settings.<key>, safety_settings.<key>, commit_policy.<key>
|
|
302
|
+
```
|
|
256
303
|
|
|
257
304
|
## When nothing runs
|
|
258
305
|
|
|
@@ -297,25 +344,25 @@ export AGENT_ORCHESTRATOR_HOME=~/.agent-orchestrator
|
|
|
297
344
|
- `docs/USAGE_WALKTHROUGH.md` - practical end-to-end flow
|
|
298
345
|
- `docs/ARCHITECTURE.md` - implementation layout
|
|
299
346
|
|
|
300
|
-
## CI/CD and
|
|
347
|
+
## CI/CD and package publish
|
|
301
348
|
|
|
302
349
|
This repo includes GitHub Actions pipelines:
|
|
303
350
|
|
|
304
|
-
- `.github/workflows/ci.yml` - lint, tests, package build,
|
|
351
|
+
- `.github/workflows/ci.yml` - lint, tests, Python package build, `twine check`, and npm package dry-run
|
|
305
352
|
- `.github/workflows/publish-testpypi.yml` - manual publish to TestPyPI
|
|
306
|
-
- `.github/workflows/publish-pypi.yml` - publish to PyPI on release (and manual dispatch)
|
|
353
|
+
- `.github/workflows/publish-pypi.yml` - publish to PyPI and npm on release (and manual dispatch)
|
|
307
354
|
|
|
308
|
-
|
|
355
|
+
Publishing auth:
|
|
309
356
|
|
|
310
|
-
- `
|
|
311
|
-
- `
|
|
357
|
+
- `.github/workflows/publish-pypi.yml` uses Trusted Publishing (OIDC) for both PyPI and npm; no `PYPI_API_TOKEN` or `NPM_TOKEN` secret is required once trusted publishers are configured on each registry.
|
|
358
|
+
- `.github/workflows/publish-testpypi.yml` currently uses `TEST_PYPI_API_TOKEN`.
|
|
312
359
|
|
|
313
360
|
Typical release flow:
|
|
314
361
|
|
|
315
362
|
```bash
|
|
316
363
|
# 1) bump version in pyproject.toml
|
|
317
364
|
# 2) commit and tag
|
|
318
|
-
git tag v0.1.
|
|
365
|
+
git tag v0.1.2
|
|
319
366
|
git push origin main --tags
|
|
320
367
|
|
|
321
368
|
# 3) create/publish a GitHub Release for that tag
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: execforge
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.2
|
|
4
4
|
Summary: Production-minded local CLI for autonomous repo orchestration
|
|
5
5
|
Author: Open Source Contributors
|
|
6
6
|
License: MIT License
|
|
@@ -63,6 +63,9 @@ pipx install execforge
|
|
|
63
63
|
# or
|
|
64
64
|
pip install execforge
|
|
65
65
|
|
|
66
|
+
# npm (requires Python 3.11+ installed)
|
|
67
|
+
npm install -g execforge
|
|
68
|
+
|
|
66
69
|
# local dev
|
|
67
70
|
pip install -e .
|
|
68
71
|
```
|
|
@@ -256,43 +259,87 @@ execforge agent update test-agent --set safety_settings.allow_push=true
|
|
|
256
259
|
execforge agent delete test-agent --yes
|
|
257
260
|
```
|
|
258
261
|
|
|
259
|
-
##
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
-
|
|
264
|
-
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
-
|
|
282
|
-
|
|
283
|
-
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
-
|
|
290
|
-
|
|
291
|
-
-
|
|
292
|
-
|
|
293
|
-
-
|
|
294
|
-
|
|
295
|
-
-
|
|
262
|
+
## Complete command + config reference (grouped by task)
|
|
263
|
+
|
|
264
|
+
```text
|
|
265
|
+
Setup and health
|
|
266
|
+
- execforge init [--interactive/--no-interactive]
|
|
267
|
+
Initialize app home, SQLite DB, and run first-time setup wizard.
|
|
268
|
+
- execforge start
|
|
269
|
+
Print the guided first-time command sequence.
|
|
270
|
+
- execforge status
|
|
271
|
+
Show setup counts and last run summary.
|
|
272
|
+
- execforge doctor
|
|
273
|
+
Check app paths, SQLite access, and git environment.
|
|
274
|
+
|
|
275
|
+
Prompt sources (task origin repos)
|
|
276
|
+
- execforge prompt-source add <name> <repo-url> [branch] [folder_scope] [sync_strategy] [clone_path]
|
|
277
|
+
Register a prompt source definition.
|
|
278
|
+
- execforge prompt-source list
|
|
279
|
+
List configured prompt sources.
|
|
280
|
+
- execforge prompt-source sync <name-or-id> [--bootstrap-missing-branch]
|
|
281
|
+
Pull/clone source and discover task files.
|
|
282
|
+
|
|
283
|
+
Project repos (code targets)
|
|
284
|
+
- execforge project add <name> <local-path> [default_branch] [allowed_branch_pattern]
|
|
285
|
+
Register a local git repo as an execution target.
|
|
286
|
+
- execforge project list
|
|
287
|
+
List configured project repos.
|
|
288
|
+
|
|
289
|
+
Agents (execution profiles)
|
|
290
|
+
- execforge agent
|
|
291
|
+
Alias for execforge agent list.
|
|
292
|
+
- execforge agent add <name> <prompt-source-name-or-id> <project-name-or-id> [options]
|
|
293
|
+
Create an agent linked to one prompt source and one project.
|
|
294
|
+
- execforge agent list [--compact]
|
|
295
|
+
List agents (JSON blocks or one-line compact view).
|
|
296
|
+
- execforge agent update <agent-name-or-id> --set key=value [--set key=value ...]
|
|
297
|
+
Update agent fields and nested JSON config.
|
|
298
|
+
- execforge agent delete <agent-name-or-id> [--yes]
|
|
299
|
+
Delete an agent and its run history.
|
|
300
|
+
- execforge agent run <agent-name-or-id> [--verbose] [--debug]
|
|
301
|
+
Execute one run cycle.
|
|
302
|
+
- execforge agent loop <agent-name-or-id> [interval_seconds] [max_iterations] [--verbose] [--debug] [--only-new-prompts/--all-eligible-prompts] [--reset-only-new-baseline]
|
|
303
|
+
Run continuously on a polling interval.
|
|
304
|
+
|
|
305
|
+
Tasks and runs
|
|
306
|
+
- execforge task list [status]
|
|
307
|
+
List discovered tasks, optionally filtered by status.
|
|
308
|
+
- execforge task inspect <task-id>
|
|
309
|
+
Show parsed task details and steps.
|
|
310
|
+
- execforge task set-status <task-id> <status>
|
|
311
|
+
Set status to one of: todo, ready, in_progress, done, failed, blocked.
|
|
312
|
+
- execforge task retry <task-id>
|
|
313
|
+
Shortcut that sets task status back to todo.
|
|
314
|
+
- execforge run list [limit]
|
|
315
|
+
Show recent run history rows.
|
|
316
|
+
|
|
317
|
+
App config commands
|
|
318
|
+
- execforge config
|
|
319
|
+
Alias for execforge config show.
|
|
320
|
+
- execforge config show
|
|
321
|
+
Show current app config and key paths.
|
|
322
|
+
- execforge config keys
|
|
323
|
+
List editable app config keys and defaults.
|
|
324
|
+
- execforge config set <key> <value>
|
|
325
|
+
Set one config key.
|
|
326
|
+
- execforge config set --set key=value [--set key=value ...]
|
|
327
|
+
Set multiple config keys in one command.
|
|
328
|
+
- execforge config reset <key> [<key> ...]
|
|
329
|
+
Reset selected keys to defaults.
|
|
330
|
+
- execforge config reset --all
|
|
331
|
+
Reset all app config keys to defaults.
|
|
332
|
+
|
|
333
|
+
Editable app config keys (execforge config set)
|
|
334
|
+
- log_level: string, default INFO
|
|
335
|
+
- default_timeout_seconds: integer, default 900
|
|
336
|
+
- default_require_clean_tree: boolean, default true
|
|
337
|
+
- default_allow_push: boolean, default false
|
|
338
|
+
|
|
339
|
+
Common agent update keys (execforge agent update --set ...)
|
|
340
|
+
- Top-level: name, execution_backend, task_selector_strategy, push_policy, autonomy_level, max_steps, active
|
|
341
|
+
- Nested JSON maps: model_settings.<key>, safety_settings.<key>, commit_policy.<key>
|
|
342
|
+
```
|
|
296
343
|
|
|
297
344
|
## When nothing runs
|
|
298
345
|
|
|
@@ -337,25 +384,25 @@ export AGENT_ORCHESTRATOR_HOME=~/.agent-orchestrator
|
|
|
337
384
|
- `docs/USAGE_WALKTHROUGH.md` - practical end-to-end flow
|
|
338
385
|
- `docs/ARCHITECTURE.md` - implementation layout
|
|
339
386
|
|
|
340
|
-
## CI/CD and
|
|
387
|
+
## CI/CD and package publish
|
|
341
388
|
|
|
342
389
|
This repo includes GitHub Actions pipelines:
|
|
343
390
|
|
|
344
|
-
- `.github/workflows/ci.yml` - lint, tests, package build,
|
|
391
|
+
- `.github/workflows/ci.yml` - lint, tests, Python package build, `twine check`, and npm package dry-run
|
|
345
392
|
- `.github/workflows/publish-testpypi.yml` - manual publish to TestPyPI
|
|
346
|
-
- `.github/workflows/publish-pypi.yml` - publish to PyPI on release (and manual dispatch)
|
|
393
|
+
- `.github/workflows/publish-pypi.yml` - publish to PyPI and npm on release (and manual dispatch)
|
|
347
394
|
|
|
348
|
-
|
|
395
|
+
Publishing auth:
|
|
349
396
|
|
|
350
|
-
- `
|
|
351
|
-
- `
|
|
397
|
+
- `.github/workflows/publish-pypi.yml` uses Trusted Publishing (OIDC) for both PyPI and npm; no `PYPI_API_TOKEN` or `NPM_TOKEN` secret is required once trusted publishers are configured on each registry.
|
|
398
|
+
- `.github/workflows/publish-testpypi.yml` currently uses `TEST_PYPI_API_TOKEN`.
|
|
352
399
|
|
|
353
400
|
Typical release flow:
|
|
354
401
|
|
|
355
402
|
```bash
|
|
356
403
|
# 1) bump version in pyproject.toml
|
|
357
404
|
# 2) commit and tag
|
|
358
|
-
git tag v0.1.
|
|
405
|
+
git tag v0.1.2
|
|
359
406
|
git push origin main --tags
|
|
360
407
|
|
|
361
408
|
# 3) create/publish a GitHub Release for that tag
|
|
@@ -35,9 +35,6 @@ class AppConfig:
|
|
|
35
35
|
default_timeout_seconds: int = 900
|
|
36
36
|
default_require_clean_tree: bool = True
|
|
37
37
|
default_allow_push: bool = False
|
|
38
|
-
claude_api_key: str | None = None
|
|
39
|
-
codex_api_key: str | None = None
|
|
40
|
-
opencode_api_key: str | None = None
|
|
41
38
|
|
|
42
39
|
|
|
43
40
|
@dataclass(slots=True)
|
|
@@ -114,33 +111,18 @@ def get_config_schema() -> dict[str, ConfigFieldSpec]:
|
|
|
114
111
|
default=False,
|
|
115
112
|
description="Allow push by default",
|
|
116
113
|
),
|
|
117
|
-
"claude_api_key": ConfigFieldSpec(
|
|
118
|
-
key="claude_api_key",
|
|
119
|
-
value_type=str,
|
|
120
|
-
default=None,
|
|
121
|
-
sensitive=True,
|
|
122
|
-
description="Optional Claude API key",
|
|
123
|
-
),
|
|
124
|
-
"codex_api_key": ConfigFieldSpec(
|
|
125
|
-
key="codex_api_key",
|
|
126
|
-
value_type=str,
|
|
127
|
-
default=None,
|
|
128
|
-
sensitive=True,
|
|
129
|
-
description="Optional Codex API key",
|
|
130
|
-
),
|
|
131
|
-
"opencode_api_key": ConfigFieldSpec(
|
|
132
|
-
key="opencode_api_key",
|
|
133
|
-
value_type=str,
|
|
134
|
-
default=None,
|
|
135
|
-
sensitive=True,
|
|
136
|
-
description="Optional OpenCode API key",
|
|
137
|
-
),
|
|
138
114
|
}
|
|
139
115
|
|
|
140
116
|
|
|
141
117
|
def get_app_paths() -> AppPaths:
|
|
142
|
-
override = os.environ.get("AGENT_ORCHESTRATOR_HOME") or os.environ.get(
|
|
143
|
-
|
|
118
|
+
override = os.environ.get("AGENT_ORCHESTRATOR_HOME") or os.environ.get(
|
|
119
|
+
"ORCHESTRATOR_HOME"
|
|
120
|
+
)
|
|
121
|
+
root = (
|
|
122
|
+
Path(override).expanduser()
|
|
123
|
+
if override
|
|
124
|
+
else Path(user_data_dir(APP_NAME, APP_NAME))
|
|
125
|
+
)
|
|
144
126
|
return AppPaths(
|
|
145
127
|
root=root,
|
|
146
128
|
db_file=root / "app.db",
|
|
@@ -209,13 +191,17 @@ def _serialize_toml(config: AppConfig) -> str:
|
|
|
209
191
|
def save_config(paths: AppPaths, config: AppConfig) -> None:
|
|
210
192
|
text = _serialize_toml(config)
|
|
211
193
|
paths.config_file.parent.mkdir(parents=True, exist_ok=True)
|
|
212
|
-
with tempfile.NamedTemporaryFile(
|
|
194
|
+
with tempfile.NamedTemporaryFile(
|
|
195
|
+
"w", delete=False, encoding="utf-8", dir=str(paths.config_file.parent)
|
|
196
|
+
) as tmp:
|
|
213
197
|
tmp.write(text)
|
|
214
198
|
tmp_path = Path(tmp.name)
|
|
215
199
|
tmp_path.replace(paths.config_file)
|
|
216
200
|
|
|
217
201
|
|
|
218
|
-
def config_to_display_dict(
|
|
202
|
+
def config_to_display_dict(
|
|
203
|
+
config: AppConfig, mask_sensitive: bool = True
|
|
204
|
+
) -> dict[str, Any]:
|
|
219
205
|
data = asdict(config)
|
|
220
206
|
schema = get_config_schema()
|
|
221
207
|
out: dict[str, Any] = {}
|
|
@@ -233,7 +219,9 @@ def update_config_values(paths: AppPaths, updates: dict[str, str]) -> AppConfig:
|
|
|
233
219
|
unknown = [k for k in updates if k not in schema]
|
|
234
220
|
if unknown:
|
|
235
221
|
known = ", ".join(sorted(schema.keys()))
|
|
236
|
-
raise ConfigError(
|
|
222
|
+
raise ConfigError(
|
|
223
|
+
f"Unknown config key(s): {', '.join(unknown)}. Known keys: {known}"
|
|
224
|
+
)
|
|
237
225
|
|
|
238
226
|
config = load_config(paths)
|
|
239
227
|
data = asdict(config)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|