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.
Files changed (92) hide show
  1. copper_pilot_cli-0.1.6/.claude-plugin/marketplace.json +17 -0
  2. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/CONTRIBUTING.md +7 -2
  3. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/HISTORY.md +20 -0
  4. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/PKG-INFO +29 -6
  5. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/README.md +27 -5
  6. copper_pilot_cli-0.1.6/VERSION +1 -0
  7. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/docs/cli.md +25 -0
  8. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/docs/development.md +3 -0
  9. copper_pilot_cli-0.1.6/docs/harness.md +108 -0
  10. copper_pilot_cli-0.1.6/plugins/copper-pilot/.claude-plugin/plugin.json +12 -0
  11. copper_pilot_cli-0.1.6/plugins/copper-pilot/.mcp.json +8 -0
  12. copper_pilot_cli-0.1.6/plugins/copper-pilot/agents/copper-pilot.md +17 -0
  13. copper_pilot_cli-0.1.6/plugins/copper-pilot/skills/copper-pilot-review/SKILL.md +26 -0
  14. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/pyproject.toml +4 -0
  15. copper_pilot_cli-0.1.6/skills/copper-pilot-review/SKILL.md +51 -0
  16. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_main.py +19 -7
  17. copper_pilot_cli-0.1.6/src/copper_pilot_cli/copper_mcp.py +432 -0
  18. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_main.py +13 -0
  19. copper_pilot_cli-0.1.6/tests/test_mcp.py +268 -0
  20. copper_pilot_cli-0.1.6/tests/test_plugin_manifest.py +69 -0
  21. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_release_gates.py +24 -4
  22. copper_pilot_cli-0.1.4/VERSION +0 -1
  23. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/.gitignore +0 -0
  24. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/CODE_OF_CONDUCT.md +0 -0
  25. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/LICENSE +0 -0
  26. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/NOTICE +0 -0
  27. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/SECURITY.md +0 -0
  28. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/SUPPORT.md +0 -0
  29. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/UPSTREAM.md +0 -0
  30. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/docs/assets/esp32-mini-1-h4.gif +0 -0
  31. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/docs/assets/logo-dark.png +0 -0
  32. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/docs/assets/logo-light.png +0 -0
  33. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/docs/assets/logo.png +0 -0
  34. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/.copperpilot/PLANS.md +0 -0
  35. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/.copperpilot/README.md +0 -0
  36. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/.copperpilot/TOOLS.md +0 -0
  37. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/.copperpilot/plans/esp32-dev-board.plan.md +0 -0
  38. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/.gitignore +0 -0
  39. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/README.md +0 -0
  40. {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
  41. {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
  42. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/esp32/esp32.kicad_pcb +0 -0
  43. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/esp32/esp32.kicad_pro +0 -0
  44. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/esp32/esp32.kicad_sch +0 -0
  45. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/esp32/esp32.png +0 -0
  46. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/helper.py +0 -0
  47. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/examples/001_esp32/main.py +0 -0
  48. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/__init__.py +0 -0
  49. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/__main__.py +0 -0
  50. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/_upstream/__init__.py +0 -0
  51. {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
  52. {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
  53. {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
  54. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/_version.py +0 -0
  55. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/clipboard.py +0 -0
  56. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_api.py +0 -0
  57. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_app.py +0 -0
  58. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_auth.py +0 -0
  59. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_config.py +0 -0
  60. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_features.py +0 -0
  61. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_graph.py +0 -0
  62. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_hooks.py +0 -0
  63. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_preferences.py +0 -0
  64. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_presentation.py +0 -0
  65. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_protocol.py +0 -0
  66. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_theme.py +0 -0
  67. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_tools.py +0 -0
  68. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_update.py +0 -0
  69. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_widgets.py +0 -0
  70. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/copper_workspace.py +0 -0
  71. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/deepagents_tools.py +0 -0
  72. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/diagnostics.py +0 -0
  73. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/langchain.py +0 -0
  74. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/media_utils.py +0 -0
  75. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/py.typed +0 -0
  76. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/sessions.py +0 -0
  77. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/src/copper_pilot_cli/textual_patches.py +0 -0
  78. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_auth.py +0 -0
  79. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_clipboard.py +0 -0
  80. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_e2e.py +0 -0
  81. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_esp32_example.py +0 -0
  82. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_features.py +0 -0
  83. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_langchain.py +0 -0
  84. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_live_chat_e2e.py +0 -0
  85. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_preferences.py +0 -0
  86. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_presentation.py +0 -0
  87. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_protocol.py +0 -0
  88. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_sessions.py +0 -0
  89. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_tools.py +0 -0
  90. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_tui.py +0 -0
  91. {copper_pilot_cli-0.1.4 → copper_pilot_cli-0.1.6}/tests/test_upstream_provenance.py +0 -0
  92. {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), or [docs/development.md](docs/development.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 or plugin controls
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.4
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/plugin controls, and server implementation code
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/plugin controls, and server implementation code
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,8 @@
1
+ {
2
+ "mcpServers": {
3
+ "copper-pilot": {
4
+ "command": "copper-pilot",
5
+ "args": ["mcp"]
6
+ }
7
+ }
8
+ }
@@ -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: