wcgw 5.4.2__py3-none-any.whl → 5.4.4__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.

@@ -4,6 +4,7 @@ import os
4
4
  import platform
5
5
  import random
6
6
  import subprocess
7
+ import tempfile
7
8
  import threading
8
9
  import time
9
10
  import traceback
@@ -65,7 +66,7 @@ def is_mac() -> bool:
65
66
  def get_tmpdir() -> str:
66
67
  current_tmpdir = os.environ.get("TMPDIR", "")
67
68
  if current_tmpdir or not is_mac():
68
- return current_tmpdir
69
+ return tempfile.gettempdir()
69
70
  try:
70
71
  # Fix issue while running ocrmypdf -> tesseract -> leptonica, set TMPDIR
71
72
  # https://github.com/tesseract-ocr/tesseract/issues/4333
@@ -78,7 +79,7 @@ def get_tmpdir() -> str:
78
79
  except (subprocess.CalledProcessError, FileNotFoundError):
79
80
  return "//tmp"
80
81
  except Exception:
81
- return ""
82
+ return tempfile.gettempdir()
82
83
 
83
84
 
84
85
  def check_if_screen_command_available() -> bool:
wcgw/client/tools.py CHANGED
@@ -267,7 +267,7 @@ def initialize(
267
267
  initial_files, initial_paths_with_ranges, _ = read_files(
268
268
  read_files_, coding_max_tokens, noncoding_max_tokens, context
269
269
  )
270
- initial_files_context = f"---\n# Requested files\n{initial_files}\n---\n"
270
+ initial_files_context = f"---\n# Requested files\nHere are the contents of the requested files:\n{initial_files}\n---\n"
271
271
 
272
272
  # Check for global CLAUDE.md and workspace CLAUDE.md
273
273
  alignment_context = ""
@@ -279,29 +279,38 @@ def initialize(
279
279
  except Exception:
280
280
  pass
281
281
 
282
- # First check for global CLAUDE.md in ~/.wcgw/CLAUDE.md
283
- global_alignment_file_path = os.path.join(expanduser("~"), ".wcgw", "CLAUDE.md")
284
- if os.path.exists(global_alignment_file_path):
285
- try:
286
- with open(global_alignment_file_path, "r") as f:
287
- global_alignment_content = f.read()
288
- alignment_context += f"---\n# Important guidelines from the user\n```\n{global_alignment_content}\n```\n---\n\n"
289
- except Exception:
290
- # Handle any errors when reading the global file
291
- pass
282
+ # Check for global alignment doc in ~/.wcgw: prefer CLAUDE.md, else AGENTS.md
283
+ try:
284
+ global_dir = os.path.join(expanduser("~"), ".wcgw")
285
+ for fname in ("CLAUDE.md", "AGENTS.md"):
286
+ global_alignment_file_path = os.path.join(global_dir, fname)
287
+ if os.path.exists(global_alignment_file_path):
288
+ with open(global_alignment_file_path, "r") as f:
289
+ global_alignment_content = f.read()
290
+ alignment_context += f"---\n# Important guidelines from the user\n```\n{global_alignment_content}\n```\n---\n\n"
291
+ break
292
+ except Exception as e:
293
+ # Log any errors when reading the global file
294
+ context.console.log(f"Error reading global alignment file: {e}")
292
295
 
293
- # Then check for workspace-specific CLAUDE.md
296
+ # Then check for workspace-specific alignment doc: prefer CLAUDE.md, else AGENTS.md
294
297
  if folder_to_start:
295
- alignment_file_path = os.path.join(folder_to_start, "CLAUDE.md")
296
- if os.path.exists(alignment_file_path):
297
- try:
298
- # Read the CLAUDE.md file content
299
- with open(alignment_file_path, "r") as f:
300
- alignment_content = f.read()
301
- alignment_context += f"---\n# CLAUDE.md - user shared project guidelines to follow\n```\n{alignment_content}\n```\n---\n\n"
302
- except Exception:
303
- # Handle any errors when reading the file
304
- pass
298
+ try:
299
+ base_dir = str(folder_to_start)
300
+ selected_name = ""
301
+ alignment_content = ""
302
+ for fname in ("CLAUDE.md", "AGENTS.md"):
303
+ alignment_file_path = os.path.join(base_dir, fname)
304
+ if os.path.exists(alignment_file_path):
305
+ with open(alignment_file_path, "r") as f:
306
+ alignment_content = f.read()
307
+ selected_name = fname
308
+ break
309
+ if alignment_content:
310
+ alignment_context += f"---\n# {selected_name} - user shared project guidelines to follow\n```\n{alignment_content}\n```\n---\n\n"
311
+ except Exception as e:
312
+ # Log any errors when reading the workspace file
313
+ context.console.log(f"Error reading workspace alignment file: {e}")
305
314
 
306
315
  uname_sysname = os.uname().sysname
307
316
  uname_machine = os.uname().machine
@@ -591,7 +600,7 @@ def write_file(
591
600
  return (
592
601
  (
593
602
  msg
594
- + f"Here's the existing file:\n<wcgw:file>\n{file_content_str}\n{final_message}\n</wcgw:file>"
603
+ + f"Here's the existing file:\n<file-contents-numbered>\n{file_content_str}\n{final_message}\n</file-contents-numbered>"
595
604
  ),
596
605
  {path_: file_ranges},
597
606
  )
@@ -613,7 +622,7 @@ def write_file(
613
622
  return (
614
623
  (
615
624
  msg
616
- + f"Here's the existing file:\n<wcgw:file>\n{file_content_str}\n</wcgw:file>\n{final_message}"
625
+ + f"Here's the existing file:\n<file-contents-numbered>\n{file_content_str}\n</file-contents-numbered>\n{final_message}"
617
626
  ),
618
627
  {path_: file_ranges},
619
628
  )
@@ -1192,10 +1201,12 @@ def read_files(
1192
1201
  noncoding_max_tokens = max(0, noncoding_max_tokens - tokens)
1193
1202
 
1194
1203
  range_formatted = range_format(start_line_num, end_line_num)
1195
- message += f'\n<wcgw:file path="{file}{range_formatted}">\n{content}\n'
1204
+ message += (
1205
+ f'\n<file-contents-numbered path="{file}{range_formatted}">\n{content}\n'
1206
+ )
1196
1207
 
1197
1208
  if not truncated:
1198
- message += "</wcgw:file>"
1209
+ message += "</file-contents-numbered>"
1199
1210
 
1200
1211
  # Check if we've hit both token limit
1201
1212
  if (
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wcgw
3
- Version: 5.4.2
3
+ Version: 5.4.4
4
4
  Summary: Shell and coding agent for Claude and other mcp clients
5
5
  Project-URL: Homepage, https://github.com/rusiaaman/wcgw
6
6
  Author-email: Aman Rusia <gapypi@arcfu.com>
@@ -86,7 +86,7 @@ wcgw is an MCP server with tightly integrated shell and code editing tools.
86
86
  - By default it runs in 'wcgw' mode that has no restrictions and full authorisation.
87
87
  - More details in [Modes section](#modes)
88
88
  - ⚡ **Runs in multiplex terminal** Run `screen -x` to attach to the terminal that the AI runs commands on. See history or interrupt process or interact with the same terminal that AI uses.
89
- - ⚡ **Automatically load CLAUDE.md** Loads "CLAUDE.md" file in project root and sends as instructions during initialisation. Instructions in a global "~/.wcgw/CLAUDE.md" file are loaded and added along with project specific CLAUDE.md. The file name is case sensitive.
89
+ - ⚡ **Automatically load CLAUDE.md/AGENTS.md** Loads "CLAUDE.md" or "AGENTS.md" file in project root and sends as instructions during initialisation. Instructions in a global "~/.wcgw/CLAUDE.md" or "~/.wcgw/AGENTS.md" file are loaded and added along with project specific CLAUDE.md. The file name is case sensitive. CLAUDE.md is attached if it's present otherwise AGENTS.md is attached.
90
90
 
91
91
  ## Top use cases examples
92
92
 
@@ -118,7 +118,7 @@ Then create or update `claude_desktop_config.json` (~/Library/Application Suppor
118
118
  "mcpServers": {
119
119
  "wcgw": {
120
120
  "command": "uv",
121
- "args": ["tool", "run", "--python", "3.12", "wcgw@latest"]
121
+ "args": ["tool", "run", "--python", "3.12", "wcgw"]
122
122
  }
123
123
  }
124
124
  }
@@ -129,10 +129,10 @@ Then restart claude app.
129
129
  _If there's an error in setting up_
130
130
 
131
131
  - If there's an error like "uv ENOENT", make sure `uv` is installed. Then run 'which uv' in the terminal, and use its output in place of "uv" in the configuration.
132
- - If there's still an issue, check that `uv tool run --python 3.12 wcgw@latest` runs in your terminal. It should have no output and shouldn't exit.
132
+ - If there's still an issue, check that `uv tool run --python 3.12 wcgw` runs in your terminal. It should have no output and shouldn't exit.
133
133
  - Try removing ~/.cache/uv folder
134
134
  - Try using `uv` version `0.6.0` for which this tool was tested.
135
- - Debug the mcp server using `npx @modelcontextprotocol/inspector@0.1.7 uv tool run --python 3.12 wcgw@latest`
135
+ - Debug the mcp server using `npx @modelcontextprotocol/inspector@0.1.7 uv tool run --python 3.12 wcgw`
136
136
 
137
137
  ### Windows on wsl
138
138
 
@@ -147,12 +147,12 @@ Then add or update the claude config file `%APPDATA%\Claude\claude_desktop_confi
147
147
  "mcpServers": {
148
148
  "wcgw": {
149
149
  "command": "wsl.exe",
150
- "args": ["uv", "tool", "run", "--python", "3.12", "wcgw@latest"]
150
+ "args": ["uv", "tool", "run", "--python", "3.12", "wcgw"]
151
151
  }
152
152
  }
153
153
  }
154
154
  ```
155
- When you encounter an error, execute the command wsl uv --python 3.12 wcgw@latest in command prompt. If you get the `error /bin/bash: line 1: uv: command not found`, it means uv was not installed globally and you need to point to the correct path of uv.
155
+ When you encounter an error, execute the command wsl uv --python 3.12 wcgw in command prompt. If you get the `error /bin/bash: line 1: uv: command not found`, it means uv was not installed globally and you need to point to the correct path of uv.
156
156
  1. Find where uv is installed:
157
157
  ```bash
158
158
  whereis uv
@@ -162,7 +162,7 @@ Example output:
162
162
 
163
163
  2. Test the full path works:
164
164
  ```
165
- wsl /home/mywsl/.local/bin/uv tool run --python 3.12 wcgw@latest
165
+ wsl /home/mywsl/.local/bin/uv tool run --python 3.12 wcgw
166
166
  ```
167
167
 
168
168
  3. Update the config with the full path:
@@ -171,7 +171,7 @@ wsl /home/mywsl/.local/bin/uv tool run --python 3.12 wcgw@latest
171
171
  "mcpServers": {
172
172
  "wcgw": {
173
173
  "command": "wsl.exe",
174
- "args": ["/home/mywsl/.local/bin/uv", "tool", "run", "--python", "3.12", "wcgw@latest"]
174
+ "args": ["/home/mywsl/.local/bin/uv", "tool", "run", "--python", "3.12", "wcgw"]
175
175
  }
176
176
  }
177
177
  }
@@ -223,6 +223,12 @@ You can interact with the terminal but beware that the AI might be running in pa
223
223
 
224
224
  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.
225
225
 
226
+ Include the following in ~/.screenrc for better scrolling experience
227
+ ```
228
+ defscrollback 10000
229
+ termcapinfo xterm* ti@:te@
230
+ ```
231
+
226
232
  ### [Optional] Vs code extension
227
233
 
228
234
  https://marketplace.visualstudio.com/items?itemName=AmanRusia.wcgw
@@ -267,7 +273,7 @@ Add `OPENAI_API_KEY` and `OPENAI_ORG_ID` env variables.
267
273
 
268
274
  Then run
269
275
 
270
- `uvx wcgw@latest wcgw_local --limit 0.1` # Cost limit $0.1
276
+ `uvx wcgw wcgw_local --limit 0.1` # Cost limit $0.1
271
277
 
272
278
  You can now directly write messages or press enter key to open vim for multiline message and text pasting.
273
279
 
@@ -277,7 +283,7 @@ Add `ANTHROPIC_API_KEY` env variable.
277
283
 
278
284
  Then run
279
285
 
280
- `uvx wcgw@latest wcgw_local --claude`
286
+ `uvx wcgw wcgw_local --claude`
281
287
 
282
288
  You can now directly write messages or press enter key to open vim for multiline message and text pasting.
283
289
 
@@ -8,8 +8,8 @@ wcgw/client/memory.py,sha256=U2Nw2si3Zg7n_RhNAuaYcmrrDtZ_Mooi-kfAOKflT-I,3079
8
8
  wcgw/client/modes.py,sha256=roH6SPBokJMr5IzAlccdI-vJyvyS5vqSMMyth7TE86A,10315
9
9
  wcgw/client/schema_generator.py,sha256=mEIy6BgHlfJeAjJtwY_VwoIDmu-Fax2H9bVtj7IMuEo,2282
10
10
  wcgw/client/tool_prompts.py,sha256=1EFQZeXlebOvrDb9t4g63FyzRWCnTwDzwrqwPHg-7sE,4757
11
- wcgw/client/tools.py,sha256=78H5JeRpagoUJpwfe7-eoUxafdbGIU0S94XB4AqhBLI,49341
12
- wcgw/client/bash_state/bash_state.py,sha256=U-h9uqEcJbZGIVle6vZKYmlLHNO91zvqaUe6zlvLMl4,41876
11
+ wcgw/client/tools.py,sha256=mW0voWa3PQ1vGmhMKpoVm4z3FOP033v0tr2RLm56G9E,50026
12
+ wcgw/client/bash_state/bash_state.py,sha256=bd5RtLbaRzCtrmeDTl3JKZwzmIR-8iAMQpl7Fqyt56M,41918
13
13
  wcgw/client/bash_state/parser/__init__.py,sha256=AnlNSmoQTSoqqlLOLX4P1uXfzc5VGeCGJsGgtisq2zE,207
14
14
  wcgw/client/bash_state/parser/bash_statement_parser.py,sha256=9a8vPO1r3_tXmaAcubTQ5UY-NseWlalgm8LZA17LXuY,6058
15
15
  wcgw/client/encoder/__init__.py,sha256=Y-8f43I6gMssUCWpX5rLYiAFv3D-JPRs4uNEejPlke8,1514
@@ -31,8 +31,8 @@ wcgw_cli/anthropic_client.py,sha256=8bjDY59-aioyTJgpB-NBHZNhZaq6rqcTJcOf81kzCyA,
31
31
  wcgw_cli/cli.py,sha256=-7FBe_lahKyUOhf65iurTA1M1gXXXAiT0OVKQVcZKKo,948
32
32
  wcgw_cli/openai_client.py,sha256=GOqoSFazTV-cFjpdZGPM0DIwec8Up2TEcKUbsN40AGY,15990
33
33
  wcgw_cli/openai_utils.py,sha256=xGOb3W5ALrIozV7oszfGYztpj0FnXdD7jAxm5lEIVKY,2439
34
- wcgw-5.4.2.dist-info/METADATA,sha256=yBhrBPY5ybnrPY88zUaFBhs2byAYsjW7S80JSsHOc1k,15679
35
- wcgw-5.4.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
36
- wcgw-5.4.2.dist-info/entry_points.txt,sha256=UnjK-MAH4Qssh0tGJDMeij1oi-oRKokItkknP_BwShE,94
37
- wcgw-5.4.2.dist-info/licenses/LICENSE,sha256=BvY8xqjOfc3X2qZpGpX3MZEmF-4Dp0LqgKBbT6L_8oI,11142
38
- wcgw-5.4.2.dist-info/RECORD,,
34
+ wcgw-5.4.4.dist-info/METADATA,sha256=wjN1GqRkY_xC0g9E7y_sqDKX4MSQRPB0tpxy5Lf-_Dg,15859
35
+ wcgw-5.4.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
36
+ wcgw-5.4.4.dist-info/entry_points.txt,sha256=UnjK-MAH4Qssh0tGJDMeij1oi-oRKokItkknP_BwShE,94
37
+ wcgw-5.4.4.dist-info/licenses/LICENSE,sha256=BvY8xqjOfc3X2qZpGpX3MZEmF-4Dp0LqgKBbT6L_8oI,11142
38
+ wcgw-5.4.4.dist-info/RECORD,,
File without changes