duet-cli 0.2.9__tar.gz → 0.2.11__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: duet-cli
3
- Version: 0.2.9
3
+ Version: 0.2.11
4
4
  Summary: Two CLI agents in conversation. One Python file. Stdlib only.
5
5
  Author: Volkan Altan
6
6
  License-Expression: MIT
@@ -110,9 +110,10 @@ Then invoke `/duet` in the OpenCode TUI (or `opencode run --command duet "..."`
110
110
  non-interactively). Like the other plugins it shells out to the `duet` CLI, so
111
111
  install that first and make sure `command -v duet` passes in OpenCode's shell.
112
112
  The command runs on OpenCode's `build` agent; plain `/duet` runs the same
113
- `claude -p /review` kickoff, and `/duet 'npm test 2>&1' --turns 4` seeds from
114
- any command. Custom worktree overrides are constructed conditionally, matching
115
- the Claude and Codex entry points. Full guide:
113
+ `claude -p /review --model sonnet` kickoff, and
114
+ `/duet 'npm test 2>&1' --turns 4` seeds from any command. Custom worktree
115
+ overrides are constructed conditionally, matching the Claude and Codex entry
116
+ points. Full guide:
116
117
  [docs/OPENCODE_PLUGIN.md](https://github.com/volkan/duet/blob/main/docs/OPENCODE_PLUGIN.md).
117
118
  (duet can also drive OpenCode as a backend — `--partner opencode:coder` — so
118
119
  OpenCode can be one of the two looped agents too.)
@@ -162,8 +163,12 @@ duet --recipe review --cwd ~/workspace/project
162
163
  ```
163
164
 
164
165
  The review recipe uses recap mode, `claude:reviewer` + `codex:coder`, six
165
- turns, `claude -p /review`, and strict worktree isolation. Explicit flags
166
- override recipe values.
166
+ turns, `claude -p /review --model sonnet`, and strict worktree isolation.
167
+ Claude agents use the stable `sonnet` alias unless an explicit slot model
168
+ overrides it. The recipe also sets
169
+ `--on-turn-timeout continue`, so when the coder turn times out the reviewer
170
+ still gets the timeout block plus the worktree diff to review instead of the
171
+ run dying reviewless. Explicit flags override recipe values.
167
172
 
168
173
  **Deterministic automation** — discover the run without parsing terminal prose,
169
174
  then poll the curated status schema:
@@ -220,24 +225,46 @@ other.
220
225
  To converge, an agent must include an `LGTM rationale:` explaining why the work
221
226
  is done, followed by the sentinel `<<<LGTM>>>` on its own line — a bare
222
227
  sentinel is ignored, and **both** agents must agree in back-to-back turns. The
223
- loop also stops on `--turns`, a per-turn timeout, or Ctrl-C. After a normal
228
+ loop also stops on `--turns`, a per-turn timeout, or Ctrl-C. With
229
+ `--on-turn-timeout continue` (the review recipe's default) a single turn
230
+ timeout is handed to the partner instead of ending the run; two consecutive
231
+ timeouts still stop. Without `--timeout`, the per-turn budget scales with the
232
+ reasoning level (900s → 1800s at `xhigh`/`max`). After a normal
224
233
  stop, duet opens a `force>` prompt so you can push another round.
225
234
 
226
235
  Every run writes a directory with `transcript.md`, `state.json`, per-turn
227
236
  stderr logs, and the `wt/` worktree when `--worktree` is on. Inspect a run with
228
237
  `duet --status <run-id> --json` (or omit `--json` for the human view), list runs
229
- with `duet --list`, and start a fresh run
238
+ with `duet --list`, stop one exact live run with `duet --stop <run-id>`, and
239
+ start a fresh run
230
240
  from saved state with `duet --continue <run> --task "next thing"`.
231
241
 
242
+ `--stop` is graceful. It lets the current agent turn finish before duet records
243
+ `force_stop`. Use `--stop <run-id> --immediate` to terminate that run's active
244
+ child and record `force_stop` now. Both forms validate the saved supervisor PID
245
+ and process-start identity. They never use a process-name match or signal a
246
+ different duet run.
247
+
248
+ If status remains `awaiting_force`, press Enter in the original terminal.
249
+ Some platforms do not wake the blocking `force>` input after an external signal.
250
+
232
251
  - **Backends:** `claude`, `codex`, `gemini`, `copilot`, `opencode`
233
252
  - **Roles:** `planner`, `coder`, `reviewer`, `triage-reviewer`, or a custom one
234
253
  - **Reasoning:** `--reasoning minimal|low|medium|high|xhigh|max`
235
254
 
255
+ ## Limits / future
256
+
257
+ Timeout continuation applies only to automatic loop turns. Seed extraction
258
+ and forced turns still stop on timeout. A final-turn timeout also stops because
259
+ no partner turn remains, and two consecutive timeouts stop the run. Poll
260
+ `duet --status <run-id> --json` to watch the current budget instead of assuming
261
+ a deep-reasoning turn is stuck.
262
+
236
263
  ## Documentation
237
264
 
238
265
  [docs/USAGE.md](https://github.com/volkan/duet/blob/main/docs/USAGE.md) is the
239
266
  full reference: every flag, reasoning levels, session memory, output layout,
240
- `--status` / `--continue`, the force prompt, Codex sandbox and network rules,
267
+ `--status` / `--stop` / `--continue`, the force prompt, Codex sandbox and network rules,
241
268
  and worktree mode.
242
269
 
243
270
  ## Contributing
@@ -89,9 +89,10 @@ Then invoke `/duet` in the OpenCode TUI (or `opencode run --command duet "..."`
89
89
  non-interactively). Like the other plugins it shells out to the `duet` CLI, so
90
90
  install that first and make sure `command -v duet` passes in OpenCode's shell.
91
91
  The command runs on OpenCode's `build` agent; plain `/duet` runs the same
92
- `claude -p /review` kickoff, and `/duet 'npm test 2>&1' --turns 4` seeds from
93
- any command. Custom worktree overrides are constructed conditionally, matching
94
- the Claude and Codex entry points. Full guide:
92
+ `claude -p /review --model sonnet` kickoff, and
93
+ `/duet 'npm test 2>&1' --turns 4` seeds from any command. Custom worktree
94
+ overrides are constructed conditionally, matching the Claude and Codex entry
95
+ points. Full guide:
95
96
  [docs/OPENCODE_PLUGIN.md](https://github.com/volkan/duet/blob/main/docs/OPENCODE_PLUGIN.md).
96
97
  (duet can also drive OpenCode as a backend — `--partner opencode:coder` — so
97
98
  OpenCode can be one of the two looped agents too.)
@@ -141,8 +142,12 @@ duet --recipe review --cwd ~/workspace/project
141
142
  ```
142
143
 
143
144
  The review recipe uses recap mode, `claude:reviewer` + `codex:coder`, six
144
- turns, `claude -p /review`, and strict worktree isolation. Explicit flags
145
- override recipe values.
145
+ turns, `claude -p /review --model sonnet`, and strict worktree isolation.
146
+ Claude agents use the stable `sonnet` alias unless an explicit slot model
147
+ overrides it. The recipe also sets
148
+ `--on-turn-timeout continue`, so when the coder turn times out the reviewer
149
+ still gets the timeout block plus the worktree diff to review instead of the
150
+ run dying reviewless. Explicit flags override recipe values.
146
151
 
147
152
  **Deterministic automation** — discover the run without parsing terminal prose,
148
153
  then poll the curated status schema:
@@ -199,24 +204,46 @@ other.
199
204
  To converge, an agent must include an `LGTM rationale:` explaining why the work
200
205
  is done, followed by the sentinel `<<<LGTM>>>` on its own line — a bare
201
206
  sentinel is ignored, and **both** agents must agree in back-to-back turns. The
202
- loop also stops on `--turns`, a per-turn timeout, or Ctrl-C. After a normal
207
+ loop also stops on `--turns`, a per-turn timeout, or Ctrl-C. With
208
+ `--on-turn-timeout continue` (the review recipe's default) a single turn
209
+ timeout is handed to the partner instead of ending the run; two consecutive
210
+ timeouts still stop. Without `--timeout`, the per-turn budget scales with the
211
+ reasoning level (900s → 1800s at `xhigh`/`max`). After a normal
203
212
  stop, duet opens a `force>` prompt so you can push another round.
204
213
 
205
214
  Every run writes a directory with `transcript.md`, `state.json`, per-turn
206
215
  stderr logs, and the `wt/` worktree when `--worktree` is on. Inspect a run with
207
216
  `duet --status <run-id> --json` (or omit `--json` for the human view), list runs
208
- with `duet --list`, and start a fresh run
217
+ with `duet --list`, stop one exact live run with `duet --stop <run-id>`, and
218
+ start a fresh run
209
219
  from saved state with `duet --continue <run> --task "next thing"`.
210
220
 
221
+ `--stop` is graceful. It lets the current agent turn finish before duet records
222
+ `force_stop`. Use `--stop <run-id> --immediate` to terminate that run's active
223
+ child and record `force_stop` now. Both forms validate the saved supervisor PID
224
+ and process-start identity. They never use a process-name match or signal a
225
+ different duet run.
226
+
227
+ If status remains `awaiting_force`, press Enter in the original terminal.
228
+ Some platforms do not wake the blocking `force>` input after an external signal.
229
+
211
230
  - **Backends:** `claude`, `codex`, `gemini`, `copilot`, `opencode`
212
231
  - **Roles:** `planner`, `coder`, `reviewer`, `triage-reviewer`, or a custom one
213
232
  - **Reasoning:** `--reasoning minimal|low|medium|high|xhigh|max`
214
233
 
234
+ ## Limits / future
235
+
236
+ Timeout continuation applies only to automatic loop turns. Seed extraction
237
+ and forced turns still stop on timeout. A final-turn timeout also stops because
238
+ no partner turn remains, and two consecutive timeouts stop the run. Poll
239
+ `duet --status <run-id> --json` to watch the current budget instead of assuming
240
+ a deep-reasoning turn is stuck.
241
+
215
242
  ## Documentation
216
243
 
217
244
  [docs/USAGE.md](https://github.com/volkan/duet/blob/main/docs/USAGE.md) is the
218
245
  full reference: every flag, reasoning levels, session memory, output layout,
219
- `--status` / `--continue`, the force prompt, Codex sandbox and network rules,
246
+ `--status` / `--stop` / `--continue`, the force prompt, Codex sandbox and network rules,
220
247
  and worktree mode.
221
248
 
222
249
  ## Contributing