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.
Files changed (21) hide show
  1. {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/PKG-INFO +1 -1
  2. {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/pyproject.toml +1 -1
  3. {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/register.py +143 -126
  4. {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/.gitignore +0 -0
  5. {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/LICENSE +0 -0
  6. {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/README.md +0 -0
  7. {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/__init__.py +0 -0
  8. {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/cli.py +0 -0
  9. {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/compiler/__init__.py +0 -0
  10. {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/compiler/base.py +0 -0
  11. {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/compiler/go.py +0 -0
  12. {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/compiler/pnpm.py +0 -0
  13. {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/compiler/python.py +0 -0
  14. {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/mirror/__init__.py +0 -0
  15. {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/mirror/config.py +0 -0
  16. {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/py.typed +0 -0
  17. {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/src/multi_lang_build/types.py +0 -0
  18. {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/tests/__init__.py +0 -0
  19. {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/tests/conftest.py +0 -0
  20. {multi_lang_build-0.2.0 → multi_lang_build-0.2.1}/tests/test_compiler.py +0 -0
  21. {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.0
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "multi-lang-build"
7
- version = "0.2.0"
7
+ version = "0.2.1"
8
8
  description = "Multi-language automated build tool with domestic mirror acceleration support"
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -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
- Claude Code uses ~/.claude/CLAU.md for global instructions
32
- and project-specific skills via the API.
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
- # Check if claude CLI is available
36
- result = subprocess.run(
37
- ["which", "claude"],
38
- capture_output=True,
39
- text=True,
40
- )
41
-
42
- if result.returncode != 0:
43
- print("❌ Claude Code CLI not found. Please install it first:")
44
- print(" npm install -g @anthropic-ai/claude-code")
45
- return False
46
-
47
- # Create global instructions directory
48
- claude_dir = Path.home() / ".claude"
49
- claude_dir.mkdir(exist_ok=True)
50
-
51
- # Read existing CLAU.md or create new
52
- claude_md = claude_dir / "CLAUDE.md"
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
- OpenCode typically uses ~/.config/opencode/ for configuration.
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
- # Check if opencode CLI is available
108
- result = subprocess.run(
109
- ["which", "opencode"],
110
- capture_output=True,
111
- text=True,
112
- )
113
-
114
- if result.returncode != 0:
115
- print("❌ OpenCode CLI not found. Please install it first.")
116
- return False
117
-
118
- # Create OpenCode config directory
119
- config_dir = Path.home() / ".config" / "opencode"
120
- config_dir.mkdir(parents=True, exist_ok=True)
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
- Trae typically uses ~/.trae/ for configuration.
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
- # Check if trae CLI is available
165
- result = subprocess.run(
166
- ["which", "trae"],
167
- capture_output=True,
168
- text=True,
169
- )
170
-
171
- if result.returncode != 0:
172
- print("❌ Trae CLI not found. Please install it first.")
173
- return False
174
-
175
- # Create Trae config directory
176
- config_dir = Path.home() / ".trae"
177
- config_dir.mkdir(exist_ok=True)
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
- CodeBuddy typically uses ~/.codebuddy/ for configuration.
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
- # Check if codebuddy CLI is available
232
- result = subprocess.run(
233
- ["which", "codebuddy"],
234
- capture_output=True,
235
- text=True,
236
- )
237
-
238
- if result.returncode != 0:
239
- print("❌ CodeBuddy CLI not found. Please install it first.")
240
- return False
241
-
242
- # Create CodeBuddy config directory
243
- config_dir = Path.home() / ".codebuddy"
244
- config_dir.mkdir(exist_ok=True)
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)