delegate-agent-cli 0.13.0__tar.gz → 0.14.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.
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/CHANGELOG.md +60 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/PKG-INFO +28 -1
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/README.md +27 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/docs/cli-reference.md +89 -25
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/docs/configuration.md +5 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/docs/security-model.md +37 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/docs/worktrees.md +4 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/pyproject.toml +1 -1
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/__init__.py +1 -1
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/argv_builders.py +84 -5
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/argv_utils.py +9 -1
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/cli.py +44 -7
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/cli_parser.py +114 -3
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/command_help.py +148 -51
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/constants.py +25 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/describe_payload.py +108 -7
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/git_utils.py +1 -1
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/harness_events.py +28 -1
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/isolation.py +1 -1
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/json_types.py +2 -2
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/profiles.py +67 -9
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/reasoning.py +3 -3
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/request_build.py +143 -28
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/request_models.py +9 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/run_metadata.py +12 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/runner.py +425 -29
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/safe_workspace.py +86 -19
- delegate_agent_cli-0.14.0/src/delegate_agent/seatbelt.py +170 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/snapshot_view.py +1 -2
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/wait_cancel_commands.py +50 -23
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/workflows/commands.py +131 -34
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/workflows/registry.py +77 -1
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/workflows/runtime.py +95 -40
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/workflows/schema.py +34 -4
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/workflows/script.py +3 -2
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/worktree_execution.py +10 -47
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/worktree_summary.py +1 -2
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent_cli.egg-info/PKG-INFO +28 -1
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent_cli.egg-info/SOURCES.txt +3 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_capability_commands.py +17 -0
- delegate_agent_cli-0.14.0/tests/test_codex_pure_sandbox.py +511 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_command_help.py +96 -11
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_delegate_help_cli.py +72 -1
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_delegate_isolation.py +3 -3
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_delegate_parser.py +213 -20
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_delegate_validation.py +0 -11
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_end_to_end_tracking.py +19 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_engine_argv.py +32 -1
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_execution_argv_and_prompt.py +39 -2
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_execution_dry_run.py +23 -11
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_execution_worktree_failure_cleanup.py +1 -12
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_execution_worktree_preflight.py +2 -4
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_execution_worktree_run.py +0 -8
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_model_discovery.py +2 -2
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_model_selection_wave1a.py +1 -1
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_model_selection_wave1b.py +3 -3
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_profiles.py +64 -0
- delegate_agent_cli-0.14.0/tests/test_pure_call.py +570 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_retention.py +0 -3
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_run_registry.py +0 -2
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_runner_capture.py +0 -8
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_safe_workspace_isolation.py +143 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_wait_cancel_commands.py +130 -59
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_workflow_commands.py +927 -20
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_worktree_list_show.py +0 -1
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_worktree_prune_gc.py +0 -1
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_worktree_remove.py +0 -1
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/CONTRIBUTING.md +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/LICENSE +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/MANIFEST.in +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/SECURITY.md +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/bin/delegate-profile-shim +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/bin/delegate.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/config.example.json +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/docs/agent-setup.md +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/docs/assets/delegate-agent-header.png +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/docs/development.md +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/docs/live-runtime.md +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/docs/publishing-checklist.md +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/docs/troubleshooting.md +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/examples/task.claude.json +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/examples/task.codex.json +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/examples/task.cursor.json +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/examples/task.droid.json +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/examples/task.grok.json +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/examples/task.judge.json +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/setup.cfg +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/archived_logs.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/bundled_models.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/capability_commands.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/command_errors.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/config.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/config_commands.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/errors.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/inspection_commands.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/log_output.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/model_discovery.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/private_io.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/profile_commands.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/profile_guard.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/prompt_instructions.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/prompt_transport.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/redaction.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/rendering.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/retention.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/run_output_commands.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/run_registry.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/run_status.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/workflows/__init__.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/worktree_commands.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/worktree_gc.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/worktree_mgmt.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/worktree_records.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/worktree_remove.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent/wsl.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent_cli.egg-info/dependency_links.txt +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent_cli.egg-info/entry_points.txt +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent_cli.egg-info/requires.txt +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/src/delegate_agent_cli.egg-info/top_level.txt +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_config_commands.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_harness_events.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_inspection_commands.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_kimi_commands.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_packaging.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_reasoning_capabilities.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_slash_passthrough.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_snapshot_redaction.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_snapshot_rendering.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_snapshot_run_output.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_snapshot_view.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_utility_modules.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_wave4_launch_features.py +0 -0
- {delegate_agent_cli-0.13.0 → delegate_agent_cli-0.14.0}/tests/test_wsl_guardrails.py +0 -0
|
@@ -5,6 +5,64 @@ All notable changes to this project are documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.14.0] - 2026-07-15
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- `workflow result --field` for extracting a single field from a workflow
|
|
13
|
+
result, reliable latest-workflow selection, immutable creation ordering,
|
|
14
|
+
dry-run visibility, and orphan detection (PR #14).
|
|
15
|
+
- Schema validation for `agent()` results supports `minLength` and
|
|
16
|
+
`minItems`, including in retries and dry-run placeholders (PR #14).
|
|
17
|
+
- Grouped work runs sharing one non-isolated workspace now emit a warning
|
|
18
|
+
with guidance for commit boundaries and persistent worktrees (PR #13).
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- Focused call help (`delegate <engine> call --help`) now reflects
|
|
23
|
+
call-mode option boundaries and documents the grouped-call tracking
|
|
24
|
+
exception (`--cwd` accepted only with `--group`); explicit `agent` input
|
|
25
|
+
is rejected on engines that do not support it (PR #13).
|
|
26
|
+
- Overview, dry-run, agent-help, README, CLI reference, and worktree docs
|
|
27
|
+
corrected from user feedback (PR #13).
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
|
|
31
|
+
- Structured Codex workflows consume the child-authored completion report
|
|
32
|
+
(including on resume) and fail closed when it is missing; workflow resume
|
|
33
|
+
transitions atomically to `starting`, hides stale results, rolls back
|
|
34
|
+
failed launches, and releases locks on preparation errors (PR #14).
|
|
35
|
+
- Safe isolation re-roots exact source-workspace paths while preserving
|
|
36
|
+
slash-command payloads verbatim (PR #14).
|
|
37
|
+
- `wait`: a run matched by both `--latest HARNESS` and `--group NAME`
|
|
38
|
+
was emitted twice in the resolved-target list; it now appears once, with
|
|
39
|
+
first-selection precedence and ordering preserved.
|
|
40
|
+
- `git_root_for` degrades any `OSError` from the git probe (not just
|
|
41
|
+
`FileNotFoundError`) to the non-git fallback, so e.g. a `PermissionError`
|
|
42
|
+
spawning git no longer crashes workspace resolution.
|
|
43
|
+
|
|
44
|
+
### Changed
|
|
45
|
+
|
|
46
|
+
- Internal cleanup pass across `src/` and `tests/`: removed dead code (unused
|
|
47
|
+
protocol types, private helpers, stale fixtures), collapsed redundant
|
|
48
|
+
exception tuples into their `OSError` base, replaced a hand-rolled
|
|
49
|
+
path-containment helper with `Path.is_relative_to`, and stripped stale
|
|
50
|
+
review-artifact comments. Behavior-preserving; the workflow supervisor's
|
|
51
|
+
broad exception boundary around child-model output is now explicitly
|
|
52
|
+
commented and regression-tested.
|
|
53
|
+
|
|
54
|
+
## [0.13.1] - 2026-07-09
|
|
55
|
+
|
|
56
|
+
### Added
|
|
57
|
+
|
|
58
|
+
- Codex-only `--fast` / `--no-fast` per-run service-tier overrides (and a
|
|
59
|
+
`fast` boolean in run-input JSON). `--fast` emits `service_tier="fast"` plus
|
|
60
|
+
`features.fast_mode=true` so the tier cannot be silently dropped by ambient
|
|
61
|
+
Codex config; `--no-fast` emits the explicit `service_tier="default"`
|
|
62
|
+
standard-routing sentinel; omitting both inherits Codex configuration. The
|
|
63
|
+
explicit choice is recorded as `requestedFast` in run metadata. The flag and
|
|
64
|
+
JSON key fail closed on every other engine, including a bare `"fast": null`.
|
|
65
|
+
|
|
8
66
|
## [0.13.0] - 2026-07-09
|
|
9
67
|
|
|
10
68
|
### Added
|
|
@@ -292,6 +350,8 @@ Usage-audit fix wave: 82 sessions and 1,241 delegate invocations from one week o
|
|
|
292
350
|
|
|
293
351
|
- Releases before 0.1.3 predate this changelog.
|
|
294
352
|
|
|
353
|
+
[0.14.0]: https://github.com/treygoff24/delegate-agent/compare/v0.13.1...v0.14.0
|
|
354
|
+
[0.13.1]: https://github.com/treygoff24/delegate-agent/compare/v0.13.0...v0.13.1
|
|
295
355
|
[0.13.0]: https://github.com/treygoff24/delegate-agent/compare/v0.12.0...v0.13.0
|
|
296
356
|
[0.12.0]: https://github.com/treygoff24/delegate-agent/compare/v0.11.0...v0.12.0
|
|
297
357
|
[0.11.0]: https://github.com/treygoff24/delegate-agent/compare/v0.10.0...v0.11.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: delegate-agent-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.14.0
|
|
4
4
|
Summary: A tiny CLI for delegating bounded agent tasks to Cursor, Droid, OpenAI Codex, Claude Code, Grok Build, or Kimi Code runtimes.
|
|
5
5
|
Author: Trey Goff
|
|
6
6
|
License-Expression: MIT
|
|
@@ -221,8 +221,17 @@ run, use stateless `call` mode:
|
|
|
221
221
|
|
|
222
222
|
```bash
|
|
223
223
|
delegate --json codex call "Summarize this context in three bullets."
|
|
224
|
+
delegate --json claude call --pure --timeout 60 --output-schema result.schema.json < prompt.txt
|
|
224
225
|
```
|
|
225
226
|
|
|
227
|
+
`call --pure` is a hostile-input completion boundary available on Claude only.
|
|
228
|
+
It uses an empty temporary cwd, an allowlisted child environment, no Delegate
|
|
229
|
+
prompt framing, and no session persistence or tools according to the engine
|
|
230
|
+
capability contract. Claude receives the prompt only on stdin and is
|
|
231
|
+
schema-capable via `--output-schema`; `delegate --json describe` reports
|
|
232
|
+
`pureCall`, `structuredOutput`, `noSessionPersistence`, `usageEvents`, and
|
|
233
|
+
`promptStdin` per engine. `--timeout SECONDS` applies to every call-mode engine.
|
|
234
|
+
|
|
226
235
|
For multi-step fan-out or gated review flows, use Delegate Workflows. A workflow
|
|
227
236
|
is a Python script that launches normal Delegate child runs, journals progress,
|
|
228
237
|
can pause on approval gates, and can resume from cached child results:
|
|
@@ -243,6 +252,21 @@ delegate --json dry-run codex safe --reasoning-effort high "Review this reposito
|
|
|
243
252
|
delegate --json dry-run claude safe --reasoning-effort high "Review this repository. Do not edit files."
|
|
244
253
|
```
|
|
245
254
|
|
|
255
|
+
Codex model routing is deliberately model-first rather than aliasing every
|
|
256
|
+
model/effort pair: define model aliases in `codex.models`, then set effort per
|
|
257
|
+
run with `--reasoning-effort`. Per-model effort menus (including any efforts
|
|
258
|
+
newer than the bundled data) belong in the private `reasoning.capabilities`
|
|
259
|
+
config block, which overrides the bundled defaults.
|
|
260
|
+
|
|
261
|
+
Fast mode is an independent per-run serving choice. `--fast` requests Codex's
|
|
262
|
+
Fast service tier, `--no-fast` explicitly requests Standard, and omitting both
|
|
263
|
+
inherits the active Codex configuration:
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
delegate codex safe --model my-alias --reasoning-effort medium --fast "Explore likely causes."
|
|
267
|
+
delegate codex work --model my-alias --reasoning-effort high --no-fast "Implement and verify."
|
|
268
|
+
```
|
|
269
|
+
|
|
246
270
|
Inspect tracked output by alias:
|
|
247
271
|
|
|
248
272
|
```bash
|
|
@@ -279,6 +303,9 @@ cancelled, and `124` on timeout. `cancel` signals the run's process group
|
|
|
279
303
|
start-identity check against PID reuse; a cancelled run reports `cancelled`
|
|
280
304
|
rather than a false success. Tag a batch of launches with `--group NAME` and
|
|
281
305
|
`wait`, `runs`, and the worktree commands can select the whole group at once.
|
|
306
|
+
Commit between grouped feature waves that edit the same workspace. If features
|
|
307
|
+
need separate review or commits, give each a persistent worktree and integrate
|
|
308
|
+
them separately; `wait --group` warns about shared non-isolated workspaces.
|
|
282
309
|
|
|
283
310
|
## Task design: cluster related work into fewer, richer delegations
|
|
284
311
|
|
|
@@ -188,8 +188,17 @@ run, use stateless `call` mode:
|
|
|
188
188
|
|
|
189
189
|
```bash
|
|
190
190
|
delegate --json codex call "Summarize this context in three bullets."
|
|
191
|
+
delegate --json claude call --pure --timeout 60 --output-schema result.schema.json < prompt.txt
|
|
191
192
|
```
|
|
192
193
|
|
|
194
|
+
`call --pure` is a hostile-input completion boundary available on Claude only.
|
|
195
|
+
It uses an empty temporary cwd, an allowlisted child environment, no Delegate
|
|
196
|
+
prompt framing, and no session persistence or tools according to the engine
|
|
197
|
+
capability contract. Claude receives the prompt only on stdin and is
|
|
198
|
+
schema-capable via `--output-schema`; `delegate --json describe` reports
|
|
199
|
+
`pureCall`, `structuredOutput`, `noSessionPersistence`, `usageEvents`, and
|
|
200
|
+
`promptStdin` per engine. `--timeout SECONDS` applies to every call-mode engine.
|
|
201
|
+
|
|
193
202
|
For multi-step fan-out or gated review flows, use Delegate Workflows. A workflow
|
|
194
203
|
is a Python script that launches normal Delegate child runs, journals progress,
|
|
195
204
|
can pause on approval gates, and can resume from cached child results:
|
|
@@ -210,6 +219,21 @@ delegate --json dry-run codex safe --reasoning-effort high "Review this reposito
|
|
|
210
219
|
delegate --json dry-run claude safe --reasoning-effort high "Review this repository. Do not edit files."
|
|
211
220
|
```
|
|
212
221
|
|
|
222
|
+
Codex model routing is deliberately model-first rather than aliasing every
|
|
223
|
+
model/effort pair: define model aliases in `codex.models`, then set effort per
|
|
224
|
+
run with `--reasoning-effort`. Per-model effort menus (including any efforts
|
|
225
|
+
newer than the bundled data) belong in the private `reasoning.capabilities`
|
|
226
|
+
config block, which overrides the bundled defaults.
|
|
227
|
+
|
|
228
|
+
Fast mode is an independent per-run serving choice. `--fast` requests Codex's
|
|
229
|
+
Fast service tier, `--no-fast` explicitly requests Standard, and omitting both
|
|
230
|
+
inherits the active Codex configuration:
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
delegate codex safe --model my-alias --reasoning-effort medium --fast "Explore likely causes."
|
|
234
|
+
delegate codex work --model my-alias --reasoning-effort high --no-fast "Implement and verify."
|
|
235
|
+
```
|
|
236
|
+
|
|
213
237
|
Inspect tracked output by alias:
|
|
214
238
|
|
|
215
239
|
```bash
|
|
@@ -246,6 +270,9 @@ cancelled, and `124` on timeout. `cancel` signals the run's process group
|
|
|
246
270
|
start-identity check against PID reuse; a cancelled run reports `cancelled`
|
|
247
271
|
rather than a false success. Tag a batch of launches with `--group NAME` and
|
|
248
272
|
`wait`, `runs`, and the worktree commands can select the whole group at once.
|
|
273
|
+
Commit between grouped feature waves that edit the same workspace. If features
|
|
274
|
+
need separate review or commits, give each a persistent worktree and integrate
|
|
275
|
+
them separately; `wait --group` warns about shared non-isolated workspaces.
|
|
249
276
|
|
|
250
277
|
## Task design: cluster related work into fewer, richer delegations
|
|
251
278
|
|
|
@@ -28,9 +28,9 @@ delegate droid [MODEL_ALIAS] safe [--model <alias-or-model>] [--reasoning-effort
|
|
|
28
28
|
delegate droid [MODEL_ALIAS] work [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]
|
|
29
29
|
delegate droid [MODEL_ALIAS] call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--prompt-file PATH] [prompt...]
|
|
30
30
|
|
|
31
|
-
delegate codex safe [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [--output-schema FILE] [prompt...]
|
|
32
|
-
delegate codex work [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [--output-schema FILE] [prompt...]
|
|
33
|
-
delegate codex call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--prompt-file PATH] [--output-schema FILE] [prompt...]
|
|
31
|
+
delegate codex safe [--model <alias-or-model>] [--reasoning-effort LEVEL] [--fast|--no-fast] [--progress] [--forbid-commit] [--prompt-file PATH] [--output-schema FILE] [prompt...]
|
|
32
|
+
delegate codex work [--model <alias-or-model>] [--reasoning-effort LEVEL] [--fast|--no-fast] [--progress] [--forbid-commit] [--prompt-file PATH] [--output-schema FILE] [prompt...]
|
|
33
|
+
delegate codex call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--fast|--no-fast] [--prompt-file PATH] [--output-schema FILE] [prompt...]
|
|
34
34
|
|
|
35
35
|
delegate claude safe [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]
|
|
36
36
|
delegate claude work [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]
|
|
@@ -57,6 +57,13 @@ positional prompt input, and Kimi Code prompt mode currently uses `--prompt`,
|
|
|
57
57
|
so those launches still use argv transport; Delegate redacts Cursor and Kimi
|
|
58
58
|
prompt argv in dry-run output and run manifests.
|
|
59
59
|
|
|
60
|
+
Temporary safe isolation also re-roots absolute paths under the source workspace
|
|
61
|
+
when it transports the prompt, so `/source/repo/src/app.py` becomes the matching
|
|
62
|
+
path inside the isolated copy. Paths outside the workspace and prefix lookalikes
|
|
63
|
+
are left unchanged. The safe prompt asks the child to cite workspace-relative
|
|
64
|
+
paths in its report; consumers should not depend on temporary isolation paths.
|
|
65
|
+
Verbatim slash pass-through prompts are not rewritten.
|
|
66
|
+
|
|
60
67
|
For launch and `dry-run` commands, `--json` and `--isolation auto|none|worktree`
|
|
61
68
|
are unambiguous before inline prompt text starts and may appear with launch
|
|
62
69
|
options, such as `delegate codex work --prompt-file task.md --json` or
|
|
@@ -77,6 +84,8 @@ engines report live unsupported).
|
|
|
77
84
|
|
|
78
85
|
`--reasoning-effort LEVEL` is optional and parsed only before prompt text begins. Engines with capability metadata reject unsupported model/effort pairs before launch with `unsupported_reasoning_effort`. It affects only model reasoning depth, cost, or latency; it does not change `safe`/`work`/`call` permissions, sandboxing, approvals, network policy, or edit capability. Cursor effort is model-selection based and requires `cursor.reasoningEffortModels`; an explicit `--model` wins over effort→model routing. Droid emits `--reasoning-effort LEVEL`; Codex emits a `model_reasoning_effort` config override for the resolved model, or for the Codex harness default model when no `codex.defaultModel` is configured and the request was explicit; Claude emits Claude Code `--effort LEVEL`; Grok emits Grok `--effort LEVEL` (`low`, `medium`, `high`, `xhigh`, `max`); OpenCode emits `--variant LEVEL` without validating it against the selected model. Kimi does not support reasoning effort in v1.
|
|
79
86
|
|
|
87
|
+
`--fast` and `--no-fast` are Codex-only, mutually exclusive per-run service-tier overrides. `--fast` emits `service_tier="fast"` plus `features.fast_mode=true` (Codex silently drops a Fast tier when that feature flag is off in the ambient config, so Delegate enables it explicitly); `--no-fast` emits `service_tier="default"` so a globally enabled Fast setting can be turned off for one child. Omitting both emits no override and inherits Codex configuration. Fast is orthogonal to model selection, reasoning effort, and Delegate safety policy. Two upstream caveats: Codex strips the service tier when authenticated with an API key (Fast is a ChatGPT-plan feature), and neither Codex nor the API fails on a tier the model does not offer — Delegate's flag validation is the only fail-closed layer, so an unsupported combination degrades silently to standard routing rather than erroring.
|
|
88
|
+
|
|
80
89
|
`--progress` enables parent progress heartbeats on stderr for tracked foreground
|
|
81
90
|
runs. `--no-progress` disables them even when `progress.enabled` is true in
|
|
82
91
|
config. When neither flag is set, config `progress.enabled` applies (default
|
|
@@ -123,6 +132,11 @@ A few boundaries are worth stating explicitly:
|
|
|
123
132
|
create an orchestration manifest; it only enables selectors such as
|
|
124
133
|
`delegate runs --group NAME`, `delegate wait --group NAME`, and worktree
|
|
125
134
|
management filters. Group names must match `[A-Za-z0-9._-]{1,64}`.
|
|
135
|
+
If grouped feature waves run in the same non-isolated workspace, commit between
|
|
136
|
+
waves so later edits do not become interleaved with earlier work. When features
|
|
137
|
+
need separate review or commits, launch each in a persistent worktree and
|
|
138
|
+
integrate them separately; `wait --group` warns when it sees shared same-tree
|
|
139
|
+
work runs.
|
|
126
140
|
|
|
127
141
|
`--auth-profile NAME` selects a top-level `profiles.definitions` entry and
|
|
128
142
|
injects that profile's flat env map into child processes. It overrides ambient
|
|
@@ -137,13 +151,15 @@ auth/env selection happens.
|
|
|
137
151
|
Usage:
|
|
138
152
|
|
|
139
153
|
```bash
|
|
140
|
-
delegate [--json] [--isolation auto|none|worktree] codex {safe,work
|
|
154
|
+
delegate [--json] [--isolation auto|none|worktree] codex {safe,work} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--fast|--no-fast] [--progress] [--forbid-commit] [--prompt-file PATH] [--output-schema FILE] [prompt...]
|
|
155
|
+
delegate [--json] codex call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--fast|--no-fast] [--prompt-file PATH] [--output-schema FILE] [prompt...]
|
|
141
156
|
```
|
|
142
157
|
|
|
143
158
|
- Safe mode reviews your **current working tree** — uncommitted tracked edits and untracked, non-ignored files are mirrored into an isolated throwaway copy (only gitignored paths are excluded), so you can review local changes without committing first or pasting a diff. Codex safe always uses `--sandbox read-only`. Under `--isolation auto`, Codex safe is the only safe harness that may opt out with `--isolation none`, because Codex still keeps its read-only sandbox active.
|
|
144
159
|
- Prompt text is delivered on stdin to `codex exec`; dry-run argv and tracked run manifests do not contain the prompt.
|
|
145
160
|
- Model selection uses `--model` (alias from `codex.models` or a raw model ID), the run-input JSON `model`, or `codex.defaultModel`.
|
|
146
161
|
- `--reasoning-effort` maps to a Codex `model_reasoning_effort` config override after the model is resolved.
|
|
162
|
+
- `--fast` requests Codex Fast for one run; `--no-fast` explicitly requests Standard; omission inherits Codex configuration. The selected tier is recorded as `requestedFast` when explicit.
|
|
147
163
|
- `--output-schema FILE` is **codex-only**. Every other engine rejects it. `FILE` is a path to a JSON Schema that OpenAI enforces on Codex's final message, for machine-parseable output in fan-outs and JSON run input. Relative paths resolve against the process launch cwd, the same rule as `--prompt-file`. When set, Delegate suppresses the completion-report prompt injection for that run so the schema owns the whole final message. Missing or unreadable files fail fast before launch.
|
|
148
164
|
|
|
149
165
|
Examples:
|
|
@@ -151,6 +167,7 @@ Examples:
|
|
|
151
167
|
```bash
|
|
152
168
|
delegate codex safe "Review this repo for regressions; report file/line/severity."
|
|
153
169
|
delegate codex safe --model gpt-5.5 "Review this repo for regressions; report file/line/severity."
|
|
170
|
+
delegate codex safe --model my-alias --reasoning-effort medium --fast "Explore likely causes."
|
|
154
171
|
delegate codex work "Implement the scoped task; report changed files and tests."
|
|
155
172
|
delegate codex call "Summarize this context in three bullets."
|
|
156
173
|
delegate --json codex safe --output-schema findings.schema.json "Return one record per finding."
|
|
@@ -162,7 +179,8 @@ delegate --isolation worktree codex work "Implement the feature in a persistent
|
|
|
162
179
|
Usage:
|
|
163
180
|
|
|
164
181
|
```bash
|
|
165
|
-
delegate [--json] [--isolation auto|none|worktree] claude {safe,work
|
|
182
|
+
delegate [--json] [--isolation auto|none|worktree] claude {safe,work} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]
|
|
183
|
+
delegate [--json] claude call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--prompt-file PATH] [prompt...]
|
|
166
184
|
```
|
|
167
185
|
|
|
168
186
|
- Safe mode reviews your **current working tree** — uncommitted tracked edits and untracked, non-ignored files are mirrored into an isolated throwaway copy (only gitignored paths are excluded), so you can review local changes without committing first or pasting a diff. Under `--isolation auto`, Claude safe uses `--permission-mode plan`, `--strict-mcp-config`, Read/Grep/Glob, and selected read-only Bash tools such as `git diff`/`git status`.
|
|
@@ -187,7 +205,8 @@ delegate --isolation worktree claude work "Implement the feature in a persistent
|
|
|
187
205
|
Usage:
|
|
188
206
|
|
|
189
207
|
```bash
|
|
190
|
-
delegate [--json] [--isolation auto|none|worktree] grok {safe,work
|
|
208
|
+
delegate [--json] [--isolation auto|none|worktree] grok {safe,work} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]
|
|
209
|
+
delegate [--json] grok call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--prompt-file PATH] [prompt...]
|
|
191
210
|
```
|
|
192
211
|
|
|
193
212
|
- Safe mode reviews your **current working tree** in an isolated throwaway copy plus Grok read-only controls (`--sandbox read-only`, `--permission-mode dontAsk` by default). Delegate does not use Grok `plan` mode for safe review.
|
|
@@ -270,7 +289,8 @@ delegate --isolation worktree opencode work "Implement the feature in a persiste
|
|
|
270
289
|
Usage:
|
|
271
290
|
|
|
272
291
|
```bash
|
|
273
|
-
delegate [--json] [--isolation auto|none|worktree] kimi {safe,work
|
|
292
|
+
delegate [--json] [--isolation auto|none|worktree] kimi {safe,work} [--model <alias-or-model>] [--reasoning-effort LEVEL] [--progress] [--forbid-commit] [--prompt-file PATH] [prompt...]
|
|
293
|
+
delegate [--json] kimi call [--read-only] [--model <alias-or-model>] [--reasoning-effort LEVEL] [--prompt-file PATH] [prompt...]
|
|
274
294
|
```
|
|
275
295
|
|
|
276
296
|
- Safe mode reviews your **current working tree** — uncommitted tracked edits and untracked, non-ignored files are mirrored into an isolated throwaway copy (only gitignored paths are excluded), so you can review local changes without committing first or pasting a diff. Under `--isolation auto`, Kimi safe uses a read-only safety prompt. Delegate intentionally avoids Kimi `--plan` in safe mode. Kimi prompt mode auto-approves tool actions, so the isolation is the effective write boundary; the safety prompt is advisory.
|
|
@@ -304,8 +324,8 @@ delegate [--json] workflow run --resume <wfId> [--budget N]
|
|
|
304
324
|
delegate [--json] workflow status <wfId>
|
|
305
325
|
delegate [--json] workflow events <wfId> [--since SEQ]
|
|
306
326
|
delegate [--json] workflow watch <wfId> [--since SEQ]
|
|
307
|
-
delegate [--json] workflow wait <wfId> [--timeout SEC]
|
|
308
|
-
delegate [--json] workflow result <wfId>
|
|
327
|
+
delegate [--json] workflow wait [<wfId>] [--timeout SEC]
|
|
328
|
+
delegate [--json] workflow result [<wfId>] [--field KEY]
|
|
309
329
|
delegate [--json] workflow approve <wfId>
|
|
310
330
|
delegate [--json] workflow kill <wfId>
|
|
311
331
|
delegate [--json] workflow list
|
|
@@ -315,9 +335,18 @@ delegate [--json] workflow save <script.py> --name NAME
|
|
|
315
335
|
- `check` validates the workflow script, including literal preflight checks for
|
|
316
336
|
unsupported `agent()` combinations.
|
|
317
337
|
- `run` launches a detached supervisor; `--dry-run` renders planned stubs
|
|
318
|
-
without launching child agents or consuming real budget.
|
|
338
|
+
without launching child agents or consuming real budget. Each entry in
|
|
339
|
+
`runTree.calls` includes the resolved `model`, `effort`, `fast`, `isolation`,
|
|
340
|
+
and UTF-8 `promptBytes`; Cursor/Kimi prompts over 102400 bytes add a warning
|
|
341
|
+
before their argv transport limit can fail a real run.
|
|
319
342
|
- `--resume` replays the journal, adopts matching child runs by workflow agent
|
|
320
343
|
key, and continues from missing work.
|
|
344
|
+
- `wait` and `result` accept an explicit workflow ID or, when omitted, resolve
|
|
345
|
+
the latest eligible workflow. JSON output for implicit selection includes the
|
|
346
|
+
selected `wfId` and `resolutionKind: "latest"`.
|
|
347
|
+
- `result --field KEY` extracts a top-level field from an object result. Text
|
|
348
|
+
mode prints strings directly and JSON-encodes other values; JSON mode returns
|
|
349
|
+
a field/value envelope.
|
|
321
350
|
- `approve` releases a paused gate (and resumes). Do not also run
|
|
322
351
|
`run --resume` for the same gate — approve already is that resume. `kill`
|
|
323
352
|
validates the supervisor process group before signaling and always attempts
|
|
@@ -336,6 +365,7 @@ Codes raised as `DelegateError` from workflow commands (`workflows/commands.py`)
|
|
|
336
365
|
| `invalid_workflow_name` | Saved-workflow `--name` is not a simple file stem. |
|
|
337
366
|
| `invalid_workflow_script` | Script failed `check` / load validation. |
|
|
338
367
|
| `missing_workflow` | A verb that needs `<wfId>` was invoked without one. |
|
|
368
|
+
| `missing_workflow_result_field` | `result --field` was invoked without a key. |
|
|
339
369
|
| `missing_workflow_save_args` | `save` needs both `<script.py>` and `--name`. |
|
|
340
370
|
| `missing_workflow_script` | `run`/`check` need `<script.py>` or `--name`. |
|
|
341
371
|
| `unknown_workflow_action` | Unrecognized `workflow` subcommand. |
|
|
@@ -344,6 +374,8 @@ Codes raised as `DelegateError` from workflow commands (`workflows/commands.py`)
|
|
|
344
374
|
| `workflow_not_found` | No workflow directory / status for that `wfId`. |
|
|
345
375
|
| `workflow_not_gated` | `approve` on a workflow that is not paused on a gate. |
|
|
346
376
|
| `workflow_result_missing` | `result` before `result.json` exists. |
|
|
377
|
+
| `workflow_result_field_missing` | The requested top-level result field does not exist. |
|
|
378
|
+
| `workflow_result_not_object` | `--field` was requested for a non-object result. |
|
|
347
379
|
| `workflow_script_not_found` | Resolved script path is missing or not a file. |
|
|
348
380
|
|
|
349
381
|
See [Delegate Workflows](delegate-workflows.md) for the DSL, caps, config, and
|
|
@@ -352,24 +384,26 @@ gate semantics.
|
|
|
352
384
|
### Stateless `call` mode
|
|
353
385
|
|
|
354
386
|
`call` is the one-hop model-call form of Delegate: "work mode minus a repo." It
|
|
355
|
-
gives a child runtime a prompt with no project tree to resolve
|
|
356
|
-
final assistant text,
|
|
357
|
-
|
|
358
|
-
|
|
387
|
+
gives a child runtime a prompt with no project tree to resolve and captures the
|
|
388
|
+
final assistant text, so you can call a model to *do something* (or to *judge
|
|
389
|
+
something*) from anywhere, including a non-git directory. Calls are untracked
|
|
390
|
+
by default; grouped calls are the narrow exception described below.
|
|
359
391
|
|
|
360
392
|
```bash
|
|
361
393
|
delegate codex call "Write a Python script that finds the 500th prime and run it."
|
|
362
394
|
delegate --json grok call --read-only --prompt-file rubric.md
|
|
363
395
|
delegate --json codex call --read-only --output-schema verdict.json --prompt-file rubric.md
|
|
396
|
+
delegate --json claude call --pure --timeout 60 --output-schema verdict.json < rubric.md
|
|
364
397
|
```
|
|
365
398
|
|
|
366
399
|
Call mode uses an empty temporary cwd instead of resolving the current repo, and
|
|
367
|
-
it deletes that cwd after the child exits. It does not
|
|
368
|
-
|
|
369
|
-
|
|
400
|
+
it deletes that cwd after the child exits. It does not create snapshots, inject
|
|
401
|
+
safe/work skill or completion-report framing, emit progress heartbeats, or honor
|
|
402
|
+
persistent worktree/commit policy options. JSON
|
|
370
403
|
output returns fields such as `ok`, `status`, `exitCode`, `engine`, `mode`,
|
|
371
|
-
`model`, `
|
|
372
|
-
|
|
404
|
+
`model`, `pure`, `structuredOutput`, `modelRequested`, `modelResolved`, `usage`,
|
|
405
|
+
`text`, `textChars`, `textTruncated`, `stdoutBytes`, `stderrBytes`, reasoning
|
|
406
|
+
metadata, and `warnings`. Failed calls include a redacted `stderrTail`.
|
|
373
407
|
`textTruncated` is `true` when the returned
|
|
374
408
|
`text` was bounded (large outputs keep the head and tail); `textChars` is the
|
|
375
409
|
full untruncated character count.
|
|
@@ -388,11 +422,38 @@ changed files…" on a repo-flavored prompt. Pair it with `--output-schema` (Cod
|
|
|
388
422
|
for structured verdicts. Use `--read-only` for any LLM-as-judge, grader, or
|
|
389
423
|
oracle use where the text is the product and the model must not act.
|
|
390
424
|
|
|
391
|
-
|
|
392
|
-
|
|
425
|
+
**`--pure` is the hostile-content completion boundary.** It is supported by
|
|
426
|
+
Claude only; other engines fail before launch with `unsupported_pure_call`. Pure
|
|
427
|
+
mode sends the prompt verbatim, drops ambient
|
|
428
|
+
environment variables outside the documented allowlist, and cannot be combined
|
|
429
|
+
with `--read-only`. Claude uses `--safe-mode`, disables every tool, ignores MCP
|
|
430
|
+
and ambient customization, disables session persistence, and receives the prompt
|
|
431
|
+
only on stdin. Use `--output-schema FILE` with Claude (schema contents inline)
|
|
432
|
+
or with ordinary Codex call mode (schema path).
|
|
433
|
+
|
|
434
|
+
`--timeout SECONDS` is a positive integer available on every call-mode engine.
|
|
435
|
+
On expiry Delegate terminates the whole child process group and returns
|
|
436
|
+
`call_timeout` with exit code 1.
|
|
437
|
+
|
|
438
|
+
`--read-only`, `--pure`, and `--timeout` apply only to `call`; passing them with
|
|
439
|
+
`safe`/`work` is rejected.
|
|
440
|
+
Because the child call is stateless, `--isolation`, `--pass-through`,
|
|
393
441
|
`--progress`, `--forbid-commit`, and markdown completion reports are rejected.
|
|
394
|
-
|
|
395
|
-
|
|
442
|
+
An ordinary call also rejects `--cwd`.
|
|
443
|
+
|
|
444
|
+
**Grouped calls preserve workflow tracking without exposing the workspace to the
|
|
445
|
+
child.** `--group NAME` registers the call in the invocation workspace so
|
|
446
|
+
workflow kill/adopt and group selectors can find it. In that one combination,
|
|
447
|
+
`--cwd PATH` may select the registry/config workspace:
|
|
448
|
+
|
|
449
|
+
```bash
|
|
450
|
+
delegate --cwd /path/to/project --group wf_0123abcdef45 codex call "Summarize this input."
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
The child still executes in an empty temporary cwd; `--cwd` does not give it the
|
|
454
|
+
project tree. Dry-run accepts the same combination for faithful planning but
|
|
455
|
+
creates no run entry. Use `safe` or `work` when the child should see the project
|
|
456
|
+
tree.
|
|
396
457
|
|
|
397
458
|
### Dry-run
|
|
398
459
|
|
|
@@ -513,6 +574,7 @@ Supported input keys:
|
|
|
513
574
|
"cwd": "/path/to/workspace",
|
|
514
575
|
"isolation": "worktree",
|
|
515
576
|
"reasoningEffort": "high",
|
|
577
|
+
"fast": false,
|
|
516
578
|
"progress": true,
|
|
517
579
|
"forbidCommit": true,
|
|
518
580
|
"includeDirty": true,
|
|
@@ -527,10 +589,11 @@ Supported input keys:
|
|
|
527
589
|
- `cwd`: optional workspace path. Git directories resolve to the repo root. Omit it for `mode: "call"`, which always uses an empty temporary cwd.
|
|
528
590
|
- `isolation`: optional `auto`, `none`, or `worktree`. `null` is invalid. `mode: "call"` rejects isolation. For Cursor, Claude, Grok, Devin, OpenCode, Droid, and Kimi safe mode, `none` is normalized to `auto` with a warning.
|
|
529
591
|
- `reasoningEffort`: optional non-empty effort string. It overrides provider `defaultReasoningEffort` for that JSON run.
|
|
592
|
+
- `fast`: optional Codex-only boolean or `null`. `true` requests Fast, `false` explicitly requests Standard, and `null`/omission inherits Codex configuration.
|
|
530
593
|
- `progress`: optional boolean. `true` enables parent progress heartbeats on stderr; `false` disables them even when `progress.enabled` is true in config. When omitted, config `progress.enabled` applies (default `false`). `mode: "call"` rejects progress.
|
|
531
594
|
- `forbidCommit`: optional boolean. `true` requires `mode: "work"` with persistent worktree isolation and fails the run if the child creates commits. `mode: "call"` rejects commit policy.
|
|
532
595
|
- `includeDirty`: optional boolean. `true` requires `mode: "work"` with persistent worktree isolation and syncs tracked edits plus untracked non-ignored files into the new worktree before launch.
|
|
533
|
-
- `outputSchema`: optional path to a JSON Schema for
|
|
596
|
+
- `outputSchema`: optional path to a JSON Schema for the final message. Supported for Codex and Claude call mode (same semantics as `--output-schema`). Other engines fail with `unsupported_output_schema`.
|
|
534
597
|
- `prompt`: required task prompt.
|
|
535
598
|
|
|
536
599
|
`profile` is not accepted in run input JSON. Configure the Codex CLI config
|
|
@@ -728,7 +791,8 @@ signals the recorded process group with SIGTERM, waits a 5s grace period, then
|
|
|
728
791
|
uses SIGKILL if needed. It never signals pid/pgid `<= 1`. Legacy runs without a
|
|
729
792
|
recorded pgid fall back to the recorded pid with a warning. Cancel marks the run
|
|
730
793
|
`cancelled` with `failureReason: cancelled_by_user` and records current captured
|
|
731
|
-
stdout/stderr byte counts. `call` mode is untracked
|
|
794
|
+
stdout/stderr byte counts. Ungrouped `call` mode is untracked; grouped calls are
|
|
795
|
+
registered and can be selected for cancellation.
|
|
732
796
|
|
|
733
797
|
Before sending any signal, cancel stamps a `cancelRequested: true` marker (with
|
|
734
798
|
a `cancelRequestedAt` timestamp) on the run state under the registry lock, so
|
|
@@ -138,6 +138,11 @@ layers. This is read-only observability; inspecting it does not modify
|
|
|
138
138
|
|
|
139
139
|
Reasoning-effort settings are optional. A per-run `--reasoning-effort LEVEL` or JSON `reasoningEffort` overrides provider defaults. If no effort is requested or defaulted, Delegate emits no reasoning-effort argv and preserves current runtime behavior.
|
|
140
140
|
|
|
141
|
+
Codex Fast is intentionally not a Delegate config default. Use per-run
|
|
142
|
+
`--fast`, `--no-fast`, or JSON `fast`; omission inherits the active Codex CLI
|
|
143
|
+
configuration. This keeps speed selection independent from model aliases and
|
|
144
|
+
reasoning defaults.
|
|
145
|
+
|
|
141
146
|
## Sections
|
|
142
147
|
|
|
143
148
|
### `tracking`
|
|
@@ -100,6 +100,35 @@ you need registry inspection.
|
|
|
100
100
|
OpenCode `call --read-only` uses the same protected environment settings and
|
|
101
101
|
`--pure` plugin restriction as OpenCode safe mode.
|
|
102
102
|
|
|
103
|
+
`call --pure` is a separate, stronger completion boundary. It is currently
|
|
104
|
+
supported on **Claude only**. Delegate sends the prompt verbatim on stdin, starts
|
|
105
|
+
the child in an empty temporary cwd, and builds the child environment from only
|
|
106
|
+
`PATH`, `HOME`, `USER`, `LOGNAME`, `SHELL`, `TMPDIR`, `LANG`, `LC_ALL`, `LC_CTYPE`,
|
|
107
|
+
and `TERM`, then applies trusted Delegate profile overrides. Claude additionally
|
|
108
|
+
uses `--safe-mode --tools "" --strict-mcp-config --no-session-persistence`, and the
|
|
109
|
+
result must carry an empty `permission_denials` list — a missing, null, or
|
|
110
|
+
non-empty value fails the call closed (`pure_boundary_unverified` /
|
|
111
|
+
`pure_boundary_violation`) rather than reporting success.
|
|
112
|
+
|
|
113
|
+
Codex and OpenCode are **not** pure-eligible; `<engine> call --pure` is rejected
|
|
114
|
+
before launch (`unsupported_pure_call`). They were disabled after review:
|
|
115
|
+
|
|
116
|
+
- **Codex** would need external OS confinement (a macOS Seatbelt profile) because
|
|
117
|
+
it stays a tool-using agent. The prototype handed the child an ephemeral
|
|
118
|
+
`CODEX_HOME` holding the resolved `auth.json`, but a single inherited Seatbelt
|
|
119
|
+
profile cannot distinguish a read by the Codex parent from a read by a
|
|
120
|
+
model-driven subprocess, so the credential was reachable inside the boundary it
|
|
121
|
+
was meant to protect. A credential transport the parent can use but model tools
|
|
122
|
+
cannot read is required before Codex pure is re-enabled. `sandbox-exec` is also
|
|
123
|
+
deprecated on macOS and would never cover other platforms.
|
|
124
|
+
- **OpenCode**'s native `--pure` only disables external plugins; it offers no
|
|
125
|
+
session non-persistence, no schema output, and no denial tripwire, so it does
|
|
126
|
+
not meet the hostile-input contract.
|
|
127
|
+
|
|
128
|
+
Fail-closed eligibility is intentional: an engine without a verified boundary
|
|
129
|
+
rejects `--pure` rather than presenting a weaker one under the same name. The
|
|
130
|
+
supported pure matrix may contain only Claude for some time.
|
|
131
|
+
|
|
103
132
|
## Reasoning-effort boundary
|
|
104
133
|
|
|
105
134
|
`--reasoning-effort LEVEL` and JSON `reasoningEffort` request model thinking depth only. They do not change:
|
|
@@ -118,6 +147,14 @@ combinations before launch. OpenCode is the exception: Delegate passes the value
|
|
|
118
147
|
through as `--variant`, and OpenCode may silently ignore an unknown variant.
|
|
119
148
|
Treat higher effort as a possible latency/cost change, not as a safety control.
|
|
120
149
|
|
|
150
|
+
## Codex Fast boundary
|
|
151
|
+
|
|
152
|
+
`--fast`, `--no-fast`, and JSON `fast` select a Codex service tier for one run.
|
|
153
|
+
They do not change the selected model, reasoning effort, sandbox, approvals,
|
|
154
|
+
isolation, network policy, credentials, or edit capability. Fast may consume
|
|
155
|
+
plan usage at a different rate; treat it as a latency/usage choice, never a
|
|
156
|
+
security control.
|
|
157
|
+
|
|
121
158
|
## Isolation boundaries
|
|
122
159
|
|
|
123
160
|
### Temporary safe isolation
|
|
@@ -12,6 +12,10 @@ Use persistent worktree isolation when:
|
|
|
12
12
|
|
|
13
13
|
Use the real workspace instead when the task depends on uncommitted local files that you do not want to commit or mirror into a worktree. If you do want a persistent worktree that starts from your current dirty checkout, use `--include-dirty`.
|
|
14
14
|
|
|
15
|
+
For grouped feature waves, commit between waves when they share the real
|
|
16
|
+
workspace. If each feature needs its own review or commit, use one persistent
|
|
17
|
+
worktree per feature and integrate those worktrees separately.
|
|
18
|
+
|
|
15
19
|
## Launch
|
|
16
20
|
|
|
17
21
|
```bash
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "delegate-agent-cli"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.14.0"
|
|
8
8
|
description = "A tiny CLI for delegating bounded agent tasks to Cursor, Droid, OpenAI Codex, Claude Code, Grok Build, or Kimi Code runtimes."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|