opensell-cli 0.1.0__tar.gz → 0.1.2__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.
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opensell-cli
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: OPENSELL marketplace CLI for AI agents
5
5
  Requires-Python: >=3.12
6
- Requires-Dist: aixianyu-mcp
7
6
  Requires-Dist: click>=8.1
7
+ Requires-Dist: opensell-mcp>=0.1.1
8
8
  Provides-Extra: dev
9
9
  Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
10
10
  Requires-Dist: pytest>=8.2.0; extra == 'dev'
@@ -7,7 +7,9 @@ generated from the shared `TOOL_REGISTRY`, so MCP and CLI never drift.
7
7
  ## Install
8
8
 
9
9
  ```bash
10
- uvx opensell-cli # or: pip install opensell-cli
10
+ pip install opensell-cli # provides the `opensell` command
11
+ # or one-shot (the command is "opensell", not the package name):
12
+ uvx --from opensell-cli opensell catalog
11
13
  ```
12
14
 
13
15
  ## Configure
@@ -34,7 +34,15 @@ def _decode_object_args(spec: ToolSpec, args: dict) -> dict:
34
34
  def _make_command(tool_name: str, spec: ToolSpec) -> click.Command:
35
35
  def callback(**kwargs):
36
36
  ctx = click.get_current_context()
37
- args = {k: v for k, v in kwargs.items() if v is not None}
37
+ args = {}
38
+ for k, v in kwargs.items():
39
+ if v is None:
40
+ continue
41
+ if isinstance(v, tuple): # click multiple=True -> tuple
42
+ if not v:
43
+ continue
44
+ v = list(v)
45
+ args[k] = v
38
46
  args = _decode_object_args(spec, args)
39
47
  try:
40
48
  result = asyncio.run(
@@ -24,6 +24,16 @@ def options_for_schema(schema: dict) -> list[click.Option]:
24
24
  if spec.get("type") == "boolean":
25
25
  options.append(click.Option([flag], is_flag=True, help=help_text))
26
26
  continue
27
+ if spec.get("type") == "array":
28
+ item_type = spec.get("items", {}).get("type", "string")
29
+ options.append(click.Option(
30
+ [flag],
31
+ type=_SCALAR.get(item_type, click.STRING),
32
+ multiple=True,
33
+ required=name in required,
34
+ help=help_text,
35
+ ))
36
+ continue
27
37
  kwargs: dict = {"help": help_text, "required": name in required}
28
38
  if "default" in spec:
29
39
  kwargs["default"] = spec["default"]
@@ -1,9 +1,9 @@
1
1
  [project]
2
2
  name = "opensell-cli"
3
- version = "0.1.0"
3
+ version = "0.1.2"
4
4
  description = "OPENSELL marketplace CLI for AI agents"
5
5
  requires-python = ">=3.12"
6
- dependencies = ["aixianyu-mcp", "click>=8.1"]
6
+ dependencies = ["opensell-mcp>=0.1.1", "click>=8.1"]
7
7
 
8
8
  [project.optional-dependencies]
9
9
  dev = ["pytest>=8.2.0", "pytest-asyncio>=0.23.0"]
@@ -16,7 +16,7 @@ requires = ["hatchling"]
16
16
  build-backend = "hatchling.build"
17
17
 
18
18
  [tool.uv.sources]
19
- aixianyu-mcp = { path = "../mcp-server", editable = true }
19
+ opensell-mcp = { path = "../mcp-server", editable = true }
20
20
 
21
21
  [tool.pytest.ini_options]
22
22
  asyncio_mode = "auto"
@@ -0,0 +1,9 @@
1
+ from click.testing import CliRunner
2
+ from opensell_cli.schema_to_click import options_for_schema
3
+
4
+
5
+ def test_array_option_is_multiple():
6
+ schema = {"properties": {"image_ids": {"type": "array", "items": {"type": "string"}}}}
7
+ opt = options_for_schema(schema)[0]
8
+ assert opt.multiple is True
9
+ assert opt.name == "image_ids"
@@ -2,26 +2,6 @@ version = 1
2
2
  revision = 3
3
3
  requires-python = ">=3.12"
4
4
 
5
- [[package]]
6
- name = "aixianyu-mcp"
7
- version = "0.1.0"
8
- source = { editable = "../mcp-server" }
9
- dependencies = [
10
- { name = "httpx" },
11
- { name = "mcp" },
12
- { name = "pydantic" },
13
- ]
14
-
15
- [package.metadata]
16
- requires-dist = [
17
- { name = "httpx", specifier = ">=0.27.0" },
18
- { name = "mcp", specifier = ">=0.9.0" },
19
- { name = "pydantic", specifier = ">=2.7.0" },
20
- { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.2.0" },
21
- { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.23.0" },
22
- ]
23
- provides-extras = ["dev"]
24
-
25
5
  [[package]]
26
6
  name = "annotated-types"
27
7
  version = "0.7.0"
@@ -311,11 +291,11 @@ wheels = [
311
291
 
312
292
  [[package]]
313
293
  name = "opensell-cli"
314
- version = "0.1.0"
294
+ version = "0.1.1"
315
295
  source = { editable = "." }
316
296
  dependencies = [
317
- { name = "aixianyu-mcp" },
318
297
  { name = "click" },
298
+ { name = "opensell-mcp" },
319
299
  ]
320
300
 
321
301
  [package.optional-dependencies]
@@ -326,8 +306,28 @@ dev = [
326
306
 
327
307
  [package.metadata]
328
308
  requires-dist = [
329
- { name = "aixianyu-mcp", editable = "../mcp-server" },
330
309
  { name = "click", specifier = ">=8.1" },
310
+ { name = "opensell-mcp", editable = "../mcp-server" },
311
+ { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.2.0" },
312
+ { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.23.0" },
313
+ ]
314
+ provides-extras = ["dev"]
315
+
316
+ [[package]]
317
+ name = "opensell-mcp"
318
+ version = "0.1.0"
319
+ source = { editable = "../mcp-server" }
320
+ dependencies = [
321
+ { name = "httpx" },
322
+ { name = "mcp" },
323
+ { name = "pydantic" },
324
+ ]
325
+
326
+ [package.metadata]
327
+ requires-dist = [
328
+ { name = "httpx", specifier = ">=0.27.0" },
329
+ { name = "mcp", specifier = ">=0.9.0" },
330
+ { name = "pydantic", specifier = ">=2.7.0" },
331
331
  { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.2.0" },
332
332
  { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.23.0" },
333
333
  ]
File without changes