delegation-layer 0.2.0 → 0.3.1

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 (31) hide show
  1. package/README.md +7 -0
  2. package/docs/assets/delegation-layer-hero.jpg +0 -0
  3. package/package.json +1 -1
  4. package/plugins/delegation-layer/.claude-plugin/plugin.json +1 -1
  5. package/plugins/delegation-layer/.codex-plugin/plugin.json +1 -1
  6. package/plugins/delegation-layer/skills/agent-integration/SKILL.md +16 -8
  7. package/plugins/delegation-layer/skills/agent-integration/evals/evals.json +23 -3
  8. package/plugins/delegation-layer/skills/agent-integration/examples/json-results.md +5 -2
  9. package/plugins/delegation-layer/skills/agent-integration/examples/managed-workspace.md +50 -17
  10. package/plugins/delegation-layer/skills/agent-integration/examples/read-only-task.md +3 -1
  11. package/plugins/delegation-layer/skills/agent-integration/references/ccr.md +7 -3
  12. package/plugins/delegation-layer/skills/agent-integration/references/collaboration.md +2 -2
  13. package/plugins/delegation-layer/skills/agent-integration/references/command-reference.md +152 -47
  14. package/plugins/delegation-layer/skills/agent-integration/references/continuation.md +7 -4
  15. package/plugins/delegation-layer/skills/agent-integration/references/interaction.md +6 -5
  16. package/plugins/delegation-layer/skills/agent-integration/references/result-handling.md +66 -3
  17. package/plugins/delegation-layer/skills/agent-integration/references/routing-rule.json +1 -1
  18. package/plugins/delegation-layer/skills/agent-integration/references/workspaces.md +18 -14
  19. package/skills/agent-integration/SKILL.md +16 -8
  20. package/skills/agent-integration/evals/evals.json +23 -3
  21. package/skills/agent-integration/examples/json-results.md +5 -2
  22. package/skills/agent-integration/examples/managed-workspace.md +50 -17
  23. package/skills/agent-integration/examples/read-only-task.md +3 -1
  24. package/skills/agent-integration/references/ccr.md +7 -3
  25. package/skills/agent-integration/references/collaboration.md +2 -2
  26. package/skills/agent-integration/references/command-reference.md +152 -47
  27. package/skills/agent-integration/references/continuation.md +7 -4
  28. package/skills/agent-integration/references/interaction.md +6 -5
  29. package/skills/agent-integration/references/result-handling.md +66 -3
  30. package/skills/agent-integration/references/routing-rule.json +1 -1
  31. package/skills/agent-integration/references/workspaces.md +18 -14
package/README.md CHANGED
@@ -8,6 +8,7 @@ and retrieving results with evidence.
8
8
  · [Example](#ask-naturally)
9
9
  · [Providers](https://github.com/hishamkaram/delegation-layer/blob/main/docs/providers.md)
10
10
  · [Teams](https://github.com/hishamkaram/delegation-layer/blob/main/docs/teams.md)
11
+ · [Start recurring tasks](docs/getting-started.md#recurring-tasks)
11
12
  · [Docs](https://github.com/hishamkaram/delegation-layer/blob/main/docs/README.md)
12
13
 
13
14
  <p align="center">
@@ -55,6 +56,12 @@ for activation and limits.
55
56
  For a manual CLI task, use the packaged
56
57
  [read-only example](skills/agent-integration/examples/read-only-task.md).
57
58
 
59
+ For recurring work, follow the [scheduler walkthrough](docs/getting-started.md#recurring-tasks)
60
+ to start `delegate scheduler serve` in your own terminal or tmux pane, even
61
+ before saving a definition. Agents and manual commands share the CLI's default
62
+ state across projects. The walkthrough covers saving a schedule, inspecting its
63
+ first result and stopping or restarting the host.
64
+
58
65
  ## Help and contributing
59
66
 
60
67
  See [troubleshooting](https://github.com/hishamkaram/delegation-layer/blob/main/docs/troubleshooting.md),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "delegation-layer",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "Multi-provider AI agent delegation CLI and Agent Skill for running bounded coding tasks across provider CLIs.",
5
5
  "keywords": [
6
6
  "ai-agents",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "delegation-layer",
3
3
  "displayName": "Delegation Layer",
4
- "version": "0.2.0",
4
+ "version": "0.3.1",
5
5
  "description": "Consult external AI harnesses and CCR-configured models for reviews, research, implementation, and debate through the resumable Delegate CLI.",
6
6
  "author": {
7
7
  "name": "Hesham Karam",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "delegation-layer",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "Consult external AI harnesses and CCR-configured models for reviews, research, implementation, and debate through the resumable Delegate CLI.",
5
5
  "author": {
6
6
  "name": "Hesham Karam",
@@ -87,11 +87,16 @@ Use a supplied brief or write the worker's bounded assignment and acceptance
87
87
  criteria to a regular file. Do not copy the orchestration request or ask workers
88
88
  to recruit others unless recursive delegation was requested.
89
89
 
90
- Keep the state root outside provider-writable workspaces, provider runtime
91
- directories, and temporary trees they may write. For every task command pass
92
- `--root "${DELEGATE_ROOT:-$HOME/delegation-state}"` directly in that shell
93
- invocation. If the user explicitly requests another root, use that exact path
94
- consistently. Task IDs separate tasks; do not invent per-task roots.
90
+ For ordinary task, schedule, observation, interaction, and continuation commands,
91
+ omit `--root`; the CLI owns default-root resolution for the user's configuration
92
+ context, independently of the project cwd. Do not assemble a default path, use a
93
+ sample path or shell fallback, or treat ambient `DELEGATE_ROOT` as authority.
94
+ Only pass `--root` when the user explicitly supplies a root or existing work has
95
+ an already recorded custom or historical root; preserve that exact path for
96
+ every command concerning that work. Never search other roots for an old task.
97
+ Task IDs separate tasks; do not invent per-task or per-project roots. The state
98
+ root must remain outside provider-writable workspaces, provider runtime
99
+ directories, and temporary trees they may write.
95
100
 
96
101
  Prepare paths and dispatch in one tool invocation; shell variables may not
97
102
  persist between calls. Use saved absolute paths in later calls. Do not use
@@ -125,13 +130,16 @@ original command and intent.
125
130
  ### 5. Observe and collect
126
131
 
127
132
  Follow [observation decisions](references/result-handling.md#observe-and-collect)
128
- with the same root and created task ID:
133
+ with the created task ID, using the CLI default for ordinary work:
129
134
 
130
135
  ```sh
131
- delegate --root "${DELEGATE_ROOT:-$HOME/delegation-state}" status TASK_ID --json
132
- delegate --root "${DELEGATE_ROOT:-$HOME/delegation-state}" collect TASK_ID --watch 5s --json
136
+ delegate status TASK_ID --json
137
+ delegate collect TASK_ID --watch 5s --json
133
138
  ```
134
139
 
140
+ For work bound to an explicit custom or historical root, add its exact
141
+ `--root` to both commands under the [root rule](#3-prepare-separate-paths-and-a-finite-brief).
142
+
135
143
  Apply the owning decision order before waiting: terminal outcomes and concrete
136
144
  errors, cancellation/timeout/interruption, interaction, then pending
137
145
  observation. Keep collection in the foreground until completion or a reported
@@ -10,7 +10,7 @@
10
10
  {
11
11
  "name": "normal-dispatch",
12
12
  "prompt": "Run one bounded task through the available agent provider.",
13
- "expected": ["dispatch --auto", "--json", "save task_id", "status", "collect"]
13
+ "expected": ["dispatch --auto", "omit --root on ordinary commands", "--json", "save task_id", "status", "collect"]
14
14
  },
15
15
  {
16
16
  "name": "model-discovery-when-needed",
@@ -68,9 +68,29 @@
68
68
  "expected": ["use status with returned task_id", "read saved dispatch response if needed", "do not dispatch again to print an exit code", "exactly one admitted task for the assignment"]
69
69
  },
70
70
  {
71
- "name": "supplied-root-across-shell-calls",
71
+ "name": "ambient-root-ignored-across-shell-calls",
72
72
  "prompt": "DELEGATE_ROOT is already set. Consult a separate external agent and answer its questions; each shell tool call starts a new shell.",
73
- "expected": ["use supplied DELEGATE_ROOT on dispatch, status, collect, reply, steer, and continue", "resolve the same root in each shell call", "no invented task-specific root"]
73
+ "expected": ["omit --root on dispatch, status, collect, reply, steer, and continue", "ambient DELEGATE_ROOT has no root-selection authority", "CLI resolves its default in the same user/configuration context", "no assembled default, shell fallback, sample path, or per-task root"]
74
+ },
75
+ {
76
+ "name": "ordinary-root-from-another-project",
77
+ "prompt": "DELEGATE_ROOT is unset. An admitted task was dispatched without --root in project A. Observe and continue it from project B in the same user/configuration context.",
78
+ "expected": ["omit --root on status, collect, and continue", "use the recorded task ID", "CLI default is independent of project cwd", "no path guessed from project A or B", "no search across roots"]
79
+ },
80
+ {
81
+ "name": "explicit-root-across-shell-calls",
82
+ "prompt": "For this isolated test, I explicitly choose the state root /state/custom with spaces. Consult a separate external agent and answer its questions; each shell tool call starts a new shell.",
83
+ "expected": ["pass --root with the exact single argument /state/custom with spaces on dispatch, status, collect, reply, steer, and continue", "quote the root in shell commands", "save and reassign absolute brief and response paths in each needed shell invocation", "no ambient variable or fallback overrides the explicit choice"]
84
+ },
85
+ {
86
+ "name": "historical-root-continuation",
87
+ "prompt": "An eligible predecessor task has recorded historical root /state/legacy with spaces. Continue that exact task and collect its successor. The current CLI default is different.",
88
+ "expected": ["pass the exact recorded --root argument /state/legacy with spaces on continue, status, and collect", "use the exact predecessor and returned successor IDs", "no fresh dispatch", "do not move or search for the task in the default root"]
89
+ },
90
+ {
91
+ "name": "ordinary-schedule-root",
92
+ "prompt": "Create a recurring task in this project, then inspect its definition, history, and execution from another project in the same user/configuration context. No custom state root was requested.",
93
+ "expected": ["omit --root on schedule create, list, show, history, and execution", "keep the definition's own project --cwd", "no per-project root", "do not start a persistent scheduler inside the agent task", "forward any returned scheduler.serve_command argv intact"]
74
94
  },
75
95
  {
76
96
  "name": "pending-without-questions",
@@ -1,8 +1,11 @@
1
1
  # JSON decision sketch
2
2
 
3
+ Use the created task's exact ID as `TASK_ID` and follow the main skill's
4
+ [root rule](../SKILL.md#3-prepare-separate-paths-and-a-finite-brief).
5
+
3
6
  ```sh
4
- delegate --root "${DELEGATE_ROOT:-$HOME/delegation-state}" status "$TASK_ID" --json
5
- delegate --root "${DELEGATE_ROOT:-$HOME/delegation-state}" collect "$TASK_ID" --watch 5s --json
7
+ delegate status TASK_ID --json
8
+ delegate collect TASK_ID --watch 5s --json
6
9
  ```
7
10
 
8
11
  Apply [result handling](../references/result-handling.md) to each response and
@@ -3,14 +3,18 @@
3
3
  Use this example for independent write work that should be isolated in a
4
4
  retained Git worktree. The source must be a Git checkout and the state root
5
5
  must remain outside provider-writable workspaces.
6
+ Commands use the CLI default under the main skill's
7
+ [root rule](../SKILL.md#3-prepare-separate-paths-and-a-finite-brief); preserve any
8
+ explicit custom or recorded historical root on all related commands.
6
9
 
7
10
  ```sh
8
11
  SOURCE="$PWD"
9
- BRIEF="$(mktemp)"
10
- RESPONSE="$(mktemp)"
12
+ BRIEF="$(mktemp)" || exit 1
13
+ RESPONSE="$(mktemp)" || exit 1
11
14
  printf '%s\n' 'Implement the requested change and report the files changed.' >"$BRIEF"
15
+ printf 'Saved response: %s\n' "$RESPONSE"
12
16
 
13
- if delegate --root "${DELEGATE_ROOT:-$HOME/delegation-state}" dispatch --auto \
17
+ if delegate dispatch --auto \
14
18
  --brief "$BRIEF" --cwd "$SOURCE" \
15
19
  --permission workspace-write --isolation git-worktree \
16
20
  --base HEAD --workspace-budget 5m --budget 30m --json >"$RESPONSE"; then
@@ -26,28 +30,51 @@ Read the saved JSON before running another command. When
26
30
  `task_record: "created"`, use its `task_id` as `TASK_ID` below. When no task
27
31
  was created, follow the [result decisions](../references/result-handling.md#managed-workspace-results);
28
32
  do not run task status or collection against that nonexistent record.
33
+ Each later block is a separate shell invocation. Replace `ABS_SAVED_RESPONSE`
34
+ with the printed absolute response path and the ID placeholders with the actual
35
+ returned IDs; reassign the path in each invocation.
29
36
 
30
37
  ```sh
31
- if delegate --root "${DELEGATE_ROOT:-$HOME/delegation-state}" status TASK_ID --json >"$RESPONSE.status"; then
38
+ RESPONSE="ABS_SAVED_RESPONSE"
39
+ if delegate status TASK_ID --json >"$RESPONSE.status"; then
32
40
  status_exit=0
33
41
  else
34
42
  status_exit=$?
35
43
  fi
36
44
  printf '%s\n' "$status_exit" >"$RESPONSE.status.exit"
37
- if delegate --root "${DELEGATE_ROOT:-$HOME/delegation-state}" collect TASK_ID --watch 5s --json >"$RESPONSE.collect"; then
45
+ cat "$RESPONSE.status"
46
+ ```
47
+
48
+ Read the saved status JSON and apply
49
+ [Observe and collect](../references/result-handling.md#observe-and-collect)
50
+ before running another command. Run the collection below only when that
51
+ guidance calls for it.
52
+
53
+ ```sh
54
+ RESPONSE="ABS_SAVED_RESPONSE"
55
+ if delegate collect TASK_ID --watch 5s --json >"$RESPONSE.collect"; then
38
56
  collect_exit=0
39
57
  else
40
58
  collect_exit=$?
41
59
  fi
42
60
  printf '%s\n' "$collect_exit" >"$RESPONSE.collect.exit"
61
+ cat "$RESPONSE.collect"
43
62
  ```
44
63
 
45
- Continue observing that created task when collection exits `3`. Wait for the
46
- workspace to return to `state: retained` and inspect its final capture. Only
47
- after the Lead explicitly chooses release, run:
64
+ Apply that same decision order to the collection JSON before treating exit `3`
65
+ as pending. Cancellation, `failure.code: "task_cancelled"` or
66
+ `failure.next_action: "stop_and_report"` ends pending polling; do not continue
67
+ the task or dispatch a replacement. Bounded
68
+ [failure diagnosis](../references/result-handling.md#failure-diagnosis)
69
+ remains available. Keep observing the same task with a finite watch only when
70
+ the canonical guidance calls for it.
71
+
72
+ Before release, wait for the workspace to return to `state: retained` and inspect
73
+ its final capture. Only after the Lead explicitly chooses release, run:
48
74
 
49
75
  ```sh
50
- if delegate --root "${DELEGATE_ROOT:-$HOME/delegation-state}" workspace release WORKSPACE_ID \
76
+ RESPONSE="ABS_SAVED_RESPONSE"
77
+ if delegate workspace release WORKSPACE_ID \
51
78
  --budget 5m --json >"$RESPONSE.release"; then
52
79
  release_exit=0
53
80
  else
@@ -62,10 +89,11 @@ Follow the same result decisions rather than assuming either response is
62
89
  completed cleanup.
63
90
 
64
91
  Save each response and exit code once. A created task is observed with
65
- `status` first and collected in the foreground. Exit `3` means pending, not
66
- success; continue observing the same task. The Lead reviews the capture and
67
- owns landing any changes. `workspace release` is explicit; no automatic
68
- apply, commit, branch merge, TTL eviction, or provider-CLI fallback occurs.
92
+ `status` first and collected in the foreground, following the canonical
93
+ observation decisions before each next step. Exit `3` alone is not a reason
94
+ to keep polling. The Lead reviews the capture and owns landing any changes.
95
+ `workspace release` is explicit; no automatic apply, commit, branch merge,
96
+ TTL eviction, or provider-CLI fallback occurs.
69
97
 
70
98
  ## Fork from a checkpoint
71
99
 
@@ -77,8 +105,9 @@ owns every response decision.
77
105
 
78
106
  ```sh
79
107
  SOURCE="$PWD"
80
- RESPONSE="$(mktemp)"
81
- if delegate --root "${DELEGATE_ROOT:-$HOME/delegation-state}" checkpoint create \
108
+ RESPONSE="$(mktemp)" || exit 1
109
+ printf 'Saved response: %s\n' "$RESPONSE"
110
+ if delegate checkpoint create \
82
111
  --cwd "$SOURCE" --budget 5m --json >"$RESPONSE.checkpoint"; then
83
112
  checkpoint_exit=0
84
113
  else
@@ -91,9 +120,12 @@ cat "$RESPONSE.checkpoint"
91
120
  Exit `3` with `checkpoint.id` and `next_action: "watch_checkpoint"` means the
92
121
  request was accepted, not captured. Use that `checkpoint.id` as
93
122
  `CHECKPOINT_ID`. Do not run `create` again.
123
+ For the later checkpoint blocks, replace `ABS_SAVED_RESPONSE` with the absolute
124
+ response path printed by this checkpoint invocation.
94
125
 
95
126
  ```sh
96
- if delegate --root "${DELEGATE_ROOT:-$HOME/delegation-state}" checkpoint status CHECKPOINT_ID \
127
+ RESPONSE="ABS_SAVED_RESPONSE"
128
+ if delegate checkpoint status CHECKPOINT_ID \
97
129
  --watch 30s --json >"$RESPONSE.checkpoint.status"; then
98
130
  checkpoint_status_exit=0
99
131
  else
@@ -112,7 +144,8 @@ dispatch example, replacing `--base HEAD` with `--base COMMIT_OID`. Report a
112
144
  When the Lead no longer needs the checkpoint, remove it explicitly:
113
145
 
114
146
  ```sh
115
- if delegate --root "${DELEGATE_ROOT:-$HOME/delegation-state}" checkpoint remove CHECKPOINT_ID \
147
+ RESPONSE="ABS_SAVED_RESPONSE"
148
+ if delegate checkpoint remove CHECKPOINT_ID \
116
149
  --budget 5m --json >"$RESPONSE.checkpoint.remove"; then
117
150
  checkpoint_remove_exit=0
118
151
  else
@@ -2,6 +2,8 @@
2
2
 
3
3
  Run from the intended workspace, outside Delegate's private state root.
4
4
  Use a catalog provider ID in place of `--auto` when a destination was named.
5
+ This example uses the CLI default under the main skill's
6
+ [root rule](../SKILL.md#3-prepare-separate-paths-and-a-finite-brief).
5
7
  Prepare paths and dispatch in this same shell invocation:
6
8
 
7
9
  ```sh
@@ -13,7 +15,7 @@ Inspect the workspace and summarize the current test failures. Do not edit files
13
15
  You are the assigned worker; perform this task without delegating it.
14
16
  EOF
15
17
  printf 'Saved response: %s\n' "$RESPONSE"
16
- if delegate --root "${DELEGATE_ROOT:-$HOME/delegation-state}" dispatch --auto \
18
+ if delegate dispatch --auto \
17
19
  --brief "$BRIEF" --cwd "$WORKSPACE" \
18
20
  --permission read-only --budget 30m --json >"$RESPONSE"; then
19
21
  dispatch_exit=0
@@ -3,6 +3,9 @@
3
3
  Use this reference when asked to consult Claude Code Router (CCR), use one of
4
4
  its configured model aliases, or compare its models with other harnesses.
5
5
  CCR runs Claude Code against a configured third-party or local provider.
6
+ Use the CLI default under the main skill's
7
+ [root rule](../SKILL.md#3-prepare-separate-paths-and-a-finite-brief); preserve any
8
+ explicit custom or recorded historical root for model discovery and dispatch.
6
9
 
7
10
  1. Resolve CCR through `delegate providers --json`; its profile is `ccr:print`.
8
11
  2. Preserve an explicitly requested CCR alias as `--model ALIAS`. Do not replace
@@ -12,9 +15,10 @@ CCR runs Claude Code against a configured third-party or local provider.
12
15
  Choose a suitable configured alias from the available metadata and report
13
16
  the choice. Clarify when the intended model remains ambiguous. If discovery
14
17
  is unavailable and no alias is known, report the blocker; do not guess.
15
- 4. Dispatch through Delegate with `--provider ccr:print --model ALIAS`, the brief,
16
- workspace, permission, finite budget, and `--json`. Use the normal status,
17
- collect, and continuation procedure from the main skill.
18
+ 4. Dispatch through Delegate with
19
+ `--provider ccr:print --model ALIAS`, the brief, workspace, permission, finite
20
+ budget, and `--json`. Use the normal status, collect, and continuation procedure
21
+ from the main skill.
18
22
 
19
23
  CCR requires an explicit alias. Unspecified external collaboration still uses
20
24
  `dispatch --auto`; do not prefer CCR unless the request calls for it. Multiple
@@ -45,7 +45,7 @@ RECEIPTS="$(mktemp -d)" || exit 1
45
45
  # Set these absolute paths and catalog IDs in this same tool invocation.
46
46
  # BRIEF_A and BRIEF_B contain the real independent assignments.
47
47
  (
48
- if delegate --root "${DELEGATE_ROOT:-$HOME/delegation-state}" dispatch --provider "$PROVIDER_A" \
48
+ if delegate dispatch --provider "$PROVIDER_A" \
49
49
  --brief "$BRIEF_A" --cwd "$WORKSPACE_A" \
50
50
  --permission read-only --budget 30m --json \
51
51
  >"$RECEIPTS/review-a.json" 2>"$RECEIPTS/review-a.stderr"; then
@@ -56,7 +56,7 @@ RECEIPTS="$(mktemp -d)" || exit 1
56
56
  printf '%s\n' "$dispatch_exit" >"$RECEIPTS/review-a.exit"
57
57
  ) &
58
58
  (
59
- if delegate --root "${DELEGATE_ROOT:-$HOME/delegation-state}" dispatch --provider "$PROVIDER_B" \
59
+ if delegate dispatch --provider "$PROVIDER_B" \
60
60
  --brief "$BRIEF_B" --cwd "$WORKSPACE_B" \
61
61
  --permission read-only --budget 30m --json \
62
62
  >"$RECEIPTS/review-b.json" 2>"$RECEIPTS/review-b.stderr"; then