copper-pilot-cli 0.1.4__tar.gz → 0.1.6__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.
- copper_pilot_cli-0.1.6/.claude-plugin/marketplace.json +17 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/CONTRIBUTING.md +7 -2
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/HISTORY.md +20 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/PKG-INFO +29 -6
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/README.md +27 -5
- copper_pilot_cli-0.1.6/VERSION +1 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/docs/cli.md +25 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/docs/development.md +3 -0
- copper_pilot_cli-0.1.6/docs/harness.md +108 -0
- copper_pilot_cli-0.1.6/plugins/copper-pilot/.claude-plugin/plugin.json +12 -0
- copper_pilot_cli-0.1.6/plugins/copper-pilot/.mcp.json +8 -0
- copper_pilot_cli-0.1.6/plugins/copper-pilot/agents/copper-pilot.md +17 -0
- copper_pilot_cli-0.1.6/plugins/copper-pilot/skills/copper-pilot-review/SKILL.md +26 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/pyproject.toml +4 -0
- copper_pilot_cli-0.1.6/skills/copper-pilot-review/SKILL.md +51 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_main.py +19 -7
- copper_pilot_cli-0.1.6/src/copper_pilot_cli/copper_mcp.py +432 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_main.py +13 -0
- copper_pilot_cli-0.1.6/tests/test_mcp.py +268 -0
- copper_pilot_cli-0.1.6/tests/test_plugin_manifest.py +69 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_release_gates.py +24 -4
- copper_pilot_cli-0.1.4/VERSION +0 -1
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/.gitignore +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/CODE_OF_CONDUCT.md +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/LICENSE +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/NOTICE +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/SECURITY.md +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/SUPPORT.md +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/UPSTREAM.md +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/docs/assets/esp32-mini-1-h4.gif +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/docs/assets/logo-dark.png +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/docs/assets/logo-light.png +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/docs/assets/logo.png +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/.copperpilot/PLANS.md +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/.copperpilot/README.md +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/.copperpilot/TOOLS.md +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/.copperpilot/plans/esp32-dev-board.plan.md +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/.gitignore +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/README.md +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/esp32/3d-models/SW-SMD_L3.9-W2.9-H2.0-LS4.8.step +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/esp32/3d-models/TYPE-C-31-M-12.step +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/esp32/esp32.kicad_pcb +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/esp32/esp32.kicad_pro +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/esp32/esp32.kicad_sch +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/esp32/esp32.png +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/helper.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/main.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/__init__.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/__main__.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/_upstream/__init__.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/_upstream/dcode_0_1_69/PROVENANCE.json +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/_upstream/dcode_0_1_69/__init__.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/_upstream/dcode_0_1_69/diff_utils.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/_version.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/clipboard.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_api.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_app.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_auth.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_config.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_features.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_graph.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_hooks.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_preferences.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_presentation.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_protocol.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_theme.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_tools.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_update.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_widgets.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_workspace.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/deepagents_tools.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/diagnostics.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/langchain.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/media_utils.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/py.typed +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/sessions.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/textual_patches.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_auth.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_clipboard.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_e2e.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_esp32_example.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_features.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_langchain.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_live_chat_e2e.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_preferences.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_presentation.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_protocol.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_sessions.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_tools.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_tui.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_upstream_provenance.py +0 -0
- {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_workspace.py +0 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "copper-pilot-cli",
|
|
3
|
+
"owner": {
|
|
4
|
+
"name": "CopperPilot"
|
|
5
|
+
},
|
|
6
|
+
"metadata": {
|
|
7
|
+
"description": "CopperPilot Claude Code plugin: delegate electronics design to the hosted agent.",
|
|
8
|
+
"version": "0.1.5"
|
|
9
|
+
},
|
|
10
|
+
"plugins": [
|
|
11
|
+
{
|
|
12
|
+
"name": "copper-pilot",
|
|
13
|
+
"source": "./plugins/copper-pilot",
|
|
14
|
+
"description": "MCP conductor plus @copper-pilot and /copper-pilot-review."
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
@@ -63,7 +63,8 @@ Never commit `~/.copper-pilot/.state/auth.json`, API keys, or private boards.
|
|
|
63
63
|
3. Add or update tests. Coverage of new branches in `src/copper_pilot_cli`
|
|
64
64
|
(except `_upstream/`) is expected.
|
|
65
65
|
4. Update docs when behavior changes: [README.md](README.md),
|
|
66
|
-
[docs/cli.md](docs/cli.md),
|
|
66
|
+
[docs/cli.md](docs/cli.md), [docs/harness.md](docs/harness.md), or
|
|
67
|
+
[docs/development.md](docs/development.md).
|
|
67
68
|
5. Run `make fmt && make lint && make test`.
|
|
68
69
|
6. Open a pull request with the template. Fill in the test plan.
|
|
69
70
|
|
|
@@ -78,10 +79,14 @@ Keep this client a hosted-agent frontend. Do not add:
|
|
|
78
79
|
- Model or provider pickers
|
|
79
80
|
- Local model execution
|
|
80
81
|
- Computer use
|
|
81
|
-
- MCP
|
|
82
|
+
- An MCP **host**, generic plugin runtime, or MCP **client** stack
|
|
82
83
|
- LangSmith tracing or content telemetry
|
|
83
84
|
- Sandbox runtimes
|
|
84
85
|
|
|
86
|
+
A thin MCP **server** (`copper-pilot mcp`) and a Claude Code plugin that only
|
|
87
|
+
wraps that server are in scope. They delegate to the hosted agent; they do not
|
|
88
|
+
reimplement it.
|
|
89
|
+
|
|
85
90
|
Upstream Textual presentation is vendored under
|
|
86
91
|
`src/copper_pilot_cli/_upstream/` with provenance in [UPSTREAM.md](UPSTREAM.md)
|
|
87
92
|
and [NOTICE](NOTICE). When porting upstream changes, follow that document;
|
|
@@ -4,6 +4,26 @@ Changelog
|
|
|
4
4
|
|
|
5
5
|
(unreleased)
|
|
6
6
|
------------
|
|
7
|
+
- Merge pull request #6 from CopperPilot/feat/plugins. [Aditya]
|
|
8
|
+
|
|
9
|
+
feat: add MCP conductor and Claude Code plugin
|
|
10
|
+
- Clarify server restrictions in PR template. [Aditya]
|
|
11
|
+
|
|
12
|
+
Updated checklist item to clarify server restrictions.
|
|
13
|
+
- Feat: add MCP conductor and Claude Code plugin. [AdityaNG, Cursor]
|
|
14
|
+
|
|
15
|
+
Let Claude Code, Cursor, and Codex delegate electronics work to the hosted agent via copper-pilot mcp, a portable review skill, and an in-repo plugin.
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
0.1.5 (2026-09-17)
|
|
19
|
+
------------------
|
|
20
|
+
- Release: version 0.1.5 🚀 [AdityaNG]
|
|
21
|
+
- Fix(README.md) [AdityaNG]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
0.1.4 (2026-09-17)
|
|
25
|
+
------------------
|
|
26
|
+
- Release: version 0.1.4 🚀 [AdityaNG]
|
|
7
27
|
- Fix(tests/test_release_gates.py) [AdityaNG]
|
|
8
28
|
|
|
9
29
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: copper-pilot-cli
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.6
|
|
4
4
|
Summary: CopperPilot hosted agent for the terminal and LangChain
|
|
5
5
|
Project-URL: Homepage, https://copperpilot.ai
|
|
6
6
|
Project-URL: Repository, https://github.com/CopperPilot/copper-pilot-cli
|
|
@@ -26,6 +26,7 @@ Requires-Dist: langchain-core<2,>=1.6
|
|
|
26
26
|
Requires-Dist: langgraph-checkpoint-sqlite<4,>=3.1
|
|
27
27
|
Requires-Dist: langgraph<2,>=1.2
|
|
28
28
|
Requires-Dist: markdownify<2,>=1.2
|
|
29
|
+
Requires-Dist: mcp<2,>=1.21
|
|
29
30
|
Requires-Dist: packaging<27,>=25
|
|
30
31
|
Requires-Dist: pillow<13,>=12
|
|
31
32
|
Requires-Dist: pydantic<3,>=2.12
|
|
@@ -62,9 +63,9 @@ Description-Content-Type: text/markdown
|
|
|
62
63
|
</div>
|
|
63
64
|
|
|
64
65
|
<div align="center">
|
|
65
|
-
<a href="https://github.com/CopperPilot/copper-pilot-cli/blob/main/LICENSE"><img src="https://img.shields.io/pypi/l/copper-pilot-cli" alt="License"></a>
|
|
66
|
-
<a href="https://pypi.org/project/copper-pilot-cli/"><img src="https://img.shields.io/pypi/v/copper-pilot-cli" alt="PyPI version"></a>
|
|
67
|
-
<a href="https://pypi.org/project/copper-pilot-cli/"><img src="https://img.shields.io/pypi/pyversions/copper-pilot-cli" alt="Python"></a>
|
|
66
|
+
<a href="https://github.com/CopperPilot/copper-pilot-cli/blob/main/LICENSE"><img src="https://img.shields.io/pypi/l/copper-pilot-cli.svg" alt="License"></a>
|
|
67
|
+
<a href="https://pypi.org/project/copper-pilot-cli/"><img src="https://img.shields.io/pypi/v/copper-pilot-cli.svg" alt="PyPI version"></a>
|
|
68
|
+
<a href="https://pypi.org/project/copper-pilot-cli/"><img src="https://img.shields.io/pypi/pyversions/copper-pilot-cli.svg" alt="Python"></a>
|
|
68
69
|
<a href="https://github.com/CopperPilot/copper-pilot-cli/actions/workflows/ci.yml"><img src="https://github.com/CopperPilot/copper-pilot-cli/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
69
70
|
</div>
|
|
70
71
|
|
|
@@ -111,6 +112,27 @@ Both `copper-pilot` and `copper-pilot-cli` run the same program.
|
|
|
111
112
|
`copper-pilot --help` lists flags; [docs/cli.md](docs/cli.md) is the full
|
|
112
113
|
command reference.
|
|
113
114
|
|
|
115
|
+
## Use from Claude Code, Cursor, or Codex
|
|
116
|
+
|
|
117
|
+
CopperPilot stays the electronics agent. Copy
|
|
118
|
+
[`skills/copper-pilot-review/SKILL.md`](skills/copper-pilot-review/SKILL.md) into
|
|
119
|
+
your harness, or expose the same agent over MCP:
|
|
120
|
+
|
|
121
|
+
```console
|
|
122
|
+
claude mcp add copper-pilot -- copper-pilot mcp
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Claude Code can also install the in-repo plugin:
|
|
126
|
+
|
|
127
|
+
```text
|
|
128
|
+
/plugin marketplace add CopperPilot/copper-pilot-cli
|
|
129
|
+
/plugin install copper-pilot
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
That plugin starts `copper-pilot mcp` and adds `@copper-pilot` plus
|
|
133
|
+
`/copper-pilot-review`. Setup for Cursor, Codex, and approvals:
|
|
134
|
+
[docs/harness.md](docs/harness.md).
|
|
135
|
+
|
|
114
136
|
## Configuration
|
|
115
137
|
|
|
116
138
|
- Production API: `https://copperpilot.ai`
|
|
@@ -162,8 +184,9 @@ Filesystem, search, edit, and shell execution use Deep Agents' native
|
|
|
162
184
|
normalizes hosted tool names, approval decisions, and result envelopes.
|
|
163
185
|
|
|
164
186
|
Computer use, model/provider selection, local model execution, LangSmith
|
|
165
|
-
tracing, content telemetry, MCP
|
|
166
|
-
are not part of this package.
|
|
187
|
+
tracing, content telemetry, MCP **host**/plugin-runtime controls, and server
|
|
188
|
+
implementation code are not part of this package. A thin MCP **server**
|
|
189
|
+
(`copper-pilot mcp`) that delegates to the hosted agent is.
|
|
167
190
|
|
|
168
191
|
See [UPSTREAM.md](UPSTREAM.md) and [NOTICE](NOTICE) for the retained Textual
|
|
169
192
|
client attribution.
|
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
</div>
|
|
14
14
|
|
|
15
15
|
<div align="center">
|
|
16
|
-
<a href="https://github.com/CopperPilot/copper-pilot-cli/blob/main/LICENSE"><img src="https://img.shields.io/pypi/l/copper-pilot-cli" alt="License"></a>
|
|
17
|
-
<a href="https://pypi.org/project/copper-pilot-cli/"><img src="https://img.shields.io/pypi/v/copper-pilot-cli" alt="PyPI version"></a>
|
|
18
|
-
<a href="https://pypi.org/project/copper-pilot-cli/"><img src="https://img.shields.io/pypi/pyversions/copper-pilot-cli" alt="Python"></a>
|
|
16
|
+
<a href="https://github.com/CopperPilot/copper-pilot-cli/blob/main/LICENSE"><img src="https://img.shields.io/pypi/l/copper-pilot-cli.svg" alt="License"></a>
|
|
17
|
+
<a href="https://pypi.org/project/copper-pilot-cli/"><img src="https://img.shields.io/pypi/v/copper-pilot-cli.svg" alt="PyPI version"></a>
|
|
18
|
+
<a href="https://pypi.org/project/copper-pilot-cli/"><img src="https://img.shields.io/pypi/pyversions/copper-pilot-cli.svg" alt="Python"></a>
|
|
19
19
|
<a href="https://github.com/CopperPilot/copper-pilot-cli/actions/workflows/ci.yml"><img src="https://github.com/CopperPilot/copper-pilot-cli/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
20
20
|
</div>
|
|
21
21
|
|
|
@@ -62,6 +62,27 @@ Both `copper-pilot` and `copper-pilot-cli` run the same program.
|
|
|
62
62
|
`copper-pilot --help` lists flags; [docs/cli.md](docs/cli.md) is the full
|
|
63
63
|
command reference.
|
|
64
64
|
|
|
65
|
+
## Use from Claude Code, Cursor, or Codex
|
|
66
|
+
|
|
67
|
+
CopperPilot stays the electronics agent. Copy
|
|
68
|
+
[`skills/copper-pilot-review/SKILL.md`](skills/copper-pilot-review/SKILL.md) into
|
|
69
|
+
your harness, or expose the same agent over MCP:
|
|
70
|
+
|
|
71
|
+
```console
|
|
72
|
+
claude mcp add copper-pilot -- copper-pilot mcp
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Claude Code can also install the in-repo plugin:
|
|
76
|
+
|
|
77
|
+
```text
|
|
78
|
+
/plugin marketplace add CopperPilot/copper-pilot-cli
|
|
79
|
+
/plugin install copper-pilot
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
That plugin starts `copper-pilot mcp` and adds `@copper-pilot` plus
|
|
83
|
+
`/copper-pilot-review`. Setup for Cursor, Codex, and approvals:
|
|
84
|
+
[docs/harness.md](docs/harness.md).
|
|
85
|
+
|
|
65
86
|
## Configuration
|
|
66
87
|
|
|
67
88
|
- Production API: `https://copperpilot.ai`
|
|
@@ -113,8 +134,9 @@ Filesystem, search, edit, and shell execution use Deep Agents' native
|
|
|
113
134
|
normalizes hosted tool names, approval decisions, and result envelopes.
|
|
114
135
|
|
|
115
136
|
Computer use, model/provider selection, local model execution, LangSmith
|
|
116
|
-
tracing, content telemetry, MCP
|
|
117
|
-
are not part of this package.
|
|
137
|
+
tracing, content telemetry, MCP **host**/plugin-runtime controls, and server
|
|
138
|
+
implementation code are not part of this package. A thin MCP **server**
|
|
139
|
+
(`copper-pilot mcp`) that delegates to the hosted agent is.
|
|
118
140
|
|
|
119
141
|
See [UPSTREAM.md](UPSTREAM.md) and [NOTICE](NOTICE) for the retained Textual
|
|
120
142
|
client attribution.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.1.6
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
copper-pilot --help
|
|
7
7
|
copper-pilot auth --help
|
|
8
8
|
copper-pilot threads --help
|
|
9
|
+
copper-pilot mcp --help
|
|
9
10
|
```
|
|
10
11
|
|
|
11
12
|
Python 3.12 or newer is required. Install with `pip install copper-pilot-cli`.
|
|
@@ -43,6 +44,30 @@ copper-pilot ./my-board --mode plan -m "Propose a power tree"
|
|
|
43
44
|
```
|
|
44
45
|
|
|
45
46
|
Headless mode is also used when `--message` is set and stdout is not a TTY.
|
|
47
|
+
With `--json --no-stream`, the document includes `thread_id` so a later run can
|
|
48
|
+
pass `--resume`.
|
|
49
|
+
|
|
50
|
+
## MCP
|
|
51
|
+
|
|
52
|
+
```console
|
|
53
|
+
copper-pilot mcp
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Serves a stdio MCP conductor for Claude Code, Cursor, Codex, and other MCP
|
|
57
|
+
hosts. Uses the stored device-login credential. Does not open a browser. Do not
|
|
58
|
+
write to stdout; the protocol owns it.
|
|
59
|
+
|
|
60
|
+
| Tool | Role |
|
|
61
|
+
|------|------|
|
|
62
|
+
| `status` | Login state and discovered schematic/PCB paths. No hosted call. |
|
|
63
|
+
| `ask` | `--mode ask`. Auto approval. Optional `thread_id`. |
|
|
64
|
+
| `plan` | `--mode plan`. Auto approval. |
|
|
65
|
+
| `run` | `--mode agent`. `approval` is `auto` (default) or `yolo`. |
|
|
66
|
+
| `resume` | Continue `thread_id`. Same approval as `run`. |
|
|
67
|
+
| `threads_list` | List threads for this workspace (`limit`, `all_workspaces`). |
|
|
68
|
+
|
|
69
|
+
Workspace is the tool argument, else `CLAUDE_PROJECT_DIR`, else the process
|
|
70
|
+
current directory. Manual approval is TUI-only. See [harness.md](harness.md).
|
|
46
71
|
|
|
47
72
|
## Auth
|
|
48
73
|
|
|
@@ -10,6 +10,9 @@ src/copper_pilot_cli/ Python package
|
|
|
10
10
|
tests/ pytest suite
|
|
11
11
|
examples/ Runnable examples
|
|
12
12
|
docs/ User and developer docs
|
|
13
|
+
skills/ Portable Agent Skill for other harnesses
|
|
14
|
+
plugins/ Claude Code plugin (not in the PyPI wheel)
|
|
15
|
+
.claude-plugin/ Plugin marketplace manifest
|
|
13
16
|
.github/ CI, issue forms, pull request template
|
|
14
17
|
```
|
|
15
18
|
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Use CopperPilot from Claude Code, Cursor, or Codex
|
|
2
|
+
|
|
3
|
+
CopperPilot stays the electronics agent. The outer tool (Claude Code, Cursor,
|
|
4
|
+
Codex, or a script) only **delegates**. Do not hand-edit KiCad files while a
|
|
5
|
+
CopperPilot run is in flight.
|
|
6
|
+
|
|
7
|
+
Install the CLI and log in once from a terminal:
|
|
8
|
+
|
|
9
|
+
```console
|
|
10
|
+
pip install copper-pilot-cli
|
|
11
|
+
copper-pilot auth login
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Option 1: shell out to the CLI
|
|
15
|
+
|
|
16
|
+
Copy [`skills/copper-pilot-review/SKILL.md`](../skills/copper-pilot-review/SKILL.md)
|
|
17
|
+
into the skill location your harness reads:
|
|
18
|
+
|
|
19
|
+
| Harness | Skill location |
|
|
20
|
+
|---------|----------------|
|
|
21
|
+
| Claude Code | `~/.claude/skills/copper-pilot-review/SKILL.md` or the project's `.claude/skills/` |
|
|
22
|
+
| Cursor | `.cursor/skills/copper-pilot-review/SKILL.md` or project rules that point at the file |
|
|
23
|
+
| Codex | `AGENTS.md` or the project's skill directory, depending on your Codex setup |
|
|
24
|
+
|
|
25
|
+
Then ask the outer agent to review the board. It should run:
|
|
26
|
+
|
|
27
|
+
```console
|
|
28
|
+
copper-pilot -n -m "Review this board" --json --no-stream --mode ask
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
`--json --no-stream` prints one JSON document. `thread_id` is included so the
|
|
32
|
+
next turn can pass `--resume THREAD_ID`.
|
|
33
|
+
|
|
34
|
+
Use `--mode plan` for a plan, `--mode agent -y` for Auto local writes, and
|
|
35
|
+
`--yolo` only when the user asked to skip local approval.
|
|
36
|
+
|
|
37
|
+
## Option 2: MCP conductor (`copper-pilot mcp`)
|
|
38
|
+
|
|
39
|
+
The same process as the CLI, same stored credential. Stdio JSON-RPC; do not
|
|
40
|
+
write logs to stdout.
|
|
41
|
+
|
|
42
|
+
### Claude Code
|
|
43
|
+
|
|
44
|
+
```console
|
|
45
|
+
claude mcp add copper-pilot -- copper-pilot mcp
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Or install the in-repo plugin (starts the same server automatically):
|
|
49
|
+
|
|
50
|
+
```text
|
|
51
|
+
/plugin marketplace add CopperPilot/copper-pilot-cli
|
|
52
|
+
/plugin install copper-pilot
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Local checkout:
|
|
56
|
+
|
|
57
|
+
```console
|
|
58
|
+
claude --plugin-dir plugins/copper-pilot
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
The plugin also registers `@copper-pilot` and `/copper-pilot-review`.
|
|
62
|
+
|
|
63
|
+
### Cursor
|
|
64
|
+
|
|
65
|
+
Add a stdio server in `.cursor/mcp.json`:
|
|
66
|
+
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"mcpServers": {
|
|
70
|
+
"copper-pilot": {
|
|
71
|
+
"command": "copper-pilot",
|
|
72
|
+
"args": ["mcp"]
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Codex and other MCP hosts
|
|
79
|
+
|
|
80
|
+
Point the host at `copper-pilot mcp` on stdio. Tools:
|
|
81
|
+
|
|
82
|
+
| Tool | Role |
|
|
83
|
+
|------|------|
|
|
84
|
+
| `status` | Login state and discovered schematic/PCB paths |
|
|
85
|
+
| `ask` | Read-oriented specialist (`--mode ask`) |
|
|
86
|
+
| `plan` | Plan without applying (`--mode plan`) |
|
|
87
|
+
| `run` | Mutating agent turn (`--mode agent`) |
|
|
88
|
+
| `resume` | Continue `thread_id` (`mode` defaults to `agent`; pass `mode="ask"` to keep it read-only) |
|
|
89
|
+
| `threads_list` | List threads for this workspace |
|
|
90
|
+
|
|
91
|
+
Workspace is the tool `workspace` argument, else `CLAUDE_PROJECT_DIR`, else the
|
|
92
|
+
process current directory.
|
|
93
|
+
|
|
94
|
+
## Approval
|
|
95
|
+
|
|
96
|
+
| Mode | Where | Behavior |
|
|
97
|
+
|------|-------|----------|
|
|
98
|
+
| Manual | Interactive CLI / TUI only | Prompt before gated writes and shell |
|
|
99
|
+
| Auto | Harness default (`-y`, MCP `approval=auto`) | Routine writes and known-safe shell |
|
|
100
|
+
| YOLO | Explicit `--yolo` or MCP `approval=yolo` | All local side effects. Never saved |
|
|
101
|
+
|
|
102
|
+
MCP cannot show the TUI, so Manual is not available there. `ask` and `plan`
|
|
103
|
+
always use Auto. `run` and `resume` default to Auto.
|
|
104
|
+
|
|
105
|
+
Missing credentials: MCP tools return `login_required` and tell the user to run
|
|
106
|
+
`copper-pilot auth login`. The server does not open a browser.
|
|
107
|
+
|
|
108
|
+
See [docs/cli.md](cli.md) for the full command reference.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "copper-pilot",
|
|
3
|
+
"displayName": "CopperPilot",
|
|
4
|
+
"description": "Delegate electronics design tasks to the CopperPilot hosted agent.",
|
|
5
|
+
"version": "0.1.5",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "CopperPilot"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://copperpilot.ai",
|
|
10
|
+
"repository": "https://github.com/CopperPilot/copper-pilot-cli",
|
|
11
|
+
"license": "MIT"
|
|
12
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: copper-pilot
|
|
3
|
+
description: Delegate schematic, PCB, ERC, DRC, and electronics design tasks to the CopperPilot hosted agent. Use when the user asks to review a board, inspect a net or reference, check ERC/DRC, or change KiCad files.
|
|
4
|
+
disallowedTools: Write, Edit
|
|
5
|
+
tools: Read, mcp__plugin_copper-pilot_copper-pilot__status, mcp__plugin_copper-pilot_copper-pilot__ask, mcp__plugin_copper-pilot_copper-pilot__plan, mcp__plugin_copper-pilot_copper-pilot__run, mcp__plugin_copper-pilot_copper-pilot__resume, mcp__plugin_copper-pilot_copper-pilot__threads_list
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
You are CopperPilot's specialist inside Claude Code. You do not invent ERC, DRC, stackup, or footprint judgments. You delegate to the CopperPilot MCP tools.
|
|
9
|
+
|
|
10
|
+
Rules:
|
|
11
|
+
|
|
12
|
+
- Call `status` first if login or workspace paths are unknown.
|
|
13
|
+
- Prefer `ask` unless the user asked for a schematic or PCB change. Use `plan` for a plan, `run` to apply a change, `resume` with a prior `thread_id`. `resume` defaults to agent mode (mutating); pass `mode="ask"` to continue a read-only conversation without escalating write access.
|
|
14
|
+
- Pass `approval=yolo` only when the user explicitly asked to skip local approval. Default is Auto.
|
|
15
|
+
- Do not Edit or Write KiCad files. Leave schematic and PCB side effects to CopperPilot.
|
|
16
|
+
- If a tool returns `login_required`, tell the user to run `copper-pilot auth login` in a terminal.
|
|
17
|
+
- Return a short specialist memo plus `thread_id`. Firmware, git, and docs stay with the parent agent.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: copper-pilot-review
|
|
3
|
+
description: Review a schematic or PCB with CopperPilot. Use when the user asks to review a board, check ERC/DRC, inspect a net or reference, or get electronics feedback.
|
|
4
|
+
allowed-tools: Read mcp__plugin_copper-pilot_copper-pilot__status mcp__plugin_copper-pilot_copper-pilot__ask mcp__plugin_copper-pilot_copper-pilot__plan mcp__plugin_copper-pilot_copper-pilot__run mcp__plugin_copper-pilot_copper-pilot__resume mcp__plugin_copper-pilot_copper-pilot__threads_list
|
|
5
|
+
context: fork
|
|
6
|
+
agent: copper-pilot
|
|
7
|
+
background: false
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# CopperPilot review
|
|
11
|
+
|
|
12
|
+
Delegate this request to CopperPilot. Do not invent electrical findings from KiCad source text.
|
|
13
|
+
|
|
14
|
+
Request:
|
|
15
|
+
|
|
16
|
+
$ARGUMENTS
|
|
17
|
+
|
|
18
|
+
If `$ARGUMENTS` is empty, use the user's latest message.
|
|
19
|
+
|
|
20
|
+
Steps:
|
|
21
|
+
|
|
22
|
+
1. Call `status` if login or schematic/PCB paths are unknown.
|
|
23
|
+
2. Prefer `ask` unless the user asked for a schematic or PCB change. Use `plan` for a plan and `run` only when they asked to apply a change.
|
|
24
|
+
3. Do not Edit or Write KiCad files.
|
|
25
|
+
4. If a tool returns `login_required`, tell the user to run `copper-pilot auth login`.
|
|
26
|
+
5. Summarize the specialist memo and quote `thread_id` so the parent can `resume`.
|
|
@@ -28,6 +28,7 @@ dependencies = [
|
|
|
28
28
|
"langgraph>=1.2,<2",
|
|
29
29
|
"langgraph-checkpoint-sqlite>=3.1,<4",
|
|
30
30
|
"markdownify>=1.2,<2",
|
|
31
|
+
"mcp>=1.21,<2",
|
|
31
32
|
"packaging>=25,<27",
|
|
32
33
|
"pillow>=12,<13",
|
|
33
34
|
"pydantic>=2.12,<3",
|
|
@@ -85,6 +86,9 @@ include = [
|
|
|
85
86
|
"/SUPPORT.md",
|
|
86
87
|
"/pyproject.toml",
|
|
87
88
|
"/examples",
|
|
89
|
+
"/skills",
|
|
90
|
+
"/plugins",
|
|
91
|
+
"/.claude-plugin",
|
|
88
92
|
]
|
|
89
93
|
exclude = [
|
|
90
94
|
"/examples/**/.copperpilot/tmp",
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: copper-pilot-review
|
|
3
|
+
description: Review a schematic or PCB with CopperPilot via the CLI. Use when the user asks to review a board, check ERC/DRC, inspect a net or reference, or get electronics feedback from CopperPilot.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Requires copper-pilot-cli on PATH and a CopperPilot login (`copper-pilot auth login`).
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# CopperPilot review (CLI)
|
|
9
|
+
|
|
10
|
+
You are the conductor. CopperPilot is the electronics agent. Do not invent ERC, DRC, stackup, or footprint judgments from KiCad source text when CopperPilot is available.
|
|
11
|
+
|
|
12
|
+
## Setup
|
|
13
|
+
|
|
14
|
+
1. The workspace is the project directory (the folder that contains `.kicad_pro` / `.kicad_sch` / `.kicad_pcb`, or the current working directory).
|
|
15
|
+
2. If a command fails with a login error, tell the user to run `copper-pilot auth login` in a terminal and stop.
|
|
16
|
+
|
|
17
|
+
## How to call CopperPilot
|
|
18
|
+
|
|
19
|
+
Read-only review (default):
|
|
20
|
+
|
|
21
|
+
```console
|
|
22
|
+
copper-pilot -n -m "$ARGUMENTS" --json --no-stream --mode ask
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
If `$ARGUMENTS` is empty, use the user's latest request as the message.
|
|
26
|
+
|
|
27
|
+
Propose a plan without applying it:
|
|
28
|
+
|
|
29
|
+
```console
|
|
30
|
+
copper-pilot -n -m "$ARGUMENTS" --json --no-stream --mode plan
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Apply a change the user asked for (Auto: routine writes only):
|
|
34
|
+
|
|
35
|
+
```console
|
|
36
|
+
copper-pilot -n -m "$ARGUMENTS" --json --no-stream --mode agent -y
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The JSON document includes `thread_id`. To continue the same chat:
|
|
40
|
+
|
|
41
|
+
```console
|
|
42
|
+
copper-pilot -n -m "$ARGUMENTS" --json --no-stream --resume THREAD_ID
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Rules
|
|
46
|
+
|
|
47
|
+
- Do not Edit or Write KiCad files yourself while a CopperPilot run is in flight.
|
|
48
|
+
- Prefer `--mode ask` unless the user asked for a schematic or PCB change.
|
|
49
|
+
- Do not pass `--yolo` unless the user explicitly asked to skip local approval.
|
|
50
|
+
- Summarize CopperPilot's `messages[0].content` for the user. Quote `thread_id` so they can resume.
|
|
51
|
+
- You may still read firmware, docs, and git yourself. Leave schematic and PCB side effects to CopperPilot.
|
|
@@ -44,7 +44,7 @@ def parser() -> argparse.ArgumentParser:
|
|
|
44
44
|
prog="copper-pilot",
|
|
45
45
|
description="CopperPilot hosted agent in the terminal.",
|
|
46
46
|
epilog="Subcommands: copper-pilot auth [login|logout|status]; "
|
|
47
|
-
"copper-pilot threads list|delete.",
|
|
47
|
+
"copper-pilot threads list|delete; copper-pilot mcp.",
|
|
48
48
|
)
|
|
49
49
|
result.add_argument(
|
|
50
50
|
"workspace",
|
|
@@ -100,15 +100,18 @@ def parser() -> argparse.ArgumentParser:
|
|
|
100
100
|
|
|
101
101
|
|
|
102
102
|
def command_parser(command: str) -> argparse.ArgumentParser:
|
|
103
|
+
descriptions = {
|
|
104
|
+
"auth": "Device login for the hosted CopperPilot agent.",
|
|
105
|
+
"threads": "List or delete CopperPilot chat threads.",
|
|
106
|
+
"mcp": "Run a stdio MCP server that delegates to the hosted agent.",
|
|
107
|
+
}
|
|
103
108
|
result = argparse.ArgumentParser(
|
|
104
109
|
prog=f"copper-pilot {command}",
|
|
105
|
-
description=(
|
|
106
|
-
"Device login for the hosted CopperPilot agent."
|
|
107
|
-
if command == "auth"
|
|
108
|
-
else "List or delete CopperPilot chat threads."
|
|
109
|
-
),
|
|
110
|
+
description=descriptions.get(command, ""),
|
|
110
111
|
)
|
|
111
112
|
result.set_defaults(workspace=".", message=None, command=command)
|
|
113
|
+
if command == "mcp":
|
|
114
|
+
return result
|
|
112
115
|
if command == "auth":
|
|
113
116
|
result.add_argument(
|
|
114
117
|
"action",
|
|
@@ -265,6 +268,7 @@ async def _headless(
|
|
|
265
268
|
{
|
|
266
269
|
"messages": [{"role": "assistant", "content": assistant_content}],
|
|
267
270
|
"events": events,
|
|
271
|
+
"thread_id": thread_id,
|
|
268
272
|
}
|
|
269
273
|
)
|
|
270
274
|
)
|
|
@@ -330,9 +334,17 @@ def cli_main() -> None:
|
|
|
330
334
|
argv = sys.argv[1:]
|
|
331
335
|
args = (
|
|
332
336
|
command_parser(argv[0]).parse_args(argv[1:])
|
|
333
|
-
if argv and argv[0] in {"auth", "threads"}
|
|
337
|
+
if argv and argv[0] in {"auth", "threads", "mcp"}
|
|
334
338
|
else parser().parse_args(argv)
|
|
335
339
|
)
|
|
340
|
+
if args.command == "mcp":
|
|
341
|
+
from copper_pilot_cli.copper_mcp import run_mcp
|
|
342
|
+
|
|
343
|
+
try:
|
|
344
|
+
run_mcp()
|
|
345
|
+
except KeyboardInterrupt:
|
|
346
|
+
raise SystemExit(130) from None
|
|
347
|
+
return
|
|
336
348
|
try:
|
|
337
349
|
raise SystemExit(asyncio.run(async_main(args)))
|
|
338
350
|
except (AuthenticationError, FileNotFoundError, NotADirectoryError, ValueError) as exc:
|