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.
Files changed (164) hide show
  1. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/HISTORY.md +159 -0
  2. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/PKG-INFO +19 -2
  3. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/README.md +18 -1
  4. copper_pilot_cli-0.1.10/VERSION +1 -0
  5. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/docs/cli.md +81 -3
  6. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/docs/development.md +14 -1
  7. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/docs/harness.md +41 -3
  8. copper_pilot_cli-0.1.10/docs/validate.md +286 -0
  9. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/plugins/copper-pilot/agents/copper-pilot.md +2 -1
  10. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/plugins/copper-pilot/skills/copper-pilot-review/SKILL.md +3 -2
  11. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/skills/copper-pilot-review/SKILL.md +23 -0
  12. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_acp.py +497 -46
  13. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_app.py +16 -2
  14. copper_pilot_cli-0.1.10/src/copper_pilot_cli/copper_background.py +285 -0
  15. copper_pilot_cli-0.1.10/src/copper_pilot_cli/copper_graph.py +533 -0
  16. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_main.py +16 -2
  17. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_mcp.py +102 -3
  18. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_protocol.py +113 -8
  19. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/deepagents_tools.py +36 -2
  20. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/langchain.py +6 -0
  21. copper_pilot_cli-0.1.10/src/copper_pilot_cli/validate/__init__.py +98 -0
  22. copper_pilot_cli-0.1.10/src/copper_pilot_cli/validate/builtins.py +669 -0
  23. copper_pilot_cli-0.1.10/src/copper_pilot_cli/validate/cli.py +333 -0
  24. copper_pilot_cli-0.1.10/src/copper_pilot_cli/validate/config.py +407 -0
  25. copper_pilot_cli-0.1.10/src/copper_pilot_cli/validate/default.yaml +345 -0
  26. copper_pilot_cli-0.1.10/src/copper_pilot_cli/validate/design.py +503 -0
  27. copper_pilot_cli-0.1.10/src/copper_pilot_cli/validate/kicad.py +177 -0
  28. copper_pilot_cli-0.1.10/src/copper_pilot_cli/validate/report.py +335 -0
  29. copper_pilot_cli-0.1.10/src/copper_pilot_cli/validate/reviewer.py +477 -0
  30. copper_pilot_cli-0.1.10/src/copper_pilot_cli/validate/runner.py +739 -0
  31. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_acp.py +714 -6
  32. copper_pilot_cli-0.1.10/tests/test_durability.py +683 -0
  33. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_langchain.py +19 -0
  34. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_main.py +60 -0
  35. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_mcp.py +86 -2
  36. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_tui.py +26 -0
  37. copper_pilot_cli-0.1.10/tests/test_validate.py +1603 -0
  38. copper_pilot_cli-0.1.10/tests/test_validate_live.py +38 -0
  39. copper_pilot_cli-0.1.9/VERSION +0 -1
  40. copper_pilot_cli-0.1.9/src/copper_pilot_cli/copper_graph.py +0 -217
  41. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/.claude-plugin/marketplace.json +0 -0
  42. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/.gitignore +0 -0
  43. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/CODE_OF_CONDUCT.md +0 -0
  44. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/CONTRIBUTING.md +0 -0
  45. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/LICENSE +0 -0
  46. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/NOTICE +0 -0
  47. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/SECURITY.md +0 -0
  48. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/SUPPORT.md +0 -0
  49. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/UPSTREAM.md +0 -0
  50. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/docs/assets/esp32-mini-1-h4.gif +0 -0
  51. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/docs/assets/logo-dark.png +0 -0
  52. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/docs/assets/logo-light.png +0 -0
  53. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/docs/assets/logo.png +0 -0
  54. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/.gitignore +0 -0
  55. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/.copperpilot/PLANS.md +0 -0
  56. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/.copperpilot/README.md +0 -0
  57. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/.copperpilot/TOOLS.md +0 -0
  58. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/.copperpilot/plans/esp32-dev-board.plan.md +0 -0
  59. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/.gitignore +0 -0
  60. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/README.md +0 -0
  61. {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
  62. {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
  63. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/esp32/esp32.kicad_pcb +0 -0
  64. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/esp32/esp32.kicad_pro +0 -0
  65. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/esp32/esp32.kicad_sch +0 -0
  66. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/esp32/esp32.png +0 -0
  67. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/helper.py +0 -0
  68. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/001_esp32/main.py +0 -0
  69. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/.copperpilot/PLANS.md +0 -0
  70. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/.copperpilot/README.md +0 -0
  71. {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
  72. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/.gitignore +0 -0
  73. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/README.md +0 -0
  74. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/assembly_spec.json +0 -0
  75. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/3dmodels/CM4.step +0 -0
  76. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/3dmodels/CM5.step +0 -0
  77. {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
  78. {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
  79. {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
  80. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/5033981892.stp +0 -0
  81. {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
  82. {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
  83. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/SRP5030CC.stp +0 -0
  84. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_dru +0 -0
  85. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_pcb +0 -0
  86. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_pro +0 -0
  87. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_sch +0 -0
  88. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_sym +0 -0
  89. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera.png +0 -0
  90. {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
  91. {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
  92. {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
  93. {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
  94. {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
  95. {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
  96. {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
  97. {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
  98. {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
  99. {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
  100. {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
  101. {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
  102. {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
  103. {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
  104. {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
  105. {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
  106. {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
  107. {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
  108. {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
  109. {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
  110. {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
  111. {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
  112. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/cm5_camera_bottom.png +0 -0
  113. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/fp-lib-table +0 -0
  114. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/cm5_camera/sym-lib-table +0 -0
  115. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/generate_3d_models.py +0 -0
  116. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/helper.py +0 -0
  117. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/examples/002_cm5_camera/main.py +0 -0
  118. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/plugins/copper-pilot/.claude-plugin/plugin.json +0 -0
  119. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/plugins/copper-pilot/.mcp.json +0 -0
  120. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/pyproject.toml +0 -0
  121. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/__init__.py +0 -0
  122. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/__main__.py +0 -0
  123. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/_upstream/__init__.py +0 -0
  124. {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
  125. {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
  126. {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
  127. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/_version.py +0 -0
  128. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/clipboard.py +0 -0
  129. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_api.py +0 -0
  130. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_auth.py +0 -0
  131. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_config.py +0 -0
  132. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_features.py +0 -0
  133. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_hooks.py +0 -0
  134. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_preferences.py +0 -0
  135. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_presentation.py +0 -0
  136. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_status_events.py +0 -0
  137. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_theme.py +0 -0
  138. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_tools.py +0 -0
  139. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_update.py +0 -0
  140. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_widgets.py +0 -0
  141. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/copper_workspace.py +0 -0
  142. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/diagnostics.py +0 -0
  143. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/media_utils.py +0 -0
  144. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/py.typed +0 -0
  145. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/sessions.py +0 -0
  146. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/src/copper_pilot_cli/textual_patches.py +0 -0
  147. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_auth.py +0 -0
  148. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_clipboard.py +0 -0
  149. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_cm5_camera_example.py +0 -0
  150. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_copper_api.py +0 -0
  151. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_e2e.py +0 -0
  152. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_esp32_example.py +0 -0
  153. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_features.py +0 -0
  154. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_live_chat_e2e.py +0 -0
  155. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_plugin_manifest.py +0 -0
  156. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_preferences.py +0 -0
  157. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_presentation.py +0 -0
  158. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_protocol.py +0 -0
  159. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_release_gates.py +0 -0
  160. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_sessions.py +0 -0
  161. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_status_events.py +0 -0
  162. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_tools.py +0 -0
  163. {copper_pilot_cli-0.1.9 → copper_pilot_cli-0.1.10}/tests/test_upstream_provenance.py +0 -0
  164. {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.9
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` and adds `@copper-pilot` plus
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` and adds `@copper-pilot` plus
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 with options are shown as
100
- permission choices plus Skip; free-text questions are declined with a message
101
- to continue in the TUI. See [harness.md](harness.md).
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 that offer options are
159
- presented the same way, with a Skip choice; free-text questions are declined
160
- with a pointer to the TUI.
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