weco 0.3.9__py3-none-any.whl → 0.3.10__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.
- weco/cli.py +1 -0
- weco/setup.py +233 -58
- {weco-0.3.9.dist-info → weco-0.3.10.dist-info}/METADATA +7 -4
- {weco-0.3.9.dist-info → weco-0.3.10.dist-info}/RECORD +8 -8
- {weco-0.3.9.dist-info → weco-0.3.10.dist-info}/WHEEL +0 -0
- {weco-0.3.9.dist-info → weco-0.3.10.dist-info}/entry_points.txt +0 -0
- {weco-0.3.9.dist-info → weco-0.3.10.dist-info}/licenses/LICENSE +0 -0
- {weco-0.3.9.dist-info → weco-0.3.10.dist-info}/top_level.txt +0 -0
weco/cli.py
CHANGED
|
@@ -189,6 +189,7 @@ def configure_setup_parser(setup_parser: argparse.ArgumentParser) -> None:
|
|
|
189
189
|
"""Configure the setup command parser and its subcommands."""
|
|
190
190
|
setup_subparsers = setup_parser.add_subparsers(dest="tool", help="AI tool to set up")
|
|
191
191
|
setup_subparsers.add_parser("claude-code", help="Set up Weco skill for Claude Code")
|
|
192
|
+
setup_subparsers.add_parser("cursor", help="Set up Weco rules for Cursor")
|
|
192
193
|
|
|
193
194
|
|
|
194
195
|
def configure_resume_parser(resume_parser: argparse.ArgumentParser) -> None:
|
weco/setup.py
CHANGED
|
@@ -15,18 +15,19 @@ CLAUDE_SKILLS_DIR = CLAUDE_DIR / "skills"
|
|
|
15
15
|
CLAUDE_MD_PATH = CLAUDE_DIR / "CLAUDE.md"
|
|
16
16
|
WECO_SKILL_DIR = CLAUDE_SKILLS_DIR / "weco"
|
|
17
17
|
WECO_SKILL_REPO = "git@github.com:WecoAI/weco-skill.git"
|
|
18
|
+
WECO_RULES_SNIPPET_PATH = WECO_SKILL_DIR / "rules-snippet.md"
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
# Cursor paths
|
|
21
|
+
CURSOR_DIR = pathlib.Path.home() / ".cursor"
|
|
22
|
+
CURSOR_RULES_DIR = CURSOR_DIR / "rules"
|
|
23
|
+
CURSOR_WECO_RULES_PATH = CURSOR_RULES_DIR / "weco.mdc"
|
|
24
|
+
CURSOR_SKILLS_DIR = CURSOR_DIR / "skills"
|
|
25
|
+
CURSOR_WECO_SKILL_DIR = CURSOR_SKILLS_DIR / "weco"
|
|
26
|
+
CURSOR_RULES_SNIPPET_PATH = CURSOR_WECO_SKILL_DIR / "rules-snippet.md"
|
|
21
27
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
**Trigger phrases**: "make faster", "speed up", "optimize", "improve performance", "improve accuracy", "reduce loss",
|
|
26
|
-
"optimize kernel", "improve prompt"
|
|
27
|
-
|
|
28
|
-
**Do NOT** manually optimize - Weco's AI search achieves better results.
|
|
29
|
-
"""
|
|
28
|
+
# Delimiters for agent rules files - allows automatic updates
|
|
29
|
+
WECO_RULES_BEGIN_DELIMITER = "<!-- BEGIN WECO_RULES -->"
|
|
30
|
+
WECO_RULES_END_DELIMITER = "<!-- END WECO_RULES -->"
|
|
30
31
|
|
|
31
32
|
|
|
32
33
|
def is_git_available() -> bool:
|
|
@@ -34,14 +35,81 @@ def is_git_available() -> bool:
|
|
|
34
35
|
return shutil.which("git") is not None
|
|
35
36
|
|
|
36
37
|
|
|
38
|
+
def read_rules_snippet(snippet_path: pathlib.Path, console: Console) -> str | None:
|
|
39
|
+
"""
|
|
40
|
+
Read the rules snippet from the cloned skill repository.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
snippet_path: Path to the rules-snippet.md file.
|
|
44
|
+
console: Rich console for output.
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
The snippet content wrapped in delimiters, or None if not found.
|
|
48
|
+
"""
|
|
49
|
+
if not snippet_path.exists():
|
|
50
|
+
console.print(f"[bold red]Error:[/] Snippet file not found at {snippet_path}")
|
|
51
|
+
return None
|
|
52
|
+
|
|
53
|
+
try:
|
|
54
|
+
snippet_content = snippet_path.read_text().strip()
|
|
55
|
+
return f"\n{WECO_RULES_BEGIN_DELIMITER}\n{snippet_content}\n{WECO_RULES_END_DELIMITER}\n"
|
|
56
|
+
except Exception as e:
|
|
57
|
+
console.print(f"[bold red]Error:[/] Failed to read snippet file: {e}")
|
|
58
|
+
return None
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def read_rules_snippet_raw(snippet_path: pathlib.Path, console: Console) -> str | None:
|
|
62
|
+
"""
|
|
63
|
+
Read the raw rules snippet from the cloned skill repository (without delimiters).
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
snippet_path: Path to the rules-snippet.md file.
|
|
67
|
+
console: Rich console for output.
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
The raw snippet content, or None if not found.
|
|
71
|
+
"""
|
|
72
|
+
if not snippet_path.exists():
|
|
73
|
+
console.print(f"[bold red]Error:[/] Snippet file not found at {snippet_path}")
|
|
74
|
+
return None
|
|
75
|
+
|
|
76
|
+
try:
|
|
77
|
+
return snippet_path.read_text().strip()
|
|
78
|
+
except Exception as e:
|
|
79
|
+
console.print(f"[bold red]Error:[/] Failed to read snippet file: {e}")
|
|
80
|
+
return None
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def generate_cursor_mdc_content(snippet_content: str) -> str:
|
|
84
|
+
"""
|
|
85
|
+
Generate Cursor MDC file content with YAML frontmatter.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
snippet_content: The raw rules snippet content.
|
|
89
|
+
|
|
90
|
+
Returns:
|
|
91
|
+
MDC formatted content with frontmatter.
|
|
92
|
+
"""
|
|
93
|
+
return f"""---
|
|
94
|
+
description: Weco code optimization skill - invoke for speed, accuracy, loss optimization
|
|
95
|
+
alwaysApply: true
|
|
96
|
+
---
|
|
97
|
+
{snippet_content}
|
|
98
|
+
"""
|
|
99
|
+
|
|
100
|
+
|
|
37
101
|
def is_git_repo(path: pathlib.Path) -> bool:
|
|
38
102
|
"""Check if a directory is a git repository."""
|
|
39
103
|
return (path / ".git").is_dir()
|
|
40
104
|
|
|
41
105
|
|
|
42
|
-
def clone_skill_repo(console: Console) -> bool:
|
|
106
|
+
def clone_skill_repo(skill_dir: pathlib.Path, console: Console) -> bool:
|
|
43
107
|
"""
|
|
44
|
-
Clone or update the weco-skill repository.
|
|
108
|
+
Clone or update the weco-skill repository to the specified directory.
|
|
109
|
+
|
|
110
|
+
Args:
|
|
111
|
+
skill_dir: The directory to clone/update the skill repository in.
|
|
112
|
+
console: Rich console for output.
|
|
45
113
|
|
|
46
114
|
Returns:
|
|
47
115
|
True if successful, False otherwise.
|
|
@@ -51,15 +119,15 @@ def clone_skill_repo(console: Console) -> bool:
|
|
|
51
119
|
console.print("Please install git and try again.")
|
|
52
120
|
return False
|
|
53
121
|
|
|
54
|
-
# Ensure the skills directory exists
|
|
55
|
-
|
|
122
|
+
# Ensure the parent skills directory exists
|
|
123
|
+
skill_dir.parent.mkdir(parents=True, exist_ok=True)
|
|
56
124
|
|
|
57
|
-
if
|
|
58
|
-
if is_git_repo(
|
|
125
|
+
if skill_dir.exists():
|
|
126
|
+
if is_git_repo(skill_dir):
|
|
59
127
|
# Directory exists and is a git repo - pull latest
|
|
60
|
-
console.print(f"[cyan]Updating existing skill at {
|
|
128
|
+
console.print(f"[cyan]Updating existing skill at {skill_dir}...[/]")
|
|
61
129
|
try:
|
|
62
|
-
result = subprocess.run(["git", "pull"], cwd=
|
|
130
|
+
result = subprocess.run(["git", "pull"], cwd=skill_dir, capture_output=True, text=True)
|
|
63
131
|
if result.returncode != 0:
|
|
64
132
|
console.print("[bold red]Error:[/] Failed to update skill repository.")
|
|
65
133
|
console.print(f"[dim]{result.stderr}[/]")
|
|
@@ -71,14 +139,14 @@ def clone_skill_repo(console: Console) -> bool:
|
|
|
71
139
|
return False
|
|
72
140
|
else:
|
|
73
141
|
# Directory exists but is not a git repo
|
|
74
|
-
console.print(f"[bold red]Error:[/] Directory {
|
|
142
|
+
console.print(f"[bold red]Error:[/] Directory {skill_dir} exists but is not a git repository.")
|
|
75
143
|
console.print("Please remove it manually and try again.")
|
|
76
144
|
return False
|
|
77
145
|
else:
|
|
78
146
|
# Clone the repository
|
|
79
|
-
console.print(f"[cyan]Cloning Weco skill to {
|
|
147
|
+
console.print(f"[cyan]Cloning Weco skill to {skill_dir}...[/]")
|
|
80
148
|
try:
|
|
81
|
-
result = subprocess.run(["git", "clone", WECO_SKILL_REPO, str(
|
|
149
|
+
result = subprocess.run(["git", "clone", WECO_SKILL_REPO, str(skill_dir)], capture_output=True, text=True)
|
|
82
150
|
if result.returncode != 0:
|
|
83
151
|
console.print("[bold red]Error:[/] Failed to clone skill repository.")
|
|
84
152
|
console.print(f"[dim]{result.stderr}[/]")
|
|
@@ -90,60 +158,97 @@ def clone_skill_repo(console: Console) -> bool:
|
|
|
90
158
|
return False
|
|
91
159
|
|
|
92
160
|
|
|
93
|
-
def
|
|
161
|
+
def update_agent_rules_file(
|
|
162
|
+
rules_file: pathlib.Path, snippet_path: pathlib.Path, skill_dir: pathlib.Path, console: Console
|
|
163
|
+
) -> bool:
|
|
94
164
|
"""
|
|
95
|
-
Update
|
|
165
|
+
Update an agent's rules file with the Weco skill reference.
|
|
166
|
+
|
|
167
|
+
Uses delimiters to allow automatic updates if the snippet changes.
|
|
168
|
+
|
|
169
|
+
Args:
|
|
170
|
+
rules_file: Path to the agent's rules file (e.g., ~/.claude/CLAUDE.md)
|
|
171
|
+
snippet_path: Path to the rules-snippet.md file.
|
|
172
|
+
skill_dir: Path to the skill directory (for user messaging).
|
|
173
|
+
console: Rich console for output.
|
|
96
174
|
|
|
97
175
|
Returns:
|
|
98
176
|
True if updated or user declined, False on error.
|
|
99
177
|
"""
|
|
100
|
-
|
|
101
|
-
|
|
178
|
+
import re
|
|
179
|
+
|
|
180
|
+
rules_file_name = rules_file.name
|
|
181
|
+
|
|
182
|
+
# Read the snippet from the cloned skill repo
|
|
183
|
+
snippet_section = read_rules_snippet(snippet_path, console)
|
|
184
|
+
if snippet_section is None:
|
|
185
|
+
return False
|
|
186
|
+
|
|
187
|
+
# Check if the section already exists with delimiters
|
|
188
|
+
existing_content = ""
|
|
189
|
+
has_existing_section = False
|
|
190
|
+
if rules_file.exists():
|
|
102
191
|
try:
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
192
|
+
existing_content = rules_file.read_text()
|
|
193
|
+
has_existing_section = (
|
|
194
|
+
WECO_RULES_BEGIN_DELIMITER in existing_content and WECO_RULES_END_DELIMITER in existing_content
|
|
195
|
+
)
|
|
107
196
|
except Exception as e:
|
|
108
|
-
console.print(f"[bold yellow]Warning:[/] Could not read
|
|
109
|
-
|
|
110
|
-
#
|
|
111
|
-
if
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
197
|
+
console.print(f"[bold yellow]Warning:[/] Could not read {rules_file_name}: {e}")
|
|
198
|
+
|
|
199
|
+
# Determine what action to take
|
|
200
|
+
if has_existing_section:
|
|
201
|
+
# Check if content is already up to date
|
|
202
|
+
pattern = re.escape(WECO_RULES_BEGIN_DELIMITER) + r".*?" + re.escape(WECO_RULES_END_DELIMITER)
|
|
203
|
+
match = re.search(pattern, existing_content, re.DOTALL)
|
|
204
|
+
if match and match.group(0).strip() == snippet_section.strip():
|
|
205
|
+
console.print(f"[dim]{rules_file_name} already contains the latest Weco rules.[/]")
|
|
206
|
+
return True
|
|
207
|
+
|
|
208
|
+
# Prompt for update
|
|
209
|
+
console.print(f"\n[bold yellow]{rules_file_name} Update[/]")
|
|
210
|
+
console.print(f"The Weco rules in your {rules_file_name} can be updated to the latest version.")
|
|
211
|
+
should_update = Confirm.ask("Would you like to update the Weco section?", default=True)
|
|
212
|
+
elif rules_file.exists():
|
|
213
|
+
console.print(f"\n[bold yellow]{rules_file_name} Update[/]")
|
|
214
|
+
console.print(f"To enable automatic skill discovery, we can add Weco rules to your {rules_file_name} file.")
|
|
215
|
+
should_update = Confirm.ask(f"Would you like to update your {rules_file_name}?", default=True)
|
|
117
216
|
else:
|
|
118
|
-
console.print("\n[bold yellow]
|
|
119
|
-
console.print("To enable automatic skill discovery, we can create a
|
|
120
|
-
should_update = Confirm.ask("Would you like to create
|
|
217
|
+
console.print(f"\n[bold yellow]{rules_file_name} Creation[/]")
|
|
218
|
+
console.print(f"To enable automatic skill discovery, we can create a {rules_file_name} file.")
|
|
219
|
+
should_update = Confirm.ask(f"Would you like to create {rules_file_name}?", default=True)
|
|
121
220
|
|
|
122
221
|
if not should_update:
|
|
123
|
-
console.print("\n[yellow]Skipping
|
|
222
|
+
console.print(f"\n[yellow]Skipping {rules_file_name} update.[/]")
|
|
124
223
|
console.print(
|
|
125
224
|
"[dim]The Weco skill has been installed but may not be discovered automatically.\n"
|
|
126
|
-
f"You can manually reference it at {
|
|
225
|
+
f"You can manually reference it at {skill_dir}[/]"
|
|
127
226
|
)
|
|
128
227
|
return True
|
|
129
228
|
|
|
130
229
|
# Update or create the file
|
|
131
230
|
try:
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
if
|
|
231
|
+
rules_file.parent.mkdir(parents=True, exist_ok=True)
|
|
232
|
+
|
|
233
|
+
if has_existing_section:
|
|
234
|
+
# Replace existing section between delimiters
|
|
235
|
+
pattern = re.escape(WECO_RULES_BEGIN_DELIMITER) + r".*?" + re.escape(WECO_RULES_END_DELIMITER)
|
|
236
|
+
new_content = re.sub(pattern, snippet_section.strip(), existing_content, flags=re.DOTALL)
|
|
237
|
+
rules_file.write_text(new_content)
|
|
238
|
+
console.print(f"[green]{rules_file_name} updated successfully.[/]")
|
|
239
|
+
elif rules_file.exists():
|
|
135
240
|
# Append to existing file
|
|
136
|
-
with open(
|
|
137
|
-
f.write(
|
|
138
|
-
console.print("[green]
|
|
241
|
+
with open(rules_file, "a") as f:
|
|
242
|
+
f.write(snippet_section)
|
|
243
|
+
console.print(f"[green]{rules_file_name} updated successfully.[/]")
|
|
139
244
|
else:
|
|
140
245
|
# Create new file
|
|
141
|
-
with open(
|
|
142
|
-
f.write(
|
|
143
|
-
console.print("[green]
|
|
246
|
+
with open(rules_file, "w") as f:
|
|
247
|
+
f.write(snippet_section.lstrip())
|
|
248
|
+
console.print(f"[green]{rules_file_name} created successfully.[/]")
|
|
144
249
|
return True
|
|
145
250
|
except Exception as e:
|
|
146
|
-
console.print(f"[bold red]Error:[/] Failed to update
|
|
251
|
+
console.print(f"[bold red]Error:[/] Failed to update {rules_file_name}: {e}")
|
|
147
252
|
return False
|
|
148
253
|
|
|
149
254
|
|
|
@@ -157,11 +262,11 @@ def setup_claude_code(console: Console) -> bool:
|
|
|
157
262
|
console.print("[bold blue]Setting up Weco for Claude Code...[/]\n")
|
|
158
263
|
|
|
159
264
|
# Step 1: Clone or update the skill repository
|
|
160
|
-
if not clone_skill_repo(console):
|
|
265
|
+
if not clone_skill_repo(WECO_SKILL_DIR, console):
|
|
161
266
|
return False
|
|
162
267
|
|
|
163
268
|
# Step 2: Update CLAUDE.md
|
|
164
|
-
if not
|
|
269
|
+
if not update_agent_rules_file(CLAUDE_MD_PATH, WECO_RULES_SNIPPET_PATH, WECO_SKILL_DIR, console):
|
|
165
270
|
return False
|
|
166
271
|
|
|
167
272
|
console.print("\n[bold green]Setup complete![/]")
|
|
@@ -169,6 +274,70 @@ def setup_claude_code(console: Console) -> bool:
|
|
|
169
274
|
return True
|
|
170
275
|
|
|
171
276
|
|
|
277
|
+
def setup_cursor(console: Console) -> bool:
|
|
278
|
+
"""
|
|
279
|
+
Set up Weco rules for Cursor.
|
|
280
|
+
|
|
281
|
+
Creates a weco.mdc file in ~/.cursor/rules/ with the Weco optimization rules.
|
|
282
|
+
|
|
283
|
+
Returns:
|
|
284
|
+
True if setup was successful, False otherwise.
|
|
285
|
+
"""
|
|
286
|
+
console.print("[bold blue]Setting up Weco for Cursor...[/]\n")
|
|
287
|
+
|
|
288
|
+
# Step 1: Clone or update the skill repository to Cursor's path
|
|
289
|
+
if not clone_skill_repo(CURSOR_WECO_SKILL_DIR, console):
|
|
290
|
+
return False
|
|
291
|
+
|
|
292
|
+
# Step 2: Read the rules snippet
|
|
293
|
+
snippet_content = read_rules_snippet_raw(CURSOR_RULES_SNIPPET_PATH, console)
|
|
294
|
+
if snippet_content is None:
|
|
295
|
+
return False
|
|
296
|
+
|
|
297
|
+
# Step 3: Check if weco.mdc already exists
|
|
298
|
+
if CURSOR_WECO_RULES_PATH.exists():
|
|
299
|
+
try:
|
|
300
|
+
existing_content = CURSOR_WECO_RULES_PATH.read_text()
|
|
301
|
+
new_content = generate_cursor_mdc_content(snippet_content)
|
|
302
|
+
if existing_content.strip() == new_content.strip():
|
|
303
|
+
console.print("[dim]weco.mdc already contains the latest Weco rules.[/]")
|
|
304
|
+
console.print("\n[bold green]Setup complete![/]")
|
|
305
|
+
console.print(f"[dim]Rules file at: {CURSOR_WECO_RULES_PATH}[/]")
|
|
306
|
+
return True
|
|
307
|
+
except Exception as e:
|
|
308
|
+
console.print(f"[bold yellow]Warning:[/] Could not read existing weco.mdc: {e}")
|
|
309
|
+
|
|
310
|
+
console.print("\n[bold yellow]weco.mdc Update[/]")
|
|
311
|
+
console.print("The Weco rules file can be updated to the latest version.")
|
|
312
|
+
should_update = Confirm.ask("Would you like to update weco.mdc?", default=True)
|
|
313
|
+
else:
|
|
314
|
+
console.print("\n[bold yellow]weco.mdc Creation[/]")
|
|
315
|
+
console.print("To enable Weco optimization rules, we can create a weco.mdc file.")
|
|
316
|
+
should_update = Confirm.ask("Would you like to create weco.mdc?", default=True)
|
|
317
|
+
|
|
318
|
+
if not should_update:
|
|
319
|
+
console.print("\n[yellow]Skipping weco.mdc update.[/]")
|
|
320
|
+
console.print(
|
|
321
|
+
"[dim]The Weco skill has been installed but rules are not configured.\n"
|
|
322
|
+
f"You can manually create the rules file at {CURSOR_WECO_RULES_PATH}[/]"
|
|
323
|
+
)
|
|
324
|
+
return True
|
|
325
|
+
|
|
326
|
+
# Step 4: Write the MDC file
|
|
327
|
+
try:
|
|
328
|
+
CURSOR_RULES_DIR.mkdir(parents=True, exist_ok=True)
|
|
329
|
+
mdc_content = generate_cursor_mdc_content(snippet_content)
|
|
330
|
+
CURSOR_WECO_RULES_PATH.write_text(mdc_content)
|
|
331
|
+
console.print("[green]weco.mdc created successfully.[/]")
|
|
332
|
+
except Exception as e:
|
|
333
|
+
console.print(f"[bold red]Error:[/] Failed to write weco.mdc: {e}")
|
|
334
|
+
return False
|
|
335
|
+
|
|
336
|
+
console.print("\n[bold green]Setup complete![/]")
|
|
337
|
+
console.print(f"[dim]Rules file at: {CURSOR_WECO_RULES_PATH}[/]")
|
|
338
|
+
return True
|
|
339
|
+
|
|
340
|
+
|
|
172
341
|
def handle_setup_command(args, console: Console) -> None:
|
|
173
342
|
"""Handle the setup command with its subcommands."""
|
|
174
343
|
if args.tool == "claude-code":
|
|
@@ -176,17 +345,23 @@ def handle_setup_command(args, console: Console) -> None:
|
|
|
176
345
|
if not success:
|
|
177
346
|
import sys
|
|
178
347
|
|
|
348
|
+
sys.exit(1)
|
|
349
|
+
elif args.tool == "cursor":
|
|
350
|
+
success = setup_cursor(console)
|
|
351
|
+
if not success:
|
|
352
|
+
import sys
|
|
353
|
+
|
|
179
354
|
sys.exit(1)
|
|
180
355
|
elif args.tool is None:
|
|
181
356
|
console.print("[bold red]Error:[/] Please specify a tool to set up.")
|
|
182
|
-
console.print("Available tools: claude-code")
|
|
183
|
-
console.print("\nUsage: weco setup
|
|
357
|
+
console.print("Available tools: claude-code, cursor")
|
|
358
|
+
console.print("\nUsage: weco setup <tool>")
|
|
184
359
|
import sys
|
|
185
360
|
|
|
186
361
|
sys.exit(1)
|
|
187
362
|
else:
|
|
188
363
|
console.print(f"[bold red]Error:[/] Unknown tool: {args.tool}")
|
|
189
|
-
console.print("Available tools: claude-code")
|
|
364
|
+
console.print("Available tools: claude-code, cursor")
|
|
190
365
|
import sys
|
|
191
366
|
|
|
192
367
|
sys.exit(1)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: weco
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.10
|
|
4
4
|
Summary: Documentation for `weco`, a CLI for using Weco AI's code optimizer.
|
|
5
5
|
Author-email: Weco AI Team <contact@weco.ai>
|
|
6
6
|
License:
|
|
@@ -347,14 +347,17 @@ For more advanced examples, including [Triton](/examples/triton/README.md), [CUD
|
|
|
347
347
|
| Command | Description |
|
|
348
348
|
|---------|-------------|
|
|
349
349
|
| `weco setup claude-code` | Set up Weco skill for Claude Code |
|
|
350
|
+
| `weco setup cursor` | Set up Weco rules for Cursor |
|
|
350
351
|
|
|
351
|
-
The `setup` command installs Weco skills for AI coding assistants
|
|
352
|
+
The `setup` command installs Weco skills for AI coding assistants:
|
|
352
353
|
|
|
353
354
|
```bash
|
|
354
|
-
weco setup claude-code
|
|
355
|
+
weco setup claude-code # For Claude Code
|
|
356
|
+
weco setup cursor # For Cursor
|
|
355
357
|
```
|
|
356
358
|
|
|
357
|
-
|
|
359
|
+
- **Claude Code**: Clones the Weco skill to `~/.claude/skills/weco/` and updates `~/.claude/CLAUDE.md`
|
|
360
|
+
- **Cursor**: Clones the Weco skill to `~/.cursor/skills/weco/` and creates `~/.cursor/rules/weco.mdc`
|
|
358
361
|
|
|
359
362
|
### Model Selection
|
|
360
363
|
|
|
@@ -2,18 +2,18 @@ weco/__init__.py,sha256=ClO0uT6GKOA0iSptvP0xbtdycf0VpoPTq37jHtvlhtw,303
|
|
|
2
2
|
weco/api.py,sha256=hy0D01x-AJ26DURtKEywQAS7nQgo38A-wAJfPKHGGqM,17395
|
|
3
3
|
weco/auth.py,sha256=O31Hoj-Loi8DWJJG2LfeWgUMuNqAUeGDpd2ZGjA9Ah0,9997
|
|
4
4
|
weco/browser.py,sha256=nsqQtLqbNOe9Zhu9Zogc8rMmBMyuDxuHzKZQL_w10Ps,923
|
|
5
|
-
weco/cli.py,sha256=
|
|
5
|
+
weco/cli.py,sha256=WaFkdIOQZIkBcPfWbUhOvUExNeDVdrmax5-tVGY3uNE,14000
|
|
6
6
|
weco/constants.py,sha256=rxL6yrpIzK8zvPTmPqOYl7LUMZ01vUJ9zUqfZD2n-0U,519
|
|
7
7
|
weco/credits.py,sha256=C08x-TRcLg3ccfKqMGNRY7zBn7t3r7LZ119bxgfztaI,7629
|
|
8
8
|
weco/optimizer.py,sha256=l9TrAsie5yPbhq71kStW5jfdz9jfIXuN6Azdn6hUMZo,25224
|
|
9
9
|
weco/panels.py,sha256=POHt0MdRKDykwUJYXcry92O41lpB9gxna55wFI9abWU,16272
|
|
10
|
-
weco/setup.py,sha256=
|
|
10
|
+
weco/setup.py,sha256=Zv1CbxYHamnoOcVfpCn68ymHgjzCTHHGMKep_WSFLCk,13981
|
|
11
11
|
weco/ui.py,sha256=Y7ASIQydwuYFdSYrvme5aGvkplFMi-cjhsnCj5Ebgoc,15092
|
|
12
12
|
weco/utils.py,sha256=v_rvgw-ktRoXrpPA2copngI8QDCB8UXmbiN-wAiYvEE,9450
|
|
13
13
|
weco/validation.py,sha256=n5aDuF3BFgwVb4eZ9PuU48nogrseXYNI8S3ePqWZCoc,3736
|
|
14
|
-
weco-0.3.
|
|
15
|
-
weco-0.3.
|
|
16
|
-
weco-0.3.
|
|
17
|
-
weco-0.3.
|
|
18
|
-
weco-0.3.
|
|
19
|
-
weco-0.3.
|
|
14
|
+
weco-0.3.10.dist-info/licenses/LICENSE,sha256=9LUfoGHjLPtak2zps2kL2tm65HAZIICx_FbLaRuS4KU,11337
|
|
15
|
+
weco-0.3.10.dist-info/METADATA,sha256=1eJxhWSGbdrHcOeBxjmxJ_T6Hruva1YNNn9fxOb59FE,30804
|
|
16
|
+
weco-0.3.10.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
17
|
+
weco-0.3.10.dist-info/entry_points.txt,sha256=ixJ2uClALbCpBvnIR6BXMNck8SHAab8eVkM9pIUowcs,39
|
|
18
|
+
weco-0.3.10.dist-info/top_level.txt,sha256=F0N7v6e2zBSlsorFv-arAq2yDxQbzX3KVO8GxYhPUeE,5
|
|
19
|
+
weco-0.3.10.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|