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.
- {opensell_cli-0.1.0 → opensell_cli-0.1.2}/PKG-INFO +2 -2
- {opensell_cli-0.1.0 → opensell_cli-0.1.2}/README.md +3 -1
- {opensell_cli-0.1.0 → opensell_cli-0.1.2}/opensell_cli/cli.py +9 -1
- {opensell_cli-0.1.0 → opensell_cli-0.1.2}/opensell_cli/schema_to_click.py +10 -0
- {opensell_cli-0.1.0 → opensell_cli-0.1.2}/pyproject.toml +3 -3
- opensell_cli-0.1.2/tests/test_array_options.py +9 -0
- {opensell_cli-0.1.0 → opensell_cli-0.1.2}/uv.lock +23 -23
- {opensell_cli-0.1.0 → opensell_cli-0.1.2}/.gitignore +0 -0
- {opensell_cli-0.1.0 → opensell_cli-0.1.2}/opensell_cli/__init__.py +0 -0
- {opensell_cli-0.1.0 → opensell_cli-0.1.2}/opensell_cli/catalog.py +0 -0
- {opensell_cli-0.1.0 → opensell_cli-0.1.2}/opensell_cli/execute.py +0 -0
- {opensell_cli-0.1.0 → opensell_cli-0.1.2}/opensell_cli/output.py +0 -0
- {opensell_cli-0.1.0 → opensell_cli-0.1.2}/tests/__init__.py +0 -0
- {opensell_cli-0.1.0 → opensell_cli-0.1.2}/tests/conftest.py +0 -0
- {opensell_cli-0.1.0 → opensell_cli-0.1.2}/tests/test_catalog.py +0 -0
- {opensell_cli-0.1.0 → opensell_cli-0.1.2}/tests/test_cli_e2e.py +0 -0
- {opensell_cli-0.1.0 → opensell_cli-0.1.2}/tests/test_execute.py +0 -0
- {opensell_cli-0.1.0 → opensell_cli-0.1.2}/tests/test_output.py +0 -0
- {opensell_cli-0.1.0 → opensell_cli-0.1.2}/tests/test_schema_to_click.py +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: opensell-cli
|
|
3
|
-
Version: 0.1.
|
|
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
|
-
|
|
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 = {
|
|
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.
|
|
3
|
+
version = "0.1.2"
|
|
4
4
|
description = "OPENSELL marketplace CLI for AI agents"
|
|
5
5
|
requires-python = ">=3.12"
|
|
6
|
-
dependencies = ["
|
|
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
|
-
|
|
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.
|
|
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
|
|
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
|