wcgw 3.0.7__py3-none-any.whl → 4.1.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 +184 -13
- wcgw/client/diff-instructions.txt +29 -15
- wcgw/client/file_ops/diff_edit.py +44 -47
- wcgw/client/file_ops/search_replace.py +107 -72
- wcgw/client/mcp_server/server.py +7 -3
- wcgw/client/memory.py +5 -2
- wcgw/client/modes.py +19 -10
- 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 +147 -6
- wcgw/client/tool_prompts.py +14 -16
- wcgw/client/tools.py +496 -81
- wcgw/relay/serve.py +8 -53
- wcgw/types_.py +103 -16
- {wcgw-3.0.7.dist-info → wcgw-4.1.0.dist-info}/METADATA +39 -20
- {wcgw-3.0.7.dist-info → wcgw-4.1.0.dist-info}/RECORD +21 -20
- wcgw_cli/anthropic_client.py +1 -1
- wcgw_cli/openai_client.py +1 -1
- {wcgw-3.0.7.dist-info → wcgw-4.1.0.dist-info}/WHEEL +0 -0
- {wcgw-3.0.7.dist-info → wcgw-4.1.0.dist-info}/entry_points.txt +0 -0
- {wcgw-3.0.7.dist-info → wcgw-4.1.0.dist-info}/licenses/LICENSE +0 -0
wcgw/relay/serve.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
-
import os
|
|
3
2
|
import threading
|
|
4
3
|
import time
|
|
5
4
|
from importlib import metadata
|
|
@@ -17,23 +16,14 @@ from pydantic import BaseModel
|
|
|
17
16
|
from ..types_ import (
|
|
18
17
|
BashCommand,
|
|
19
18
|
ContextSave,
|
|
20
|
-
|
|
19
|
+
FileWriteOrEdit,
|
|
21
20
|
Initialize,
|
|
22
21
|
ReadFiles,
|
|
23
|
-
WriteIfEmpty,
|
|
24
22
|
)
|
|
25
23
|
|
|
26
24
|
|
|
27
25
|
class Mdata(BaseModel):
|
|
28
|
-
data:
|
|
29
|
-
BashCommand
|
|
30
|
-
| WriteIfEmpty
|
|
31
|
-
| FileEdit
|
|
32
|
-
| ReadFiles
|
|
33
|
-
| Initialize
|
|
34
|
-
| ContextSave
|
|
35
|
-
| str
|
|
36
|
-
)
|
|
26
|
+
data: BashCommand | FileWriteOrEdit | ReadFiles | Initialize | ContextSave | str
|
|
37
27
|
user_id: UUID
|
|
38
28
|
|
|
39
29
|
|
|
@@ -94,12 +84,12 @@ async def register_websocket(websocket: WebSocket, uuid: UUID) -> None:
|
|
|
94
84
|
print(f"Client {uuid} disconnected")
|
|
95
85
|
|
|
96
86
|
|
|
97
|
-
class
|
|
87
|
+
class FileWriteOrEdithUUID(FileWriteOrEdit):
|
|
98
88
|
user_id: UUID
|
|
99
89
|
|
|
100
90
|
|
|
101
|
-
@app.post("/v1/
|
|
102
|
-
async def
|
|
91
|
+
@app.post("/v1/file_write_or_edit")
|
|
92
|
+
async def file_write_or_edit(write_file_data: FileWriteOrEdithUUID) -> str:
|
|
103
93
|
user_id = write_file_data.user_id
|
|
104
94
|
if user_id not in clients:
|
|
105
95
|
return "Failure: id not found, ask the user to check it."
|
|
@@ -123,42 +113,6 @@ async def create_file(write_file_data: WriteIfEmptyWithUUID) -> str:
|
|
|
123
113
|
raise fastapi.HTTPException(status_code=500, detail="Timeout error")
|
|
124
114
|
|
|
125
115
|
|
|
126
|
-
class FileEditWithUUID(FileEdit):
|
|
127
|
-
user_id: UUID
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
@app.post("/v1/full_file_edit")
|
|
131
|
-
async def file_edit_find_replace(
|
|
132
|
-
file_edit_find_replace: FileEditWithUUID,
|
|
133
|
-
) -> str:
|
|
134
|
-
user_id = file_edit_find_replace.user_id
|
|
135
|
-
if user_id not in clients:
|
|
136
|
-
return "Failure: id not found, ask the user to check it."
|
|
137
|
-
|
|
138
|
-
results: Optional[str] = None
|
|
139
|
-
|
|
140
|
-
def put_results(result: str) -> None:
|
|
141
|
-
nonlocal results
|
|
142
|
-
results = result
|
|
143
|
-
|
|
144
|
-
gpts[user_id] = put_results
|
|
145
|
-
|
|
146
|
-
await clients[user_id](
|
|
147
|
-
Mdata(
|
|
148
|
-
data=file_edit_find_replace,
|
|
149
|
-
user_id=user_id,
|
|
150
|
-
)
|
|
151
|
-
)
|
|
152
|
-
|
|
153
|
-
start_time = time.time()
|
|
154
|
-
while time.time() - start_time < 30:
|
|
155
|
-
if results is not None:
|
|
156
|
-
return results
|
|
157
|
-
await asyncio.sleep(0.1)
|
|
158
|
-
|
|
159
|
-
raise fastapi.HTTPException(status_code=500, detail="Timeout error")
|
|
160
|
-
|
|
161
|
-
|
|
162
116
|
class CommandWithUUID(BashCommand):
|
|
163
117
|
user_id: UUID
|
|
164
118
|
|
|
@@ -180,7 +134,8 @@ async def bash_command(command: CommandWithUUID) -> str:
|
|
|
180
134
|
await clients[user_id](
|
|
181
135
|
Mdata(
|
|
182
136
|
data=BashCommand(
|
|
183
|
-
action_json=command.action_json,
|
|
137
|
+
action_json=command.action_json,
|
|
138
|
+
wait_for_seconds=command.wait_for_seconds,
|
|
184
139
|
),
|
|
185
140
|
user_id=user_id,
|
|
186
141
|
)
|
|
@@ -282,7 +237,7 @@ async def context_save(context_save_data: ContextSaveWithUUID) -> str:
|
|
|
282
237
|
raise fastapi.HTTPException(status_code=500, detail="Timeout error")
|
|
283
238
|
|
|
284
239
|
|
|
285
|
-
app.mount("/static", StaticFiles(directory=
|
|
240
|
+
app.mount("/static", StaticFiles(directory="static"))
|
|
286
241
|
|
|
287
242
|
|
|
288
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.1.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 -
|
|
34
|
-
- Chatgpt - Allows custom gpt to talk to your shell via a relay server. (linux
|
|
32
|
+
- Claude - MCP server with tightly integrated shell and code editing tools.
|
|
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,10 +38,16 @@ 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
|
|
|
49
|
+
- [24 Mar 2025] Improved writing and editing experience for sonnet 3.7, CLAUDE.md gets loaded automatically.
|
|
50
|
+
|
|
46
51
|
- [16 Feb 2025] You can now attach to the working terminal that the AI uses. See the "attach-to-terminal" section below.
|
|
47
52
|
|
|
48
53
|
- [15 Jan 2025] Modes introduced: architect, code-writer, and all powerful wcgw mode.
|
|
@@ -53,11 +58,10 @@ Empowering chat applications to code, build and run on your local machine.
|
|
|
53
58
|
|
|
54
59
|
- [9 Dec 2024] [Vscode extension to paste context on Claude app](https://marketplace.visualstudio.com/items?itemName=AmanRusia.wcgw)
|
|
55
60
|
|
|
56
|
-
|
|
57
61
|
## 🚀 Highlights
|
|
58
62
|
|
|
59
63
|
- ⚡ **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.
|
|
60
|
-
- ⚡ **Large file edit**: Supports large file incremental edits to avoid token limit issues.
|
|
64
|
+
- ⚡ **Large file edit**: Supports large file incremental edits to avoid token limit issues. Smartly selects when to do small edits or large rewrite based on % of change needed.
|
|
61
65
|
- ⚡ **Syntax checking on edits**: Reports feedback to the LLM if its edits have any syntax errors, so that it can redo it.
|
|
62
66
|
- ⚡ **Interactive Command Handling**: Supports interactive commands using arrow keys, interrupt, and ansi escape sequences.
|
|
63
67
|
- ⚡ **File protections**:
|
|
@@ -96,6 +100,8 @@ Empowering chat applications to code, build and run on your local machine.
|
|
|
96
100
|
|
|
97
101
|
## Claude setup (using mcp)
|
|
98
102
|
|
|
103
|
+
### Mac and linux
|
|
104
|
+
|
|
99
105
|
First install `uv` using homebrew `brew install uv`
|
|
100
106
|
|
|
101
107
|
(**Important:** use homebrew to install uv. Otherwise make sure `uv` is present in a global location like /usr/bin/)
|
|
@@ -131,18 +137,33 @@ _If there's an error in setting up_
|
|
|
131
137
|
- Try using `uv` version `0.6.0` for which this tool was tested.
|
|
132
138
|
- Debug the mcp server using `npx @modelcontextprotocol/inspector@0.1.7 uv tool run --from wcgw@latest --python 3.12 wcgw_mcp`
|
|
133
139
|
|
|
134
|
-
###
|
|
140
|
+
### Windows on wsl
|
|
135
141
|
|
|
136
|
-
|
|
142
|
+
This mcp server works only on wsl on windows.
|
|
137
143
|
|
|
138
|
-
|
|
144
|
+
To set it up, [install uv](https://docs.astral.sh/uv/getting-started/installation/)
|
|
139
145
|
|
|
140
|
-
|
|
141
|
-
npx -y @smithery/cli install wcgw --client claude
|
|
142
|
-
```
|
|
146
|
+
Then add or update the claude config file `%APPDATA%\Claude\claude_desktop_config.json` with the following
|
|
143
147
|
|
|
144
|
-
|
|
145
|
-
|
|
148
|
+
```json
|
|
149
|
+
{
|
|
150
|
+
"mcpServers": {
|
|
151
|
+
"wcgw": {
|
|
152
|
+
"command": "wsl.exe",
|
|
153
|
+
"args": [
|
|
154
|
+
"uv",
|
|
155
|
+
"tool",
|
|
156
|
+
"run",
|
|
157
|
+
"--from",
|
|
158
|
+
"wcgw@latest",
|
|
159
|
+
"--python",
|
|
160
|
+
"3.12",
|
|
161
|
+
"wcgw_mcp"
|
|
162
|
+
]
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
```
|
|
146
167
|
|
|
147
168
|
### Usage
|
|
148
169
|
|
|
@@ -174,6 +195,7 @@ There are three built-in modes. You may ask Claude to run in one of the modes, l
|
|
|
174
195
|
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
196
|
|
|
176
197
|
#### Attach to the working terminal to investigate
|
|
198
|
+
|
|
177
199
|
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
200
|
|
|
179
201
|
`screen -ls`
|
|
@@ -184,7 +206,7 @@ You can then attach to the session using `screen -x 93358.wcgw.235521`
|
|
|
184
206
|
|
|
185
207
|
You may interrupt any running command safely.
|
|
186
208
|
|
|
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.
|
|
209
|
+
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
210
|
|
|
189
211
|
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
212
|
|
|
@@ -204,12 +226,12 @@ Read here: https://github.com/rusiaaman/wcgw/blob/main/openai.md
|
|
|
204
226
|
|
|
205
227
|

|
|
206
228
|
|
|
207
|
-
|
|
208
229
|
## Using mcp server over docker
|
|
209
230
|
|
|
210
231
|
First build the docker image `docker build -t wcgw https://github.com/rusiaaman/wcgw.git`
|
|
211
232
|
|
|
212
233
|
Then you can update `/Users/username/Library/Application Support/Claude/claude_desktop_config.json` to have
|
|
234
|
+
|
|
213
235
|
```
|
|
214
236
|
{
|
|
215
237
|
"mcpServers": {
|
|
@@ -228,8 +250,6 @@ Then you can update `/Users/username/Library/Application Support/Claude/claude_d
|
|
|
228
250
|
}
|
|
229
251
|
```
|
|
230
252
|
|
|
231
|
-
|
|
232
|
-
|
|
233
253
|
## [Optional] Local shell access with openai API key or anthropic API key
|
|
234
254
|
|
|
235
255
|
### Openai
|
|
@@ -281,4 +301,3 @@ The server provides the following MCP tools:
|
|
|
281
301
|
- Parameters: `id` (string), `project_root_path` (string), `description` (string), `relevant_file_globs` (string[])
|
|
282
302
|
|
|
283
303
|
All tools support absolute paths and include built-in protections against common errors. See the [MCP specification](https://modelcontextprotocol.io/) for detailed protocol information.
|
|
284
|
-
|
|
@@ -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=gXm0u5EGQuPYEPZnyAptdzusN0JzLMED_DyErojPE6s,10679
|
|
9
|
+
wcgw/client/tool_prompts.py,sha256=zHJQHb_E44zA3rBIkAudibgP3Zbw0DjA-CKM8qlqmMU,4410
|
|
10
|
+
wcgw/client/tools.py,sha256=JXk6t7iNtP2EK6mdTkMqCquGGQ6TtoIJ8AEhkSith14,43963
|
|
11
|
+
wcgw/client/bash_state/bash_state.py,sha256=1i72oLJ73AHvj0XmK0kAKnksiZwxWdAg21K27loKmpo,34020
|
|
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=eNxFRmVsBfY0ISwfsV5s8rlMwMxTlm6ko150iFFCsT8,18525
|
|
14
|
+
wcgw/client/file_ops/search_replace.py,sha256=TaIPDqjgmTo4oghhO3zIFklq5JjAbx_aPHJ7yEgvDh4,6854
|
|
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
|
-
wcgw/client/mcp_server/server.py,sha256=
|
|
18
|
-
wcgw/client/repo_ops/display_tree.py,sha256=
|
|
17
|
+
wcgw/client/mcp_server/server.py,sha256=bHr9kv6hOs8s7LySNfpJeSX69GdFvFtbWpVyrp3G_eM,5160
|
|
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=e_w-1VfxWQiZT3r66N13nlmPt6AGm0uvG3A7aYSgaCI,9632
|
|
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.1.0.dist-info/METADATA,sha256=6v32rPTVYTPeEGY9F0miFZRknGe31eeN0bZKWskoSW8,14916
|
|
56
|
+
wcgw-4.1.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
57
|
+
wcgw-4.1.0.dist-info/entry_points.txt,sha256=vd3tj1_Kzfp55LscJ8-6WFMM5hm9cWTfNGFCrWBnH3Q,124
|
|
58
|
+
wcgw-4.1.0.dist-info/licenses/LICENSE,sha256=BvY8xqjOfc3X2qZpGpX3MZEmF-4Dp0LqgKBbT6L_8oI,11142
|
|
59
|
+
wcgw-4.1.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
|