wcgw 2.8.10__tar.gz → 3.0.1__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.

Potentially problematic release.


This version of wcgw might be problematic. Click here for more details.

Files changed (182) hide show
  1. {wcgw-2.8.10 → wcgw-3.0.1}/.github/workflows/python-tests.yml +2 -2
  2. {wcgw-2.8.10 → wcgw-3.0.1}/.github/workflows/python-types.yml +1 -1
  3. {wcgw-2.8.10 → wcgw-3.0.1}/PKG-INFO +4 -3
  4. {wcgw-2.8.10 → wcgw-3.0.1}/README.md +2 -0
  5. {wcgw-2.8.10 → wcgw-3.0.1}/gpt_action_json_schema.json +119 -169
  6. {wcgw-2.8.10 → wcgw-3.0.1}/gpt_instructions.txt +15 -23
  7. {wcgw-2.8.10 → wcgw-3.0.1}/pyproject.toml +5 -4
  8. {wcgw-2.8.10 → wcgw-3.0.1}/src/wcgw/__init__.py +1 -1
  9. wcgw-3.0.1/src/wcgw/client/bash_state/bash_state.py +788 -0
  10. wcgw-3.0.1/src/wcgw/client/encoder/__init__.py +47 -0
  11. {wcgw-2.8.10 → wcgw-3.0.1}/src/wcgw/client/file_ops/diff_edit.py +52 -1
  12. wcgw-3.0.1/src/wcgw/client/mcp_server/Readme.md +3 -0
  13. {wcgw-2.8.10 → wcgw-3.0.1}/src/wcgw/client/mcp_server/__init__.py +2 -2
  14. wcgw-3.0.1/src/wcgw/client/mcp_server/server.py +177 -0
  15. {wcgw-2.8.10 → wcgw-3.0.1}/src/wcgw/client/modes.py +16 -21
  16. {wcgw-2.8.10 → wcgw-3.0.1}/src/wcgw/client/repo_ops/display_tree.py +1 -12
  17. wcgw-3.0.1/src/wcgw/client/tool_prompts.py +99 -0
  18. wcgw-3.0.1/src/wcgw/client/tools.py +761 -0
  19. wcgw-3.0.1/src/wcgw/relay/client.py +95 -0
  20. {wcgw-2.8.10 → wcgw-3.0.1}/src/wcgw/relay/serve.py +4 -69
  21. {wcgw-2.8.10 → wcgw-3.0.1}/src/wcgw/types_.py +57 -63
  22. wcgw-3.0.1/src/wcgw_cli/anthropic_client.py +493 -0
  23. {wcgw-2.8.10 → wcgw-3.0.1}/src/wcgw_cli/cli.py +0 -2
  24. wcgw-3.0.1/src/wcgw_cli/openai_client.py +411 -0
  25. wcgw-3.0.1/tests/test_edit.py +451 -0
  26. wcgw-3.0.1/tests/test_mcp_server.py +254 -0
  27. wcgw-3.0.1/tests/test_tools.py +783 -0
  28. {wcgw-2.8.10 → wcgw-3.0.1}/uv.lock +230 -81
  29. wcgw-2.8.10/src/wcgw/client/computer_use.py +0 -435
  30. wcgw-2.8.10/src/wcgw/client/mcp_server/Readme.md +0 -89
  31. wcgw-2.8.10/src/wcgw/client/mcp_server/server.py +0 -337
  32. wcgw-2.8.10/src/wcgw/client/sys_utils.py +0 -41
  33. wcgw-2.8.10/src/wcgw/client/tools.py +0 -1561
  34. wcgw-2.8.10/src/wcgw_cli/anthropic_client.py +0 -590
  35. wcgw-2.8.10/src/wcgw_cli/openai_client.py +0 -467
  36. wcgw-2.8.10/tests/client/file_ops/test_diff_edit.py +0 -222
  37. wcgw-2.8.10/tests/client/file_ops/test_search_replace.py +0 -190
  38. wcgw-2.8.10/tests/client/repo_ops/__init__.py +0 -0
  39. wcgw-2.8.10/tests/client/repo_ops/test_display_tree.py +0 -152
  40. wcgw-2.8.10/tests/client/repo_ops/test_display_tree_simple.py +0 -62
  41. wcgw-2.8.10/tests/client/repo_ops/test_path_prob.py +0 -115
  42. wcgw-2.8.10/tests/client/repo_ops/test_repo_context.py +0 -150
  43. wcgw-2.8.10/tests/client/test_anthropic_client_utils.py +0 -107
  44. wcgw-2.8.10/tests/client/test_memory.py +0 -162
  45. wcgw-2.8.10/tests/client/test_openai_utils.py +0 -101
  46. wcgw-2.8.10/tests/client/test_tools_basic.py +0 -22
  47. wcgw-2.8.10/tests/client/test_tools_extended.py +0 -553
  48. wcgw-2.8.10/tests/client/test_tools_file_ops.py +0 -132
  49. wcgw-2.8.10/tests/client/test_tools_files.py +0 -121
  50. wcgw-2.8.10/tests/client/test_tools_shell.py +0 -505
  51. wcgw-2.8.10/tests/client/test_tools_validation.py +0 -251
  52. wcgw-2.8.10/tests/client/tools/__init__.py +0 -1
  53. wcgw-2.8.10/tests/client/tools/test_command_validation.py +0 -127
  54. wcgw-2.8.10/tests/client/tools/test_docker_operations.py +0 -39
  55. wcgw-2.8.10/tests/client/tools/test_error_handling.py +0 -22
  56. wcgw-2.8.10/tests/client/tools/test_error_handling_full.py +0 -152
  57. wcgw-2.8.10/tests/client/tools/test_execute_bash.py +0 -110
  58. wcgw-2.8.10/tests/client/tools/test_file_errors.py +0 -22
  59. wcgw-2.8.10/tests/client/tools/test_file_operations.py +0 -156
  60. wcgw-2.8.10/tests/client/tools/test_files/test1.py +0 -4
  61. wcgw-2.8.10/tests/client/tools/test_files/test2.py +0 -4
  62. wcgw-2.8.10/tests/client/tools/test_files/test_file.py +0 -1
  63. wcgw-2.8.10/tests/client/tools/test_full_coverage.py +0 -66
  64. wcgw-2.8.10/tests/client/tools/test_is_int.py +0 -25
  65. wcgw-2.8.10/tests/client/tools/test_knowledge_transfer.py +0 -155
  66. wcgw-2.8.10/tests/client/tools/test_large_blocks.py +0 -37
  67. wcgw-2.8.10/tests/client/tools/test_prompt_update.py +0 -48
  68. wcgw-2.8.10/tests/client/tools/test_render_terminal.py +0 -25
  69. wcgw-2.8.10/tests/client/tools/test_terminal_output.py +0 -187
  70. wcgw-2.8.10/tests/client/tools/test_terminal_output_full.py +0 -114
  71. wcgw-2.8.10/tests/client/tools/test_terminal_output_incremental.py +0 -46
  72. wcgw-2.8.10/tests/client/tools/test_terminal_output_raw.py +0 -57
  73. wcgw-2.8.10/tests/client/tools/test_terminal_sequence.py +0 -50
  74. wcgw-2.8.10/tests/client/tools/test_timeout_handling.py +0 -100
  75. wcgw-2.8.10/tests/client/tools/test_timeout_state.py +0 -30
  76. wcgw-2.8.10/tests/client/tools/test_user_interaction.py +0 -132
  77. wcgw-2.8.10/tests/client/tools/test_write_file.py +0 -118
  78. wcgw-2.8.10/tests/conftest.py +0 -12
  79. wcgw-2.8.10/tests/test_anthropic_client.py +0 -84
  80. wcgw-2.8.10/tests/test_basic.py +0 -69
  81. wcgw-2.8.10/tests/test_common.py +0 -111
  82. wcgw-2.8.10/tests/test_computer_use.py +0 -142
  83. wcgw-2.8.10/tests/test_computer_use_base.py +0 -123
  84. wcgw-2.8.10/tests/test_computer_use_shell.py +0 -120
  85. wcgw-2.8.10/tests/test_initialize.py +0 -325
  86. wcgw-2.8.10/tests/test_sys_utils.py +0 -102
  87. wcgw-2.8.10/tests/test_tools.py +0 -39
  88. {wcgw-2.8.10 → wcgw-3.0.1}/.github/workflows/python-publish.yml +0 -0
  89. {wcgw-2.8.10 → wcgw-3.0.1}/.gitignore +0 -0
  90. {wcgw-2.8.10 → wcgw-3.0.1}/.gitmodules +0 -0
  91. {wcgw-2.8.10 → wcgw-3.0.1}/.python-version +0 -0
  92. {wcgw-2.8.10 → wcgw-3.0.1}/.vscode/settings.json +0 -0
  93. {wcgw-2.8.10 → wcgw-3.0.1}/Dockerfile +0 -0
  94. {wcgw-2.8.10 → wcgw-3.0.1}/LICENSE +0 -0
  95. {wcgw-2.8.10 → wcgw-3.0.1}/openai.md +0 -0
  96. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/.git +0 -0
  97. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  98. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  99. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/.github/workflows/main-checks.yml +0 -0
  100. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/.github/workflows/publish-pypi.yml +0 -0
  101. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/.github/workflows/pull-request-checks.yml +0 -0
  102. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/.github/workflows/shared.yml +0 -0
  103. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/.gitignore +0 -0
  104. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/.python-version +0 -0
  105. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/CODE_OF_CONDUCT.md +0 -0
  106. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/CONTRIBUTING.md +0 -0
  107. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/LICENSE +0 -0
  108. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/README.md +0 -0
  109. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/RELEASE.md +0 -0
  110. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/SECURITY.md +0 -0
  111. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/examples/README.md +0 -0
  112. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/examples/servers/simple-prompt/.python-version +0 -0
  113. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/examples/servers/simple-prompt/README.md +0 -0
  114. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/examples/servers/simple-prompt/mcp_simple_prompt/__init__.py +0 -0
  115. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/examples/servers/simple-prompt/mcp_simple_prompt/__main__.py +0 -0
  116. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/examples/servers/simple-prompt/mcp_simple_prompt/server.py +0 -0
  117. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/examples/servers/simple-prompt/pyproject.toml +0 -0
  118. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/examples/servers/simple-resource/.python-version +0 -0
  119. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/examples/servers/simple-resource/README.md +0 -0
  120. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/examples/servers/simple-resource/mcp_simple_resource/__init__.py +0 -0
  121. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/examples/servers/simple-resource/mcp_simple_resource/__main__.py +0 -0
  122. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/examples/servers/simple-resource/mcp_simple_resource/server.py +0 -0
  123. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/examples/servers/simple-resource/pyproject.toml +0 -0
  124. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/examples/servers/simple-tool/.python-version +0 -0
  125. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/examples/servers/simple-tool/README.md +0 -0
  126. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/examples/servers/simple-tool/mcp_simple_tool/__init__.py +0 -0
  127. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/examples/servers/simple-tool/mcp_simple_tool/__main__.py +0 -0
  128. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/examples/servers/simple-tool/mcp_simple_tool/server.py +0 -0
  129. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/examples/servers/simple-tool/pyproject.toml +0 -0
  130. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/pyproject.toml +0 -0
  131. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/src/mcp_wcgw/__init__.py +0 -0
  132. {wcgw-2.8.10/src → wcgw-3.0.1/src/mcp_wcgw_fork/src/mcp_wcgw/client}/__init__.py +0 -0
  133. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/src/mcp_wcgw/client/__main__.py +0 -0
  134. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/src/mcp_wcgw/client/session.py +0 -0
  135. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/src/mcp_wcgw/client/sse.py +0 -0
  136. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/src/mcp_wcgw/client/stdio.py +0 -0
  137. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/src/mcp_wcgw/py.typed +0 -0
  138. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/src/mcp_wcgw/server/__init__.py +0 -0
  139. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/src/mcp_wcgw/server/__main__.py +0 -0
  140. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/src/mcp_wcgw/server/models.py +0 -0
  141. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/src/mcp_wcgw/server/session.py +0 -0
  142. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/src/mcp_wcgw/server/sse.py +0 -0
  143. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/src/mcp_wcgw/server/stdio.py +0 -0
  144. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/src/mcp_wcgw/server/websocket.py +0 -0
  145. {wcgw-2.8.10/src/mcp_wcgw_fork/src/mcp_wcgw/client → wcgw-3.0.1/src/mcp_wcgw_fork/src/mcp_wcgw/shared}/__init__.py +0 -0
  146. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/src/mcp_wcgw/shared/context.py +0 -0
  147. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/src/mcp_wcgw/shared/exceptions.py +0 -0
  148. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/src/mcp_wcgw/shared/memory.py +0 -0
  149. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/src/mcp_wcgw/shared/progress.py +0 -0
  150. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/src/mcp_wcgw/shared/session.py +0 -0
  151. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/src/mcp_wcgw/shared/version.py +0 -0
  152. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/src/mcp_wcgw/types.py +0 -0
  153. {wcgw-2.8.10/src/mcp_wcgw_fork/src/mcp_wcgw/shared → wcgw-3.0.1/src/mcp_wcgw_fork/tests}/__init__.py +0 -0
  154. {wcgw-2.8.10/src/mcp_wcgw_fork/tests → wcgw-3.0.1/src/mcp_wcgw_fork/tests/client}/__init__.py +0 -0
  155. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/tests/client/test_session.py +0 -0
  156. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/tests/client/test_stdio.py +0 -0
  157. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/tests/conftest.py +0 -0
  158. {wcgw-2.8.10/src/mcp_wcgw_fork/tests/client → wcgw-3.0.1/src/mcp_wcgw_fork/tests/server}/__init__.py +0 -0
  159. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/tests/server/test_session.py +0 -0
  160. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/tests/server/test_stdio.py +0 -0
  161. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/tests/shared/test_memory.py +0 -0
  162. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/tests/test_types.py +0 -0
  163. {wcgw-2.8.10 → wcgw-3.0.1}/src/mcp_wcgw_fork/uv.lock +0 -0
  164. {wcgw-2.8.10/src/mcp_wcgw_fork/tests/server → wcgw-3.0.1/src/wcgw/client}/__init__.py +0 -0
  165. {wcgw-2.8.10 → wcgw-3.0.1}/src/wcgw/client/common.py +0 -0
  166. {wcgw-2.8.10 → wcgw-3.0.1}/src/wcgw/client/diff-instructions.txt +0 -0
  167. {wcgw-2.8.10 → wcgw-3.0.1}/src/wcgw/client/file_ops/search_replace.py +0 -0
  168. {wcgw-2.8.10 → wcgw-3.0.1}/src/wcgw/client/memory.py +0 -0
  169. {wcgw-2.8.10 → wcgw-3.0.1}/src/wcgw/client/repo_ops/path_prob.py +0 -0
  170. {wcgw-2.8.10 → wcgw-3.0.1}/src/wcgw/client/repo_ops/paths_model.vocab +0 -0
  171. {wcgw-2.8.10 → wcgw-3.0.1}/src/wcgw/client/repo_ops/paths_tokens.model +0 -0
  172. {wcgw-2.8.10 → wcgw-3.0.1}/src/wcgw/client/repo_ops/repo_context.py +0 -0
  173. /wcgw-2.8.10/src/wcgw/client/__init__.py → /wcgw-3.0.1/src/wcgw/py.typed +0 -0
  174. {wcgw-2.8.10 → wcgw-3.0.1}/src/wcgw/relay/static/privacy.txt +0 -0
  175. {wcgw-2.8.10 → wcgw-3.0.1}/src/wcgw_cli/__init__.py +0 -0
  176. {wcgw-2.8.10 → wcgw-3.0.1}/src/wcgw_cli/__main__.py +0 -0
  177. {wcgw-2.8.10 → wcgw-3.0.1}/src/wcgw_cli/openai_utils.py +0 -0
  178. {wcgw-2.8.10 → wcgw-3.0.1}/static/claude-ss.jpg +0 -0
  179. {wcgw-2.8.10 → wcgw-3.0.1}/static/computer-use.jpg +0 -0
  180. {wcgw-2.8.10 → wcgw-3.0.1}/static/example.jpg +0 -0
  181. {wcgw-2.8.10 → wcgw-3.0.1}/static/rocket-icon.png +0 -0
  182. {wcgw-2.8.10 → wcgw-3.0.1}/static/ss1.png +0 -0
@@ -13,7 +13,7 @@ jobs:
13
13
  runs-on: ubuntu-latest
14
14
  strategy:
15
15
  matrix:
16
- python-version: ["3.11", "3.12"]
16
+ python-version: ["3.11", "3.12", "3.13"]
17
17
  steps:
18
18
  - uses: actions/checkout@v4
19
19
  with:
@@ -29,7 +29,7 @@ jobs:
29
29
  - name: Run tests with coverage
30
30
  run: |
31
31
  uv pip install pytest pytest-cov
32
- uv run pytest --cov=wcgw --cov-report=xml --cov-report=term-missing:skip-covered
32
+ uv run pytest --cov=wcgw --cov-report=xml --cov-report=term-missing
33
33
  - name: Upload coverage reports to Codecov
34
34
  uses: codecov/codecov-action@v4
35
35
  if: success()
@@ -13,7 +13,7 @@ jobs:
13
13
  runs-on: ubuntu-latest
14
14
  strategy:
15
15
  matrix:
16
- python-version: ["3.11", "3.12"]
16
+ python-version: ["3.11", "3.12", "3.13"]
17
17
  steps:
18
18
  - uses: actions/checkout@v4
19
19
  with:
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wcgw
3
- Version: 2.8.10
3
+ Version: 3.0.1
4
4
  Summary: Shell and coding agent on claude and chatgpt
5
5
  Project-URL: Homepage, https://github.com/rusiaaman/wcgw
6
6
  Author-email: Aman Rusia <gapypi@arcfu.com>
7
7
  License-File: LICENSE
8
- Requires-Python: <3.13,>=3.11
8
+ Requires-Python: >=3.11
9
9
  Requires-Dist: anthropic>=0.39.0
10
10
  Requires-Dist: fastapi>=0.115.0
11
11
  Requires-Dist: openai>=1.46.0
@@ -22,7 +22,6 @@ Requires-Dist: syntax-checker>=0.3.0
22
22
  Requires-Dist: tokenizers>=0.21.0
23
23
  Requires-Dist: toml>=0.10.2
24
24
  Requires-Dist: typer>=0.12.5
25
- Requires-Dist: types-pexpect>=4.9.0.20240806
26
25
  Requires-Dist: uvicorn>=0.31.0
27
26
  Requires-Dist: websockets>=13.1
28
27
  Description-Content-Type: text/markdown
@@ -103,6 +102,8 @@ First install `uv` using homebrew `brew install uv`
103
102
 
104
103
  Then update `claude_desktop_config.json` (~/Library/Application Support/Claude/claude_desktop_config.json)
105
104
 
105
+ If it doesn't exist, you can just `touch ~/Library/Application\ Support/Claude/claude_desktop_config.json` or create the file.
106
+
106
107
  ```json
107
108
  {
108
109
  "mcpServers": {
@@ -74,6 +74,8 @@ First install `uv` using homebrew `brew install uv`
74
74
 
75
75
  Then update `claude_desktop_config.json` (~/Library/Application Support/Claude/claude_desktop_config.json)
76
76
 
77
+ If it doesn't exist, you can just `touch ~/Library/Application\ Support/Claude/claude_desktop_config.json` or create the file.
78
+
77
79
  ```json
78
80
  {
79
81
  "mcpServers": {
@@ -6,7 +6,7 @@
6
6
  },
7
7
  "servers": [
8
8
  {
9
- "url": "https://04df-103-212-152-58.ngrok-free.app"
9
+ "url": "https://7781-2401-4900-1c2d-12ae-c55d-45dc-459-c089.ngrok-free.app"
10
10
  }
11
11
  ],
12
12
  "paths": {
@@ -90,46 +90,6 @@
90
90
  }
91
91
  }
92
92
  },
93
- "/v1/reset_shell": {
94
- "post": {
95
- "x-openai-isConsequential": false,
96
- "summary": "Reset Shell",
97
- "operationId": "reset_shell_v1_reset_shell_post",
98
- "requestBody": {
99
- "content": {
100
- "application/json": {
101
- "schema": {
102
- "$ref": "#/components/schemas/ResetShellWithUUID"
103
- }
104
- }
105
- },
106
- "required": true
107
- },
108
- "responses": {
109
- "200": {
110
- "description": "Successful Response",
111
- "content": {
112
- "application/json": {
113
- "schema": {
114
- "type": "string",
115
- "title": "Response Reset Shell V1 Reset Shell Post"
116
- }
117
- }
118
- }
119
- },
120
- "422": {
121
- "description": "Validation Error",
122
- "content": {
123
- "application/json": {
124
- "schema": {
125
- "$ref": "#/components/schemas/HTTPValidationError"
126
- }
127
- }
128
- }
129
- }
130
- }
131
- }
132
- },
133
93
  "/v1/bash_command": {
134
94
  "post": {
135
95
  "x-openai-isConsequential": false,
@@ -170,46 +130,6 @@
170
130
  }
171
131
  }
172
132
  },
173
- "/v1/bash_interaction": {
174
- "post": {
175
- "x-openai-isConsequential": false,
176
- "summary": "Bash Interaction",
177
- "operationId": "bash_interaction_v1_bash_interaction_post",
178
- "requestBody": {
179
- "content": {
180
- "application/json": {
181
- "schema": {
182
- "$ref": "#/components/schemas/BashInteractionWithUUID"
183
- }
184
- }
185
- },
186
- "required": true
187
- },
188
- "responses": {
189
- "200": {
190
- "description": "Successful Response",
191
- "content": {
192
- "application/json": {
193
- "schema": {
194
- "type": "string",
195
- "title": "Response Bash Interaction V1 Bash Interaction Post"
196
- }
197
- }
198
- }
199
- },
200
- "422": {
201
- "description": "Validation Error",
202
- "content": {
203
- "application/json": {
204
- "schema": {
205
- "$ref": "#/components/schemas/HTTPValidationError"
206
- }
207
- }
208
- }
209
- }
210
- }
211
- }
212
- },
213
133
  "/v1/read_file": {
214
134
  "post": {
215
135
  "x-openai-isConsequential": false,
@@ -333,81 +253,6 @@
333
253
  },
334
254
  "components": {
335
255
  "schemas": {
336
- "BashInteractionWithUUID": {
337
- "properties": {
338
- "send_text": {
339
- "anyOf": [
340
- {
341
- "type": "string"
342
- },
343
- {
344
- "type": "null"
345
- }
346
- ],
347
- "title": "Send Text"
348
- },
349
- "send_specials": {
350
- "anyOf": [
351
- {
352
- "items": {
353
- "type": "string",
354
- "enum": [
355
- "Key-up",
356
- "Key-down",
357
- "Key-left",
358
- "Key-right",
359
- "Enter",
360
- "Ctrl-c",
361
- "Ctrl-d",
362
- "Ctrl-z"
363
- ]
364
- },
365
- "type": "array"
366
- },
367
- {
368
- "type": "null"
369
- }
370
- ],
371
- "title": "Send Specials"
372
- },
373
- "send_ascii": {
374
- "anyOf": [
375
- {
376
- "items": {
377
- "type": "integer"
378
- },
379
- "type": "array"
380
- },
381
- {
382
- "type": "null"
383
- }
384
- ],
385
- "title": "Send Ascii"
386
- },
387
- "wait_for_seconds": {
388
- "anyOf": [
389
- {
390
- "type": "integer"
391
- },
392
- {
393
- "type": "null"
394
- }
395
- ],
396
- "title": "Wait For Seconds"
397
- },
398
- "user_id": {
399
- "type": "string",
400
- "format": "uuid",
401
- "title": "User Id"
402
- }
403
- },
404
- "additionalProperties": false,
405
- "type": "object",
406
- "required": [
407
- "user_id"
408
- ],
409
- "title": "BashInteractionWithUUID"
410
- },
411
256
  "CodeWriterMode": {
412
257
  "properties": {
413
258
  "allowed_globs": {
@@ -449,11 +294,52 @@
449
294
  ],
450
295
  "title": "CodeWriterMode"
451
296
  },
452
- "CommandWithUUID": {
297
+ "Command": {
453
298
  "properties": {
454
299
  "command": {
455
300
  "type": "string",
456
301
  "title": "Command"
302
+ }
303
+ },
304
+ "additionalProperties": false,
305
+ "type": "object",
306
+ "required": [
307
+ "command"
308
+ ],
309
+ "title": "Command"
310
+ },
311
+ "CommandWithUUID": {
312
+ "properties": {
313
+ "action": {
314
+ "anyOf": [
315
+ {
316
+ "$ref": "#/components/schemas/Command"
317
+ },
318
+ {
319
+ "$ref": "#/components/schemas/StatusCheck"
320
+ },
321
+ {
322
+ "$ref": "#/components/schemas/SendText"
323
+ },
324
+ {
325
+ "$ref": "#/components/schemas/SendSpecials"
326
+ },
327
+ {
328
+ "$ref": "#/components/schemas/SendAscii"
329
+ }
330
+ ],
331
+ "title": "Action"
332
+ },
333
+ "wait_for_seconds": {
334
+ "anyOf": [
335
+ {
336
+ "type": "number"
337
+ },
338
+ {
339
+ "type": "null"
340
+ }
341
+ ],
342
+ "title": "Wait For Seconds"
457
343
  },
458
344
  "user_id": {
459
345
  "type": "string",
@@ -461,9 +347,10 @@
461
347
  "title": "User Id"
462
348
  }
463
349
  },
350
+ "additionalProperties": false,
464
351
  "type": "object",
465
352
  "required": [
466
- "command",
353
+ "action",
467
354
  "user_id"
468
355
  ],
469
356
  "title": "CommandWithUUID"
@@ -546,6 +433,16 @@
546
433
  },
547
434
  "InitializeWithUUID": {
548
435
  "properties": {
436
+ "type": {
437
+ "type": "string",
438
+ "enum": [
439
+ "first_call",
440
+ "user_asked_mode_change",
441
+ "reset_shell",
442
+ "user_asked_change_workspace"
443
+ ],
444
+ "title": "Type"
445
+ },
549
446
  "any_workspace_path": {
550
447
  "type": "string",
551
448
  "title": "Any Workspace Path"
@@ -589,6 +486,7 @@
589
486
  "additionalProperties": false,
590
487
  "type": "object",
591
488
  "required": [
489
+ "type",
592
490
  "any_workspace_path",
593
491
  "initial_files_to_read",
594
492
  "task_id_to_resume",
@@ -620,26 +518,78 @@
620
518
  ],
621
519
  "title": "ReadFileWithUUID"
622
520
  },
623
- "ResetShellWithUUID": {
521
+ "SendAscii": {
624
522
  "properties": {
625
- "should_reset": {
523
+ "send_ascii": {
524
+ "items": {
525
+ "type": "integer"
526
+ },
527
+ "type": "array",
528
+ "title": "Send Ascii"
529
+ }
530
+ },
531
+ "additionalProperties": false,
532
+ "type": "object",
533
+ "required": [
534
+ "send_ascii"
535
+ ],
536
+ "title": "SendAscii"
537
+ },
538
+ "SendSpecials": {
539
+ "properties": {
540
+ "send_specials": {
541
+ "items": {
542
+ "type": "string",
543
+ "enum": [
544
+ "Enter",
545
+ "Key-up",
546
+ "Key-down",
547
+ "Key-left",
548
+ "Key-right",
549
+ "Ctrl-c",
550
+ "Ctrl-d",
551
+ "Ctrl-z"
552
+ ]
553
+ },
554
+ "type": "array",
555
+ "title": "Send Specials"
556
+ }
557
+ },
558
+ "additionalProperties": false,
559
+ "type": "object",
560
+ "required": [
561
+ "send_specials"
562
+ ],
563
+ "title": "SendSpecials"
564
+ },
565
+ "SendText": {
566
+ "properties": {
567
+ "send_text": {
568
+ "type": "string",
569
+ "title": "Send Text"
570
+ }
571
+ },
572
+ "additionalProperties": false,
573
+ "type": "object",
574
+ "required": [
575
+ "send_text"
576
+ ],
577
+ "title": "SendText"
578
+ },
579
+ "StatusCheck": {
580
+ "properties": {
581
+ "status_check": {
626
582
  "type": "boolean",
627
583
  "const": true,
628
- "title": "Should Reset"
629
- },
630
- "user_id": {
631
- "type": "string",
632
- "format": "uuid",
633
- "title": "User Id"
584
+ "title": "Status Check"
634
585
  }
635
586
  },
636
587
  "additionalProperties": false,
637
588
  "type": "object",
638
589
  "required": [
639
- "should_reset",
640
- "user_id"
590
+ "status_check"
641
591
  ],
642
- "title": "ResetShellWithUUID"
592
+ "title": "StatusCheck"
643
593
  },
644
594
  "ValidationError": {
645
595
  "properties": {
@@ -9,25 +9,27 @@ Instructions:
9
9
  - Do not install new tools/packages before ensuring no such tools/package or an alternative already exists.
10
10
 
11
11
  Instructions for `Initialize`:
12
- - Always call this at the start of the conversation.- This will reset the shell.
13
- - Use `any_workspace_path` to initialize the shell in the appropriate project directory.
14
- - If the user has mentioned a workspace or project root, use it to set `any_workspace_path`.
15
- - If the user has mentioned a folder or file with unclear project root, use the file or folder as `any_workspace_path`.
16
- - If user has mentioned any files use `initial_files_to_read` to read, use absolute paths only.
17
- - If `any_workspace_path` is provided, a tree structure of the workspace will be shown.
18
- - Leave `any_workspace_path` as empty if no file or folder is mentioned.
19
- - By default use mode `wcgw`
20
- - In code-writer mode, set the commands and globs which user asked to set, otherwise use 'all'.
21
- - In order to change the mode later, call this tool again but be sure to not provide any other argument like task_id_to_resume unnecessarily.
12
+ - Always call this at the start of the conversation before using any of the shell tools from wcgw.
13
+ - Use `any_workspace_path` to initialize the shell in the appropriate project directory.
14
+ - If the user has mentioned a workspace or project root or any other file or folder use it to set `any_workspace_path`.
15
+ - If user has mentioned any files use `initial_files_to_read` to read, use absolute paths only.
16
+ - By default use mode "wcgw"
17
+ - In "code-writer" mode, set the commands and globs which user asked to set, otherwise use 'all'.
18
+ - Use type="first_call" if it's the first call to this tool.
19
+ - Use type="user_asked_mode_change" if in a conversation user has asked to change mode.
20
+ - Use type="reset_shell" if in a conversation shell is not working after multiple tries.
21
+ - Use type="user_asked_change_workspace" if in a conversation user asked to change workspace
22
22
 
23
23
  Instructions for `BashCommand`:
24
24
  - Execute a bash command. This is stateful (beware with subsequent calls).
25
- - Do not use interactive commands like nano. Prefer writing simpler commands.
26
25
  - Status of the command and the current working directory will always be returned at the end.
27
- - Optionally `exit shell has restarted` is the output, in which case environment resets, you can run fresh commands.
28
26
  - The first or the last line might be `(...truncated)` if the output is too long.
29
- - The control will return to you in 5 seconds regardless of the status. For heavy commands, keep checking status using BashInteraction till they are finished.
30
27
  - Run long running commands in background using screen instead of "&".
28
+ - Only one command allowed at a time, you need to wait for the first command to finish before running the next one.
29
+ - In order to check status of previous command, use `status_check` with empty command argument.
30
+ - Programs don't hang easily, so most likely explanation for no output is usually that the program is still running, and you need to check status again.
31
+ - Do not send Ctrl-c before checking for status till 10 minutes or whatever is appropriate for the program to finish.
32
+ - Use SendText or SendSpecials or SendAscii to interact with running command.
31
33
 
32
34
  Instructions for `Read Files`
33
35
  - Read full file content of one or more files.
@@ -38,16 +40,6 @@ Instructions for `Write if Empty`
38
40
  - Provide absolute file path only.
39
41
  - For editing existing files, use FileEdit.
40
42
 
41
- Instructions for `BashInteraction`
42
- - Interact with running program using this tool
43
- - Special keys like arrows, interrupts, enter, etc.
44
- - Send text input to the running program.
45
- - Send send_specials=["Enter"] to recheck status of a running program.
46
- - Only one of send_text, send_specials, send_ascii should be provided.
47
-
48
- Instructions for `ResetShell`
49
- - Resets the shell. Use only if all interrupts and prompt reset attempts have failed repeatedly.
50
-
51
43
  Instructions for `ContextSave`
52
44
  - Saves provided description and file contents of all the relevant file paths or globs in a single text file.
53
45
  - Provide random unqiue id or whatever user provided.
@@ -1,10 +1,10 @@
1
1
  [project]
2
2
  authors = [{ name = "Aman Rusia", email = "gapypi@arcfu.com" }]
3
3
  name = "wcgw"
4
- version = "2.8.10"
4
+ version = "3.0.1"
5
5
  description = "Shell and coding agent on claude and chatgpt"
6
6
  readme = "README.md"
7
- requires-python = ">=3.11, <3.13"
7
+ requires-python = ">=3.11"
8
8
  dependencies = [
9
9
  "openai>=1.46.0",
10
10
  "typer>=0.12.5",
@@ -12,7 +12,6 @@ dependencies = [
12
12
  "python-dotenv>=1.0.1",
13
13
  "pexpect>=4.9.0",
14
14
  "shell>=1.0.1",
15
- "types-pexpect>=4.9.0.20240806",
16
15
  "toml>=0.10.2",
17
16
  "petname>=2.6",
18
17
  "pyte>=0.8.2",
@@ -58,8 +57,10 @@ dev-dependencies = [
58
57
  "pytest>=8.0.0",
59
58
  "pytest-cov>=4.1.0",
60
59
  "line-profiler>=4.2.0",
60
+ "pytest-asyncio>=0.25.3",
61
+ "types-pexpect>=4.9.0.20241208",
61
62
  ]
62
63
 
63
64
  [tool.pytest.ini_options]
64
- addopts = "--cov=wcgw --cov-report=term-missing:skip-covered --cov-report=html"
65
+ addopts = "--cov=wcgw --cov-report=term-missing --cov-report=html"
65
66
  testpaths = ["tests"]
@@ -1,2 +1,2 @@
1
1
  from .client.mcp_server import main as mcp_server
2
- from .client.tools import run as listen
2
+ from .relay.client import run as listen