strictcli 0.18.0__tar.gz → 0.20.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 (164) hide show
  1. strictcli-0.20.0/.rlsbl/changes/.validated +1 -0
  2. strictcli-0.20.0/.rlsbl/changes/0.19.0.jsonl +2 -0
  3. strictcli-0.20.0/.rlsbl/changes/0.19.0.md +5 -0
  4. strictcli-0.20.0/.rlsbl/changes/0.20.0.jsonl +4 -0
  5. strictcli-0.20.0/.rlsbl/releases/v0.19.0.toml +0 -0
  6. strictcli-0.20.0/.rlsbl/releases/v0.20.0.toml +8 -0
  7. strictcli-0.20.0/.rlsbl/version +1 -0
  8. {strictcli-0.18.0 → strictcli-0.20.0}/CHANGELOG.md +57 -0
  9. {strictcli-0.18.0 → strictcli-0.20.0}/PKG-INFO +7 -7
  10. {strictcli-0.18.0 → strictcli-0.20.0}/README.md +6 -6
  11. {strictcli-0.18.0 → strictcli-0.20.0}/package-lock.json +2 -2
  12. {strictcli-0.18.0 → strictcli-0.20.0}/package.json +1 -1
  13. {strictcli-0.18.0 → strictcli-0.20.0}/pyproject.toml +1 -1
  14. {strictcli-0.18.0 → strictcli-0.20.0}/strictcli/__init__.py +139 -45
  15. strictcli-0.20.0/tests/test_command_tags.py +419 -0
  16. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_e2e.py +8 -8
  17. strictcli-0.18.0/tests/test_tags.py → strictcli-0.20.0/tests/test_flag_sets.py +22 -22
  18. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_passthrough.py +5 -5
  19. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_registration.py +4 -4
  20. {strictcli-0.18.0 → strictcli-0.20.0}/uv.lock +1 -1
  21. strictcli-0.18.0/.rlsbl/bases/.rlsbl/lint/go.toml +0 -17
  22. strictcli-0.18.0/.rlsbl/changes/.validated +0 -1
  23. strictcli-0.18.0/.rlsbl/lint/go.toml +0 -17
  24. strictcli-0.18.0/.rlsbl/version +0 -1
  25. {strictcli-0.18.0 → strictcli-0.20.0}/.claude/settings.json +0 -0
  26. {strictcli-0.18.0 → strictcli-0.20.0}/.github/workflows/ci.yml +0 -0
  27. {strictcli-0.18.0 → strictcli-0.20.0}/.github/workflows/publish.yml +0 -0
  28. {strictcli-0.18.0 → strictcli-0.20.0}/.gitignore +0 -0
  29. {strictcli-0.18.0 → strictcli-0.20.0}/.npmignore +0 -0
  30. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/.claude/settings.json +0 -0
  31. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/.github/workflows/ci.yml +0 -0
  32. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/.github/workflows/publish.yml +0 -0
  33. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/.gitignore +0 -0
  34. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/.npmignore +0 -0
  35. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/.rlsbl/hooks/post-release.sh +0 -0
  36. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/.rlsbl/hooks/pre-checks.sh +0 -0
  37. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/.rlsbl/hooks/pre-release.sh +0 -0
  38. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/.rlsbl/lint/npm.toml +0 -0
  39. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/.rlsbl/lint/python.toml +0 -0
  40. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/CHANGELOG.md +0 -0
  41. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/CLAUDE.md +0 -0
  42. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/bases/LICENSE +0 -0
  43. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.10.0.jsonl +0 -0
  44. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.10.0.md +0 -0
  45. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.11.0.jsonl +0 -0
  46. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.11.0.md +0 -0
  47. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.12.0.jsonl +0 -0
  48. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.12.0.md +0 -0
  49. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.13.0.jsonl +0 -0
  50. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.13.0.md +0 -0
  51. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.14.0.jsonl +0 -0
  52. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.14.0.md +0 -0
  53. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.15.0.jsonl +0 -0
  54. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.15.0.md +0 -0
  55. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.15.1.jsonl +0 -0
  56. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.15.1.md +0 -0
  57. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.16.0.jsonl +0 -0
  58. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.16.0.md +0 -0
  59. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.16.1.jsonl +0 -0
  60. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.16.1.md +0 -0
  61. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.17.0.jsonl +0 -0
  62. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.17.0.md +0 -0
  63. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.18.0.jsonl +0 -0
  64. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.18.0.md +0 -0
  65. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.4.0.jsonl +0 -0
  66. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.4.0.md +0 -0
  67. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.4.1.jsonl +0 -0
  68. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.4.1.md +0 -0
  69. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.5.0.jsonl +0 -0
  70. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.5.0.md +0 -0
  71. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.6.0.jsonl +0 -0
  72. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.6.0.md +0 -0
  73. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.6.1.jsonl +0 -0
  74. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.6.1.md +0 -0
  75. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.7.0.jsonl +0 -0
  76. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.7.0.md +0 -0
  77. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.7.1.jsonl +0 -0
  78. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.7.1.md +0 -0
  79. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.0.jsonl +0 -0
  80. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.0.md +0 -0
  81. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.1.jsonl +0 -0
  82. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.1.md +0 -0
  83. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.2.jsonl +0 -0
  84. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.2.md +0 -0
  85. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.3.jsonl +0 -0
  86. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.3.md +0 -0
  87. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.4.jsonl +0 -0
  88. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.4.md +0 -0
  89. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.5.jsonl +0 -0
  90. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.5.md +0 -0
  91. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.6.jsonl +0 -0
  92. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.6.md +0 -0
  93. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.7.jsonl +0 -0
  94. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.8.7.md +0 -0
  95. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.9.0.jsonl +0 -0
  96. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.9.0.md +0 -0
  97. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.9.1.jsonl +0 -0
  98. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/0.9.1.md +0 -0
  99. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/changes/unreleased.jsonl +0 -0
  100. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/config.json +0 -0
  101. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/hashes.json +0 -0
  102. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/hooks/post-release.sh +0 -0
  103. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/hooks/pre-checks.sh +0 -0
  104. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/hooks/pre-release.sh +0 -0
  105. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/lint/npm.toml +0 -0
  106. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/lint/python.toml +0 -0
  107. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/unreleased.toml +0 -0
  108. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.10.0.toml +0 -0
  109. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.11.0.toml +0 -0
  110. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.12.0.toml +0 -0
  111. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.13.0.toml +0 -0
  112. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.15.0.toml +0 -0
  113. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.15.1.toml +0 -0
  114. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.16.0.toml +0 -0
  115. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.16.1.toml +0 -0
  116. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.17.0.toml +0 -0
  117. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.18.0.toml +0 -0
  118. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.8.5.toml +0 -0
  119. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.8.6.toml +0 -0
  120. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.8.7.toml +0 -0
  121. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.9.0.toml +0 -0
  122. {strictcli-0.18.0 → strictcli-0.20.0}/.rlsbl/releases/v0.9.1.toml +0 -0
  123. {strictcli-0.18.0 → strictcli-0.20.0}/.strictcli/schema.json +0 -0
  124. {strictcli-0.18.0 → strictcli-0.20.0}/CLAUDE.md +0 -0
  125. {strictcli-0.18.0 → strictcli-0.20.0}/LICENSE +0 -0
  126. {strictcli-0.18.0 → strictcli-0.20.0}/index.js +0 -0
  127. {strictcli-0.18.0 → strictcli-0.20.0}/postinstall.js +0 -0
  128. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_arg_default.py +0 -0
  129. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_at_prefix.py +0 -0
  130. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_auto_version.py +0 -0
  131. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_check_command.py +0 -0
  132. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_check_discovery.py +0 -0
  133. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_check_public_api.py +0 -0
  134. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_check_runner.py +0 -0
  135. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_check_schema.py +0 -0
  136. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_check_types.py +0 -0
  137. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_choices.py +0 -0
  138. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_command_help_suggestion.py +0 -0
  139. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_config.py +0 -0
  140. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_config_file_path.py +0 -0
  141. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_config_set_bugs.py +0 -0
  142. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_deep_nesting.py +0 -0
  143. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_dependencies.py +0 -0
  144. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_deprecated.py +0 -0
  145. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_dump_schema.py +0 -0
  146. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_env.py +0 -0
  147. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_exit_codes.py +0 -0
  148. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_float_type.py +0 -0
  149. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_global_flags.py +0 -0
  150. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_help.py +0 -0
  151. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_int_type.py +0 -0
  152. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_mutex.py +0 -0
  153. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_nesting.py +0 -0
  154. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_parser.py +0 -0
  155. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_repeatable.py +0 -0
  156. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_tagdsl.py +0 -0
  157. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_toml_loading.py +0 -0
  158. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_unique.py +0 -0
  159. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_utilities.py +0 -0
  160. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_validate.py +0 -0
  161. {strictcli-0.18.0 → strictcli-0.20.0}/tests/test_variadic.py +0 -0
  162. {strictcli-0.18.0 → strictcli-0.20.0}/todo/.defer/deferred.md +0 -0
  163. {strictcli-0.18.0 → strictcli-0.20.0}/todo/.done/original-idea.md +0 -0
  164. {strictcli-0.18.0 → strictcli-0.20.0}/todo/.done/public-check-runner-api.md +0 -0
@@ -0,0 +1 @@
1
+ 019cae063cca2c44324d0c76260c72e72334b7c8
@@ -0,0 +1,2 @@
1
+ {"commits":["03d0cd60c4d207b568a19bf6916f58aacdac1450","5a1368de51cbe0abe465f21f3a38f78ba1746fef"],"user_facing":true,"description":"**Breaking.** Renamed `Tag` to `FlagSet` and `tags=` parameter to `flag_sets=` across all API surfaces.","type":"breaking"}
2
+ {"commits":["03782821de6b48073259aa3edb66b141ab70eb3b","232a6e47db207159abfdb81a5e1b93c1cfce82ea","fa29d925446a00a2bddec93cb949f91f13682704"],"user_facing":false}
@@ -0,0 +1,5 @@
1
+ ## 0.19.0
2
+
3
+ ### Breaking
4
+
5
+ - **Breaking.** Renamed `Tag` to `FlagSet` and `tags=` parameter to `flag_sets=` across all API surfaces.
@@ -0,0 +1,4 @@
1
+ {"commits":["9e7e116531923a9db84c2f9e7fc6326a9bf01079","a68465be720ee0728e72a09f5ba6bd3d563a9600"],"user_facing":true,"description":"**Breaking.** Command dataclass is now `frozen=True` with `tuple` fields instead of `list`.","type":"breaking"}
2
+ {"commits":["c5009427ea363e04d8c0096a1ec0628547317866","7808c1c5b08272af346aa4d0e9d69ff3ccef8c78"],"user_facing":true,"description":"**New.** Command tags: string labels on commands and groups with group-to-command inheritance.","type":"feature"}
3
+ {"commits":["ef7a4711dbcf7c0a53a3666de4507aab7c1cf9e0"],"user_facing":true,"description":"**New.** Tag contracts: registration-time validation that tagged commands have required flags.","type":"feature"}
4
+ {"commits":["bc911b9134605042b454bc2192c3fe68ee6f92bf","ff5ff5aa65b216fec2788f942751f11a8ca8b243"],"user_facing":false}
File without changes
@@ -0,0 +1,8 @@
1
+ # Version bump type: patch, minor, or major
2
+ bump = "minor"
3
+ # Short description of this release (required)
4
+ description = "Frozen Command, command tags, tag contracts"
5
+ # Optional context explaining why these changes were made
6
+ context = "Breaking: Command dataclass is now frozen=True with tuple fields (was mutable list). New: command tags (string labels with group inheritance) and tag contracts (registration-time validation that tagged commands have required flags)."
7
+ include = ["pypi", "npm"]
8
+ exclude = []
@@ -0,0 +1 @@
1
+ 0.69.2
@@ -2,6 +2,32 @@
2
2
 
3
3
  # Changelog
4
4
 
5
+ ## 0.20.0
6
+
7
+ Frozen Command, command tags, tag contracts
8
+
9
+ <details>
10
+ <summary>Context</summary>
11
+
12
+ Breaking: Command dataclass is now frozen=True with tuple fields (was mutable list). New: command tags (string labels with group inheritance) and tag contracts (registration-time validation that tagged commands have required flags).
13
+
14
+ </details>
15
+
16
+ ### Breaking
17
+
18
+ - **Breaking.** Command dataclass is now `frozen=True` with `tuple` fields instead of `list`.
19
+
20
+ ### Features
21
+
22
+ - **New.** Command tags: string labels on commands and groups with group-to-command inheritance.
23
+ - **New.** Tag contracts: registration-time validation that tagged commands have required flags.
24
+
25
+ ## 0.19.0
26
+
27
+ ### Breaking
28
+
29
+ - **Breaking.** Renamed `Tag` to `FlagSet` and `tags=` parameter to `flag_sets=` across all API surfaces.
30
+
5
31
  ## 0.18.0
6
32
 
7
33
  Public API for running checks programmatically
@@ -19,6 +45,8 @@ Adds App.run_checks(), format_check_results(), format_check_results_json(), and
19
45
 
20
46
  ## 0.17.0
21
47
 
48
+ Repeatable flag default validation and help text display
49
+
22
50
  ### Breaking
23
51
 
24
52
  - **Breaking.** Repeatable flag defaults are now validated at registration: must be a list, `default=[]` is rejected as redundant, and element types must match the flag type.
@@ -29,6 +57,8 @@ Adds App.run_checks(), format_check_results(), format_check_results_json(), and
29
57
 
30
58
  ## 0.16.1
31
59
 
60
+ Error message fixes and help text improvements
61
+
32
62
  ### Fixes
33
63
 
34
64
  - **Fix.** `config set` mutex error messages now include the `config set:` prefix for consistency.
@@ -36,6 +66,15 @@ Adds App.run_checks(), format_check_results(), format_check_results_json(), and
36
66
 
37
67
  ## 0.16.0
38
68
 
69
+ unique and env_separator flag fields, config array coercion, config set repeatable support
70
+
71
+ <details>
72
+ <summary>Context</summary>
73
+
74
+ Breaking: config show now requires --plain or --json. New features: unique field enforces no duplicate values on repeatable flags, env_separator controls how env vars are split into arrays, config arrays are coerced to declared types, config set supports repeatable flags with --clear and --default.
75
+
76
+ </details>
77
+
39
78
  ### Breaking
40
79
 
41
80
  - **Config show.** `config show` now requires explicit `--plain` or `--json` flag instead of defaulting to plain text.
@@ -55,6 +94,15 @@ Adds App.run_checks(), format_check_results(), format_check_results_json(), and
55
94
 
56
95
  ## 0.15.1
57
96
 
97
+ Config show bool parity and negative values in config set
98
+
99
+ <details>
100
+ <summary>Context</summary>
101
+
102
+ config show now outputs lowercase true/false matching Go. config set accepts negative numeric values.
103
+
104
+ </details>
105
+
58
106
  ### Breaking
59
107
 
60
108
  - **Breaking.** Config set now accepts negative numeric values. Unknown single-dash tokens produce 'unexpected argument' instead of 'unknown flag'.
@@ -65,6 +113,15 @@ Adds App.run_checks(), format_check_results(), format_check_results_json(), and
65
113
 
66
114
  ## 0.15.0
67
115
 
116
+ Config set type coercion and key validation
117
+
118
+ <details>
119
+ <summary>Context</summary>
120
+
121
+ config set now validates keys against registered flags and coerces string values to the flag's declared type before writing. This is a breaking change: unknown keys are rejected.
122
+
123
+ </details>
124
+
68
125
  ### Breaking
69
126
 
70
127
  - **Breaking.** `config set` now validates keys against registered flags and rejects unknown keys.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: strictcli
3
- Version: 0.18.0
3
+ Version: 0.20.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
@@ -222,12 +222,12 @@ Values resolve in this order: CLI argument > environment variable > default. If
222
222
 
223
223
  Bool flags from env vars accept `1`, `true`, `yes` (case-insensitive) for `True` and `0`, `false`, `no` for `False`. Any other value is an error.
224
224
 
225
- ## Tags
225
+ ## FlagSets
226
226
 
227
- Tags are reusable bundles of flags that can be applied to multiple commands:
227
+ FlagSets are reusable bundles of flags that can be applied to multiple commands:
228
228
 
229
229
  ```python
230
- auth_tag = strictcli.Tag(
230
+ auth_flags = strictcli.FlagSet(
231
231
  name="auth",
232
232
  flags=[
233
233
  strictcli.Flag(name="token", type=str, help="auth token", env="MYAPP_TOKEN", default=""),
@@ -235,16 +235,16 @@ auth_tag = strictcli.Tag(
235
235
  ],
236
236
  )
237
237
 
238
- @app.command("deploy", help="deploy the app", tags=[auth_tag])
238
+ @app.command("deploy", help="deploy the app", flag_sets=[auth_flags])
239
239
  def deploy(token, insecure):
240
240
  print(f"token={'set' if token else 'unset'}, insecure={insecure}")
241
241
 
242
- @app.command("status", help="check status", tags=[auth_tag])
242
+ @app.command("status", help="check status", flag_sets=[auth_flags])
243
243
  def status(token, insecure):
244
244
  print(f"checking status")
245
245
  ```
246
246
 
247
- Both commands now have `--token` and `--insecure` flags. Tag flags appear in help output and are parsed like any other flag.
247
+ Both commands now have `--token` and `--insecure` flags. FlagSet flags appear in help output and are parsed like any other flag.
248
248
 
249
249
  ## Mutex Groups
250
250
 
@@ -204,12 +204,12 @@ Values resolve in this order: CLI argument > environment variable > default. If
204
204
 
205
205
  Bool flags from env vars accept `1`, `true`, `yes` (case-insensitive) for `True` and `0`, `false`, `no` for `False`. Any other value is an error.
206
206
 
207
- ## Tags
207
+ ## FlagSets
208
208
 
209
- Tags are reusable bundles of flags that can be applied to multiple commands:
209
+ FlagSets are reusable bundles of flags that can be applied to multiple commands:
210
210
 
211
211
  ```python
212
- auth_tag = strictcli.Tag(
212
+ auth_flags = strictcli.FlagSet(
213
213
  name="auth",
214
214
  flags=[
215
215
  strictcli.Flag(name="token", type=str, help="auth token", env="MYAPP_TOKEN", default=""),
@@ -217,16 +217,16 @@ auth_tag = strictcli.Tag(
217
217
  ],
218
218
  )
219
219
 
220
- @app.command("deploy", help="deploy the app", tags=[auth_tag])
220
+ @app.command("deploy", help="deploy the app", flag_sets=[auth_flags])
221
221
  def deploy(token, insecure):
222
222
  print(f"token={'set' if token else 'unset'}, insecure={insecure}")
223
223
 
224
- @app.command("status", help="check status", tags=[auth_tag])
224
+ @app.command("status", help="check status", flag_sets=[auth_flags])
225
225
  def status(token, insecure):
226
226
  print(f"checking status")
227
227
  ```
228
228
 
229
- Both commands now have `--token` and `--insecure` flags. Tag flags appear in help output and are parsed like any other flag.
229
+ Both commands now have `--token` and `--insecure` flags. FlagSet flags appear in help output and are parsed like any other flag.
230
230
 
231
231
  ## Mutex Groups
232
232
 
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "strictcli",
3
- "version": "0.18.0",
3
+ "version": "0.20.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "strictcli",
9
- "version": "0.18.0",
9
+ "version": "0.20.0",
10
10
  "hasInstallScript": true,
11
11
  "license": "MIT"
12
12
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "strictcli",
3
- "version": "0.18.0",
3
+ "version": "0.20.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.18.0"
7
+ version = "0.20.0"
8
8
  description = "A strict, zero-dependency CLI framework for Python"
9
9
  readme = "README.md"
10
10
  license = "MIT"