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.
Files changed (26) hide show
  1. {duet_cli-0.2.13/duet_cli.egg-info → duet_cli-0.2.16}/PKG-INFO +72 -8
  2. duet_cli-0.2.16/README.md +117 -0
  3. {duet_cli-0.2.13 → duet_cli-0.2.16}/duet.py +1 -1
  4. {duet_cli-0.2.13 → duet_cli-0.2.16/duet_cli.egg-info}/PKG-INFO +72 -8
  5. {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_bump_release_version.py +3 -3
  6. {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_duet.py +1 -1
  7. duet_cli-0.2.13/README.md +0 -53
  8. {duet_cli-0.2.13 → duet_cli-0.2.16}/LICENSE +0 -0
  9. {duet_cli-0.2.13 → duet_cli-0.2.16}/duet_cli.egg-info/SOURCES.txt +0 -0
  10. {duet_cli-0.2.13 → duet_cli-0.2.16}/duet_cli.egg-info/dependency_links.txt +0 -0
  11. {duet_cli-0.2.13 → duet_cli-0.2.16}/duet_cli.egg-info/entry_points.txt +0 -0
  12. {duet_cli-0.2.13 → duet_cli-0.2.16}/duet_cli.egg-info/requires.txt +0 -0
  13. {duet_cli-0.2.13 → duet_cli-0.2.16}/duet_cli.egg-info/top_level.txt +0 -0
  14. {duet_cli-0.2.13 → duet_cli-0.2.16}/pyproject.toml +0 -0
  15. {duet_cli-0.2.13 → duet_cli-0.2.16}/setup.cfg +0 -0
  16. {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_backend_metrics.py +0 -0
  17. {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_control_plane.py +0 -0
  18. {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_feedback_concurrency.py +0 -0
  19. {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_finding_reports.py +0 -0
  20. {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_finding_workflow.py +0 -0
  21. {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_metrics_cli.py +0 -0
  22. {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_metrics_collection.py +0 -0
  23. {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_metrics_lifecycle.py +0 -0
  24. {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_metrics_reporting.py +0 -0
  25. {duet_cli-0.2.13 → duet_cli-0.2.16}/tests/test_no_subagents.py +0 -0
  26. {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.13
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
- Pair Claude and Codex, or use **two models through one CLI**. Gemini,
31
- Copilot, and OpenCode are also supported.
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
  [![Watch the 80-second review workflow demo](https://raw.githubusercontent.com/volkan/duet/main/docs/demos/finding-review.png)](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 the CLIs for your chosen pair, installed and signed in.
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? Follow the plugin guide for
60
- [Claude Code](https://github.com/volkan/duet/blob/main/docs/CLAUDE_CODE_PLUGIN.md),
61
- [Codex](https://github.com/volkan/duet/blob/main/docs/CODEX_PLUGIN.md), or
62
- [OpenCode](https://github.com/volkan/duet/blob/main/docs/OPENCODE_PLUGIN.md).
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
+ [![Watch the 80-second review workflow demo](https://raw.githubusercontent.com/volkan/duet/main/docs/demos/finding-review.png)](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).
@@ -69,7 +69,7 @@ from typing import Callable, Iterable, Optional
69
69
 
70
70
  # ---------- defaults ----------
71
71
 
72
- __version__ = "0.2.13"
72
+ __version__ = "0.2.16"
73
73
 
74
74
  DEFAULT_SENTINEL = "<<<LGTM>>>"
75
75
  DEFAULT_SANDBOX = "workspace-write"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: duet-cli
3
- Version: 0.2.13
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
- Pair Claude and Codex, or use **two models through one CLI**. Gemini,
31
- Copilot, and OpenCode are also supported.
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
  [![Watch the 80-second review workflow demo](https://raw.githubusercontent.com/volkan/duet/main/docs/demos/finding-review.png)](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 the CLIs for your chosen pair, installed and signed in.
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? Follow the plugin guide for
60
- [Claude Code](https://github.com/volkan/duet/blob/main/docs/CLAUDE_CODE_PLUGIN.md),
61
- [Codex](https://github.com/volkan/duet/blob/main/docs/CODEX_PLUGIN.md), or
62
- [OpenCode](https://github.com/volkan/duet/blob/main/docs/OPENCODE_PLUGIN.md).
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-claude" / ".claude-plugin"
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-claude/.claude-plugin/plugin.json").read_text())
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-claude/.claude-plugin/plugin.json").read_text())
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
- [![Watch the 80-second review workflow demo](https://raw.githubusercontent.com/volkan/duet/main/docs/demos/finding-review.png)](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