duet-cli 0.2.12__tar.gz → 0.2.14__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.14/PKG-INFO +101 -0
- duet_cli-0.2.14/README.md +80 -0
- {duet_cli-0.2.12 → duet_cli-0.2.14}/duet.py +2215 -54
- duet_cli-0.2.14/duet_cli.egg-info/PKG-INFO +101 -0
- {duet_cli-0.2.12 → duet_cli-0.2.14}/duet_cli.egg-info/SOURCES.txt +9 -0
- duet_cli-0.2.14/tests/test_backend_metrics.py +243 -0
- {duet_cli-0.2.12 → duet_cli-0.2.14}/tests/test_bump_release_version.py +3 -3
- {duet_cli-0.2.12 → duet_cli-0.2.14}/tests/test_control_plane.py +186 -10
- {duet_cli-0.2.12 → duet_cli-0.2.14}/tests/test_duet.py +12 -1
- duet_cli-0.2.14/tests/test_feedback_concurrency.py +61 -0
- duet_cli-0.2.14/tests/test_finding_reports.py +170 -0
- duet_cli-0.2.14/tests/test_finding_workflow.py +346 -0
- duet_cli-0.2.14/tests/test_metrics_cli.py +150 -0
- duet_cli-0.2.14/tests/test_metrics_collection.py +309 -0
- duet_cli-0.2.14/tests/test_metrics_lifecycle.py +146 -0
- duet_cli-0.2.14/tests/test_metrics_reporting.py +306 -0
- duet_cli-0.2.14/tests/test_no_subagents.py +351 -0
- duet_cli-0.2.12/PKG-INFO +0 -276
- duet_cli-0.2.12/README.md +0 -255
- duet_cli-0.2.12/duet_cli.egg-info/PKG-INFO +0 -276
- {duet_cli-0.2.12 → duet_cli-0.2.14}/LICENSE +0 -0
- {duet_cli-0.2.12 → duet_cli-0.2.14}/duet_cli.egg-info/dependency_links.txt +0 -0
- {duet_cli-0.2.12 → duet_cli-0.2.14}/duet_cli.egg-info/entry_points.txt +0 -0
- {duet_cli-0.2.12 → duet_cli-0.2.14}/duet_cli.egg-info/requires.txt +0 -0
- {duet_cli-0.2.12 → duet_cli-0.2.14}/duet_cli.egg-info/top_level.txt +0 -0
- {duet_cli-0.2.12 → duet_cli-0.2.14}/pyproject.toml +0 -0
- {duet_cli-0.2.12 → duet_cli-0.2.14}/setup.cfg +0 -0
- {duet_cli-0.2.12 → duet_cli-0.2.14}/tests/test_stop_control_plane.py +0 -0
duet_cli-0.2.14/PKG-INFO
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: duet-cli
|
|
3
|
+
Version: 0.2.14
|
|
4
|
+
Summary: Two CLI agents in conversation. One Python file. Stdlib only.
|
|
5
|
+
Author: Volkan Altan
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/volkan/duet
|
|
8
|
+
Project-URL: Repository, https://github.com/volkan/duet
|
|
9
|
+
Keywords: agents,cli,claude,codex,llm,orchestration,pair-programming
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: Environment :: Console
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Topic :: Software Development
|
|
15
|
+
Requires-Python: >=3.9
|
|
16
|
+
Description-Content-Type: text/markdown
|
|
17
|
+
License-File: LICENSE
|
|
18
|
+
Provides-Extra: yaml
|
|
19
|
+
Requires-Dist: pyyaml; extra == "yaml"
|
|
20
|
+
Dynamic: license-file
|
|
21
|
+
|
|
22
|
+
# duet
|
|
23
|
+
|
|
24
|
+
**A second opinion for your AI coding work.**
|
|
25
|
+
|
|
26
|
+
Duet runs two coding agents in alternating turns: one reviews or plans, the
|
|
27
|
+
other implements or challenges the result. Each keeps its own conversation,
|
|
28
|
+
and you get a saved transcript to inspect.
|
|
29
|
+
|
|
30
|
+
Pair Claude and Codex, or use **two models through one CLI**. Gemini,
|
|
31
|
+
Copilot, and OpenCode are also supported.
|
|
32
|
+
|
|
33
|
+
[](https://github.com/volkan/duet/blob/main/docs/demos/finding-review.mp4)
|
|
34
|
+
|
|
35
|
+
An edited replay using a public toy fixture. [Playback and source](https://github.com/volkan/duet/blob/main/docs/demos/README.md).
|
|
36
|
+
|
|
37
|
+
## A real example
|
|
38
|
+
|
|
39
|
+
A supplied work audit describes a proposed fix that accidentally stopped
|
|
40
|
+
hiding sensitive values. The other agent challenged it, and the first revised
|
|
41
|
+
both the code and a test that had accepted the incorrect output.
|
|
42
|
+
|
|
43
|
+
[Read the anonymized cases and their limits](https://github.com/volkan/duet/blob/main/docs/REAL_CASES.md).
|
|
44
|
+
|
|
45
|
+
## Quick start
|
|
46
|
+
|
|
47
|
+
You need Python 3.9+ and the CLIs for your chosen pair, installed and signed in:
|
|
48
|
+
[install Claude Code](https://code.claude.com/docs/en/quickstart) and
|
|
49
|
+
[install Codex CLI](https://developers.openai.com/codex/cli#getting-started).
|
|
50
|
+
**Only have Codex?** [Run two Codex models](https://github.com/volkan/duet/blob/main/docs/USAGE.md#codex-only-review).
|
|
51
|
+
For the Claude + Codex pair, run this from a Git repository:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
pipx install duet-cli
|
|
55
|
+
duet --recipe review
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
This starts a review and fix loop with the coder in a separate Git worktree.
|
|
59
|
+
Inspect the changes before merging; agent agreement does not prove correctness.
|
|
60
|
+
|
|
61
|
+
Already working inside an agent? Install the **same Duet skill** for Claude
|
|
62
|
+
Code, Codex, and OpenCode (requires Node.js/npm; choose **Symlink**):
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
npx skills add volkan/duet --skill duet --global \
|
|
66
|
+
--agent claude-code --agent codex --agent opencode
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Start a new session, then use `/duet` in Claude Code, `$duet` in Codex, or ask
|
|
70
|
+
OpenCode to use the `duet` skill.
|
|
71
|
+
[Installation details](https://github.com/volkan/duet/blob/main/docs/INSTALLATION.md)
|
|
72
|
+
cover `~/.agents/skills`, prerequisites, and alternative installers. Native
|
|
73
|
+
integration guides:
|
|
74
|
+
[Claude Code](https://github.com/volkan/duet/blob/main/docs/CLAUDE_CODE_PLUGIN.md),
|
|
75
|
+
[Codex](https://github.com/volkan/duet/blob/main/docs/CODEX_PLUGIN.md), or
|
|
76
|
+
[OpenCode](https://github.com/volkan/duet/blob/main/docs/OPENCODE_PLUGIN.md).
|
|
77
|
+
|
|
78
|
+
## Upgrade
|
|
79
|
+
|
|
80
|
+
Update the CLI and, if installed, the shared skill:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
pipx upgrade duet-cli
|
|
84
|
+
npx skills update duet --global
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Start a new agent session afterward. For `uv`, `pip`, source checkouts, or
|
|
88
|
+
native marketplace plugins, follow the
|
|
89
|
+
[upgrade guide](https://github.com/volkan/duet/blob/main/docs/INSTALLATION.md#upgrade).
|
|
90
|
+
|
|
91
|
+
## Go further
|
|
92
|
+
|
|
93
|
+
- [Installation, recipes, and CLI reference](https://github.com/volkan/duet/blob/main/docs/USAGE.md)
|
|
94
|
+
- [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)
|
|
95
|
+
- [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)
|
|
96
|
+
|
|
97
|
+
One Python file. Stdlib-only runtime; YAML support is optional. MIT licensed.
|
|
98
|
+
|
|
99
|
+
Contributing: [project guidance](https://github.com/volkan/duet/blob/main/CLAUDE.md),
|
|
100
|
+
[Codex notes](https://github.com/volkan/duet/blob/main/AGENTS.md), and
|
|
101
|
+
[merge checks](https://github.com/volkan/duet/blob/main/.github/BRANCH_PROTECTION.md).
|
|
@@ -0,0 +1,80 @@
|
|
|
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
|
+
[install Claude Code](https://code.claude.com/docs/en/quickstart) and
|
|
28
|
+
[install Codex CLI](https://developers.openai.com/codex/cli#getting-started).
|
|
29
|
+
**Only have Codex?** [Run two Codex models](https://github.com/volkan/duet/blob/main/docs/USAGE.md#codex-only-review).
|
|
30
|
+
For the Claude + Codex pair, run this from a Git repository:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
pipx install duet-cli
|
|
34
|
+
duet --recipe review
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
This starts a review and fix loop with the coder in a separate Git worktree.
|
|
38
|
+
Inspect the changes before merging; agent agreement does not prove correctness.
|
|
39
|
+
|
|
40
|
+
Already working inside an agent? Install the **same Duet skill** for Claude
|
|
41
|
+
Code, Codex, and OpenCode (requires Node.js/npm; choose **Symlink**):
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npx skills add volkan/duet --skill duet --global \
|
|
45
|
+
--agent claude-code --agent codex --agent opencode
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Start a new session, then use `/duet` in Claude Code, `$duet` in Codex, or ask
|
|
49
|
+
OpenCode to use the `duet` skill.
|
|
50
|
+
[Installation details](https://github.com/volkan/duet/blob/main/docs/INSTALLATION.md)
|
|
51
|
+
cover `~/.agents/skills`, prerequisites, and alternative installers. Native
|
|
52
|
+
integration guides:
|
|
53
|
+
[Claude Code](https://github.com/volkan/duet/blob/main/docs/CLAUDE_CODE_PLUGIN.md),
|
|
54
|
+
[Codex](https://github.com/volkan/duet/blob/main/docs/CODEX_PLUGIN.md), or
|
|
55
|
+
[OpenCode](https://github.com/volkan/duet/blob/main/docs/OPENCODE_PLUGIN.md).
|
|
56
|
+
|
|
57
|
+
## Upgrade
|
|
58
|
+
|
|
59
|
+
Update the CLI and, if installed, the shared skill:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
pipx upgrade duet-cli
|
|
63
|
+
npx skills update duet --global
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Start a new agent session afterward. For `uv`, `pip`, source checkouts, or
|
|
67
|
+
native marketplace plugins, follow the
|
|
68
|
+
[upgrade guide](https://github.com/volkan/duet/blob/main/docs/INSTALLATION.md#upgrade).
|
|
69
|
+
|
|
70
|
+
## Go further
|
|
71
|
+
|
|
72
|
+
- [Installation, recipes, and CLI reference](https://github.com/volkan/duet/blob/main/docs/USAGE.md)
|
|
73
|
+
- [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)
|
|
74
|
+
- [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)
|
|
75
|
+
|
|
76
|
+
One Python file. Stdlib-only runtime; YAML support is optional. MIT licensed.
|
|
77
|
+
|
|
78
|
+
Contributing: [project guidance](https://github.com/volkan/duet/blob/main/CLAUDE.md),
|
|
79
|
+
[Codex notes](https://github.com/volkan/duet/blob/main/AGENTS.md), and
|
|
80
|
+
[merge checks](https://github.com/volkan/duet/blob/main/.github/BRANCH_PROTECTION.md).
|