strictcli 0.5.0__tar.gz → 0.8.3__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 (98) hide show
  1. strictcli-0.8.3/.rlsbl/changes/.validated +1 -0
  2. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/changes/0.4.1.jsonl +2 -2
  3. strictcli-0.8.3/.rlsbl/changes/0.6.0.jsonl +3 -0
  4. strictcli-0.8.3/.rlsbl/changes/0.6.0.md +5 -0
  5. strictcli-0.8.3/.rlsbl/changes/0.6.1.jsonl +6 -0
  6. strictcli-0.8.3/.rlsbl/changes/0.6.1.md +5 -0
  7. strictcli-0.8.3/.rlsbl/changes/0.7.0.jsonl +14 -0
  8. strictcli-0.8.3/.rlsbl/changes/0.7.0.md +10 -0
  9. strictcli-0.8.3/.rlsbl/changes/0.7.1.jsonl +12 -0
  10. strictcli-0.8.3/.rlsbl/changes/0.7.1.md +5 -0
  11. strictcli-0.8.3/.rlsbl/changes/0.8.0.jsonl +7 -0
  12. strictcli-0.8.3/.rlsbl/changes/0.8.0.md +5 -0
  13. strictcli-0.8.3/.rlsbl/changes/0.8.1.jsonl +2 -0
  14. strictcli-0.8.3/.rlsbl/changes/0.8.1.md +3 -0
  15. strictcli-0.8.3/.rlsbl/changes/0.8.2.jsonl +1 -0
  16. strictcli-0.8.3/.rlsbl/changes/0.8.2.md +3 -0
  17. strictcli-0.8.3/.rlsbl/changes/0.8.3.jsonl +1 -0
  18. strictcli-0.8.3/.rlsbl/changes/0.8.3.md +3 -0
  19. strictcli-0.8.3/.rlsbl/version +1 -0
  20. strictcli-0.8.3/CHANGELOG.md +79 -0
  21. {strictcli-0.5.0 → strictcli-0.8.3}/PKG-INFO +82 -1
  22. {strictcli-0.5.0 → strictcli-0.8.3}/README.md +81 -0
  23. {strictcli-0.5.0 → strictcli-0.8.3}/package-lock.json +2 -2
  24. {strictcli-0.5.0 → strictcli-0.8.3}/package.json +1 -1
  25. {strictcli-0.5.0 → strictcli-0.8.3}/pyproject.toml +1 -1
  26. {strictcli-0.5.0 → strictcli-0.8.3}/strictcli/__init__.py +1420 -67
  27. strictcli-0.8.3/tests/test_auto_version.py +78 -0
  28. strictcli-0.8.3/tests/test_check_command.py +362 -0
  29. strictcli-0.8.3/tests/test_check_discovery.py +177 -0
  30. strictcli-0.8.3/tests/test_check_runner.py +377 -0
  31. strictcli-0.8.3/tests/test_check_schema.py +110 -0
  32. strictcli-0.8.3/tests/test_check_types.py +73 -0
  33. strictcli-0.8.3/tests/test_config.py +378 -0
  34. strictcli-0.8.3/tests/test_deep_nesting.py +349 -0
  35. {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_dependencies.py +2 -2
  36. strictcli-0.8.3/tests/test_deprecated.py +162 -0
  37. strictcli-0.8.3/tests/test_dump_schema.py +445 -0
  38. {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_e2e.py +109 -0
  39. strictcli-0.8.3/tests/test_float_type.py +260 -0
  40. {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_help.py +33 -0
  41. strictcli-0.8.3/tests/test_tagdsl.py +184 -0
  42. strictcli-0.8.3/tests/test_toml_loading.py +235 -0
  43. {strictcli-0.5.0 → strictcli-0.8.3}/uv.lock +1 -1
  44. strictcli-0.5.0/.rlsbl/changes/.validated +0 -1
  45. strictcli-0.5.0/.rlsbl/version +0 -1
  46. strictcli-0.5.0/CHANGELOG.md +0 -32
  47. {strictcli-0.5.0 → strictcli-0.8.3}/.claude/settings.json +0 -0
  48. {strictcli-0.5.0 → strictcli-0.8.3}/.github/workflows/ci.yml +0 -0
  49. {strictcli-0.5.0 → strictcli-0.8.3}/.github/workflows/publish.yml +0 -0
  50. {strictcli-0.5.0 → strictcli-0.8.3}/.gitignore +0 -0
  51. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/.claude/settings.json +0 -0
  52. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/.github/workflows/ci.yml +0 -0
  53. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/.github/workflows/publish.yml +0 -0
  54. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/.gitignore +0 -0
  55. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/.rlsbl/hooks/post-release.sh +0 -0
  56. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/.rlsbl/hooks/pre-checks.sh +0 -0
  57. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/.rlsbl/hooks/pre-release.sh +0 -0
  58. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/.rlsbl/lint/go.toml +0 -0
  59. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/.rlsbl/lint/npm.toml +0 -0
  60. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/.rlsbl/lint/python.toml +0 -0
  61. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/CHANGELOG.md +0 -0
  62. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/CLAUDE.md +0 -0
  63. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/LICENSE +0 -0
  64. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/changes/0.4.0.jsonl +0 -0
  65. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/changes/0.4.0.md +0 -0
  66. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/changes/0.4.1.md +0 -0
  67. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/changes/0.5.0.jsonl +0 -0
  68. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/changes/0.5.0.md +0 -0
  69. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/changes/unreleased.jsonl +0 -0
  70. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/config.json +0 -0
  71. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/hashes.json +0 -0
  72. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/hooks/post-release.sh +0 -0
  73. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/hooks/pre-checks.sh +0 -0
  74. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/hooks/pre-release.sh +0 -0
  75. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/lint/go.toml +0 -0
  76. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/lint/npm.toml +0 -0
  77. {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/lint/python.toml +0 -0
  78. {strictcli-0.5.0 → strictcli-0.8.3}/CLAUDE.md +0 -0
  79. {strictcli-0.5.0 → strictcli-0.8.3}/LICENSE +0 -0
  80. {strictcli-0.5.0 → strictcli-0.8.3}/index.js +0 -0
  81. {strictcli-0.5.0 → strictcli-0.8.3}/postinstall.js +0 -0
  82. {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_arg_default.py +0 -0
  83. {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_choices.py +0 -0
  84. {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_env.py +0 -0
  85. {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_exit_codes.py +0 -0
  86. {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_global_flags.py +0 -0
  87. {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_int_type.py +0 -0
  88. {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_mutex.py +0 -0
  89. {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_nesting.py +0 -0
  90. {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_parser.py +0 -0
  91. {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_passthrough.py +0 -0
  92. {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_registration.py +0 -0
  93. {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_repeatable.py +0 -0
  94. {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_tags.py +0 -0
  95. {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_validate.py +0 -0
  96. {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_variadic.py +0 -0
  97. {strictcli-0.5.0 → strictcli-0.8.3}/todo/.defer/deferred.md +0 -0
  98. {strictcli-0.5.0 → strictcli-0.8.3}/todo/.done/original-idea.md +0 -0
@@ -0,0 +1 @@
1
+ d3c987f9ee7ca4844f3fa1f3760e0d8b9c07fd07
@@ -1,4 +1,4 @@
1
- {"commits":["1d4c04f6dd477ee11ead0c712a6fe1d16cdfe6bb","d113fc263470557d4614eacd2ec21e49e11d5419","40255eb12d485b7a36a382b34c8cd09f41e34a1c","8eca2aedc3642bd79d01420fb2c88b9b5e1df493"],"user_facing":false}
2
- {"commits":["8eca2aedc3642bd79d01420fb2c88b9b5e1df493","5c99daf541a3983088081b3736b7cd3e197c5d65","5e924f2ffe83c76d54c3b5e9da736f24325ed0a0"],"user_facing":false}
1
+ {"commits":["1d4c04f6dd477ee11ead0c712a6fe1d16cdfe6bb","d113fc263470557d4614eacd2ec21e49e11d5419","40255eb12d485b7a36a382b34c8cd09f41e34a1c"],"user_facing":false}
2
+ {"commits":["5c99daf541a3983088081b3736b7cd3e197c5d65","5e924f2ffe83c76d54c3b5e9da736f24325ed0a0"],"user_facing":false}
3
3
  {"commits":["430e30bb4e48a6dd80099185f03eb866a14e02c8","776673f97f30f4e1241a42b1334b285db46afde4","93111cb1440ce3953805e33935021a1bd39b78b7","bd63ba30698098272031e7944d879972c6944d51"],"user_facing":false}
4
4
  {"commits":["8eca2aedc3642bd79d01420fb2c88b9b5e1df493"],"user_facing":true,"description":"**CI publish fix.** Fixed publish workflow for GitHub Actions compatibility.","type":"fix"}
@@ -0,0 +1,3 @@
1
+ {"commits":["fb099932c7e4fe6ce20f36191a16b9b0d507d84e"],"user_facing":true,"description":"**New feature.** Deprecated commands: declare a command name + message that prints the deprecation notice and exits when invoked, with a `Deprecated:` section in help output.","type":"feature"}
2
+ {"commits":["50d5c41c50d53f6b220168027248b7b8b08fb92a","bae8eebfc4fa877cef2f215e48f41350f573cdc5","fafc4d29617c01c336fdcbc5a9025c4bb6d16759","fc4f9ab1d67bd17e681e9de7209368561a6b66b5"],"user_facing":false}
3
+ {"commits":["fb61c5d99061f03017133e872fed6404d540131f"],"user_facing":false}
@@ -0,0 +1,5 @@
1
+ ## 0.6.0
2
+
3
+ ### Features
4
+
5
+ - **New feature.** Deprecated commands: declare a command name + message that prints the deprecation notice and exits when invoked, with a `Deprecated:` section in help output.
@@ -0,0 +1,6 @@
1
+ {"commits":["86f1ad11667cddac3e5a238451efa2b09d113c93"],"user_facing":true,"description":"**Fix.** Harmonize Implies and deprecated command error messages with Go for exact parity.","type":"fix"}
2
+ {"commits":["a4e49967821065a4e0965d16d2f04e12df3f88e2","ddd893b8435b1242b23ad92a4bd5d8ffb842f052"],"user_facing":false}
3
+ {"commits":["82999a197c243a10bd322a5636b9b9ec9c436ad6"],"user_facing":false}
4
+ {"commits":["b4b0795124ae8080206947058d43129d69dc3e22"],"user_facing":false}
5
+ {"commits":["b7d7c6f9b57efe59e5a8990150ee5b2d87e8bc88"],"user_facing":false}
6
+ {"commits":["8371e2cec3197528c9badabfe545c2eb9ce6f291"],"user_facing":false}
@@ -0,0 +1,5 @@
1
+ ## 0.6.1
2
+
3
+ ### Fixes
4
+
5
+ - **Fix.** Harmonize Implies and deprecated command error messages with Go for exact parity.
@@ -0,0 +1,14 @@
1
+ {"commits":["0dadc27a61af55ae1beef0dadaa4d22a3fc39567","2337c506e5ff1823a66fa5b61481e0ee5dd6587c","323ee4118f03a191fa13ec9e975b38d1c007c702","55d0f0611279ea120cc554a8841f77057ec41619"],"user_facing":false}
2
+ {"commits":["0b810b847ee9effc0b2a600017550a0128aaa277"],"user_facing":true,"description":"**New feature.** `--dump-schema` flag auto-generates `.strictcli/schema.json` describing the full CLI structure.","type":"feature"}
3
+ {"commits":["af8a86bf939437753f0b70e7324825989e76720b"],"user_facing":true,"description":"**New feature.** Opt-in JSON config file support with `App(config=True)`. Reads `~/.config/{name}/config.json` with precedence: CLI > env > config > default. Auto-registers `config show/set/path/edit` subcommands.","type":"feature"}
4
+ {"commits":["9c08a66477a7b99ded49a266ab3f3dab126bf0f7"],"user_facing":true,"description":"**New feature.** Recursive group nesting to arbitrary depth. Groups can contain subgroups via `group.group(name, help=...)`.","type":"feature"}
5
+ {"commits":["d075fc6e0bdc786ac9b3807654f395d76d5315c2"],"user_facing":true,"description":"**New feature.** `type=float` flag support. Rejects NaN and Inf.","type":"feature"}
6
+ {"commits":["d2b7dc46ef9ad6467310aebf6c939fc9c85598b2"],"user_facing":true,"description":"**New feature.** `--help` and `-h` recognized anywhere in the argument list, not just at token boundaries.","type":"feature"}
7
+ {"commits":["a48e27d5aa737734299a6e0deb53b1452aa3b492"],"user_facing":true,"description":"**New feature.** `App(version=None)` auto-detects version from `importlib.metadata`.","type":"feature"}
8
+ {"commits":["998e74b73c31db60506d5fe4b1159913d56ed3f3","9839219ae899368d30e34d226905f5d17e169ab9","ad4f01997ecf743daf8beaec2f5033d7fe9faedd","0bb3084979d23898a418d47a58d268c1ce79caa8","55d0f0611279ea120cc554a8841f77057ec41619"],"user_facing":false}
9
+ {"commits":["0e719fb5d3a64bf5441131b3fc892bd73ae967a8","117f004d72e3a79088a26baf490b1b0e4614126f","308091cadeab512c71974aad0315ca2edb82023a","573ac5629f7318a2d2994045629f20c9fbe72fd0","663f214379ffd99b800f96548f2146be5e7d76e5"],"user_facing":false}
10
+ {"commits":["709cd0d52327601a72ec3cc68e809650e63e94c8","8182225405d8cff9867dfcf745211e45cffabd18","89d2f8dac1953960bb07f37a0a41abdc4eb02299","a9c7b62054991883d83c08ad8a19b3ff48f52842","b93f0537b8d35246f1fa46d1433500d63d987ed3"],"user_facing":false}
11
+ {"commits":["eeb432705b5db3acaca9af8dc899e0e5a8149c72","fcadad70b5c8b9eb9368eb81acdb6076217f1bd0"],"user_facing":false}
12
+ {"commits":["3aac438dddce5894d7fff266d4d702d72474b39b","d6f1b4f66055cbfc5c0d24723ae0108a99b985d5"],"user_facing":false}
13
+ {"commits":["17de68a3620085c55d6389e5b33b459d22d668cd","ead12bd589fce2416cf95f6ac2d9a72deaad4627"],"user_facing":false}
14
+ {"commits":["86703bc11f6b925f8d99b961791da355bb0af62f"],"user_facing":false}
@@ -0,0 +1,10 @@
1
+ ## 0.7.0
2
+
3
+ ### Features
4
+
5
+ - **New feature.** `--dump-schema` flag auto-generates `.strictcli/schema.json` describing the full CLI structure.
6
+ - **New feature.** Opt-in JSON config file support with `App(config=True)`. Reads `~/.config/{name}/config.json` with precedence: CLI > env > config > default. Auto-registers `config show/set/path/edit` subcommands.
7
+ - **New feature.** Recursive group nesting to arbitrary depth. Groups can contain subgroups via `group.group(name, help=...)`.
8
+ - **New feature.** `type=float` flag support. Rejects NaN and Inf.
9
+ - **New feature.** `--help` and `-h` recognized anywhere in the argument list, not just at token boundaries.
10
+ - **New feature.** `App(version=None)` auto-detects version from `importlib.metadata`.
@@ -0,0 +1,12 @@
1
+ {"commits":["e53c143df838b957f68c204072dfb95571669b9e"],"user_facing":false}
2
+ {"commits":["58a1a7d0d42e33dc4e4ac9a1fc495e14c377df36"],"user_facing":false}
3
+ {"commits":["65e89fa1dfcc702e02f2e25868320d74bf4b35bc"],"user_facing":false}
4
+ {"commits":["0ab3b1b3c763ef341587171b94cd138108a2434d"],"user_facing":true,"description":"**New feature.** Handlers with `**kwargs` signatures are accepted without strict parameter validation.","type":"feature"}
5
+ {"commits":["14808c98f9276c4c42afba4c99c6fad6c795fef4"],"user_facing":false}
6
+ {"commits":["49b4145d9e4c685ac43bef71885e6adac8a4ec2a"],"user_facing":false}
7
+ {"commits":["57c18b5f460ad867fb510a1b9c559a660505a9da"],"user_facing":false}
8
+ {"commits":["8329210c3952a9cbcfba0592517aaa5900d4881b"],"user_facing":false}
9
+ {"commits":["c2a12fda757f2394718c02fe56c481f0a548bf14"],"user_facing":false}
10
+ {"commits":["c8986f4a376e486471e3f577bb8983341405924b"],"user_facing":false}
11
+ {"commits":["6239b69e9558afa49e1c7e9b9ddd0b9aa08d7072"],"user_facing":false}
12
+ {"commits":["8b9e28981ddb8f8e5bc8cf69d205dd22dcbbfae0"],"user_facing":false}
@@ -0,0 +1,5 @@
1
+ ## 0.7.1
2
+
3
+ ### Features
4
+
5
+ - **New feature.** Handlers with `**kwargs` signatures are accepted without strict parameter validation.
@@ -0,0 +1,7 @@
1
+ {"commits":["aa281e30ffa0eae592248aa5a4e261f02bbc4853","d193645da251d0f0dad7738b8c7ad2fb108a427e","feb49510f4822381c2f0e02e45f090b9938c9656","03921cde7d1731786af6d15348e62dfab9b6ba5e","38903f9b5349dec3c08ccf6ed74071fddf2a7fa9"],"user_facing":true,"description":"**New feature.** Check system -- a first-class, security-hardened check/validation framework. Register checks in `.strictcli/checks.toml` (source of truth) with metadata (tags, severity, dependencies), implement them via `@app.check()` decorator, and run them with the auto-registered `check` command. Includes: tag-based filtering with a set-operation DSL (`&`, `|`, `^`, `-`, `!`), DAG-based dependency ordering, human/JSON output, `--list`/`--dry-run`/`--verbose` modes, `--ignore-warnings`, and `--dump-schema` integration.","type":"feature"}
2
+ {"commits":["9a9210ccafb6188b185765eaaca1cfc735263861","b53774877ebc7c60d8c10b9c1d9b2995cae79427","e7be2f02ee39073f11c68d1da7c20171b29a348c"],"user_facing":false}
3
+ {"commits":["a9dbc5d22bba76216e745b4f93f86a338937c55e","54dc4f2cec30b696053b3853dbcfaca4e8d12e08","efbf6011a89c90ac1fc3b1bfee6d4cd0b24bd7b4","606a7f7033e4aad49267ca313d93e8c882eee8b1","3c01fc7caa8d4e128c6c4b3df98984bfaabffc5b"],"user_facing":false}
4
+ {"commits":["605d0e650b72c114ccfb5d065fb35a8af2d8f6e5","be4a5ddbc6b69c94f8ad914e406bfc6dd271cc08","864ddb9bf27406418c9b336c25dcd66db72ee2ae"],"user_facing":false}
5
+ {"commits":["a5a5d2bdb4b6778f0cadfbf2ad3eed9478894204","af57140b7104078ed2a24d5b3d2cb3da16f15e5a","b9ad74cc353f060d9fcd2c6a98b6992a7e91fa6c","050c8b065d1e897c2adddd8b1bd5c5677d0f9805","cf49f7e09dd335bf202d83fc13786cee2a818a61"],"user_facing":false}
6
+ {"commits":["812a948d8ec3c630d3eacb49ee7d0b5fd118b971","4df49bf578068f3cdc3b0a58705239ce8f4c227f"],"user_facing":false}
7
+ {"commits":["21eaea600deaf5cc73dccbd9938fe04362552e37"],"user_facing":false}
@@ -0,0 +1,5 @@
1
+ ## 0.8.0
2
+
3
+ ### Features
4
+
5
+ - **New feature.** Check system -- a first-class, security-hardened check/validation framework. Register checks in `.strictcli/checks.toml` (source of truth) with metadata (tags, severity, dependencies), implement them via `@app.check()` decorator, and run them with the auto-registered `check` command. Includes: tag-based filtering with a set-operation DSL (`&`, `|`, `^`, `-`, `!`), DAG-based dependency ordering, human/JSON output, `--list`/`--dry-run`/`--verbose` modes, `--ignore-warnings`, and `--dump-schema` integration.
@@ -0,0 +1,2 @@
1
+ {"commits":["86127ac583ac307d89c84e30ec7c72cf67cf251c"],"user_facing":false}
2
+ {"commits":["212ededdf1b98697134767b53ddcdbaea80efd6d","6e95bf48941664cc99e683e52ed90ae1ed345b4b"],"user_facing":false}
@@ -0,0 +1,3 @@
1
+ ## 0.8.1
2
+
3
+ - No user-facing changes.
@@ -0,0 +1 @@
1
+ {"commits":["096f6f92632439b642cdab5435e8558f90f3d90f"],"user_facing":false,"description":"CI: bump Go to 1.25"}
@@ -0,0 +1,3 @@
1
+ ## 0.8.2
2
+
3
+ - No user-facing changes.
@@ -0,0 +1 @@
1
+ {"commits":["1bf6b917d4fef550eabde575acb491ad5dba4ee1","2d09d745566c35310c927f4337ff50a9efa82c2a","67f33abc550875ba81135b0ec9f183225168e5b2","c5b62a7030db6b350423e3efcf8f7bfa95292363","e278add8e7c5f749d7a550be8b74794543fa9c3a"],"user_facing":false}
@@ -0,0 +1,3 @@
1
+ ## 0.8.3
2
+
3
+ - No user-facing changes.
@@ -0,0 +1 @@
1
+ 0.38.0
@@ -0,0 +1,79 @@
1
+ <!-- Generated by rlsbl from .rlsbl/changes/ — do not edit -->
2
+
3
+ # Changelog
4
+
5
+ ## 0.8.3
6
+
7
+ - No user-facing changes.
8
+
9
+ ## 0.8.2
10
+
11
+ - No user-facing changes.
12
+
13
+ ## 0.8.1
14
+
15
+ - No user-facing changes.
16
+
17
+ ## 0.8.0
18
+
19
+ ### Features
20
+
21
+ - **New feature.** Check system -- a first-class, security-hardened check/validation framework. Register checks in `.strictcli/checks.toml` (source of truth) with metadata (tags, severity, dependencies), implement them via `@app.check()` decorator, and run them with the auto-registered `check` command. Includes: tag-based filtering with a set-operation DSL (`&`, `|`, `^`, `-`, `!`), DAG-based dependency ordering, human/JSON output, `--list`/`--dry-run`/`--verbose` modes, `--ignore-warnings`, and `--dump-schema` integration.
22
+
23
+ ## 0.7.1
24
+
25
+ ### Features
26
+
27
+ - **New feature.** Handlers with `**kwargs` signatures are accepted without strict parameter validation.
28
+
29
+ ## 0.7.0
30
+
31
+ ### Features
32
+
33
+ - **New feature.** `--dump-schema` flag auto-generates `.strictcli/schema.json` describing the full CLI structure.
34
+ - **New feature.** Opt-in JSON config file support with `App(config=True)`. Reads `~/.config/{name}/config.json` with precedence: CLI > env > config > default. Auto-registers `config show/set/path/edit` subcommands.
35
+ - **New feature.** Recursive group nesting to arbitrary depth. Groups can contain subgroups via `group.group(name, help=...)`.
36
+ - **New feature.** `type=float` flag support. Rejects NaN and Inf.
37
+ - **New feature.** `--help` and `-h` recognized anywhere in the argument list, not just at token boundaries.
38
+ - **New feature.** `App(version=None)` auto-detects version from `importlib.metadata`.
39
+
40
+ ## 0.6.1
41
+
42
+ ### Fixes
43
+
44
+ - **Fix.** Harmonize Implies and deprecated command error messages with Go for exact parity.
45
+
46
+ ## 0.6.0
47
+
48
+ ### Features
49
+
50
+ - **New feature.** Deprecated commands: declare a command name + message that prints the deprecation notice and exits when invoked, with a `Deprecated:` section in help output.
51
+
52
+ ## 0.5.0
53
+
54
+ ### Features
55
+
56
+ - **New feature.** `Implies` flag dependency type: when a trigger flag is set, automatically set a target bool flag to a specified value. Explicit contradictions are parse errors.
57
+
58
+ ## 0.4.1
59
+
60
+ ### Fixes
61
+
62
+ - **CI publish fix.** Fixed publish workflow for GitHub Actions compatibility.
63
+
64
+ ## 0.4.0
65
+
66
+ ### Breaking
67
+
68
+ - **Breaking: mutex groups always required.** Removed the `required` parameter from `MutexGroup`. All mutex groups now require exactly one flag to be provided.
69
+
70
+ ### Features
71
+
72
+ - **Flag dependencies.** New `CoRequired` and `Requires` types for declaring flags that must appear together.
73
+
74
+ ### Fixes
75
+
76
+ - **Choices on global flags.** Global flags now validate choices correctly.
77
+ - **Repeatable global flags.** Global flags with `repeatable=True` now work correctly.
78
+ - **Strict int parsing.** Integer flags now enforce 64-bit signed range to match Go behavior.
79
+ - **Strict int env parsing.** Integer environment variables reject leading/trailing whitespace.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: strictcli
3
- Version: 0.5.0
3
+ Version: 0.8.3
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
@@ -339,6 +339,87 @@ Notes:
339
339
  - Checked after environment variable resolution, before defaults are applied.
340
340
  - Can be combined with mutex groups.
341
341
 
342
+ ## Implies Dependencies
343
+
344
+ `Implies` automatically sets a target bool flag when a trigger flag is provided. Both the trigger and the target must be bool flags.
345
+
346
+ ```python
347
+ @app.command("run", help="run the pipeline", dependencies=[
348
+ strictcli.Implies(flag="verbose", implies="log_output", value=True),
349
+ ])
350
+ @strictcli.flag("verbose", type=bool, help="enable verbose output")
351
+ @strictcli.flag("log-output", type=bool, help="write output to log file")
352
+ def run(verbose, log_output):
353
+ if log_output:
354
+ print("logging enabled")
355
+ if verbose:
356
+ print("verbose mode")
357
+ ```
358
+
359
+ When `--verbose` is provided, `--log-output` is automatically set to `True`:
360
+
361
+ ```
362
+ $ myapp run --verbose
363
+ logging enabled
364
+ verbose mode
365
+ ```
366
+
367
+ If the user explicitly provides a value that contradicts the implied value, it is a parse error:
368
+
369
+ ```
370
+ $ myapp run --verbose --no-log-output
371
+ error: flag '--verbose' implies '--log-output', but '--no-log-output' was explicitly provided
372
+ try 'myapp --help'
373
+ ```
374
+
375
+ Notes:
376
+
377
+ - Both trigger and target must be bool flags.
378
+ - Passed via `dependencies=[...]` alongside `CoRequired` and `Requires`.
379
+ - The `value` parameter specifies what the target flag is set to when the trigger is provided.
380
+ - If the trigger flag is not provided, the target flag is unaffected.
381
+
382
+ ## Deprecated Commands
383
+
384
+ `app.deprecate()` registers a command name that prints a deprecation message to stderr and exits with code 1 when invoked. Deprecated commands are declaration-only stubs -- they cannot have handlers, flags, or args.
385
+
386
+ ```python
387
+ app = strictcli.App(name="myapp", version="1.0.0", help="manage projects")
388
+
389
+ app.deprecate("init", message="Use 'setup' instead")
390
+
391
+ @app.command("setup", help="initialize a new project")
392
+ def setup():
393
+ print("setting up project")
394
+ ```
395
+
396
+ When the deprecated command is invoked:
397
+
398
+ ```
399
+ $ myapp init
400
+ error: command 'init' is deprecated: Use 'setup' instead
401
+ ```
402
+
403
+ Works on both App and Group:
404
+
405
+ ```python
406
+ db = app.group("db", help="manage databases")
407
+ db.deprecate("reset", message="Use 'db wipe' instead")
408
+ ```
409
+
410
+ Deprecated commands appear in help output under a `Deprecated:` section:
411
+
412
+ ```
413
+ $ myapp --help
414
+ myapp v1.0.0 -- manage projects
415
+
416
+ Commands:
417
+ setup initialize a new project
418
+
419
+ Deprecated:
420
+ init Use 'setup' instead
421
+ ```
422
+
342
423
  ## Help Output
343
424
 
344
425
  Help is auto-generated at three levels. Pass `--help` or `-h` at any level, or invoke the app with no arguments.
@@ -321,6 +321,87 @@ Notes:
321
321
  - Checked after environment variable resolution, before defaults are applied.
322
322
  - Can be combined with mutex groups.
323
323
 
324
+ ## Implies Dependencies
325
+
326
+ `Implies` automatically sets a target bool flag when a trigger flag is provided. Both the trigger and the target must be bool flags.
327
+
328
+ ```python
329
+ @app.command("run", help="run the pipeline", dependencies=[
330
+ strictcli.Implies(flag="verbose", implies="log_output", value=True),
331
+ ])
332
+ @strictcli.flag("verbose", type=bool, help="enable verbose output")
333
+ @strictcli.flag("log-output", type=bool, help="write output to log file")
334
+ def run(verbose, log_output):
335
+ if log_output:
336
+ print("logging enabled")
337
+ if verbose:
338
+ print("verbose mode")
339
+ ```
340
+
341
+ When `--verbose` is provided, `--log-output` is automatically set to `True`:
342
+
343
+ ```
344
+ $ myapp run --verbose
345
+ logging enabled
346
+ verbose mode
347
+ ```
348
+
349
+ If the user explicitly provides a value that contradicts the implied value, it is a parse error:
350
+
351
+ ```
352
+ $ myapp run --verbose --no-log-output
353
+ error: flag '--verbose' implies '--log-output', but '--no-log-output' was explicitly provided
354
+ try 'myapp --help'
355
+ ```
356
+
357
+ Notes:
358
+
359
+ - Both trigger and target must be bool flags.
360
+ - Passed via `dependencies=[...]` alongside `CoRequired` and `Requires`.
361
+ - The `value` parameter specifies what the target flag is set to when the trigger is provided.
362
+ - If the trigger flag is not provided, the target flag is unaffected.
363
+
364
+ ## Deprecated Commands
365
+
366
+ `app.deprecate()` registers a command name that prints a deprecation message to stderr and exits with code 1 when invoked. Deprecated commands are declaration-only stubs -- they cannot have handlers, flags, or args.
367
+
368
+ ```python
369
+ app = strictcli.App(name="myapp", version="1.0.0", help="manage projects")
370
+
371
+ app.deprecate("init", message="Use 'setup' instead")
372
+
373
+ @app.command("setup", help="initialize a new project")
374
+ def setup():
375
+ print("setting up project")
376
+ ```
377
+
378
+ When the deprecated command is invoked:
379
+
380
+ ```
381
+ $ myapp init
382
+ error: command 'init' is deprecated: Use 'setup' instead
383
+ ```
384
+
385
+ Works on both App and Group:
386
+
387
+ ```python
388
+ db = app.group("db", help="manage databases")
389
+ db.deprecate("reset", message="Use 'db wipe' instead")
390
+ ```
391
+
392
+ Deprecated commands appear in help output under a `Deprecated:` section:
393
+
394
+ ```
395
+ $ myapp --help
396
+ myapp v1.0.0 -- manage projects
397
+
398
+ Commands:
399
+ setup initialize a new project
400
+
401
+ Deprecated:
402
+ init Use 'setup' instead
403
+ ```
404
+
324
405
  ## Help Output
325
406
 
326
407
  Help is auto-generated at three levels. Pass `--help` or `-h` at any level, or invoke the app with no arguments.
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "strictcli",
3
- "version": "0.1.0",
3
+ "version": "0.8.3",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "strictcli",
9
- "version": "0.1.0",
9
+ "version": "0.8.3",
10
10
  "hasInstallScript": true,
11
11
  "license": "MIT"
12
12
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "strictcli",
3
- "version": "0.5.0",
3
+ "version": "0.8.3",
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.5.0"
7
+ version = "0.8.3"
8
8
  description = "A strict, zero-dependency CLI framework for Python"
9
9
  readme = "README.md"
10
10
  license = "MIT"