duet-cli 0.2.5__tar.gz → 0.2.7__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.5/duet_cli.egg-info → duet_cli-0.2.7}/PKG-INFO +32 -10
- {duet_cli-0.2.5 → duet_cli-0.2.7}/README.md +31 -9
- {duet_cli-0.2.5 → duet_cli-0.2.7}/duet.py +603 -103
- {duet_cli-0.2.5 → duet_cli-0.2.7/duet_cli.egg-info}/PKG-INFO +32 -10
- {duet_cli-0.2.5 → duet_cli-0.2.7}/pyproject.toml +1 -1
- {duet_cli-0.2.5 → duet_cli-0.2.7}/tests/test_duet.py +422 -4
- {duet_cli-0.2.5 → duet_cli-0.2.7}/LICENSE +0 -0
- {duet_cli-0.2.5 → duet_cli-0.2.7}/duet_cli.egg-info/SOURCES.txt +0 -0
- {duet_cli-0.2.5 → duet_cli-0.2.7}/duet_cli.egg-info/dependency_links.txt +0 -0
- {duet_cli-0.2.5 → duet_cli-0.2.7}/duet_cli.egg-info/entry_points.txt +0 -0
- {duet_cli-0.2.5 → duet_cli-0.2.7}/duet_cli.egg-info/requires.txt +0 -0
- {duet_cli-0.2.5 → duet_cli-0.2.7}/duet_cli.egg-info/top_level.txt +0 -0
- {duet_cli-0.2.5 → duet_cli-0.2.7}/setup.cfg +0 -0
- {duet_cli-0.2.5 → duet_cli-0.2.7}/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.7
|
|
4
4
|
Summary: Two CLI agents in conversation. One Python file. Stdlib only.
|
|
5
5
|
Author: Volkan Altan
|
|
6
6
|
License-Expression: MIT
|
|
@@ -24,12 +24,12 @@ Dynamic: license-file
|
|
|
24
24
|
**Two CLI agents in conversation. One Python file. Stdlib only.**
|
|
25
25
|
|
|
26
26
|
`duet` runs two command-line coding agents in alternating turns until they
|
|
27
|
-
agree. By default that is Claude and Codex; Gemini and
|
|
28
|
-
supported, and you can pair two agents from the same backend. One agent
|
|
29
|
-
or reviews while the other implements; each keeps its own session memory
|
|
30
|
-
turns, and every run leaves a transcript you can inspect.
|
|
27
|
+
agree. By default that is Claude and Codex; Gemini, Copilot, and OpenCode are
|
|
28
|
+
also supported, and you can pair two agents from the same backend. One agent
|
|
29
|
+
plans or reviews while the other implements; each keeps its own session memory
|
|
30
|
+
across turns, and every run leaves a transcript you can inspect.
|
|
31
31
|
|
|
32
|
-
## Use it
|
|
32
|
+
## Use it four ways
|
|
33
33
|
|
|
34
34
|
### 1. Inside Claude Code — `/duet`
|
|
35
35
|
|
|
@@ -93,7 +93,26 @@ CLI, so install that first (see below) and make sure `command -v duet` passes in
|
|
|
93
93
|
Codex's shell. Full guide:
|
|
94
94
|
[docs/CODEX_PLUGIN.md](https://github.com/volkan/duet/blob/main/docs/CODEX_PLUGIN.md).
|
|
95
95
|
|
|
96
|
-
### 3.
|
|
96
|
+
### 3. Inside OpenCode — `/duet`
|
|
97
|
+
|
|
98
|
+
OpenCode custom commands are drop-in files — no marketplace step:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
mkdir -p ~/.config/opencode/command
|
|
102
|
+
cp plugins/duet-opencode/command/duet.md ~/.config/opencode/command/duet.md
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Then invoke `/duet` in the OpenCode TUI (or `opencode run --command duet "..."`
|
|
106
|
+
non-interactively). Like the other plugins it shells out to the `duet` CLI, so
|
|
107
|
+
install that first and make sure `command -v duet` passes in OpenCode's shell.
|
|
108
|
+
The command runs on OpenCode's `build` agent; plain `/duet` runs the same
|
|
109
|
+
`claude -p /review` kickoff, and `/duet 'npm test 2>&1' --turns 4` seeds from
|
|
110
|
+
any command. Full guide:
|
|
111
|
+
[docs/OPENCODE_PLUGIN.md](https://github.com/volkan/duet/blob/main/docs/OPENCODE_PLUGIN.md).
|
|
112
|
+
(duet can also drive OpenCode as a backend — `--partner opencode:coder` — so
|
|
113
|
+
OpenCode can be one of the two looped agents too.)
|
|
114
|
+
|
|
115
|
+
### 4. From the terminal — `duet`
|
|
97
116
|
|
|
98
117
|
```bash
|
|
99
118
|
pipx install duet-cli # recommended; the command it installs is `duet`
|
|
@@ -147,6 +166,8 @@ duet --reasoning high --codex-fast \
|
|
|
147
166
|
--task "Fix the issue" --cwd ~/workspace/project
|
|
148
167
|
```
|
|
149
168
|
|
|
169
|
+
Use `--no-codex-fast` to override a config or continued run that enabled it.
|
|
170
|
+
|
|
150
171
|
**Verify gate** — a convergence proposal only counts if `make test` exits 0;
|
|
151
172
|
any failure feeds back into the next turn:
|
|
152
173
|
|
|
@@ -172,8 +193,9 @@ coder fixes them). Run one with `duet --config examples/pr-review.yaml`.
|
|
|
172
193
|
## How it works
|
|
173
194
|
|
|
174
195
|
Each agent keeps its own conversation memory across turns (Claude via
|
|
175
|
-
`--resume`, Codex via `codex exec resume`, Gemini and
|
|
176
|
-
session ids). On each turn duet sends one agent's latest reply to the
|
|
196
|
+
`--resume`, Codex via `codex exec resume`, Gemini, Copilot, and OpenCode via
|
|
197
|
+
their JSON session ids). On each turn duet sends one agent's latest reply to the
|
|
198
|
+
other.
|
|
177
199
|
|
|
178
200
|
To converge, an agent must include an `LGTM rationale:` explaining why the work
|
|
179
201
|
is done, followed by the sentinel `<<<LGTM>>>` on its own line — a bare
|
|
@@ -186,7 +208,7 @@ stderr logs, and the `wt/` worktree when `--worktree` is on. Inspect a run with
|
|
|
186
208
|
`duet --status <run-id>`, list runs with `duet --list`, and start a fresh run
|
|
187
209
|
from saved state with `duet --continue <run> --task "next thing"`.
|
|
188
210
|
|
|
189
|
-
- **Backends:** `claude`, `codex`, `gemini`, `copilot`
|
|
211
|
+
- **Backends:** `claude`, `codex`, `gemini`, `copilot`, `opencode`
|
|
190
212
|
- **Roles:** `planner`, `coder`, `reviewer`, `triage-reviewer`, or a custom one
|
|
191
213
|
- **Reasoning:** `--reasoning minimal|low|medium|high|xhigh|max`
|
|
192
214
|
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
**Two CLI agents in conversation. One Python file. Stdlib only.**
|
|
4
4
|
|
|
5
5
|
`duet` runs two command-line coding agents in alternating turns until they
|
|
6
|
-
agree. By default that is Claude and Codex; Gemini and
|
|
7
|
-
supported, and you can pair two agents from the same backend. One agent
|
|
8
|
-
or reviews while the other implements; each keeps its own session memory
|
|
9
|
-
turns, and every run leaves a transcript you can inspect.
|
|
6
|
+
agree. By default that is Claude and Codex; Gemini, Copilot, and OpenCode are
|
|
7
|
+
also supported, and you can pair two agents from the same backend. One agent
|
|
8
|
+
plans or reviews while the other implements; each keeps its own session memory
|
|
9
|
+
across turns, and every run leaves a transcript you can inspect.
|
|
10
10
|
|
|
11
|
-
## Use it
|
|
11
|
+
## Use it four ways
|
|
12
12
|
|
|
13
13
|
### 1. Inside Claude Code — `/duet`
|
|
14
14
|
|
|
@@ -72,7 +72,26 @@ CLI, so install that first (see below) and make sure `command -v duet` passes in
|
|
|
72
72
|
Codex's shell. Full guide:
|
|
73
73
|
[docs/CODEX_PLUGIN.md](https://github.com/volkan/duet/blob/main/docs/CODEX_PLUGIN.md).
|
|
74
74
|
|
|
75
|
-
### 3.
|
|
75
|
+
### 3. Inside OpenCode — `/duet`
|
|
76
|
+
|
|
77
|
+
OpenCode custom commands are drop-in files — no marketplace step:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
mkdir -p ~/.config/opencode/command
|
|
81
|
+
cp plugins/duet-opencode/command/duet.md ~/.config/opencode/command/duet.md
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Then invoke `/duet` in the OpenCode TUI (or `opencode run --command duet "..."`
|
|
85
|
+
non-interactively). Like the other plugins it shells out to the `duet` CLI, so
|
|
86
|
+
install that first and make sure `command -v duet` passes in OpenCode's shell.
|
|
87
|
+
The command runs on OpenCode's `build` agent; plain `/duet` runs the same
|
|
88
|
+
`claude -p /review` kickoff, and `/duet 'npm test 2>&1' --turns 4` seeds from
|
|
89
|
+
any command. Full guide:
|
|
90
|
+
[docs/OPENCODE_PLUGIN.md](https://github.com/volkan/duet/blob/main/docs/OPENCODE_PLUGIN.md).
|
|
91
|
+
(duet can also drive OpenCode as a backend — `--partner opencode:coder` — so
|
|
92
|
+
OpenCode can be one of the two looped agents too.)
|
|
93
|
+
|
|
94
|
+
### 4. From the terminal — `duet`
|
|
76
95
|
|
|
77
96
|
```bash
|
|
78
97
|
pipx install duet-cli # recommended; the command it installs is `duet`
|
|
@@ -126,6 +145,8 @@ duet --reasoning high --codex-fast \
|
|
|
126
145
|
--task "Fix the issue" --cwd ~/workspace/project
|
|
127
146
|
```
|
|
128
147
|
|
|
148
|
+
Use `--no-codex-fast` to override a config or continued run that enabled it.
|
|
149
|
+
|
|
129
150
|
**Verify gate** — a convergence proposal only counts if `make test` exits 0;
|
|
130
151
|
any failure feeds back into the next turn:
|
|
131
152
|
|
|
@@ -151,8 +172,9 @@ coder fixes them). Run one with `duet --config examples/pr-review.yaml`.
|
|
|
151
172
|
## How it works
|
|
152
173
|
|
|
153
174
|
Each agent keeps its own conversation memory across turns (Claude via
|
|
154
|
-
`--resume`, Codex via `codex exec resume`, Gemini and
|
|
155
|
-
session ids). On each turn duet sends one agent's latest reply to the
|
|
175
|
+
`--resume`, Codex via `codex exec resume`, Gemini, Copilot, and OpenCode via
|
|
176
|
+
their JSON session ids). On each turn duet sends one agent's latest reply to the
|
|
177
|
+
other.
|
|
156
178
|
|
|
157
179
|
To converge, an agent must include an `LGTM rationale:` explaining why the work
|
|
158
180
|
is done, followed by the sentinel `<<<LGTM>>>` on its own line — a bare
|
|
@@ -165,7 +187,7 @@ stderr logs, and the `wt/` worktree when `--worktree` is on. Inspect a run with
|
|
|
165
187
|
`duet --status <run-id>`, list runs with `duet --list`, and start a fresh run
|
|
166
188
|
from saved state with `duet --continue <run> --task "next thing"`.
|
|
167
189
|
|
|
168
|
-
- **Backends:** `claude`, `codex`, `gemini`, `copilot`
|
|
190
|
+
- **Backends:** `claude`, `codex`, `gemini`, `copilot`, `opencode`
|
|
169
191
|
- **Roles:** `planner`, `coder`, `reviewer`, `triage-reviewer`, or a custom one
|
|
170
192
|
- **Reasoning:** `--reasoning minimal|low|medium|high|xhigh|max`
|
|
171
193
|
|