wcgw 3.0.6__py3-none-any.whl → 4.0.0__py3-none-any.whl
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.
- wcgw/client/bash_state/bash_state.py +182 -13
- wcgw/client/diff-instructions.txt +29 -15
- wcgw/client/file_ops/diff_edit.py +2 -1
- wcgw/client/file_ops/search_replace.py +37 -21
- wcgw/client/memory.py +5 -2
- wcgw/client/modes.py +7 -7
- wcgw/client/repo_ops/display_tree.py +3 -3
- wcgw/client/repo_ops/file_stats.py +152 -0
- wcgw/client/repo_ops/repo_context.py +122 -4
- wcgw/client/tool_prompts.py +13 -16
- wcgw/client/tools.py +500 -89
- wcgw/relay/serve.py +8 -52
- wcgw/types_.py +103 -16
- {wcgw-3.0.6.dist-info → wcgw-4.0.0.dist-info}/METADATA +59 -15
- {wcgw-3.0.6.dist-info → wcgw-4.0.0.dist-info}/RECORD +20 -19
- wcgw_cli/anthropic_client.py +1 -1
- wcgw_cli/openai_client.py +1 -1
- {wcgw-3.0.6.dist-info → wcgw-4.0.0.dist-info}/WHEEL +0 -0
- {wcgw-3.0.6.dist-info → wcgw-4.0.0.dist-info}/entry_points.txt +0 -0
- {wcgw-3.0.6.dist-info → wcgw-4.0.0.dist-info}/licenses/LICENSE +0 -0
wcgw/relay/serve.py
CHANGED
|
@@ -16,23 +16,14 @@ from pydantic import BaseModel
|
|
|
16
16
|
from ..types_ import (
|
|
17
17
|
BashCommand,
|
|
18
18
|
ContextSave,
|
|
19
|
-
|
|
19
|
+
FileWriteOrEdit,
|
|
20
20
|
Initialize,
|
|
21
21
|
ReadFiles,
|
|
22
|
-
WriteIfEmpty,
|
|
23
22
|
)
|
|
24
23
|
|
|
25
24
|
|
|
26
25
|
class Mdata(BaseModel):
|
|
27
|
-
data:
|
|
28
|
-
BashCommand
|
|
29
|
-
| WriteIfEmpty
|
|
30
|
-
| FileEdit
|
|
31
|
-
| ReadFiles
|
|
32
|
-
| Initialize
|
|
33
|
-
| ContextSave
|
|
34
|
-
| str
|
|
35
|
-
)
|
|
26
|
+
data: BashCommand | FileWriteOrEdit | ReadFiles | Initialize | ContextSave | str
|
|
36
27
|
user_id: UUID
|
|
37
28
|
|
|
38
29
|
|
|
@@ -93,12 +84,12 @@ async def register_websocket(websocket: WebSocket, uuid: UUID) -> None:
|
|
|
93
84
|
print(f"Client {uuid} disconnected")
|
|
94
85
|
|
|
95
86
|
|
|
96
|
-
class
|
|
87
|
+
class FileWriteOrEdithUUID(FileWriteOrEdit):
|
|
97
88
|
user_id: UUID
|
|
98
89
|
|
|
99
90
|
|
|
100
|
-
@app.post("/v1/
|
|
101
|
-
async def
|
|
91
|
+
@app.post("/v1/file_write_or_edit")
|
|
92
|
+
async def file_write_or_edit(write_file_data: FileWriteOrEdithUUID) -> str:
|
|
102
93
|
user_id = write_file_data.user_id
|
|
103
94
|
if user_id not in clients:
|
|
104
95
|
return "Failure: id not found, ask the user to check it."
|
|
@@ -122,42 +113,6 @@ async def create_file(write_file_data: WriteIfEmptyWithUUID) -> str:
|
|
|
122
113
|
raise fastapi.HTTPException(status_code=500, detail="Timeout error")
|
|
123
114
|
|
|
124
115
|
|
|
125
|
-
class FileEditWithUUID(FileEdit):
|
|
126
|
-
user_id: UUID
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
@app.post("/v1/full_file_edit")
|
|
130
|
-
async def file_edit_find_replace(
|
|
131
|
-
file_edit_find_replace: FileEditWithUUID,
|
|
132
|
-
) -> str:
|
|
133
|
-
user_id = file_edit_find_replace.user_id
|
|
134
|
-
if user_id not in clients:
|
|
135
|
-
return "Failure: id not found, ask the user to check it."
|
|
136
|
-
|
|
137
|
-
results: Optional[str] = None
|
|
138
|
-
|
|
139
|
-
def put_results(result: str) -> None:
|
|
140
|
-
nonlocal results
|
|
141
|
-
results = result
|
|
142
|
-
|
|
143
|
-
gpts[user_id] = put_results
|
|
144
|
-
|
|
145
|
-
await clients[user_id](
|
|
146
|
-
Mdata(
|
|
147
|
-
data=file_edit_find_replace,
|
|
148
|
-
user_id=user_id,
|
|
149
|
-
)
|
|
150
|
-
)
|
|
151
|
-
|
|
152
|
-
start_time = time.time()
|
|
153
|
-
while time.time() - start_time < 30:
|
|
154
|
-
if results is not None:
|
|
155
|
-
return results
|
|
156
|
-
await asyncio.sleep(0.1)
|
|
157
|
-
|
|
158
|
-
raise fastapi.HTTPException(status_code=500, detail="Timeout error")
|
|
159
|
-
|
|
160
|
-
|
|
161
116
|
class CommandWithUUID(BashCommand):
|
|
162
117
|
user_id: UUID
|
|
163
118
|
|
|
@@ -179,7 +134,8 @@ async def bash_command(command: CommandWithUUID) -> str:
|
|
|
179
134
|
await clients[user_id](
|
|
180
135
|
Mdata(
|
|
181
136
|
data=BashCommand(
|
|
182
|
-
action_json=command.action_json,
|
|
137
|
+
action_json=command.action_json,
|
|
138
|
+
wait_for_seconds=command.wait_for_seconds,
|
|
183
139
|
),
|
|
184
140
|
user_id=user_id,
|
|
185
141
|
)
|
|
@@ -281,7 +237,7 @@ async def context_save(context_save_data: ContextSaveWithUUID) -> str:
|
|
|
281
237
|
raise fastapi.HTTPException(status_code=500, detail="Timeout error")
|
|
282
238
|
|
|
283
239
|
|
|
284
|
-
app.mount("/static", StaticFiles(directory="static")
|
|
240
|
+
app.mount("/static", StaticFiles(directory="static"))
|
|
285
241
|
|
|
286
242
|
|
|
287
243
|
def run() -> None:
|
wcgw/types_.py
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import os
|
|
2
|
-
from typing import Any, Literal, Optional, Protocol, Sequence, Union
|
|
2
|
+
from typing import Any, List, Literal, Optional, Protocol, Sequence, Union
|
|
3
3
|
|
|
4
4
|
from pydantic import BaseModel as PydanticBaseModel
|
|
5
|
+
from pydantic import PrivateAttr
|
|
5
6
|
|
|
6
7
|
|
|
7
8
|
class NoExtraArgs(PydanticBaseModel):
|
|
@@ -56,9 +57,9 @@ class Initialize(BaseModel):
|
|
|
56
57
|
|
|
57
58
|
def model_post_init(self, __context: Any) -> None:
|
|
58
59
|
if self.mode_name == "code_writer":
|
|
59
|
-
assert (
|
|
60
|
-
|
|
61
|
-
)
|
|
60
|
+
assert self.code_writer_config is not None, (
|
|
61
|
+
"code_writer_config can't be null when the mode is code_writer"
|
|
62
|
+
)
|
|
62
63
|
return super().model_post_init(__context)
|
|
63
64
|
|
|
64
65
|
@property
|
|
@@ -67,9 +68,9 @@ class Initialize(BaseModel):
|
|
|
67
68
|
return "wcgw"
|
|
68
69
|
if self.mode_name == "architect":
|
|
69
70
|
return "architect"
|
|
70
|
-
assert (
|
|
71
|
-
|
|
72
|
-
)
|
|
71
|
+
assert self.code_writer_config is not None, (
|
|
72
|
+
"code_writer_config can't be null when the mode is code_writer"
|
|
73
|
+
)
|
|
73
74
|
return self.code_writer_config
|
|
74
75
|
|
|
75
76
|
|
|
@@ -114,6 +115,94 @@ class WriteIfEmpty(BaseModel):
|
|
|
114
115
|
|
|
115
116
|
class ReadFiles(BaseModel):
|
|
116
117
|
file_paths: list[str]
|
|
118
|
+
show_line_numbers_reason: Optional[str] = None
|
|
119
|
+
_start_line_nums: List[Optional[int]] = PrivateAttr(default_factory=lambda: [])
|
|
120
|
+
_end_line_nums: List[Optional[int]] = PrivateAttr(default_factory=lambda: [])
|
|
121
|
+
|
|
122
|
+
@property
|
|
123
|
+
def start_line_nums(self) -> List[Optional[int]]:
|
|
124
|
+
"""Get the start line numbers."""
|
|
125
|
+
return self._start_line_nums
|
|
126
|
+
|
|
127
|
+
@property
|
|
128
|
+
def end_line_nums(self) -> List[Optional[int]]:
|
|
129
|
+
"""Get the end line numbers."""
|
|
130
|
+
return self._end_line_nums
|
|
131
|
+
|
|
132
|
+
def model_post_init(self, __context: Any) -> None:
|
|
133
|
+
# Parse file paths for line ranges and store them in private attributes
|
|
134
|
+
self._start_line_nums = []
|
|
135
|
+
self._end_line_nums = []
|
|
136
|
+
|
|
137
|
+
# Create new file_paths list without line ranges
|
|
138
|
+
clean_file_paths = []
|
|
139
|
+
|
|
140
|
+
for file_path in self.file_paths:
|
|
141
|
+
start_line_num = None
|
|
142
|
+
end_line_num = None
|
|
143
|
+
path_part = file_path
|
|
144
|
+
|
|
145
|
+
# Check if the path ends with a line range pattern
|
|
146
|
+
# We're looking for patterns at the very end of the path like:
|
|
147
|
+
# - file.py:10 (specific line)
|
|
148
|
+
# - file.py:10-20 (line range)
|
|
149
|
+
# - file.py:10- (from line 10 to end)
|
|
150
|
+
# - file.py:-20 (from start to line 20)
|
|
151
|
+
|
|
152
|
+
# Split by the last colon
|
|
153
|
+
if ":" in file_path:
|
|
154
|
+
parts = file_path.rsplit(":", 1)
|
|
155
|
+
if len(parts) == 2:
|
|
156
|
+
potential_path = parts[0]
|
|
157
|
+
line_spec = parts[1]
|
|
158
|
+
|
|
159
|
+
# Check if it's a valid line range format
|
|
160
|
+
if line_spec.isdigit():
|
|
161
|
+
# Format: file.py:10
|
|
162
|
+
try:
|
|
163
|
+
start_line_num = int(line_spec)
|
|
164
|
+
path_part = potential_path
|
|
165
|
+
except ValueError:
|
|
166
|
+
# Keep the original path if conversion fails
|
|
167
|
+
pass
|
|
168
|
+
|
|
169
|
+
elif "-" in line_spec:
|
|
170
|
+
# Could be file.py:10-20, file.py:10-, or file.py:-20
|
|
171
|
+
line_parts = line_spec.split("-", 1)
|
|
172
|
+
|
|
173
|
+
if not line_parts[0] and line_parts[1].isdigit():
|
|
174
|
+
# Format: file.py:-20
|
|
175
|
+
try:
|
|
176
|
+
end_line_num = int(line_parts[1])
|
|
177
|
+
path_part = potential_path
|
|
178
|
+
except ValueError:
|
|
179
|
+
# Keep original path
|
|
180
|
+
pass
|
|
181
|
+
|
|
182
|
+
elif line_parts[0].isdigit():
|
|
183
|
+
# Format: file.py:10-20 or file.py:10-
|
|
184
|
+
try:
|
|
185
|
+
start_line_num = int(line_parts[0])
|
|
186
|
+
|
|
187
|
+
if line_parts[1].isdigit():
|
|
188
|
+
# file.py:10-20
|
|
189
|
+
end_line_num = int(line_parts[1])
|
|
190
|
+
|
|
191
|
+
# In both cases, update the path
|
|
192
|
+
path_part = potential_path
|
|
193
|
+
except ValueError:
|
|
194
|
+
# Keep original path
|
|
195
|
+
pass
|
|
196
|
+
|
|
197
|
+
# Add clean path and corresponding line numbers
|
|
198
|
+
clean_file_paths.append(path_part)
|
|
199
|
+
self._start_line_nums.append(start_line_num)
|
|
200
|
+
self._end_line_nums.append(end_line_num)
|
|
201
|
+
|
|
202
|
+
# Update file_paths with clean paths
|
|
203
|
+
self.file_paths = clean_file_paths
|
|
204
|
+
|
|
205
|
+
return super().model_post_init(__context)
|
|
117
206
|
|
|
118
207
|
|
|
119
208
|
class FileEdit(BaseModel):
|
|
@@ -121,6 +210,12 @@ class FileEdit(BaseModel):
|
|
|
121
210
|
file_edit_using_search_replace_blocks: str
|
|
122
211
|
|
|
123
212
|
|
|
213
|
+
class FileWriteOrEdit(BaseModel):
|
|
214
|
+
file_path: str
|
|
215
|
+
percentage_to_change: int # 0.0 to 100.0
|
|
216
|
+
file_content_or_search_replace_blocks: str
|
|
217
|
+
|
|
218
|
+
|
|
124
219
|
class ContextSave(BaseModel):
|
|
125
220
|
id: str
|
|
126
221
|
project_root_path: str
|
|
@@ -135,12 +230,4 @@ class Console(Protocol):
|
|
|
135
230
|
|
|
136
231
|
|
|
137
232
|
class Mdata(PydanticBaseModel):
|
|
138
|
-
data:
|
|
139
|
-
BashCommand
|
|
140
|
-
| WriteIfEmpty
|
|
141
|
-
| FileEdit
|
|
142
|
-
| str
|
|
143
|
-
| ReadFiles
|
|
144
|
-
| Initialize
|
|
145
|
-
| ContextSave
|
|
146
|
-
)
|
|
233
|
+
data: BashCommand | FileWriteOrEdit | str | ReadFiles | Initialize | ContextSave
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: wcgw
|
|
3
|
-
Version:
|
|
3
|
+
Version: 4.0.0
|
|
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>
|
|
@@ -17,7 +17,6 @@ Requires-Dist: pyte>=0.8.2
|
|
|
17
17
|
Requires-Dist: python-dotenv>=1.0.1
|
|
18
18
|
Requires-Dist: rich>=13.8.1
|
|
19
19
|
Requires-Dist: semantic-version>=2.10.0
|
|
20
|
-
Requires-Dist: shell>=1.0.1
|
|
21
20
|
Requires-Dist: syntax-checker>=0.3.0
|
|
22
21
|
Requires-Dist: tokenizers>=0.21.0
|
|
23
22
|
Requires-Dist: toml>=0.10.2
|
|
@@ -30,8 +29,8 @@ Description-Content-Type: text/markdown
|
|
|
30
29
|
|
|
31
30
|
Empowering chat applications to code, build and run on your local machine.
|
|
32
31
|
|
|
33
|
-
- Claude - An MCP server on claude desktop for autonomous shell and coding agent. (mac
|
|
34
|
-
- Chatgpt - Allows custom gpt to talk to your shell via a relay server. (linux
|
|
32
|
+
- Claude - An MCP server on claude desktop for autonomous shell and coding agent. (mac, linux, windows on wsl)
|
|
33
|
+
- Chatgpt - Allows custom gpt to talk to your shell via a relay server. (linux, mac, windows on wsl)
|
|
35
34
|
|
|
36
35
|
⚠️ Warning: do not allow BashCommand tool without reviewing the command, it may result in data loss.
|
|
37
36
|
|
|
@@ -39,7 +38,11 @@ Empowering chat applications to code, build and run on your local machine.
|
|
|
39
38
|
[](https://github.com/rusiaaman/wcgw/actions/workflows/python-types.yml)
|
|
40
39
|
[](https://github.com/rusiaaman/wcgw/actions/workflows/python-publish.yml)
|
|
41
40
|
[](https://codecov.io/gh/rusiaaman/wcgw)
|
|
42
|
-
[](https://www.reddit.com/r/wcgw_mcp/)
|
|
42
|
+
|
|
43
|
+
## Demo
|
|
44
|
+
|
|
45
|
+

|
|
43
46
|
|
|
44
47
|
## Updates
|
|
45
48
|
|
|
@@ -53,7 +56,6 @@ Empowering chat applications to code, build and run on your local machine.
|
|
|
53
56
|
|
|
54
57
|
- [9 Dec 2024] [Vscode extension to paste context on Claude app](https://marketplace.visualstudio.com/items?itemName=AmanRusia.wcgw)
|
|
55
58
|
|
|
56
|
-
|
|
57
59
|
## 🚀 Highlights
|
|
58
60
|
|
|
59
61
|
- ⚡ **Create, Execute, Iterate**: Ask claude to keep running compiler checks till all errors are fixed, or ask it to keep checking for the status of a long running command till it's done.
|
|
@@ -96,6 +98,8 @@ Empowering chat applications to code, build and run on your local machine.
|
|
|
96
98
|
|
|
97
99
|
## Claude setup (using mcp)
|
|
98
100
|
|
|
101
|
+
### Mac and linux
|
|
102
|
+
|
|
99
103
|
First install `uv` using homebrew `brew install uv`
|
|
100
104
|
|
|
101
105
|
(**Important:** use homebrew to install uv. Otherwise make sure `uv` is present in a global location like /usr/bin/)
|
|
@@ -131,18 +135,33 @@ _If there's an error in setting up_
|
|
|
131
135
|
- Try using `uv` version `0.6.0` for which this tool was tested.
|
|
132
136
|
- Debug the mcp server using `npx @modelcontextprotocol/inspector@0.1.7 uv tool run --from wcgw@latest --python 3.12 wcgw_mcp`
|
|
133
137
|
|
|
134
|
-
###
|
|
138
|
+
### Windows on wsl
|
|
135
139
|
|
|
136
|
-
|
|
140
|
+
This mcp server works only on wsl on windows.
|
|
137
141
|
|
|
138
|
-
|
|
142
|
+
To set it up, [install uv](https://docs.astral.sh/uv/getting-started/installation/)
|
|
139
143
|
|
|
140
|
-
|
|
141
|
-
npx -y @smithery/cli install wcgw --client claude
|
|
142
|
-
```
|
|
144
|
+
Then add or update the claude config file `%APPDATA%\Claude\claude_desktop_config.json` with the following
|
|
143
145
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
+
```json
|
|
147
|
+
{
|
|
148
|
+
"mcpServers": {
|
|
149
|
+
"wcgw": {
|
|
150
|
+
"command": "wsl.exe",
|
|
151
|
+
"args": [
|
|
152
|
+
"uv",
|
|
153
|
+
"tool",
|
|
154
|
+
"run",
|
|
155
|
+
"--from",
|
|
156
|
+
"wcgw@latest",
|
|
157
|
+
"--python",
|
|
158
|
+
"3.12",
|
|
159
|
+
"wcgw_mcp"
|
|
160
|
+
]
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
```
|
|
146
165
|
|
|
147
166
|
### Usage
|
|
148
167
|
|
|
@@ -174,6 +193,7 @@ There are three built-in modes. You may ask Claude to run in one of the modes, l
|
|
|
174
193
|
Note: in code-writer mode either all commands are allowed or none are allowed for now. If you give a list of allowed commands, Claude is instructed to run only those commands, but no actual check happens. (WIP)
|
|
175
194
|
|
|
176
195
|
#### Attach to the working terminal to investigate
|
|
196
|
+
|
|
177
197
|
If you've `screen` command installed, wcgw runs on a screen instance automatically. If you've started wcgw mcp server, you can list the screen sessions:
|
|
178
198
|
|
|
179
199
|
`screen -ls`
|
|
@@ -184,7 +204,7 @@ You can then attach to the session using `screen -x 93358.wcgw.235521`
|
|
|
184
204
|
|
|
185
205
|
You may interrupt any running command safely.
|
|
186
206
|
|
|
187
|
-
You can interact with the terminal but beware that the AI might be running in parallel and it may conflict with what you're doing. It's recommended to keep your interactions to minimum.
|
|
207
|
+
You can interact with the terminal but beware that the AI might be running in parallel and it may conflict with what you're doing. It's recommended to keep your interactions to minimum.
|
|
188
208
|
|
|
189
209
|
You shouldn't exit the session using `exit `or Ctrl-d, instead you should use `ctrl+a+d` to safely detach without destroying the screen session.
|
|
190
210
|
|
|
@@ -204,6 +224,30 @@ Read here: https://github.com/rusiaaman/wcgw/blob/main/openai.md
|
|
|
204
224
|
|
|
205
225
|

|
|
206
226
|
|
|
227
|
+
## Using mcp server over docker
|
|
228
|
+
|
|
229
|
+
First build the docker image `docker build -t wcgw https://github.com/rusiaaman/wcgw.git`
|
|
230
|
+
|
|
231
|
+
Then you can update `/Users/username/Library/Application Support/Claude/claude_desktop_config.json` to have
|
|
232
|
+
|
|
233
|
+
```
|
|
234
|
+
{
|
|
235
|
+
"mcpServers": {
|
|
236
|
+
"filesystem": {
|
|
237
|
+
"command": "docker",
|
|
238
|
+
"args": [
|
|
239
|
+
"run",
|
|
240
|
+
"-i",
|
|
241
|
+
"--rm",
|
|
242
|
+
"--mount",
|
|
243
|
+
"type=bind,src=/Users/username/Desktop,dst=/workspace/Desktop",
|
|
244
|
+
"wcgw",
|
|
245
|
+
]
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
```
|
|
250
|
+
|
|
207
251
|
## [Optional] Local shell access with openai API key or anthropic API key
|
|
208
252
|
|
|
209
253
|
### Openai
|
|
@@ -1,33 +1,34 @@
|
|
|
1
1
|
wcgw/__init__.py,sha256=qUofQOAXCGcWr2u_B8U-MIMhhYaBUpUwNDcscvRmYfo,90
|
|
2
2
|
wcgw/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
-
wcgw/types_.py,sha256=
|
|
3
|
+
wcgw/types_.py,sha256=mwr2x20yLF85OoHy3pKxtmG834Gnoqrkx3pA8skGsVk,7360
|
|
4
4
|
wcgw/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
5
|
wcgw/client/common.py,sha256=OCH7Tx64jojz3M3iONUrGMadE07W21DiZs5sOxWX1Qc,1456
|
|
6
|
-
wcgw/client/diff-instructions.txt,sha256=
|
|
7
|
-
wcgw/client/memory.py,sha256=
|
|
8
|
-
wcgw/client/modes.py,sha256=
|
|
9
|
-
wcgw/client/tool_prompts.py,sha256=
|
|
10
|
-
wcgw/client/tools.py,sha256=
|
|
11
|
-
wcgw/client/bash_state/bash_state.py,sha256=
|
|
6
|
+
wcgw/client/diff-instructions.txt,sha256=HXYfGvhlDMxmiIX9AbB05wJcptJF_gSIobYhYSqWRJo,1685
|
|
7
|
+
wcgw/client/memory.py,sha256=M0plOGE5WXTEAs7nVLg4eCpVhmSW94ckpg5D0ycWX5I,2927
|
|
8
|
+
wcgw/client/modes.py,sha256=Opmy5nKrCA4YITn79G1Q8l55xeBmhwtSv6MasSGkp5U,10338
|
|
9
|
+
wcgw/client/tool_prompts.py,sha256=H2jzhnRDv99R-VaYo38FtGh4DxAVJniqG5Wuj35JfHs,4287
|
|
10
|
+
wcgw/client/tools.py,sha256=rsoEUVVqZkYCTK-qlsik4CuxsmANvNOoCXJgDHAAX1Y,43243
|
|
11
|
+
wcgw/client/bash_state/bash_state.py,sha256=9lBqdnHStgKEOU_t1ACeHed0cwbO2npaLAiEerFj1Es,33874
|
|
12
12
|
wcgw/client/encoder/__init__.py,sha256=Y-8f43I6gMssUCWpX5rLYiAFv3D-JPRs4uNEejPlke8,1514
|
|
13
|
-
wcgw/client/file_ops/diff_edit.py,sha256=
|
|
14
|
-
wcgw/client/file_ops/search_replace.py,sha256=
|
|
13
|
+
wcgw/client/file_ops/diff_edit.py,sha256=vKELPknWu3FGgPos74yN9wox6BCVcaocZ7dpBAT8Blk,18723
|
|
14
|
+
wcgw/client/file_ops/search_replace.py,sha256=2biF6b_l9JRWXJRkeRIo_ltUVBKgsQgPuDd_sqkPMX8,5811
|
|
15
15
|
wcgw/client/mcp_server/Readme.md,sha256=2Z88jj1mf9daYGW1CWaldcJ0moy8owDumhR2glBY3A8,109
|
|
16
16
|
wcgw/client/mcp_server/__init__.py,sha256=mm7xhBIPwJpRT3u-Qsj4cKVMpVyucJoKRlbMP_gRRB0,343
|
|
17
17
|
wcgw/client/mcp_server/server.py,sha256=ayK6qbzCveoQW7RO80m10cAIS3m-hvxzd15XhjiyxmE,5055
|
|
18
|
-
wcgw/client/repo_ops/display_tree.py,sha256=
|
|
18
|
+
wcgw/client/repo_ops/display_tree.py,sha256=uOGX2IbXTKXwtXT2wdDszuH4ODmSYsHm0toU55e1vYI,4021
|
|
19
|
+
wcgw/client/repo_ops/file_stats.py,sha256=AUA0Br7zFRpylWFYZPGMeGPJy3nWp9e2haKi34JptHE,4887
|
|
19
20
|
wcgw/client/repo_ops/path_prob.py,sha256=SWf0CDn37rtlsYRQ51ufSxay-heaQoVIhr1alB9tZ4M,2144
|
|
20
21
|
wcgw/client/repo_ops/paths_model.vocab,sha256=M1pXycYDQehMXtpp-qAgU7rtzeBbCOiJo4qcYFY0kqk,315087
|
|
21
22
|
wcgw/client/repo_ops/paths_tokens.model,sha256=jiwwE4ae8ADKuTZISutXuM5Wfyc_FBmN5rxTjoNnCos,1569052
|
|
22
|
-
wcgw/client/repo_ops/repo_context.py,sha256=
|
|
23
|
+
wcgw/client/repo_ops/repo_context.py,sha256=vB3ET5RLA7p9OpL3XNPr3nycQkoeu6gC-RbyA9Ml-xA,8871
|
|
23
24
|
wcgw/relay/client.py,sha256=BUeEKUsWts8RpYxXwXcyFyjBJhOCS-CxThAlL_-VCOI,3618
|
|
24
|
-
wcgw/relay/serve.py,sha256=
|
|
25
|
+
wcgw/relay/serve.py,sha256=vaHxSm4DkWUKLMOnz2cO6ClR2udnaXCWAGl0O_bXvrs,6984
|
|
25
26
|
wcgw/relay/static/privacy.txt,sha256=s9qBdbx2SexCpC_z33sg16TptmAwDEehMCLz4L50JLc,529
|
|
26
27
|
wcgw_cli/__init__.py,sha256=TNxXsTPgb52OhakIda9wTRh91cqoBqgQRx5TxjzQQFU,21
|
|
27
28
|
wcgw_cli/__main__.py,sha256=wcCrL4PjG51r5wVKqJhcoJPTLfHW0wNbD31DrUN0MWI,28
|
|
28
|
-
wcgw_cli/anthropic_client.py,sha256
|
|
29
|
+
wcgw_cli/anthropic_client.py,sha256=R95ht8ct3TgV8PMNzr5yJdAXAmZpozPpyZZ01J9bQHs,19627
|
|
29
30
|
wcgw_cli/cli.py,sha256=-7FBe_lahKyUOhf65iurTA1M1gXXXAiT0OVKQVcZKKo,948
|
|
30
|
-
wcgw_cli/openai_client.py,sha256=
|
|
31
|
+
wcgw_cli/openai_client.py,sha256=MnJ93E7vSIRx1SkkanvCTcfc4ZsndlPUs8c-LXdxbOk,15761
|
|
31
32
|
wcgw_cli/openai_utils.py,sha256=xGOb3W5ALrIozV7oszfGYztpj0FnXdD7jAxm5lEIVKY,2439
|
|
32
33
|
mcp_wcgw/__init__.py,sha256=fKCgOdN7cn7gR3YGFaGyV5Goe8A2sEyllLcsRkN0i-g,2601
|
|
33
34
|
mcp_wcgw/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -51,8 +52,8 @@ mcp_wcgw/shared/memory.py,sha256=dBsOghxHz8-tycdSVo9kSujbsC8xb_tYsGmuJobuZnw,281
|
|
|
51
52
|
mcp_wcgw/shared/progress.py,sha256=ymxOsb8XO5Mhlop7fRfdbmvPodANj7oq6O4dD0iUcnw,1048
|
|
52
53
|
mcp_wcgw/shared/session.py,sha256=e44a0LQOW8gwdLs9_DE9oDsxqW2U8mXG3d5KT95bn5o,10393
|
|
53
54
|
mcp_wcgw/shared/version.py,sha256=d2LZii-mgsPIxpshjkXnOTUmk98i0DT4ff8VpA_kAvE,111
|
|
54
|
-
wcgw-
|
|
55
|
-
wcgw-
|
|
56
|
-
wcgw-
|
|
57
|
-
wcgw-
|
|
58
|
-
wcgw-
|
|
55
|
+
wcgw-4.0.0.dist-info/METADATA,sha256=lep9tKuEznEoFQBQ7VpRAOrhUlFnGcPu8Q4KXIE2QQo,14785
|
|
56
|
+
wcgw-4.0.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
57
|
+
wcgw-4.0.0.dist-info/entry_points.txt,sha256=vd3tj1_Kzfp55LscJ8-6WFMM5hm9cWTfNGFCrWBnH3Q,124
|
|
58
|
+
wcgw-4.0.0.dist-info/licenses/LICENSE,sha256=BvY8xqjOfc3X2qZpGpX3MZEmF-4Dp0LqgKBbT6L_8oI,11142
|
|
59
|
+
wcgw-4.0.0.dist-info/RECORD,,
|
wcgw_cli/anthropic_client.py
CHANGED
|
@@ -217,7 +217,7 @@ def loop(
|
|
|
217
217
|
system_console, os.getcwd(), None, None, None, None, True, None
|
|
218
218
|
) as bash_state:
|
|
219
219
|
context = Context(bash_state, system_console)
|
|
220
|
-
system, context = initialize(
|
|
220
|
+
system, context, _ = initialize(
|
|
221
221
|
"first_call",
|
|
222
222
|
context,
|
|
223
223
|
os.getcwd(),
|
wcgw_cli/openai_client.py
CHANGED
|
@@ -181,7 +181,7 @@ def loop(
|
|
|
181
181
|
system_console, os.getcwd(), None, None, None, None, True, None
|
|
182
182
|
) as bash_state:
|
|
183
183
|
context = Context(bash_state, system_console)
|
|
184
|
-
system, context = initialize(
|
|
184
|
+
system, context, _ = initialize(
|
|
185
185
|
"first_call",
|
|
186
186
|
context,
|
|
187
187
|
os.getcwd(),
|
|
File without changes
|
|
File without changes
|
|
File without changes
|