multi-lang-build 0.2.0__tar.gz → 0.2.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.
- {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/PKG-INFO +1 -1
- {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/pyproject.toml +1 -1
- {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/register.py +143 -126
- {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/.gitignore +0 -0
- {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/LICENSE +0 -0
- {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/README.md +0 -0
- {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/__init__.py +0 -0
- {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/cli.py +0 -0
- {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/compiler/__init__.py +0 -0
- {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/compiler/base.py +0 -0
- {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/compiler/go.py +0 -0
- {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/compiler/pnpm.py +0 -0
- {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/compiler/python.py +0 -0
- {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/mirror/__init__.py +0 -0
- {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/mirror/config.py +0 -0
- {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/py.typed +0 -0
- {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/types.py +0 -0
- {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/tests/__init__.py +0 -0
- {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/tests/conftest.py +0 -0
- {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/tests/test_compiler.py +0 -0
- {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/tests/test_mirror.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: multi-lang-build
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.1
|
|
4
4
|
Summary: Multi-language automated build tool with domestic mirror acceleration support
|
|
5
5
|
Project-URL: Homepage, https://github.com/example/multi-lang-build
|
|
6
6
|
Project-URL: Repository, https://github.com/example/multi-lang-build
|
|
@@ -25,36 +25,44 @@ def get_cli_path() -> str:
|
|
|
25
25
|
return f"{sys.executable} -m multi_lang_build"
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
def register_claude_code() -> bool:
|
|
28
|
+
def register_claude_code(project_level: bool = True) -> bool:
|
|
29
29
|
"""Register as Claude Code skill.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
project_level: If True (default), register to project-level .claude/CLAUDE.md.
|
|
33
|
+
If False, register to global ~/.claude/CLAUDE.md.
|
|
33
34
|
"""
|
|
34
35
|
try:
|
|
35
|
-
#
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
36
|
+
# Determine registration path
|
|
37
|
+
if project_level:
|
|
38
|
+
# Project-level: .claude/CLAUDE.md in current directory
|
|
39
|
+
config_dir = Path.cwd() / ".claude"
|
|
40
|
+
config_dir.mkdir(exist_ok=True)
|
|
41
|
+
claude_md = config_dir / "CLAUDE.md"
|
|
42
|
+
level_name = "project-level"
|
|
43
|
+
else:
|
|
44
|
+
# Global-level: ~/.claude/CLAUDE.md (only check CLI for global)
|
|
45
|
+
result = subprocess.run(
|
|
46
|
+
["which", "claude"],
|
|
47
|
+
capture_output=True,
|
|
48
|
+
text=True,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
if result.returncode != 0:
|
|
52
|
+
print("❌ Claude Code CLI not found. Please install it first:")
|
|
53
|
+
print(" npm install -g @anthropic-ai/claude-code")
|
|
54
|
+
return False
|
|
55
|
+
|
|
56
|
+
claude_dir = Path.home() / ".claude"
|
|
57
|
+
claude_dir.mkdir(exist_ok=True)
|
|
58
|
+
claude_md = claude_dir / "CLAUDE.md"
|
|
59
|
+
level_name = "global"
|
|
60
|
+
|
|
61
|
+
# Read existing content
|
|
53
62
|
existing_content = ""
|
|
54
63
|
if claude_md.exists():
|
|
55
64
|
existing_content = claude_md.read_text()
|
|
56
|
-
|
|
57
|
-
# Add multi-lang-build skill section
|
|
65
|
+
|
|
58
66
|
skill_section = """
|
|
59
67
|
|
|
60
68
|
## Multi-Lang Build Tool
|
|
@@ -83,50 +91,51 @@ multi-lang-build pnpm ./src --output ./dist --mirror
|
|
|
83
91
|
|
|
84
92
|
When working with Go projects, check if there are multiple main packages and use the `--target` flag to specify which one to build.
|
|
85
93
|
"""
|
|
86
|
-
|
|
94
|
+
|
|
87
95
|
if "## Multi-Lang Build Tool" not in existing_content:
|
|
88
96
|
with open(claude_md, "a") as f:
|
|
89
97
|
f.write(skill_section)
|
|
90
|
-
print(f"✅ Registered with Claude Code (added to {claude_md})")
|
|
98
|
+
print(f"✅ Registered with Claude Code ({level_name}, added to {claude_md})")
|
|
91
99
|
else:
|
|
92
|
-
print(f"ℹ️ Already registered with Claude Code ({claude_md})")
|
|
93
|
-
|
|
100
|
+
print(f"ℹ️ Already registered with Claude Code ({level_name}, {claude_md})")
|
|
101
|
+
|
|
94
102
|
return True
|
|
95
|
-
|
|
103
|
+
|
|
96
104
|
except Exception as e:
|
|
97
105
|
print(f"❌ Failed to register with Claude Code: {e}")
|
|
98
106
|
return False
|
|
99
107
|
|
|
100
108
|
|
|
101
|
-
def register_opencode() -> bool:
|
|
109
|
+
def register_opencode(project_level: bool = True) -> bool:
|
|
102
110
|
"""Register as OpenCode skill.
|
|
103
|
-
|
|
104
|
-
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
project_level: If True (default), register to project-level .opencode/skills.json.
|
|
114
|
+
If False, register to global ~/.config/opencode/skills.json.
|
|
105
115
|
"""
|
|
106
116
|
try:
|
|
107
|
-
#
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
117
|
+
# Determine registration path
|
|
118
|
+
if project_level:
|
|
119
|
+
# Project-level: .opencode/skills.json in current directory
|
|
120
|
+
base_dir = Path.cwd()
|
|
121
|
+
config_dir = base_dir / ".opencode"
|
|
122
|
+
config_dir.mkdir(exist_ok=True)
|
|
123
|
+
skills_file = config_dir / "skills.json"
|
|
124
|
+
level_name = "project-level"
|
|
125
|
+
else:
|
|
126
|
+
# Global-level: ~/.config/opencode/skills.json
|
|
127
|
+
config_dir = Path.home() / ".config" / "opencode"
|
|
128
|
+
config_dir.mkdir(parents=True, exist_ok=True)
|
|
129
|
+
skills_file = config_dir / "skills.json"
|
|
130
|
+
level_name = "global"
|
|
131
|
+
|
|
122
132
|
# Create or update skills.json
|
|
123
|
-
skills_file = config_dir / "skills.json"
|
|
124
133
|
skills: dict = {}
|
|
125
|
-
|
|
134
|
+
|
|
126
135
|
if skills_file.exists():
|
|
127
136
|
with open(skills_file) as f:
|
|
128
137
|
skills = json.load(f)
|
|
129
|
-
|
|
138
|
+
|
|
130
139
|
# Add multi-lang-build skill
|
|
131
140
|
skills["multi-lang-build"] = {
|
|
132
141
|
"name": "multi-lang-build",
|
|
@@ -143,47 +152,48 @@ def register_opencode() -> bool:
|
|
|
143
152
|
"multi-lang-build pnpm ./src --output ./dist --mirror",
|
|
144
153
|
]
|
|
145
154
|
}
|
|
146
|
-
|
|
155
|
+
|
|
147
156
|
with open(skills_file, "w") as f:
|
|
148
157
|
json.dump(skills, f, indent=2)
|
|
149
|
-
|
|
150
|
-
print(f"✅ Registered with OpenCode (config: {skills_file})")
|
|
158
|
+
|
|
159
|
+
print(f"✅ Registered with OpenCode ({level_name}, config: {skills_file})")
|
|
151
160
|
return True
|
|
152
|
-
|
|
161
|
+
|
|
153
162
|
except Exception as e:
|
|
154
163
|
print(f"❌ Failed to register with OpenCode: {e}")
|
|
155
164
|
return False
|
|
156
165
|
|
|
157
166
|
|
|
158
|
-
def register_trae() -> bool:
|
|
167
|
+
def register_trae(project_level: bool = True) -> bool:
|
|
159
168
|
"""Register as Trae skill.
|
|
160
|
-
|
|
161
|
-
|
|
169
|
+
|
|
170
|
+
Args:
|
|
171
|
+
project_level: If True (default), register to project-level .trae/skills.json.
|
|
172
|
+
If False, register to global ~/.trae/skills.json.
|
|
162
173
|
"""
|
|
163
174
|
try:
|
|
164
|
-
#
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
175
|
+
# Determine registration path
|
|
176
|
+
if project_level:
|
|
177
|
+
# Project-level: .trae/skills.json in current directory
|
|
178
|
+
base_dir = Path.cwd()
|
|
179
|
+
config_dir = base_dir / ".trae"
|
|
180
|
+
config_dir.mkdir(exist_ok=True)
|
|
181
|
+
skills_file = config_dir / "skills.json"
|
|
182
|
+
level_name = "project-level"
|
|
183
|
+
else:
|
|
184
|
+
# Global-level: ~/.trae/skills.json
|
|
185
|
+
config_dir = Path.home() / ".trae"
|
|
186
|
+
config_dir.mkdir(exist_ok=True)
|
|
187
|
+
skills_file = config_dir / "skills.json"
|
|
188
|
+
level_name = "global"
|
|
189
|
+
|
|
179
190
|
# Create or update skills.json
|
|
180
|
-
skills_file = config_dir / "skills.json"
|
|
181
191
|
skills: dict = {}
|
|
182
|
-
|
|
192
|
+
|
|
183
193
|
if skills_file.exists():
|
|
184
194
|
with open(skills_file) as f:
|
|
185
195
|
skills = json.load(f)
|
|
186
|
-
|
|
196
|
+
|
|
187
197
|
# Add multi-lang-build skill
|
|
188
198
|
skills["multi-lang-build"] = {
|
|
189
199
|
"name": "Multi-Lang Build",
|
|
@@ -210,49 +220,48 @@ def register_trae() -> bool:
|
|
|
210
220
|
}
|
|
211
221
|
]
|
|
212
222
|
}
|
|
213
|
-
|
|
223
|
+
|
|
214
224
|
with open(skills_file, "w") as f:
|
|
215
225
|
json.dump(skills, f, indent=2)
|
|
216
|
-
|
|
217
|
-
print(f"✅ Registered with Trae (config: {skills_file})")
|
|
226
|
+
|
|
227
|
+
print(f"✅ Registered with Trae ({level_name}, config: {skills_file})")
|
|
218
228
|
return True
|
|
219
|
-
|
|
229
|
+
|
|
220
230
|
except Exception as e:
|
|
221
231
|
print(f"❌ Failed to register with Trae: {e}")
|
|
222
232
|
return False
|
|
223
233
|
|
|
224
234
|
|
|
225
|
-
def register_codebuddy() -> bool:
|
|
235
|
+
def register_codebuddy(project_level: bool = True) -> bool:
|
|
226
236
|
"""Register as CodeBuddy skill.
|
|
227
|
-
|
|
228
|
-
|
|
237
|
+
|
|
238
|
+
Args:
|
|
239
|
+
project_level: If True (default), register to project-level .codebuddy/skills.yaml.
|
|
240
|
+
If False, register to global ~/.codebuddy/skills.yaml.
|
|
229
241
|
"""
|
|
230
242
|
try:
|
|
231
|
-
#
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
# Create or update skills.yaml (CodeBuddy may use YAML)
|
|
247
|
-
skills_file = config_dir / "skills.yaml"
|
|
248
|
-
|
|
243
|
+
# Determine registration path
|
|
244
|
+
if project_level:
|
|
245
|
+
# Project-level: .codebuddy/skills.yaml in current directory
|
|
246
|
+
base_dir = Path.cwd()
|
|
247
|
+
config_dir = base_dir / ".codebuddy"
|
|
248
|
+
config_dir.mkdir(exist_ok=True)
|
|
249
|
+
skills_file = config_dir / "skills.yaml"
|
|
250
|
+
level_name = "project-level"
|
|
251
|
+
else:
|
|
252
|
+
# Global-level: ~/.codebuddy/skills.yaml
|
|
253
|
+
config_dir = Path.home() / ".codebuddy"
|
|
254
|
+
config_dir.mkdir(exist_ok=True)
|
|
255
|
+
skills_file = config_dir / "skills.yaml"
|
|
256
|
+
level_name = "global"
|
|
257
|
+
|
|
249
258
|
skill_config = """# Multi-Lang Build Skill
|
|
250
259
|
skills:
|
|
251
260
|
multi-lang-build:
|
|
252
261
|
name: "Multi-Lang Build"
|
|
253
262
|
description: "Multi-language automated build tool with mirror acceleration"
|
|
254
263
|
version: "0.2.0"
|
|
255
|
-
|
|
264
|
+
|
|
256
265
|
commands:
|
|
257
266
|
build-go:
|
|
258
267
|
description: "Build Go project"
|
|
@@ -270,7 +279,7 @@ skills:
|
|
|
270
279
|
- name: mirror
|
|
271
280
|
description: "Enable mirror acceleration"
|
|
272
281
|
type: flag
|
|
273
|
-
|
|
282
|
+
|
|
274
283
|
build-python:
|
|
275
284
|
description: "Build Python project"
|
|
276
285
|
command: "multi-lang-build python {source} --output {output}"
|
|
@@ -284,7 +293,7 @@ skills:
|
|
|
284
293
|
- name: mirror
|
|
285
294
|
description: "Enable mirror acceleration"
|
|
286
295
|
type: flag
|
|
287
|
-
|
|
296
|
+
|
|
288
297
|
build-pnpm:
|
|
289
298
|
description: "Build pnpm project"
|
|
290
299
|
command: "multi-lang-build pnpm {source} --output {output}"
|
|
@@ -299,65 +308,67 @@ skills:
|
|
|
299
308
|
description: "Enable mirror acceleration"
|
|
300
309
|
type: flag
|
|
301
310
|
"""
|
|
302
|
-
|
|
311
|
+
|
|
303
312
|
# Append or create
|
|
304
313
|
if skills_file.exists():
|
|
305
314
|
content = skills_file.read_text()
|
|
306
315
|
if "multi-lang-build" not in content:
|
|
307
316
|
with open(skills_file, "a") as f:
|
|
308
317
|
f.write("\n" + skill_config)
|
|
309
|
-
print(f"✅ Registered with CodeBuddy (updated {skills_file})")
|
|
318
|
+
print(f"✅ Registered with CodeBuddy ({level_name}, updated {skills_file})")
|
|
310
319
|
else:
|
|
311
|
-
print(f"ℹ️ Already registered with CodeBuddy ({skills_file})")
|
|
320
|
+
print(f"ℹ️ Already registered with CodeBuddy ({level_name}, {skills_file})")
|
|
312
321
|
else:
|
|
313
322
|
skills_file.write_text(skill_config)
|
|
314
|
-
print(f"✅ Registered with CodeBuddy (created {skills_file})")
|
|
315
|
-
|
|
323
|
+
print(f"✅ Registered with CodeBuddy ({level_name}, created {skills_file})")
|
|
324
|
+
|
|
316
325
|
return True
|
|
317
|
-
|
|
326
|
+
|
|
318
327
|
except Exception as e:
|
|
319
328
|
print(f"❌ Failed to register with CodeBuddy: {e}")
|
|
320
329
|
return False
|
|
321
330
|
|
|
322
331
|
|
|
323
332
|
def register_skill(
|
|
324
|
-
ide: Literal["claude", "opencode", "trae", "codebuddy", "all"] = "claude"
|
|
333
|
+
ide: Literal["claude", "opencode", "trae", "codebuddy", "all"] = "claude",
|
|
334
|
+
global_level: bool = False
|
|
325
335
|
) -> bool:
|
|
326
336
|
"""Register multi-lang-build as a skill for the specified IDE.
|
|
327
|
-
|
|
337
|
+
|
|
328
338
|
Args:
|
|
329
339
|
ide: The IDE to register with. Options: "claude", "opencode", "trae", "codebuddy", "all"
|
|
330
340
|
Default is "claude".
|
|
331
|
-
|
|
341
|
+
global_level: If True, register to global config. If False (default), register to project-level.
|
|
342
|
+
|
|
332
343
|
Returns:
|
|
333
344
|
True if registration succeeded, False otherwise.
|
|
334
345
|
"""
|
|
335
346
|
print(f"📝 Registering multi-lang-build for {ide}...\n")
|
|
336
|
-
|
|
347
|
+
|
|
337
348
|
if ide == "all":
|
|
338
349
|
results = [
|
|
339
|
-
("Claude Code", register_claude_code()),
|
|
340
|
-
("OpenCode", register_opencode()),
|
|
341
|
-
("Trae", register_trae()),
|
|
342
|
-
("CodeBuddy", register_codebuddy()),
|
|
350
|
+
("Claude Code", register_claude_code(project_level=not global_level)),
|
|
351
|
+
("OpenCode", register_opencode(project_level=not global_level)),
|
|
352
|
+
("Trae", register_trae(project_level=not global_level)),
|
|
353
|
+
("CodeBuddy", register_codebuddy(project_level=not global_level)),
|
|
343
354
|
]
|
|
344
|
-
|
|
355
|
+
|
|
345
356
|
print("\n" + "=" * 50)
|
|
346
357
|
print("Registration Summary:")
|
|
347
358
|
for name, success in results:
|
|
348
359
|
status = "✅" if success else "❌"
|
|
349
360
|
print(f" {status} {name}")
|
|
350
|
-
|
|
361
|
+
|
|
351
362
|
return all(success for _, success in results)
|
|
352
|
-
|
|
363
|
+
|
|
353
364
|
elif ide == "claude":
|
|
354
|
-
return register_claude_code()
|
|
365
|
+
return register_claude_code(project_level=not global_level)
|
|
355
366
|
elif ide == "opencode":
|
|
356
|
-
return register_opencode()
|
|
367
|
+
return register_opencode(project_level=not global_level)
|
|
357
368
|
elif ide == "trae":
|
|
358
|
-
return register_trae()
|
|
369
|
+
return register_trae(project_level=not global_level)
|
|
359
370
|
elif ide == "codebuddy":
|
|
360
|
-
return register_codebuddy()
|
|
371
|
+
return register_codebuddy(project_level=not global_level)
|
|
361
372
|
else:
|
|
362
373
|
print(f"❌ Unknown IDE: {ide}")
|
|
363
374
|
print("Supported IDEs: claude, opencode, trae, codebuddy, all")
|
|
@@ -377,7 +388,13 @@ if __name__ == "__main__":
|
|
|
377
388
|
choices=["claude", "opencode", "trae", "codebuddy", "all"],
|
|
378
389
|
help="IDE to register with (default: claude)",
|
|
379
390
|
)
|
|
380
|
-
|
|
391
|
+
parser.add_argument(
|
|
392
|
+
"--global",
|
|
393
|
+
dest="global_level",
|
|
394
|
+
action="store_true",
|
|
395
|
+
help="Register to global config instead of project-level",
|
|
396
|
+
)
|
|
397
|
+
|
|
381
398
|
args = parser.parse_args()
|
|
382
|
-
success = register_skill(args.ide)
|
|
399
|
+
success = register_skill(args.ide, global_level=args.global_level)
|
|
383
400
|
sys.exit(0 if success else 1)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|