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.
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/CHANGELOG.md +65 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/PKG-INFO +8 -1
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/README.md +7 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/bin/delegate-profile-shim +1 -1
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/config.example.json +3 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/cli-reference.md +78 -1
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/configuration.md +24 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/delegate-workflows.md +16 -4
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/security-model.md +38 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/worktrees.md +19 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/pyproject.toml +1 -1
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/__init__.py +1 -1
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/argv_builders.py +5 -7
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/cli.py +284 -7
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/cli_parser.py +276 -3
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/command_help.py +124 -1
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/config.py +17 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/constants.py +13 -1
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/describe_payload.py +27 -2
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/harness_discovery.py +60 -1
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/isolation.py +9 -0
- delegate_agent_cli-0.25.0/src/delegate_agent/personas.py +199 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/private_io.py +97 -6
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/profile_guard.py +1 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/prompt_instructions.py +7 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/prompt_transport.py +12 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/request_build.py +525 -75
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/request_models.py +68 -0
- delegate_agent_cli-0.25.0/src/delegate_agent/resume_command.py +920 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/run_metadata.py +11 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/run_registry.py +150 -28
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/run_status.py +14 -4
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/runner.py +110 -8
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/snapshot_view.py +7 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/wait_cancel_commands.py +1 -1
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/workflows/runtime.py +115 -12
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/worktree_execution.py +82 -22
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/worktree_gc.py +19 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/worktree_records.py +78 -7
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/worktree_remove.py +31 -1
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent_cli.egg-info/PKG-INFO +8 -1
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent_cli.egg-info/SOURCES.txt +22 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_command_help.py +2 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_delegate_validation.py +17 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_engine_argv.py +18 -8
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_execution_argv_and_prompt.py +11 -1
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_harness_discovery.py +17 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_kimi_commands.py +5 -2
- delegate_agent_cli-0.25.0/tests/test_persona_capability.py +214 -0
- delegate_agent_cli-0.25.0/tests/test_persona_claude.py +87 -0
- delegate_agent_cli-0.25.0/tests/test_persona_contract.py +79 -0
- delegate_agent_cli-0.25.0/tests/test_persona_framer.py +454 -0
- delegate_agent_cli-0.25.0/tests/test_persona_opencode.py +146 -0
- delegate_agent_cli-0.25.0/tests/test_persona_parser.py +176 -0
- delegate_agent_cli-0.25.0/tests/test_persona_records.py +574 -0
- delegate_agent_cli-0.25.0/tests/test_persona_resolution.py +300 -0
- delegate_agent_cli-0.25.0/tests/test_persona_size_guard.py +185 -0
- delegate_agent_cli-0.25.0/tests/test_persona_validation.py +107 -0
- delegate_agent_cli-0.25.0/tests/test_persona_workflow.py +445 -0
- delegate_agent_cli-0.25.0/tests/test_resume_attachment.py +608 -0
- delegate_agent_cli-0.25.0/tests/test_resume_capture.py +186 -0
- delegate_agent_cli-0.25.0/tests/test_resume_inheritance.py +385 -0
- delegate_agent_cli-0.25.0/tests/test_resume_parser.py +54 -0
- delegate_agent_cli-0.25.0/tests/test_resume_projections.py +87 -0
- delegate_agent_cli-0.25.0/tests/test_resume_refusals.py +140 -0
- delegate_agent_cli-0.25.0/tests/test_resume_size_guard.py +150 -0
- delegate_agent_cli-0.25.0/tests/test_resume_stale.py +172 -0
- delegate_agent_cli-0.25.0/tests/test_resume_trust.py +301 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_retention.py +33 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_run_registry.py +164 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_runner_capture.py +80 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_workflow_commands.py +7 -3
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/CONTRIBUTING.md +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/LICENSE +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/MANIFEST.in +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/SECURITY.md +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/bin/delegate.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/agent-setup.md +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/assets/delegate-agent-header.png +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/development.md +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/live-runtime.md +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/publishing-checklist.md +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/docs/troubleshooting.md +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/examples/task.claude.json +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/examples/task.codex.json +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/examples/task.cursor.json +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/examples/task.droid.json +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/examples/task.grok.json +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/examples/task.judge.json +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/examples/task.kimi.json +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/setup.cfg +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/archived_logs.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/argv_utils.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/bundled_models.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/capability_commands.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/child_failures.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/command_errors.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/config_commands.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/errors.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/git_utils.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/harness_events.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/inspection_commands.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/json_types.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/log_output.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/model_discovery.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/profile_commands.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/profiles.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/reasoning.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/redaction.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/rendering.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/retention.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/run_output_commands.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/safe_workspace.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/seatbelt.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/setup_commands.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/structured_output.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/workflows/__init__.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/workflows/commands.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/workflows/registry.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/workflows/schema.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/workflows/script.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/worktree_commands.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/worktree_mgmt.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/worktree_summary.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent/wsl.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent_cli.egg-info/dependency_links.txt +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent_cli.egg-info/entry_points.txt +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent_cli.egg-info/requires.txt +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/src/delegate_agent_cli.egg-info/top_level.txt +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_capability_commands.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_child_failures.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_codex_pure_sandbox.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_codex_thread_resilience.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_config_commands.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_delegate_help_cli.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_delegate_isolation.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_delegate_parser.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_end_to_end_tracking.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_execution_dry_run.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_execution_worktree_failure_cleanup.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_execution_worktree_preflight.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_execution_worktree_run.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_harness_events.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_inspection_commands.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_model_discovery.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_model_selection_wave1a.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_model_selection_wave1b.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_omp_read_only_behavior.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_packaging.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_profiles.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_pure_call.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_reasoning_capabilities.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_safe_workspace_isolation.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_setup_commands.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_slash_passthrough.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_snapshot_redaction.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_snapshot_rendering.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_snapshot_run_output.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_snapshot_view.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_structured_output.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_tracked_timeout.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_utility_modules.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_wait_cancel_commands.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_wave4_launch_features.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_worktree_list_show.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_worktree_prune_gc.py +0 -0
- {delegate_agent_cli-0.23.0 → delegate_agent_cli-0.25.0}/tests/test_worktree_remove.py +0 -0
- {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.
|
|
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)
|
|
@@ -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. `
|
|
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
|
|
204
|
-
|
|
205
|
-
prompt
|
|
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.
|
|
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"
|
|
@@ -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
|
|
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
|
|