apcore-cli 0.12.2__tar.gz → 0.12.4__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 (109) hide show
  1. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/CHANGELOG.md +17 -0
  2. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/PKG-INFO +4 -4
  3. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/README.md +1 -1
  4. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/pyproject.toml +3 -3
  5. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/init_cmd.py +9 -1
  6. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_cli.py +37 -0
  7. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_init_cmd.py +8 -0
  8. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/.github/CODEOWNERS +0 -0
  9. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/.github/copilot-ignore +0 -0
  10. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/.github/workflows/ci.yml +0 -0
  11. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/.gitignore +0 -0
  12. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/.gitmessage +0 -0
  13. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/.pre-commit-config.yaml +0 -0
  14. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/CLAUDE.md +0 -0
  15. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/LICENSE +0 -0
  16. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/Makefile +0 -0
  17. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/examples/README.md +0 -0
  18. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/examples/extensions/math/add.py +0 -0
  19. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/examples/extensions/math/multiply.py +0 -0
  20. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/examples/extensions/sysutil/disk.py +0 -0
  21. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/examples/extensions/sysutil/env.py +0 -0
  22. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/examples/extensions/sysutil/info.py +0 -0
  23. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/examples/extensions/text/reverse.py +0 -0
  24. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/examples/extensions/text/upper.py +0 -0
  25. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/examples/extensions/text/wordcount.py +0 -0
  26. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/examples/run_examples.sh +0 -0
  27. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/planning/approval-gate.md +0 -0
  28. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/planning/config-resolver.md +0 -0
  29. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/planning/core-dispatcher.md +0 -0
  30. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/planning/discovery.md +0 -0
  31. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/planning/exposure-filtering.md +0 -0
  32. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/planning/grouped-commands.md +0 -0
  33. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/planning/output-formatter.md +0 -0
  34. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/planning/overview.md +0 -0
  35. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/planning/schema-parser.md +0 -0
  36. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/planning/security-manager.md +0 -0
  37. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/planning/shell-integration.md +0 -0
  38. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/planning/state.json +0 -0
  39. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/__init__.py +0 -0
  40. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/__main__.py +0 -0
  41. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/_sandbox_runner.py +0 -0
  42. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/acl_cmd.py +0 -0
  43. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/acl_loader.py +0 -0
  44. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/approval.py +0 -0
  45. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/builtin_group.py +0 -0
  46. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/cli.py +0 -0
  47. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/config.py +0 -0
  48. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/discovery.py +0 -0
  49. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/display_helpers.py +0 -0
  50. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/exit_codes.py +0 -0
  51. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/exposure.py +0 -0
  52. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/factory.py +0 -0
  53. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/openapi_cmd.py +0 -0
  54. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/openapi_source.py +0 -0
  55. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/output.py +0 -0
  56. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/ref_resolver.py +0 -0
  57. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/schema_parser.py +0 -0
  58. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/security/__init__.py +0 -0
  59. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/security/audit.py +0 -0
  60. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/security/auth.py +0 -0
  61. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/security/config_encryptor.py +0 -0
  62. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/security/sandbox.py +0 -0
  63. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/shell.py +0 -0
  64. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/strategy.py +0 -0
  65. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/system_cmd.py +0 -0
  66. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/system_usage.py +0 -0
  67. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/src/apcore_cli/validate.py +0 -0
  68. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/__init__.py +0 -0
  69. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/conformance/__init__.py +0 -0
  70. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/conformance/test_apcli_visibility.py +0 -0
  71. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/conformance/test_snake_case_kwargs.py +0 -0
  72. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/conftest.py +0 -0
  73. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/shell_test_utils.py +0 -0
  74. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_acl_cmd.py +0 -0
  75. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_acl_loader.py +0 -0
  76. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_apcli_integration.py +0 -0
  77. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_approval.py +0 -0
  78. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_bugfixes.py +0 -0
  79. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_builtin_group.py +0 -0
  80. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_config.py +0 -0
  81. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_discovery.py +0 -0
  82. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_discovery_fe13.py +0 -0
  83. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_display_helpers.py +0 -0
  84. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_e2e.py +0 -0
  85. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_exit_codes.py +0 -0
  86. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_exposure.py +0 -0
  87. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_factory_fe13.py +0 -0
  88. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_integration.py +0 -0
  89. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_list_command_filters.py +0 -0
  90. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_openapi_cmd.py +0 -0
  91. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_openapi_source.py +0 -0
  92. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_output.py +0 -0
  93. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_output_format_exec.py +0 -0
  94. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_output_format_markdown_skill.py +0 -0
  95. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_public_api.py +0 -0
  96. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_ref_resolver.py +0 -0
  97. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_sandbox_runner.py +0 -0
  98. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_schema_parser.py +0 -0
  99. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_security/__init__.py +0 -0
  100. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_security/test_audit.py +0 -0
  101. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_security/test_auth.py +0 -0
  102. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_security/test_config_encryptor.py +0 -0
  103. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_security/test_sandbox.py +0 -0
  104. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_shell.py +0 -0
  105. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_strategy.py +0 -0
  106. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_system_cmd.py +0 -0
  107. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_system_usage.py +0 -0
  108. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_toolkit_integration.py +0 -0
  109. {apcore_cli-0.12.2 → apcore_cli-0.12.4}/tests/test_validate.py +0 -0
@@ -5,6 +5,23 @@ All notable changes to apcore-cli (Python SDK) will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.12.3] - 2026-10-10
9
+
10
+ ### Changed
11
+
12
+ - Upgrade the required apcore floor to 0.32.0 and apcore-toolkit to 0.14.0. Public executor, loader, scanner, display and formatter interfaces consumed by this CLI remain compatible.
13
+ - Binding documents now inherit toolkit 0.14.0's stricter validation: unknown document/entry keys and one-sided inline schema pairs fail in both modes; non-list `tags` fail in strict mode. Move application-specific entry data into `metadata` and supply both inline schemas. Runtime-only `auto_schema` / `schema_ref` entries require apcore's runtime loader, which this CLI's toolkit integration does not use.
14
+
15
+ ### Fixed
16
+
17
+ - `apcli init module --style binding` emits paired inline schemas instead of `auto_schema: true`, making generated scaffolds load through toolkit 0.14.0 in loose and strict modes. The schemas describe the generated no-argument function and its `status: string` result.
18
+
19
+ ### Compatibility verification
20
+
21
+ - Native apcore validators exercise the canonical `details.errors` shape (`path`, `keyword`, `message`) through JSON and terminal error output, covering root `""`, nested-array `/items/0/count` and escaped `/a~1b~0c` pointers. CLI exit remains 45. The CLI never reads a legacy `field` member and its JSON output preserves details verbatim.
22
+ - Governance-provider/gate and logging fixes, immediate scoped timeouts, collect-all preflight, binding runtime validation, namespace dispatch, watcher/reload, task/store, nested-call and middleware/observability changes run inside apcore; no additional CLI call-site adaptation is required. MCP export-profile changes and the additive bare-name canonicalization API are not consumed here. OpenAPI generation already supplies both inline schemas.
23
+ - Full suite: **1024 passed, 0 failed, 6 xfailed** against published PyPI apcore 0.32.0 and apcore-toolkit 0.14.0; Ruff lint and changed-file formatting pass.
24
+
8
25
  ## [0.12.2] - 2026-09-29
9
26
 
10
27
  ### Changed — BREAKING
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: apcore-cli
3
- Version: 0.12.2
3
+ Version: 0.12.4
4
4
  Summary: Terminal adapter for apcore — execute AI-Perceivable modules from the command line
5
5
  Project-URL: Homepage, https://aiperceivable.com
6
6
  Project-URL: Repository, https://github.com/aiperceivable/apcore-cli-python
@@ -21,8 +21,8 @@ Classifier: Programming Language :: Python :: 3.13
21
21
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
22
22
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
23
23
  Requires-Python: >=3.11
24
- Requires-Dist: apcore-toolkit[http-proxy]>=0.13.0
25
- Requires-Dist: apcore>=0.31.0
24
+ Requires-Dist: apcore-toolkit[http-proxy]>=0.14.0
25
+ Requires-Dist: apcore>=0.32.1
26
26
  Requires-Dist: click>=8.1
27
27
  Requires-Dist: cryptography>=41.0
28
28
  Requires-Dist: jsonschema>=4.20
@@ -89,7 +89,7 @@ Terminal adapter for apcore. Execute AI-Perceivable modules from the command lin
89
89
  pip install apcore-cli
90
90
  ```
91
91
 
92
- Requires Python 3.11+, `apcore >= 0.21.0`, and `apcore-toolkit >= 0.13.0` (now a **required** runtime dependency as of v0.9.0 — previously optional; see the [tech-design ADR-09](https://github.com/aiperceivable/apcore-cli/blob/main/docs/tech-design.md) for the byte-equivalent toolkit-delegated tier rationale). The `[toolkit]` extras group is retained as a no-op for backward compat:
92
+ Requires Python 3.11+, `apcore >= 0.32.0`, and `apcore-toolkit >= 0.14.0` (now a **required** runtime dependency as of v0.9.0 — previously optional; see the [tech-design ADR-09](https://github.com/aiperceivable/apcore-cli/blob/main/docs/tech-design.md) for the byte-equivalent toolkit-delegated tier rationale). The `[toolkit]` extras group is retained as a no-op for backward compat:
93
93
 
94
94
  ```bash
95
95
  pip install "apcore-cli[toolkit]" # equivalent to plain `pip install apcore-cli`
@@ -48,7 +48,7 @@ Terminal adapter for apcore. Execute AI-Perceivable modules from the command lin
48
48
  pip install apcore-cli
49
49
  ```
50
50
 
51
- Requires Python 3.11+, `apcore >= 0.21.0`, and `apcore-toolkit >= 0.13.0` (now a **required** runtime dependency as of v0.9.0 — previously optional; see the [tech-design ADR-09](https://github.com/aiperceivable/apcore-cli/blob/main/docs/tech-design.md) for the byte-equivalent toolkit-delegated tier rationale). The `[toolkit]` extras group is retained as a no-op for backward compat:
51
+ Requires Python 3.11+, `apcore >= 0.32.0`, and `apcore-toolkit >= 0.14.0` (now a **required** runtime dependency as of v0.9.0 — previously optional; see the [tech-design ADR-09](https://github.com/aiperceivable/apcore-cli/blob/main/docs/tech-design.md) for the byte-equivalent toolkit-delegated tier rationale). The `[toolkit]` extras group is retained as a no-op for backward compat:
52
52
 
53
53
  ```bash
54
54
  pip install "apcore-cli[toolkit]" # equivalent to plain `pip install apcore-cli`
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "apcore-cli"
7
- version = "0.12.2"
7
+ version = "0.12.4"
8
8
  description = "Terminal adapter for apcore — execute AI-Perceivable modules from the command line"
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
@@ -26,8 +26,8 @@ classifiers = [
26
26
  "Environment :: Console",
27
27
  ]
28
28
  dependencies = [
29
- "apcore>=0.31.0",
30
- "apcore-toolkit[http-proxy]>=0.13.0",
29
+ "apcore>=0.32.1",
30
+ "apcore-toolkit[http-proxy]>=0.14.0",
31
31
  "click>=8.1",
32
32
  "jsonschema>=4.20",
33
33
  "rich>=13.0",
@@ -39,7 +39,15 @@ _BINDING_TEMPLATE = """bindings:
39
39
  - module_id: "{module_id}"
40
40
  target: "{target}"
41
41
  description: "{description}"
42
- auto_schema: true
42
+ input_schema:
43
+ type: object
44
+ properties: {{}}
45
+ output_schema:
46
+ type: object
47
+ properties:
48
+ status:
49
+ type: string
50
+ required: [status]
43
51
  """
44
52
 
45
53
 
@@ -1351,3 +1351,40 @@ class TestBuildModuleCommandRefResolverErrorTranslation:
1351
1351
  with pytest.raises(SystemExit) as excinfo:
1352
1352
  build_module_command(module_def, executor)
1353
1353
  assert excinfo.value.code == 48
1354
+
1355
+
1356
+ @pytest.mark.parametrize("tty", [False, True])
1357
+ def test_native_validation_errors_preserve_json_pointers(tty, capsys):
1358
+ import json
1359
+
1360
+ from apcore.errors import SchemaValidationError
1361
+ from apcore.schema import SchemaValidator
1362
+ from pydantic import Field, create_model
1363
+
1364
+ from apcore_cli.cli import _emit_error_json, _emit_error_tty
1365
+
1366
+ item = create_model("ValidationItem", count=(int, ...))
1367
+ model = create_model(
1368
+ "ValidationInput",
1369
+ count=(int, ...),
1370
+ items=(list[item], ...),
1371
+ escaped=(int, Field(alias="a/b~c")),
1372
+ )
1373
+ with pytest.raises(SchemaValidationError) as caught:
1374
+ SchemaValidator().validate_input({"items": [{"count": "bad"}], "a/b~c": "bad"}, model)
1375
+ error = caught.value
1376
+ assert error.code == "SCHEMA_VALIDATION_ERROR"
1377
+ emit = _emit_error_tty if tty else _emit_error_json
1378
+ emit(error, 45)
1379
+ output = capsys.readouterr().err
1380
+ if tty:
1381
+ assert "/items/0/count" in output
1382
+ assert "/a~1b~0c" in output
1383
+ assert "unknown" not in output
1384
+ else:
1385
+ payload = json.loads(output)
1386
+ assert payload["exit_code"] == 45
1387
+ assert payload["details"] == error.details
1388
+ errors = payload["details"]["errors"]
1389
+ assert {entry["path"] for entry in errors} == {"", "/items/0/count", "/a~1b~0c"}
1390
+ assert all(set(entry) == {"path", "keyword", "message"} for entry in errors)
@@ -45,6 +45,14 @@ class TestInitModule:
45
45
  assert len(yaml_files) == 1
46
46
  content = yaml_files[0].read_text()
47
47
  assert "ops.deploy" in content
48
+ from apcore_toolkit import BindingLoader
49
+
50
+ for strict in (False, True):
51
+ modules = BindingLoader().load(str(yaml_files[0]), strict=strict)
52
+ assert len(modules) == 1
53
+ assert modules[0].module_id == "ops.deploy"
54
+ assert modules[0].input_schema == {"type": "object", "properties": {}}
55
+ assert modules[0].output_schema["properties"]["status"] == {"type": "string"}
48
56
 
49
57
  def test_init_convention_has_cli_group(self, cli, tmp_path):
50
58
  runner = CliRunner()
File without changes
File without changes
File without changes
File without changes
File without changes