delegate-agent-cli 0.18.0__tar.gz → 0.21.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.18.0 → delegate_agent_cli-0.21.0}/CHANGELOG.md +269 -1
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/PKG-INFO +36 -12
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/README.md +35 -11
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/bin/delegate-profile-shim +92 -1
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/agent-setup.md +35 -9
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/cli-reference.md +192 -17
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/configuration.md +70 -16
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/delegate-workflows.md +5 -1
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/security-model.md +49 -8
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/troubleshooting.md +91 -21
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/worktrees.md +22 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/pyproject.toml +1 -1
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/__init__.py +1 -1
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/bundled_models.py +2 -1
- delegate_agent_cli-0.21.0/src/delegate_agent/capability_commands.py +298 -0
- delegate_agent_cli-0.21.0/src/delegate_agent/child_failures.py +93 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/cli.py +47 -1
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/cli_parser.py +94 -16
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/command_help.py +83 -16
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/config.py +27 -41
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/config_commands.py +2 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/describe_payload.py +123 -46
- delegate_agent_cli-0.21.0/src/delegate_agent/harness_discovery.py +1679 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/isolation.py +128 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/model_discovery.py +121 -230
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/private_io.py +92 -5
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/profile_guard.py +6 -3
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/profiles.py +12 -29
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/reasoning.py +566 -174
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/redaction.py +94 -1
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/rendering.py +41 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/request_build.py +743 -181
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/request_models.py +10 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/run_metadata.py +27 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/run_status.py +8 -4
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/runner.py +441 -64
- delegate_agent_cli-0.21.0/src/delegate_agent/setup_commands.py +514 -0
- delegate_agent_cli-0.21.0/src/delegate_agent/structured_output.py +177 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/worktree_commands.py +22 -4
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/worktree_execution.py +12 -15
- delegate_agent_cli-0.21.0/src/delegate_agent/worktree_gc.py +1129 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/worktree_mgmt.py +8 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent_cli.egg-info/PKG-INFO +36 -12
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent_cli.egg-info/SOURCES.txt +9 -0
- delegate_agent_cli-0.21.0/tests/test_capability_commands.py +1027 -0
- delegate_agent_cli-0.21.0/tests/test_child_failures.py +73 -0
- delegate_agent_cli-0.21.0/tests/test_codex_thread_resilience.py +410 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_command_help.py +2 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_config_commands.py +69 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_delegate_help_cli.py +35 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_delegate_parser.py +120 -5
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_delegate_validation.py +96 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_engine_argv.py +1132 -113
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_execution_argv_and_prompt.py +3 -1
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_execution_worktree_run.py +21 -2
- delegate_agent_cli-0.21.0/tests/test_harness_discovery.py +1609 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_kimi_commands.py +3 -3
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_model_discovery.py +354 -33
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_model_selection_wave1b.py +183 -20
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_pure_call.py +24 -1
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_reasoning_capabilities.py +390 -9
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_runner_capture.py +28 -6
- delegate_agent_cli-0.21.0/tests/test_setup_commands.py +786 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_snapshot_redaction.py +14 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_snapshot_run_output.py +11 -0
- delegate_agent_cli-0.21.0/tests/test_structured_output.py +212 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_utility_modules.py +181 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_wait_cancel_commands.py +1 -1
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_workflow_commands.py +19 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_worktree_prune_gc.py +1032 -1
- delegate_agent_cli-0.18.0/src/delegate_agent/capability_commands.py +0 -99
- delegate_agent_cli-0.18.0/src/delegate_agent/worktree_gc.py +0 -577
- delegate_agent_cli-0.18.0/tests/test_capability_commands.py +0 -370
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/CONTRIBUTING.md +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/LICENSE +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/MANIFEST.in +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/SECURITY.md +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/bin/delegate.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/config.example.json +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/assets/delegate-agent-header.png +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/development.md +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/live-runtime.md +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/docs/publishing-checklist.md +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/examples/task.claude.json +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/examples/task.codex.json +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/examples/task.cursor.json +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/examples/task.droid.json +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/examples/task.grok.json +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/examples/task.judge.json +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/examples/task.kimi.json +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/setup.cfg +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/archived_logs.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/argv_builders.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/argv_utils.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/command_errors.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/constants.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/errors.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/git_utils.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/harness_events.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/inspection_commands.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/json_types.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/log_output.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/profile_commands.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/prompt_instructions.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/prompt_transport.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/retention.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/run_output_commands.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/run_registry.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/safe_workspace.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/seatbelt.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/snapshot_view.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/wait_cancel_commands.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/workflows/__init__.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/workflows/commands.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/workflows/registry.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/workflows/runtime.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/workflows/schema.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/workflows/script.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/worktree_records.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/worktree_remove.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/worktree_summary.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent/wsl.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent_cli.egg-info/dependency_links.txt +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent_cli.egg-info/entry_points.txt +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent_cli.egg-info/requires.txt +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/src/delegate_agent_cli.egg-info/top_level.txt +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_codex_pure_sandbox.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_delegate_isolation.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_end_to_end_tracking.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_execution_dry_run.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_execution_worktree_failure_cleanup.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_execution_worktree_preflight.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_harness_events.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_inspection_commands.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_model_selection_wave1a.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_omp_read_only_behavior.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_packaging.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_profiles.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_retention.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_run_registry.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_safe_workspace_isolation.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_slash_passthrough.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_snapshot_rendering.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_snapshot_view.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_tracked_timeout.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_wave4_launch_features.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_worktree_list_show.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_worktree_remove.py +0 -0
- {delegate_agent_cli-0.18.0 → delegate_agent_cli-0.21.0}/tests/test_wsl_guardrails.py +0 -0
|
@@ -5,6 +5,272 @@ 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.21.0] - 2026-07-26
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Added `delegate worktree gc --all`, which scans the machine-wide worktree
|
|
13
|
+
pool for worktrees whose source repository no longer exists. Such worktrees
|
|
14
|
+
were previously unreachable by any `gc` invocation, because reaping is driven
|
|
15
|
+
by the run registry inside each source repository and that registry dies with
|
|
16
|
+
the repository. The scan adds no catalog or persistent state: it reads each
|
|
17
|
+
worktree's Git backlink directly, and treats a backlink whose target is gone
|
|
18
|
+
as the sole orphan signal. The scan removes nothing at all, at any depth: a
|
|
19
|
+
missing source repository makes a worktree's uncommitted state impossible to
|
|
20
|
+
inspect, so orphans and empty pool directories alike are reported for
|
|
21
|
+
deliberate manual cleanup. Because that output invites manual deletion, every
|
|
22
|
+
uncertainty resolves away from an orphan verdict: a pointer file that cannot
|
|
23
|
+
be read, a path comparison the filesystem cannot answer, an entry too recently
|
|
24
|
+
modified to have settled, and a directory whose name does not match the pool's
|
|
25
|
+
own fingerprint contract are all reported as warnings rather than orphans.
|
|
26
|
+
That last rule is what keeps a scan of an arbitrary root from labelling
|
|
27
|
+
somebody else's directories. `--pool PATH` scans a different pool root, which
|
|
28
|
+
reaches pools stranded by an earlier `worktrees.dataHome`.
|
|
29
|
+
- `capabilities refresh` and `setup` now name each harness on stderr as it is
|
|
30
|
+
probed, so a harness that hangs is identifiable rather than anonymous
|
|
31
|
+
silence. Progress output is suppressed under `--json`.
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
|
|
35
|
+
- A launch now fails instead of proceeding when the configured binary for a
|
|
36
|
+
harness identifies itself as a *different* known harness. Delegate re-probes
|
|
37
|
+
`--version` when a cached capability record has refused a run, and during
|
|
38
|
+
`capabilities refresh` and `setup` (see Fixed); when that banner positively
|
|
39
|
+
names another harness — a Codex path replaced in place by Grok, say — the run
|
|
40
|
+
stops with `harness_identity_mismatch` and exit code 2, naming the configured
|
|
41
|
+
harness, the harness that answered, and the selector path.
|
|
42
|
+
Previously the launch continued against that same binary with the same Codex
|
|
43
|
+
argv, sandbox flags, and approval policy, and only the cached capability
|
|
44
|
+
metadata was discarded. This fires solely on a banner that NAMES another known
|
|
45
|
+
harness, never on uncertainty: a probe that errors, times out, exceeds its
|
|
46
|
+
output bound, or prints an unbranded banner still fails open and launches on
|
|
47
|
+
the cached record. An unbranded shape — a bare date-and-hash build ID is the
|
|
48
|
+
clearest case — is deliberately not identification, because wrapper prefixes
|
|
49
|
+
are a supported configuration and refusing a legitimate launch costs more than
|
|
50
|
+
carrying a stale record until the next refresh. The selector is scrubbed of
|
|
51
|
+
credentials before it reaches the message or the diagnostics, since a wrapper
|
|
52
|
+
prefix can carry a token inline or after a flag. Dry runs do not probe and are
|
|
53
|
+
unaffected. The refusal also names the discovery cache file for the active
|
|
54
|
+
auth profile, in its `cachePath` diagnostic and in a next action, because
|
|
55
|
+
`capabilities refresh` cannot clear this state: a refresh keeps the
|
|
56
|
+
last-known-good record whenever a probe fails, which is correct for a flaky
|
|
57
|
+
probe and wrong here, where the record itself is the problem. Without the
|
|
58
|
+
path, a wrong identification would refuse every launch with no documented way
|
|
59
|
+
out short of editing configuration.
|
|
60
|
+
- A run whose cached capability record is discarded for version drift now says
|
|
61
|
+
so, naming `delegate capabilities refresh <engine>`. The record is dropped for
|
|
62
|
+
that run only and the superseded copy stays on disk, so every later launch
|
|
63
|
+
repeats the drop and loses the same discovery-sourced models and reasoning
|
|
64
|
+
levels — previously with no indication that a stale cache was the cause.
|
|
65
|
+
Selector drift stays silent, since `capabilities` already reports it under
|
|
66
|
+
`driftedHarnesses`.
|
|
67
|
+
|
|
68
|
+
### Fixed
|
|
69
|
+
|
|
70
|
+
- Discovery now detects a harness that was upgraded in place. Cached capability
|
|
71
|
+
records were invalidated only by comparing the configured selector, so an
|
|
72
|
+
upgrade behind an unchanged selector left stale capabilities cached
|
|
73
|
+
indefinitely and a newly supported reasoning level was rejected until a manual
|
|
74
|
+
`capabilities refresh`. Delegate now re-probes `--version` for the single
|
|
75
|
+
harness it is about to use and compares it against the version already stored
|
|
76
|
+
in the record, then rebuilds the run against the refreshed picture. The probe
|
|
77
|
+
runs only once the cached record has already cost the run something, never on
|
|
78
|
+
the ordinary path, which therefore spawns no extra process at all — and that
|
|
79
|
+
matters because the probe costs 26-668ms, worst on the Node and Bun harnesses
|
|
80
|
+
that are already slow to start. Two things trigger it: an explicit
|
|
81
|
+
`--reasoning-effort` the record refuses, and a `defaultReasoningEffort` the
|
|
82
|
+
record silently drops. The second is the one most likely to go unnoticed,
|
|
83
|
+
since a configured default degrades to a warning rather than failing the
|
|
84
|
+
launch, and it is set once and then never typed again. A probe that cannot
|
|
85
|
+
repair the default leaves the run exactly as it was: a launch that succeeded
|
|
86
|
+
is never turned into a failure. The check fails open — a probe that errors,
|
|
87
|
+
times out, or prints a banner nothing recognizes keeps the cached record, so a
|
|
88
|
+
failing probe can never prevent a launch. A banner that positively identifies
|
|
89
|
+
a *different* known harness is the exception, and it aborts the launch rather
|
|
90
|
+
than merely invalidating the record — see Changed. Each banner is matched
|
|
91
|
+
against the expected harness's own pattern before anyone else's, so a banner
|
|
92
|
+
mentioning more than one tool is read as the harness that was asked for
|
|
93
|
+
instead of whichever pattern happens to be declared earlier. Banners are read
|
|
94
|
+
with escape sequences stripped, so a colorized version line no longer freezes
|
|
95
|
+
a record permanently. A cached selector whose binary no longer exists is also
|
|
96
|
+
treated as drift.
|
|
97
|
+
- Not covered, deliberately: a harness that *removes* a capability leaves its
|
|
98
|
+
cached record listing more than the harness now supports, which produces no
|
|
99
|
+
refusal and so no probe. The child rejects the effort it was handed, which is
|
|
100
|
+
loud; the one quiet case is Cursor's route table aiming a run at a superseded
|
|
101
|
+
model id. Catching either would cost a probe on every launch, which is the
|
|
102
|
+
trade this path exists to refuse. `capabilities refresh` remains the cure.
|
|
103
|
+
- A dry run never probes the harness for its version. Dry run documents that it
|
|
104
|
+
neither launches a child runtime nor requires the real child binary, and the
|
|
105
|
+
drift probe is a child runtime; it now runs only on a real launch, leaving dry
|
|
106
|
+
run with the two filesystem-local checks.
|
|
107
|
+
- A discovery cache carrying a newer schema than the running build is no longer
|
|
108
|
+
discarded and overwritten. It is left intact while the run degrades to
|
|
109
|
+
probing without persisting, so an older Delegate can no longer destroy a newer
|
|
110
|
+
cache. Losing that race mid-probe degrades the same way rather than failing the
|
|
111
|
+
command: `capabilities refresh` and `setup` both report `cacheWriteSkipped`,
|
|
112
|
+
`setup` additionally leaving `cacheState` at `unchanged`, and each exits
|
|
113
|
+
successfully, since only persistence was lost. The
|
|
114
|
+
schema is re-read immediately before the atomic replacement rather than before
|
|
115
|
+
the snapshot is serialized, which narrows the window in which a newer cache
|
|
116
|
+
could be published and then overwritten down to the `os.replace` call itself.
|
|
117
|
+
POSIX offers no compare-and-swap for a rename, so that last window remains.
|
|
118
|
+
- The test suite no longer writes into the developer's real
|
|
119
|
+
`~/.delegate/worktrees`. Tests exercising persistent-worktree runs created
|
|
120
|
+
real pooled worktrees over temporary source repositories and orphaned them
|
|
121
|
+
permanently, because `worktrees_data_home` falls through to the user's home
|
|
122
|
+
directory with no seam a test could redirect. `HOME` is now redirected at test
|
|
123
|
+
collection time, which reaches every such resolver at once.
|
|
124
|
+
|
|
125
|
+
## [0.20.0] - 2026-07-25
|
|
126
|
+
|
|
127
|
+
### Added
|
|
128
|
+
|
|
129
|
+
- Added typed child-failure reporting for usage/quota limits (including reset
|
|
130
|
+
details when present), expired or rejected auth tokens, and Codex thread/state
|
|
131
|
+
lookup loss. Run state, snapshots, listings, completion envelopes, and
|
|
132
|
+
synthesized reports now carry the specific error and message. The existing
|
|
133
|
+
generic public error remains `child_failed`; `usage_limit`, `auth_failed`, and
|
|
134
|
+
`codex_thread_lost` are additive typed codes. Classification reads only stderr
|
|
135
|
+
and normalized harness error/terminal events, never assistant/model output.
|
|
136
|
+
- Added `delegate ps` as the first-class active-run view, equivalent to
|
|
137
|
+
`delegate runs --active`.
|
|
138
|
+
- Added `delegate setup` for first-run harness discovery. It fingerprints all
|
|
139
|
+
supported installed harnesses, records available model/reasoning metadata in
|
|
140
|
+
a profile-scoped user cache, creates a minimal selector-only config when no
|
|
141
|
+
config exists, and reports discovery readiness separately from launchability.
|
|
142
|
+
- Cached `models`/`capabilities` views now project profile discovery with source
|
|
143
|
+
and evidence metadata. `models <engine> --live` provides a non-persistent
|
|
144
|
+
one-off probe; `capabilities refresh` persists a full refresh for the selected
|
|
145
|
+
profile, and `capabilities refresh <engine> [...]` re-probes only the named
|
|
146
|
+
harnesses while the rest keep their last-known-good records.
|
|
147
|
+
- Runtime model and reasoning metadata now distinguish the requested model,
|
|
148
|
+
argv-resolved model, capability-validation model, requested effort, resolved
|
|
149
|
+
effort, source, evidence strength, and transport.
|
|
150
|
+
|
|
151
|
+
### Changed
|
|
152
|
+
|
|
153
|
+
- Codex output schemas are now linted before launch. Delegate recursively
|
|
154
|
+
supplies missing `additionalProperties: false` on object schemas with a loud
|
|
155
|
+
warning, rejects partial `required` lists precisely, and passes a normalized
|
|
156
|
+
temporary copy without modifying the source schema. Object-bearing `allOf`,
|
|
157
|
+
`patternProperties`, and external or unresolvable `$ref` values fail closed
|
|
158
|
+
rather than being rewritten unsafely. Workflow Codex stages and direct
|
|
159
|
+
`--output-schema`/`outputSchema` launches share the same preflight. The
|
|
160
|
+
normalized copy preserves the source schema's property order, so
|
|
161
|
+
think-before-answer schemas keep their intended generation order.
|
|
162
|
+
- On retry-safe paths, Codex thread/state lookup failures now retry once and,
|
|
163
|
+
only if the same typed failure repeats, retry through an ephemeral
|
|
164
|
+
`--ignore-user-config` launch. Retry-safe paths are read-only calls and
|
|
165
|
+
pre-tool attempts whose workspace remains unchanged; work mode also requires
|
|
166
|
+
a clean captured baseline. Envelopes and events record fallback engagement.
|
|
167
|
+
- `--prompt-file /dev/stdin` and equivalent stdin descriptors now consume the
|
|
168
|
+
piped prompt once instead of conflicting with stdin as a second source.
|
|
169
|
+
- Model and reasoning resolution now prefers explicit CLI/config choices and
|
|
170
|
+
exact discovered evidence before legacy workspace or bundled fallbacks.
|
|
171
|
+
Exact negative menus fail closed; partial harness evidence and Cursor inferred
|
|
172
|
+
routes remain visibly labeled rather than being promoted to model-exact facts.
|
|
173
|
+
- Discovery refresh is last-known-good per harness. Successful records update
|
|
174
|
+
independently, failed probes retain the prior record and report staleness,
|
|
175
|
+
and selector drift invalidates only the affected harness without probing on
|
|
176
|
+
an ordinary launch.
|
|
177
|
+
- `capabilities refresh` now writes the selected profile's private discovery
|
|
178
|
+
cache. The old workspace reasoning cache remains a lower-precedence read-only
|
|
179
|
+
compatibility source. The cached `capabilities` read reports the discovery
|
|
180
|
+
cache location in `cachePath`; the previous workspace path, when present, is
|
|
181
|
+
reported under `legacyWorkspaceCachePath`.
|
|
182
|
+
- `reasoning.capabilities` config entries are now accepted for `grok` in
|
|
183
|
+
addition to `codex` and `droid`.
|
|
184
|
+
- `--auth-profile` is now accepted on cached `capabilities` reads (previously
|
|
185
|
+
rejected as an invalid option combination) and on `models` and `setup`.
|
|
186
|
+
- Cursor reasoning-effort routing now defers to a pinned selector when discovery
|
|
187
|
+
has no same-family route for it: the run proceeds on the pinned model and
|
|
188
|
+
records a bypass warning. When discovery does carry exact same-family routes,
|
|
189
|
+
the requested effort still routes to the matching selector, and a family that
|
|
190
|
+
omits the requested effort still fails closed.
|
|
191
|
+
- Grok reasoning-effort support is once again governed by the documented CLI
|
|
192
|
+
enum (low, medium, high, xhigh, max); a bundled `grok-4.5` declaration that
|
|
193
|
+
narrowed it to low/medium/high was removed, since `grok --help` enumerates no
|
|
194
|
+
per-model efforts. Config, discovery-exact, and cached grok declarations
|
|
195
|
+
still take precedence.
|
|
196
|
+
- Embedded Devin and Kimi `defaultModel` values are now `null`, deferring model
|
|
197
|
+
selection to each harness. The editable `config init` example may still pin
|
|
198
|
+
an explicit default.
|
|
199
|
+
- Claude and Grok `defaultReasoningEffort` config values are now only
|
|
200
|
+
format-checked at load time instead of validated against the static enum; an
|
|
201
|
+
unsupported configured default degrades to a launch-time warning so that
|
|
202
|
+
discovery, not a hardcoded table, decides which levels are accepted.
|
|
203
|
+
|
|
204
|
+
### Security
|
|
205
|
+
|
|
206
|
+
- Discovery probes use fingerprinted allowlisted selectors, fixed argv with no
|
|
207
|
+
shell, closed stdin, neutral temporary working directories, bounded output,
|
|
208
|
+
timeouts, normalized cache schemas, atomic owner-only writes, and scrubbed
|
|
209
|
+
model/warning projections. Config and cache source paths remain intentionally
|
|
210
|
+
visible diagnostics. Automatic Devin discovery remains prompt-free; only the
|
|
211
|
+
explicitly requested `models devin --live` path uses its bounded prompt-like
|
|
212
|
+
invalid-model probe.
|
|
213
|
+
- Setup never overwrites an existing config and refuses unsafe selectors,
|
|
214
|
+
final-component symlinks, and concurrent config races rather than mixing
|
|
215
|
+
discovery results across config states.
|
|
216
|
+
|
|
217
|
+
### Fixed
|
|
218
|
+
|
|
219
|
+
- Credentials appearing in a child harness quota or reset message are now
|
|
220
|
+
redacted before they reach `state.json`, `snapshot.json`, the completion
|
|
221
|
+
report, or the run envelope; Codex reports quota walls as stdout events,
|
|
222
|
+
which bypassed the stderr-tail redaction. The in-progress activity label is
|
|
223
|
+
likewise redacted when persisted, matching the progress heartbeat.
|
|
224
|
+
- A Codex output schema that omits `required` entirely is now repaired to list
|
|
225
|
+
every property (in declaration order) instead of being rejected, matching how
|
|
226
|
+
a missing `additionalProperties` is handled. A partial `required` is still an
|
|
227
|
+
error.
|
|
228
|
+
- The `primary` attempt banner is written once in the run's stderr log even
|
|
229
|
+
when several retry paths run in sequence.
|
|
230
|
+
- `delegate ps` now reports argument errors in its own terms — unknown options,
|
|
231
|
+
`--limit`, `--harness`, and `--group` failures name `ps` instead of the
|
|
232
|
+
`runs` command it delegates to, and `ps --recent` gets the same tailored
|
|
233
|
+
redirect as `--running` and `--stale`.
|
|
234
|
+
- `delegate capabilities refresh` exits 3 (missing binary) when no supported
|
|
235
|
+
harness is installed — including when an engine subset such as
|
|
236
|
+
`capabilities refresh codex` names only uninstalled harnesses — matching
|
|
237
|
+
`delegate setup` on identical machine state instead of returning the generic
|
|
238
|
+
usage code 2.
|
|
239
|
+
- `delegate capabilities` no longer advertises harnesses whose configured
|
|
240
|
+
selector has drifted from the cached record, on both the cached read and
|
|
241
|
+
after a refresh — a subset refresh returns the full snapshot, so engines it
|
|
242
|
+
never probed could otherwise surface stale catalogs the launch path would
|
|
243
|
+
refuse. Excluded harnesses are named in a new `driftedHarnesses` payload
|
|
244
|
+
field and in the text output.
|
|
245
|
+
- Pi catalog rows whose column count does not match the header are skipped
|
|
246
|
+
instead of being read by shifted column position, which could cache a
|
|
247
|
+
thinking-capable model as having no reasoning support (unrecoverable, since
|
|
248
|
+
Pi has no config override) or hand a non-thinking model the full effort enum.
|
|
249
|
+
- A configured harness binary or argv prefix that no longer resolves while the
|
|
250
|
+
CLI is still on PATH is now reported as a stale config setting rather than an
|
|
251
|
+
uninstalled harness, and `delegate setup` names the config key and file to
|
|
252
|
+
fix instead of telling you to install a CLI you already have.
|
|
253
|
+
- An unreadable `~/.factory/settings.json` (permissions or I/O error) is
|
|
254
|
+
reported as a read failure instead of being misreported as invalid JSON.
|
|
255
|
+
- Two Cursor selectors that normalize to the same route family and effort now
|
|
256
|
+
drop just the ambiguous routes with a warning, instead of turning the entire
|
|
257
|
+
Cursor discovery record into an error record.
|
|
258
|
+
- OpenCode catalog parsing resumes past a malformed entry's whole object, so a
|
|
259
|
+
`provider/model`-shaped line nested inside the rejected body can no longer be
|
|
260
|
+
re-read as a real selector.
|
|
261
|
+
- `capabilities refresh` now hints "global options before the subcommand" for a
|
|
262
|
+
misplaced global option instead of mislabeling it `invalid_engine`, and a
|
|
263
|
+
subset refresh whose requested harnesses are all uninstalled reports
|
|
264
|
+
`requested_harnesses_not_installed` instead of the misleading
|
|
265
|
+
`no_harnesses_installed`.
|
|
266
|
+
|
|
267
|
+
## [0.19.0] - 2026-07-20
|
|
268
|
+
|
|
269
|
+
### Added
|
|
270
|
+
|
|
271
|
+
- Codex `--reasoning-effort max` support for `gpt-5.6-sol`; other Codex models
|
|
272
|
+
still fail closed unless config or workspace capability-cache overrides opt them in.
|
|
273
|
+
|
|
8
274
|
## [0.18.0] - 2026-07-19
|
|
9
275
|
|
|
10
276
|
### Added
|
|
@@ -137,7 +403,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
137
403
|
consistently across the CLI reference and worktree guidance.
|
|
138
404
|
- Devin help and discovery surfaces now derive supported modes consistently and
|
|
139
405
|
reject unknown modes before constructing executable arguments.
|
|
140
|
-
|
|
141
406
|
## [0.14.0] - 2026-07-15
|
|
142
407
|
|
|
143
408
|
### Added
|
|
@@ -483,6 +748,9 @@ Usage-audit fix wave: 82 sessions and 1,241 delegate invocations from one week o
|
|
|
483
748
|
|
|
484
749
|
- Releases before 0.1.3 predate this changelog.
|
|
485
750
|
|
|
751
|
+
[0.21.0]: https://github.com/treygoff24/delegate-agent/compare/v0.20.0...v0.21.0
|
|
752
|
+
[0.20.0]: https://github.com/treygoff24/delegate-agent/compare/v0.19.0...v0.20.0
|
|
753
|
+
[0.19.0]: https://github.com/treygoff24/delegate-agent/compare/v0.18.0...v0.19.0
|
|
486
754
|
[0.18.0]: https://github.com/treygoff24/delegate-agent/compare/v0.17.0...v0.18.0
|
|
487
755
|
[0.17.0]: https://github.com/treygoff24/delegate-agent/compare/v0.16.0...v0.17.0
|
|
488
756
|
[0.16.0]: https://github.com/treygoff24/delegate-agent/compare/v0.15.0...v0.16.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: delegate-agent-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.21.0
|
|
4
4
|
Summary: A tiny CLI for delegating bounded agent tasks across coding-agent runtimes.
|
|
5
5
|
Author: Trey Goff
|
|
6
6
|
License-Expression: MIT
|
|
@@ -130,22 +130,28 @@ Install OpenCode from [opencode.ai](https://opencode.ai). Its curl installer
|
|
|
130
130
|
normally writes the binary to `~/.opencode/bin`, which may not be on `PATH`.
|
|
131
131
|
Extend `PATH` or set `opencode.binary` to the absolute binary path.
|
|
132
132
|
|
|
133
|
-
|
|
133
|
+
Let Delegate discover the supported harnesses already on your `PATH`:
|
|
134
134
|
|
|
135
135
|
```bash
|
|
136
|
-
delegate
|
|
137
|
-
$EDITOR ~/.delegate/config.json
|
|
136
|
+
delegate setup
|
|
138
137
|
```
|
|
139
138
|
|
|
140
|
-
`
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
139
|
+
`setup` fingerprints installed harnesses, reads their model and reasoning metadata where
|
|
140
|
+
the harness exposes it, and writes a private discovery cache for the active auth profile.
|
|
141
|
+
On a clean install it creates only the absolute binary selectors needed to launch the
|
|
142
|
+
detected harnesses. It never rewrites an existing config, installs a harness, logs in, or
|
|
143
|
+
submits a model prompt.
|
|
144
|
+
|
|
145
|
+
Use `delegate config init` instead when you want the editable example config and profile
|
|
146
|
+
overlays. Replace its placeholder Droid model IDs before real Droid runs. For an existing
|
|
147
|
+
install, `env -u AI_PROFILE delegate config sync-profiles` creates missing overlays without
|
|
148
|
+
overwriting ones you already edited.
|
|
144
149
|
|
|
145
150
|
Inspect what Delegate sees:
|
|
146
151
|
|
|
147
152
|
```bash
|
|
148
153
|
delegate --version # installed version — include this in bug reports
|
|
154
|
+
delegate --json setup
|
|
149
155
|
delegate --json describe --summary
|
|
150
156
|
delegate --json models --summary
|
|
151
157
|
delegate --json describe
|
|
@@ -156,9 +162,10 @@ delegate --json models opencode --live # query every model visible to OpenCode
|
|
|
156
162
|
delegate --json models pi --live # query every model visible to Pi
|
|
157
163
|
delegate --json models omp --live # query every model visible to Oh My Pi
|
|
158
164
|
delegate --json capabilities
|
|
165
|
+
delegate --json capabilities refresh # refresh the active profile's discovery cache
|
|
159
166
|
```
|
|
160
167
|
|
|
161
|
-
Discover commands as you go: `delegate <command> --help` prints focused help for any command path, and `delegate --json <command> --help` returns an agent-friendly spec of its usage, arguments, and options. For launch and `dry-run` commands, `--json` and `--isolation` may also appear before inline prompt text begins, for example `delegate codex work --prompt-file task.md --json`. `delegate --json describe` includes a `commands` catalog of the whole surface. `
|
|
168
|
+
Discover commands as you go: `delegate <command> --help` prints focused help for any command path, and `delegate --json <command> --help` returns an agent-friendly spec of its usage, arguments, and options. For launch and `dry-run` commands, `--json` and `--isolation` may also appear before inline prompt text begins, for example `delegate codex work --prompt-file task.md --json`. `delegate --json describe` includes a `commands` catalog of the whole surface. Cached `models` and `capabilities` reads launch no child process. `models <engine> --live` performs a one-off probe without updating the cache; rerun `delegate setup` or `delegate capabilities refresh` when ordinary launches should consume newly discovered models or effort levels.
|
|
162
169
|
|
|
163
170
|
From this development checkout, use `python3 bin/delegate.py ...` instead of an installed `delegate` shim.
|
|
164
171
|
|
|
@@ -243,7 +250,12 @@ $EDITOR /tmp/delegate-task.json
|
|
|
243
250
|
delegate --json run --input-json /tmp/delegate-task.json
|
|
244
251
|
```
|
|
245
252
|
|
|
246
|
-
For Codex fan-outs that must return machine-parseable records, add
|
|
253
|
+
For Codex fan-outs that must return machine-parseable records, add
|
|
254
|
+
`--output-schema` (or JSON `outputSchema`); Delegate suppresses completion-report
|
|
255
|
+
injection so the schema owns the final message. Codex schemas are
|
|
256
|
+
strict-preflighted recursively: every property must be required, and a missing
|
|
257
|
+
`additionalProperties: false` is supplied in a warned temporary copy without
|
|
258
|
+
changing the source file.
|
|
247
259
|
|
|
248
260
|
For a one-hop prompt that should not see the current repo or create a tracked
|
|
249
261
|
run, use stateless `call` mode:
|
|
@@ -280,7 +292,16 @@ python3 bin/delegate.py workflow approve wf_0123abcdef45
|
|
|
280
292
|
See [Delegate Workflows](docs/delegate-workflows.md) for the DSL, safety
|
|
281
293
|
limits, config, and gate semantics.
|
|
282
294
|
|
|
283
|
-
Reasoning effort is provider-aware. Unsupported combinations fail before launch.
|
|
295
|
+
Reasoning effort is provider-aware. Unsupported combinations fail before launch.
|
|
296
|
+
It changes only the requested model thinking depth/cost/latency; it does not
|
|
297
|
+
change safe/work/call mode, sandboxing, approvals, or edit capability.
|
|
298
|
+
Codex/Droid validate exact model metadata, Cursor selects an explicit configured
|
|
299
|
+
or corroborated discovered effort route, Claude and Grok map to native
|
|
300
|
+
`--effort`, OpenCode validates discovered exact variants when present and
|
|
301
|
+
otherwise warns on pass-through, and Pi/Oh My Pi map to `--thinking` with
|
|
302
|
+
evidence-aware validation. Devin and Kimi do not expose a Delegate
|
|
303
|
+
reasoning-effort flag. Explicit Codex effort can target the harness default model
|
|
304
|
+
even when `codex.defaultModel` is unset:
|
|
284
305
|
|
|
285
306
|
```bash
|
|
286
307
|
delegate --json dry-run codex safe --reasoning-effort high "Review this repository. Do not edit files."
|
|
@@ -291,7 +312,9 @@ Codex model routing is deliberately model-first rather than aliasing every
|
|
|
291
312
|
model/effort pair: define model aliases in `codex.models`, then set effort per
|
|
292
313
|
run with `--reasoning-effort`. Per-model effort menus (including any efforts
|
|
293
314
|
newer than the bundled data) belong in the private `reasoning.capabilities`
|
|
294
|
-
config block, which overrides the bundled defaults.
|
|
315
|
+
config block, which overrides the bundled defaults. Codex `max` is bundled only
|
|
316
|
+
for `gpt-5.6-sol` as of 2026-07; other Codex models require an exact config or
|
|
317
|
+
profile-discovery declaration, or legacy workspace-cache declaration.
|
|
295
318
|
|
|
296
319
|
Fast mode is an independent per-run serving choice. `--fast` requests Codex's
|
|
297
320
|
Fast service tier, `--no-fast` explicitly requests Standard, and omitting both
|
|
@@ -306,6 +329,7 @@ Inspect tracked output by alias:
|
|
|
306
329
|
|
|
307
330
|
```bash
|
|
308
331
|
delegate runs --recent
|
|
332
|
+
delegate ps # active and stale tracked runs
|
|
309
333
|
delegate snapshot <alias-or-runId>
|
|
310
334
|
delegate run-output <alias-or-runId>
|
|
311
335
|
```
|
|
@@ -97,22 +97,28 @@ Install OpenCode from [opencode.ai](https://opencode.ai). Its curl installer
|
|
|
97
97
|
normally writes the binary to `~/.opencode/bin`, which may not be on `PATH`.
|
|
98
98
|
Extend `PATH` or set `opencode.binary` to the absolute binary path.
|
|
99
99
|
|
|
100
|
-
|
|
100
|
+
Let Delegate discover the supported harnesses already on your `PATH`:
|
|
101
101
|
|
|
102
102
|
```bash
|
|
103
|
-
delegate
|
|
104
|
-
$EDITOR ~/.delegate/config.json
|
|
103
|
+
delegate setup
|
|
105
104
|
```
|
|
106
105
|
|
|
107
|
-
`
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
106
|
+
`setup` fingerprints installed harnesses, reads their model and reasoning metadata where
|
|
107
|
+
the harness exposes it, and writes a private discovery cache for the active auth profile.
|
|
108
|
+
On a clean install it creates only the absolute binary selectors needed to launch the
|
|
109
|
+
detected harnesses. It never rewrites an existing config, installs a harness, logs in, or
|
|
110
|
+
submits a model prompt.
|
|
111
|
+
|
|
112
|
+
Use `delegate config init` instead when you want the editable example config and profile
|
|
113
|
+
overlays. Replace its placeholder Droid model IDs before real Droid runs. For an existing
|
|
114
|
+
install, `env -u AI_PROFILE delegate config sync-profiles` creates missing overlays without
|
|
115
|
+
overwriting ones you already edited.
|
|
111
116
|
|
|
112
117
|
Inspect what Delegate sees:
|
|
113
118
|
|
|
114
119
|
```bash
|
|
115
120
|
delegate --version # installed version — include this in bug reports
|
|
121
|
+
delegate --json setup
|
|
116
122
|
delegate --json describe --summary
|
|
117
123
|
delegate --json models --summary
|
|
118
124
|
delegate --json describe
|
|
@@ -123,9 +129,10 @@ delegate --json models opencode --live # query every model visible to OpenCode
|
|
|
123
129
|
delegate --json models pi --live # query every model visible to Pi
|
|
124
130
|
delegate --json models omp --live # query every model visible to Oh My Pi
|
|
125
131
|
delegate --json capabilities
|
|
132
|
+
delegate --json capabilities refresh # refresh the active profile's discovery cache
|
|
126
133
|
```
|
|
127
134
|
|
|
128
|
-
Discover commands as you go: `delegate <command> --help` prints focused help for any command path, and `delegate --json <command> --help` returns an agent-friendly spec of its usage, arguments, and options. For launch and `dry-run` commands, `--json` and `--isolation` may also appear before inline prompt text begins, for example `delegate codex work --prompt-file task.md --json`. `delegate --json describe` includes a `commands` catalog of the whole surface. `
|
|
135
|
+
Discover commands as you go: `delegate <command> --help` prints focused help for any command path, and `delegate --json <command> --help` returns an agent-friendly spec of its usage, arguments, and options. For launch and `dry-run` commands, `--json` and `--isolation` may also appear before inline prompt text begins, for example `delegate codex work --prompt-file task.md --json`. `delegate --json describe` includes a `commands` catalog of the whole surface. Cached `models` and `capabilities` reads launch no child process. `models <engine> --live` performs a one-off probe without updating the cache; rerun `delegate setup` or `delegate capabilities refresh` when ordinary launches should consume newly discovered models or effort levels.
|
|
129
136
|
|
|
130
137
|
From this development checkout, use `python3 bin/delegate.py ...` instead of an installed `delegate` shim.
|
|
131
138
|
|
|
@@ -210,7 +217,12 @@ $EDITOR /tmp/delegate-task.json
|
|
|
210
217
|
delegate --json run --input-json /tmp/delegate-task.json
|
|
211
218
|
```
|
|
212
219
|
|
|
213
|
-
For Codex fan-outs that must return machine-parseable records, add
|
|
220
|
+
For Codex fan-outs that must return machine-parseable records, add
|
|
221
|
+
`--output-schema` (or JSON `outputSchema`); Delegate suppresses completion-report
|
|
222
|
+
injection so the schema owns the final message. Codex schemas are
|
|
223
|
+
strict-preflighted recursively: every property must be required, and a missing
|
|
224
|
+
`additionalProperties: false` is supplied in a warned temporary copy without
|
|
225
|
+
changing the source file.
|
|
214
226
|
|
|
215
227
|
For a one-hop prompt that should not see the current repo or create a tracked
|
|
216
228
|
run, use stateless `call` mode:
|
|
@@ -247,7 +259,16 @@ python3 bin/delegate.py workflow approve wf_0123abcdef45
|
|
|
247
259
|
See [Delegate Workflows](docs/delegate-workflows.md) for the DSL, safety
|
|
248
260
|
limits, config, and gate semantics.
|
|
249
261
|
|
|
250
|
-
Reasoning effort is provider-aware. Unsupported combinations fail before launch.
|
|
262
|
+
Reasoning effort is provider-aware. Unsupported combinations fail before launch.
|
|
263
|
+
It changes only the requested model thinking depth/cost/latency; it does not
|
|
264
|
+
change safe/work/call mode, sandboxing, approvals, or edit capability.
|
|
265
|
+
Codex/Droid validate exact model metadata, Cursor selects an explicit configured
|
|
266
|
+
or corroborated discovered effort route, Claude and Grok map to native
|
|
267
|
+
`--effort`, OpenCode validates discovered exact variants when present and
|
|
268
|
+
otherwise warns on pass-through, and Pi/Oh My Pi map to `--thinking` with
|
|
269
|
+
evidence-aware validation. Devin and Kimi do not expose a Delegate
|
|
270
|
+
reasoning-effort flag. Explicit Codex effort can target the harness default model
|
|
271
|
+
even when `codex.defaultModel` is unset:
|
|
251
272
|
|
|
252
273
|
```bash
|
|
253
274
|
delegate --json dry-run codex safe --reasoning-effort high "Review this repository. Do not edit files."
|
|
@@ -258,7 +279,9 @@ Codex model routing is deliberately model-first rather than aliasing every
|
|
|
258
279
|
model/effort pair: define model aliases in `codex.models`, then set effort per
|
|
259
280
|
run with `--reasoning-effort`. Per-model effort menus (including any efforts
|
|
260
281
|
newer than the bundled data) belong in the private `reasoning.capabilities`
|
|
261
|
-
config block, which overrides the bundled defaults.
|
|
282
|
+
config block, which overrides the bundled defaults. Codex `max` is bundled only
|
|
283
|
+
for `gpt-5.6-sol` as of 2026-07; other Codex models require an exact config or
|
|
284
|
+
profile-discovery declaration, or legacy workspace-cache declaration.
|
|
262
285
|
|
|
263
286
|
Fast mode is an independent per-run serving choice. `--fast` requests Codex's
|
|
264
287
|
Fast service tier, `--no-fast` explicitly requests Standard, and omitting both
|
|
@@ -273,6 +296,7 @@ Inspect tracked output by alias:
|
|
|
273
296
|
|
|
274
297
|
```bash
|
|
275
298
|
delegate runs --recent
|
|
299
|
+
delegate ps # active and stale tracked runs
|
|
276
300
|
delegate snapshot <alias-or-runId>
|
|
277
301
|
delegate run-output <alias-or-runId>
|
|
278
302
|
```
|
|
@@ -33,6 +33,75 @@ _delegate_subcommand() {
|
|
|
33
33
|
done
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
+
_delegate_launch_help_request() {
|
|
37
|
+
_delegate_launch_cmd="${1:-}"
|
|
38
|
+
[ "$#" -gt 0 ] && shift
|
|
39
|
+
|
|
40
|
+
if [ "$_delegate_launch_cmd" = "dry-run" ]; then
|
|
41
|
+
case "${1:-}" in
|
|
42
|
+
--help|-h)
|
|
43
|
+
return 0
|
|
44
|
+
;;
|
|
45
|
+
esac
|
|
46
|
+
_delegate_launch_cmd="${1:-}"
|
|
47
|
+
[ "$#" -gt 0 ] && shift
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
case "$_delegate_launch_cmd" in
|
|
51
|
+
cursor|codex|kimi|claude|grok|devin|opencode|pi|omp)
|
|
52
|
+
# Parser parity: help is diagnostic only before the mode or immediately
|
|
53
|
+
# after it. Once inline prompt text starts, a later help token is data.
|
|
54
|
+
case "${1:-}" in
|
|
55
|
+
--help|-h)
|
|
56
|
+
return 0
|
|
57
|
+
;;
|
|
58
|
+
safe|work|call)
|
|
59
|
+
case "${2:-}" in
|
|
60
|
+
--help|-h)
|
|
61
|
+
return 0
|
|
62
|
+
;;
|
|
63
|
+
esac
|
|
64
|
+
;;
|
|
65
|
+
esac
|
|
66
|
+
return 1
|
|
67
|
+
;;
|
|
68
|
+
droid)
|
|
69
|
+
# Droid may place a model alias before the mode, so its last diagnostic
|
|
70
|
+
# help position is one token later than the modeless harnesses.
|
|
71
|
+
case "${1:-}" in
|
|
72
|
+
--help|-h)
|
|
73
|
+
return 0
|
|
74
|
+
;;
|
|
75
|
+
safe|work|call)
|
|
76
|
+
case "${2:-}" in
|
|
77
|
+
--help|-h)
|
|
78
|
+
return 0
|
|
79
|
+
;;
|
|
80
|
+
esac
|
|
81
|
+
;;
|
|
82
|
+
*)
|
|
83
|
+
case "${2:-}" in
|
|
84
|
+
--help|-h)
|
|
85
|
+
return 0
|
|
86
|
+
;;
|
|
87
|
+
safe|work|call)
|
|
88
|
+
case "${3:-}" in
|
|
89
|
+
--help|-h)
|
|
90
|
+
return 0
|
|
91
|
+
;;
|
|
92
|
+
esac
|
|
93
|
+
;;
|
|
94
|
+
esac
|
|
95
|
+
;;
|
|
96
|
+
esac
|
|
97
|
+
return 1
|
|
98
|
+
;;
|
|
99
|
+
*)
|
|
100
|
+
return 1
|
|
101
|
+
;;
|
|
102
|
+
esac
|
|
103
|
+
}
|
|
104
|
+
|
|
36
105
|
_delegate_is_readonly_request() {
|
|
37
106
|
while [ "$#" -gt 0 ]; do
|
|
38
107
|
case "$1" in
|
|
@@ -51,7 +120,29 @@ _delegate_is_readonly_request() {
|
|
|
51
120
|
_cmd="${1:-}"
|
|
52
121
|
[ "$#" -gt 0 ] && shift
|
|
53
122
|
case "$_cmd" in
|
|
54
|
-
|
|
123
|
+
cursor|droid|codex|kimi|claude|grok|devin|opencode|pi|omp|dry-run)
|
|
124
|
+
_delegate_launch_help_request "$_cmd" "$@" && return 0
|
|
125
|
+
return 1
|
|
126
|
+
;;
|
|
127
|
+
esac
|
|
128
|
+
# Non-launch command parsers treat help as diagnostic wherever accepted.
|
|
129
|
+
for _delegate_help_arg in "$@"; do
|
|
130
|
+
case "$_delegate_help_arg" in
|
|
131
|
+
--help|-h)
|
|
132
|
+
return 0
|
|
133
|
+
;;
|
|
134
|
+
esac
|
|
135
|
+
done
|
|
136
|
+
case "$_cmd" in
|
|
137
|
+
profiles|runs|ps|run-output|describe|snapshot|agent-help|help|--help|-h|--version)
|
|
138
|
+
return 0
|
|
139
|
+
;;
|
|
140
|
+
models)
|
|
141
|
+
for _delegate_model_arg in "$@"; do
|
|
142
|
+
if [ "$_delegate_model_arg" = "--live" ]; then
|
|
143
|
+
return 1
|
|
144
|
+
fi
|
|
145
|
+
done
|
|
55
146
|
return 0
|
|
56
147
|
;;
|
|
57
148
|
capabilities)
|