duet-cli 0.2.13__tar.gz → 0.2.16__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.13/duet_cli.egg-info → duet_cli-0.2.16}/PKG-INFO +72 -8
- duet_cli-0.2.16/README.md +117 -0
- {duet_cli-0.2.13 → duet_cli-0.2.16}/duet.py +1 -1
- {duet_cli-0.2.13 → duet_cli-0.2.16/duet_cli.egg-info}/PKG-INFO +72 -8
- {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_bump_release_version.py +3 -3
- {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_duet.py +1 -1
- duet_cli-0.2.13/README.md +0 -53
- {duet_cli-0.2.13 → duet_cli-0.2.16}/LICENSE +0 -0
- {duet_cli-0.2.13 → duet_cli-0.2.16}/duet_cli.egg-info/SOURCES.txt +0 -0
- {duet_cli-0.2.13 → duet_cli-0.2.16}/duet_cli.egg-info/dependency_links.txt +0 -0
- {duet_cli-0.2.13 → duet_cli-0.2.16}/duet_cli.egg-info/entry_points.txt +0 -0
- {duet_cli-0.2.13 → duet_cli-0.2.16}/duet_cli.egg-info/requires.txt +0 -0
- {duet_cli-0.2.13 → duet_cli-0.2.16}/duet_cli.egg-info/top_level.txt +0 -0
- {duet_cli-0.2.13 → duet_cli-0.2.16}/pyproject.toml +0 -0
- {duet_cli-0.2.13 → duet_cli-0.2.16}/setup.cfg +0 -0
- {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_backend_metrics.py +0 -0
- {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_control_plane.py +0 -0
- {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_feedback_concurrency.py +0 -0
- {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_finding_reports.py +0 -0
- {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_finding_workflow.py +0 -0
- {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_metrics_cli.py +0 -0
- {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_metrics_collection.py +0 -0
- {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_metrics_lifecycle.py +0 -0
- {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_metrics_reporting.py +0 -0
- {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_no_subagents.py +0 -0
- {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_stop_control_plane.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.16
|
|
4
4
|
Summary: Two CLI agents in conversation. One Python file. Stdlib only.
|
|
5
5
|
Author: Volkan Altan
|
|
6
6
|
License-Expression: MIT
|
|
@@ -27,8 +27,10 @@ Duet runs two coding agents in alternating turns: one reviews or plans, the
|
|
|
27
27
|
other implements or challenges the result. Each keeps its own conversation,
|
|
28
28
|
and you get a saved transcript to inspect.
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
Run **two different models through a single agent harness (CLI)**, such as
|
|
31
|
+
Codex or OpenCode. You can also pair different CLIs, such as Claude Code and
|
|
32
|
+
Codex. Gemini and Copilot are also supported.
|
|
33
|
+
[See examples using one CLI](https://github.com/volkan/duet/blob/main/docs/USAGE.md#same-backend-peering).
|
|
32
34
|
|
|
33
35
|
[](https://github.com/volkan/duet/blob/main/docs/demos/finding-review.mp4)
|
|
34
36
|
|
|
@@ -44,7 +46,11 @@ both the code and a test that had accepted the incorrect output.
|
|
|
44
46
|
|
|
45
47
|
## Quick start
|
|
46
48
|
|
|
47
|
-
You need Python 3.9+ and
|
|
49
|
+
You need Python 3.9+ and at least one chosen agent CLI, installed and signed
|
|
50
|
+
in. See [Claude Code installation](https://code.claude.com/docs/en/quickstart)
|
|
51
|
+
or [Codex CLI installation](https://developers.openai.com/codex/cli#getting-started).
|
|
52
|
+
Duet uses two separate sessions, which may use the same CLI with different
|
|
53
|
+
models.
|
|
48
54
|
**Only have Codex?** [Run two Codex models](https://github.com/volkan/duet/blob/main/docs/USAGE.md#codex-only-review).
|
|
49
55
|
For the Claude + Codex pair, run this from a Git repository:
|
|
50
56
|
|
|
@@ -56,10 +62,68 @@ duet --recipe review
|
|
|
56
62
|
This starts a review and fix loop with the coder in a separate Git worktree.
|
|
57
63
|
Inspect the changes before merging; agent agreement does not prove correctness.
|
|
58
64
|
|
|
59
|
-
Already working inside an agent?
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
65
|
+
Already working inside an agent? Install the **same Duet skill** for Claude
|
|
66
|
+
Code, Codex, and OpenCode (requires Node.js/npm; choose **Symlink**):
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
npx skills add volkan/duet --skill duet --global \
|
|
70
|
+
--agent claude-code --agent codex --agent opencode
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Start a new session, then use `/duet` in Claude Code, `$duet` in Codex, or ask
|
|
74
|
+
OpenCode to use the `duet` skill.
|
|
75
|
+
[Installation details](https://github.com/volkan/duet/blob/main/docs/INSTALLATION.md)
|
|
76
|
+
cover `~/.agents/skills`, prerequisites, and alternative installers. See the
|
|
77
|
+
[OpenCode guide](https://github.com/volkan/duet/blob/main/docs/OPENCODE_PLUGIN.md)
|
|
78
|
+
for its native skill and optional command wrapper.
|
|
79
|
+
|
|
80
|
+
## Native plugin installation
|
|
81
|
+
|
|
82
|
+
These optional native routes install the same shared Duet skill. Use one route
|
|
83
|
+
per host.
|
|
84
|
+
|
|
85
|
+
Codex, in a terminal:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
codex plugin marketplace add volkan/duet
|
|
89
|
+
codex plugin add duet@volkan-duet
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Start a new Codex session, then invoke `$duet`. See the [Codex installation
|
|
93
|
+
guide](https://github.com/volkan/duet/blob/main/docs/CODEX_PLUGIN.md#install-checklist)
|
|
94
|
+
for setup and marketplace recovery.
|
|
95
|
+
|
|
96
|
+
Claude Code, inside Claude Code:
|
|
97
|
+
|
|
98
|
+
```text
|
|
99
|
+
/plugin marketplace add volkan/duet
|
|
100
|
+
/plugin install duet@volkan-duet
|
|
101
|
+
/reload-plugins
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Then invoke `/duet:duet`. See the [Claude Code installation
|
|
105
|
+
guide](https://github.com/volkan/duet/blob/main/docs/CLAUDE_CODE_PLUGIN.md).
|
|
106
|
+
|
|
107
|
+
## Upgrade
|
|
108
|
+
|
|
109
|
+
Update the CLI and, if installed, the shared skill:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
pipx upgrade duet-cli
|
|
113
|
+
npx skills update duet --global
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
If pipx reports `already at latest version` despite a newer release on PyPI,
|
|
117
|
+
retry without pip's cache:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
pipx upgrade duet-cli --pip-args="--no-cache-dir"
|
|
121
|
+
duet --version
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Start a new agent session afterward. For `uv`, `pip`, source checkouts, or
|
|
125
|
+
native marketplace plugins, follow the
|
|
126
|
+
[upgrade guide](https://github.com/volkan/duet/blob/main/docs/INSTALLATION.md#upgrade).
|
|
63
127
|
|
|
64
128
|
## Go further
|
|
65
129
|
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# duet
|
|
2
|
+
|
|
3
|
+
**A second opinion for your AI coding work.**
|
|
4
|
+
|
|
5
|
+
Duet runs two coding agents in alternating turns: one reviews or plans, the
|
|
6
|
+
other implements or challenges the result. Each keeps its own conversation,
|
|
7
|
+
and you get a saved transcript to inspect.
|
|
8
|
+
|
|
9
|
+
Run **two different models through a single agent harness (CLI)**, such as
|
|
10
|
+
Codex or OpenCode. You can also pair different CLIs, such as Claude Code and
|
|
11
|
+
Codex. Gemini and Copilot are also supported.
|
|
12
|
+
[See examples using one CLI](https://github.com/volkan/duet/blob/main/docs/USAGE.md#same-backend-peering).
|
|
13
|
+
|
|
14
|
+
[](https://github.com/volkan/duet/blob/main/docs/demos/finding-review.mp4)
|
|
15
|
+
|
|
16
|
+
An edited replay using a public toy fixture. [Playback and source](https://github.com/volkan/duet/blob/main/docs/demos/README.md).
|
|
17
|
+
|
|
18
|
+
## A real example
|
|
19
|
+
|
|
20
|
+
A supplied work audit describes a proposed fix that accidentally stopped
|
|
21
|
+
hiding sensitive values. The other agent challenged it, and the first revised
|
|
22
|
+
both the code and a test that had accepted the incorrect output.
|
|
23
|
+
|
|
24
|
+
[Read the anonymized cases and their limits](https://github.com/volkan/duet/blob/main/docs/REAL_CASES.md).
|
|
25
|
+
|
|
26
|
+
## Quick start
|
|
27
|
+
|
|
28
|
+
You need Python 3.9+ and at least one chosen agent CLI, installed and signed
|
|
29
|
+
in. See [Claude Code installation](https://code.claude.com/docs/en/quickstart)
|
|
30
|
+
or [Codex CLI installation](https://developers.openai.com/codex/cli#getting-started).
|
|
31
|
+
Duet uses two separate sessions, which may use the same CLI with different
|
|
32
|
+
models.
|
|
33
|
+
**Only have Codex?** [Run two Codex models](https://github.com/volkan/duet/blob/main/docs/USAGE.md#codex-only-review).
|
|
34
|
+
For the Claude + Codex pair, run this from a Git repository:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
pipx install duet-cli
|
|
38
|
+
duet --recipe review
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
This starts a review and fix loop with the coder in a separate Git worktree.
|
|
42
|
+
Inspect the changes before merging; agent agreement does not prove correctness.
|
|
43
|
+
|
|
44
|
+
Already working inside an agent? Install the **same Duet skill** for Claude
|
|
45
|
+
Code, Codex, and OpenCode (requires Node.js/npm; choose **Symlink**):
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
npx skills add volkan/duet --skill duet --global \
|
|
49
|
+
--agent claude-code --agent codex --agent opencode
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Start a new session, then use `/duet` in Claude Code, `$duet` in Codex, or ask
|
|
53
|
+
OpenCode to use the `duet` skill.
|
|
54
|
+
[Installation details](https://github.com/volkan/duet/blob/main/docs/INSTALLATION.md)
|
|
55
|
+
cover `~/.agents/skills`, prerequisites, and alternative installers. See the
|
|
56
|
+
[OpenCode guide](https://github.com/volkan/duet/blob/main/docs/OPENCODE_PLUGIN.md)
|
|
57
|
+
for its native skill and optional command wrapper.
|
|
58
|
+
|
|
59
|
+
## Native plugin installation
|
|
60
|
+
|
|
61
|
+
These optional native routes install the same shared Duet skill. Use one route
|
|
62
|
+
per host.
|
|
63
|
+
|
|
64
|
+
Codex, in a terminal:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
codex plugin marketplace add volkan/duet
|
|
68
|
+
codex plugin add duet@volkan-duet
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Start a new Codex session, then invoke `$duet`. See the [Codex installation
|
|
72
|
+
guide](https://github.com/volkan/duet/blob/main/docs/CODEX_PLUGIN.md#install-checklist)
|
|
73
|
+
for setup and marketplace recovery.
|
|
74
|
+
|
|
75
|
+
Claude Code, inside Claude Code:
|
|
76
|
+
|
|
77
|
+
```text
|
|
78
|
+
/plugin marketplace add volkan/duet
|
|
79
|
+
/plugin install duet@volkan-duet
|
|
80
|
+
/reload-plugins
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Then invoke `/duet:duet`. See the [Claude Code installation
|
|
84
|
+
guide](https://github.com/volkan/duet/blob/main/docs/CLAUDE_CODE_PLUGIN.md).
|
|
85
|
+
|
|
86
|
+
## Upgrade
|
|
87
|
+
|
|
88
|
+
Update the CLI and, if installed, the shared skill:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
pipx upgrade duet-cli
|
|
92
|
+
npx skills update duet --global
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
If pipx reports `already at latest version` despite a newer release on PyPI,
|
|
96
|
+
retry without pip's cache:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
pipx upgrade duet-cli --pip-args="--no-cache-dir"
|
|
100
|
+
duet --version
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Start a new agent session afterward. For `uv`, `pip`, source checkouts, or
|
|
104
|
+
native marketplace plugins, follow the
|
|
105
|
+
[upgrade guide](https://github.com/volkan/duet/blob/main/docs/INSTALLATION.md#upgrade).
|
|
106
|
+
|
|
107
|
+
## Go further
|
|
108
|
+
|
|
109
|
+
- [Installation, recipes, and CLI reference](https://github.com/volkan/duet/blob/main/docs/USAGE.md)
|
|
110
|
+
- [Review reports and feedback](https://github.com/volkan/duet/blob/main/docs/FINDINGS.md) · [Recorded workflow demo](https://github.com/volkan/duet/blob/main/docs/demos/README.md)
|
|
111
|
+
- [Local metrics and privacy](https://github.com/volkan/duet/blob/main/docs/METRICS.md) · [Usage evidence](https://github.com/volkan/duet/blob/main/docs/USAGE_EVIDENCE.md)
|
|
112
|
+
|
|
113
|
+
One Python file. Stdlib-only runtime; YAML support is optional. MIT licensed.
|
|
114
|
+
|
|
115
|
+
Contributing: [project guidance](https://github.com/volkan/duet/blob/main/CLAUDE.md),
|
|
116
|
+
[Codex notes](https://github.com/volkan/duet/blob/main/AGENTS.md), and
|
|
117
|
+
[merge checks](https://github.com/volkan/duet/blob/main/.github/BRANCH_PROTECTION.md).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: duet-cli
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.16
|
|
4
4
|
Summary: Two CLI agents in conversation. One Python file. Stdlib only.
|
|
5
5
|
Author: Volkan Altan
|
|
6
6
|
License-Expression: MIT
|
|
@@ -27,8 +27,10 @@ Duet runs two coding agents in alternating turns: one reviews or plans, the
|
|
|
27
27
|
other implements or challenges the result. Each keeps its own conversation,
|
|
28
28
|
and you get a saved transcript to inspect.
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
Run **two different models through a single agent harness (CLI)**, such as
|
|
31
|
+
Codex or OpenCode. You can also pair different CLIs, such as Claude Code and
|
|
32
|
+
Codex. Gemini and Copilot are also supported.
|
|
33
|
+
[See examples using one CLI](https://github.com/volkan/duet/blob/main/docs/USAGE.md#same-backend-peering).
|
|
32
34
|
|
|
33
35
|
[](https://github.com/volkan/duet/blob/main/docs/demos/finding-review.mp4)
|
|
34
36
|
|
|
@@ -44,7 +46,11 @@ both the code and a test that had accepted the incorrect output.
|
|
|
44
46
|
|
|
45
47
|
## Quick start
|
|
46
48
|
|
|
47
|
-
You need Python 3.9+ and
|
|
49
|
+
You need Python 3.9+ and at least one chosen agent CLI, installed and signed
|
|
50
|
+
in. See [Claude Code installation](https://code.claude.com/docs/en/quickstart)
|
|
51
|
+
or [Codex CLI installation](https://developers.openai.com/codex/cli#getting-started).
|
|
52
|
+
Duet uses two separate sessions, which may use the same CLI with different
|
|
53
|
+
models.
|
|
48
54
|
**Only have Codex?** [Run two Codex models](https://github.com/volkan/duet/blob/main/docs/USAGE.md#codex-only-review).
|
|
49
55
|
For the Claude + Codex pair, run this from a Git repository:
|
|
50
56
|
|
|
@@ -56,10 +62,68 @@ duet --recipe review
|
|
|
56
62
|
This starts a review and fix loop with the coder in a separate Git worktree.
|
|
57
63
|
Inspect the changes before merging; agent agreement does not prove correctness.
|
|
58
64
|
|
|
59
|
-
Already working inside an agent?
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
65
|
+
Already working inside an agent? Install the **same Duet skill** for Claude
|
|
66
|
+
Code, Codex, and OpenCode (requires Node.js/npm; choose **Symlink**):
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
npx skills add volkan/duet --skill duet --global \
|
|
70
|
+
--agent claude-code --agent codex --agent opencode
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Start a new session, then use `/duet` in Claude Code, `$duet` in Codex, or ask
|
|
74
|
+
OpenCode to use the `duet` skill.
|
|
75
|
+
[Installation details](https://github.com/volkan/duet/blob/main/docs/INSTALLATION.md)
|
|
76
|
+
cover `~/.agents/skills`, prerequisites, and alternative installers. See the
|
|
77
|
+
[OpenCode guide](https://github.com/volkan/duet/blob/main/docs/OPENCODE_PLUGIN.md)
|
|
78
|
+
for its native skill and optional command wrapper.
|
|
79
|
+
|
|
80
|
+
## Native plugin installation
|
|
81
|
+
|
|
82
|
+
These optional native routes install the same shared Duet skill. Use one route
|
|
83
|
+
per host.
|
|
84
|
+
|
|
85
|
+
Codex, in a terminal:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
codex plugin marketplace add volkan/duet
|
|
89
|
+
codex plugin add duet@volkan-duet
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Start a new Codex session, then invoke `$duet`. See the [Codex installation
|
|
93
|
+
guide](https://github.com/volkan/duet/blob/main/docs/CODEX_PLUGIN.md#install-checklist)
|
|
94
|
+
for setup and marketplace recovery.
|
|
95
|
+
|
|
96
|
+
Claude Code, inside Claude Code:
|
|
97
|
+
|
|
98
|
+
```text
|
|
99
|
+
/plugin marketplace add volkan/duet
|
|
100
|
+
/plugin install duet@volkan-duet
|
|
101
|
+
/reload-plugins
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Then invoke `/duet:duet`. See the [Claude Code installation
|
|
105
|
+
guide](https://github.com/volkan/duet/blob/main/docs/CLAUDE_CODE_PLUGIN.md).
|
|
106
|
+
|
|
107
|
+
## Upgrade
|
|
108
|
+
|
|
109
|
+
Update the CLI and, if installed, the shared skill:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
pipx upgrade duet-cli
|
|
113
|
+
npx skills update duet --global
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
If pipx reports `already at latest version` despite a newer release on PyPI,
|
|
117
|
+
retry without pip's cache:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
pipx upgrade duet-cli --pip-args="--no-cache-dir"
|
|
121
|
+
duet --version
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Start a new agent session afterward. For `uv`, `pip`, source checkouts, or
|
|
125
|
+
native marketplace plugins, follow the
|
|
126
|
+
[upgrade guide](https://github.com/volkan/duet/blob/main/docs/INSTALLATION.md#upgrade).
|
|
63
127
|
|
|
64
128
|
## Go further
|
|
65
129
|
|
|
@@ -26,7 +26,7 @@ CODEX_PLUGIN = {"name": "duet", "version": "0.2.1", "skills": "./skills/"}
|
|
|
26
26
|
|
|
27
27
|
def _make_repo(tmp: Path) -> None:
|
|
28
28
|
(tmp / "duet.py").write_text(DUET_SOURCE, encoding="utf-8")
|
|
29
|
-
claude = tmp / "plugins" / "duet
|
|
29
|
+
claude = tmp / "plugins" / "duet" / ".claude-plugin"
|
|
30
30
|
codex = tmp / "plugins" / "duet" / ".codex-plugin"
|
|
31
31
|
claude.mkdir(parents=True)
|
|
32
32
|
codex.mkdir(parents=True)
|
|
@@ -56,7 +56,7 @@ class TestBump(unittest.TestCase):
|
|
|
56
56
|
|
|
57
57
|
def _versions(self):
|
|
58
58
|
runtime = brv.read_current_version((self.root / "duet.py").read_text())
|
|
59
|
-
cl = json.loads((self.root / "plugins/duet
|
|
59
|
+
cl = json.loads((self.root / "plugins/duet/.claude-plugin/plugin.json").read_text())
|
|
60
60
|
cx = json.loads((self.root / "plugins/duet/.codex-plugin/plugin.json").read_text())
|
|
61
61
|
return runtime, cl["version"], cx["version"]
|
|
62
62
|
|
|
@@ -70,7 +70,7 @@ class TestBump(unittest.TestCase):
|
|
|
70
70
|
|
|
71
71
|
def test_bump_preserves_source_and_json_structure(self):
|
|
72
72
|
brv.bump(self.root, "0.2.2")
|
|
73
|
-
cl = json.loads((self.root / "plugins/duet
|
|
73
|
+
cl = json.loads((self.root / "plugins/duet/.claude-plugin/plugin.json").read_text())
|
|
74
74
|
self.assertEqual(cl["name"], "duet")
|
|
75
75
|
self.assertEqual(cl["author"], {"name": "Volkan Altan"})
|
|
76
76
|
source = (self.root / "duet.py").read_text()
|
|
@@ -9,7 +9,7 @@ status fallbacks. They are pure-function tests — no subprocesses, no filesyste
|
|
|
9
9
|
writes, no agent CLIs.
|
|
10
10
|
|
|
11
11
|
Run via:
|
|
12
|
-
python3 -m unittest discover -s tests
|
|
12
|
+
DUET_METRICS=0 python3 -m unittest discover -s tests
|
|
13
13
|
or (alongside the smoke suite):
|
|
14
14
|
make test
|
|
15
15
|
"""
|
duet_cli-0.2.13/README.md
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
# duet
|
|
2
|
-
|
|
3
|
-
**A second opinion for your AI coding work.**
|
|
4
|
-
|
|
5
|
-
Duet runs two coding agents in alternating turns: one reviews or plans, the
|
|
6
|
-
other implements or challenges the result. Each keeps its own conversation,
|
|
7
|
-
and you get a saved transcript to inspect.
|
|
8
|
-
|
|
9
|
-
Pair Claude and Codex, or use **two models through one CLI**. Gemini,
|
|
10
|
-
Copilot, and OpenCode are also supported.
|
|
11
|
-
|
|
12
|
-
[](https://github.com/volkan/duet/blob/main/docs/demos/finding-review.mp4)
|
|
13
|
-
|
|
14
|
-
An edited replay using a public toy fixture. [Playback and source](https://github.com/volkan/duet/blob/main/docs/demos/README.md).
|
|
15
|
-
|
|
16
|
-
## A real example
|
|
17
|
-
|
|
18
|
-
A supplied work audit describes a proposed fix that accidentally stopped
|
|
19
|
-
hiding sensitive values. The other agent challenged it, and the first revised
|
|
20
|
-
both the code and a test that had accepted the incorrect output.
|
|
21
|
-
|
|
22
|
-
[Read the anonymized cases and their limits](https://github.com/volkan/duet/blob/main/docs/REAL_CASES.md).
|
|
23
|
-
|
|
24
|
-
## Quick start
|
|
25
|
-
|
|
26
|
-
You need Python 3.9+ and the CLIs for your chosen pair, installed and signed in.
|
|
27
|
-
**Only have Codex?** [Run two Codex models](https://github.com/volkan/duet/blob/main/docs/USAGE.md#codex-only-review).
|
|
28
|
-
For the Claude + Codex pair, run this from a Git repository:
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
pipx install duet-cli
|
|
32
|
-
duet --recipe review
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
This starts a review and fix loop with the coder in a separate Git worktree.
|
|
36
|
-
Inspect the changes before merging; agent agreement does not prove correctness.
|
|
37
|
-
|
|
38
|
-
Already working inside an agent? Follow the plugin guide for
|
|
39
|
-
[Claude Code](https://github.com/volkan/duet/blob/main/docs/CLAUDE_CODE_PLUGIN.md),
|
|
40
|
-
[Codex](https://github.com/volkan/duet/blob/main/docs/CODEX_PLUGIN.md), or
|
|
41
|
-
[OpenCode](https://github.com/volkan/duet/blob/main/docs/OPENCODE_PLUGIN.md).
|
|
42
|
-
|
|
43
|
-
## Go further
|
|
44
|
-
|
|
45
|
-
- [Installation, recipes, and CLI reference](https://github.com/volkan/duet/blob/main/docs/USAGE.md)
|
|
46
|
-
- [Review reports and feedback](https://github.com/volkan/duet/blob/main/docs/FINDINGS.md) · [Recorded workflow demo](https://github.com/volkan/duet/blob/main/docs/demos/README.md)
|
|
47
|
-
- [Local metrics and privacy](https://github.com/volkan/duet/blob/main/docs/METRICS.md) · [Usage evidence](https://github.com/volkan/duet/blob/main/docs/USAGE_EVIDENCE.md)
|
|
48
|
-
|
|
49
|
-
One Python file. Stdlib-only runtime; YAML support is optional. MIT licensed.
|
|
50
|
-
|
|
51
|
-
Contributing: [project guidance](https://github.com/volkan/duet/blob/main/CLAUDE.md),
|
|
52
|
-
[Codex notes](https://github.com/volkan/duet/blob/main/AGENTS.md), and
|
|
53
|
-
[merge checks](https://github.com/volkan/duet/blob/main/.github/BRANCH_PROTECTION.md).
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|