copper-pilot-cli 0.1.9__tar.gz → 0.1.11__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 (210) hide show
  1. copper_pilot_cli-0.1.11/HISTORY.md +633 -0
  2. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/PKG-INFO +24 -4
  3. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/README.md +22 -2
  4. copper_pilot_cli-0.1.11/VERSION +1 -0
  5. copper_pilot_cli-0.1.11/docs/cli.md +357 -0
  6. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/docs/development.md +16 -1
  7. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/docs/harness.md +92 -11
  8. copper_pilot_cli-0.1.11/docs/validate.md +286 -0
  9. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/plugins/copper-pilot/agents/copper-pilot.md +2 -1
  10. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/plugins/copper-pilot/skills/copper-pilot-review/SKILL.md +3 -2
  11. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/pyproject.toml +1 -1
  12. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/skills/copper-pilot-review/SKILL.md +23 -0
  13. copper_pilot_cli-0.1.11/src/copper_pilot_cli/copper_acp.py +1509 -0
  14. copper_pilot_cli-0.1.11/src/copper_pilot_cli/copper_api.py +186 -0
  15. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/copper_app.py +272 -68
  16. copper_pilot_cli-0.1.11/src/copper_pilot_cli/copper_background.py +285 -0
  17. copper_pilot_cli-0.1.11/src/copper_pilot_cli/copper_chrome.py +558 -0
  18. copper_pilot_cli-0.1.11/src/copper_pilot_cli/copper_graph.py +547 -0
  19. copper_pilot_cli-0.1.11/src/copper_pilot_cli/copper_logo.py +25 -0
  20. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/copper_main.py +65 -5
  21. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/copper_mcp.py +264 -13
  22. copper_pilot_cli-0.1.11/src/copper_pilot_cli/copper_models.py +303 -0
  23. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/copper_preferences.py +34 -0
  24. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/copper_presentation.py +225 -87
  25. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/copper_protocol.py +270 -31
  26. copper_pilot_cli-0.1.11/src/copper_pilot_cli/copper_theme.py +258 -0
  27. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/copper_widgets.py +485 -84
  28. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/deepagents_tools.py +84 -23
  29. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/langchain.py +10 -0
  30. copper_pilot_cli-0.1.11/src/copper_pilot_cli/tool_batch.py +244 -0
  31. copper_pilot_cli-0.1.11/src/copper_pilot_cli/validate/__init__.py +98 -0
  32. copper_pilot_cli-0.1.11/src/copper_pilot_cli/validate/builtins.py +669 -0
  33. copper_pilot_cli-0.1.11/src/copper_pilot_cli/validate/cli.py +333 -0
  34. copper_pilot_cli-0.1.11/src/copper_pilot_cli/validate/config.py +407 -0
  35. copper_pilot_cli-0.1.11/src/copper_pilot_cli/validate/default.yaml +345 -0
  36. copper_pilot_cli-0.1.11/src/copper_pilot_cli/validate/design.py +503 -0
  37. copper_pilot_cli-0.1.11/src/copper_pilot_cli/validate/kicad.py +177 -0
  38. copper_pilot_cli-0.1.11/src/copper_pilot_cli/validate/report.py +335 -0
  39. copper_pilot_cli-0.1.11/src/copper_pilot_cli/validate/reviewer.py +477 -0
  40. copper_pilot_cli-0.1.11/src/copper_pilot_cli/validate/runner.py +739 -0
  41. copper_pilot_cli-0.1.11/tests/conftest.py +32 -0
  42. copper_pilot_cli-0.1.11/tests/snapshots/approval.txt +5 -0
  43. copper_pilot_cli-0.1.11/tests/snapshots/idle-input-120-ascii.txt +12 -0
  44. copper_pilot_cli-0.1.11/tests/snapshots/idle-input-120-color.txt +12 -0
  45. copper_pilot_cli-0.1.11/tests/snapshots/idle-input-120-nocolor.txt +8 -0
  46. copper_pilot_cli-0.1.11/tests/snapshots/idle-input-50-ascii.txt +10 -0
  47. copper_pilot_cli-0.1.11/tests/snapshots/idle-input-50-color.txt +10 -0
  48. copper_pilot_cli-0.1.11/tests/snapshots/idle-input-50-nocolor.txt +8 -0
  49. copper_pilot_cli-0.1.11/tests/snapshots/idle-input-80-ascii.txt +12 -0
  50. copper_pilot_cli-0.1.11/tests/snapshots/idle-input-80-color.txt +12 -0
  51. copper_pilot_cli-0.1.11/tests/snapshots/idle-input-80-nocolor.txt +8 -0
  52. copper_pilot_cli-0.1.11/tests/snapshots/slash-menu.txt +7 -0
  53. copper_pilot_cli-0.1.11/tests/snapshots/status-agent-balanced.txt +9 -0
  54. copper_pilot_cli-0.1.11/tests/snapshots/status-agent-intelligence.txt +9 -0
  55. copper_pilot_cli-0.1.11/tests/snapshots/status-ask-balanced.txt +9 -0
  56. copper_pilot_cli-0.1.11/tests/snapshots/status-ask-intelligence.txt +9 -0
  57. copper_pilot_cli-0.1.11/tests/snapshots/status-plan-balanced.txt +9 -0
  58. copper_pilot_cli-0.1.11/tests/snapshots/status-plan-intelligence.txt +9 -0
  59. copper_pilot_cli-0.1.11/tests/snapshots/welcome-120-ascii.txt +24 -0
  60. copper_pilot_cli-0.1.11/tests/snapshots/welcome-120-color.txt +32 -0
  61. copper_pilot_cli-0.1.11/tests/snapshots/welcome-120-nocolor.txt +12 -0
  62. copper_pilot_cli-0.1.11/tests/snapshots/welcome-50-ascii.txt +20 -0
  63. copper_pilot_cli-0.1.11/tests/snapshots/welcome-50-color.txt +20 -0
  64. copper_pilot_cli-0.1.11/tests/snapshots/welcome-50-nocolor.txt +12 -0
  65. copper_pilot_cli-0.1.11/tests/snapshots/welcome-80-ascii.txt +24 -0
  66. copper_pilot_cli-0.1.11/tests/snapshots/welcome-80-color.txt +32 -0
  67. copper_pilot_cli-0.1.11/tests/snapshots/welcome-80-nocolor.txt +12 -0
  68. copper_pilot_cli-0.1.11/tests/snapshots/working-color.txt +7 -0
  69. copper_pilot_cli-0.1.11/tests/test_acp.py +2134 -0
  70. copper_pilot_cli-0.1.11/tests/test_chrome_snapshots.py +464 -0
  71. copper_pilot_cli-0.1.11/tests/test_copper_api.py +212 -0
  72. copper_pilot_cli-0.1.11/tests/test_durability.py +765 -0
  73. copper_pilot_cli-0.1.11/tests/test_graph_batch.py +52 -0
  74. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/tests/test_langchain.py +40 -0
  75. copper_pilot_cli-0.1.11/tests/test_logo.py +10 -0
  76. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/tests/test_main.py +91 -0
  77. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/tests/test_mcp.py +273 -8
  78. copper_pilot_cli-0.1.11/tests/test_models.py +259 -0
  79. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/tests/test_protocol.py +40 -4
  80. copper_pilot_cli-0.1.11/tests/test_protocol_batch.py +255 -0
  81. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/tests/test_release_gates.py +4 -1
  82. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/tests/test_sessions.py +20 -1
  83. copper_pilot_cli-0.1.11/tests/test_themes_and_speed.py +242 -0
  84. copper_pilot_cli-0.1.11/tests/test_tool_batch.py +284 -0
  85. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/tests/test_tui.py +174 -5
  86. copper_pilot_cli-0.1.11/tests/test_validate.py +1603 -0
  87. copper_pilot_cli-0.1.11/tests/test_validate_live.py +38 -0
  88. copper_pilot_cli-0.1.9/HISTORY.md +0 -261
  89. copper_pilot_cli-0.1.9/VERSION +0 -1
  90. copper_pilot_cli-0.1.9/docs/cli.md +0 -215
  91. copper_pilot_cli-0.1.9/src/copper_pilot_cli/copper_acp.py +0 -754
  92. copper_pilot_cli-0.1.9/src/copper_pilot_cli/copper_api.py +0 -77
  93. copper_pilot_cli-0.1.9/src/copper_pilot_cli/copper_graph.py +0 -217
  94. copper_pilot_cli-0.1.9/src/copper_pilot_cli/copper_theme.py +0 -34
  95. copper_pilot_cli-0.1.9/tests/test_acp.py +0 -827
  96. copper_pilot_cli-0.1.9/tests/test_copper_api.py +0 -63
  97. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/.claude-plugin/marketplace.json +0 -0
  98. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/.gitignore +0 -0
  99. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/CODE_OF_CONDUCT.md +0 -0
  100. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/CONTRIBUTING.md +0 -0
  101. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/LICENSE +0 -0
  102. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/NOTICE +0 -0
  103. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/SECURITY.md +0 -0
  104. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/SUPPORT.md +0 -0
  105. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/UPSTREAM.md +0 -0
  106. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/docs/assets/esp32-mini-1-h4.gif +0 -0
  107. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/docs/assets/logo-dark.png +0 -0
  108. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/docs/assets/logo-light.png +0 -0
  109. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/docs/assets/logo.png +0 -0
  110. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/.gitignore +0 -0
  111. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/001_esp32/.copperpilot/PLANS.md +0 -0
  112. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/001_esp32/.copperpilot/README.md +0 -0
  113. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/001_esp32/.copperpilot/TOOLS.md +0 -0
  114. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/001_esp32/.copperpilot/plans/esp32-dev-board.plan.md +0 -0
  115. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/001_esp32/.gitignore +0 -0
  116. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/001_esp32/README.md +0 -0
  117. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/001_esp32/esp32/3d-models/SW-SMD_L3.9-W2.9-H2.0-LS4.8.step +0 -0
  118. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/001_esp32/esp32/3d-models/TYPE-C-31-M-12.step +0 -0
  119. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/001_esp32/esp32/esp32.kicad_pcb +0 -0
  120. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/001_esp32/esp32/esp32.kicad_pro +0 -0
  121. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/001_esp32/esp32/esp32.kicad_sch +0 -0
  122. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/001_esp32/esp32/esp32.png +0 -0
  123. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/001_esp32/helper.py +0 -0
  124. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/001_esp32/main.py +0 -0
  125. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/.copperpilot/PLANS.md +0 -0
  126. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/.copperpilot/README.md +0 -0
  127. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/.copperpilot/plans/cm5-camera-carrier.plan.md +0 -0
  128. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/.gitignore +0 -0
  129. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/README.md +0 -0
  130. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/assembly_spec.json +0 -0
  131. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/3dmodels/CM4.step +0 -0
  132. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/3dmodels/CM5.step +0 -0
  133. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/3dmodels/Camera_IMX219-D160.step +0 -0
  134. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/3dmodels/USB_A_Molex_105057-0001_Vertical.wrl +0 -0
  135. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/3dmodels/USB_A_vertical.step +0 -0
  136. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/5033981892.stp +0 -0
  137. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/DF40C-100DS.stp +0 -0
  138. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/JTHDA-19F08.STEP +0 -0
  139. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/SRP5030CC.stp +0 -0
  140. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_dru +0 -0
  141. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_pcb +0 -0
  142. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_pro +0 -0
  143. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_sch +0 -0
  144. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_sym +0 -0
  145. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.png +0 -0
  146. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/C_0402_1005Metric.kicad_mod +0 -0
  147. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/C_0805_2012Metric.kicad_mod +0 -0
  148. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Camera_Module_IMX219-D160.kicad_mod +0 -0
  149. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Crystal_SMD_3225-4Pin_3.2x2.5mm.kicad_mod +0 -0
  150. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/HDMI_Mini-C_Molex_47151-0001.kicad_mod +0 -0
  151. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/LED_0603_1608Metric.kicad_mod +0 -0
  152. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/L_Bourns_SRP5030CC.kicad_mod +0 -0
  153. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/L_CommonModeChoke_Coilank_ACM1210.kicad_mod +0 -0
  154. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/MOLEX_USB_67298-4090.kicad_mod +0 -0
  155. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Molex_200528-0150_1x15-1MP_P1.00mm_Horizontal.kicad_mod +0 -0
  156. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/PinHeader_1x03_P2.54mm_Vertical.kicad_mod +0 -0
  157. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/PinHeader_2x20_P2.54mm_Vertical.kicad_mod +0 -0
  158. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/R_0402_1005Metric.kicad_mod +0 -0
  159. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/R_0603_1608Metric.kicad_mod +0 -0
  160. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Raspberry-Pi-4-Compute-Module.kicad_mod +0 -0
  161. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/SDCARD_MOLEX_503398-1892.kicad_mod +0 -0
  162. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/SOT-23-5.kicad_mod +0 -0
  163. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/SW_SPST_PTS645Sx43SMTR92.kicad_mod +0 -0
  164. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/TSOT-23-6.kicad_mod +0 -0
  165. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Texas_DRT-3.kicad_mod +0 -0
  166. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/UQFN-10_1.4x1.8mm_P0.4mm.kicad_mod +0 -0
  167. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal.kicad_mod +0 -0
  168. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/cm5_camera_bottom.png +0 -0
  169. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/fp-lib-table +0 -0
  170. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/cm5_camera/sym-lib-table +0 -0
  171. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/generate_3d_models.py +0 -0
  172. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/helper.py +0 -0
  173. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/examples/002_cm5_camera/main.py +0 -0
  174. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/plugins/copper-pilot/.claude-plugin/plugin.json +0 -0
  175. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/plugins/copper-pilot/.mcp.json +0 -0
  176. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/__init__.py +0 -0
  177. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/__main__.py +0 -0
  178. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/_upstream/__init__.py +0 -0
  179. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/_upstream/dcode_0_1_69/PROVENANCE.json +0 -0
  180. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/_upstream/dcode_0_1_69/__init__.py +0 -0
  181. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/_upstream/dcode_0_1_69/diff_utils.py +0 -0
  182. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/_version.py +0 -0
  183. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/clipboard.py +0 -0
  184. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/copper_auth.py +0 -0
  185. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/copper_config.py +0 -0
  186. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/copper_features.py +0 -0
  187. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/copper_hooks.py +0 -0
  188. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/copper_status_events.py +0 -0
  189. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/copper_tools.py +0 -0
  190. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/copper_update.py +0 -0
  191. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/copper_workspace.py +0 -0
  192. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/diagnostics.py +0 -0
  193. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/media_utils.py +0 -0
  194. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/py.typed +0 -0
  195. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/sessions.py +0 -0
  196. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/src/copper_pilot_cli/textual_patches.py +0 -0
  197. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/tests/test_auth.py +0 -0
  198. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/tests/test_clipboard.py +0 -0
  199. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/tests/test_cm5_camera_example.py +0 -0
  200. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/tests/test_e2e.py +0 -0
  201. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/tests/test_esp32_example.py +0 -0
  202. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/tests/test_features.py +0 -0
  203. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/tests/test_live_chat_e2e.py +0 -0
  204. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/tests/test_plugin_manifest.py +0 -0
  205. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/tests/test_preferences.py +0 -0
  206. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/tests/test_presentation.py +0 -0
  207. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/tests/test_status_events.py +0 -0
  208. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/tests/test_tools.py +0 -0
  209. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/tests/test_upstream_provenance.py +0 -0
  210. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.11}/tests/test_workspace.py +0 -0
@@ -0,0 +1,633 @@
1
+ Changelog
2
+ =========
3
+
4
+
5
+ (unreleased)
6
+ ------------
7
+
8
+ Fix
9
+ ~~~
10
+ - Do not block turn cancellation on loading-widget removal. [Cursor,
11
+ Naveen_Copperpilot]
12
+
13
+ Textual defers widget pruning to its message loop. Awaiting that removal during a cancelled turn could leave the turn task pending on Windows, so the cancellation cleanup test timed out.
14
+ - Require Pillow 13 so the security audit passes. [Cursor,
15
+ Naveen_Copperpilot]
16
+
17
+ Pillow 12.3.0 is the newest release the old pin allowed, and pip-audit fails the CI job on four advisories fixed in 13.0.0.
18
+ - Tell the type checker these widgets are Static. [Cursor,
19
+ Naveen_Copperpilot]
20
+
21
+ query() is typed as a generic widget, so ty rejected update() on the working line, the mode icon, and the input rules. CI stopped there before the tests ran.
22
+ - Retry a reconnect the server refuses with HTTP 503. [AdityaNG, Claude
23
+ Fable 5.1]
24
+
25
+ Every "server rejected WebSocket connection: HTTP 503" failure seen from
26
+ T3 Code follows the same sequence: the hosted pod restarts mid-stream
27
+ (no close frame), the stitched resume reconnects 5 s later while the
28
+ backend is still coming back, and the load balancer answers the upgrade
29
+ with 503. websockets raises InvalidStatus for that, which classify_error
30
+ did not know, so the turn was typed "unknown", non-retryable, and the
31
+ remaining attempt was never used.
32
+
33
+ - classify InvalidStatus by HTTP status (5xx/429 retry; auth and other
34
+ 4xx fail fast) and InvalidHandshake without a status as a connection
35
+ drop
36
+ - include InvalidHandshake in the transport's pre-first-event retry
37
+ - stretch the turn budget to four attempts (5/10/20/30 s) so it outlasts
38
+ a typical pod restart
39
+ - regression tests for the drop-then-503 sequence and the transport retry
40
+
41
+ Other
42
+ ~~~~~
43
+ - Merge pull request #31 from naveen-
44
+ forkd/feat/cli_chat_chrome_2026_10_24. [Aditya]
45
+
46
+ Redraw the CLI chat screen, add themes, and make typing faster
47
+ - Test: wait until a tool is active before cancelling. [Cursor,
48
+ Naveen_Copperpilot]
49
+ - Test: wait for the loading widget to leave after cancel. [Cursor,
50
+ Naveen_Copperpilot]
51
+
52
+ Textual drops the widget on a later prune tick, so an immediate check still sees it on Windows.
53
+ - Test: run the suite in a UTF-8 locale. [Cursor, Naveen_Copperpilot]
54
+
55
+ Windows CI has no UTF-8 locale, so the app drew the ASCII fallback and the Unicode snapshots failed. The suite now sets a UTF-8 locale, and a test still checks that a C locale or COPPERPILOT_ASCII selects the fallback.
56
+ - Test: cover theme switching and the input hot path.
57
+ [Naveen_Copperpilot]
58
+
59
+ Check the presets, /theme persistence, idle typing, the pruned file index, and streamed Markdown that keeps closed blocks.
60
+ - Perf: keep typing, file completion, and streaming off the hot path.
61
+ [Naveen_Copperpilot]
62
+
63
+ Skip completion repaints when the matches did not change, and apply a pending @ filter before tab or enter. Build the file list in the background, skip ignored folders, and refresh it when it is stale. Append assistant Markdown only while a block is still open, so a finished paragraph or code fence is not replaced.
64
+ - Perf: import deepagents the first time a tool runs.
65
+ [Naveen_Copperpilot]
66
+
67
+ Opening the UI was paying for the tool stack at import. Load it on the first tool call instead.
68
+ - Test: keep the saved theme out of the suite. [Naveen_Copperpilot]
69
+
70
+ Point each test at a temporary CLI home and reset the shared palette. Live tests keep the real home so they can still load the device credential.
71
+ - Feat: let /theme switch presets and remember the choice.
72
+ [Naveen_Copperpilot]
73
+
74
+ /theme opens a picker or takes a name, writes it to config.json, and repaints the chrome that bakes colours into text.
75
+ - Feat: make near-black the default and add theme presets.
76
+ [Naveen_Copperpilot]
77
+
78
+ The warm stone background is now one preset. Black is the default, with warm, light, and high-contrast beside it. Snapshot colours read the active tokens, and the locale encoding is cached so glyph checks do not call locale.getencoding on every paint.
79
+ - Feat: redraw the prompt and bind shift+tab and ctrl+e.
80
+ [Naveen_Copperpilot]
81
+
82
+ Rules replace the rounded box, and one tip sits above them until the first message. shift+tab and ctrl+e were taken by focus movement and end-of-line, so those bindings now take priority and cycle mode and effort while the prompt is focused.
83
+ - Feat: replace the boxed header with a flat welcome and one status
84
+ line. [Naveen_Copperpilot]
85
+
86
+ Drop version, full path, and model from the header. Show the wordmark, repo, and quick start, and put mode and effort on the line under the prompt.
87
+ - Feat: add the plain-text layout for the chat chrome.
88
+ [Naveen_Copperpilot]
89
+
90
+ Welcome, status, slash rows, the working line, and tips are content the widgets render. Only commands, modes, and keys the CLI already has are included.
91
+ - Feat: draw the CopperPilot cube as a Braille mark.
92
+ [Naveen_Copperpilot]
93
+
94
+ Six rows of thirteen cells, one orange. The welcome omits it when the terminal is narrow, uncolored, or ASCII.
95
+ - Feat: switch the CLI theme to the warm orange palette.
96
+ [Naveen_Copperpilot]
97
+
98
+ One orange and warm neutrals, with the same layout in truecolor, 256-color, and NO_COLOR. Status green and red stay limited to tool results.
99
+ - Merge pull request #27 from
100
+ CopperPilot/feat/disable_model_selector_19_oct_2026. [Aditya]
101
+
102
+ feat: hide Intelligence model selection behind ENABLE_MODEL_SELECTOR (off)
103
+ - Feat: hide Intelligence model selection behind ENABLE_MODEL_SELECTOR
104
+ (off) [AdityaNG, Claude Opus 5.5]
105
+
106
+ Add ENABLE_MODEL_SELECTOR to copper_models, set to False. While it is off
107
+ no surface names a model or offers a choice, and every Intelligence turn
108
+ asks for the default model (Gemini 4 Argon), including threads saved with
109
+ another model. Balanced still sends no model. No server change.
110
+
111
+ - TUI: no /model command or completion, /context and /help omit the model.
112
+ - Headless: --model is not registered.
113
+ - MCP: no models tool, the model argument is dropped from the ask/plan/
114
+ run/resume schemas, and results omit model/answered_model.
115
+ - ACP: only mode and effort config options, no /model command, a model
116
+ config change is rejected, and effort copy names no model.
117
+ - Fallback notices use a generic "switched to a backup model" message.
118
+
119
+ Flipping the constant to True restores the previous behaviour; the
120
+ existing model-selection tests run with it on via a fixture.
121
+ - Merge pull request #28 from
122
+ CopperPilot/feat/agent_latency_cli_19_oct_2026. [Aditya]
123
+
124
+ Run tool_requests batches concurrently (parallel_tool_requests capability)
125
+ - Keep batched tool calls on one assistant message; test ACP overlap.
126
+ [AdityaNG, Claude Opus 5.5]
127
+
128
+ The transcript records a batch's calls on a single AIMessage so every
129
+ call is followed by its result whatever the completion order. ACP already
130
+ keys tool_call / tool_call_update by id; a test now covers three
131
+ overlapping calls completing out of order.
132
+ - Execute tool_requests batches concurrently over the chat socket.
133
+ [AdityaNG, Claude Opus 5.5]
134
+
135
+ chat_start advertises the parallel_tool_requests capability (disable with
136
+ COPPER_PILOT_PARALLEL_TOOLS=0). A batch frame yields one TOOL_REQUEST per
137
+ call, runs them with the scheduler and sends each tool_result, matched by
138
+ tool_call_id, as soon as it completes. Single tool_request frames are
139
+ unchanged. The hosted attempt is now closed deterministically so a
140
+ consumer that stops listening cancels running batch members, and the
141
+ local broker serializes approval and question prompts.
142
+ - Add a scheduler for parallel tool-request batches. [AdityaNG, Claude
143
+ Opus 5.5]
144
+
145
+ Classifies each hosted tool request as READ, MUTATING (keyed by path) or
146
+ EXCLUSIVE and runs a batch with model-order dependencies: reads overlap
147
+ (capped at 8), same-path mutations run in order, shell commands that are
148
+ not provably read-only run alone. Failures are reported per tool and
149
+ closing the batch cancels unfinished members.
150
+ - Merge pull request #26 from CopperPilot/feat/acp-usage-limit-reset.
151
+ [Aditya]
152
+
153
+ feat(acp): explain usage limits with their reset time
154
+ - Merge remote-tracking branch 'origin/main' into feat/acp-usage-limit-
155
+ reset. [AdityaNG]
156
+
157
+ # Conflicts:
158
+ # docs/cli.md
159
+ # src/copper_pilot_cli/copper_acp.py
160
+ # tests/test_acp.py
161
+ - Merge pull request #25 from CopperPilot/t3/intelligence-mode-model-
162
+ selection. [Aditya]
163
+
164
+ feat: Intelligence model selection across TUI, CLI, MCP, and ACP
165
+ - Feat: default Intelligence to Gemini 4 Argon, Gemini models first.
166
+ [AdityaNG, Claude Fable 5.1]
167
+
168
+ Mirror copper-pilot-client #98: the bundled catalog now lists the Gemini
169
+ models first and defaults Intelligence to gemini-4-argon. The server's
170
+ catalog order and default still win whenever it is reachable.
171
+ - Feat: Intelligence model selection across TUI, CLI, MCP, and ACP.
172
+ [AdityaNG, Claude Fable 5.1]
173
+
174
+ Mirror the desktop client's Intelligence model picker (copper-pilot#97):
175
+ Balanced always runs on the server's Balanced model; Intelligence turns
176
+ may pick one model from the hosted catalog (Claude Opus 5.5 default).
177
+
178
+ - copper_models: catalog fetched once per process from
179
+ GET /api/copperpilot/chat/models with the bundled list as fallback,
180
+ plus model_fallback status-event helpers.
181
+ - ChatRequest.model is sent only on Intelligence turns; the thread
182
+ checkpoint persists copper_model next to copper_effort.
183
+ - CLI --model (implies --effort intelligence), TUI /model and /context,
184
+ and model_fallback notices in the transcript and headless output.
185
+ - MCP: model argument on ask/plan/run/resume, a models tool, and
186
+ model/answered_model in results and the digest.
187
+ - ACP: a model config option (category model) next to effort
188
+ (thought_level); choosing a model selects Intelligence, Balanced pins
189
+ the option to the Balanced model, /model slash command, and fallback
190
+ notices as agent messages.
191
+ - Test(acp): accept a usage reset that falls after midnight. [AdityaNG,
192
+ Claude Opus 5.5]
193
+ - Feat(acp): explain usage limits with their reset time. [AdityaNG,
194
+ Claude Opus 5.5]
195
+
196
+ A turn refused by the usage window or weekly limit reached ACP clients as a
197
+ generic -32603 error whose text carried a raw UTC timestamp, or for a refused
198
+ handshake only "HTTP 402".
199
+
200
+ - Keep the reset time from the hosted error frame's detail
201
+ (window_ends_at / week_ends_at) on ProtocolError and the error event.
202
+ - ACP fails such a turn with code -32003 and a message naming the spent
203
+ limit and its local reset time ("It resets at 3:20 AM (in 2h 23m).");
204
+ data carries class=usage_limit, blockReason and resetAt. Without a reset
205
+ time in the frame, the token-limits endpoint fills it in; a bare 402 the
206
+ account view does not confirm (the Intelligence plan gate) is unchanged.
207
+ - The graph keeps a refused handshake's HTTP status on its error event.
208
+ - ACP drops the terminal "Attempt N failed" thought that repeated the error.
209
+ - New ACP /usage command shows the window, weekly balance and reset times.
210
+ - The TUI renders usage blocks with the same local reset time.
211
+ - Merge pull request #24 from CopperPilot/fix/retry-refused-handshake.
212
+ [Aditya]
213
+
214
+ fix: retry a reconnect the server refuses with HTTP 503
215
+
216
+
217
+ 0.1.10 (2026-10-18)
218
+ -------------------
219
+
220
+ Fix
221
+ ~~~
222
+ - Skip the killed-background resume test on Windows. [AdityaNG, Cursor]
223
+
224
+ os.killpg is POSIX-only, and that failure was the Windows CI break.
225
+ - Resume the agent when a background shell already exited. [AdityaNG,
226
+ Cursor]
227
+
228
+ 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.
229
+
230
+ Other
231
+ ~~~~~
232
+ - Release: version 0.1.10 🚀 [AdityaNG]
233
+ - Merge pull request #23 from CopperPilot/feat/acp-image-prompts.
234
+ [Aditya]
235
+
236
+ feat(acp): accept image prompts
237
+ - Feat(acp): accept image prompts. [AdityaNG, Cursor]
238
+
239
+ 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.
240
+ - Merge pull request #22 from CopperPilot/fix/resume-finished-
241
+ background-shell. [Aditya]
242
+
243
+ fix: resume the agent when a background shell already exited
244
+ - Merge pull request #21 from CopperPilot/feat/validate. [Aditya]
245
+
246
+ feat: copper-pilot validate, a stage-gated read-only review graph
247
+ - Fix(validate): default reviewers to agent mode and pass Windows CI.
248
+ [AdityaNG, Cursor]
249
+
250
+ 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.
251
+ - Fix(validate): enforce reviewer.timeout_s and treat SIGTERM like
252
+ Ctrl-C. [AdityaNG, Claude Fable 5.1]
253
+
254
+ A hosted architecture review on a 68-part board outlived an external
255
+ timeout(1) wrapper; SIGTERM killed the process with no report, and the
256
+ graph's reviewer.timeout_s had never been applied. Each reviewer slice now
257
+ runs under asyncio.timeout(reviewer.timeout_s) and times out as an ERROR,
258
+ and the CLI maps SIGTERM onto the same partial-report path as Ctrl-C.
259
+ - Fix(validate): scope release.repo to the project folder; tolerate
260
+ markdown escapes in replies. [AdityaNG, Claude Fable 5.1]
261
+
262
+ Running validate on a repository that keeps generated boards outside the
263
+ KiCad project (video/build/tmp_pcbs) counted them as portability failures.
264
+ The workspace walker now skips the same build/dist/node_modules folders as
265
+ discover_workspace, and release.repo only scans the project folder.
266
+
267
+ A live sch.ratings reviewer wrote '\*' inside JSON strings, which is not a
268
+ JSON escape and cost a repair turn; invalid escapes are now dropped before
269
+ the repair path is used.
270
+ - Feat(validate): explain, --context, Python validate() API, and live
271
+ test. [AdityaNG, Claude Fable 5.1]
272
+
273
+ Add copper-pilot validate explain CHECK_ID (config, rendered prompt, input
274
+ hashes, last result), --context FILE ... (appended to every reviewer prompt
275
+ under Reference material and folded into the cache key), the
276
+ copper_pilot_cli.validate.validate()/avalidate() API returning a
277
+ ValidationReport, and a pytest -m live end-to-end run of validate --until S2
278
+ on examples/001_esp32.
279
+ - Feat(validate): --json events, --junit, --emit-fix-prompt, MCP
280
+ validate tool, skill and docs. [AdityaNG, Claude Fable 5.1]
281
+
282
+ Stream validate.start/check/result/end events (plus copper.retry pass-through)
283
+ with --json, write JUnit XML with --junit (FAIL/ERROR -> failure/error,
284
+ SKIPPED -> skipped naming the blocker, WARN -> system-out), and print a
285
+ ready fix message for copper-pilot --mode agent with --emit-fix-prompt.
286
+ Expose validate(workspace?, profile?, gate?, until?, only?, effort?,
287
+ no_cache?) on the MCP server with per-check progress and the fixed read-only
288
+ reviewer policy. Add a Validate section to the review skill and plugin,
289
+ docs/validate.md, and the CLI reference with the exit-code table.
290
+ - Feat(validate): hosted agent reviewers with read-only broker,
291
+ grounding and consensus. [AdityaNG, Claude Fable 5.1]
292
+
293
+ Add the reviewer adapter: each agent check runs CopperPilot in Ask mode
294
+ against a read-only snapshot of the workspace through a Manual broker whose
295
+ policy approves reads, scratch-folder writes and non-dangerous shell only.
296
+ The snapshot is re-hashed after every check; any change outside scratch is
297
+ an ERROR. Replies must end with a fenced json findings block (two repair
298
+ turns, then ERROR); findings are grounded against the design index and
299
+ ungrounded ones can never fail a check. per_part, per_sheet and per_netclass
300
+ checks fan out in batches, repeat: N takes a majority consensus, and a
301
+ non-retryable usage-limit block stops scheduling agent checks and exits 4.
302
+ default.yaml gains the agent checks for S1-S8 and the CLI gains --effort,
303
+ --concurrency and --repeat.
304
+ - Feat(validate): engine, builtin checks, reports, and validate
305
+ list|graph|run. [AdityaNG, Claude Fable 5.1]
306
+
307
+ Add the copper-pilot validate subcommand: a stage-gated graph of read-only
308
+ checks loaded from a packaged default.yaml and extended by
309
+ .copperpilot/validate.yaml. This slice ships the engine (config models and
310
+ graph validation, design snapshot/hash/index, kicad-cli wrappers, dependency
311
+ waves, stage/full/strict gating, result cache) with the deterministic builtin
312
+ checks (intake.tools, intake.project, intake.intent, parts.bom_fields,
313
+ sch.erc, pcb.parity, pcb.rules, pcb.drc, release.outputs, release.repo) and
314
+ writes report.json, REPORT.md and next_actions.json under
315
+ .copperpilot/validate/runs/<id>/ with a latest pointer.
316
+ - Merge pull request #20 from CopperPilot/feat/acp-session-updates.
317
+ [Aditya]
318
+
319
+ feat(acp): usage, plan, subagent, elicitation, and /effort session updates
320
+ - Merge origin/main into feat/acp-session-updates. [AdityaNG, Claude
321
+ Fable 5.1]
322
+ - Merge pull request #19 from CopperPilot/feat/client-turn-durability.
323
+ [Aditya]
324
+
325
+ feat: make hosted turns durable across transport drops
326
+ - Fix(background): normalize CRLF shell output on Windows. [AdityaNG,
327
+ Claude Fable 5.1]
328
+ - Feat: make hosted turns durable across transport drops. [AdityaNG,
329
+ Claude Fable 5.1]
330
+
331
+ Port the desktop client's chat-manager resilience into the shared graph
332
+ node so every front-end (TUI, headless, MCP, ACP) benefits:
333
+
334
+ - Retry a dropped stream up to three times with 5/10/20 s backoff and a
335
+ stitched "Resume where we left off" re-prompt carrying the partial
336
+ transcript, so the hosted agent continues instead of restarting.
337
+ - Classify failures like `_categorizeError`: drops, timeouts, 5xx and 429
338
+ retry; 4xx, invalid/oversized requests, plan refusals and auth fail fast.
339
+ - Capture the websocket close code and reason in the error message and log,
340
+ including drops that happen while a tool result is being sent.
341
+ - Checkpoint partial progress (text, tool calls, results) on a terminal
342
+ failure or cancellation with a hidden interruption note, so a later
343
+ manual "continue" has the prior work in context.
344
+ - Surface retry progress as `copper.retry` events: ACP agent thoughts, TUI
345
+ status/notification, headless yellow lines, MCP progress.
346
+ - Honour the desktop foreground-to-background shell contract: commands
347
+ outliving their timeout keep running, the turn continues, and their
348
+ output is fed back in a continuation turn after the final frame.
349
+ - Drop the 300 s idle-frame timeout; websocket keepalive still detects dead
350
+ peers and long hosted reasoning no longer trips a client limit.
351
+ - Fix the ACP cancel race where a server close after `session/cancel`
352
+ surfaced as an error instead of `cancelled`.
353
+ - Fix(acp): read slash commands from the first prompt block. [AdityaNG,
354
+ Claude Fable 5.1]
355
+
356
+ T3 Code appends runtime context as a second text block, so /effort was
357
+ reaching the hosted agent instead of being answered locally.
358
+ - Fix(acp): elicit option questions, unwrap T3 prompts, bound question
359
+ waits. [AdityaNG, Claude Fable 5.1]
360
+
361
+ T3 Code in Full access auto-selects the first option of a permission prompt,
362
+ so clarifying questions with options now use form elicitation (enum) when the
363
+ client supports it. /effort is recognised inside T3's <user_request> envelope.
364
+ Questions nobody answers within 100 seconds are skipped with a note, because
365
+ the hosted service drops a turn whose tool result takes longer than two minutes.
366
+ - Feat(acp): usage, plan, subagent, elicitation, and /effort updates.
367
+ [AdityaNG, Claude Fable 5.1]
368
+
369
+ Emit usage_update from hosted token counts so T3 Code's context meter works,
370
+ project hosted todo_list events and .copperpilot/plans artifacts onto ACP plan
371
+ entries, render Intelligence survey workers as think tool calls, collect
372
+ free-text clarifications through ACP form elicitation when the client supports
373
+ it, and advertise a locally handled /effort command.
374
+
375
+
376
+ 0.1.9 (2026-10-16)
377
+ ------------------
378
+ - Release: version 0.1.9 🚀 [AdityaNG]
379
+ - Merge pull request #18 from CopperPilot/feat/acp-server. [Aditya]
380
+
381
+ feat: add `copper-pilot acp` Agent Client Protocol server
382
+ - Fix(acp): surface hosted turn failures in the JSON-RPC error message.
383
+ [AdityaNG, Claude Fable 5.1]
384
+
385
+ T3 Code showed a bare "Internal error" for a prompt the hosted service
386
+ had refused with "Upgrade to a paid plan to use Intelligence." because the
387
+ explanation only lived in the error's `data`, which T3 does not display.
388
+ Carry the hosted message in the error `message` (keeping the code), map a
389
+ refused websocket handshake to auth_required when it is 401/403, log every
390
+ failed turn to the diagnostics log, and never let an unexpected exception
391
+ escape to the SDK's generic handler.
392
+ - Fix(acp): accept `copper-pilot acp auth login` for clients that append
393
+ login args. [AdityaNG, Claude Fable 5.1]
394
+
395
+ T3 Code runs an ACP terminal auth method by appending the method's args to
396
+ the configured agent command, so the advertised `auth login` was spawned as
397
+ `copper-pilot acp auth login`. The acp parser rejected the extra arguments
398
+ with exit code 2 and T3 reported "The provider login command did not finish
399
+ successfully." Normalize `acp auth ...` onto `auth ...` before parsing and
400
+ document the alias.
401
+ - Feat: add `copper-pilot acp` Agent Client Protocol server. [AdityaNG,
402
+ Claude Fable 5.1]
403
+
404
+ Serve the hosted CopperPilot agent over ACP stdio so editors such as Zed
405
+ can drive it with streaming messages, tool calls, permission prompts,
406
+ session modes (ask/plan/agent), an effort config option, session/load
407
+ resume of existing threads, and session/cancel.
408
+
409
+ - New copper_acp.py built directly on the agent-client-protocol SDK;
410
+ approvals and clarifying questions map onto session/request_permission.
411
+ - `acp` optional extra; the command prints an install hint without it.
412
+ - CI license gate ignores agent-client-protocol (Apache-2.0 LICENSE file,
413
+ no license metadata in the wheel).
414
+ - Tests: tests/test_acp.py (100% coverage of copper_acp.py, including a
415
+ real stdio JSON-RPC round trip), parser and entrypoint tests, and a
416
+ release-gate check for the extra.
417
+ - Docs: cli.md, harness.md (Zed setup), README.
418
+
419
+
420
+ 0.1.8 (2026-10-14)
421
+ ------------------
422
+
423
+ Fix
424
+ ~~~
425
+ - Annotate async context managers for ty 0.0.87. [AdityaNG]
426
+
427
+ CI resolves the unpinned ty dependency to 0.0.87, which rejects AsyncIterator returns on asynccontextmanager.
428
+ - Upgrade the pinned Deep Agents runtime to 0.7.19. [AdityaNG]
429
+
430
+ Keep the exact runtime pin while picking up the filesystem and media-handling fixes from 0.7.14.
431
+ - Align the CLI with hosted usage limits. [AdityaNG]
432
+
433
+ Keep blocked turns machine-readable, shrink oversized resumed chats to the desktop frame budget, and report the installed client version.
434
+
435
+ Other
436
+ ~~~~~
437
+ - Release: version 0.1.8 🚀 [AdityaNG]
438
+ - Merge pull request #16 from CopperPilot/update/14_oct_2026. [Aditya]
439
+
440
+ Add Intelligence effort, hosted survey workers, and modal keyboard focus
441
+ - Fix(tests/test_tui.py) [AdityaNG]
442
+ - Feat(src/copper_pilot_cli/copper_status_events.py) [AdityaNG]
443
+ - Merge pull request #3 from
444
+ CopperPilot/dependabot/github_actions/softprops/action-gh-release-3.
445
+ [Aditya]
446
+
447
+ build(deps): bump softprops/action-gh-release from 2 to 3
448
+ - Build(deps): bump softprops/action-gh-release from 2 to 3.
449
+ [dependabot[bot]]
450
+
451
+ Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 3.
452
+ - [Release notes](https://github.com/softprops/action-gh-release/releases)
453
+ - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
454
+ - [Commits](https://github.com/softprops/action-gh-release/compare/v2...v3)
455
+
456
+ ---
457
+ updated-dependencies:
458
+ - dependency-name: softprops/action-gh-release
459
+ dependency-version: '3'
460
+ dependency-type: direct:production
461
+ update-type: version-update:semver-major
462
+ ...
463
+ - Merge pull request #4 from CopperPilot/dependabot/pip/websockets-
464
+ gte-15-and-lt-18. [Aditya]
465
+
466
+ build(deps): update websockets requirement from <17,>=15 to >=15,<18
467
+ - Build(deps): update websockets requirement from <17,>=15 to >=15,<18.
468
+ [dependabot[bot]]
469
+
470
+ Updates the requirements on [websockets](https://github.com/python-websockets/websockets) to permit the latest version.
471
+ - [Release notes](https://github.com/python-websockets/websockets/releases)
472
+ - [Commits](https://github.com/python-websockets/websockets/compare/15.0...17.1)
473
+
474
+ ---
475
+ updated-dependencies:
476
+ - dependency-name: websockets
477
+ dependency-version: '17.1'
478
+ dependency-type: direct:production
479
+ ...
480
+ - Merge pull request #5 from CopperPilot/dependabot/pip/uuid-utils-
481
+ gte-0.12-and-lt-2. [Aditya]
482
+
483
+ build(deps): update uuid-utils requirement from <1,>=0.12 to >=0.12,<2
484
+ - Build(deps): update uuid-utils requirement from <1,>=0.12 to
485
+ >=0.12,<2. [dependabot[bot]]
486
+
487
+ Updates the requirements on [uuid-utils](https://github.com/aminalaee/uuid-utils) to permit the latest version.
488
+ - [Release notes](https://github.com/aminalaee/uuid-utils/releases)
489
+ - [Commits](https://github.com/aminalaee/uuid-utils/compare/0.12.0...1.0.0)
490
+
491
+ ---
492
+ updated-dependencies:
493
+ - dependency-name: uuid-utils
494
+ dependency-version: 1.0.0
495
+ dependency-type: direct:production
496
+ ...
497
+ - Merge pull request #2 from
498
+ CopperPilot/dependabot/github_actions/actions/setup-python-7. [Aditya]
499
+
500
+ build(deps): bump actions/setup-python from 5 to 7
501
+ - Build(deps): bump actions/setup-python from 5 to 7. [dependabot[bot]]
502
+
503
+ Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 7.
504
+ - [Release notes](https://github.com/actions/setup-python/releases)
505
+ - [Commits](https://github.com/actions/setup-python/compare/v5...v7)
506
+
507
+ ---
508
+ updated-dependencies:
509
+ - dependency-name: actions/setup-python
510
+ dependency-version: '7'
511
+ dependency-type: direct:production
512
+ update-type: version-update:semver-major
513
+ ...
514
+ - Merge pull request #13 from
515
+ CopperPilot/update/deepagents_0_7_19_3_oct. [Aditya]
516
+
517
+ Upgrade the pinned Deep Agents runtime to 0.7.19
518
+ - Merge pull request #1 from
519
+ CopperPilot/dependabot/github_actions/actions/checkout-7. [Aditya]
520
+
521
+ build(deps): bump actions/checkout from 4 to 7
522
+ - Build(deps): bump actions/checkout from 4 to 7. [dependabot[bot]]
523
+
524
+ Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 7.
525
+ - [Release notes](https://github.com/actions/checkout/releases)
526
+ - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
527
+ - [Commits](https://github.com/actions/checkout/compare/v4...v7)
528
+
529
+ ---
530
+ updated-dependencies:
531
+ - dependency-name: actions/checkout
532
+ dependency-version: '7'
533
+ dependency-type: direct:production
534
+ update-type: version-update:semver-major
535
+ ...
536
+ - Merge pull request #12 from
537
+ CopperPilot/update/contract_alignment_3_oct. [Aditya]
538
+
539
+ Align the CLI with hosted usage limits
540
+
541
+
542
+ 0.1.7 (2026-10-03)
543
+ ------------------
544
+ - Release: version 0.1.7 🚀 [AdityaNG]
545
+ - Merge pull request #11 from
546
+ CopperPilot/feat/python_versions_support_expansion. [Aditya]
547
+
548
+ Support Python 3.11 and future releases
549
+ - Ci: probe Python 3.15 weekly instead of on pull requests. [AdityaNG]
550
+
551
+ Keep the upstream install failure visible without turning required pull request checks red.
552
+ - Feat(py11) [AdityaNG]
553
+ - Merge pull request #7 from CopperPilot/feat/example_002_cm5_camera.
554
+ [Aditya]
555
+
556
+ feat(examples/002_cm5_camera): add 3D pose audit and generated carrier
557
+ - Fix(examples/002_cm5_camera): render the README PCB as a dimetric 3D
558
+ view. [AdityaNG, Cursor]
559
+
560
+ Use an orthogonal high-quality camera with a slight isometric tilt so the
561
+ hero PNG shows connector height instead of a flat top-down shot.
562
+ - Fix(examples/002_cm5_camera): skip library dirs relative to the
563
+ workspace. [AdityaNG, Cursor]
564
+
565
+ Absolute path parts named tmp (Linux /tmp pytest roots) were skipping the
566
+ entire haystack, so libraries_ready failed on Ubuntu CI.
567
+ - Feat(examples/002_cm5_camera): add 3D pose audit and generated
568
+ carrier. [AdityaNG, Cursor]
569
+
570
+ Lock connector 3D offsets, Module1 pad orientation, and the generated
571
+ KiCad project so the example reproduces NANO-C assembly parity.
572
+ - Feat(examples/002_cm5_camera/main.py): new example. [AdityaNG]
573
+
574
+
575
+ 0.1.6 (2026-09-18)
576
+ ------------------
577
+ - Release: version 0.1.6 🚀 [AdityaNG]
578
+ - Merge pull request #6 from CopperPilot/feat/plugins. [Aditya]
579
+
580
+ feat: add MCP conductor and Claude Code plugin
581
+ - Clarify server restrictions in PR template. [Aditya]
582
+
583
+ Updated checklist item to clarify server restrictions.
584
+ - Feat: add MCP conductor and Claude Code plugin. [AdityaNG, Cursor]
585
+
586
+ 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.
587
+
588
+
589
+ 0.1.5 (2026-09-17)
590
+ ------------------
591
+ - Release: version 0.1.5 🚀 [AdityaNG]
592
+ - Fix(README.md) [AdityaNG]
593
+
594
+
595
+ 0.1.4 (2026-09-17)
596
+ ------------------
597
+ - Release: version 0.1.4 🚀 [AdityaNG]
598
+ - Fix(tests/test_release_gates.py) [AdityaNG]
599
+
600
+
601
+ 0.1.3 (2026-09-17)
602
+ ------------------
603
+ - Release: version 0.1.3 🚀 [AdityaNG]
604
+ - Docs. [AdityaNG]
605
+
606
+
607
+ 0.1.2 (2026-09-17)
608
+ ------------------
609
+ - Release: version 0.1.2 🚀 [AdityaNG]
610
+ - Ci(pyproject.toml) [AdityaNG]
611
+ - Fix(tests/test_tui.py) [AdityaNG]
612
+
613
+
614
+ 0.1.1 (2026-09-17)
615
+ ------------------
616
+ - Release: version 0.1.1 🚀 [AdityaNG]
617
+
618
+
619
+ 0.1.0 (2026-09-17)
620
+ ------------------
621
+ - Release: version 0.1.0 🚀 [AdityaNG]
622
+ - Fix(tests/test_release_gates.py) [AdityaNG]
623
+ - Test. [AdityaNG]
624
+ - Docs. [AdityaNG]
625
+ - Docs. [AdityaNG]
626
+ - Example(examples/001_esp32/) [AdityaNG]
627
+ - Makefile. [AdityaNG]
628
+ - Ci. [AdityaNG]
629
+ - Docs. [AdityaNG]
630
+ - Refactor(name) [AdityaNG]
631
+ - Init. [AdityaNG]
632
+
633
+