rpr-cli 0.3.5__tar.gz → 0.3.10__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.
- rpr_cli-0.3.5/README.md → rpr_cli-0.3.10/PKG-INFO +53 -14
- rpr_cli-0.3.5/PKG-INFO → rpr_cli-0.3.10/README.md +35 -31
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/pyproject.toml +10 -6
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/rpr-parser/Cargo.lock +1 -1
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/rpr-parser/Cargo.toml +3 -3
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/rpr-parser/src/lib.rs +1 -1
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/rpr-parser/src/rename.rs +115 -17
- rpr_cli-0.3.10/src/rpr/__init__.py +1 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/cli.py +8 -0
- rpr_cli-0.3.10/src/rpr/commands/rename.py +452 -0
- rpr_cli-0.3.10/src/rpr/commands/version.py +198 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/map/extractor.py +1 -1
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/project_rename.py +8 -6
- rpr_cli-0.3.5/.github/agents/story.agent.md +0 -165
- rpr_cli-0.3.5/.github/workflows/publish-pypi.yml +0 -59
- rpr_cli-0.3.5/.gitignore +0 -28
- rpr_cli-0.3.5/CLAUDE.md +0 -70
- rpr_cli-0.3.5/GEMINI.md +0 -0
- rpr_cli-0.3.5/changelogs/mui_v9.txt +0 -2178
- rpr_cli-0.3.5/code-map.md +0 -155
- rpr_cli-0.3.5/nx_uv_setup.md +0 -841
- rpr_cli-0.3.5/patch_output.py +0 -150
- rpr_cli-0.3.5/plan-languageAwareTemplateAdd.prompt.md +0 -63
- rpr_cli-0.3.5/rpr-parser/pyproject.toml +0 -12
- rpr_cli-0.3.5/rpr-parser/uv.lock +0 -8
- rpr_cli-0.3.5/special_files.md +0 -20
- rpr_cli-0.3.5/src/rpr/__init__.py +0 -1
- rpr_cli-0.3.5/src/rpr/commands/rename.py +0 -104
- rpr_cli-0.3.5/stories/README.md +0 -93
- rpr_cli-0.3.5/stories/chat-attachment-upload-gap.md +0 -306
- rpr_cli-0.3.5/stories/completed/00-bootstrap-cli.md +0 -61
- rpr_cli-0.3.5/stories/completed/01-rpr-init.md +0 -215
- rpr_cli-0.3.5/stories/completed/02-rpr-generate-domain.md +0 -89
- rpr_cli-0.3.5/stories/completed/03-rpr-generate-api.md +0 -39
- rpr_cli-0.3.5/stories/completed/04-rpr-generate-ui.md +0 -104
- rpr_cli-0.3.5/stories/completed/05-rpr-generate-engine.md +0 -111
- rpr_cli-0.3.5/stories/completed/06-rpr-generate-storybook.md +0 -89
- rpr_cli-0.3.5/stories/completed/07-rpr-sync-rules.md +0 -157
- rpr_cli-0.3.5/stories/completed/08-rpr-add-template.md +0 -69
- rpr_cli-0.3.5/stories/completed/09-rpr-check.md +0 -115
- rpr_cli-0.3.5/stories/completed/10-rpr-domain-config.md +0 -120
- rpr_cli-0.3.5/stories/completed/chat/18-rpr-terminal-ui-foundation.md +0 -37
- rpr_cli-0.3.5/stories/completed/chat/19-rpr-markdown-rendering.md +0 -38
- rpr_cli-0.3.5/stories/completed/chat/20-rpr-chat-repl.md +0 -36
- rpr_cli-0.3.5/stories/completed/chat/21-rpr-agent-tool-loop.md +0 -40
- rpr_cli-0.3.5/stories/completed/chat/22-rpr-chat-tui.md +0 -44
- rpr_cli-0.3.5/stories/completed/chat/23-rpr-chat-unified-command-shell.md +0 -96
- rpr_cli-0.3.5/stories/completed/chat/24-rpr-async-chat-runtime-and-services.md +0 -75
- rpr_cli-0.3.5/stories/completed/chat/25-rpr-prompt-service-and-conversation-lifecycle.md +0 -76
- rpr_cli-0.3.5/stories/completed/chat/26-rpr-shared-command-catalog.md +0 -213
- rpr_cli-0.3.5/stories/completed/chat/27-rpr-slash-command-selection-panel.md +0 -61
- rpr_cli-0.3.5/stories/completed/chat/28-rpr-chat-cancellable-and-multiline-input.md +0 -63
- rpr_cli-0.3.5/stories/completed/chat/29-rpr-file-context-selection.md +0 -52
- rpr_cli-0.3.5/stories/completed/map/11-rpr-map-command.md +0 -32
- rpr_cli-0.3.5/stories/completed/map/12-rpr-map-file-walker.md +0 -51
- rpr_cli-0.3.5/stories/completed/map/13-rpr-map-rust-engine.md +0 -126
- rpr_cli-0.3.5/stories/completed/map/13a-rpr-map-gitignore.md +0 -34
- rpr_cli-0.3.5/stories/completed/map/14-rpr-map-graph-builder.md +0 -94
- rpr_cli-0.3.5/stories/completed/map/15-rpr-map-analysis-bridge.md +0 -94
- rpr_cli-0.3.5/stories/completed/map/16-rpr-map-layer-classifier.md +0 -60
- rpr_cli-0.3.5/stories/completed/map/17-rpr-map-output.md +0 -94
- rpr_cli-0.3.5/stories/completed/map/17a-rpr-map-directory-topology.md +0 -65
- rpr_cli-0.3.5/stories/completed/map/17b-rpr-map-architecture-assessment.md +0 -61
- rpr_cli-0.3.5/stories/completed/map/17c-rpr-map-representative-chains.md +0 -52
- rpr_cli-0.3.5/stories/completed/map/17d-rpr-map-multi-resolution-output.md +0 -72
- rpr_cli-0.3.5/stories/map/30-rpr-map-directory-view-and-cycle-detection.md +0 -38
- rpr_cli-0.3.5/stories/map/31-rpr-map-coupling-hotspots-and-verdict-reasoning.md +0 -41
- rpr_cli-0.3.5/stories/map/32-rpr-map-dependencies-responsibilities-and-test-coverage.md +0 -98
- rpr_cli-0.3.5/stories/package-maintenance/default-vite-8-oxc-toolchain.md +0 -142
- rpr_cli-0.3.5/stories/package-maintenance/rpr-update-packages.md +0 -183
- rpr_cli-0.3.5/stories/package-maintenance/typescript-7-frontend-scaffold-compatibility.md +0 -123
- rpr_cli-0.3.5/tests/__init__.py +0 -0
- rpr_cli-0.3.5/tests/test_add.py +0 -753
- rpr_cli-0.3.5/tests/test_architecture.py +0 -659
- rpr_cli-0.3.5/tests/test_architecture_unwrapped.py +0 -152
- rpr_cli-0.3.5/tests/test_catalog.py +0 -222
- rpr_cli-0.3.5/tests/test_chat.py +0 -720
- rpr_cli-0.3.5/tests/test_chat_service.py +0 -282
- rpr_cli-0.3.5/tests/test_check.py +0 -564
- rpr_cli-0.3.5/tests/test_completer.py +0 -131
- rpr_cli-0.3.5/tests/test_context.py +0 -376
- rpr_cli-0.3.5/tests/test_generate_api.py +0 -125
- rpr_cli-0.3.5/tests/test_generate_domain.py +0 -327
- rpr_cli-0.3.5/tests/test_generate_engine.py +0 -133
- rpr_cli-0.3.5/tests/test_generate_storybook.py +0 -225
- rpr_cli-0.3.5/tests/test_generate_ui.py +0 -288
- rpr_cli-0.3.5/tests/test_init.py +0 -744
- rpr_cli-0.3.5/tests/test_map.py +0 -80
- rpr_cli-0.3.5/tests/test_map_chains.py +0 -554
- rpr_cli-0.3.5/tests/test_map_classifier.py +0 -330
- rpr_cli-0.3.5/tests/test_map_coverage.py +0 -182
- rpr_cli-0.3.5/tests/test_map_dependencies.py +0 -266
- rpr_cli-0.3.5/tests/test_map_extractor.py +0 -455
- rpr_cli-0.3.5/tests/test_map_graph.py +0 -309
- rpr_cli-0.3.5/tests/test_map_output.py +0 -1397
- rpr_cli-0.3.5/tests/test_map_responsibility.py +0 -220
- rpr_cli-0.3.5/tests/test_map_topology.py +0 -651
- rpr_cli-0.3.5/tests/test_map_walker.py +0 -448
- rpr_cli-0.3.5/tests/test_package_updates.py +0 -175
- rpr_cli-0.3.5/tests/test_packaging.py +0 -19
- rpr_cli-0.3.5/tests/test_prompt_session.py +0 -236
- rpr_cli-0.3.5/tests/test_refresh.py +0 -60
- rpr_cli-0.3.5/tests/test_rename.py +0 -433
- rpr_cli-0.3.5/tests/test_rpr_parser_stub.py +0 -15
- rpr_cli-0.3.5/tests/test_selector.py +0 -189
- rpr_cli-0.3.5/tests/test_settings.py +0 -112
- rpr_cli-0.3.5/tests/test_sync.py +0 -240
- rpr_cli-0.3.5/tests/test_ui.py +0 -133
- rpr_cli-0.3.5/tests/test_update_packages.py +0 -209
- rpr_cli-0.3.5/untitled:plan-chatAttachmentUploadGap.prompt.md +0 -52
- rpr_cli-0.3.5/update_output.py +0 -134
- rpr_cli-0.3.5/uv.lock +0 -309
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/LICENSE +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/rpr-parser/src/config/container.rs +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/rpr-parser/src/config/mod.rs +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/rpr-parser/src/config/settings.rs +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/rpr-parser/src/graph.rs +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/rpr-parser/src/models/dtos/mod.rs +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/rpr-parser/src/models/entities/mod.rs +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/rpr-parser/src/models/entities/users.rs +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/rpr-parser/src/models/mod.rs +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/rpr-parser/src/parse.rs +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/rpr-parser/src/repos/base.rs +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/rpr-parser/src/repos/mod.rs +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/rpr-parser/src/repos/users.rs +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/rpr-parser/src/resolve.rs +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/rpr-parser/src/walker.rs +0 -0
- /rpr_cli-0.3.5/rpr-parser/rpr_parser.pyi → /rpr_cli-0.3.10/src/rpr/_native.pyi +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/agent/__init__.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/agent/approval.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/agent/bootstrap.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/agent/client.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/agent/control.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/agent/mock.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/agent/runtime.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/agent/session.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/agent/tools/__init__.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/agent/tools/base.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/agent/tools/mutating.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/agent/tools/readonly.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/agent/tools/registry.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/application/__init__.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/application/catalog.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/application/chat_service.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/application/checks.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/application/cli_adapter.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/application/completer.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/application/conversation_service.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/application/prompt_service.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/application/selector.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/application/shell.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/checks/__init__.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/checks/base.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/checks/instructions.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/checks/packages.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/checks/workspace.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/commands/__init__.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/commands/add.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/commands/chat.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/commands/check.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/commands/generate/__init__.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/commands/generate/api.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/commands/generate/domain.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/commands/generate/engine.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/commands/generate/storybook.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/commands/generate/ui.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/commands/init.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/commands/map.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/commands/refresh.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/commands/settings.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/commands/sync.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/commands/update.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/context.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/dependencies.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/dependency_manifest_data.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/generators/__init__.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/generators/base.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/generators/claude.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/generators/codex.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/generators/copilot.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/generators/cursor.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/generators/gemini.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/generators/github.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/manifest_refresh.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/map/__init__.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/map/architecture.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/map/chains.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/map/classifier.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/map/coverage.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/map/dependencies.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/map/graph.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/map/output.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/map/responsibility.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/map/topology.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/map/walker.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/package_updates.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/domain/base_entity.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/domain/base_repo.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/domain/container.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/domain/settings.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/instructions/all.instructions.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/instructions/api.instructions.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/instructions/domain.instructions.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/instructions/frontend.instructions.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/instructions/rust-engine.instructions.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/instructions/setup-guide.instructions.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/instructions/tooling-setup.instructions.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/instructions/tooling.instructions.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/BACKEND_FLOW.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/README.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/client/content.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/client/httpChatStreamClient.spec.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/client/httpChatStreamClient.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/client/index.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/client/types.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/composer/ChatComposer.spec.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/composer/ChatComposer.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/composer/__screenshots__/ChatComposer.spec.tsx/ChatComposer-renders-custom-action-buttons-beside-the-attachment-control-1.png +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/composer/fileDrop.spec.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/composer/fileDrop.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/composer/index.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/ChatComposerMentionTokens.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/ChatSuggestionsPopover.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/LocalFileSuggestionAction.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/index.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/localFileSuggestions.spec.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/localFileSuggestions.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/triggerDetection.spec.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/triggerDetection.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/types.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/useChatSuggestions.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/composer/types.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/composer/useChatComposer.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/composer/useChatStream.spec.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/composer/useChatStream.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/experience/ChatExperience.spec.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/experience/ChatExperience.styles.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/experience/ChatExperience.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/experience/ChatExperienceComposer.styles.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/experience/ChatExperienceComposer.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/experience/ChatExperienceHeader.styles.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/experience/ChatExperienceHeader.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/experience/ThreadHistory.styles.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/experience/ThreadHistory.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/experience/chatStorage.spec.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/experience/chatStorage.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/experience/index.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/experience/types.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/experience/useChatExperience.spec.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/experience/useChatExperience.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/index.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/testing/createMockChatStreamClient.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/testing/createMockSuggestionProvider.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/testing/index.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/thread/ChatMessage.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/thread/ChatMessageActions.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/thread/ChatMessageContent.spec.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/thread/ChatMessageContent.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/thread/ChatThread.spec.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/thread/ChatThread.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/thread/README.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/thread/contentFormat.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/thread/index.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/thread/streaming.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/thread/types.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/virtual-list/VirtualComponent.spec.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/virtual-list/VirtualComponent.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/virtual-list/VirtualComponentList.spec.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/virtual-list/VirtualComponentList.tsx +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/chat/virtual-list/index.ts +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/fetch.service.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/sticky-navigation.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/sticky-navigation.spec.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/js_special_files/vitest-browser-config.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/api/routes/chat_routes.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/api/tests/test_chat.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/domain/models/dtos/chat_dtos.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/domain/models/dtos/conversation_history_dtos.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/domain/models/entities/conversation_history.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/domain/repos/conversation_history.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/domain/services/agent_session_codec.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/domain/services/chat_service.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/domain/services/conversation_history_service.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/domain/services/conversation_operations.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/domain/services/history_codec.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/domain/services/in_memory_history_store.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/domain/services/postgres_history_store.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/domain/services/protocols/conversation_history_store.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/domain/services/protocols/conversation_runtime.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/domain/services/protocols/llm_provider.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/domain/tests/test_chat_dtos.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/domain/tests/test_chat_service.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/domain/tests/test_history_codec.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/domain/tests/test_history_projection.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/domain/tests/test_persistence_config.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/chat/domain/tests/test_postgres_history_store.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/vllm_provider/domain/models/dtos/__init__.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/vllm_provider/domain/models/dtos/vllm_model_dtos.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/vllm_provider/domain/services/agents/VLLM_SETUP.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/vllm_provider/domain/services/agents/__init__.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/vllm_provider/domain/services/agents/model_catalog.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/vllm_provider/domain/services/agents/vllm_agent_factory.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/vllm_provider/domain/services/agents/vllm_agent_factory_protocol.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/vllm_provider/domain/services/agents/vllm_inference_coordinator.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/vllm_provider/domain/services/runtimes/__init__.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/vllm_provider/domain/services/runtimes/agents_sdk.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/vllm_provider/domain/services/runtimes/agents_sdk_message_mapping.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/vllm_provider/domain/tests/test_agents_sdk_runtime.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/vllm_provider/domain/tests/test_vllm_model_catalog.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/py_special_files/vllm_provider/domain/tests/test_vllm_provider.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/special_files/camel_case_model.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/special_files/domain_container.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/special_files/domain_settings.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/special_files/dto_util.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/special_files/encrypted_column.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/special_files/logging.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/special_files/mapper_util.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/special_files/partial_update.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/scaffolds/special_files/test_encrypted_column.md +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/templates/__init__.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/templates/registry.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/ui/__init__.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/ui/console.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/ui/markdown.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/ui/prompt_session.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/ui/renderers.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/ui/theme.py +0 -0
- {rpr_cli-0.3.5 → rpr_cli-0.3.10}/src/rpr/workspace.py +0 -0
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: rpr-cli
|
|
3
|
+
Version: 0.3.10
|
|
4
|
+
Requires-Dist: typer>=0.24.1
|
|
5
|
+
Requires-Dist: jinja2>=3.1.5
|
|
6
|
+
Requires-Dist: pyyaml>=6.0.2
|
|
7
|
+
Requires-Dist: rich>=14.3.3
|
|
8
|
+
Requires-Dist: pathspec>=1.0.4
|
|
9
|
+
Requires-Dist: prompt-toolkit>=3.0.52
|
|
10
|
+
Requires-Dist: tomlkit>=0.15.0
|
|
11
|
+
Requires-Dist: packaging>=26.2
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Summary: RPR CLI -- React Python Rust monorepo scaffolding orchestrator
|
|
14
|
+
License-Expression: MIT
|
|
15
|
+
Requires-Python: >=3.14
|
|
16
|
+
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
17
|
+
|
|
1
18
|
# RPR CLI
|
|
2
19
|
|
|
3
20
|
React Python Rust monorepo scaffolding orchestrator.
|
|
@@ -18,7 +35,8 @@ Both install the `rpr` command.
|
|
|
18
35
|
For development, editable install is fine:
|
|
19
36
|
|
|
20
37
|
```bash
|
|
21
|
-
uv
|
|
38
|
+
uv sync
|
|
39
|
+
uv run maturin develop
|
|
22
40
|
```
|
|
23
41
|
|
|
24
42
|
For an actual distributable install you can use in other projects, build the wheel first and install the built artifact:
|
|
@@ -34,6 +52,10 @@ From another local project you can also install the built artifact directly:
|
|
|
34
52
|
uv add ../project-getting-started/dist/rpr_cli-*.whl
|
|
35
53
|
```
|
|
36
54
|
|
|
55
|
+
The published wheels are mixed Python/Rust distributions. The `rpr._native`
|
|
56
|
+
binding used by `rpr rename` and accelerated `rpr map` is installed alongside
|
|
57
|
+
the Python package; no separate parser installation is required.
|
|
58
|
+
|
|
37
59
|
## Usage
|
|
38
60
|
|
|
39
61
|
### 🚀 Scaffolding & Generation
|
|
@@ -65,6 +87,19 @@ source and experiments to remain in rename scope. Binary contents, VCS data, and
|
|
|
65
87
|
symlink targets are never changed. The outer workspace directory keeps its
|
|
66
88
|
existing name.
|
|
67
89
|
|
|
90
|
+
After applying the rename, RPR synchronizes Node and Python dependencies and
|
|
91
|
+
runs uncached Nx build, Rust-engine build, and typecheck targets with the Nx
|
|
92
|
+
daemon disabled. This verifies the renamed project graph and commands without
|
|
93
|
+
deleting the existing Nx cache. Pass `--skip-verify` to omit these checks; a
|
|
94
|
+
dry run previews them without executing anything. If verification fails, the
|
|
95
|
+
rename remains applied and RPR prints the command to retry.
|
|
96
|
+
|
|
97
|
+
The success output includes a guarded command for optionally renaming the outer
|
|
98
|
+
workspace directory. Git remotes and hosted repository names are never changed.
|
|
99
|
+
When a hosted repository still matches the old project name, rename it through
|
|
100
|
+
the hosting provider if desired and then update its local URL with
|
|
101
|
+
`git remote set-url`. Local and remote branch names are unaffected.
|
|
102
|
+
|
|
68
103
|
`rpr init <project-name>` creates the project directory when it does not exist. If the directory already exists and is not an NX workspace, RPR initializes Git and runs `nx init` inside that directory.
|
|
69
104
|
|
|
70
105
|
By default, `rpr init` scaffolds the root workspace and AI instructions only. To create project components during initialization, repeat `--scaffold` or pass a comma-separated list:
|
|
@@ -204,14 +239,13 @@ The `chat` command also supports:
|
|
|
204
239
|
# Install Python dependencies
|
|
205
240
|
uv sync
|
|
206
241
|
|
|
207
|
-
#
|
|
208
|
-
|
|
242
|
+
# Rebuild the bundled Rust extension after native code changes
|
|
243
|
+
uv run maturin develop
|
|
209
244
|
```
|
|
210
245
|
|
|
211
|
-
> **Note:** `uv tool install
|
|
212
|
-
> Rust
|
|
213
|
-
>
|
|
214
|
-
> implementation when it is unavailable.
|
|
246
|
+
> **Note:** `uv tool install rpr-cli` installs the matching platform wheel with
|
|
247
|
+
> the Rust binding included. Building from a source checkout requires a Rust
|
|
248
|
+
> toolchain because Maturin compiles the same native module locally.
|
|
215
249
|
|
|
216
250
|
#### Running Tests
|
|
217
251
|
|
|
@@ -225,7 +259,7 @@ uv run pytest tests/test_map_extractor.py
|
|
|
225
259
|
# Single test
|
|
226
260
|
uv run pytest tests/test_map_extractor.py::test_fallback_returns_correct_shape
|
|
227
261
|
|
|
228
|
-
# Rust unit tests (
|
|
262
|
+
# Rust unit tests (bundled native crate)
|
|
229
263
|
cd rpr-parser && cargo test && cd ..
|
|
230
264
|
|
|
231
265
|
# Lint and format
|
|
@@ -233,8 +267,8 @@ uv run ruff check .
|
|
|
233
267
|
uv run ruff format .
|
|
234
268
|
```
|
|
235
269
|
|
|
236
|
-
The Rust-path tests in `tests/test_map_extractor.py` are automatically skipped if the
|
|
237
|
-
extension
|
|
270
|
+
The Rust-path tests in `tests/test_map_extractor.py` are automatically skipped if the bundled
|
|
271
|
+
extension has not been built yet — run `uv run maturin develop` first to enable them.
|
|
238
272
|
|
|
239
273
|
### Publishing To PyPI
|
|
240
274
|
|
|
@@ -250,10 +284,15 @@ No `PYPI_API_TOKEN` secret is required when publishing through GitHub Actions OI
|
|
|
250
284
|
Release flow:
|
|
251
285
|
|
|
252
286
|
```bash
|
|
253
|
-
#
|
|
254
|
-
|
|
255
|
-
git
|
|
287
|
+
rpr version bump patch # updates Python, Cargo.toml, and Cargo.lock
|
|
288
|
+
# Or repair/set an explicit version: rpr version set 0.3.9
|
|
289
|
+
git add src/rpr/__init__.py rpr-parser/Cargo.toml rpr-parser/Cargo.lock
|
|
290
|
+
git commit -m "Release 0.3.9"
|
|
291
|
+
git tag v0.3.9
|
|
256
292
|
git push origin main --tags
|
|
257
293
|
```
|
|
258
294
|
|
|
259
|
-
The workflow in `.github/workflows/publish-pypi.yml`
|
|
295
|
+
The workflow in `.github/workflows/publish-pypi.yml` checks both version declarations against the
|
|
296
|
+
tag, builds an sdist plus native wheels for Linux x86-64/AArch64, Windows x86-64, and macOS
|
|
297
|
+
x86-64/Apple Silicon, then publishes all artifacts to PyPI.
|
|
298
|
+
|
|
@@ -1,20 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.5
|
|
2
|
-
Name: rpr-cli
|
|
3
|
-
Version: 0.3.5
|
|
4
|
-
Summary: RPR CLI -- React Python Rust monorepo scaffolding orchestrator
|
|
5
|
-
License-Expression: MIT
|
|
6
|
-
License-File: LICENSE
|
|
7
|
-
Requires-Python: >=3.14
|
|
8
|
-
Requires-Dist: jinja2>=3.1.5
|
|
9
|
-
Requires-Dist: packaging>=26.2
|
|
10
|
-
Requires-Dist: pathspec>=1.0.4
|
|
11
|
-
Requires-Dist: prompt-toolkit>=3.0.52
|
|
12
|
-
Requires-Dist: pyyaml>=6.0.2
|
|
13
|
-
Requires-Dist: rich>=14.3.3
|
|
14
|
-
Requires-Dist: tomlkit>=0.15.0
|
|
15
|
-
Requires-Dist: typer>=0.24.1
|
|
16
|
-
Description-Content-Type: text/markdown
|
|
17
|
-
|
|
18
1
|
# RPR CLI
|
|
19
2
|
|
|
20
3
|
React Python Rust monorepo scaffolding orchestrator.
|
|
@@ -35,7 +18,8 @@ Both install the `rpr` command.
|
|
|
35
18
|
For development, editable install is fine:
|
|
36
19
|
|
|
37
20
|
```bash
|
|
38
|
-
uv
|
|
21
|
+
uv sync
|
|
22
|
+
uv run maturin develop
|
|
39
23
|
```
|
|
40
24
|
|
|
41
25
|
For an actual distributable install you can use in other projects, build the wheel first and install the built artifact:
|
|
@@ -51,6 +35,10 @@ From another local project you can also install the built artifact directly:
|
|
|
51
35
|
uv add ../project-getting-started/dist/rpr_cli-*.whl
|
|
52
36
|
```
|
|
53
37
|
|
|
38
|
+
The published wheels are mixed Python/Rust distributions. The `rpr._native`
|
|
39
|
+
binding used by `rpr rename` and accelerated `rpr map` is installed alongside
|
|
40
|
+
the Python package; no separate parser installation is required.
|
|
41
|
+
|
|
54
42
|
## Usage
|
|
55
43
|
|
|
56
44
|
### 🚀 Scaffolding & Generation
|
|
@@ -82,6 +70,19 @@ source and experiments to remain in rename scope. Binary contents, VCS data, and
|
|
|
82
70
|
symlink targets are never changed. The outer workspace directory keeps its
|
|
83
71
|
existing name.
|
|
84
72
|
|
|
73
|
+
After applying the rename, RPR synchronizes Node and Python dependencies and
|
|
74
|
+
runs uncached Nx build, Rust-engine build, and typecheck targets with the Nx
|
|
75
|
+
daemon disabled. This verifies the renamed project graph and commands without
|
|
76
|
+
deleting the existing Nx cache. Pass `--skip-verify` to omit these checks; a
|
|
77
|
+
dry run previews them without executing anything. If verification fails, the
|
|
78
|
+
rename remains applied and RPR prints the command to retry.
|
|
79
|
+
|
|
80
|
+
The success output includes a guarded command for optionally renaming the outer
|
|
81
|
+
workspace directory. Git remotes and hosted repository names are never changed.
|
|
82
|
+
When a hosted repository still matches the old project name, rename it through
|
|
83
|
+
the hosting provider if desired and then update its local URL with
|
|
84
|
+
`git remote set-url`. Local and remote branch names are unaffected.
|
|
85
|
+
|
|
85
86
|
`rpr init <project-name>` creates the project directory when it does not exist. If the directory already exists and is not an NX workspace, RPR initializes Git and runs `nx init` inside that directory.
|
|
86
87
|
|
|
87
88
|
By default, `rpr init` scaffolds the root workspace and AI instructions only. To create project components during initialization, repeat `--scaffold` or pass a comma-separated list:
|
|
@@ -221,14 +222,13 @@ The `chat` command also supports:
|
|
|
221
222
|
# Install Python dependencies
|
|
222
223
|
uv sync
|
|
223
224
|
|
|
224
|
-
#
|
|
225
|
-
|
|
225
|
+
# Rebuild the bundled Rust extension after native code changes
|
|
226
|
+
uv run maturin develop
|
|
226
227
|
```
|
|
227
228
|
|
|
228
|
-
> **Note:** `uv tool install
|
|
229
|
-
> Rust
|
|
230
|
-
>
|
|
231
|
-
> implementation when it is unavailable.
|
|
229
|
+
> **Note:** `uv tool install rpr-cli` installs the matching platform wheel with
|
|
230
|
+
> the Rust binding included. Building from a source checkout requires a Rust
|
|
231
|
+
> toolchain because Maturin compiles the same native module locally.
|
|
232
232
|
|
|
233
233
|
#### Running Tests
|
|
234
234
|
|
|
@@ -242,7 +242,7 @@ uv run pytest tests/test_map_extractor.py
|
|
|
242
242
|
# Single test
|
|
243
243
|
uv run pytest tests/test_map_extractor.py::test_fallback_returns_correct_shape
|
|
244
244
|
|
|
245
|
-
# Rust unit tests (
|
|
245
|
+
# Rust unit tests (bundled native crate)
|
|
246
246
|
cd rpr-parser && cargo test && cd ..
|
|
247
247
|
|
|
248
248
|
# Lint and format
|
|
@@ -250,8 +250,8 @@ uv run ruff check .
|
|
|
250
250
|
uv run ruff format .
|
|
251
251
|
```
|
|
252
252
|
|
|
253
|
-
The Rust-path tests in `tests/test_map_extractor.py` are automatically skipped if the
|
|
254
|
-
extension
|
|
253
|
+
The Rust-path tests in `tests/test_map_extractor.py` are automatically skipped if the bundled
|
|
254
|
+
extension has not been built yet — run `uv run maturin develop` first to enable them.
|
|
255
255
|
|
|
256
256
|
### Publishing To PyPI
|
|
257
257
|
|
|
@@ -267,10 +267,14 @@ No `PYPI_API_TOKEN` secret is required when publishing through GitHub Actions OI
|
|
|
267
267
|
Release flow:
|
|
268
268
|
|
|
269
269
|
```bash
|
|
270
|
-
#
|
|
271
|
-
|
|
272
|
-
git
|
|
270
|
+
rpr version bump patch # updates Python, Cargo.toml, and Cargo.lock
|
|
271
|
+
# Or repair/set an explicit version: rpr version set 0.3.9
|
|
272
|
+
git add src/rpr/__init__.py rpr-parser/Cargo.toml rpr-parser/Cargo.lock
|
|
273
|
+
git commit -m "Release 0.3.9"
|
|
274
|
+
git tag v0.3.9
|
|
273
275
|
git push origin main --tags
|
|
274
276
|
```
|
|
275
277
|
|
|
276
|
-
The workflow in `.github/workflows/publish-pypi.yml`
|
|
278
|
+
The workflow in `.github/workflows/publish-pypi.yml` checks both version declarations against the
|
|
279
|
+
tag, builds an sdist plus native wheels for Linux x86-64/AArch64, Windows x86-64, and macOS
|
|
280
|
+
x86-64/Apple Silicon, then publishes all artifacts to PyPI.
|
|
@@ -23,11 +23,15 @@ rpr = "rpr.cli:app"
|
|
|
23
23
|
dev = ["pytest>=9.0.2", "maturin>=1.8.2"]
|
|
24
24
|
|
|
25
25
|
[build-system]
|
|
26
|
-
requires = ["
|
|
27
|
-
build-backend = "
|
|
26
|
+
requires = ["maturin>=1.12.6,<2.0"]
|
|
27
|
+
build-backend = "maturin"
|
|
28
28
|
|
|
29
|
-
[tool.
|
|
30
|
-
|
|
29
|
+
[tool.maturin]
|
|
30
|
+
manifest-path = "rpr-parser/Cargo.toml"
|
|
31
|
+
python-source = "src"
|
|
32
|
+
module-name = "rpr._native"
|
|
33
|
+
features = ["pyo3/extension-module"]
|
|
34
|
+
include = [{ path = "LICENSE", format = "sdist" }]
|
|
31
35
|
|
|
32
|
-
[tool.
|
|
33
|
-
|
|
36
|
+
[tool.pytest.ini_options]
|
|
37
|
+
testpaths = ["tests"]
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "rpr-parser"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.3.10"
|
|
4
4
|
edition = "2021"
|
|
5
5
|
|
|
6
6
|
[lib]
|
|
7
|
-
name = "
|
|
7
|
+
name = "_native"
|
|
8
8
|
crate-type = ["cdylib"]
|
|
9
9
|
|
|
10
10
|
[dependencies]
|
|
11
|
-
pyo3 = { version = "0.28", features = ["extension-module"] }
|
|
11
|
+
pyo3 = { version = "0.28", features = ["extension-module", "abi3-py314"] }
|
|
12
12
|
rayon = "1.11"
|
|
13
13
|
walkdir = "2"
|
|
14
14
|
tree-sitter = "0.26"
|
|
@@ -131,7 +131,7 @@ fn build_dependency_graph(py: Python<'_>, abs_root: String) -> PyResult<Py<PyAny
|
|
|
131
131
|
}
|
|
132
132
|
|
|
133
133
|
#[pymodule]
|
|
134
|
-
fn
|
|
134
|
+
fn _native(m: &Bound<'_, PyModule>) -> PyResult<()> {
|
|
135
135
|
init_logging();
|
|
136
136
|
// Register a tiny smoke-test function first so Python/Jupyter can confirm
|
|
137
137
|
// the compiled module loaded before we move on to more complex APIs.
|
|
@@ -158,16 +158,27 @@ impl Replacer {
|
|
|
158
158
|
let mut position = 0;
|
|
159
159
|
let mut replacements = 0;
|
|
160
160
|
while position < text.len() {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
161
|
+
let new_match = self.match_new(text, position);
|
|
162
|
+
let old_match = self.match_old(text, position);
|
|
163
|
+
match (old_match, new_match) {
|
|
164
|
+
(Some((old, new)), Some(existing)) if old.len() > existing.len() => {
|
|
165
|
+
output.push_str(new);
|
|
166
|
+
position += old.len();
|
|
167
|
+
replacements += 1;
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
(_, Some(existing)) => {
|
|
171
|
+
output.push_str(existing);
|
|
172
|
+
position += existing.len();
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
(Some((old, new)), None) => {
|
|
176
|
+
output.push_str(new);
|
|
177
|
+
position += old.len();
|
|
178
|
+
replacements += 1;
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
(None, None) => {}
|
|
171
182
|
}
|
|
172
183
|
let ch = text[position..]
|
|
173
184
|
.chars()
|
|
@@ -182,12 +193,16 @@ impl Replacer {
|
|
|
182
193
|
fn has_stale_reference(&self, text: &str) -> bool {
|
|
183
194
|
let mut position = 0;
|
|
184
195
|
while position < text.len() {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
196
|
+
let new_match = self.match_new(text, position);
|
|
197
|
+
let old_match = self.match_old(text, position);
|
|
198
|
+
match (old_match, new_match) {
|
|
199
|
+
(Some((old, _)), Some(existing)) if old.len() > existing.len() => return true,
|
|
200
|
+
(_, Some(existing)) => {
|
|
201
|
+
position += existing.len();
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
(Some(_), None) => return true,
|
|
205
|
+
(None, None) => {}
|
|
191
206
|
}
|
|
192
207
|
position += text[position..].chars().next().unwrap().len_utf8();
|
|
193
208
|
}
|
|
@@ -288,6 +303,7 @@ pub fn plan(root: PathBuf, new_name: String) -> Result<NativeRenamePlan, String>
|
|
|
288
303
|
validate_new_name(&old_name, &new_name)?;
|
|
289
304
|
let replacer = Replacer::new(build_replacements(&old_name, &new_name, variables));
|
|
290
305
|
let (entries, mut skipped) = walk_workspace(&root)?;
|
|
306
|
+
validate_unicode_paths(&root, &entries, &skipped)?;
|
|
291
307
|
let files: Vec<_> = entries
|
|
292
308
|
.iter()
|
|
293
309
|
.filter(|entry| entry.is_file())
|
|
@@ -653,11 +669,37 @@ fn build_path_moves(
|
|
|
653
669
|
fn rename_relative_path(path: &Path, replacer: &Replacer) -> PathBuf {
|
|
654
670
|
let mut output = PathBuf::new();
|
|
655
671
|
for component in path.components() {
|
|
656
|
-
|
|
672
|
+
let component = component
|
|
673
|
+
.as_os_str()
|
|
674
|
+
.to_str()
|
|
675
|
+
.expect("workspace paths were validated as Unicode");
|
|
676
|
+
output.push(replacer.replace(component).0);
|
|
657
677
|
}
|
|
658
678
|
output
|
|
659
679
|
}
|
|
660
680
|
|
|
681
|
+
fn validate_unicode_paths(
|
|
682
|
+
root: &Path,
|
|
683
|
+
entries: &[PathBuf],
|
|
684
|
+
skipped: &[SkippedPath],
|
|
685
|
+
) -> Result<(), String> {
|
|
686
|
+
for entry in entries.iter().chain(skipped.iter().map(|item| &item.path)) {
|
|
687
|
+
let relative = entry
|
|
688
|
+
.strip_prefix(root)
|
|
689
|
+
.expect("walked path is beneath root");
|
|
690
|
+
if relative
|
|
691
|
+
.components()
|
|
692
|
+
.any(|component| component.as_os_str().to_str().is_none())
|
|
693
|
+
{
|
|
694
|
+
return Err(format!(
|
|
695
|
+
"Workspace path is not valid Unicode and cannot be renamed safely: {:?}",
|
|
696
|
+
entry.as_os_str()
|
|
697
|
+
));
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
Ok(())
|
|
701
|
+
}
|
|
702
|
+
|
|
661
703
|
fn update_config(text: &str, new_name: &str) -> Result<(String, usize), String> {
|
|
662
704
|
let mut config: Value = serde_yaml::from_str(text)
|
|
663
705
|
.map_err(|error| format!("Renamed .rpr.yaml would be invalid: {error}"))?;
|
|
@@ -1005,6 +1047,28 @@ mod tests {
|
|
|
1005
1047
|
assert_eq!(count, 1);
|
|
1006
1048
|
}
|
|
1007
1049
|
|
|
1050
|
+
#[test]
|
|
1051
|
+
fn longest_token_wins_for_shortening_and_expansion() {
|
|
1052
|
+
let shortening = Replacer::new(HashMap::from([
|
|
1053
|
+
("foo-bar".into(), "foo".into()),
|
|
1054
|
+
("foo_bar".into(), "foo".into()),
|
|
1055
|
+
("FooBar".into(), "Foo".into()),
|
|
1056
|
+
]));
|
|
1057
|
+
let (output, count) =
|
|
1058
|
+
shortening.replace("nx serve foo-bar-web; from foo_bar_domain import FooBarService");
|
|
1059
|
+
assert_eq!(
|
|
1060
|
+
output,
|
|
1061
|
+
"nx serve foo-web; from foo_domain import FooService"
|
|
1062
|
+
);
|
|
1063
|
+
assert_eq!(count, 3);
|
|
1064
|
+
assert!(!shortening.has_stale_reference(&output));
|
|
1065
|
+
|
|
1066
|
+
let expansion = Replacer::new(HashMap::from([("foo".into(), "foo-bar".into())]));
|
|
1067
|
+
let (output, count) = expansion.replace("foo foo-bar");
|
|
1068
|
+
assert_eq!(output, "foo-bar foo-bar");
|
|
1069
|
+
assert_eq!(count, 1);
|
|
1070
|
+
}
|
|
1071
|
+
|
|
1008
1072
|
#[test]
|
|
1009
1073
|
fn bootstrap_defaults_cover_named_virtual_environments() {
|
|
1010
1074
|
let temp = tempfile::tempdir().unwrap();
|
|
@@ -1046,6 +1110,40 @@ mod tests {
|
|
|
1046
1110
|
.contains("new_app_domain"));
|
|
1047
1111
|
}
|
|
1048
1112
|
|
|
1113
|
+
#[test]
|
|
1114
|
+
fn shortening_rename_updates_nested_paths_and_references() {
|
|
1115
|
+
let temp = workspace();
|
|
1116
|
+
let plan = plan(temp.path().to_path_buf(), "my".into()).unwrap();
|
|
1117
|
+
|
|
1118
|
+
apply(&plan).unwrap();
|
|
1119
|
+
|
|
1120
|
+
let renamed = temp
|
|
1121
|
+
.path()
|
|
1122
|
+
.join("packages/python/my_domain/src/my_domain/main.py");
|
|
1123
|
+
assert!(renamed.is_file());
|
|
1124
|
+
assert!(fs::read_to_string(renamed).unwrap().contains("my_domain"));
|
|
1125
|
+
}
|
|
1126
|
+
|
|
1127
|
+
#[cfg(unix)]
|
|
1128
|
+
#[test]
|
|
1129
|
+
fn non_unicode_workspace_path_aborts_planning() {
|
|
1130
|
+
use std::ffi::OsString;
|
|
1131
|
+
use std::os::unix::ffi::OsStringExt;
|
|
1132
|
+
|
|
1133
|
+
let temp = workspace();
|
|
1134
|
+
let invalid = temp
|
|
1135
|
+
.path()
|
|
1136
|
+
.join(OsString::from_vec(b"my-app-\xff.txt".to_vec()));
|
|
1137
|
+
write(&invalid, b"my-app\n");
|
|
1138
|
+
|
|
1139
|
+
let error = plan(temp.path().to_path_buf(), "new-app".into())
|
|
1140
|
+
.err()
|
|
1141
|
+
.expect("non-Unicode path should fail planning");
|
|
1142
|
+
|
|
1143
|
+
assert!(error.contains("not valid Unicode"));
|
|
1144
|
+
assert!(temp.path().join("packages/python/my_app_domain").is_dir());
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1049
1147
|
#[test]
|
|
1050
1148
|
fn ignored_virtual_environment_is_never_planned_or_validated() {
|
|
1051
1149
|
let temp = workspace();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.3.10"
|
|
@@ -33,6 +33,13 @@ sync_app = typer.Typer(
|
|
|
33
33
|
)
|
|
34
34
|
app.add_typer(sync_app, name="sync")
|
|
35
35
|
|
|
36
|
+
version_app = typer.Typer(
|
|
37
|
+
name="version",
|
|
38
|
+
help="Manage synchronized Python and Rust release versions.",
|
|
39
|
+
no_args_is_help=True,
|
|
40
|
+
)
|
|
41
|
+
app.add_typer(version_app, name="version")
|
|
42
|
+
|
|
36
43
|
refresh_app = typer.Typer(
|
|
37
44
|
name="refresh",
|
|
38
45
|
help="Refresh repo-owned manifests from upstream registries.",
|
|
@@ -61,6 +68,7 @@ from rpr.commands.generate import ui as _ui_mod # noqa: E402, F401
|
|
|
61
68
|
from rpr.commands.generate import engine as _engine_mod # noqa: E402, F401
|
|
62
69
|
from rpr.commands.generate import storybook as _storybook_mod # noqa: E402, F401
|
|
63
70
|
from rpr.commands import sync as _sync_mod # noqa: E402, F401
|
|
71
|
+
from rpr.commands import version as _version_mod # noqa: E402, F401
|
|
64
72
|
from rpr.commands import refresh as _refresh_mod # noqa: E402, F401
|
|
65
73
|
from rpr.commands import update as _update_mod # noqa: E402, F401
|
|
66
74
|
from rpr.commands import add as _add_mod # noqa: E402, F401
|