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.
- strictcli-0.8.3/.rlsbl/changes/.validated +1 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/changes/0.4.1.jsonl +2 -2
- strictcli-0.8.3/.rlsbl/changes/0.6.0.jsonl +3 -0
- strictcli-0.8.3/.rlsbl/changes/0.6.0.md +5 -0
- strictcli-0.8.3/.rlsbl/changes/0.6.1.jsonl +6 -0
- strictcli-0.8.3/.rlsbl/changes/0.6.1.md +5 -0
- strictcli-0.8.3/.rlsbl/changes/0.7.0.jsonl +14 -0
- strictcli-0.8.3/.rlsbl/changes/0.7.0.md +10 -0
- strictcli-0.8.3/.rlsbl/changes/0.7.1.jsonl +12 -0
- strictcli-0.8.3/.rlsbl/changes/0.7.1.md +5 -0
- strictcli-0.8.3/.rlsbl/changes/0.8.0.jsonl +7 -0
- strictcli-0.8.3/.rlsbl/changes/0.8.0.md +5 -0
- strictcli-0.8.3/.rlsbl/changes/0.8.1.jsonl +2 -0
- strictcli-0.8.3/.rlsbl/changes/0.8.1.md +3 -0
- strictcli-0.8.3/.rlsbl/changes/0.8.2.jsonl +1 -0
- strictcli-0.8.3/.rlsbl/changes/0.8.2.md +3 -0
- strictcli-0.8.3/.rlsbl/changes/0.8.3.jsonl +1 -0
- strictcli-0.8.3/.rlsbl/changes/0.8.3.md +3 -0
- strictcli-0.8.3/.rlsbl/version +1 -0
- strictcli-0.8.3/CHANGELOG.md +79 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/PKG-INFO +82 -1
- {strictcli-0.5.0 → strictcli-0.8.3}/README.md +81 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/package-lock.json +2 -2
- {strictcli-0.5.0 → strictcli-0.8.3}/package.json +1 -1
- {strictcli-0.5.0 → strictcli-0.8.3}/pyproject.toml +1 -1
- {strictcli-0.5.0 → strictcli-0.8.3}/strictcli/__init__.py +1420 -67
- strictcli-0.8.3/tests/test_auto_version.py +78 -0
- strictcli-0.8.3/tests/test_check_command.py +362 -0
- strictcli-0.8.3/tests/test_check_discovery.py +177 -0
- strictcli-0.8.3/tests/test_check_runner.py +377 -0
- strictcli-0.8.3/tests/test_check_schema.py +110 -0
- strictcli-0.8.3/tests/test_check_types.py +73 -0
- strictcli-0.8.3/tests/test_config.py +378 -0
- strictcli-0.8.3/tests/test_deep_nesting.py +349 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_dependencies.py +2 -2
- strictcli-0.8.3/tests/test_deprecated.py +162 -0
- strictcli-0.8.3/tests/test_dump_schema.py +445 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_e2e.py +109 -0
- strictcli-0.8.3/tests/test_float_type.py +260 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_help.py +33 -0
- strictcli-0.8.3/tests/test_tagdsl.py +184 -0
- strictcli-0.8.3/tests/test_toml_loading.py +235 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/uv.lock +1 -1
- strictcli-0.5.0/.rlsbl/changes/.validated +0 -1
- strictcli-0.5.0/.rlsbl/version +0 -1
- strictcli-0.5.0/CHANGELOG.md +0 -32
- {strictcli-0.5.0 → strictcli-0.8.3}/.claude/settings.json +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.github/workflows/ci.yml +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.github/workflows/publish.yml +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.gitignore +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/.claude/settings.json +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/.github/workflows/ci.yml +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/.github/workflows/publish.yml +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/.gitignore +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/.rlsbl/hooks/post-release.sh +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/.rlsbl/hooks/pre-checks.sh +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/.rlsbl/hooks/pre-release.sh +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/.rlsbl/lint/go.toml +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/.rlsbl/lint/npm.toml +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/.rlsbl/lint/python.toml +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/CHANGELOG.md +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/CLAUDE.md +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/bases/LICENSE +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/changes/0.4.0.jsonl +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/changes/0.4.0.md +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/changes/0.4.1.md +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/changes/0.5.0.jsonl +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/changes/0.5.0.md +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/changes/unreleased.jsonl +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/config.json +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/hashes.json +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/hooks/post-release.sh +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/hooks/pre-checks.sh +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/hooks/pre-release.sh +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/lint/go.toml +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/lint/npm.toml +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/.rlsbl/lint/python.toml +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/CLAUDE.md +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/LICENSE +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/index.js +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/postinstall.js +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_arg_default.py +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_choices.py +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_env.py +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_exit_codes.py +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_global_flags.py +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_int_type.py +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_mutex.py +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_nesting.py +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_parser.py +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_passthrough.py +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_registration.py +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_repeatable.py +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_tags.py +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_validate.py +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/tests/test_variadic.py +0 -0
- {strictcli-0.5.0 → strictcli-0.8.3}/todo/.defer/deferred.md +0 -0
- {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"
|
|
2
|
-
{"commits":["
|
|
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,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,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,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 @@
|
|
|
1
|
+
{"commits":["096f6f92632439b642cdab5435e8558f90f3d90f"],"user_facing":false,"description":"CI: bump Go to 1.25"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"commits":["1bf6b917d4fef550eabde575acb491ad5dba4ee1","2d09d745566c35310c927f4337ff50a9efa82c2a","67f33abc550875ba81135b0ec9f183225168e5b2","c5b62a7030db6b350423e3efcf8f7bfa95292363","e278add8e7c5f749d7a550be8b74794543fa9c3a"],"user_facing":false}
|
|
@@ -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.
|
|
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.
|
|
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.
|
|
9
|
+
"version": "0.8.3",
|
|
10
10
|
"hasInstallScript": true,
|
|
11
11
|
"license": "MIT"
|
|
12
12
|
}
|