strictcli 0.20.0__tar.gz → 0.21.0__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 (172) hide show
  1. strictcli-0.21.0/.rlsbl/version +1 -0
  2. strictcli-0.21.0/CHANGELOG.md +32 -0
  3. {strictcli-0.20.0 → strictcli-0.21.0}/PKG-INFO +1 -1
  4. {strictcli-0.20.0 → strictcli-0.21.0}/package-lock.json +2 -2
  5. {strictcli-0.20.0 → strictcli-0.21.0}/package.json +1 -1
  6. {strictcli-0.20.0 → strictcli-0.21.0}/pyproject.toml +1 -1
  7. {strictcli-0.20.0 → strictcli-0.21.0}/strictcli/__init__.py +2403 -330
  8. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_arg_default.py +2 -2
  9. strictcli-0.21.0/tests/test_call.py +552 -0
  10. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_check_discovery.py +132 -0
  11. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_check_public_api.py +64 -0
  12. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_check_runner.py +170 -0
  13. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_check_schema.py +57 -0
  14. strictcli-0.21.0/tests/test_compound_types.py +1057 -0
  15. strictcli-0.21.0/tests/test_config_fields.py +995 -0
  16. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_dump_schema.py +280 -0
  17. strictcli-0.21.0/tests/test_invoke.py +631 -0
  18. strictcli-0.21.0/tests/test_keyword_flags.py +117 -0
  19. strictcli-0.21.0/tests/test_mcp.py +632 -0
  20. strictcli-0.21.0/tests/test_tool_export.py +923 -0
  21. strictcli-0.21.0/tests/test_typed_args.py +849 -0
  22. strictcli-0.21.0/tests/test_visibility.py +439 -0
  23. strictcli-0.21.0/todo/.done/keyword-collision-in-flag-param-name.md +18 -0
  24. {strictcli-0.20.0 → strictcli-0.21.0}/uv.lock +1 -1
  25. strictcli-0.20.0/.rlsbl/bases/.claude/settings.json +0 -3
  26. strictcli-0.20.0/.rlsbl/bases/.github/workflows/ci.yml +0 -22
  27. strictcli-0.20.0/.rlsbl/bases/.github/workflows/publish.yml +0 -27
  28. strictcli-0.20.0/.rlsbl/bases/.gitignore +0 -15
  29. strictcli-0.20.0/.rlsbl/bases/.npmignore +0 -34
  30. strictcli-0.20.0/.rlsbl/bases/.rlsbl/hooks/post-release.sh +0 -8
  31. strictcli-0.20.0/.rlsbl/bases/.rlsbl/hooks/pre-checks.sh +0 -5
  32. strictcli-0.20.0/.rlsbl/bases/.rlsbl/hooks/pre-release.sh +0 -8
  33. strictcli-0.20.0/.rlsbl/bases/.rlsbl/lint/npm.toml +0 -19
  34. strictcli-0.20.0/.rlsbl/bases/.rlsbl/lint/python.toml +0 -25
  35. strictcli-0.20.0/.rlsbl/bases/CHANGELOG.md +0 -5
  36. strictcli-0.20.0/.rlsbl/bases/CLAUDE.md +0 -20
  37. strictcli-0.20.0/.rlsbl/changes/.validated +0 -1
  38. strictcli-0.20.0/.rlsbl/changes/0.10.0.jsonl +0 -6
  39. strictcli-0.20.0/.rlsbl/changes/0.10.0.md +0 -6
  40. strictcli-0.20.0/.rlsbl/changes/0.11.0.jsonl +0 -7
  41. strictcli-0.20.0/.rlsbl/changes/0.11.0.md +0 -5
  42. strictcli-0.20.0/.rlsbl/changes/0.12.0.jsonl +0 -2
  43. strictcli-0.20.0/.rlsbl/changes/0.12.0.md +0 -5
  44. strictcli-0.20.0/.rlsbl/changes/0.13.0.jsonl +0 -3
  45. strictcli-0.20.0/.rlsbl/changes/0.13.0.md +0 -5
  46. strictcli-0.20.0/.rlsbl/changes/0.14.0.jsonl +0 -3
  47. strictcli-0.20.0/.rlsbl/changes/0.14.0.md +0 -5
  48. strictcli-0.20.0/.rlsbl/changes/0.15.0.jsonl +0 -6
  49. strictcli-0.20.0/.rlsbl/changes/0.15.0.md +0 -9
  50. strictcli-0.20.0/.rlsbl/changes/0.15.1.jsonl +0 -6
  51. strictcli-0.20.0/.rlsbl/changes/0.15.1.md +0 -9
  52. strictcli-0.20.0/.rlsbl/changes/0.16.0.jsonl +0 -9
  53. strictcli-0.20.0/.rlsbl/changes/0.16.0.md +0 -18
  54. strictcli-0.20.0/.rlsbl/changes/0.16.1.jsonl +0 -3
  55. strictcli-0.20.0/.rlsbl/changes/0.16.1.md +0 -6
  56. strictcli-0.20.0/.rlsbl/changes/0.17.0.jsonl +0 -3
  57. strictcli-0.20.0/.rlsbl/changes/0.17.0.md +0 -9
  58. strictcli-0.20.0/.rlsbl/changes/0.18.0.jsonl +0 -4
  59. strictcli-0.20.0/.rlsbl/changes/0.18.0.md +0 -5
  60. strictcli-0.20.0/.rlsbl/changes/0.19.0.jsonl +0 -2
  61. strictcli-0.20.0/.rlsbl/changes/0.19.0.md +0 -5
  62. strictcli-0.20.0/.rlsbl/changes/0.20.0.jsonl +0 -4
  63. strictcli-0.20.0/.rlsbl/changes/0.4.0.jsonl +0 -29
  64. strictcli-0.20.0/.rlsbl/changes/0.4.0.md +0 -16
  65. strictcli-0.20.0/.rlsbl/changes/0.4.1.jsonl +0 -4
  66. strictcli-0.20.0/.rlsbl/changes/0.4.1.md +0 -5
  67. strictcli-0.20.0/.rlsbl/changes/0.5.0.jsonl +0 -3
  68. strictcli-0.20.0/.rlsbl/changes/0.5.0.md +0 -5
  69. strictcli-0.20.0/.rlsbl/changes/0.6.0.jsonl +0 -3
  70. strictcli-0.20.0/.rlsbl/changes/0.6.0.md +0 -5
  71. strictcli-0.20.0/.rlsbl/changes/0.6.1.jsonl +0 -6
  72. strictcli-0.20.0/.rlsbl/changes/0.6.1.md +0 -5
  73. strictcli-0.20.0/.rlsbl/changes/0.7.0.jsonl +0 -14
  74. strictcli-0.20.0/.rlsbl/changes/0.7.0.md +0 -10
  75. strictcli-0.20.0/.rlsbl/changes/0.7.1.jsonl +0 -12
  76. strictcli-0.20.0/.rlsbl/changes/0.7.1.md +0 -5
  77. strictcli-0.20.0/.rlsbl/changes/0.8.0.jsonl +0 -7
  78. strictcli-0.20.0/.rlsbl/changes/0.8.0.md +0 -5
  79. strictcli-0.20.0/.rlsbl/changes/0.8.1.jsonl +0 -2
  80. strictcli-0.20.0/.rlsbl/changes/0.8.1.md +0 -3
  81. strictcli-0.20.0/.rlsbl/changes/0.8.2.jsonl +0 -1
  82. strictcli-0.20.0/.rlsbl/changes/0.8.2.md +0 -3
  83. strictcli-0.20.0/.rlsbl/changes/0.8.3.jsonl +0 -1
  84. strictcli-0.20.0/.rlsbl/changes/0.8.3.md +0 -3
  85. strictcli-0.20.0/.rlsbl/changes/0.8.4.jsonl +0 -3
  86. strictcli-0.20.0/.rlsbl/changes/0.8.4.md +0 -5
  87. strictcli-0.20.0/.rlsbl/changes/0.8.5.jsonl +0 -7
  88. strictcli-0.20.0/.rlsbl/changes/0.8.5.md +0 -9
  89. strictcli-0.20.0/.rlsbl/changes/0.8.6.jsonl +0 -6
  90. strictcli-0.20.0/.rlsbl/changes/0.8.6.md +0 -5
  91. strictcli-0.20.0/.rlsbl/changes/0.8.7.jsonl +0 -5
  92. strictcli-0.20.0/.rlsbl/changes/0.8.7.md +0 -9
  93. strictcli-0.20.0/.rlsbl/changes/0.9.0.jsonl +0 -5
  94. strictcli-0.20.0/.rlsbl/changes/0.9.0.md +0 -5
  95. strictcli-0.20.0/.rlsbl/changes/0.9.1.jsonl +0 -9
  96. strictcli-0.20.0/.rlsbl/changes/0.9.1.md +0 -9
  97. strictcli-0.20.0/.rlsbl/changes/unreleased.jsonl +0 -0
  98. strictcli-0.20.0/.rlsbl/hooks/post-release.sh +0 -8
  99. strictcli-0.20.0/.rlsbl/hooks/pre-checks.sh +0 -10
  100. strictcli-0.20.0/.rlsbl/hooks/pre-release.sh +0 -13
  101. strictcli-0.20.0/.rlsbl/lint/npm.toml +0 -19
  102. strictcli-0.20.0/.rlsbl/lint/python.toml +0 -25
  103. strictcli-0.20.0/.rlsbl/releases/unreleased.toml +0 -0
  104. strictcli-0.20.0/.rlsbl/releases/v0.10.0.toml +0 -3
  105. strictcli-0.20.0/.rlsbl/releases/v0.11.0.toml +0 -3
  106. strictcli-0.20.0/.rlsbl/releases/v0.12.0.toml +0 -4
  107. strictcli-0.20.0/.rlsbl/releases/v0.13.0.toml +0 -4
  108. strictcli-0.20.0/.rlsbl/releases/v0.15.0.toml +0 -8
  109. strictcli-0.20.0/.rlsbl/releases/v0.15.1.toml +0 -8
  110. strictcli-0.20.0/.rlsbl/releases/v0.16.0.toml +0 -8
  111. strictcli-0.20.0/.rlsbl/releases/v0.16.1.toml +0 -8
  112. strictcli-0.20.0/.rlsbl/releases/v0.17.0.toml +0 -8
  113. strictcli-0.20.0/.rlsbl/releases/v0.18.0.toml +0 -8
  114. strictcli-0.20.0/.rlsbl/releases/v0.19.0.toml +0 -0
  115. strictcli-0.20.0/.rlsbl/releases/v0.20.0.toml +0 -8
  116. strictcli-0.20.0/.rlsbl/releases/v0.8.5.toml +0 -3
  117. strictcli-0.20.0/.rlsbl/releases/v0.8.6.toml +0 -3
  118. strictcli-0.20.0/.rlsbl/releases/v0.8.7.toml +0 -3
  119. strictcli-0.20.0/.rlsbl/releases/v0.9.0.toml +0 -3
  120. strictcli-0.20.0/.rlsbl/releases/v0.9.1.toml +0 -3
  121. strictcli-0.20.0/.rlsbl/version +0 -1
  122. strictcli-0.20.0/CHANGELOG.md +0 -286
  123. strictcli-0.20.0/LICENSE +0 -21
  124. {strictcli-0.20.0 → strictcli-0.21.0}/.claude/settings.json +0 -0
  125. {strictcli-0.20.0 → strictcli-0.21.0}/.github/workflows/ci.yml +0 -0
  126. {strictcli-0.20.0 → strictcli-0.21.0}/.github/workflows/publish.yml +0 -0
  127. {strictcli-0.20.0 → strictcli-0.21.0}/.gitignore +0 -0
  128. {strictcli-0.20.0 → strictcli-0.21.0}/.npmignore +0 -0
  129. {strictcli-0.20.0 → strictcli-0.21.0}/.rlsbl/config.json +0 -0
  130. {strictcli-0.20.0 → strictcli-0.21.0}/.rlsbl/hashes.json +0 -0
  131. {strictcli-0.20.0 → strictcli-0.21.0}/.strictcli/schema.json +0 -0
  132. {strictcli-0.20.0 → strictcli-0.21.0}/CLAUDE.md +0 -0
  133. {strictcli-0.20.0/.rlsbl/bases → strictcli-0.21.0}/LICENSE +0 -0
  134. {strictcli-0.20.0 → strictcli-0.21.0}/README.md +0 -0
  135. {strictcli-0.20.0 → strictcli-0.21.0}/index.js +0 -0
  136. {strictcli-0.20.0 → strictcli-0.21.0}/postinstall.js +0 -0
  137. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_at_prefix.py +0 -0
  138. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_auto_version.py +0 -0
  139. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_check_command.py +0 -0
  140. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_check_types.py +0 -0
  141. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_choices.py +0 -0
  142. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_command_help_suggestion.py +0 -0
  143. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_command_tags.py +0 -0
  144. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_config.py +0 -0
  145. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_config_file_path.py +0 -0
  146. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_config_set_bugs.py +0 -0
  147. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_deep_nesting.py +0 -0
  148. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_dependencies.py +0 -0
  149. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_deprecated.py +0 -0
  150. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_e2e.py +0 -0
  151. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_env.py +0 -0
  152. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_exit_codes.py +0 -0
  153. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_flag_sets.py +0 -0
  154. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_float_type.py +0 -0
  155. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_global_flags.py +0 -0
  156. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_help.py +0 -0
  157. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_int_type.py +0 -0
  158. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_mutex.py +0 -0
  159. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_nesting.py +0 -0
  160. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_parser.py +0 -0
  161. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_passthrough.py +0 -0
  162. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_registration.py +0 -0
  163. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_repeatable.py +0 -0
  164. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_tagdsl.py +0 -0
  165. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_toml_loading.py +0 -0
  166. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_unique.py +0 -0
  167. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_utilities.py +0 -0
  168. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_validate.py +0 -0
  169. {strictcli-0.20.0 → strictcli-0.21.0}/tests/test_variadic.py +0 -0
  170. {strictcli-0.20.0 → strictcli-0.21.0}/todo/.defer/deferred.md +0 -0
  171. {strictcli-0.20.0 → strictcli-0.21.0}/todo/.done/original-idea.md +0 -0
  172. {strictcli-0.20.0 → strictcli-0.21.0}/todo/.done/public-check-runner-api.md +0 -0
@@ -0,0 +1 @@
1
+ 0.81.7
@@ -0,0 +1,32 @@
1
+ <!-- Generated by rlsbl from .rlsbl/changes/ — do not edit -->
2
+
3
+ # Changelog
4
+
5
+ ## 0.21.0
6
+
7
+ Command declaration framework: structured handler returns, programmatic invocation, typed args, config fields, compound types, tool export, MCP projection, and scope-based check filtering.
8
+
9
+ <details>
10
+ <summary>Context</summary>
11
+
12
+ This release transforms strictcli from a CLI framework into a command declaration framework with multiple output projections. Commands declared once can be invoked via CLI (existing), programmatic API (app.call/acall), tool export (as_tools with JSON Schema), and MCP server (--mcp flag).
13
+
14
+ Key additions: handlers can return structured data (backward compatible -- int returns still work), positional args gain type and choices support, first-class config fields with per-command binding and startup validation, compound types (list[T] and dict[str,T]), command visibility (hidden/interactive), schema enrichment with versioning and constraint serialization, and declarative scope field on check definitions with set_scope_adapter() for context-dependent pre-check filtering.
15
+
16
+ </details>
17
+
18
+ ### Features
19
+
20
+ - **New feature.** Programmatic invocation via `app.call()` and `app.acall()` with `InvokeError` exception for structured error handling.
21
+ - **New feature.** Schema versioning with `schema_version` field, constraint serialization (mutex, CoRequired, Requires, Implies), tag contracts, and arg defaults in `--dump-schema` output.
22
+ - **New feature.** Typed positional args with `type` (str/int/float/bool) and `choices` support, matching the flag type system.
23
+ - **New feature.** Command visibility: `hidden` and `interactive` declarations with help text filtering and schema serialization.
24
+ - **New feature.** First-class config fields with `config_field()` declarations, per-command binding, startup validation, `config init` template generation, and unknown-key rejection.
25
+ - **New feature.** Compound types `list[T]` and `dict[str, T]` on flags and args with projection-specific CLI parsing.
26
+ - **New feature.** Tool export: `json_schema()`, `as_tools()`, `Tool` dataclass, and router tool for AI agent integration.
27
+ - **New feature.** MCP projection via `serve_mcp()` and `--mcp` flag for Model Context Protocol tool serving.
28
+ - **New feature.** Optional `scope` field on check definitions for declarative pre-check context filtering, and `set_scope_adapter()` method on App for registering scope transformation callbacks.
29
+
30
+ ### Fixes
31
+
32
+ - **Fix.** Validate unknown kwargs and enforce required globals in passthrough invoke path.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: strictcli
3
- Version: 0.20.0
3
+ Version: 0.21.0
4
4
  Summary: A strict, zero-dependency CLI framework for Python
5
5
  Project-URL: Homepage, https://github.com/smm-h/strictcli
6
6
  Project-URL: Repository, https://github.com/smm-h/strictcli
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "strictcli",
3
- "version": "0.20.0",
3
+ "version": "0.21.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "strictcli",
9
- "version": "0.20.0",
9
+ "version": "0.21.0",
10
10
  "hasInstallScript": true,
11
11
  "license": "MIT"
12
12
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "strictcli",
3
- "version": "0.20.0",
3
+ "version": "0.21.0",
4
4
  "description": "A strict, zero-dependency CLI framework for Python (npm wrapper)",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "strictcli"
7
- version = "0.20.0"
7
+ version = "0.21.0"
8
8
  description = "A strict, zero-dependency CLI framework for Python"
9
9
  readme = "README.md"
10
10
  license = "MIT"