copper-pilot-cli 0.1.9__tar.gz → 0.1.10__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.9 → copper_pilot_cli-0.1.10}/HISTORY.md +159 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/PKG-INFO +19 -2
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/README.md +18 -1
- copper_pilot_cli-0.1.10/VERSION +1 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/docs/cli.md +81 -3
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/docs/development.md +14 -1
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/docs/harness.md +41 -3
- copper_pilot_cli-0.1.10/docs/validate.md +286 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/plugins/copper-pilot/agents/copper-pilot.md +2 -1
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/plugins/copper-pilot/skills/copper-pilot-review/SKILL.md +3 -2
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/skills/copper-pilot-review/SKILL.md +23 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_acp.py +497 -46
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_app.py +16 -2
- copper_pilot_cli-0.1.10/src/copper_pilot_cli/copper_background.py +285 -0
- copper_pilot_cli-0.1.10/src/copper_pilot_cli/copper_graph.py +533 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_main.py +16 -2
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_mcp.py +102 -3
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_protocol.py +113 -8
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/deepagents_tools.py +36 -2
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/langchain.py +6 -0
- copper_pilot_cli-0.1.10/src/copper_pilot_cli/validate/__init__.py +98 -0
- copper_pilot_cli-0.1.10/src/copper_pilot_cli/validate/builtins.py +669 -0
- copper_pilot_cli-0.1.10/src/copper_pilot_cli/validate/cli.py +333 -0
- copper_pilot_cli-0.1.10/src/copper_pilot_cli/validate/config.py +407 -0
- copper_pilot_cli-0.1.10/src/copper_pilot_cli/validate/default.yaml +345 -0
- copper_pilot_cli-0.1.10/src/copper_pilot_cli/validate/design.py +503 -0
- copper_pilot_cli-0.1.10/src/copper_pilot_cli/validate/kicad.py +177 -0
- copper_pilot_cli-0.1.10/src/copper_pilot_cli/validate/report.py +335 -0
- copper_pilot_cli-0.1.10/src/copper_pilot_cli/validate/reviewer.py +477 -0
- copper_pilot_cli-0.1.10/src/copper_pilot_cli/validate/runner.py +739 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_acp.py +714 -6
- copper_pilot_cli-0.1.10/tests/test_durability.py +683 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_langchain.py +19 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_main.py +60 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_mcp.py +86 -2
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_tui.py +26 -0
- copper_pilot_cli-0.1.10/tests/test_validate.py +1603 -0
- copper_pilot_cli-0.1.10/tests/test_validate_live.py +38 -0
- copper_pilot_cli-0.1.9/VERSION +0 -1
- copper_pilot_cli-0.1.9/src/copper_pilot_cli/copper_graph.py +0 -217
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/.claude-plugin/marketplace.json +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/.gitignore +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/CODE_OF_CONDUCT.md +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/CONTRIBUTING.md +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/LICENSE +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/NOTICE +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/SECURITY.md +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/SUPPORT.md +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/UPSTREAM.md +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/docs/assets/esp32-mini-1-h4.gif +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/docs/assets/logo-dark.png +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/docs/assets/logo-light.png +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/docs/assets/logo.png +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/.gitignore +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/.copperpilot/PLANS.md +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/.copperpilot/README.md +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/.copperpilot/TOOLS.md +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/.copperpilot/plans/esp32-dev-board.plan.md +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/.gitignore +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/README.md +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/esp32/3d-models/SW-SMD_L3.9-W2.9-H2.0-LS4.8.step +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/esp32/3d-models/TYPE-C-31-M-12.step +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/esp32/esp32.kicad_pcb +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/esp32/esp32.kicad_pro +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/esp32/esp32.kicad_sch +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/esp32/esp32.png +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/helper.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/main.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/.copperpilot/PLANS.md +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/.copperpilot/README.md +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/.copperpilot/plans/cm5-camera-carrier.plan.md +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/.gitignore +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/README.md +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/assembly_spec.json +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/3dmodels/CM4.step +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/3dmodels/CM5.step +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/3dmodels/Camera_IMX219-D160.step +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/3dmodels/USB_A_Molex_105057-0001_Vertical.wrl +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/3dmodels/USB_A_vertical.step +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/5033981892.stp +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/DF40C-100DS.stp +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/JTHDA-19F08.STEP +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/SRP5030CC.stp +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_dru +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_pcb +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_pro +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_sch +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_sym +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.png +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/C_0402_1005Metric.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/C_0805_2012Metric.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Camera_Module_IMX219-D160.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Crystal_SMD_3225-4Pin_3.2x2.5mm.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/HDMI_Mini-C_Molex_47151-0001.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/LED_0603_1608Metric.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/L_Bourns_SRP5030CC.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/L_CommonModeChoke_Coilank_ACM1210.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/MOLEX_USB_67298-4090.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Molex_200528-0150_1x15-1MP_P1.00mm_Horizontal.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/PinHeader_1x03_P2.54mm_Vertical.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/PinHeader_2x20_P2.54mm_Vertical.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/R_0402_1005Metric.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/R_0603_1608Metric.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Raspberry-Pi-4-Compute-Module.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/SDCARD_MOLEX_503398-1892.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/SOT-23-5.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/SW_SPST_PTS645Sx43SMTR92.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/TSOT-23-6.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Texas_DRT-3.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/UQFN-10_1.4x1.8mm_P0.4mm.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal.kicad_mod +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera_bottom.png +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/fp-lib-table +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/sym-lib-table +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/generate_3d_models.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/helper.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/main.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/plugins/copper-pilot/.claude-plugin/plugin.json +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/plugins/copper-pilot/.mcp.json +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/pyproject.toml +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/__init__.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/__main__.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/_upstream/__init__.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/_upstream/dcode_0_1_69/PROVENANCE.json +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/_upstream/dcode_0_1_69/__init__.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/_upstream/dcode_0_1_69/diff_utils.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/_version.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/clipboard.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_api.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_auth.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_config.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_features.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_hooks.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_preferences.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_presentation.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_status_events.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_theme.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_tools.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_update.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_widgets.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_workspace.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/diagnostics.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/media_utils.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/py.typed +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/sessions.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/textual_patches.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_auth.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_clipboard.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_cm5_camera_example.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_copper_api.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_e2e.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_esp32_example.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_features.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_live_chat_e2e.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_plugin_manifest.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_preferences.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_presentation.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_protocol.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_release_gates.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_sessions.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_status_events.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_tools.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_upstream_provenance.py +0 -0
- {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_workspace.py +0 -0
|
@@ -4,6 +4,165 @@ Changelog
|
|
|
4
4
|
|
|
5
5
|
(unreleased)
|
|
6
6
|
------------
|
|
7
|
+
|
|
8
|
+
Fix
|
|
9
|
+
~~~
|
|
10
|
+
- Skip the killed-background resume test on Windows. [AdityaNG, Cursor]
|
|
11
|
+
|
|
12
|
+
os.killpg is POSIX-only, and that failure was the Windows CI break.
|
|
13
|
+
- Resume the agent when a background shell already exited. [AdityaNG,
|
|
14
|
+
Cursor]
|
|
15
|
+
|
|
16
|
+
The continuation turn only ran while a background command was still alive, so a search that finished during the rest of the turn never woke the agent.
|
|
17
|
+
|
|
18
|
+
Other
|
|
19
|
+
~~~~~
|
|
20
|
+
- Merge pull request #23 from CopperPilot/feat/acp-image-prompts.
|
|
21
|
+
[Aditya]
|
|
22
|
+
|
|
23
|
+
feat(acp): accept image prompts
|
|
24
|
+
- Feat(acp): accept image prompts. [AdityaNG, Cursor]
|
|
25
|
+
|
|
26
|
+
T3 Code refused to start any ACP turn that carried an image because initialize never advertised promptCapabilities.image, and prompt() dropped image blocks anyway. Advertise image support, save each image block under .copperpilot/attachments, pass it as a path-first runtime attachment like the TUI does, and list the saved paths in the query so the agent reads the workspace copy.
|
|
27
|
+
- Merge pull request #22 from CopperPilot/fix/resume-finished-
|
|
28
|
+
background-shell. [Aditya]
|
|
29
|
+
|
|
30
|
+
fix: resume the agent when a background shell already exited
|
|
31
|
+
- Merge pull request #21 from CopperPilot/feat/validate. [Aditya]
|
|
32
|
+
|
|
33
|
+
feat: copper-pilot validate, a stage-gated read-only review graph
|
|
34
|
+
- Fix(validate): default reviewers to agent mode and pass Windows CI.
|
|
35
|
+
[AdityaNG, Cursor]
|
|
36
|
+
|
|
37
|
+
Agent mode is the better default for hosted reviewers; the read-only broker still blocks design writes. Windows treated POSIX virtual paths and library URIs as relative, and os.kill(SIGTERM) aborted pytest before it could report.
|
|
38
|
+
- Fix(validate): enforce reviewer.timeout_s and treat SIGTERM like
|
|
39
|
+
Ctrl-C. [AdityaNG, Claude Fable 5.1]
|
|
40
|
+
|
|
41
|
+
A hosted architecture review on a 68-part board outlived an external
|
|
42
|
+
timeout(1) wrapper; SIGTERM killed the process with no report, and the
|
|
43
|
+
graph's reviewer.timeout_s had never been applied. Each reviewer slice now
|
|
44
|
+
runs under asyncio.timeout(reviewer.timeout_s) and times out as an ERROR,
|
|
45
|
+
and the CLI maps SIGTERM onto the same partial-report path as Ctrl-C.
|
|
46
|
+
- Fix(validate): scope release.repo to the project folder; tolerate
|
|
47
|
+
markdown escapes in replies. [AdityaNG, Claude Fable 5.1]
|
|
48
|
+
|
|
49
|
+
Running validate on a repository that keeps generated boards outside the
|
|
50
|
+
KiCad project (video/build/tmp_pcbs) counted them as portability failures.
|
|
51
|
+
The workspace walker now skips the same build/dist/node_modules folders as
|
|
52
|
+
discover_workspace, and release.repo only scans the project folder.
|
|
53
|
+
|
|
54
|
+
A live sch.ratings reviewer wrote '\*' inside JSON strings, which is not a
|
|
55
|
+
JSON escape and cost a repair turn; invalid escapes are now dropped before
|
|
56
|
+
the repair path is used.
|
|
57
|
+
- Feat(validate): explain, --context, Python validate() API, and live
|
|
58
|
+
test. [AdityaNG, Claude Fable 5.1]
|
|
59
|
+
|
|
60
|
+
Add copper-pilot validate explain CHECK_ID (config, rendered prompt, input
|
|
61
|
+
hashes, last result), --context FILE ... (appended to every reviewer prompt
|
|
62
|
+
under Reference material and folded into the cache key), the
|
|
63
|
+
copper_pilot_cli.validate.validate()/avalidate() API returning a
|
|
64
|
+
ValidationReport, and a pytest -m live end-to-end run of validate --until S2
|
|
65
|
+
on examples/001_esp32.
|
|
66
|
+
- Feat(validate): --json events, --junit, --emit-fix-prompt, MCP
|
|
67
|
+
validate tool, skill and docs. [AdityaNG, Claude Fable 5.1]
|
|
68
|
+
|
|
69
|
+
Stream validate.start/check/result/end events (plus copper.retry pass-through)
|
|
70
|
+
with --json, write JUnit XML with --junit (FAIL/ERROR -> failure/error,
|
|
71
|
+
SKIPPED -> skipped naming the blocker, WARN -> system-out), and print a
|
|
72
|
+
ready fix message for copper-pilot --mode agent with --emit-fix-prompt.
|
|
73
|
+
Expose validate(workspace?, profile?, gate?, until?, only?, effort?,
|
|
74
|
+
no_cache?) on the MCP server with per-check progress and the fixed read-only
|
|
75
|
+
reviewer policy. Add a Validate section to the review skill and plugin,
|
|
76
|
+
docs/validate.md, and the CLI reference with the exit-code table.
|
|
77
|
+
- Feat(validate): hosted agent reviewers with read-only broker,
|
|
78
|
+
grounding and consensus. [AdityaNG, Claude Fable 5.1]
|
|
79
|
+
|
|
80
|
+
Add the reviewer adapter: each agent check runs CopperPilot in Ask mode
|
|
81
|
+
against a read-only snapshot of the workspace through a Manual broker whose
|
|
82
|
+
policy approves reads, scratch-folder writes and non-dangerous shell only.
|
|
83
|
+
The snapshot is re-hashed after every check; any change outside scratch is
|
|
84
|
+
an ERROR. Replies must end with a fenced json findings block (two repair
|
|
85
|
+
turns, then ERROR); findings are grounded against the design index and
|
|
86
|
+
ungrounded ones can never fail a check. per_part, per_sheet and per_netclass
|
|
87
|
+
checks fan out in batches, repeat: N takes a majority consensus, and a
|
|
88
|
+
non-retryable usage-limit block stops scheduling agent checks and exits 4.
|
|
89
|
+
default.yaml gains the agent checks for S1-S8 and the CLI gains --effort,
|
|
90
|
+
--concurrency and --repeat.
|
|
91
|
+
- Feat(validate): engine, builtin checks, reports, and validate
|
|
92
|
+
list|graph|run. [AdityaNG, Claude Fable 5.1]
|
|
93
|
+
|
|
94
|
+
Add the copper-pilot validate subcommand: a stage-gated graph of read-only
|
|
95
|
+
checks loaded from a packaged default.yaml and extended by
|
|
96
|
+
.copperpilot/validate.yaml. This slice ships the engine (config models and
|
|
97
|
+
graph validation, design snapshot/hash/index, kicad-cli wrappers, dependency
|
|
98
|
+
waves, stage/full/strict gating, result cache) with the deterministic builtin
|
|
99
|
+
checks (intake.tools, intake.project, intake.intent, parts.bom_fields,
|
|
100
|
+
sch.erc, pcb.parity, pcb.rules, pcb.drc, release.outputs, release.repo) and
|
|
101
|
+
writes report.json, REPORT.md and next_actions.json under
|
|
102
|
+
.copperpilot/validate/runs/<id>/ with a latest pointer.
|
|
103
|
+
- Merge pull request #20 from CopperPilot/feat/acp-session-updates.
|
|
104
|
+
[Aditya]
|
|
105
|
+
|
|
106
|
+
feat(acp): usage, plan, subagent, elicitation, and /effort session updates
|
|
107
|
+
- Merge origin/main into feat/acp-session-updates. [AdityaNG, Claude
|
|
108
|
+
Fable 5.1]
|
|
109
|
+
- Merge pull request #19 from CopperPilot/feat/client-turn-durability.
|
|
110
|
+
[Aditya]
|
|
111
|
+
|
|
112
|
+
feat: make hosted turns durable across transport drops
|
|
113
|
+
- Fix(background): normalize CRLF shell output on Windows. [AdityaNG,
|
|
114
|
+
Claude Fable 5.1]
|
|
115
|
+
- Feat: make hosted turns durable across transport drops. [AdityaNG,
|
|
116
|
+
Claude Fable 5.1]
|
|
117
|
+
|
|
118
|
+
Port the desktop client's chat-manager resilience into the shared graph
|
|
119
|
+
node so every front-end (TUI, headless, MCP, ACP) benefits:
|
|
120
|
+
|
|
121
|
+
- Retry a dropped stream up to three times with 5/10/20 s backoff and a
|
|
122
|
+
stitched "Resume where we left off" re-prompt carrying the partial
|
|
123
|
+
transcript, so the hosted agent continues instead of restarting.
|
|
124
|
+
- Classify failures like `_categorizeError`: drops, timeouts, 5xx and 429
|
|
125
|
+
retry; 4xx, invalid/oversized requests, plan refusals and auth fail fast.
|
|
126
|
+
- Capture the websocket close code and reason in the error message and log,
|
|
127
|
+
including drops that happen while a tool result is being sent.
|
|
128
|
+
- Checkpoint partial progress (text, tool calls, results) on a terminal
|
|
129
|
+
failure or cancellation with a hidden interruption note, so a later
|
|
130
|
+
manual "continue" has the prior work in context.
|
|
131
|
+
- Surface retry progress as `copper.retry` events: ACP agent thoughts, TUI
|
|
132
|
+
status/notification, headless yellow lines, MCP progress.
|
|
133
|
+
- Honour the desktop foreground-to-background shell contract: commands
|
|
134
|
+
outliving their timeout keep running, the turn continues, and their
|
|
135
|
+
output is fed back in a continuation turn after the final frame.
|
|
136
|
+
- Drop the 300 s idle-frame timeout; websocket keepalive still detects dead
|
|
137
|
+
peers and long hosted reasoning no longer trips a client limit.
|
|
138
|
+
- Fix the ACP cancel race where a server close after `session/cancel`
|
|
139
|
+
surfaced as an error instead of `cancelled`.
|
|
140
|
+
- Fix(acp): read slash commands from the first prompt block. [AdityaNG,
|
|
141
|
+
Claude Fable 5.1]
|
|
142
|
+
|
|
143
|
+
T3 Code appends runtime context as a second text block, so /effort was
|
|
144
|
+
reaching the hosted agent instead of being answered locally.
|
|
145
|
+
- Fix(acp): elicit option questions, unwrap T3 prompts, bound question
|
|
146
|
+
waits. [AdityaNG, Claude Fable 5.1]
|
|
147
|
+
|
|
148
|
+
T3 Code in Full access auto-selects the first option of a permission prompt,
|
|
149
|
+
so clarifying questions with options now use form elicitation (enum) when the
|
|
150
|
+
client supports it. /effort is recognised inside T3's <user_request> envelope.
|
|
151
|
+
Questions nobody answers within 100 seconds are skipped with a note, because
|
|
152
|
+
the hosted service drops a turn whose tool result takes longer than two minutes.
|
|
153
|
+
- Feat(acp): usage, plan, subagent, elicitation, and /effort updates.
|
|
154
|
+
[AdityaNG, Claude Fable 5.1]
|
|
155
|
+
|
|
156
|
+
Emit usage_update from hosted token counts so T3 Code's context meter works,
|
|
157
|
+
project hosted todo_list events and .copperpilot/plans artifacts onto ACP plan
|
|
158
|
+
entries, render Intelligence survey workers as think tool calls, collect
|
|
159
|
+
free-text clarifications through ACP form elicitation when the client supports
|
|
160
|
+
it, and advertise a locally handled /effort command.
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
0.1.9 (2026-10-16)
|
|
164
|
+
------------------
|
|
165
|
+
- Release: version 0.1.9 🚀 [AdityaNG]
|
|
7
166
|
- Merge pull request #18 from CopperPilot/feat/acp-server. [Aditya]
|
|
8
167
|
|
|
9
168
|
feat: add `copper-pilot acp` Agent Client Protocol server
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: copper-pilot-cli
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.10
|
|
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
|
|
@@ -122,6 +122,22 @@ Balanced effort is the default. Paid-plan users can select Intelligence with
|
|
|
122
122
|
server-owned survey subagents and shows their lifecycle through the existing
|
|
123
123
|
Deep Agents task rows; Intelligence Plan turns survey before writing a plan.
|
|
124
124
|
|
|
125
|
+
## Validate
|
|
126
|
+
|
|
127
|
+
```console
|
|
128
|
+
copper-pilot validate ./my-board
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Runs a stage-gated graph of read-only reviewers over the KiCad workspace:
|
|
132
|
+
`kicad-cli` checks (ERC, DRC, schematic parity, board rules, Gerbers) plus
|
|
133
|
+
hosted Agent-mode reviewers, each scoped to one concern, in the order a hardware
|
|
134
|
+
engineer reviews a board. It never edits design files. The verdict, a
|
|
135
|
+
`REPORT.md`, and `next_actions.json` (only the earliest failing stage, worst
|
|
136
|
+
first) land in `.copperpilot/validate/latest/`; `--emit-fix-prompt` prints a
|
|
137
|
+
ready message for `copper-pilot --mode agent`. Exit codes: 0 pass, 1 fail,
|
|
138
|
+
2 config error, 3 incomplete, 4 not logged in or usage limit. See
|
|
139
|
+
[docs/validate.md](docs/validate.md).
|
|
140
|
+
|
|
125
141
|
## Use from Claude Code, Cursor, or Codex
|
|
126
142
|
|
|
127
143
|
CopperPilot stays the electronics agent. Copy
|
|
@@ -139,7 +155,8 @@ Claude Code can also install the in-repo plugin:
|
|
|
139
155
|
/plugin install copper-pilot
|
|
140
156
|
```
|
|
141
157
|
|
|
142
|
-
That plugin starts `copper-pilot mcp`
|
|
158
|
+
That plugin starts `copper-pilot mcp` (tools `status`, `ask`, `plan`, `run`,
|
|
159
|
+
`resume`, `threads_list`, `validate`) and adds `@copper-pilot` plus
|
|
143
160
|
`/copper-pilot-review`. Editors that speak the Agent Client Protocol, such as
|
|
144
161
|
Zed, can run `copper-pilot acp` after `pip install "copper-pilot-cli[acp]"`.
|
|
145
162
|
Setup for Cursor, Codex, Zed, and approvals: [docs/harness.md](docs/harness.md).
|
|
@@ -68,6 +68,22 @@ Balanced effort is the default. Paid-plan users can select Intelligence with
|
|
|
68
68
|
server-owned survey subagents and shows their lifecycle through the existing
|
|
69
69
|
Deep Agents task rows; Intelligence Plan turns survey before writing a plan.
|
|
70
70
|
|
|
71
|
+
## Validate
|
|
72
|
+
|
|
73
|
+
```console
|
|
74
|
+
copper-pilot validate ./my-board
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Runs a stage-gated graph of read-only reviewers over the KiCad workspace:
|
|
78
|
+
`kicad-cli` checks (ERC, DRC, schematic parity, board rules, Gerbers) plus
|
|
79
|
+
hosted Agent-mode reviewers, each scoped to one concern, in the order a hardware
|
|
80
|
+
engineer reviews a board. It never edits design files. The verdict, a
|
|
81
|
+
`REPORT.md`, and `next_actions.json` (only the earliest failing stage, worst
|
|
82
|
+
first) land in `.copperpilot/validate/latest/`; `--emit-fix-prompt` prints a
|
|
83
|
+
ready message for `copper-pilot --mode agent`. Exit codes: 0 pass, 1 fail,
|
|
84
|
+
2 config error, 3 incomplete, 4 not logged in or usage limit. See
|
|
85
|
+
[docs/validate.md](docs/validate.md).
|
|
86
|
+
|
|
71
87
|
## Use from Claude Code, Cursor, or Codex
|
|
72
88
|
|
|
73
89
|
CopperPilot stays the electronics agent. Copy
|
|
@@ -85,7 +101,8 @@ Claude Code can also install the in-repo plugin:
|
|
|
85
101
|
/plugin install copper-pilot
|
|
86
102
|
```
|
|
87
103
|
|
|
88
|
-
That plugin starts `copper-pilot mcp`
|
|
104
|
+
That plugin starts `copper-pilot mcp` (tools `status`, `ask`, `plan`, `run`,
|
|
105
|
+
`resume`, `threads_list`, `validate`) and adds `@copper-pilot` plus
|
|
89
106
|
`/copper-pilot-review`. Editors that speak the Agent Client Protocol, such as
|
|
90
107
|
Zed, can run `copper-pilot acp` after `pip install "copper-pilot-cli[acp]"`.
|
|
91
108
|
Setup for Cursor, Codex, Zed, and approvals: [docs/harness.md](docs/harness.md).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.1.10
|
|
@@ -8,6 +8,7 @@ copper-pilot auth --help
|
|
|
8
8
|
copper-pilot threads --help
|
|
9
9
|
copper-pilot mcp --help
|
|
10
10
|
copper-pilot acp --help
|
|
11
|
+
copper-pilot validate --help
|
|
11
12
|
```
|
|
12
13
|
|
|
13
14
|
Python 3.11 or newer is required. Install with `pip install copper-pilot-cli`.
|
|
@@ -50,6 +51,39 @@ Headless mode is also used when `--message` is set and stdout is not a TTY.
|
|
|
50
51
|
With `--json --no-stream`, the document includes `thread_id` so a later run can
|
|
51
52
|
pass `--resume`.
|
|
52
53
|
|
|
54
|
+
## Validate
|
|
55
|
+
|
|
56
|
+
```console
|
|
57
|
+
copper-pilot validate [workspace] [--profile dev|release] [--gate stage|full|strict]
|
|
58
|
+
[--until STAGE] [--only ID,...] [--skip ID,...] [--json] [--junit PATH]
|
|
59
|
+
copper-pilot validate list|graph [workspace]
|
|
60
|
+
copper-pilot validate explain CHECK_ID [workspace]
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Runs a stage-gated graph of read-only reviewers: `kicad-cli` checks (ERC,
|
|
64
|
+
DRC, parity, rules, Gerbers) and hosted Agent-mode reviewers scoped to one
|
|
65
|
+
concern each, in the order a hardware engineer reviews (intake, architecture,
|
|
66
|
+
parts, schematic, netlist-to-layout, placement, routing, DFM/DFA, release).
|
|
67
|
+
It never modifies design files. Outputs land in `.copperpilot/validate/latest/`:
|
|
68
|
+
`report.json`, `REPORT.md`, and `next_actions.json` (only the earliest failing
|
|
69
|
+
stage, worst first). Uses the stored credential; never opens a browser.
|
|
70
|
+
|
|
71
|
+
| Code | Meaning |
|
|
72
|
+
|------|---------|
|
|
73
|
+
| 0 | PASS: every selected check is PASS or WARN |
|
|
74
|
+
| 1 | FAIL: at least one blocking FAIL or ERROR |
|
|
75
|
+
| 2 | Usage or config error: bad flags, invalid YAML, a dependency cycle |
|
|
76
|
+
| 3 | INCOMPLETE: no failures, but checks were SKIPPED because of `--gate`, `--until` or `--only` |
|
|
77
|
+
| 4 | Environment: not logged in, or a usage-limit block |
|
|
78
|
+
|
|
79
|
+
```console
|
|
80
|
+
copper-pilot validate ./my-board --json --gate stage
|
|
81
|
+
copper-pilot validate ./my-board --until S3 --emit-fix-prompt
|
|
82
|
+
copper-pilot validate ./my-board --profile release --gate full --junit validate.xml
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Flags, config, the default graph and the fix loop: [validate.md](validate.md).
|
|
86
|
+
|
|
53
87
|
## MCP
|
|
54
88
|
|
|
55
89
|
```console
|
|
@@ -68,6 +102,7 @@ write to stdout; the protocol owns it.
|
|
|
68
102
|
| `run` | `--mode agent`. Optional `effort`; `approval` is `auto` (default) or `yolo`. |
|
|
69
103
|
| `resume` | Continue `thread_id`. Optional `mode`, `effort`, and the same approval as `run`. |
|
|
70
104
|
| `threads_list` | List threads for this workspace (`limit`, `all_workspaces`). |
|
|
105
|
+
| `validate` | Read-only stage-gated review; returns `verdict`, `exit_code`, `report_path`, `next_actions`. |
|
|
71
106
|
|
|
72
107
|
Workspace is the tool argument, else `CLAUDE_PROJECT_DIR`, else the process
|
|
73
108
|
current directory. Manual approval is TUI-only. See [harness.md](harness.md).
|
|
@@ -93,12 +128,23 @@ advertises a terminal auth method that runs `copper-pilot auth login`.
|
|
|
93
128
|
| Config options | `mode` and `effort` (`balanced` default, `intelligence` paid) |
|
|
94
129
|
| `session/load` | Resumes an existing thread id and replays its history |
|
|
95
130
|
| `session/request_permission` | Auto approval; non-routine writes and shell prompt the editor |
|
|
131
|
+
| `elicitation/create` | Clarifying questions (options or free text) when the client advertises form elicitation |
|
|
96
132
|
| `session/cancel` | Cancels the hosted turn and local tools |
|
|
133
|
+
| `usage_update` | Prompt tokens of the latest hosted turn; window size is unknown (0) |
|
|
134
|
+
| `plan` | Hosted todo list events and `.copperpilot/plans/*.plan.md` todos |
|
|
135
|
+
| `available_commands_update` | `/effort balanced\|intelligence`, answered locally |
|
|
97
136
|
|
|
98
137
|
"Allow all for this session" switches that session to YOLO until the server
|
|
99
|
-
exits; it is never saved. Clarifying questions
|
|
100
|
-
|
|
101
|
-
|
|
138
|
+
exits; it is never saved. Clarifying questions use ACP form elicitation when
|
|
139
|
+
the client supports it (T3 Code does): options become an enum, free text a
|
|
140
|
+
string field. Without form elicitation, option questions are shown as
|
|
141
|
+
permission choices plus Skip and free-text questions are declined with a
|
|
142
|
+
message to continue in the TUI. A question nobody answers within 100 seconds
|
|
143
|
+
is skipped with a note asking the model to repeat it in its reply, because the
|
|
144
|
+
hosted service drops a turn whose tool result takes longer than two minutes.
|
|
145
|
+
Intelligence survey workers appear as `think` tool calls named
|
|
146
|
+
`Survey: <task>` whose status and output track the worker.
|
|
147
|
+
See [harness.md](harness.md).
|
|
102
148
|
|
|
103
149
|
## Effort and Intelligence
|
|
104
150
|
|
|
@@ -167,6 +213,38 @@ searches run freely. Writes, edits, deletes, and shell commands are gated:
|
|
|
167
213
|
|
|
168
214
|
`--yolo` wins over `--auto-approve`. Saved preferences never enable YOLO.
|
|
169
215
|
|
|
216
|
+
## Turn durability
|
|
217
|
+
|
|
218
|
+
Every front-end (TUI, headless, MCP, ACP) runs a hosted turn through the same
|
|
219
|
+
checkpointed graph node, which mirrors the desktop client's chat manager:
|
|
220
|
+
|
|
221
|
+
- A stream that drops before the final frame (socket close, timeout, 5xx, 429)
|
|
222
|
+
is retried up to three times with 5 s, 10 s, and 20 s backoff. The retry
|
|
223
|
+
re-prompts the hosted agent with the partial transcript and
|
|
224
|
+
`Resume where we left off: <original message>` so it continues rather than
|
|
225
|
+
restarting. Deterministic failures (4xx other than 429, invalid or oversized
|
|
226
|
+
requests, plan refusals, auth) fail immediately.
|
|
227
|
+
- Retry progress is visible: the TUI status bar and a notification, a yellow
|
|
228
|
+
line in headless text mode, MCP progress, and ACP agent thoughts
|
|
229
|
+
(`Retrying (1/2) in 5s: …`). `--json` emits `copper.retry` events.
|
|
230
|
+
- The websocket close code and reason are carried into the error message
|
|
231
|
+
(`close code 1011 received: …`) and the log file.
|
|
232
|
+
- Whatever a failed turn produced before the error (assistant text, tool calls
|
|
233
|
+
and results) is still checkpointed with a hidden
|
|
234
|
+
`[Turn interrupted before completion: …]` note, so a later "continue" has the
|
|
235
|
+
prior work in context.
|
|
236
|
+
- There is no idle timeout between frames once a turn is streaming; websocket
|
|
237
|
+
keepalive still detects dead peers, and long hosted reasoning or subagent
|
|
238
|
+
runs no longer trip a client-side limit. The first frame must still arrive
|
|
239
|
+
within 60 s.
|
|
240
|
+
- Shell commands run in the foreground for the requested timeout (default
|
|
241
|
+
25 s) and then move to the background unless the request sets
|
|
242
|
+
`kill_on_timeout` or `background: false`. After the final frame the client
|
|
243
|
+
resumes the agent with their output. Commands still running are awaited
|
|
244
|
+
first. Commands that already exited while the model was still working are
|
|
245
|
+
delivered too, so a search that finishes mid-turn is not dropped. Output is
|
|
246
|
+
capped at 5 MB and the whole process tree is killed on cancel.
|
|
247
|
+
|
|
170
248
|
## Usage limits
|
|
171
249
|
|
|
172
250
|
The hosted service owns weekly and window usage. The CLI does not show raw
|
|
@@ -6,7 +6,7 @@ How to build, test, and release this package. Contributor workflow lives in
|
|
|
6
6
|
## Layout
|
|
7
7
|
|
|
8
8
|
```
|
|
9
|
-
src/copper_pilot_cli/ Python package
|
|
9
|
+
src/copper_pilot_cli/ Python package (validate/ holds the review graph engine)
|
|
10
10
|
tests/ pytest suite
|
|
11
11
|
examples/ Runnable examples
|
|
12
12
|
docs/ User and developer docs
|
|
@@ -53,6 +53,9 @@ unreleased Python.
|
|
|
53
53
|
credential is stored.
|
|
54
54
|
- ESP32 example helpers are covered in `tests/test_esp32_example.py`. Running
|
|
55
55
|
`python examples/001_esp32/main.py` needs KiCad 10 and a live account.
|
|
56
|
+
- `tests/test_validate.py` covers the validate engine with a fake `kicad-cli`
|
|
57
|
+
and fake hosted turns; `tests/test_validate_live.py` runs
|
|
58
|
+
`validate --until S2` on `examples/001_esp32` under `pytest -m live`.
|
|
56
59
|
|
|
57
60
|
Do not commit credentials, `.venv/`, or `dist/`.
|
|
58
61
|
|
|
@@ -82,6 +85,16 @@ A WebSocket `error` frame keeps `code`, `status`, `block_reason`,
|
|
|
82
85
|
`error` string use `public_message`; `--json` and the MCP event digest keep
|
|
83
86
|
the object.
|
|
84
87
|
|
|
88
|
+
`classify_error` in `copper_protocol.py` ports the desktop client's error
|
|
89
|
+
categories (`timeout`, `connection`, `server`, `rate_limit`, `usage_limit`,
|
|
90
|
+
`authentication`, `invalid_request`, `payload_too_large`, `protocol`,
|
|
91
|
+
`network`, `aborted`, `unknown`) with a `retryable` flag. The graph node in
|
|
92
|
+
`copper_graph.py` owns the retry loop, the stitched "Resume where we left off"
|
|
93
|
+
re-prompt, partial-progress checkpointing, and the background shell wait;
|
|
94
|
+
`copper_background.py` owns the foreground-to-background shell contract.
|
|
95
|
+
Transport-level failures before the first frame are retried once inside
|
|
96
|
+
`HostedChatClient.stream`; everything after that is the node's job.
|
|
97
|
+
|
|
85
98
|
Device login and the WebSocket `User-Agent` (`CopperPilot CLI/<version>`)
|
|
86
99
|
read the installed package version. That version comes from `VERSION`.
|
|
87
100
|
|
|
@@ -35,6 +35,10 @@ Use `--mode plan` for a plan, `--mode agent -y` for Auto local writes, and
|
|
|
35
35
|
`--yolo` only when the user asked to skip local approval. Add
|
|
36
36
|
`--effort intelligence` for a paid Intelligence turn; Balanced is the default.
|
|
37
37
|
|
|
38
|
+
For sign-off, run `copper-pilot validate --json`, read
|
|
39
|
+
`.copperpilot/validate/latest/next_actions.json`, fix with `--mode agent -y`
|
|
40
|
+
citing the finding IDs, and re-run. See [validate.md](validate.md).
|
|
41
|
+
|
|
38
42
|
## Option 2: MCP conductor (`copper-pilot mcp`)
|
|
39
43
|
|
|
40
44
|
The same process as the CLI, same stored credential. Stdio JSON-RPC; do not
|
|
@@ -88,6 +92,7 @@ Point the host at `copper-pilot mcp` on stdio. Tools:
|
|
|
88
92
|
| `run` | Mutating agent turn (`--mode agent`); optional `effort` |
|
|
89
93
|
| `resume` | Continue `thread_id` (`mode` defaults to `agent`; optional `effort`) |
|
|
90
94
|
| `threads_list` | List threads for this workspace |
|
|
95
|
+
| `validate` | Read-only stage-gated review graph (`copper-pilot validate`); returns `next_actions` |
|
|
91
96
|
|
|
92
97
|
Workspace is the tool `workspace` argument, else `CLAUDE_PROJECT_DIR`, else the
|
|
93
98
|
process current directory.
|
|
@@ -136,11 +141,36 @@ Launch `copper-pilot acp` on stdio. The server implements `initialize`,
|
|
|
136
141
|
`copper-pilot auth login`; clients that append it to the agent command, such as
|
|
137
142
|
T3 Code, get `copper-pilot acp auth login`, which the CLI treats the same way.
|
|
138
143
|
|
|
144
|
+
`initialize` advertises `promptCapabilities.image`. Each `image` prompt block
|
|
145
|
+
is written to `.copperpilot/attachments/` in the workspace and passed to the
|
|
146
|
+
hosted agent as a path-first attachment, the same way the TUI sends pasted
|
|
147
|
+
images. The query also lists the saved paths, because clients such as T3 Code
|
|
148
|
+
mention their own copy outside the workspace. A prompt with images but no text
|
|
149
|
+
asks the agent to analyze them.
|
|
150
|
+
|
|
139
151
|
Hosted text, reasoning, and status arrive as agent message and thought chunks;
|
|
140
152
|
hosted tool requests and results arrive as `tool_call` and `tool_call_update`.
|
|
141
153
|
A hosted error ends the prompt with a JSON-RPC error whose `details` carry the
|
|
142
154
|
public message.
|
|
143
155
|
|
|
156
|
+
Further session updates:
|
|
157
|
+
|
|
158
|
+
- `usage_update` after each hosted usage report. `used` is the prompt tokens
|
|
159
|
+
of the latest turn and `size` is `0`, because the hosted service does not
|
|
160
|
+
report the model's context window; the raw hosted counts are in `_meta`.
|
|
161
|
+
T3 Code shows the count alone when the size is unknown.
|
|
162
|
+
- `plan` whenever the hosted agent updates its todo list (`todo_list` status
|
|
163
|
+
events) or writes a `.copperpilot/plans/<name>.plan.md` artifact. Plan todos
|
|
164
|
+
map `open`, `running`, and `done` onto `pending`, `in_progress`, and
|
|
165
|
+
`completed`, the same statuses the Electron client's plan card uses.
|
|
166
|
+
- Intelligence survey workers are `think` tool calls titled `Survey: <task>`
|
|
167
|
+
with `in_progress`, `completed`, or `failed` status and the worker's output
|
|
168
|
+
or error as content, mirroring the Electron client's subagent card.
|
|
169
|
+
- `available_commands_update` once per session advertising `/effort`. A prompt
|
|
170
|
+
of `/effort balanced` or `/effort intelligence` is answered locally with a
|
|
171
|
+
`config_option_update` and a confirmation; `/effort` alone reports the
|
|
172
|
+
current value.
|
|
173
|
+
|
|
144
174
|
## Approval
|
|
145
175
|
|
|
146
176
|
| Mode | Where | Behavior |
|
|
@@ -155,9 +185,17 @@ always use Auto. `run` and `resume` default to Auto.
|
|
|
155
185
|
ACP sessions start in Auto. Anything Auto would have prompted for in the TUI
|
|
156
186
|
is sent to the editor as `session/request_permission` with Allow, Allow all
|
|
157
187
|
for this session, and Reject. Choosing "Allow all" puts that session in YOLO
|
|
158
|
-
until the server exits. Hosted clarifying questions
|
|
159
|
-
|
|
160
|
-
|
|
188
|
+
until the server exits. Hosted clarifying questions use ACP form elicitation
|
|
189
|
+
(`elicitation/create`) when the client advertised
|
|
190
|
+
`clientCapabilities.elicitation.form`: options become an enum field and free
|
|
191
|
+
text a string field, and a declined or cancelled form counts as Skip. This
|
|
192
|
+
matters for hands-off clients: T3 Code in Full access auto-selects the first
|
|
193
|
+
option of a permission prompt, but always shows a form to the user. Clients
|
|
194
|
+
without form elicitation get option questions as permission choices plus Skip
|
|
195
|
+
and a rejection pointing to the TUI for free text. Either way, a question that
|
|
196
|
+
is still unanswered after 100 seconds is skipped with a note telling the model
|
|
197
|
+
to ask again in its reply, because the hosted service closes a turn whose tool
|
|
198
|
+
result takes longer than two minutes.
|
|
161
199
|
|
|
162
200
|
`effort` is `balanced` (default) or `intelligence`. Intelligence requires a
|
|
163
201
|
paid plan. It may run server-owned survey subagents; Plan turns survey before
|