cli-usereq 0.68.0__tar.gz → 0.68.2__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.
- {cli_usereq-0.68.0/src/cli_usereq.egg-info → cli_usereq-0.68.2}/PKG-INFO +35 -29
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/README.md +34 -28
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/pyproject.toml +1 -1
- {cli_usereq-0.68.0 → cli_usereq-0.68.2/src/cli_usereq.egg-info}/PKG-INFO +35 -29
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/__init__.py +1 -1
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/cli.py +201 -264
- cli_usereq-0.68.2/src/usereq/resources/prompts-version.txt +1 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/tests/test_cli.py +53 -24
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/tests/test_files_commands.py +44 -68
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/tests/test_static_check.py +18 -18
- cli_usereq-0.68.0/src/usereq/resources/prompts-version.txt +0 -1
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/LICENSE +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/setup.cfg +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/cli_usereq.egg-info/SOURCES.txt +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/cli_usereq.egg-info/dependency_links.txt +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/cli_usereq.egg-info/entry_points.txt +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/cli_usereq.egg-info/requires.txt +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/cli_usereq.egg-info/top_level.txt +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/__main__.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/compress.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/compress_files.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/doxygen_parser.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/find_constructs.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/generate_markdown.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/resources/docs/Document_Source_Code_in_Doxygen_Style.md +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/resources/docs/HDT_Test_Authoring_Guide.md +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/resources/docs/Requirements_Template.md +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/resources/prompts/analyze.md +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/resources/prompts/change.md +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/resources/prompts/check.md +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/resources/prompts/cover.md +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/resources/prompts/create.md +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/resources/prompts/fix.md +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/resources/prompts/flowchart.md +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/resources/prompts/implement.md +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/resources/prompts/new.md +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/resources/prompts/readme.md +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/resources/prompts/recreate.md +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/resources/prompts/refactor.md +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/resources/prompts/references.md +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/resources/prompts/renumber.md +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/resources/prompts/workflow.md +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/resources/prompts/write.md +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/source_analyzer.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/static_check.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/src/usereq/token_counter.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/tests/test_analyzer_cli.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/tests/test_analyzer_comments.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/tests/test_analyzer_core.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/tests/test_analyzer_errors.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/tests/test_analyzer_format.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/tests/test_analyzer_helpers.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/tests/test_compress.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/tests/test_dependency_manifests.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/tests/test_doxygen_parser.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/tests/test_find_constructs.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/tests/test_find_constructs_comprehensive.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/tests/test_generate_markdown.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/tests/test_helpers.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/tests/test_release_workflow.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/tests/test_source_analyzer.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/tests/test_token_counter.py +0 -0
- {cli_usereq-0.68.0 → cli_usereq-0.68.2}/tests/test_update_check.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cli-usereq
|
|
3
|
-
Version: 0.68.
|
|
3
|
+
Version: 0.68.2
|
|
4
4
|
Summary: Initialize a project with prompts, agents, and templates from the useReq repository.
|
|
5
5
|
Author: Ogekuri
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -709,7 +709,7 @@ Dynamic: license-file
|
|
|
709
709
|
> * **No Support or Feature Requests:** Please **do not** open issues, bug reports, or feature requests. They will not be addressed or accepted at this stage of development.
|
|
710
710
|
> * **No Warranty:** This software is provided **"AS IS"**, without warranty of any kind, express or implied. You may use it strictly for **testing and evaluation purposes** at your own sole risk.
|
|
711
711
|
|
|
712
|
-
# useReq / req (0.68.
|
|
712
|
+
# useReq / req (0.68.2)
|
|
713
713
|
|
|
714
714
|
<p align="center">
|
|
715
715
|
<img src="https://img.shields.io/badge/python-3.11%2B-3776AB?style=flat-square&logo=python&logoColor=white" alt="Python 3.11+">
|
|
@@ -719,14 +719,23 @@ Dynamic: license-file
|
|
|
719
719
|
<img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json" alt="uv">
|
|
720
720
|
</p>
|
|
721
721
|
|
|
722
|
-
|
|
723
|
-
|
|
722
|
+
<p align="center">
|
|
723
|
+
<strong>The `req` CLI provisions requirements-driven development prompts for LLM agents.</strong><br>
|
|
724
724
|
In more detail: useReq packages a catalog of requirements-engineering prompts (write, create, change, implement, check, and more) and installs them as user-level prompts, commands, skills, and agents for the CLIs and agents you already use — exposed as `/req-<name>`, `/req:<name>`, `/skill:req-<name>`, `$req-<name>`, or `/req-<name>.prompt` depending on the provider. It also ships an embedded source-analysis toolkit (token counting, references, compression, construct extraction, static checks) that operates on your project across 20 programming languages, plus git-worktree helpers for parallel task execution. Everything is driven by one user-global configuration file (`~/.config/usereq/config.json`); nothing is written into your project repository. It runs as a Python package (installed as `req`, `usereq`, or `use-req`) or directly via `uvx`.
|
|
725
|
+
</p>
|
|
725
726
|
|
|
726
|
-
|
|
727
|
+
<p align="center">
|
|
728
|
+
<a href="#feature-highlights">Feature Highlights</a> |
|
|
729
|
+
<a href="#quick-start">Quick Start</a> |
|
|
730
|
+
<a href="#requirements">Requirements</a> |
|
|
731
|
+
<a href="#users-guide">User's Guide</a> |
|
|
732
|
+
<a href="#acknowledgments">Acknowledgments</a>
|
|
733
|
+
</p>
|
|
727
734
|
|
|
728
|
-
|
|
729
|
-
|
|
735
|
+
<p align="center">
|
|
736
|
+
🚧 <strong>STAGE:</strong> PRE-ALPHA 📝 - Proof-of-Concept (PoC) version 🏗️ 🚧<br>
|
|
737
|
+
⚠️ <strong>IMPORTANT NOTICE</strong>: Created with <a href="https://www.npmjs.com/package/pi-usereq"><strong>PI-useReq/pi-usereq</strong></a> 🤖✨ ⚠️<br>
|
|
738
|
+
</p>
|
|
730
739
|
|
|
731
740
|
# Feature Highlights
|
|
732
741
|
|
|
@@ -806,7 +815,7 @@ This exposes the CLI as `req` (also callable as `use-req` / `usereq` or `python
|
|
|
806
815
|
req --upgrade
|
|
807
816
|
```
|
|
808
817
|
|
|
809
|
-
On Linux this executes `uv tool install cli-usereq --force` from the PyPI index; on other platforms the manual command is printed and `uv` is not executed. Use `req --upgrade --
|
|
818
|
+
On Linux this executes `uv tool install cli-usereq --force` from the PyPI index; on other platforms the manual command is printed and `uv` is not executed. Use `req --upgrade --develop` (or the equivalent `req --upgrade --dev`) to install the latest GitHub release instead of PyPI. When the upgrade succeeds and `auto-install` is enabled (the default), the persisted providers are automatically re-provisioned — equivalent to running `install`. Provide `--prj-base` in the same invocation to enable this; without it, a warning is printed and the provider update is skipped. Disable the behavior persistently with `--disable-auto-install` and re-enable it with `--enable-auto-install`.
|
|
810
819
|
|
|
811
820
|
### Install from GitHub (alternative channel)
|
|
812
821
|
|
|
@@ -820,10 +829,10 @@ uv tool install cli-usereq --force --from git+https://github.com/Ogekuri/CLI-use
|
|
|
820
829
|
uvx --from git+https://github.com/Ogekuri/CLI-useReq.git req --help
|
|
821
830
|
|
|
822
831
|
# or upgrade an existing installation to the latest GitHub release
|
|
823
|
-
req --upgrade --
|
|
832
|
+
req --upgrade --develop
|
|
824
833
|
```
|
|
825
834
|
|
|
826
|
-
On Linux `req --upgrade --
|
|
835
|
+
On Linux `req --upgrade --develop` (or `req --upgrade --dev`) executes `uv tool install cli-usereq --force --from git+https://github.com/Ogekuri/CLI-useReq.git`; on other platforms the manual command is printed and `uv` is not executed.
|
|
827
836
|
|
|
828
837
|
### Tool removal
|
|
829
838
|
|
|
@@ -835,7 +844,6 @@ req --uninstall # executes `uv tool uninstall cli-usereq` on Linux and clean
|
|
|
835
844
|
|
|
836
845
|
- `req install --prj-base PRJ_BASE` — installs or updates the providers persisted in the configuration and prints a Unicode installation summary report (per-provider `Prompts Installed` / `Modules Installed` columns). Requires at least one enabled provider, otherwise an English error is printed and the exit code is 4.
|
|
837
846
|
- `req uninstall` — reciprocal of `install`: removes the `req-*` artifacts of the configured providers from the user-level provider directories.
|
|
838
|
-
- `req --remove` — same artifact removal, flag form.
|
|
839
847
|
- `req show` — prints the active configuration as tables: settings (including `auto-install`), provider enablement status, one dedicated per-provider table showing the installation status of the `prompts`, `agents`, and `skills` components detected on disk, and the enabled static-check entries.
|
|
840
848
|
|
|
841
849
|
Artifacts are always installed into **user-level CLI configuration directories under your HOME** (`~/.claude`, `~/.codex`, `~/.antigravity`, `~/.config/opencode`, `~/.pi/agent`); nothing is ever written into the project repository.
|
|
@@ -914,26 +922,26 @@ A standalone testbed is available: `req --test-static-check {dummy,pylance,ruff,
|
|
|
914
922
|
|
|
915
923
|
`req` can be run from any directory. Two path arguments drive location resolution:
|
|
916
924
|
|
|
917
|
-
- `--prj-base <project-folder>` — mandatory for
|
|
918
|
-
- `--git-base <git-repository-folder>` — mandatory for
|
|
925
|
+
- `--prj-base <project-folder>` — mandatory for commands that read or write project files (`install`, `--docs-check`, `--set-*-dir`, and the project-scan subcommands `tokens`, `references`, `compress`, `find`, `static-check`, `files-static-check`).
|
|
926
|
+
- `--git-base <git-repository-folder>` — mandatory for the git commands (`--git-check`, `--git-wt-name`, `--git-wt-create`, `--git-wt-delete`); not required by any analysis subcommand.
|
|
919
927
|
- `--prj-base` and `--git-base` are never persisted in `~/.config/usereq/config.json`.
|
|
920
928
|
|
|
921
929
|
### Analysis subcommands
|
|
922
930
|
|
|
923
|
-
The analysis commands are bare subcommands (no `--` prefix)
|
|
931
|
+
The analysis commands are bare subcommands (no `--` prefix); the project-scan ones require `--prj-base`, and none of them requires `--git-base`. Legacy `--`-prefixed forms are not accepted.
|
|
924
932
|
|
|
925
933
|
| Subcommand | Purpose |
|
|
926
934
|
| --- | --- |
|
|
927
|
-
| `files-tokens
|
|
928
|
-
| `files-references
|
|
929
|
-
| `files-compress
|
|
930
|
-
| `files-find
|
|
931
|
-
| `files-static-check --prj-base P
|
|
932
|
-
| `tokens --prj-base P
|
|
933
|
-
| `references --prj-base P
|
|
934
|
-
| `compress --prj-base P
|
|
935
|
-
| `find --prj-base P
|
|
936
|
-
| `static-check --prj-base P
|
|
935
|
+
| `files-tokens FILE [FILE ...]` | Count tokens and chars for the given files |
|
|
936
|
+
| `files-references FILE [FILE ...]` | Generate LLM reference markdown for the given files |
|
|
937
|
+
| `files-compress [--enable-line-numbers] FILE [FILE ...]` | Generate compressed output for the given files |
|
|
938
|
+
| `files-find [--enable-line-numbers] TAG PATTERN FILE [FILE ...]` | Find and extract specific constructs from the given files |
|
|
939
|
+
| `files-static-check --prj-base P FILE [FILE ...]` | Run static analysis on the given files |
|
|
940
|
+
| `tokens --prj-base P` | Count tokens/chars for canonical docs (`REQUIREMENTS.md`, `WORKFLOW.md`, `REFERENCES.md`) in configured `docs-dir` |
|
|
941
|
+
| `references --prj-base P` | Reference markdown for source files selected by `git ls-files --cached --others --exclude-standard` under configured `src-dir` |
|
|
942
|
+
| `compress --prj-base P [--enable-line-numbers]` | Compressed output for the same project selection |
|
|
943
|
+
| `find --prj-base P [--enable-line-numbers] TAG PATTERN` | Extract constructs from the same project selection |
|
|
944
|
+
| `static-check --prj-base P` | Static analysis on `src-dir` + `tests-dir` selections (excluding `fixtures/`) |
|
|
937
945
|
|
|
938
946
|
Notes:
|
|
939
947
|
|
|
@@ -974,11 +982,9 @@ Notes:
|
|
|
974
982
|
|
|
975
983
|
### Other flags
|
|
976
984
|
|
|
977
|
-
- `--update` — update an existing installation from the persisted configuration (requires an existing `~/.config/usereq/config.json`); the `install` subcommand is the canonical form.
|
|
978
|
-
- `--remove` — remove `req-*` artifacts generated by useReq from the configured user-level provider directories.
|
|
979
985
|
- `--verbose` / `--debug` — detailed and diagnostic output.
|
|
980
986
|
- `--ver` / `--version` — print the installed package version, query PyPI and GitHub, and print `PyPI latest: <version>` and `GitHub latest: <version>` lines (`unknown` when a repository cannot be reached).
|
|
981
|
-
- `--
|
|
987
|
+
- `--develop` / `--dev` — with `--upgrade`: install from the GitHub repository `git+https://github.com/Ogekuri/CLI-useReq.git` instead of PyPI; `--dev` is an equivalent alias of `--develop`.
|
|
982
988
|
- `-h` / `--help` — print command help and exit.
|
|
983
989
|
|
|
984
990
|
A startup release check queries the latest PyPI release (idle-gated to at most once per hour; once per day on API failures) and prints a bright-green stderr notice when a newer version is available.
|
|
@@ -1083,7 +1089,7 @@ Requirements-driven projects keep their normative documentation under the config
|
|
|
1083
1089
|
|
|
1084
1090
|
- `scripts/req.sh` runs the CLI via `uv run python -m usereq.cli` from the repository root, forwarding all user arguments unchanged.
|
|
1085
1091
|
- `scripts/test-install.sh` performs an isolated-HOME smoke installation (`--enable pi:prompts,skills` + `install`).
|
|
1086
|
-
- `scripts/prompts-update.sh` synchronizes the bundled prompts from the upstream [Ogekuri/Prompts](https://github.com/Ogekuri/Prompts) releases into `src/usereq/resources/prompts`.
|
|
1092
|
+
- `scripts/prompts-update.sh` synchronizes the bundled prompts from the upstream [Ogekuri/CLI-Prompts](https://github.com/Ogekuri/CLI-Prompts) releases into `src/usereq/resources/prompts`.
|
|
1087
1093
|
- `uv.lock` is the canonical dependency lockfile for execution, build, development, testing, and static analysis.
|
|
1088
1094
|
|
|
1089
1095
|
## Note on Git usage
|
|
@@ -1127,7 +1133,7 @@ This program is distributed in the hope that it will be useful, but **without an
|
|
|
1127
1133
|
|
|
1128
1134
|
# Acknowledgments
|
|
1129
1135
|
|
|
1130
|
-
- **[Ogekuri/Prompts](https://github.com/Ogekuri/Prompts)** — upstream source of the bundled requirements-engineering prompt catalog (`src/usereq/resources/prompts`).
|
|
1136
|
+
- **[Ogekuri/CLI-Prompts](https://github.com/Ogekuri/CLI-Prompts)** — upstream source of the bundled requirements-engineering prompt catalog (`src/usereq/resources/prompts`).
|
|
1131
1137
|
- **[Astral](https://astral.sh)** — for `uv`, the Python package and project manager that powers installation, execution, and self-upgrade.
|
|
1132
1138
|
- **[OpenAI tiktoken](https://github.com/openai/tiktoken)** — token counting for LLM context budgeting.
|
|
1133
1139
|
- **[pyright](https://github.com/microsoft/pyright)** and **[ruff](https://github.com/astral-sh/ruff)** — the static-analysis engines exposed through the `Pylance` and `Ruff` modules.
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
> * **No Support or Feature Requests:** Please **do not** open issues, bug reports, or feature requests. They will not be addressed or accepted at this stage of development.
|
|
11
11
|
> * **No Warranty:** This software is provided **"AS IS"**, without warranty of any kind, express or implied. You may use it strictly for **testing and evaluation purposes** at your own sole risk.
|
|
12
12
|
|
|
13
|
-
# useReq / req (0.68.
|
|
13
|
+
# useReq / req (0.68.2)
|
|
14
14
|
|
|
15
15
|
<p align="center">
|
|
16
16
|
<img src="https://img.shields.io/badge/python-3.11%2B-3776AB?style=flat-square&logo=python&logoColor=white" alt="Python 3.11+">
|
|
@@ -20,14 +20,23 @@
|
|
|
20
20
|
<img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json" alt="uv">
|
|
21
21
|
</p>
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
<p align="center">
|
|
24
|
+
<strong>The `req` CLI provisions requirements-driven development prompts for LLM agents.</strong><br>
|
|
25
25
|
In more detail: useReq packages a catalog of requirements-engineering prompts (write, create, change, implement, check, and more) and installs them as user-level prompts, commands, skills, and agents for the CLIs and agents you already use — exposed as `/req-<name>`, `/req:<name>`, `/skill:req-<name>`, `$req-<name>`, or `/req-<name>.prompt` depending on the provider. It also ships an embedded source-analysis toolkit (token counting, references, compression, construct extraction, static checks) that operates on your project across 20 programming languages, plus git-worktree helpers for parallel task execution. Everything is driven by one user-global configuration file (`~/.config/usereq/config.json`); nothing is written into your project repository. It runs as a Python package (installed as `req`, `usereq`, or `use-req`) or directly via `uvx`.
|
|
26
|
+
</p>
|
|
26
27
|
|
|
27
|
-
|
|
28
|
+
<p align="center">
|
|
29
|
+
<a href="#feature-highlights">Feature Highlights</a> |
|
|
30
|
+
<a href="#quick-start">Quick Start</a> |
|
|
31
|
+
<a href="#requirements">Requirements</a> |
|
|
32
|
+
<a href="#users-guide">User's Guide</a> |
|
|
33
|
+
<a href="#acknowledgments">Acknowledgments</a>
|
|
34
|
+
</p>
|
|
28
35
|
|
|
29
|
-
|
|
30
|
-
|
|
36
|
+
<p align="center">
|
|
37
|
+
🚧 <strong>STAGE:</strong> PRE-ALPHA 📝 - Proof-of-Concept (PoC) version 🏗️ 🚧<br>
|
|
38
|
+
⚠️ <strong>IMPORTANT NOTICE</strong>: Created with <a href="https://www.npmjs.com/package/pi-usereq"><strong>PI-useReq/pi-usereq</strong></a> 🤖✨ ⚠️<br>
|
|
39
|
+
</p>
|
|
31
40
|
|
|
32
41
|
# Feature Highlights
|
|
33
42
|
|
|
@@ -107,7 +116,7 @@ This exposes the CLI as `req` (also callable as `use-req` / `usereq` or `python
|
|
|
107
116
|
req --upgrade
|
|
108
117
|
```
|
|
109
118
|
|
|
110
|
-
On Linux this executes `uv tool install cli-usereq --force` from the PyPI index; on other platforms the manual command is printed and `uv` is not executed. Use `req --upgrade --
|
|
119
|
+
On Linux this executes `uv tool install cli-usereq --force` from the PyPI index; on other platforms the manual command is printed and `uv` is not executed. Use `req --upgrade --develop` (or the equivalent `req --upgrade --dev`) to install the latest GitHub release instead of PyPI. When the upgrade succeeds and `auto-install` is enabled (the default), the persisted providers are automatically re-provisioned — equivalent to running `install`. Provide `--prj-base` in the same invocation to enable this; without it, a warning is printed and the provider update is skipped. Disable the behavior persistently with `--disable-auto-install` and re-enable it with `--enable-auto-install`.
|
|
111
120
|
|
|
112
121
|
### Install from GitHub (alternative channel)
|
|
113
122
|
|
|
@@ -121,10 +130,10 @@ uv tool install cli-usereq --force --from git+https://github.com/Ogekuri/CLI-use
|
|
|
121
130
|
uvx --from git+https://github.com/Ogekuri/CLI-useReq.git req --help
|
|
122
131
|
|
|
123
132
|
# or upgrade an existing installation to the latest GitHub release
|
|
124
|
-
req --upgrade --
|
|
133
|
+
req --upgrade --develop
|
|
125
134
|
```
|
|
126
135
|
|
|
127
|
-
On Linux `req --upgrade --
|
|
136
|
+
On Linux `req --upgrade --develop` (or `req --upgrade --dev`) executes `uv tool install cli-usereq --force --from git+https://github.com/Ogekuri/CLI-useReq.git`; on other platforms the manual command is printed and `uv` is not executed.
|
|
128
137
|
|
|
129
138
|
### Tool removal
|
|
130
139
|
|
|
@@ -136,7 +145,6 @@ req --uninstall # executes `uv tool uninstall cli-usereq` on Linux and clean
|
|
|
136
145
|
|
|
137
146
|
- `req install --prj-base PRJ_BASE` — installs or updates the providers persisted in the configuration and prints a Unicode installation summary report (per-provider `Prompts Installed` / `Modules Installed` columns). Requires at least one enabled provider, otherwise an English error is printed and the exit code is 4.
|
|
138
147
|
- `req uninstall` — reciprocal of `install`: removes the `req-*` artifacts of the configured providers from the user-level provider directories.
|
|
139
|
-
- `req --remove` — same artifact removal, flag form.
|
|
140
148
|
- `req show` — prints the active configuration as tables: settings (including `auto-install`), provider enablement status, one dedicated per-provider table showing the installation status of the `prompts`, `agents`, and `skills` components detected on disk, and the enabled static-check entries.
|
|
141
149
|
|
|
142
150
|
Artifacts are always installed into **user-level CLI configuration directories under your HOME** (`~/.claude`, `~/.codex`, `~/.antigravity`, `~/.config/opencode`, `~/.pi/agent`); nothing is ever written into the project repository.
|
|
@@ -215,26 +223,26 @@ A standalone testbed is available: `req --test-static-check {dummy,pylance,ruff,
|
|
|
215
223
|
|
|
216
224
|
`req` can be run from any directory. Two path arguments drive location resolution:
|
|
217
225
|
|
|
218
|
-
- `--prj-base <project-folder>` — mandatory for
|
|
219
|
-
- `--git-base <git-repository-folder>` — mandatory for
|
|
226
|
+
- `--prj-base <project-folder>` — mandatory for commands that read or write project files (`install`, `--docs-check`, `--set-*-dir`, and the project-scan subcommands `tokens`, `references`, `compress`, `find`, `static-check`, `files-static-check`).
|
|
227
|
+
- `--git-base <git-repository-folder>` — mandatory for the git commands (`--git-check`, `--git-wt-name`, `--git-wt-create`, `--git-wt-delete`); not required by any analysis subcommand.
|
|
220
228
|
- `--prj-base` and `--git-base` are never persisted in `~/.config/usereq/config.json`.
|
|
221
229
|
|
|
222
230
|
### Analysis subcommands
|
|
223
231
|
|
|
224
|
-
The analysis commands are bare subcommands (no `--` prefix)
|
|
232
|
+
The analysis commands are bare subcommands (no `--` prefix); the project-scan ones require `--prj-base`, and none of them requires `--git-base`. Legacy `--`-prefixed forms are not accepted.
|
|
225
233
|
|
|
226
234
|
| Subcommand | Purpose |
|
|
227
235
|
| --- | --- |
|
|
228
|
-
| `files-tokens
|
|
229
|
-
| `files-references
|
|
230
|
-
| `files-compress
|
|
231
|
-
| `files-find
|
|
232
|
-
| `files-static-check --prj-base P
|
|
233
|
-
| `tokens --prj-base P
|
|
234
|
-
| `references --prj-base P
|
|
235
|
-
| `compress --prj-base P
|
|
236
|
-
| `find --prj-base P
|
|
237
|
-
| `static-check --prj-base P
|
|
236
|
+
| `files-tokens FILE [FILE ...]` | Count tokens and chars for the given files |
|
|
237
|
+
| `files-references FILE [FILE ...]` | Generate LLM reference markdown for the given files |
|
|
238
|
+
| `files-compress [--enable-line-numbers] FILE [FILE ...]` | Generate compressed output for the given files |
|
|
239
|
+
| `files-find [--enable-line-numbers] TAG PATTERN FILE [FILE ...]` | Find and extract specific constructs from the given files |
|
|
240
|
+
| `files-static-check --prj-base P FILE [FILE ...]` | Run static analysis on the given files |
|
|
241
|
+
| `tokens --prj-base P` | Count tokens/chars for canonical docs (`REQUIREMENTS.md`, `WORKFLOW.md`, `REFERENCES.md`) in configured `docs-dir` |
|
|
242
|
+
| `references --prj-base P` | Reference markdown for source files selected by `git ls-files --cached --others --exclude-standard` under configured `src-dir` |
|
|
243
|
+
| `compress --prj-base P [--enable-line-numbers]` | Compressed output for the same project selection |
|
|
244
|
+
| `find --prj-base P [--enable-line-numbers] TAG PATTERN` | Extract constructs from the same project selection |
|
|
245
|
+
| `static-check --prj-base P` | Static analysis on `src-dir` + `tests-dir` selections (excluding `fixtures/`) |
|
|
238
246
|
|
|
239
247
|
Notes:
|
|
240
248
|
|
|
@@ -275,11 +283,9 @@ Notes:
|
|
|
275
283
|
|
|
276
284
|
### Other flags
|
|
277
285
|
|
|
278
|
-
- `--update` — update an existing installation from the persisted configuration (requires an existing `~/.config/usereq/config.json`); the `install` subcommand is the canonical form.
|
|
279
|
-
- `--remove` — remove `req-*` artifacts generated by useReq from the configured user-level provider directories.
|
|
280
286
|
- `--verbose` / `--debug` — detailed and diagnostic output.
|
|
281
287
|
- `--ver` / `--version` — print the installed package version, query PyPI and GitHub, and print `PyPI latest: <version>` and `GitHub latest: <version>` lines (`unknown` when a repository cannot be reached).
|
|
282
|
-
- `--
|
|
288
|
+
- `--develop` / `--dev` — with `--upgrade`: install from the GitHub repository `git+https://github.com/Ogekuri/CLI-useReq.git` instead of PyPI; `--dev` is an equivalent alias of `--develop`.
|
|
283
289
|
- `-h` / `--help` — print command help and exit.
|
|
284
290
|
|
|
285
291
|
A startup release check queries the latest PyPI release (idle-gated to at most once per hour; once per day on API failures) and prints a bright-green stderr notice when a newer version is available.
|
|
@@ -384,7 +390,7 @@ Requirements-driven projects keep their normative documentation under the config
|
|
|
384
390
|
|
|
385
391
|
- `scripts/req.sh` runs the CLI via `uv run python -m usereq.cli` from the repository root, forwarding all user arguments unchanged.
|
|
386
392
|
- `scripts/test-install.sh` performs an isolated-HOME smoke installation (`--enable pi:prompts,skills` + `install`).
|
|
387
|
-
- `scripts/prompts-update.sh` synchronizes the bundled prompts from the upstream [Ogekuri/Prompts](https://github.com/Ogekuri/Prompts) releases into `src/usereq/resources/prompts`.
|
|
393
|
+
- `scripts/prompts-update.sh` synchronizes the bundled prompts from the upstream [Ogekuri/CLI-Prompts](https://github.com/Ogekuri/CLI-Prompts) releases into `src/usereq/resources/prompts`.
|
|
388
394
|
- `uv.lock` is the canonical dependency lockfile for execution, build, development, testing, and static analysis.
|
|
389
395
|
|
|
390
396
|
## Note on Git usage
|
|
@@ -428,7 +434,7 @@ This program is distributed in the hope that it will be useful, but **without an
|
|
|
428
434
|
|
|
429
435
|
# Acknowledgments
|
|
430
436
|
|
|
431
|
-
- **[Ogekuri/Prompts](https://github.com/Ogekuri/Prompts)** — upstream source of the bundled requirements-engineering prompt catalog (`src/usereq/resources/prompts`).
|
|
437
|
+
- **[Ogekuri/CLI-Prompts](https://github.com/Ogekuri/CLI-Prompts)** — upstream source of the bundled requirements-engineering prompt catalog (`src/usereq/resources/prompts`).
|
|
432
438
|
- **[Astral](https://astral.sh)** — for `uv`, the Python package and project manager that powers installation, execution, and self-upgrade.
|
|
433
439
|
- **[OpenAI tiktoken](https://github.com/openai/tiktoken)** — token counting for LLM context budgeting.
|
|
434
440
|
- **[pyright](https://github.com/microsoft/pyright)** and **[ruff](https://github.com/astral-sh/ruff)** — the static-analysis engines exposed through the `Pylance` and `Ruff` modules.
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "cli-usereq"
|
|
7
|
-
version = "0.68.
|
|
7
|
+
version = "0.68.2"
|
|
8
8
|
description = "Initialize a project with prompts, agents, and templates from the useReq repository."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cli-usereq
|
|
3
|
-
Version: 0.68.
|
|
3
|
+
Version: 0.68.2
|
|
4
4
|
Summary: Initialize a project with prompts, agents, and templates from the useReq repository.
|
|
5
5
|
Author: Ogekuri
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -709,7 +709,7 @@ Dynamic: license-file
|
|
|
709
709
|
> * **No Support or Feature Requests:** Please **do not** open issues, bug reports, or feature requests. They will not be addressed or accepted at this stage of development.
|
|
710
710
|
> * **No Warranty:** This software is provided **"AS IS"**, without warranty of any kind, express or implied. You may use it strictly for **testing and evaluation purposes** at your own sole risk.
|
|
711
711
|
|
|
712
|
-
# useReq / req (0.68.
|
|
712
|
+
# useReq / req (0.68.2)
|
|
713
713
|
|
|
714
714
|
<p align="center">
|
|
715
715
|
<img src="https://img.shields.io/badge/python-3.11%2B-3776AB?style=flat-square&logo=python&logoColor=white" alt="Python 3.11+">
|
|
@@ -719,14 +719,23 @@ Dynamic: license-file
|
|
|
719
719
|
<img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json" alt="uv">
|
|
720
720
|
</p>
|
|
721
721
|
|
|
722
|
-
|
|
723
|
-
|
|
722
|
+
<p align="center">
|
|
723
|
+
<strong>The `req` CLI provisions requirements-driven development prompts for LLM agents.</strong><br>
|
|
724
724
|
In more detail: useReq packages a catalog of requirements-engineering prompts (write, create, change, implement, check, and more) and installs them as user-level prompts, commands, skills, and agents for the CLIs and agents you already use — exposed as `/req-<name>`, `/req:<name>`, `/skill:req-<name>`, `$req-<name>`, or `/req-<name>.prompt` depending on the provider. It also ships an embedded source-analysis toolkit (token counting, references, compression, construct extraction, static checks) that operates on your project across 20 programming languages, plus git-worktree helpers for parallel task execution. Everything is driven by one user-global configuration file (`~/.config/usereq/config.json`); nothing is written into your project repository. It runs as a Python package (installed as `req`, `usereq`, or `use-req`) or directly via `uvx`.
|
|
725
|
+
</p>
|
|
725
726
|
|
|
726
|
-
|
|
727
|
+
<p align="center">
|
|
728
|
+
<a href="#feature-highlights">Feature Highlights</a> |
|
|
729
|
+
<a href="#quick-start">Quick Start</a> |
|
|
730
|
+
<a href="#requirements">Requirements</a> |
|
|
731
|
+
<a href="#users-guide">User's Guide</a> |
|
|
732
|
+
<a href="#acknowledgments">Acknowledgments</a>
|
|
733
|
+
</p>
|
|
727
734
|
|
|
728
|
-
|
|
729
|
-
|
|
735
|
+
<p align="center">
|
|
736
|
+
🚧 <strong>STAGE:</strong> PRE-ALPHA 📝 - Proof-of-Concept (PoC) version 🏗️ 🚧<br>
|
|
737
|
+
⚠️ <strong>IMPORTANT NOTICE</strong>: Created with <a href="https://www.npmjs.com/package/pi-usereq"><strong>PI-useReq/pi-usereq</strong></a> 🤖✨ ⚠️<br>
|
|
738
|
+
</p>
|
|
730
739
|
|
|
731
740
|
# Feature Highlights
|
|
732
741
|
|
|
@@ -806,7 +815,7 @@ This exposes the CLI as `req` (also callable as `use-req` / `usereq` or `python
|
|
|
806
815
|
req --upgrade
|
|
807
816
|
```
|
|
808
817
|
|
|
809
|
-
On Linux this executes `uv tool install cli-usereq --force` from the PyPI index; on other platforms the manual command is printed and `uv` is not executed. Use `req --upgrade --
|
|
818
|
+
On Linux this executes `uv tool install cli-usereq --force` from the PyPI index; on other platforms the manual command is printed and `uv` is not executed. Use `req --upgrade --develop` (or the equivalent `req --upgrade --dev`) to install the latest GitHub release instead of PyPI. When the upgrade succeeds and `auto-install` is enabled (the default), the persisted providers are automatically re-provisioned — equivalent to running `install`. Provide `--prj-base` in the same invocation to enable this; without it, a warning is printed and the provider update is skipped. Disable the behavior persistently with `--disable-auto-install` and re-enable it with `--enable-auto-install`.
|
|
810
819
|
|
|
811
820
|
### Install from GitHub (alternative channel)
|
|
812
821
|
|
|
@@ -820,10 +829,10 @@ uv tool install cli-usereq --force --from git+https://github.com/Ogekuri/CLI-use
|
|
|
820
829
|
uvx --from git+https://github.com/Ogekuri/CLI-useReq.git req --help
|
|
821
830
|
|
|
822
831
|
# or upgrade an existing installation to the latest GitHub release
|
|
823
|
-
req --upgrade --
|
|
832
|
+
req --upgrade --develop
|
|
824
833
|
```
|
|
825
834
|
|
|
826
|
-
On Linux `req --upgrade --
|
|
835
|
+
On Linux `req --upgrade --develop` (or `req --upgrade --dev`) executes `uv tool install cli-usereq --force --from git+https://github.com/Ogekuri/CLI-useReq.git`; on other platforms the manual command is printed and `uv` is not executed.
|
|
827
836
|
|
|
828
837
|
### Tool removal
|
|
829
838
|
|
|
@@ -835,7 +844,6 @@ req --uninstall # executes `uv tool uninstall cli-usereq` on Linux and clean
|
|
|
835
844
|
|
|
836
845
|
- `req install --prj-base PRJ_BASE` — installs or updates the providers persisted in the configuration and prints a Unicode installation summary report (per-provider `Prompts Installed` / `Modules Installed` columns). Requires at least one enabled provider, otherwise an English error is printed and the exit code is 4.
|
|
837
846
|
- `req uninstall` — reciprocal of `install`: removes the `req-*` artifacts of the configured providers from the user-level provider directories.
|
|
838
|
-
- `req --remove` — same artifact removal, flag form.
|
|
839
847
|
- `req show` — prints the active configuration as tables: settings (including `auto-install`), provider enablement status, one dedicated per-provider table showing the installation status of the `prompts`, `agents`, and `skills` components detected on disk, and the enabled static-check entries.
|
|
840
848
|
|
|
841
849
|
Artifacts are always installed into **user-level CLI configuration directories under your HOME** (`~/.claude`, `~/.codex`, `~/.antigravity`, `~/.config/opencode`, `~/.pi/agent`); nothing is ever written into the project repository.
|
|
@@ -914,26 +922,26 @@ A standalone testbed is available: `req --test-static-check {dummy,pylance,ruff,
|
|
|
914
922
|
|
|
915
923
|
`req` can be run from any directory. Two path arguments drive location resolution:
|
|
916
924
|
|
|
917
|
-
- `--prj-base <project-folder>` — mandatory for
|
|
918
|
-
- `--git-base <git-repository-folder>` — mandatory for
|
|
925
|
+
- `--prj-base <project-folder>` — mandatory for commands that read or write project files (`install`, `--docs-check`, `--set-*-dir`, and the project-scan subcommands `tokens`, `references`, `compress`, `find`, `static-check`, `files-static-check`).
|
|
926
|
+
- `--git-base <git-repository-folder>` — mandatory for the git commands (`--git-check`, `--git-wt-name`, `--git-wt-create`, `--git-wt-delete`); not required by any analysis subcommand.
|
|
919
927
|
- `--prj-base` and `--git-base` are never persisted in `~/.config/usereq/config.json`.
|
|
920
928
|
|
|
921
929
|
### Analysis subcommands
|
|
922
930
|
|
|
923
|
-
The analysis commands are bare subcommands (no `--` prefix)
|
|
931
|
+
The analysis commands are bare subcommands (no `--` prefix); the project-scan ones require `--prj-base`, and none of them requires `--git-base`. Legacy `--`-prefixed forms are not accepted.
|
|
924
932
|
|
|
925
933
|
| Subcommand | Purpose |
|
|
926
934
|
| --- | --- |
|
|
927
|
-
| `files-tokens
|
|
928
|
-
| `files-references
|
|
929
|
-
| `files-compress
|
|
930
|
-
| `files-find
|
|
931
|
-
| `files-static-check --prj-base P
|
|
932
|
-
| `tokens --prj-base P
|
|
933
|
-
| `references --prj-base P
|
|
934
|
-
| `compress --prj-base P
|
|
935
|
-
| `find --prj-base P
|
|
936
|
-
| `static-check --prj-base P
|
|
935
|
+
| `files-tokens FILE [FILE ...]` | Count tokens and chars for the given files |
|
|
936
|
+
| `files-references FILE [FILE ...]` | Generate LLM reference markdown for the given files |
|
|
937
|
+
| `files-compress [--enable-line-numbers] FILE [FILE ...]` | Generate compressed output for the given files |
|
|
938
|
+
| `files-find [--enable-line-numbers] TAG PATTERN FILE [FILE ...]` | Find and extract specific constructs from the given files |
|
|
939
|
+
| `files-static-check --prj-base P FILE [FILE ...]` | Run static analysis on the given files |
|
|
940
|
+
| `tokens --prj-base P` | Count tokens/chars for canonical docs (`REQUIREMENTS.md`, `WORKFLOW.md`, `REFERENCES.md`) in configured `docs-dir` |
|
|
941
|
+
| `references --prj-base P` | Reference markdown for source files selected by `git ls-files --cached --others --exclude-standard` under configured `src-dir` |
|
|
942
|
+
| `compress --prj-base P [--enable-line-numbers]` | Compressed output for the same project selection |
|
|
943
|
+
| `find --prj-base P [--enable-line-numbers] TAG PATTERN` | Extract constructs from the same project selection |
|
|
944
|
+
| `static-check --prj-base P` | Static analysis on `src-dir` + `tests-dir` selections (excluding `fixtures/`) |
|
|
937
945
|
|
|
938
946
|
Notes:
|
|
939
947
|
|
|
@@ -974,11 +982,9 @@ Notes:
|
|
|
974
982
|
|
|
975
983
|
### Other flags
|
|
976
984
|
|
|
977
|
-
- `--update` — update an existing installation from the persisted configuration (requires an existing `~/.config/usereq/config.json`); the `install` subcommand is the canonical form.
|
|
978
|
-
- `--remove` — remove `req-*` artifacts generated by useReq from the configured user-level provider directories.
|
|
979
985
|
- `--verbose` / `--debug` — detailed and diagnostic output.
|
|
980
986
|
- `--ver` / `--version` — print the installed package version, query PyPI and GitHub, and print `PyPI latest: <version>` and `GitHub latest: <version>` lines (`unknown` when a repository cannot be reached).
|
|
981
|
-
- `--
|
|
987
|
+
- `--develop` / `--dev` — with `--upgrade`: install from the GitHub repository `git+https://github.com/Ogekuri/CLI-useReq.git` instead of PyPI; `--dev` is an equivalent alias of `--develop`.
|
|
982
988
|
- `-h` / `--help` — print command help and exit.
|
|
983
989
|
|
|
984
990
|
A startup release check queries the latest PyPI release (idle-gated to at most once per hour; once per day on API failures) and prints a bright-green stderr notice when a newer version is available.
|
|
@@ -1083,7 +1089,7 @@ Requirements-driven projects keep their normative documentation under the config
|
|
|
1083
1089
|
|
|
1084
1090
|
- `scripts/req.sh` runs the CLI via `uv run python -m usereq.cli` from the repository root, forwarding all user arguments unchanged.
|
|
1085
1091
|
- `scripts/test-install.sh` performs an isolated-HOME smoke installation (`--enable pi:prompts,skills` + `install`).
|
|
1086
|
-
- `scripts/prompts-update.sh` synchronizes the bundled prompts from the upstream [Ogekuri/Prompts](https://github.com/Ogekuri/Prompts) releases into `src/usereq/resources/prompts`.
|
|
1092
|
+
- `scripts/prompts-update.sh` synchronizes the bundled prompts from the upstream [Ogekuri/CLI-Prompts](https://github.com/Ogekuri/CLI-Prompts) releases into `src/usereq/resources/prompts`.
|
|
1087
1093
|
- `uv.lock` is the canonical dependency lockfile for execution, build, development, testing, and static analysis.
|
|
1088
1094
|
|
|
1089
1095
|
## Note on Git usage
|
|
@@ -1127,7 +1133,7 @@ This program is distributed in the hope that it will be useful, but **without an
|
|
|
1127
1133
|
|
|
1128
1134
|
# Acknowledgments
|
|
1129
1135
|
|
|
1130
|
-
- **[Ogekuri/Prompts](https://github.com/Ogekuri/Prompts)** — upstream source of the bundled requirements-engineering prompt catalog (`src/usereq/resources/prompts`).
|
|
1136
|
+
- **[Ogekuri/CLI-Prompts](https://github.com/Ogekuri/CLI-Prompts)** — upstream source of the bundled requirements-engineering prompt catalog (`src/usereq/resources/prompts`).
|
|
1131
1137
|
- **[Astral](https://astral.sh)** — for `uv`, the Python package and project manager that powers installation, execution, and self-upgrade.
|
|
1132
1138
|
- **[OpenAI tiktoken](https://github.com/openai/tiktoken)** — token counting for LLM context budgeting.
|
|
1133
1139
|
- **[pyright](https://github.com/microsoft/pyright)** and **[ruff](https://github.com/astral-sh/ruff)** — the static-analysis engines exposed through the `Pylance` and `Ruff` modules.
|
|
@@ -18,7 +18,7 @@ from . import source_analyzer # usereq.source_analyzer submodule
|
|
|
18
18
|
from . import token_counter # usereq.token_counter submodule
|
|
19
19
|
from typing import Any
|
|
20
20
|
|
|
21
|
-
__version__ = "0.68.
|
|
21
|
+
__version__ = "0.68.2"
|
|
22
22
|
"""! @brief Semantic version string of the package."""
|
|
23
23
|
|
|
24
24
|
|