delegate-agent-cli 0.11.0__tar.gz → 0.13.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/CHANGELOG.md +64 -0
  2. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/PKG-INFO +63 -11
  3. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/README.md +62 -10
  4. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/config.example.json +12 -0
  5. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/docs/agent-setup.md +29 -2
  6. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/docs/cli-reference.md +172 -32
  7. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/docs/configuration.md +123 -5
  8. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/docs/development.md +5 -2
  9. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/docs/publishing-checklist.md +5 -2
  10. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/docs/security-model.md +16 -5
  11. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/docs/troubleshooting.md +38 -6
  12. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/docs/worktrees.md +2 -0
  13. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/pyproject.toml +1 -1
  14. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/__init__.py +1 -1
  15. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/argv_builders.py +65 -0
  16. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/argv_utils.py +2 -0
  17. delegate_agent_cli-0.13.0/src/delegate_agent/bundled_models.py +82 -0
  18. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/cli.py +135 -7
  19. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/cli_parser.py +302 -19
  20. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/command_help.py +311 -56
  21. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/config.py +208 -9
  22. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/constants.py +23 -8
  23. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/describe_payload.py +415 -32
  24. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/harness_events.py +167 -1
  25. delegate_agent_cli-0.13.0/src/delegate_agent/model_discovery.py +428 -0
  26. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/profile_guard.py +8 -0
  27. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/prompt_instructions.py +11 -0
  28. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/prompt_transport.py +2 -0
  29. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/reasoning.py +149 -7
  30. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/redaction.py +2 -1
  31. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/request_build.py +580 -82
  32. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/request_models.py +16 -0
  33. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/run_registry.py +3 -1
  34. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/runner.py +57 -16
  35. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/safe_workspace.py +5 -0
  36. delegate_agent_cli-0.13.0/src/delegate_agent/workflows/__init__.py +5 -0
  37. delegate_agent_cli-0.13.0/src/delegate_agent/workflows/commands.py +634 -0
  38. delegate_agent_cli-0.13.0/src/delegate_agent/workflows/registry.py +178 -0
  39. delegate_agent_cli-0.13.0/src/delegate_agent/workflows/runtime.py +1490 -0
  40. delegate_agent_cli-0.13.0/src/delegate_agent/workflows/schema.py +146 -0
  41. delegate_agent_cli-0.13.0/src/delegate_agent/workflows/script.py +198 -0
  42. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/worktree_execution.py +7 -0
  43. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent_cli.egg-info/PKG-INFO +63 -11
  44. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent_cli.egg-info/SOURCES.txt +13 -0
  45. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_capability_commands.py +59 -0
  46. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_command_help.py +3 -0
  47. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_delegate_help_cli.py +25 -5
  48. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_delegate_parser.py +65 -1
  49. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_delegate_validation.py +1 -1
  50. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_engine_argv.py +431 -1
  51. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_harness_events.py +195 -0
  52. delegate_agent_cli-0.13.0/tests/test_model_discovery.py +648 -0
  53. delegate_agent_cli-0.13.0/tests/test_model_selection_wave1a.py +368 -0
  54. delegate_agent_cli-0.13.0/tests/test_model_selection_wave1b.py +798 -0
  55. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_reasoning_capabilities.py +95 -0
  56. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_run_registry.py +25 -0
  57. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_runner_capture.py +139 -0
  58. delegate_agent_cli-0.13.0/tests/test_slash_passthrough.py +212 -0
  59. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_utility_modules.py +15 -2
  60. delegate_agent_cli-0.13.0/tests/test_workflow_commands.py +1793 -0
  61. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/CONTRIBUTING.md +0 -0
  62. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/LICENSE +0 -0
  63. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/MANIFEST.in +0 -0
  64. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/SECURITY.md +0 -0
  65. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/bin/delegate-profile-shim +0 -0
  66. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/bin/delegate.py +0 -0
  67. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/docs/assets/delegate-agent-header.png +0 -0
  68. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/docs/live-runtime.md +0 -0
  69. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/examples/task.claude.json +0 -0
  70. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/examples/task.codex.json +0 -0
  71. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/examples/task.cursor.json +0 -0
  72. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/examples/task.droid.json +0 -0
  73. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/examples/task.grok.json +0 -0
  74. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/examples/task.judge.json +0 -0
  75. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/setup.cfg +0 -0
  76. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/archived_logs.py +0 -0
  77. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/capability_commands.py +0 -0
  78. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/command_errors.py +0 -0
  79. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/config_commands.py +0 -0
  80. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/errors.py +0 -0
  81. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/git_utils.py +0 -0
  82. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/inspection_commands.py +0 -0
  83. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/isolation.py +0 -0
  84. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/json_types.py +0 -0
  85. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/log_output.py +0 -0
  86. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/private_io.py +0 -0
  87. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/profile_commands.py +0 -0
  88. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/profiles.py +0 -0
  89. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/rendering.py +0 -0
  90. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/retention.py +0 -0
  91. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/run_metadata.py +0 -0
  92. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/run_output_commands.py +0 -0
  93. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/run_status.py +0 -0
  94. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/snapshot_view.py +0 -0
  95. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/wait_cancel_commands.py +0 -0
  96. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/worktree_commands.py +0 -0
  97. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/worktree_gc.py +0 -0
  98. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/worktree_mgmt.py +0 -0
  99. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/worktree_records.py +0 -0
  100. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/worktree_remove.py +0 -0
  101. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/worktree_summary.py +0 -0
  102. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent/wsl.py +0 -0
  103. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent_cli.egg-info/dependency_links.txt +0 -0
  104. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent_cli.egg-info/entry_points.txt +0 -0
  105. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent_cli.egg-info/requires.txt +0 -0
  106. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/src/delegate_agent_cli.egg-info/top_level.txt +0 -0
  107. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_config_commands.py +0 -0
  108. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_delegate_isolation.py +0 -0
  109. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_end_to_end_tracking.py +0 -0
  110. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_execution_argv_and_prompt.py +0 -0
  111. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_execution_dry_run.py +0 -0
  112. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_execution_worktree_failure_cleanup.py +0 -0
  113. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_execution_worktree_preflight.py +0 -0
  114. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_execution_worktree_run.py +0 -0
  115. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_inspection_commands.py +0 -0
  116. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_kimi_commands.py +0 -0
  117. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_packaging.py +0 -0
  118. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_profiles.py +0 -0
  119. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_retention.py +0 -0
  120. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_safe_workspace_isolation.py +0 -0
  121. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_snapshot_redaction.py +0 -0
  122. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_snapshot_rendering.py +0 -0
  123. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_snapshot_run_output.py +0 -0
  124. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_snapshot_view.py +0 -0
  125. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_wait_cancel_commands.py +0 -0
  126. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_wave4_launch_features.py +0 -0
  127. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_worktree_list_show.py +0 -0
  128. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_worktree_prune_gc.py +0 -0
  129. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_worktree_remove.py +0 -0
  130. {delegate_agent_cli-0.11.0 → delegate_agent_cli-0.13.0}/tests/test_wsl_guardrails.py +0 -0
@@ -5,6 +5,63 @@ 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.13.0] - 2026-07-09
9
+
10
+ ### Added
11
+
12
+ - Added `opencode` as a first-class engine across `safe`, `work`, `call`, and
13
+ workflow runs. OpenCode drives any provider/model in the models.dev catalog
14
+ (75+ providers, plus custom/local providers) through one harness. Safe mode
15
+ and `call --read-only` enforce a deny-all-but-read permission lockdown via
16
+ `OPENCODE_CONFIG_CONTENT` (merges last, beating hostile repo config; verified
17
+ live against v1.17.17 including a git-worktree write-barrier test). Live
18
+ model discovery via `opencode models`, string or `{"model", "variant"}`
19
+ object aliases that can pin a reasoning variant, `--reasoning-effort` mapped
20
+ to OpenCode `--variant`, and per-run `--agent` selection with
21
+ `opencode.defaultAgent` fallback.
22
+
23
+ ## [0.12.0] - 2026-07-09
24
+
25
+ Three features in one train: Delegate Workflows (multi-agent orchestration with durable resume), per-run model selection + discovery across all seven engines, and the Devin engine. Model selection was built as the inaugural Delegate Workflows dogfood: three implementation waves plus a twelve-round two-lane adversarial review loop driven through `workflow run --resume`.
26
+
27
+ ### Added
28
+
29
+ - Per-run model selection: every engine accepts `--model <alias-or-id>` (alias
30
+ from `<engine>.models`, or a raw model ID passed through verbatim). Alias maps
31
+ are generalized beyond Droid to all engines; Droid keeps its optional
32
+ positional alias and gains optional `droid.defaultModel`. `delegate models
33
+ <engine>` merges bundled + config catalogs; `--live` probes cursor/droid/devin
34
+ when available. Non-droid aliases also appear in `models` / `models --summary`.
35
+ - Delegate Workflows: a Python DSL supervisor for multi-agent fan-out, durable
36
+ journaling, nested workflow calls, schema-validated `agent()` results,
37
+ approval gates, resume, kill, saved workflows, and workflow discovery in
38
+ `describe`/help/docs. Status/list report `stalled` when a supervisor died
39
+ without finalizing (non-blocking lock probe; `wait`/`watch` exit instead of
40
+ hanging), and supervisor failures record a traceback tail in the journal,
41
+ result, and status.
42
+ - Slash pass-through: launch prompts that intentionally start with a harness
43
+ slash command can be sent verbatim when the target mode's safety boundary does
44
+ not depend on Delegate's prompt preamble. `--pass-through` also suppresses the
45
+ skill preamble and completion-report suffix while preserving safe-mode
46
+ boundaries.
47
+ - Added `devin` as a first-class engine for Cognition's Devin CLI across
48
+ `safe`, `work`, and `call` modes. Devin uses prompt-file transport,
49
+ config-driven model selection (`devin.defaultModel`, default `swe-1.7`),
50
+ read-only safe/call enforcement through a Delegate-generated
51
+ `--agent-config`, and `--permission-mode dangerous` for work/default-call
52
+ print-mode runs.
53
+
54
+ ### Changed
55
+
56
+ - Config migration: a `<engine>.models` alias key named after a mode (`safe`,
57
+ `work`, or `call`) or after its own engine is now a config validation error —
58
+ rename the alias (aliases naming a *different* engine, like a `droid.models`
59
+ alias called `grok`, remain valid). Cursor input-JSON `"model"` values that differ from
60
+ `cursor.defaultModel` are now honored instead of rejected. Droid run-input
61
+ JSON `"model"` is now alias-or-id like `--model`: a `droid.models` key keeps
62
+ alias semantics, anything else passes through verbatim to the harness
63
+ (previously a hard `invalid_alias` error).
64
+
8
65
  ## [0.11.0] - 2026-07-05
9
66
 
10
67
  Profile-guard calibration fix for issue #9: a shell carrying `AI_PROFILE=work|personal` with no matching `~/.delegate/config.<profile>.json` no longer presents a half-configured install as a total CLI outage.
@@ -21,6 +78,11 @@ Profile-guard calibration fix for issue #9: a shell carrying `AI_PROFILE=work|pe
21
78
 
22
79
  - The fail-closed profile-crossover guarantee is now enforced inside the Python CLI (`delegate_agent.cli:main` via the new `delegate_agent.profile_guard`), classifying from the real parsed command rather than positional argv guessing. This closes a gap where the guarantee lived only in the optional shell shim: the pip console script, `python -m delegate_agent.cli`, and `bin/delegate.py` all reach `main` with no shim in front, and previously fell through to the base account on a missing overlay. The guard no-ops when `DELEGATE_CONFIG` is already exported (shim precedence) so the two layers compose without a double check. The tracked `bin/delegate-profile-shim` template applies the same check before Python starts, as an additional early gate; it scans all args for `capabilities refresh` so a mutation is never misclassified as a read-only probe.
23
80
 
81
+ ### Packaging
82
+
83
+ - Published to PyPI as `delegate-agent-cli`: PyPI's separator-stripped name-similarity rule blocked the shorter `delegate-agent` (an existing `DelegateAgent` project collides). The installed console script is still `delegate`; only the `pip install` name changed.
84
+ - Hardened two tests (`test_execution_argv_and_prompt.py`, `test_wait_cancel_commands.py`) that raced child-process teardown against the isolation and cleanup assertions they were checking, which showed up as intermittent failures on the publish gate.
85
+
24
86
  ## [0.10.0] - 2026-07-04
25
87
 
26
88
  Usage-audit fix wave: 82 sessions and 1,241 delegate invocations from one week of agent usage were mined for friction and failure modes, and the whole Tier 1–3 backlog was built across four decorrelated implementation waves plus live acceptance.
@@ -230,6 +292,8 @@ Usage-audit fix wave: 82 sessions and 1,241 delegate invocations from one week o
230
292
 
231
293
  - Releases before 0.1.3 predate this changelog.
232
294
 
295
+ [0.13.0]: https://github.com/treygoff24/delegate-agent/compare/v0.12.0...v0.13.0
296
+ [0.12.0]: https://github.com/treygoff24/delegate-agent/compare/v0.11.0...v0.12.0
233
297
  [0.11.0]: https://github.com/treygoff24/delegate-agent/compare/v0.10.0...v0.11.0
234
298
  [0.10.0]: https://github.com/treygoff24/delegate-agent/compare/v0.9.0...v0.10.0
235
299
  [0.9.0]: https://github.com/treygoff24/delegate-agent/compare/v0.8.1...v0.9.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: delegate-agent-cli
3
- Version: 0.11.0
3
+ Version: 0.13.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
@@ -37,7 +37,7 @@ Dynamic: license-file
37
37
 
38
38
  # Delegate Agent
39
39
 
40
- Delegate Agent is a small CLI for handing a bounded task to another coding-agent runtime. It normalizes common calls to Cursor Agent, Factory Droid, OpenAI Codex, Claude Code, and Kimi Code so humans or other agents can launch review, investigation, and implementation jobs without remembering each tool's flags.
40
+ Delegate Agent is a small CLI for handing a bounded task to another coding-agent runtime. It normalizes common calls to Cursor Agent, Factory Droid, OpenAI Codex, Claude Code, Grok Build, Devin, OpenCode, and Kimi Code so humans or other agents can launch review, investigation, and implementation jobs without remembering each tool's flags.
41
41
 
42
42
  Use it when you want a predictable wrapper around prompts like:
43
43
 
@@ -47,19 +47,31 @@ Use it when you want a predictable wrapper around prompts like:
47
47
 
48
48
  Delegate does **not** commit, push, merge, deploy, publish, or run a background service. It builds the child command, adds safety framing, launches the selected runtime, and records local run metadata for later inspection.
49
49
 
50
- Prompt handling is provider-specific: Codex and Claude prompts are delivered to the child
51
- runtime over stdin; Droid prompts are delivered through a private temporary
52
- prompt file using Droid's `--file` option; Cursor Agent and Kimi Code currently
50
+ Prompt handling is provider-specific: Codex, Claude, and OpenCode prompts are delivered to the child
51
+ runtime over stdin; Droid, Grok, and Devin prompts are delivered through private
52
+ temporary prompt files; Cursor Agent and Kimi Code currently
53
53
  require prompt argv. Delegate redacts Cursor and Kimi prompt argv in dry-run
54
54
  output and run manifests, but true process-argv hiding for those harnesses
55
55
  depends on the child CLIs exposing stdin or prompt-file transport.
56
56
 
57
- ## Install from source
57
+ ## Install
58
58
 
59
- Delegate requires Python 3.11 or newer. It is currently documented as a GitHub-source install, not a PyPI package.
59
+ Delegate requires Python 3.11 or newer. The PyPI package is named `delegate-agent-cli` (PyPI's name-similarity rule blocked the shorter `delegate-agent`), but it installs the same `delegate` command either way.
60
60
 
61
61
  ```bash
62
- python3 -m pip install "delegate-agent @ git+https://github.com/treygoff24/delegate-agent.git"
62
+ uv tool install delegate-agent-cli
63
+ # or
64
+ pipx install delegate-agent-cli
65
+ # or
66
+ pip install delegate-agent-cli
67
+ ```
68
+
69
+ ### Install from source
70
+
71
+ For the latest unreleased code, or to contribute:
72
+
73
+ ```bash
74
+ python3 -m pip install "delegate-agent-cli @ git+https://github.com/treygoff24/delegate-agent.git"
63
75
  ```
64
76
 
65
77
  For local development or a checkout-only smoke test:
@@ -85,11 +97,17 @@ command -v droid # Factory Droid CLI, used by delegate droid ...
85
97
  command -v codex # OpenAI Codex CLI, used by delegate codex ...
86
98
  command -v claude # Claude Code CLI, used by delegate claude ...
87
99
  command -v grok # xAI Grok Build CLI, used by delegate grok ...
100
+ command -v devin # Cognition Devin CLI, used by delegate devin ...
101
+ command -v opencode # OpenCode CLI, used by delegate opencode ...
88
102
  command -v kimi # Kimi Code CLI, used by delegate kimi ...
89
103
  ```
90
104
 
91
105
  Runtime authentication is owned by each child CLI. Delegate cannot log in for you. Dry-runs and CI tests do not require the real child binaries.
92
106
 
107
+ Install OpenCode from [opencode.ai](https://opencode.ai). Its curl installer
108
+ normally writes the binary to `~/.opencode/bin`, which may not be on `PATH`.
109
+ Extend `PATH` or set `opencode.binary` to the absolute binary path.
110
+
93
111
  Initialize a starter config and replace placeholder Droid model IDs before real Droid runs:
94
112
 
95
113
  ```bash
@@ -110,6 +128,9 @@ delegate --json describe --summary
110
128
  delegate --json models --summary
111
129
  delegate --json describe
112
130
  delegate --json models
131
+ delegate --json models codex # per-engine advisory catalog
132
+ delegate --json models cursor --live # merge live harness probe when supported
133
+ delegate --json models opencode --live # query every model visible to OpenCode
113
134
  delegate --json capabilities
114
135
  ```
115
136
 
@@ -133,6 +154,7 @@ Preview the command without launching a child runtime:
133
154
  ```bash
134
155
  delegate --json dry-run codex safe "Review this repository. Do not edit files."
135
156
  delegate --json dry-run claude safe "Review this repository. Do not edit files."
157
+ delegate --json dry-run opencode safe "Review this repository. Do not edit files."
136
158
  ```
137
159
 
138
160
  Run a read-only review in an isolated throwaway workspace:
@@ -141,6 +163,8 @@ Run a read-only review in an isolated throwaway workspace:
141
163
  delegate codex safe "Review this repository for correctness risks. Do not edit files."
142
164
  delegate claude safe "Review this repository for correctness risks. Do not edit files."
143
165
  delegate grok safe "Review this repository for correctness risks. Do not edit files."
166
+ delegate devin safe "Review this repository for correctness risks. Do not edit files."
167
+ delegate opencode safe "Review this repository for correctness risks. Do not edit files."
144
168
  delegate cursor safe "Review the current diff for regressions. Do not edit files."
145
169
  delegate kimi safe "Review this repository for regressions. Do not edit files."
146
170
  ```
@@ -157,9 +181,21 @@ Run an edit-capable task in a workspace you trust:
157
181
  ```bash
158
182
  delegate cursor work "Fix the parser bug. Run python3 -m unittest tests.test_delegate_parser. Report changed files."
159
183
  delegate claude work "Implement the scoped change and run the named check. Report changed files."
184
+ delegate devin work "Implement the scoped change and run the named check. Report changed files."
185
+ delegate opencode work "Implement the scoped change and run the named check. Report changed files."
160
186
  delegate kimi work "Implement the scoped change and run the named check. Report changed files."
161
187
  ```
162
188
 
189
+ Pin a model per run with `--model` (config alias from `<engine>.models`, or a
190
+ raw model ID passed through verbatim). Droid still accepts a positional alias;
191
+ `--model` works on every engine, including Droid:
192
+
193
+ ```bash
194
+ delegate devin safe --model claude-fable-5 "Review this repository. Do not edit files."
195
+ delegate droid work --model custom:my-model "Implement the scoped change."
196
+ delegate --json dry-run codex safe --model fast "Review this repository. Do not edit files."
197
+ ```
198
+
163
199
  For long foreground runs, add `--progress` to emit bounded parent heartbeats to
164
200
  stderr while keeping final stdout machine-readable, or set `progress.enabled`
165
201
  to `true` in config. Use `--no-progress` to override config for one launch.
@@ -187,7 +223,20 @@ run, use stateless `call` mode:
187
223
  delegate --json codex call "Summarize this context in three bullets."
188
224
  ```
189
225
 
190
- Reasoning effort is provider-aware. Unsupported combinations fail before launch. It changes only the requested model thinking depth/cost/latency; it does not change safe/work/call mode, sandboxing, approvals, or edit capability. Codex/Droid validate effort against model capability metadata, Cursor maps effort to configured model selection, Claude maps to Claude Code `--effort`, and Grok maps to Grok `--effort` (`low`, `medium`, `high`, `xhigh`, `max`). Explicit Codex effort can target the harness default model even when `codex.defaultModel` is unset:
226
+ For multi-step fan-out or gated review flows, use Delegate Workflows. A workflow
227
+ is a Python script that launches normal Delegate child runs, journals progress,
228
+ can pause on approval gates, and can resume from cached child results:
229
+
230
+ ```bash
231
+ python3 bin/delegate.py workflow check review.py
232
+ python3 bin/delegate.py --json workflow run review.py --args '{"files":["src/cli.py"]}' --budget 10
233
+ python3 bin/delegate.py workflow approve wf_0123abcdef45
234
+ ```
235
+
236
+ See [Delegate Workflows](docs/delegate-workflows.md) for the DSL, safety
237
+ limits, config, and gate semantics.
238
+
239
+ Reasoning effort is provider-aware. Unsupported combinations fail before launch. It changes only the requested model thinking depth/cost/latency; it does not change safe/work/call mode, sandboxing, approvals, or edit capability. Codex/Droid validate effort against model capability metadata, Cursor maps effort to configured model selection, Claude maps to Claude Code `--effort`, Grok maps to Grok `--effort` (`low`, `medium`, `high`, `xhigh`, `max`), and OpenCode passes it through as `--variant`. Devin and Kimi do not expose a Delegate reasoning-effort flag. Explicit Codex effort can target the harness default model even when `codex.defaultModel` is unset:
191
240
 
192
241
  ```bash
193
242
  delegate --json dry-run codex safe --reasoning-effort high "Review this repository. Do not edit files."
@@ -251,8 +300,10 @@ Delegate separates three ideas:
251
300
 
252
301
  Defaults are intentionally conservative for review paths:
253
302
 
254
- - `delegate cursor safe`, `delegate codex safe`, `delegate claude safe`, `delegate grok safe`, `delegate droid ALIAS safe`, and `delegate kimi safe` run in an isolated throwaway workspace. 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.
303
+ - `delegate cursor safe`, `delegate codex safe`, `delegate claude safe`, `delegate grok safe`, `delegate devin safe`, `delegate opencode safe`, `delegate droid ALIAS safe`, and `delegate kimi safe` run in an isolated throwaway workspace. 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.
255
304
  - Grok safe mode uses Delegate isolated copy plus Grok read-only sandbox/permission controls (`--sandbox read-only`, `--permission-mode dontAsk` by default). It does not use Grok `plan` mode. Prompts are delivered via Grok `--prompt-file` from a Delegate temp file.
305
+ - Devin safe mode uses Delegate isolated copy plus a Delegate-generated `--agent-config` deny-list for edit/write/exec and `mcp__*`, with Devin `--permission-mode auto`. Work mode uses Devin `--permission-mode dangerous` because Devin print mode rejects unapproved edit/exec tools.
306
+ - OpenCode safe mode uses Delegate's isolated copy plus an `OPENCODE_CONFIG_CONTENT` permission lockdown that allows only read, glob, and grep operations. OpenCode merges this override last, so repository configuration cannot restore write-capable tools. `opencode call --read-only` uses the same lockdown; plain `call` does not.
256
307
  - Claude safe mode invokes `claude -p` with prompt text on stdin, `--permission-mode plan`, `--strict-mcp-config`, Read/Grep/Glob plus selected read-only Bash tools, and `--no-session-persistence` by default. Delegate does not currently prove that Claude Code hooks, plugins, user settings, or other non-MCP customization surfaces are disabled.
257
308
  - `work` mode can edit. By default it runs in the real workspace for backward compatibility.
258
309
 
@@ -279,7 +330,7 @@ To carry uncommitted local work into the worktree instead of stashing it, add
279
330
  the worktree through the same snapshot primitives as safe mode, and tears the
280
331
  worktree down before launching the child if that sync fails.
281
332
 
282
- Safe isolation and `--include-dirty` recreate an untracked symlink only when it is relative, resolves inside the source workspace, and its target is not gitignored; any symlink that fails those checks — an absolute target, an escape out of the tree, or a target that is itself a gitignored secret — is replaced with an inert placeholder file, failing closed on any ambiguity. Delegate reports a warning listing the symlink paths it blocked. In Git repositories with no commits yet, Cursor/Codex/Claude/Droid/Kimi safe isolation falls back to a directory copy because Git cannot create a detached worktree from an unborn `HEAD`.
333
+ Safe isolation and `--include-dirty` recreate an untracked symlink only when it is relative, resolves inside the source workspace, and its target is not gitignored; any symlink that fails those checks — an absolute target, an escape out of the tree, or a target that is itself a gitignored secret — is replaced with an inert placeholder file, failing closed on any ambiguity. Delegate reports a warning listing the symlink paths it blocked. In Git repositories with no commits yet, Cursor/Codex/Claude/Droid/Grok/Devin/OpenCode/Kimi safe isolation falls back to a directory copy because Git cannot create a detached worktree from an unborn `HEAD`.
283
334
 
284
335
  Snapshots and `run-output` redact common credential shapes by default, including authorization headers, bearer/basic tokens, JWT-like strings, and common `token=` / `api_key=` / `password=` values. Use `--no-redact` only when exact output is necessary and safe to display.
285
336
 
@@ -311,6 +362,7 @@ AI_PROFILE delegate ...` uses the base config, or set
311
362
  - [Agent setup](docs/agent-setup.md): human and non-interactive setup flows.
312
363
  - [CLI reference](docs/cli-reference.md): commands, exit codes, and JSON contracts.
313
364
  - [Configuration](docs/configuration.md): config precedence, sections, and provider-neutral aliases.
365
+ - [Delegate Workflows](docs/delegate-workflows.md): workflow DSL, caps, config, and gate semantics.
314
366
  - [Security model](docs/security-model.md): boundaries, limitations, and safe usage.
315
367
  - [Worktrees](docs/worktrees.md): persistent-worktree lifecycle and cleanup.
316
368
  - [Troubleshooting](docs/troubleshooting.md): common failures and checks.
@@ -4,7 +4,7 @@
4
4
 
5
5
  # Delegate Agent
6
6
 
7
- Delegate Agent is a small CLI for handing a bounded task to another coding-agent runtime. It normalizes common calls to Cursor Agent, Factory Droid, OpenAI Codex, Claude Code, and Kimi Code so humans or other agents can launch review, investigation, and implementation jobs without remembering each tool's flags.
7
+ Delegate Agent is a small CLI for handing a bounded task to another coding-agent runtime. It normalizes common calls to Cursor Agent, Factory Droid, OpenAI Codex, Claude Code, Grok Build, Devin, OpenCode, and Kimi Code so humans or other agents can launch review, investigation, and implementation jobs without remembering each tool's flags.
8
8
 
9
9
  Use it when you want a predictable wrapper around prompts like:
10
10
 
@@ -14,19 +14,31 @@ Use it when you want a predictable wrapper around prompts like:
14
14
 
15
15
  Delegate does **not** commit, push, merge, deploy, publish, or run a background service. It builds the child command, adds safety framing, launches the selected runtime, and records local run metadata for later inspection.
16
16
 
17
- Prompt handling is provider-specific: Codex and Claude prompts are delivered to the child
18
- runtime over stdin; Droid prompts are delivered through a private temporary
19
- prompt file using Droid's `--file` option; Cursor Agent and Kimi Code currently
17
+ Prompt handling is provider-specific: Codex, Claude, and OpenCode prompts are delivered to the child
18
+ runtime over stdin; Droid, Grok, and Devin prompts are delivered through private
19
+ temporary prompt files; Cursor Agent and Kimi Code currently
20
20
  require prompt argv. Delegate redacts Cursor and Kimi prompt argv in dry-run
21
21
  output and run manifests, but true process-argv hiding for those harnesses
22
22
  depends on the child CLIs exposing stdin or prompt-file transport.
23
23
 
24
- ## Install from source
24
+ ## Install
25
25
 
26
- Delegate requires Python 3.11 or newer. It is currently documented as a GitHub-source install, not a PyPI package.
26
+ Delegate requires Python 3.11 or newer. The PyPI package is named `delegate-agent-cli` (PyPI's name-similarity rule blocked the shorter `delegate-agent`), but it installs the same `delegate` command either way.
27
27
 
28
28
  ```bash
29
- python3 -m pip install "delegate-agent @ git+https://github.com/treygoff24/delegate-agent.git"
29
+ uv tool install delegate-agent-cli
30
+ # or
31
+ pipx install delegate-agent-cli
32
+ # or
33
+ pip install delegate-agent-cli
34
+ ```
35
+
36
+ ### Install from source
37
+
38
+ For the latest unreleased code, or to contribute:
39
+
40
+ ```bash
41
+ python3 -m pip install "delegate-agent-cli @ git+https://github.com/treygoff24/delegate-agent.git"
30
42
  ```
31
43
 
32
44
  For local development or a checkout-only smoke test:
@@ -52,11 +64,17 @@ command -v droid # Factory Droid CLI, used by delegate droid ...
52
64
  command -v codex # OpenAI Codex CLI, used by delegate codex ...
53
65
  command -v claude # Claude Code CLI, used by delegate claude ...
54
66
  command -v grok # xAI Grok Build CLI, used by delegate grok ...
67
+ command -v devin # Cognition Devin CLI, used by delegate devin ...
68
+ command -v opencode # OpenCode CLI, used by delegate opencode ...
55
69
  command -v kimi # Kimi Code CLI, used by delegate kimi ...
56
70
  ```
57
71
 
58
72
  Runtime authentication is owned by each child CLI. Delegate cannot log in for you. Dry-runs and CI tests do not require the real child binaries.
59
73
 
74
+ Install OpenCode from [opencode.ai](https://opencode.ai). Its curl installer
75
+ normally writes the binary to `~/.opencode/bin`, which may not be on `PATH`.
76
+ Extend `PATH` or set `opencode.binary` to the absolute binary path.
77
+
60
78
  Initialize a starter config and replace placeholder Droid model IDs before real Droid runs:
61
79
 
62
80
  ```bash
@@ -77,6 +95,9 @@ delegate --json describe --summary
77
95
  delegate --json models --summary
78
96
  delegate --json describe
79
97
  delegate --json models
98
+ delegate --json models codex # per-engine advisory catalog
99
+ delegate --json models cursor --live # merge live harness probe when supported
100
+ delegate --json models opencode --live # query every model visible to OpenCode
80
101
  delegate --json capabilities
81
102
  ```
82
103
 
@@ -100,6 +121,7 @@ Preview the command without launching a child runtime:
100
121
  ```bash
101
122
  delegate --json dry-run codex safe "Review this repository. Do not edit files."
102
123
  delegate --json dry-run claude safe "Review this repository. Do not edit files."
124
+ delegate --json dry-run opencode safe "Review this repository. Do not edit files."
103
125
  ```
104
126
 
105
127
  Run a read-only review in an isolated throwaway workspace:
@@ -108,6 +130,8 @@ Run a read-only review in an isolated throwaway workspace:
108
130
  delegate codex safe "Review this repository for correctness risks. Do not edit files."
109
131
  delegate claude safe "Review this repository for correctness risks. Do not edit files."
110
132
  delegate grok safe "Review this repository for correctness risks. Do not edit files."
133
+ delegate devin safe "Review this repository for correctness risks. Do not edit files."
134
+ delegate opencode safe "Review this repository for correctness risks. Do not edit files."
111
135
  delegate cursor safe "Review the current diff for regressions. Do not edit files."
112
136
  delegate kimi safe "Review this repository for regressions. Do not edit files."
113
137
  ```
@@ -124,9 +148,21 @@ Run an edit-capable task in a workspace you trust:
124
148
  ```bash
125
149
  delegate cursor work "Fix the parser bug. Run python3 -m unittest tests.test_delegate_parser. Report changed files."
126
150
  delegate claude work "Implement the scoped change and run the named check. Report changed files."
151
+ delegate devin work "Implement the scoped change and run the named check. Report changed files."
152
+ delegate opencode work "Implement the scoped change and run the named check. Report changed files."
127
153
  delegate kimi work "Implement the scoped change and run the named check. Report changed files."
128
154
  ```
129
155
 
156
+ Pin a model per run with `--model` (config alias from `<engine>.models`, or a
157
+ raw model ID passed through verbatim). Droid still accepts a positional alias;
158
+ `--model` works on every engine, including Droid:
159
+
160
+ ```bash
161
+ delegate devin safe --model claude-fable-5 "Review this repository. Do not edit files."
162
+ delegate droid work --model custom:my-model "Implement the scoped change."
163
+ delegate --json dry-run codex safe --model fast "Review this repository. Do not edit files."
164
+ ```
165
+
130
166
  For long foreground runs, add `--progress` to emit bounded parent heartbeats to
131
167
  stderr while keeping final stdout machine-readable, or set `progress.enabled`
132
168
  to `true` in config. Use `--no-progress` to override config for one launch.
@@ -154,7 +190,20 @@ run, use stateless `call` mode:
154
190
  delegate --json codex call "Summarize this context in three bullets."
155
191
  ```
156
192
 
157
- Reasoning effort is provider-aware. Unsupported combinations fail before launch. It changes only the requested model thinking depth/cost/latency; it does not change safe/work/call mode, sandboxing, approvals, or edit capability. Codex/Droid validate effort against model capability metadata, Cursor maps effort to configured model selection, Claude maps to Claude Code `--effort`, and Grok maps to Grok `--effort` (`low`, `medium`, `high`, `xhigh`, `max`). Explicit Codex effort can target the harness default model even when `codex.defaultModel` is unset:
193
+ For multi-step fan-out or gated review flows, use Delegate Workflows. A workflow
194
+ is a Python script that launches normal Delegate child runs, journals progress,
195
+ can pause on approval gates, and can resume from cached child results:
196
+
197
+ ```bash
198
+ python3 bin/delegate.py workflow check review.py
199
+ python3 bin/delegate.py --json workflow run review.py --args '{"files":["src/cli.py"]}' --budget 10
200
+ python3 bin/delegate.py workflow approve wf_0123abcdef45
201
+ ```
202
+
203
+ See [Delegate Workflows](docs/delegate-workflows.md) for the DSL, safety
204
+ limits, config, and gate semantics.
205
+
206
+ Reasoning effort is provider-aware. Unsupported combinations fail before launch. It changes only the requested model thinking depth/cost/latency; it does not change safe/work/call mode, sandboxing, approvals, or edit capability. Codex/Droid validate effort against model capability metadata, Cursor maps effort to configured model selection, Claude maps to Claude Code `--effort`, Grok maps to Grok `--effort` (`low`, `medium`, `high`, `xhigh`, `max`), and OpenCode passes it through as `--variant`. Devin and Kimi do not expose a Delegate reasoning-effort flag. Explicit Codex effort can target the harness default model even when `codex.defaultModel` is unset:
158
207
 
159
208
  ```bash
160
209
  delegate --json dry-run codex safe --reasoning-effort high "Review this repository. Do not edit files."
@@ -218,8 +267,10 @@ Delegate separates three ideas:
218
267
 
219
268
  Defaults are intentionally conservative for review paths:
220
269
 
221
- - `delegate cursor safe`, `delegate codex safe`, `delegate claude safe`, `delegate grok safe`, `delegate droid ALIAS safe`, and `delegate kimi safe` run in an isolated throwaway workspace. 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.
270
+ - `delegate cursor safe`, `delegate codex safe`, `delegate claude safe`, `delegate grok safe`, `delegate devin safe`, `delegate opencode safe`, `delegate droid ALIAS safe`, and `delegate kimi safe` run in an isolated throwaway workspace. 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.
222
271
  - Grok safe mode uses Delegate isolated copy plus Grok read-only sandbox/permission controls (`--sandbox read-only`, `--permission-mode dontAsk` by default). It does not use Grok `plan` mode. Prompts are delivered via Grok `--prompt-file` from a Delegate temp file.
272
+ - Devin safe mode uses Delegate isolated copy plus a Delegate-generated `--agent-config` deny-list for edit/write/exec and `mcp__*`, with Devin `--permission-mode auto`. Work mode uses Devin `--permission-mode dangerous` because Devin print mode rejects unapproved edit/exec tools.
273
+ - OpenCode safe mode uses Delegate's isolated copy plus an `OPENCODE_CONFIG_CONTENT` permission lockdown that allows only read, glob, and grep operations. OpenCode merges this override last, so repository configuration cannot restore write-capable tools. `opencode call --read-only` uses the same lockdown; plain `call` does not.
223
274
  - Claude safe mode invokes `claude -p` with prompt text on stdin, `--permission-mode plan`, `--strict-mcp-config`, Read/Grep/Glob plus selected read-only Bash tools, and `--no-session-persistence` by default. Delegate does not currently prove that Claude Code hooks, plugins, user settings, or other non-MCP customization surfaces are disabled.
224
275
  - `work` mode can edit. By default it runs in the real workspace for backward compatibility.
225
276
 
@@ -246,7 +297,7 @@ To carry uncommitted local work into the worktree instead of stashing it, add
246
297
  the worktree through the same snapshot primitives as safe mode, and tears the
247
298
  worktree down before launching the child if that sync fails.
248
299
 
249
- Safe isolation and `--include-dirty` recreate an untracked symlink only when it is relative, resolves inside the source workspace, and its target is not gitignored; any symlink that fails those checks — an absolute target, an escape out of the tree, or a target that is itself a gitignored secret — is replaced with an inert placeholder file, failing closed on any ambiguity. Delegate reports a warning listing the symlink paths it blocked. In Git repositories with no commits yet, Cursor/Codex/Claude/Droid/Kimi safe isolation falls back to a directory copy because Git cannot create a detached worktree from an unborn `HEAD`.
300
+ Safe isolation and `--include-dirty` recreate an untracked symlink only when it is relative, resolves inside the source workspace, and its target is not gitignored; any symlink that fails those checks — an absolute target, an escape out of the tree, or a target that is itself a gitignored secret — is replaced with an inert placeholder file, failing closed on any ambiguity. Delegate reports a warning listing the symlink paths it blocked. In Git repositories with no commits yet, Cursor/Codex/Claude/Droid/Grok/Devin/OpenCode/Kimi safe isolation falls back to a directory copy because Git cannot create a detached worktree from an unborn `HEAD`.
250
301
 
251
302
  Snapshots and `run-output` redact common credential shapes by default, including authorization headers, bearer/basic tokens, JWT-like strings, and common `token=` / `api_key=` / `password=` values. Use `--no-redact` only when exact output is necessary and safe to display.
252
303
 
@@ -278,6 +329,7 @@ AI_PROFILE delegate ...` uses the base config, or set
278
329
  - [Agent setup](docs/agent-setup.md): human and non-interactive setup flows.
279
330
  - [CLI reference](docs/cli-reference.md): commands, exit codes, and JSON contracts.
280
331
  - [Configuration](docs/configuration.md): config precedence, sections, and provider-neutral aliases.
332
+ - [Delegate Workflows](docs/delegate-workflows.md): workflow DSL, caps, config, and gate semantics.
281
333
  - [Security model](docs/security-model.md): boundaries, limitations, and safe usage.
282
334
  - [Worktrees](docs/worktrees.md): persistent-worktree lifecycle and cleanup.
283
335
  - [Troubleshooting](docs/troubleshooting.md): common failures and checks.
@@ -81,6 +81,18 @@
81
81
  "disableWebSearch": true,
82
82
  "noSubagents": false
83
83
  },
84
+ "devin": {
85
+ "binary": "devin",
86
+ "defaultModel": "swe-1.7",
87
+ "defaultReasoningEffort": null
88
+ },
89
+ "opencode": {
90
+ "binary": "opencode",
91
+ "defaultModel": null,
92
+ "defaultReasoningEffort": null,
93
+ "defaultAgent": null,
94
+ "models": {}
95
+ },
84
96
  "kimi": {
85
97
  "binary": "kimi",
86
98
  "defaultModel": "kimi-code/kimi-for-coding",
@@ -36,6 +36,8 @@ This guide covers both human setup and non-interactive setup for agents or CI jo
36
36
  command -v codex || echo "Codex CLI missing"
37
37
  command -v claude || echo "Claude Code CLI missing"
38
38
  command -v grok || echo "Grok Build CLI missing"
39
+ command -v devin || echo "Devin CLI missing"
40
+ command -v opencode || echo "OpenCode CLI missing"
39
41
  command -v kimi || echo "Kimi Code CLI missing"
40
42
  ```
41
43
 
@@ -94,12 +96,33 @@ When running on Windows through WSL, treat Delegate as a Linux CLI:
94
96
  delegate --json dry-run claude safe --reasoning-effort high "Review only. Do not edit files."
95
97
  delegate --json dry-run grok safe "Review only. Do not edit files."
96
98
  delegate --json dry-run grok safe --reasoning-effort high "Review only. Do not edit files."
99
+ delegate --json dry-run devin safe "Review only. Do not edit files."
100
+ delegate --json dry-run opencode safe "Review only. Do not edit files."
101
+ delegate --json dry-run opencode safe --reasoning-effort high "Review only. Do not edit files."
97
102
  delegate --json dry-run cursor safe "Review only. Do not edit files."
98
103
  delegate --json dry-run droid reviewer safe "Review only. Do not edit files."
99
104
  delegate --json dry-run kimi safe "Review only. Do not edit files."
100
105
  ```
101
106
 
102
- The Codex, Claude, Grok, Cursor, and Kimi dry-runs succeed with the unedited example config when no reasoning effort is requested. Explicit Codex reasoning-effort dry-runs can target the harness default model when no default model is configured. Claude and Grok reasoning effort map to native `--effort` flags. The Droid dry-run validates the alias, so it returns `unconfigured_model` until you replace the `reviewer` placeholder in `config.json` with a real model ID.
107
+ The Codex, Claude, Grok, Devin, OpenCode, Cursor, and Kimi dry-runs succeed with the unedited example config when no reasoning effort is requested. Explicit Codex reasoning-effort dry-runs can target the harness default model when no default model is configured. Claude and Grok reasoning effort map to native `--effort` flags; OpenCode reasoning effort maps to `--variant` without model validation. The Droid dry-run validates the alias, so it returns `unconfigured_model` until you replace the `reviewer` placeholder in `config.json` with a real model ID.
108
+
109
+ ### OpenCode
110
+
111
+ Install OpenCode with the curl installer from [opencode.ai](https://opencode.ai).
112
+ The installer normally writes the binary to `~/.opencode/bin`, which is often
113
+ not on `PATH` in non-interactive shells. Add that directory to `PATH`, or set an
114
+ absolute path in Delegate config:
115
+
116
+ ```json
117
+ {
118
+ "opencode": {
119
+ "binary": "/home/<user>/.opencode/bin/opencode"
120
+ }
121
+ }
122
+ ```
123
+
124
+ Run `opencode auth login` before the first real launch. Delegate uses OpenCode's
125
+ existing global authentication state and does not manage login itself.
103
126
 
104
127
  ## Non-interactive agent setup
105
128
 
@@ -141,6 +164,8 @@ For an orchestrating agent, script, or CI job:
141
164
  command -v codex >/dev/null || exit 3
142
165
  command -v claude >/dev/null || exit 3
143
166
  command -v grok >/dev/null || exit 3
167
+ command -v devin >/dev/null || exit 3
168
+ command -v opencode >/dev/null || exit 3
144
169
  command -v kimi >/dev/null || exit 3
145
170
  ```
146
171
 
@@ -166,7 +191,9 @@ For an orchestrating agent, script, or CI job:
166
191
 
167
192
  ## CI expectations
168
193
 
169
- The required test suite does not need real Cursor, Droid, Codex, Claude, or Kimi binaries. Tests use dry-run paths and fake binaries where needed:
194
+ The required test suite does not need real Cursor, Droid, Codex, Claude, Grok,
195
+ Devin, OpenCode, or Kimi binaries. Tests use dry-run paths and fake binaries
196
+ where needed:
170
197
 
171
198
  ```bash
172
199
  python3 -m compileall -q src tests bin