delegate-agent-cli 0.23.0__tar.gz → 0.25.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 (168) hide show
  1. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/CHANGELOG.md +65 -0
  2. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/PKG-INFO +8 -1
  3. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/README.md +7 -0
  4. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/bin/delegate-profile-shim +1 -1
  5. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/config.example.json +3 -0
  6. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/cli-reference.md +78 -1
  7. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/configuration.md +24 -0
  8. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/delegate-workflows.md +16 -4
  9. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/security-model.md +38 -0
  10. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/worktrees.md +19 -0
  11. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/pyproject.toml +1 -1
  12. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/__init__.py +1 -1
  13. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/argv_builders.py +5 -7
  14. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/cli.py +284 -7
  15. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/cli_parser.py +276 -3
  16. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/command_help.py +124 -1
  17. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/config.py +17 -0
  18. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/constants.py +13 -1
  19. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/describe_payload.py +27 -2
  20. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/harness_discovery.py +60 -1
  21. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/isolation.py +9 -0
  22. delegate_agent_cli-0.25.0/src/delegate_agent/personas.py +199 -0
  23. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/private_io.py +97 -6
  24. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/profile_guard.py +1 -0
  25. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/prompt_instructions.py +7 -0
  26. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/prompt_transport.py +12 -0
  27. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/request_build.py +525 -75
  28. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/request_models.py +68 -0
  29. delegate_agent_cli-0.25.0/src/delegate_agent/resume_command.py +920 -0
  30. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/run_metadata.py +11 -0
  31. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/run_registry.py +150 -28
  32. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/run_status.py +14 -4
  33. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/runner.py +110 -8
  34. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/snapshot_view.py +7 -0
  35. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/wait_cancel_commands.py +1 -1
  36. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/workflows/runtime.py +115 -12
  37. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/worktree_execution.py +82 -22
  38. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/worktree_gc.py +19 -0
  39. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/worktree_records.py +78 -7
  40. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/worktree_remove.py +31 -1
  41. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent_cli.egg-info/PKG-INFO +8 -1
  42. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent_cli.egg-info/SOURCES.txt +22 -0
  43. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_command_help.py +2 -0
  44. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_delegate_validation.py +17 -0
  45. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_engine_argv.py +18 -8
  46. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_execution_argv_and_prompt.py +11 -1
  47. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_harness_discovery.py +17 -0
  48. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_kimi_commands.py +5 -2
  49. delegate_agent_cli-0.25.0/tests/test_persona_capability.py +214 -0
  50. delegate_agent_cli-0.25.0/tests/test_persona_claude.py +87 -0
  51. delegate_agent_cli-0.25.0/tests/test_persona_contract.py +79 -0
  52. delegate_agent_cli-0.25.0/tests/test_persona_framer.py +454 -0
  53. delegate_agent_cli-0.25.0/tests/test_persona_opencode.py +146 -0
  54. delegate_agent_cli-0.25.0/tests/test_persona_parser.py +176 -0
  55. delegate_agent_cli-0.25.0/tests/test_persona_records.py +574 -0
  56. delegate_agent_cli-0.25.0/tests/test_persona_resolution.py +300 -0
  57. delegate_agent_cli-0.25.0/tests/test_persona_size_guard.py +185 -0
  58. delegate_agent_cli-0.25.0/tests/test_persona_validation.py +107 -0
  59. delegate_agent_cli-0.25.0/tests/test_persona_workflow.py +445 -0
  60. delegate_agent_cli-0.25.0/tests/test_resume_attachment.py +608 -0
  61. delegate_agent_cli-0.25.0/tests/test_resume_capture.py +186 -0
  62. delegate_agent_cli-0.25.0/tests/test_resume_inheritance.py +385 -0
  63. delegate_agent_cli-0.25.0/tests/test_resume_parser.py +54 -0
  64. delegate_agent_cli-0.25.0/tests/test_resume_projections.py +87 -0
  65. delegate_agent_cli-0.25.0/tests/test_resume_refusals.py +140 -0
  66. delegate_agent_cli-0.25.0/tests/test_resume_size_guard.py +150 -0
  67. delegate_agent_cli-0.25.0/tests/test_resume_stale.py +172 -0
  68. delegate_agent_cli-0.25.0/tests/test_resume_trust.py +301 -0
  69. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_retention.py +33 -0
  70. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_run_registry.py +164 -0
  71. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_runner_capture.py +80 -0
  72. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_workflow_commands.py +7 -3
  73. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/CONTRIBUTING.md +0 -0
  74. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/LICENSE +0 -0
  75. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/MANIFEST.in +0 -0
  76. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/SECURITY.md +0 -0
  77. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/bin/delegate.py +0 -0
  78. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/agent-setup.md +0 -0
  79. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/assets/delegate-agent-header.png +0 -0
  80. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/development.md +0 -0
  81. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/live-runtime.md +0 -0
  82. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/publishing-checklist.md +0 -0
  83. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/troubleshooting.md +0 -0
  84. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/examples/task.claude.json +0 -0
  85. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/examples/task.codex.json +0 -0
  86. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/examples/task.cursor.json +0 -0
  87. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/examples/task.droid.json +0 -0
  88. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/examples/task.grok.json +0 -0
  89. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/examples/task.judge.json +0 -0
  90. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/examples/task.kimi.json +0 -0
  91. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/setup.cfg +0 -0
  92. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/archived_logs.py +0 -0
  93. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/argv_utils.py +0 -0
  94. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/bundled_models.py +0 -0
  95. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/capability_commands.py +0 -0
  96. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/child_failures.py +0 -0
  97. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/command_errors.py +0 -0
  98. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/config_commands.py +0 -0
  99. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/errors.py +0 -0
  100. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/git_utils.py +0 -0
  101. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/harness_events.py +0 -0
  102. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/inspection_commands.py +0 -0
  103. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/json_types.py +0 -0
  104. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/log_output.py +0 -0
  105. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/model_discovery.py +0 -0
  106. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/profile_commands.py +0 -0
  107. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/profiles.py +0 -0
  108. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/reasoning.py +0 -0
  109. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/redaction.py +0 -0
  110. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/rendering.py +0 -0
  111. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/retention.py +0 -0
  112. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/run_output_commands.py +0 -0
  113. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/safe_workspace.py +0 -0
  114. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/seatbelt.py +0 -0
  115. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/setup_commands.py +0 -0
  116. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/structured_output.py +0 -0
  117. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/workflows/__init__.py +0 -0
  118. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/workflows/commands.py +0 -0
  119. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/workflows/registry.py +0 -0
  120. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/workflows/schema.py +0 -0
  121. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/workflows/script.py +0 -0
  122. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/worktree_commands.py +0 -0
  123. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/worktree_mgmt.py +0 -0
  124. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/worktree_summary.py +0 -0
  125. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/wsl.py +0 -0
  126. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent_cli.egg-info/dependency_links.txt +0 -0
  127. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent_cli.egg-info/entry_points.txt +0 -0
  128. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent_cli.egg-info/requires.txt +0 -0
  129. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent_cli.egg-info/top_level.txt +0 -0
  130. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_capability_commands.py +0 -0
  131. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_child_failures.py +0 -0
  132. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_codex_pure_sandbox.py +0 -0
  133. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_codex_thread_resilience.py +0 -0
  134. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_config_commands.py +0 -0
  135. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_delegate_help_cli.py +0 -0
  136. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_delegate_isolation.py +0 -0
  137. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_delegate_parser.py +0 -0
  138. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_end_to_end_tracking.py +0 -0
  139. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_execution_dry_run.py +0 -0
  140. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_execution_worktree_failure_cleanup.py +0 -0
  141. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_execution_worktree_preflight.py +0 -0
  142. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_execution_worktree_run.py +0 -0
  143. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_harness_events.py +0 -0
  144. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_inspection_commands.py +0 -0
  145. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_model_discovery.py +0 -0
  146. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_model_selection_wave1a.py +0 -0
  147. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_model_selection_wave1b.py +0 -0
  148. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_omp_read_only_behavior.py +0 -0
  149. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_packaging.py +0 -0
  150. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_profiles.py +0 -0
  151. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_pure_call.py +0 -0
  152. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_reasoning_capabilities.py +0 -0
  153. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_safe_workspace_isolation.py +0 -0
  154. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_setup_commands.py +0 -0
  155. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_slash_passthrough.py +0 -0
  156. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_snapshot_redaction.py +0 -0
  157. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_snapshot_rendering.py +0 -0
  158. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_snapshot_run_output.py +0 -0
  159. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_snapshot_view.py +0 -0
  160. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_structured_output.py +0 -0
  161. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_tracked_timeout.py +0 -0
  162. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_utility_modules.py +0 -0
  163. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_wait_cancel_commands.py +0 -0
  164. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_wave4_launch_features.py +0 -0
  165. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_worktree_list_show.py +0 -0
  166. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_worktree_prune_gc.py +0 -0
  167. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_worktree_remove.py +0 -0
  168. {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_wsl_guardrails.py +0 -0
@@ -5,6 +5,69 @@ 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
+ ## [Unreleased]
9
+
10
+ ## [0.25.0] - 2026-08-01
11
+
12
+ ### Added
13
+
14
+ - Named personas: `--persona` / `--no-persona` / `--allow-repo-persona` on
15
+ every engine's safe/work launch (and dry-run), input-json `persona` /
16
+ `allowRepoPersona` keys, and workflow `agent(persona=...)` with the resolved
17
+ persona digest pinned into the structural cache key so an edited persona is
18
+ a cache miss by design.
19
+ - `delegate personas [--json]` listing (schema `delegate.personas.v1`) with
20
+ workspace-shadowing metadata and per-file invalid rows; read-only allowlisted
21
+ in both the profile guard and the shell shim.
22
+ - Persona transports: claude work uses `--append-system-prompt-file` with a
23
+ private 0600 file when discovery positively proves current support (probe
24
+ recognizes both the long and the collapsed `--append-system-prompt[-file]`
25
+ help spellings); opencode merges a synthetic `delegate-persona` agent into
26
+ the effective config without clobbering profile keys; every other engine
27
+ prepends. Safe mode always prepends, with the persona placed before the
28
+ safe policy so the safety text keeps recency.
29
+ - `persona.txt` as a private durable run artifact with manifest, snapshot,
30
+ and runs-summary projection; resume replays recorded persona bytes through
31
+ the target engine's transport, `--persona` re-resolves, `--no-persona`
32
+ drops.
33
+
34
+ ### Changed
35
+
36
+ - The central framer is now the sole prompt composer: cursor/droid/kimi argv
37
+ builders no longer self-prefix safe policy text, user and persona bytes are
38
+ joined verbatim, and persistent/attached worktree notes are tracked
39
+ structurally on the request rather than inferred from prompt content.
40
+ - Slash-passthrough prompts on persistent or attached worktree runs carry the
41
+ Delegate-owned worktree and forbid-commit notes ahead of the slash command,
42
+ matching v0.24.0 behavior; all other slash payloads remain byte-verbatim.
43
+
44
+ ### Security
45
+
46
+ - Persona resolution walks `.delegate/personas` component-by-component over
47
+ `O_NOFOLLOW` descriptors anchored at the source workspace or home, refusing
48
+ symlinked parents and leaves; strict UTF-8, C0 refusal, and a 64 KiB cap.
49
+ - Resume persona replay reads only the fixed `persona.txt` artifact with a
50
+ required, verified sha256 digest; manifest data cannot redirect the read.
51
+ - The claude native persona gate fails closed: probe errors, timeouts, and
52
+ unrecognized banners fall back to prepend so an older binary never receives
53
+ an unknown flag. Dry-run never probes.
54
+ - Workflow persona digests travel across the child seam and both sides fail
55
+ closed on mismatch without caching.
56
+
57
+ ## [0.24.0] - 2026-07-31
58
+
59
+ ### Added
60
+
61
+ - Added `delegate resume` for relaunching terminal Runs with a bounded,
62
+ untrusted continuation built from the original prompt and prior result.
63
+ Resume preserves compatible launch settings, supports explicit cross-engine
64
+ resumes, and attaches to an existing persistent worktree with a live cleanup
65
+ lease rather than creating a second worktree.
66
+ - Added private `prompt.txt` capture for new tracked Runs so their original
67
+ prompts can be resumed without placing prompt text in the Manifest or
68
+ Snapshot. Legacy records without that capture fail closed with a clear
69
+ `resume_prompt_unavailable` error.
70
+
8
71
  ## [0.23.0] - 2026-07-30
9
72
 
10
73
  ### Added
@@ -769,6 +832,8 @@ Usage-audit fix wave: 82 sessions and 1,241 delegate invocations from one week o
769
832
 
770
833
  - Releases before 0.1.3 predate this changelog.
771
834
 
835
+ [0.25.0]: https://github.com/treygoff24/delegate-agent/compare/v0.24.0...v0.25.0
836
+ [0.24.0]: https://github.com/treygoff24/delegate-agent/compare/v0.23.0...v0.24.0
772
837
  [0.23.0]: https://github.com/treygoff24/delegate-agent/compare/v0.22.0...v0.23.0
773
838
  [0.22.0]: https://github.com/treygoff24/delegate-agent/compare/v0.21.0...v0.22.0
774
839
  [0.21.0]: https://github.com/treygoff24/delegate-agent/compare/v0.20.0...v0.21.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: delegate-agent-cli
3
- Version: 0.23.0
3
+ Version: 0.25.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
@@ -332,6 +332,7 @@ delegate runs --recent
332
332
  delegate ps # active and stale tracked runs
333
333
  delegate snapshot <alias-or-runId>
334
334
  delegate run-output <alias-or-runId>
335
+ delegate resume <alias-or-runId> "Continue from the previous result and run the tests."
335
336
  delegate runs prune --dry-run # preview GC of terminal run records older than 30 days
336
337
  ```
337
338
 
@@ -341,6 +342,12 @@ newest codex run and `delegate run-output codex:glm` the newest matching
341
342
  model. Envelopes echo `requestedHandle`/`resolvedHandle`/`resolutionKind` so you
342
343
  can confirm which run you addressed.
343
344
 
345
+ `resume` creates a new Run from a terminal source Run. It carries forward the
346
+ source mode and compatible launch settings, places the prior prompt and bounded
347
+ result before your new instructions, and attaches to an existing persistent
348
+ worktree instead of creating another one. Use `--dry-run` to inspect the
349
+ resolved launch without creating a Run.
350
+
344
351
  `run-output` defaults to the best available parent-facing output: a completion
345
352
  report when present, a recovered final assistant message when possible, or
346
353
  bounded stdout/stderr diagnostics. Use `--completion-report` when you want that
@@ -299,6 +299,7 @@ delegate runs --recent
299
299
  delegate ps # active and stale tracked runs
300
300
  delegate snapshot <alias-or-runId>
301
301
  delegate run-output <alias-or-runId>
302
+ delegate resume <alias-or-runId> "Continue from the previous result and run the tests."
302
303
  delegate runs prune --dry-run # preview GC of terminal run records older than 30 days
303
304
  ```
304
305
 
@@ -308,6 +309,12 @@ newest codex run and `delegate run-output codex:glm` the newest matching
308
309
  model. Envelopes echo `requestedHandle`/`resolvedHandle`/`resolutionKind` so you
309
310
  can confirm which run you addressed.
310
311
 
312
+ `resume` creates a new Run from a terminal source Run. It carries forward the
313
+ source mode and compatible launch settings, places the prior prompt and bounded
314
+ result before your new instructions, and attaches to an existing persistent
315
+ worktree instead of creating another one. Use `--dry-run` to inspect the
316
+ resolved launch without creating a Run.
317
+
311
318
  `run-output` defaults to the best available parent-facing output: a completion
312
319
  report when present, a recovered final assistant message when possible, or
313
320
  bounded stdout/stderr diagnostics. Use `--completion-report` when you want that
@@ -134,7 +134,7 @@ _delegate_is_readonly_request() {
134
134
  esac
135
135
  done
136
136
  case "$_cmd" in
137
- profiles|runs|ps|run-output|describe|snapshot|agent-help|help|--help|-h|--version)
137
+ profiles|runs|ps|run-output|describe|snapshot|agent-help|personas|help|--help|-h|--version)
138
138
  return 0
139
139
  ;;
140
140
  models)
@@ -8,6 +8,9 @@
8
8
  "rawLogDays": 7
9
9
  }
10
10
  },
11
+ "personas": {
12
+ "forceTransport": null
13
+ },
11
14
  "cursor": {
12
15
  "argvPrefix": [
13
16
  "agent"
@@ -15,6 +15,46 @@ Use `delegate --help` for the exact command list from the installed version. Glo
15
15
  --group NAME Tag a launch/run-input request with a lightweight group ([A-Za-z0-9._-]{1,64}).
16
16
  ```
17
17
 
18
+ ## Personas
19
+
20
+ Named personas are UTF-8 Markdown files resolved from the source workspace:
21
+ `.delegate/personas/<name>.md` shadows `~/.delegate/personas/<name>.md`. Names
22
+ must match `[A-Za-z0-9][A-Za-z0-9._-]{0,63}`; files are regular, non-symlink
23
+ files no larger than 64 KiB and are rejected on invalid UTF-8 or disallowed C0
24
+ controls. The workspace-local directory is not VCS-shared by default; teams
25
+ that intentionally version a persona must force-add that individual file.
26
+
27
+ ```bash
28
+ delegate personas
29
+ delegate --json personas
30
+ delegate claude work --persona editor "Review chapter 3"
31
+ delegate codex safe --persona editor --allow-repo-persona "Review the diff"
32
+ delegate resume --persona editor <handle> "Continue with the requested fixes"
33
+ delegate resume --no-persona <handle> "Continue without the recorded persona"
34
+ ```
35
+
36
+ `--persona NAME`, `--no-persona`, and `--allow-repo-persona` are shared launch
37
+ options. A workspace-local persona is refused in safe mode unless explicitly
38
+ allowed. Resolution logs `persona: NAME (workspace|global)` to stderr. Personas
39
+ are not accepted for call, read-only call, `--pass-through`, or slash-passthrough
40
+ prompts. Input JSON uses `persona` (string or null) and `allowRepoPersona`
41
+ (boolean).
42
+
43
+ `delegate --json personas` returns schema `delegate.personas.v1` with sorted rows
44
+ containing `name`, `source`, `sizeBytes`, and an escaped bounded `preview`.
45
+ Invalid files remain visible with an `invalid` reason; a workspace row that
46
+ shadows a global row also includes `shadowsGlobal: true`.
47
+
48
+ Work-mode transport is prepend for most engines, Claude native-file only when
49
+ the discovery cache proves `--append-system-prompt-file` (otherwise prepend
50
+ with a warning), and OpenCode agent-config merge. OpenCode preserves existing
51
+ root keys, agent keys, and prompts, appending the persona after an existing
52
+ agent prompt. Safe mode always prepends. Claude native-file keeps the persona
53
+ body out of argv, dry-run JSON, and the manifest; prepend engines using argv
54
+ transport (Cursor, Kimi, and Oh My Pi) expose it in the live process argv.
55
+ Tracked runs retain it only in the private
56
+ `persona.txt` artifact.
57
+
18
58
  ## Commands
19
59
 
20
60
  ### Direct runtime commands
@@ -420,7 +460,7 @@ delegate [--json] workflow save <script.py> --name NAME
420
460
  - `run` launches a detached supervisor; `--dry-run` renders planned stubs
421
461
  without launching child agents or consuming real budget. Each entry in
422
462
  `runTree.calls` includes the resolved `model`, `effort`, `fast`, `isolation`,
423
- and UTF-8 `promptBytes`; Cursor/Kimi prompts over 102400 bytes add a warning
463
+ and UTF-8 `promptBytes`; Cursor/Kimi/OMP prompts over 102400 bytes add a warning
424
464
  before their argv transport limit can fail a real run.
425
465
  - `--resume` replays the journal, adopts matching child runs by workflow agent
426
466
  key, and continues from missing work.
@@ -935,10 +975,47 @@ delegate runs prune [--older-than DAYS] [--dry-run]
935
975
  delegate ps [--harness HARNESS] [--group NAME] [--limit N]
936
976
  delegate snapshot [--latest HARNESS] [--no-redact] <handle>
937
977
  delegate run-output [--latest HARNESS] <handle> [--completion-report] [--stdout] [--stderr] [--tail N] [--max-chars N] [--raw] [--no-redact]
978
+ delegate resume [--engine ENGINE] [--model MODEL] [--reasoning-effort LEVEL] [--timeout SEC] [--dry-run] <handle> [extra instructions...]
938
979
  delegate wait <handle>... [--latest HARNESS] [--group NAME] [--timeout SEC] [--interval SEC] [--completion-report]
939
980
  delegate cancel <handle>...
940
981
  ```
941
982
 
983
+ `delegate resume` relaunches a terminal Run as a new Run. It accepts
984
+ `succeeded`, `failed`, `cancelled`, and stale Runs; an effectively running Run
985
+ is refused. A successful source requires extra instructions. The continuation
986
+ contains the original prompt, then a bounded prior-run Completion Report (or a
987
+ Snapshot digest), then the new instructions last. Prior-run content is framed
988
+ as untrusted data and is disclosed to the target Harness, including on a
989
+ cross-engine resume. Resume options must appear before the handle; trailing
990
+ tokens are continuation instructions.
991
+
992
+ The new Run inherits source settings according to this table. `--engine` and
993
+ the listed resume flags must precede the handle; `--group` and
994
+ `--auth-profile` are global flags and therefore precede `resume`. A persistent
995
+ worktree source is resumed by attaching to its existing worktree rather than
996
+ creating a second one. The attachment is a live lease: `worktree remove`,
997
+ `worktree prune`, and `worktree gc` refuse or skip the worktree while the
998
+ attached Run may still be active. `--dry-run` resolves the continuation without
999
+ creating a Run or writing a prompt record.
1000
+
1001
+ | Field | Source manifest key | Override flag | Absent or legacy behavior | Cross-engine rule |
1002
+ | --- | --- | --- | --- | --- |
1003
+ | Engine | `engine`, falling back to `harness` | `--engine` | A missing or unknown source engine refuses resume. | The selected engine becomes the target; engine-scoped fields below may drop. |
1004
+ | Mode | `mode` | None; v1 does not override mode. | A missing or invalid mode refuses resume. | Retained unchanged. |
1005
+ | Model selection | `modelAlias`, then `modelRequested`, `modelResolved`, then `model` | `--model` | No usable key uses the target engine configuration default and emits a note. | Source model selection drops; pass `--model` to pin a target model. |
1006
+ | Reasoning effort | `requestedReasoningEffort`, then `resolvedReasoningEffort`, together with `reasoningEffortSource` | `--reasoning-effort` | Missing effort uses the target default and emits a note. A source value from configuration is re-resolved through target capability/configuration; only `cli` and `input-json` source intent is inherited directly. | Source effort drops with a note; an explicit override remains valid. |
1007
+ | Fast tier | `requestedFast` | `--fast` or `--no-fast` | Omitted leaves fast unspecified. | Inherited only for a same-engine Codex resume. Other targets drop it; non-Codex targets emit a drop note when a source value is present. |
1008
+ | Progress intent | `progressRequested` (`on`, `off`, or omitted) | `--progress` or `--no-progress` | Omitted uses target progress configuration and emits a note; only `on` and `off` are inherited. | Retained; progress intent is not engine-specific. |
1009
+ | Timeout | `timeoutSeconds` | `--timeout` | Omitted uses the target timeout default and emits a note. A present value must be a positive integer (an integral JSON float is accepted). | Retained. |
1010
+ | Output schema | Inline `outputSchema` text | `--output-schema PATH` or `--no-output-schema` | Omitted means no schema. Stored text is re-materialized privately only during normal launch. | Only Codex inherits inline schema text. Other engines soft-drop it with a note before output-schema validation. |
1011
+ | OpenCode agent | `agent` | None | Omitted means no agent selection. | Inherited only for a same-engine OpenCode resume; otherwise dropped with a note. |
1012
+ | Workspace cwd / execution cwd | `cwd`; persistent records also derive `executionCwd`, branch, and source Git root | None (`--cwd` selects the registry workspace and must match recorded `cwd`) | Missing `cwd` falls back to the selected registry workspace; missing persistent-worktree metadata causes attachment validation to refuse. | Retained as workspace context; an attach uses the validated existing worktree rather than copying `executionCwd` into a new worktree. |
1013
+ | Isolation / lifecycle | `isolationMode`; persistent detection also reads `isolationLifecycle`, `preservedWorkspace`, `worktreeStatus`, and `worktreeAttachment` | None; `--isolation` is rejected for resume. | Missing ordinary `isolationMode` uses target isolation configuration and emits a note. | Retained. Persistent or attached sources become an `attached` execution lifecycle. |
1014
+ | Group | `group` | Global `--group` | Omitted uses the ungrouped target default and emits a note. | Retained. |
1015
+ | Auth profile | `authProfile` | Global `--auth-profile` | Omitted uses target profile detection/default and emits a note. | Retained. |
1016
+ | Forbid commit | `commitPolicy.forbidCommit` when exactly `true` | None | Omitted or any other value leaves commit prohibition off. | Retained. |
1017
+ | Include dirty | `includeDirty` | `--include-dirty` | Source and explicit values are creation-only and are dropped for ordinary resume with a note. | Retained only as a drop decision; on a persistent/attached source, explicit `--include-dirty` is rejected because attachment does not create or sync a worktree. |
1018
+
942
1019
  `delegate runs` defaults to recent runs. `--active` preserves the legacy active view and includes both live `running` runs and `stale` runs. Use `--running` for only live tracked processes and `--stale` for runs recorded as running whose PID is missing or dead. `--active`, `--running`, `--stale`, and `--recent` are mutually exclusive. `--group NAME` filters by launch group and the runs table shows a `group` column when any visible run has one.
943
1020
  `delegate ps` is the shorter first-class form of `delegate runs --active` and
944
1021
  accepts the same harness, group, and limit selectors.
@@ -201,6 +201,30 @@ reasoning defaults.
201
201
 
202
202
  ## Sections
203
203
 
204
+ ### `personas`
205
+
206
+ Persona files are workspace-local by design, not VCS-shared configuration:
207
+ `.delegate/personas/*.md` shadows the same name under
208
+ `~/.delegate/personas/`. The `delegate personas` command lists both scopes
209
+ without exposing persona bodies in JSON previews. Because `.delegate` is
210
+ normally excluded, teams that intentionally version a persona must force-add
211
+ the individual file; the resolution scope remains workspace-local.
212
+
213
+ ```json
214
+ {
215
+ "personas": {
216
+ "forceTransport": null
217
+ }
218
+ }
219
+ ```
220
+
221
+ `forceTransport` is optional and accepts `null`, `prepend`, `native-file`, or
222
+ `agent-config`. It is an explicit transport pin, not a capability probe;
223
+ `native-file` is appropriate only when the configured Claude binary supports
224
+ `--append-system-prompt-file`, and `agent-config` is meaningful for OpenCode.
225
+ Safe mode never uses native persona channels. A workspace-local persona is
226
+ refused in safe mode unless the launch includes `--allow-repo-persona`.
227
+
204
228
  ### `tracking`
205
229
 
206
230
  Controls local run recording.
@@ -64,7 +64,7 @@ workflow result in `result.json`. Injected globals are `agent`, `pipeline`,
64
64
 
65
65
  ## Core DSL
66
66
 
67
- - `agent(prompt, engine=None, mode=None, model=None, effort=None, schema=None, label=None, phase=None, isolation=None, passthrough=False, timeout=None, retries=None, fast=None)` launches a real Delegate child run and returns parent-facing output, a validated schema object, or `None`. `fast=True` requests Codex Fast, `fast=False` requests Standard, and `None` inherits; non-Codex fallback candidates ignore this Codex-only preference. `fast` is appended to preserve positional compatibility with existing workflow scripts.
67
+ - `agent(prompt, engine=None, mode=None, model=None, effort=None, schema=None, label=None, phase=None, isolation=None, passthrough=False, timeout=None, retries=None, fast=None, persona=None, allow_repo_persona=False)` launches a real Delegate child run and returns parent-facing output, a validated schema object, or `None`. `fast=True` requests Codex Fast, `fast=False` requests Standard, and `None` inherits; non-Codex fallback candidates ignore this Codex-only preference. `persona` resolves one named persona from the source workspace; `allow_repo_persona=True` opts into workspace-local personas in safe mode.
68
68
  - `pipeline(items, stage1, ...)` runs per-item stage chains with no inter-stage barrier. A throwing stage drops that item to `None` and skips later stages for that item.
69
69
  - `parallel([lambda: ...])` is a barrier and preserves order. Ordinary item failures become `None` slots; gate checkpoints propagate to the supervisor.
70
70
  - `phase(title)` emits a progress event.
@@ -76,6 +76,17 @@ Workflow `engine` values and `workflows.engineCaps` keys accept `cursor`,
76
76
  `droid`, `codex`, `claude`, `grok`, `devin`, `opencode`, `pi`, `omp`, and
77
77
  `kimi`.
78
78
 
79
+ ### Persona digest pinning
80
+
81
+ When `agent(persona="editor")` first resolves `editor.md`, the workflow
82
+ structural key and `agent_started` journal event include the resolved bytes'
83
+ SHA-256 digest. Replay therefore returns the result only for the same persona
84
+ version: editing the file creates a cache miss instead of mixing two versions
85
+ under the same name. Dry-runs expose persona name/source/digest/byte count but
86
+ never write the persona body. Child input JSON carries `persona` and
87
+ `allowRepoPersona`; the normal run manifest and inspection projections expose
88
+ non-sensitive persona metadata only.
89
+
79
90
  ## Gates and resume
80
91
 
81
92
  A workflow gate checkpoints the whole workflow tree, not just the nested child
@@ -200,9 +211,10 @@ python3 bin/delegate.py --json workflow run review.py \
200
211
  ```
201
212
 
202
213
  The preview's `runTree.calls` records each call's resolved `model`, `effort`,
203
- `fast`, `isolation`, and UTF-8 `promptBytes`. Cursor and Kimi calls whose prompts
204
- exceed 102400 bytes also carry a warning because those harnesses transport the
205
- prompt in argv.
214
+ `fast`, `isolation`, and UTF-8 `promptBytes` (the raw user prompt plus resolved
215
+ persona text). Cursor, Kimi, and OMP calls whose user-plus-resolved-persona input
216
+ exceeds 102400 bytes carry a warning; the final materialized prompt is checked
217
+ again before exec.
206
218
 
207
219
  ## CLI
208
220
 
@@ -13,6 +13,31 @@ Delegate controls:
13
13
  - Prompt framing that tells sub-agents to review available skills and, in safe mode, avoid edits.
14
14
  - Local run metadata under `.delegate/` for tracked runs.
15
15
 
16
+ ### Persona boundary
17
+
18
+ Personas are untrusted prompt text, not policy. Delegate validates the name,
19
+ path containment, file type, UTF-8, byte limit, and C0 controls, but does not
20
+ trust persona instructions. Safe-mode framing deliberately places the safe
21
+ advisory after the persona (`skill -> persona -> safe`) so a persona cannot
22
+ replace the safety text by recency. Native persona channels are work-only;
23
+ safe mode always prepends.
24
+
25
+ Workspace-local personas live under `.delegate/personas/`, which is local state
26
+ and is not VCS-shared. Safe mode refuses them by default; use
27
+ `--allow-repo-persona` only when the source workspace is trusted. Global
28
+ personas are resolved from `~/.delegate/personas/` when no workspace file
29
+ shadows the name. Call, read-only call, pass-through, and slash-passthrough
30
+ surfaces refuse personas rather than silently changing their prompt contract.
31
+
32
+ Claude native-file transport is discovery-gated and writes a private 0600 file;
33
+ an absent, stale, or unproven capability falls back to prepend. OpenCode merges
34
+ into the effective config without destroying existing root keys, agent fields,
35
+ or prompt text; malformed config falls back to prepend with a warning. Claude
36
+ native-file keeps persona bodies out of argv, dry-run output, and manifests;
37
+ prepend engines using argv transport expose them in the live process argv.
38
+ Tracked runs retain
39
+ the resolved bytes only in private `persona.txt`, which is removed with the run.
40
+
16
41
  Delegate does not control:
17
42
 
18
43
  - The child runtime's implementation.
@@ -200,6 +225,19 @@ Persistent worktree isolation is not a security sandbox. It does not prevent:
200
225
  - Writes to absolute paths outside the worktree.
201
226
  - Actions taken through authenticated tools, MCP servers, browser sessions, or external CLIs.
202
227
 
228
+ `delegate resume` reads the initial manifest and `prompt.txt` outside the Registry
229
+ lock with bounded, no-follow, single-link readers. It re-checks status and reads
230
+ the report or snapshot history inside the lock using those same readers.
231
+ Completion Reports are used only when the source Run is terminal under the lock;
232
+ otherwise resume falls back to an atomic Snapshot digest. Prompt and report text are untrusted data, not
233
+ Delegate instructions, and are disclosed to the target Harness as part of the
234
+ continuation. `prompt.txt` is verbatim, unredacted, child-tamperable, retained
235
+ until `delegate runs prune`, and an `--engine` override can disclose it to a
236
+ different provider. A persistent-worktree resume attaches to the existing path
237
+ by deriving and validating its Registry record; it does not weaken
238
+ safe/worktree path checks or create a replacement worktree when the original
239
+ has moved.
240
+
203
241
  ## Config and secret hygiene
204
242
 
205
243
  - Keep real config in `~/.delegate/config.json` or a private `DELEGATE_CONFIG` path. Repository-local `.delegate/config.json` is not loaded implicitly.
@@ -83,6 +83,25 @@ Delegate also creates a local branch named like:
83
83
  delegate/<label>-<short-run-id>
84
84
  ```
85
85
 
86
+ ### Resume attachment
87
+
88
+ To continue a terminal Run that used a persistent worktree, use the Run handle
89
+ rather than launching a second persistent worktree:
90
+
91
+ ```bash
92
+ delegate resume <alias-or-runId> "Continue the implementation and run the tests."
93
+ ```
94
+
95
+ The resumed Run attaches to the existing execution path and records an
96
+ attachment lease. It does not create a new branch, copy dirty files, or derive
97
+ a second persistent-worktree record. The lease is released when the attached
98
+ Run reaches a terminal state. Worktree removal, pruning, and registry repair
99
+ refuse or skip a path with a live attached Run; inspect or wait for that Run
100
+ before cleanup. A missing, moved, symlinked, unregistered, or branch-mismatched
101
+ source worktree is refused rather than recreated implicitly. `--include-dirty`
102
+ is rejected on attached resume because it only controls creation-time
103
+ synchronization; ordinary resume drops the flag with a note.
104
+
86
105
  ## Preflight requirements
87
106
 
88
107
  Persistent worktree work-mode runs require:
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "delegate-agent-cli"
7
- version = "0.23.0"
7
+ version = "0.25.0"
8
8
  description = "A tiny CLI for delegating bounded agent tasks across coding-agent runtimes."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1,5 +1,5 @@
1
1
  """Delegate Agent CLI package."""
2
2
 
3
- VERSION = "0.23.0"
3
+ VERSION = "0.25.0"
4
4
 
5
5
  __all__ = ["VERSION"]
@@ -20,6 +20,7 @@ from delegate_agent.prompt_transport import (
20
20
  CURSOR_PROMPT_REDACTION,
21
21
  DEVIN_AGENT_CONFIG_ARG_PLACEHOLDER,
22
22
  DROID_PROMPT_FILE_ARG_PLACEHOLDER,
23
+ PERSONA_FILE_ARG_PLACEHOLDER,
23
24
  PROMPT_FILE_ARG_PLACEHOLDER,
24
25
  PROMPT_TRANSPORT_ARGV,
25
26
  PROMPT_TRANSPORT_FILE,
@@ -176,8 +177,6 @@ def build_cursor_argv(
176
177
  argv = [*prefix, "--workspace", workspace, "-p", "--trust"]
177
178
  if mode == MODE_WORK:
178
179
  argv.extend(["--approve-mcps", "--force"])
179
- elif mode == MODE_SAFE:
180
- prompt = prefix_cursor_safe_prompt(prompt)
181
180
  elif mode == MODE_CALL:
182
181
  # Call defaults to work-level capability ("work minus a repo"); --read-only
183
182
  # drops the write flags for the stateless judge/completion contract.
@@ -209,8 +208,6 @@ def build_droid_argv(
209
208
  argv = [binary, "exec", "--cwd", workspace]
210
209
  if mode == MODE_WORK:
211
210
  argv.append("--skip-permissions-unsafe")
212
- elif mode == MODE_SAFE:
213
- prompt = prefix_droid_safe_prompt(prompt)
214
211
  elif mode == MODE_CALL:
215
212
  if not call_read_only:
216
213
  argv.append("--skip-permissions-unsafe")
@@ -246,9 +243,7 @@ def build_kimi_argv(
246
243
  ) -> list[str]:
247
244
  _reject_pure("kimi", mode, pure)
248
245
  argv = [str(kimi["binary"])]
249
- if mode == MODE_SAFE:
250
- prompt = prefix_kimi_safe_prompt(prompt)
251
- elif mode not in (MODE_WORK, MODE_CALL):
246
+ if mode not in (MODE_SAFE, MODE_WORK, MODE_CALL):
252
247
  validate_mode(mode)
253
248
  if model:
254
249
  argv.extend(["--model", model])
@@ -270,6 +265,7 @@ def build_claude_argv(
270
265
  call_read_only: bool = False,
271
266
  pure: bool = False,
272
267
  output_schema: str | None = None,
268
+ persona_file: bool = False,
273
269
  ) -> list[str]:
274
270
  _reject_pure("claude", mode, pure, supported=True)
275
271
  if pure or output_schema is not None:
@@ -342,6 +338,8 @@ def build_claude_argv(
342
338
  argv.extend(["--model", model])
343
339
  if reasoning_effort is not None:
344
340
  argv.extend(["--effort", reasoning_effort])
341
+ if persona_file:
342
+ argv.extend(["--append-system-prompt-file", PERSONA_FILE_ARG_PLACEHOLDER])
345
343
  return argv
346
344
 
347
345