duet-cli 0.2.8__tar.gz → 0.2.9__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.8/duet_cli.egg-info → duet_cli-0.2.9}/PKG-INFO +26 -7
- {duet_cli-0.2.8 → duet_cli-0.2.9}/README.md +25 -6
- {duet_cli-0.2.8 → duet_cli-0.2.9}/duet.py +978 -245
- {duet_cli-0.2.8 → duet_cli-0.2.9/duet_cli.egg-info}/PKG-INFO +26 -7
- {duet_cli-0.2.8 → duet_cli-0.2.9}/duet_cli.egg-info/SOURCES.txt +1 -0
- {duet_cli-0.2.8 → duet_cli-0.2.9}/pyproject.toml +4 -1
- {duet_cli-0.2.8 → duet_cli-0.2.9}/tests/test_bump_release_version.py +18 -23
- duet_cli-0.2.9/tests/test_control_plane.py +388 -0
- {duet_cli-0.2.8 → duet_cli-0.2.9}/LICENSE +0 -0
- {duet_cli-0.2.8 → duet_cli-0.2.9}/duet_cli.egg-info/dependency_links.txt +0 -0
- {duet_cli-0.2.8 → duet_cli-0.2.9}/duet_cli.egg-info/entry_points.txt +0 -0
- {duet_cli-0.2.8 → duet_cli-0.2.9}/duet_cli.egg-info/requires.txt +0 -0
- {duet_cli-0.2.8 → duet_cli-0.2.9}/duet_cli.egg-info/top_level.txt +0 -0
- {duet_cli-0.2.8 → duet_cli-0.2.9}/setup.cfg +0 -0
- {duet_cli-0.2.8 → duet_cli-0.2.9}/tests/test_duet.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.9
|
|
4
4
|
Summary: Two CLI agents in conversation. One Python file. Stdlib only.
|
|
5
5
|
Author: Volkan Altan
|
|
6
6
|
License-Expression: MIT
|
|
@@ -47,7 +47,9 @@ Plain `/duet` runs Claude Code's real `/review`, then loops Codex and Claude in
|
|
|
47
47
|
a worktree until they converge. Pass any upstream command as the kickoff:
|
|
48
48
|
`/duet 'npm test 2>&1' --turns 4`. The plugin shells out to the `duet` CLI, so
|
|
49
49
|
install that first (see below) and make sure `command -v duet` passes in Claude
|
|
50
|
-
Code's shell.
|
|
50
|
+
Code's shell. Custom topology flags such as `--no-worktree` and
|
|
51
|
+
`--allow-worktree-fallback` replace the plugin defaults without emitting
|
|
52
|
+
conflicting CLI flags. Full guide:
|
|
51
53
|
[docs/CLAUDE_CODE_PLUGIN.md](https://github.com/volkan/duet/blob/main/docs/CLAUDE_CODE_PLUGIN.md).
|
|
52
54
|
If Claude Code disambiguates plugin commands with namespaces, `/duet:duet` is
|
|
53
55
|
the same command.
|
|
@@ -109,7 +111,8 @@ non-interactively). Like the other plugins it shells out to the `duet` CLI, so
|
|
|
109
111
|
install that first and make sure `command -v duet` passes in OpenCode's shell.
|
|
110
112
|
The command runs on OpenCode's `build` agent; plain `/duet` runs the same
|
|
111
113
|
`claude -p /review` kickoff, and `/duet 'npm test 2>&1' --turns 4` seeds from
|
|
112
|
-
any command.
|
|
114
|
+
any command. Custom worktree overrides are constructed conditionally, matching
|
|
115
|
+
the Claude and Codex entry points. Full guide:
|
|
113
116
|
[docs/OPENCODE_PLUGIN.md](https://github.com/volkan/duet/blob/main/docs/OPENCODE_PLUGIN.md).
|
|
114
117
|
(duet can also drive OpenCode as a backend — `--partner opencode:coder` — so
|
|
115
118
|
OpenCode can be one of the two looped agents too.)
|
|
@@ -155,9 +158,24 @@ duet --task "Review the latest commit; fix only what the reviewer requests." \
|
|
|
155
158
|
`/review`, a test run, or any command:
|
|
156
159
|
|
|
157
160
|
```bash
|
|
158
|
-
duet --
|
|
159
|
-
|
|
160
|
-
|
|
161
|
+
duet --recipe review --cwd ~/workspace/project
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
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.
|
|
167
|
+
|
|
168
|
+
**Deterministic automation** — discover the run without parsing terminal prose,
|
|
169
|
+
then poll the curated status schema:
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
control_dir=$(mktemp -d)
|
|
173
|
+
duet --recipe review --run-info-file "$control_dir/run.json" &
|
|
174
|
+
duet_pid=$!
|
|
175
|
+
while [ ! -s "$control_dir/run.json" ]; do sleep 0.1; done
|
|
176
|
+
run_dir=$(python3 -c 'import json,sys; print(json.load(open(sys.argv[1]))["run_dir"])' "$control_dir/run.json")
|
|
177
|
+
duet --status "$run_dir" --json
|
|
178
|
+
wait "$duet_pid"
|
|
161
179
|
```
|
|
162
180
|
|
|
163
181
|
**Deep planner, fast coder** — Claude plans at high effort while Codex coder
|
|
@@ -207,7 +225,8 @@ stop, duet opens a `force>` prompt so you can push another round.
|
|
|
207
225
|
|
|
208
226
|
Every run writes a directory with `transcript.md`, `state.json`, per-turn
|
|
209
227
|
stderr logs, and the `wt/` worktree when `--worktree` is on. Inspect a run with
|
|
210
|
-
`duet --status <run-id
|
|
228
|
+
`duet --status <run-id> --json` (or omit `--json` for the human view), list runs
|
|
229
|
+
with `duet --list`, and start a fresh run
|
|
211
230
|
from saved state with `duet --continue <run> --task "next thing"`.
|
|
212
231
|
|
|
213
232
|
- **Backends:** `claude`, `codex`, `gemini`, `copilot`, `opencode`
|
|
@@ -26,7 +26,9 @@ Plain `/duet` runs Claude Code's real `/review`, then loops Codex and Claude in
|
|
|
26
26
|
a worktree until they converge. Pass any upstream command as the kickoff:
|
|
27
27
|
`/duet 'npm test 2>&1' --turns 4`. The plugin shells out to the `duet` CLI, so
|
|
28
28
|
install that first (see below) and make sure `command -v duet` passes in Claude
|
|
29
|
-
Code's shell.
|
|
29
|
+
Code's shell. Custom topology flags such as `--no-worktree` and
|
|
30
|
+
`--allow-worktree-fallback` replace the plugin defaults without emitting
|
|
31
|
+
conflicting CLI flags. Full guide:
|
|
30
32
|
[docs/CLAUDE_CODE_PLUGIN.md](https://github.com/volkan/duet/blob/main/docs/CLAUDE_CODE_PLUGIN.md).
|
|
31
33
|
If Claude Code disambiguates plugin commands with namespaces, `/duet:duet` is
|
|
32
34
|
the same command.
|
|
@@ -88,7 +90,8 @@ non-interactively). Like the other plugins it shells out to the `duet` CLI, so
|
|
|
88
90
|
install that first and make sure `command -v duet` passes in OpenCode's shell.
|
|
89
91
|
The command runs on OpenCode's `build` agent; plain `/duet` runs the same
|
|
90
92
|
`claude -p /review` kickoff, and `/duet 'npm test 2>&1' --turns 4` seeds from
|
|
91
|
-
any command.
|
|
93
|
+
any command. Custom worktree overrides are constructed conditionally, matching
|
|
94
|
+
the Claude and Codex entry points. Full guide:
|
|
92
95
|
[docs/OPENCODE_PLUGIN.md](https://github.com/volkan/duet/blob/main/docs/OPENCODE_PLUGIN.md).
|
|
93
96
|
(duet can also drive OpenCode as a backend — `--partner opencode:coder` — so
|
|
94
97
|
OpenCode can be one of the two looped agents too.)
|
|
@@ -134,9 +137,24 @@ duet --task "Review the latest commit; fix only what the reviewer requests." \
|
|
|
134
137
|
`/review`, a test run, or any command:
|
|
135
138
|
|
|
136
139
|
```bash
|
|
137
|
-
duet --
|
|
138
|
-
|
|
139
|
-
|
|
140
|
+
duet --recipe review --cwd ~/workspace/project
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
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.
|
|
146
|
+
|
|
147
|
+
**Deterministic automation** — discover the run without parsing terminal prose,
|
|
148
|
+
then poll the curated status schema:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
control_dir=$(mktemp -d)
|
|
152
|
+
duet --recipe review --run-info-file "$control_dir/run.json" &
|
|
153
|
+
duet_pid=$!
|
|
154
|
+
while [ ! -s "$control_dir/run.json" ]; do sleep 0.1; done
|
|
155
|
+
run_dir=$(python3 -c 'import json,sys; print(json.load(open(sys.argv[1]))["run_dir"])' "$control_dir/run.json")
|
|
156
|
+
duet --status "$run_dir" --json
|
|
157
|
+
wait "$duet_pid"
|
|
140
158
|
```
|
|
141
159
|
|
|
142
160
|
**Deep planner, fast coder** — Claude plans at high effort while Codex coder
|
|
@@ -186,7 +204,8 @@ stop, duet opens a `force>` prompt so you can push another round.
|
|
|
186
204
|
|
|
187
205
|
Every run writes a directory with `transcript.md`, `state.json`, per-turn
|
|
188
206
|
stderr logs, and the `wt/` worktree when `--worktree` is on. Inspect a run with
|
|
189
|
-
`duet --status <run-id
|
|
207
|
+
`duet --status <run-id> --json` (or omit `--json` for the human view), list runs
|
|
208
|
+
with `duet --list`, and start a fresh run
|
|
190
209
|
from saved state with `duet --continue <run> --task "next thing"`.
|
|
191
210
|
|
|
192
211
|
- **Backends:** `claude`, `codex`, `gemini`, `copilot`, `opencode`
|