maxc-cli 0.4.3__tar.gz → 0.4.5__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 (95) hide show
  1. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/PKG-INFO +1 -1
  2. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/setup.py +1 -1
  3. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/__init__.py +1 -1
  4. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/_samples.py +2 -1
  5. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/agent_platforms.py +10 -1
  6. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/app.py +5 -0
  7. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli.egg-info/PKG-INFO +1 -1
  8. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_agent_platforms.py +5 -2
  9. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_agent_skill_commands_context.py +46 -3
  10. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/MANIFEST.in +0 -0
  11. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/README.md +0 -0
  12. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/pyproject.toml +0 -0
  13. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/scripts/pyinstaller_entry.py +0 -0
  14. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/scripts/regression_test.py +0 -0
  15. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/setup.cfg +0 -0
  16. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/__main__.py +0 -0
  17. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/audit.py +0 -0
  18. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/auth_providers.py +0 -0
  19. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/backend/__init__.py +0 -0
  20. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/backend/auth.py +0 -0
  21. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/backend/catalog.py +0 -0
  22. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/backend/data.py +0 -0
  23. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/backend/job.py +0 -0
  24. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/backend/meta.py +0 -0
  25. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/backend/odps.py +0 -0
  26. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/backend/query.py +0 -0
  27. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/cache.py +0 -0
  28. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/catalog_bootstrap.py +0 -0
  29. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/cli.py +0 -0
  30. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/config.py +0 -0
  31. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/exceptions.py +0 -0
  32. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/help_format.py +0 -0
  33. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/helpers.py +0 -0
  34. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/masking.py +0 -0
  35. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/models.py +0 -0
  36. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/output.py +0 -0
  37. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/setting_parser.py +0 -0
  38. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/skills/SKILL.md +0 -0
  39. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/skills/agents/openai.yaml +0 -0
  40. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/skills/references/bootstrap-auth.md +0 -0
  41. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/skills/references/bootstrap-flow.md +0 -0
  42. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/skills/references/command-patterns.md +0 -0
  43. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/skills/references/json-output-format.md +0 -0
  44. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/skills/references/maxcompute-select-guide.md +0 -0
  45. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/skills/references/maxcompute-sql-notes.md +0 -0
  46. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/skills/references/partition-guide.md +0 -0
  47. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/skills/references/red-lines.md +0 -0
  48. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/skills/references/setup-install.md +0 -0
  49. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/skills/references/sql-common-errors.md +0 -0
  50. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/skills/references/sql-query-patterns.md +0 -0
  51. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/skills/references/text2sql-principles.md +0 -0
  52. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/store.py +0 -0
  53. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli/utils.py +0 -0
  54. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli.egg-info/SOURCES.txt +0 -0
  55. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli.egg-info/dependency_links.txt +0 -0
  56. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli.egg-info/entry_points.txt +0 -0
  57. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli.egg-info/requires.txt +0 -0
  58. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/src/maxc_cli.egg-info/top_level.txt +0 -0
  59. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_agent_hints_and_cli.py +0 -0
  60. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_agent_skill_commands.py +0 -0
  61. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_backend_data.py +0 -0
  62. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_backend_data_serialization.py +0 -0
  63. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_backend_meta.py +0 -0
  64. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_build_release_script.py +0 -0
  65. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_cache.py +0 -0
  66. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_catalog.py +0 -0
  67. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_catalog_bootstrap.py +0 -0
  68. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_cli_arg_validation.py +0 -0
  69. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_cli_mock.py +0 -0
  70. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_cli_query_parse_and_sanitize.py +0 -0
  71. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_compat.py +0 -0
  72. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_e2e_smoke.py +0 -0
  73. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_envelope_shape.py +0 -0
  74. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_error_self_correction.py +0 -0
  75. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_error_translation.py +0 -0
  76. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_exit_codes.py +0 -0
  77. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_external_auth.py +0 -0
  78. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_flag_hoist.py +0 -0
  79. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_help_format.py +0 -0
  80. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_help_version_e2e.py +0 -0
  81. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_helpers.py +0 -0
  82. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_helpers_csv.py +0 -0
  83. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_integration.py +0 -0
  84. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_integration_real.py +0 -0
  85. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_job_improvements.py +0 -0
  86. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_masking.py +0 -0
  87. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_meta_schema_and_partition_cols.py +0 -0
  88. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_phase1_improvements.py +0 -0
  89. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_pyinstaller_bundle.py +0 -0
  90. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_query_auto_promote.py +0 -0
  91. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_query_result_csv_fallback.py +0 -0
  92. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_setting_parser.py +0 -0
  93. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_skill_cli_consistency.py +0 -0
  94. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_skill_eval.py +0 -0
  95. {maxc_cli-0.4.3 → maxc_cli-0.4.5}/tests/test_skill_renderer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: maxc-cli
3
- Version: 0.4.3
3
+ Version: 0.4.5
4
4
  Summary: Agent-native MaxCompute CLI for external coding agents
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: Programming Language :: Python :: 3.9
@@ -9,7 +9,7 @@ README = ROOT / "README.md"
9
9
 
10
10
  setup(
11
11
  name="maxc-cli",
12
- version="0.4.3",
12
+ version="0.4.5",
13
13
  description="Agent-native MaxCompute CLI for external coding agents",
14
14
  long_description=README.read_text(encoding="utf-8"),
15
15
  long_description_content_type="text/markdown",
@@ -2,4 +2,4 @@
2
2
 
3
3
  __all__ = ["__version__"]
4
4
 
5
- __version__ = "0.4.3"
5
+ __version__ = "0.4.5"
@@ -152,7 +152,8 @@ SAMPLES: dict[str, str] = {
152
152
  "agent.skill": "maxc agent skill\nmaxc agent skill --json",
153
153
  "agent.skill.install": (
154
154
  "maxc agent skill install claude-code\n"
155
- "maxc agent skill install cursor --invocation aliyun-maxc"
155
+ "maxc agent skill install cursor --invocation aliyun-maxc\n"
156
+ "maxc agent skill install others --dir /path/to/skills"
156
157
  ),
157
158
  "agent.skill.update": (
158
159
  "maxc agent skill update cursor\n"
@@ -122,7 +122,8 @@ def _build_registry() -> tuple[Platform, ...]:
122
122
  ),
123
123
  Platform(name="cursor", install_root=_simple_root(".cursor"),
124
124
  next_step_hint="Restart Cursor to activate"),
125
- Platform(name="windsurf", install_root=_simple_root(".windsurf"),
125
+ Platform(name="windsurf",
126
+ install_root=Path.home() / ".codeium" / "windsurf" / "skills" / "maxc-cli",
126
127
  next_step_hint="Restart Windsurf to activate"),
127
128
  Platform(name="codex", install_root=_codex_root(),
128
129
  next_step_hint="Restart Codex to activate"),
@@ -132,6 +133,14 @@ def _build_registry() -> tuple[Platform, ...]:
132
133
  next_step_hint="Restart Qoder to activate"),
133
134
  Platform(name="qoderwork", install_root=_simple_root(".qoderwork"),
134
135
  next_step_hint="Restart QoderWork to activate"),
136
+ Platform(name="openclaw",
137
+ install_root=Path.home() / ".openclaw" / "workspace" / "skills" / "maxc-cli",
138
+ next_step_hint="Restart OpenClaw to activate"),
139
+ Platform(name="hermes", install_root=_simple_root(".hermes"),
140
+ next_step_hint="Restart Hermes to activate"),
141
+ Platform(name="others", install_root=Path("__dir_required__"),
142
+ requires_dir=False,
143
+ next_step_hint="Point your agent at the installed skill directory"),
135
144
  )
136
145
 
137
146
 
@@ -3409,6 +3409,11 @@ class MaxCApp:
3409
3409
  platform = agent_platforms.resolve(platform_name)
3410
3410
  except KeyError as exc:
3411
3411
  raise ValidationError(str(exc))
3412
+ if dir_override is None and not platform.install_root.is_absolute():
3413
+ raise ValidationError(
3414
+ f"Platform {platform.name!r} has no default install path — "
3415
+ f"pass --dir <path> to specify where the skill should be installed."
3416
+ )
3412
3417
  target = agent_platforms.effective_target(platform, dir_override)
3413
3418
  return platform, target
3414
3419
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: maxc-cli
3
- Version: 0.4.3
3
+ Version: 0.4.5
4
4
  Summary: Agent-native MaxCompute CLI for external coding agents
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: Programming Language :: Python :: 3.9
@@ -11,11 +11,12 @@ import pytest
11
11
  from maxc_cli import agent_platforms as ap
12
12
 
13
13
 
14
- def test_registry_has_seven_canonical_platforms():
14
+ def test_registry_has_canonical_platforms():
15
15
  names = {p.name for p in ap.REGISTRY}
16
16
  assert names == {
17
17
  "claude-code", "cursor", "windsurf", "codex",
18
18
  "qwen", "qoder", "qoderwork",
19
+ "openclaw", "hermes", "others",
19
20
  }
20
21
 
21
22
 
@@ -41,10 +42,12 @@ def test_install_root_matches_legacy_paths():
41
42
  expected = {
42
43
  "claude-code": Path.home() / ".claude" / "skills" / "maxc-cli",
43
44
  "cursor": Path.home() / ".cursor" / "skills" / "maxc-cli",
44
- "windsurf": Path.home() / ".windsurf" / "skills" / "maxc-cli",
45
+ "windsurf": Path.home() / ".codeium" / "windsurf" / "skills" / "maxc-cli",
45
46
  "qwen": Path.home() / ".qwen" / "skills" / "maxc-cli",
46
47
  "qoder": Path.home() / ".qoder" / "skills" / "maxc-cli",
47
48
  "qoderwork": Path.home() / ".qoderwork" / "skills" / "maxc-cli",
49
+ "openclaw": Path.home() / ".openclaw" / "workspace" / "skills" / "maxc-cli",
50
+ "hermes": Path.home() / ".hermes" / "skills" / "maxc-cli",
48
51
  }
49
52
  for name, expected_path in expected.items():
50
53
  assert ap.resolve(name).install_root == expected_path, name
@@ -224,11 +224,13 @@ class TestAgentInstallSkill:
224
224
  for d in [
225
225
  Path.home() / ".claude" / "skills" / "maxc-cli",
226
226
  Path.home() / ".cursor" / "skills" / "maxc-cli",
227
- Path.home() / ".windsurf" / "skills" / "maxc-cli",
227
+ Path.home() / ".codeium" / "windsurf" / "skills" / "maxc-cli",
228
228
  Path(os.environ.get("CODEX_HOME", str(Path.home() / ".codex"))) / "skills" / "maxc-cli",
229
229
  Path.home() / ".qwen" / "skills" / "maxc-cli",
230
230
  Path.home() / ".qoder" / "skills" / "maxc-cli",
231
231
  Path.home() / ".qoderwork" / "skills" / "maxc-cli",
232
+ Path.home() / ".openclaw" / "workspace" / "skills" / "maxc-cli",
233
+ Path.home() / ".hermes" / "skills" / "maxc-cli",
232
234
  ]:
233
235
  if d.exists():
234
236
  shutil.rmtree(str(d))
@@ -236,11 +238,13 @@ class TestAgentInstallSkill:
236
238
  for d in [
237
239
  Path.home() / ".claude" / "skills" / "maxc-cli",
238
240
  Path.home() / ".cursor" / "skills" / "maxc-cli",
239
- Path.home() / ".windsurf" / "skills" / "maxc-cli",
241
+ Path.home() / ".codeium" / "windsurf" / "skills" / "maxc-cli",
240
242
  Path(os.environ.get("CODEX_HOME", str(Path.home() / ".codex"))) / "skills" / "maxc-cli",
241
243
  Path.home() / ".qwen" / "skills" / "maxc-cli",
242
244
  Path.home() / ".qoder" / "skills" / "maxc-cli",
243
245
  Path.home() / ".qoderwork" / "skills" / "maxc-cli",
246
+ Path.home() / ".openclaw" / "workspace" / "skills" / "maxc-cli",
247
+ Path.home() / ".hermes" / "skills" / "maxc-cli",
244
248
  ]:
245
249
  if d.exists():
246
250
  shutil.rmtree(str(d))
@@ -288,7 +292,7 @@ class TestAgentInstallSkill:
288
292
  assert data["platform"] == "windsurf"
289
293
  assert data["upgraded"] is True
290
294
  install_path = Path(data["install_path"])
291
- assert ".windsurf/skills" in str(install_path)
295
+ assert ".codeium/windsurf/skills" in str(install_path)
292
296
  assert (install_path / "SKILL.md").is_file()
293
297
 
294
298
  def test_install_skill_qwen(self, tmp_path):
@@ -324,6 +328,45 @@ class TestAgentInstallSkill:
324
328
  assert ".qoderwork/skills" in str(install_path)
325
329
  assert (install_path / "SKILL.md").is_file()
326
330
 
331
+ def test_install_skill_openclaw(self, tmp_path):
332
+ config = _make_config(tmp_path)
333
+ code, payload, _ = _run_cmd(config, ["agent", "skill", "install", "openclaw", "--json"])
334
+ assert code == 0
335
+ data = payload["data"]
336
+ assert data["platform"] == "openclaw"
337
+ assert data["upgraded"] is True
338
+ install_path = Path(data["install_path"])
339
+ assert ".openclaw/workspace/skills" in str(install_path)
340
+ assert (install_path / "SKILL.md").is_file()
341
+
342
+ def test_install_skill_hermes(self, tmp_path):
343
+ config = _make_config(tmp_path)
344
+ code, payload, _ = _run_cmd(config, ["agent", "skill", "install", "hermes", "--json"])
345
+ assert code == 0
346
+ data = payload["data"]
347
+ assert data["platform"] == "hermes"
348
+ assert data["upgraded"] is True
349
+ install_path = Path(data["install_path"])
350
+ assert ".hermes/skills" in str(install_path)
351
+ assert (install_path / "SKILL.md").is_file()
352
+
353
+ def test_install_skill_others_requires_dir(self, tmp_path):
354
+ config = _make_config(tmp_path)
355
+ code, payload, _ = _run_cmd(config, ["agent", "skill", "install", "others", "--json"])
356
+ assert code == 1
357
+ assert payload["status"] == "failure"
358
+ assert "--dir" in payload["error"]["message"]
359
+
360
+ def test_install_skill_others_with_dir(self, tmp_path):
361
+ config = _make_config(tmp_path)
362
+ target = tmp_path / "custom-agent-skill"
363
+ code, payload, _ = _run_cmd(config, ["agent", "skill", "install", "others", "--dir", str(target), "--json"])
364
+ assert code == 0
365
+ data = payload["data"]
366
+ assert data["platform"] == "others"
367
+ assert data["upgraded"] is True
368
+ assert (target / "SKILL.md").is_file()
369
+
327
370
  def test_install_skill_default_platform_is_claude_code(self, tmp_path):
328
371
  config = _make_config(tmp_path)
329
372
  code, payload, _ = _run_cmd(config, ["agent", "skill", "install", "--json"])
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