duet-cli 0.2.9__tar.gz → 0.2.10__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.
- {duet_cli-0.2.9/duet_cli.egg-info → duet_cli-0.2.10}/PKG-INFO +24 -7
- {duet_cli-0.2.9 → duet_cli-0.2.10}/README.md +23 -6
- {duet_cli-0.2.9 → duet_cli-0.2.10}/duet.py +337 -55
- {duet_cli-0.2.9 → duet_cli-0.2.10/duet_cli.egg-info}/PKG-INFO +24 -7
- duet_cli-0.2.10/tests/test_control_plane.py +830 -0
- {duet_cli-0.2.9 → duet_cli-0.2.10}/tests/test_duet.py +193 -2
- duet_cli-0.2.9/tests/test_control_plane.py +0 -388
- {duet_cli-0.2.9 → duet_cli-0.2.10}/LICENSE +0 -0
- {duet_cli-0.2.9 → duet_cli-0.2.10}/duet_cli.egg-info/SOURCES.txt +0 -0
- {duet_cli-0.2.9 → duet_cli-0.2.10}/duet_cli.egg-info/dependency_links.txt +0 -0
- {duet_cli-0.2.9 → duet_cli-0.2.10}/duet_cli.egg-info/entry_points.txt +0 -0
- {duet_cli-0.2.9 → duet_cli-0.2.10}/duet_cli.egg-info/requires.txt +0 -0
- {duet_cli-0.2.9 → duet_cli-0.2.10}/duet_cli.egg-info/top_level.txt +0 -0
- {duet_cli-0.2.9 → duet_cli-0.2.10}/pyproject.toml +0 -0
- {duet_cli-0.2.9 → duet_cli-0.2.10}/setup.cfg +0 -0
- {duet_cli-0.2.9 → duet_cli-0.2.10}/tests/test_bump_release_version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: duet-cli
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.10
|
|
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
|
|
114
|
-
any command. Custom worktree
|
|
115
|
-
the Claude and Codex entry
|
|
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.
|
|
166
|
-
|
|
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,7 +225,11 @@ 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.
|
|
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
|
|
@@ -233,6 +242,14 @@ from saved state with `duet --continue <run> --task "next thing"`.
|
|
|
233
242
|
- **Roles:** `planner`, `coder`, `reviewer`, `triage-reviewer`, or a custom one
|
|
234
243
|
- **Reasoning:** `--reasoning minimal|low|medium|high|xhigh|max`
|
|
235
244
|
|
|
245
|
+
## Limits / future
|
|
246
|
+
|
|
247
|
+
Timeout continuation applies only to automatic loop turns. Seed extraction
|
|
248
|
+
and forced turns still stop on timeout. A final-turn timeout also stops because
|
|
249
|
+
no partner turn remains, and two consecutive timeouts stop the run. Poll
|
|
250
|
+
`duet --status <run-id> --json` to watch the current budget instead of assuming
|
|
251
|
+
a deep-reasoning turn is stuck.
|
|
252
|
+
|
|
236
253
|
## Documentation
|
|
237
254
|
|
|
238
255
|
[docs/USAGE.md](https://github.com/volkan/duet/blob/main/docs/USAGE.md) is the
|
|
@@ -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
|
|
93
|
-
any command. Custom worktree
|
|
94
|
-
the Claude and Codex entry
|
|
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.
|
|
145
|
-
|
|
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,7 +204,11 @@ 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.
|
|
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
|
|
@@ -212,6 +221,14 @@ from saved state with `duet --continue <run> --task "next thing"`.
|
|
|
212
221
|
- **Roles:** `planner`, `coder`, `reviewer`, `triage-reviewer`, or a custom one
|
|
213
222
|
- **Reasoning:** `--reasoning minimal|low|medium|high|xhigh|max`
|
|
214
223
|
|
|
224
|
+
## Limits / future
|
|
225
|
+
|
|
226
|
+
Timeout continuation applies only to automatic loop turns. Seed extraction
|
|
227
|
+
and forced turns still stop on timeout. A final-turn timeout also stops because
|
|
228
|
+
no partner turn remains, and two consecutive timeouts stop the run. Poll
|
|
229
|
+
`duet --status <run-id> --json` to watch the current budget instead of assuming
|
|
230
|
+
a deep-reasoning turn is stuck.
|
|
231
|
+
|
|
215
232
|
## Documentation
|
|
216
233
|
|
|
217
234
|
[docs/USAGE.md](https://github.com/volkan/duet/blob/main/docs/USAGE.md) is the
|