rpr-cli 0.1.7__tar.gz → 0.1.20__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.1.7 → rpr_cli-0.1.20}/PKG-INFO +1 -1
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/Sample-dot-github/instructions/frontend.instructions.md +1 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/Sample-dot-github/instructions/setup-guide.instructions.md +4 -0
- rpr_cli-0.1.20/src/rpr/__init__.py +1 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/commands/generate/storybook.py +8 -4
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/commands/generate/ui.py +6 -3
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/commands/init.py +2 -2
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/dependencies.py +28 -2
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/dependency_manifest_data.py +96 -91
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/manifest_refresh.py +37 -9
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/scaffolds/instructions/frontend.instructions.md +1 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/scaffolds/instructions/setup-guide.instructions.md +4 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/workspace.py +28 -3
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_check.py +1 -1
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_generate_storybook.py +8 -4
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_generate_ui.py +100 -8
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_init.py +1 -8
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_refresh.py +10 -11
- rpr_cli-0.1.7/src/rpr/__init__.py +0 -1
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/.github/agents/story.agent.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/.github/workflows/publish-pypi.yml +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/.gitignore +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/CLAUDE.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/GEMINI.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/LICENSE +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/README.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/Sample-dot-github/instructions/all.instructions.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/Sample-dot-github/instructions/api.instructions.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/Sample-dot-github/instructions/domain.instructions.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/Sample-dot-github/instructions/rust-engine.instructions.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/Sample-dot-github/instructions/tooling-setup.instructions.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/Sample-dot-github/instructions/tooling.instructions.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/Sample-dot-github/scaffolds/README.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/Sample-dot-github/scaffolds/api/main.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/Sample-dot-github/scaffolds/domain/base-repo.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/Sample-dot-github/scaffolds/domain/base_entity.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/Sample-dot-github/scaffolds/frontend/api.service.ts +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/Sample-dot-github/scaffolds/frontend/useStateNavigation.ts +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/changelogs/mui_v9.txt +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/code-map.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/nx_uv_setup.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/patch_output.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/pyproject.toml +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/rpr-parser/Cargo.lock +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/rpr-parser/Cargo.toml +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/rpr-parser/pyproject.toml +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/rpr-parser/rpr_parser.pyi +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/rpr-parser/src/config/container.rs +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/rpr-parser/src/config/mod.rs +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/rpr-parser/src/config/settings.rs +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/rpr-parser/src/graph.rs +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/rpr-parser/src/lib.rs +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/rpr-parser/src/models/dtos/mod.rs +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/rpr-parser/src/models/entities/mod.rs +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/rpr-parser/src/models/entities/users.rs +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/rpr-parser/src/models/mod.rs +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/rpr-parser/src/parse.rs +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/rpr-parser/src/repos/base.rs +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/rpr-parser/src/repos/mod.rs +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/rpr-parser/src/repos/users.rs +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/rpr-parser/src/resolve.rs +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/rpr-parser/src/walker.rs +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/rpr-parser/uv.lock +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/special_files.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/agent/__init__.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/agent/approval.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/agent/bootstrap.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/agent/client.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/agent/control.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/agent/mock.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/agent/runtime.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/agent/session.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/agent/tools/__init__.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/agent/tools/base.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/agent/tools/mutating.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/agent/tools/readonly.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/agent/tools/registry.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/application/__init__.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/application/catalog.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/application/chat_service.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/application/checks.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/application/cli_adapter.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/application/completer.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/application/conversation_service.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/application/prompt_service.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/application/selector.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/application/shell.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/checks/__init__.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/checks/base.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/checks/instructions.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/checks/packages.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/checks/workspace.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/cli.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/commands/__init__.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/commands/add.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/commands/chat.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/commands/check.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/commands/generate/__init__.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/commands/generate/api.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/commands/generate/domain.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/commands/generate/engine.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/commands/map.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/commands/refresh.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/commands/settings.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/commands/sync.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/context.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/generators/__init__.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/generators/base.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/generators/claude.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/generators/copilot.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/generators/cursor.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/generators/gemini.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/map/__init__.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/map/architecture.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/map/chains.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/map/classifier.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/map/coverage.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/map/dependencies.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/map/extractor.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/map/graph.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/map/output.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/map/responsibility.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/map/topology.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/map/walker.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/scaffolds/domain/base_entity.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/scaffolds/domain/base_repo.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/scaffolds/domain/container.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/scaffolds/domain/settings.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/scaffolds/instructions/all.instructions.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/scaffolds/instructions/api.instructions.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/scaffolds/instructions/domain.instructions.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/scaffolds/instructions/rust-engine.instructions.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/scaffolds/instructions/tooling-setup.instructions.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/scaffolds/instructions/tooling.instructions.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/scaffolds/js_special_files/fetch.service.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/scaffolds/js_special_files/sticky-navigation.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/scaffolds/special_files/domain_container.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/scaffolds/special_files/domain_settings.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/scaffolds/special_files/dto_util.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/scaffolds/special_files/encrypted_column.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/scaffolds/special_files/mapper_util.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/scaffolds/special_files/partial_update.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/templates/__init__.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/templates/registry.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/ui/__init__.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/ui/console.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/ui/markdown.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/ui/prompt_session.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/ui/renderers.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/src/rpr/ui/theme.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/README.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/00-bootstrap-cli.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/01-rpr-init.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/02-rpr-generate-domain.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/03-rpr-generate-api.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/04-rpr-generate-ui.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/05-rpr-generate-engine.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/06-rpr-generate-storybook.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/07-rpr-sync-rules.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/08-rpr-add-template.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/09-rpr-check.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/10-rpr-domain-config.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/chat/18-rpr-terminal-ui-foundation.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/chat/19-rpr-markdown-rendering.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/chat/20-rpr-chat-repl.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/chat/21-rpr-agent-tool-loop.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/chat/22-rpr-chat-tui.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/chat/23-rpr-chat-unified-command-shell.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/chat/24-rpr-async-chat-runtime-and-services.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/chat/25-rpr-prompt-service-and-conversation-lifecycle.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/chat/26-rpr-shared-command-catalog.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/chat/27-rpr-slash-command-selection-panel.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/chat/28-rpr-chat-cancellable-and-multiline-input.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/chat/29-rpr-file-context-selection.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/map/11-rpr-map-command.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/map/12-rpr-map-file-walker.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/map/13-rpr-map-rust-engine.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/map/13a-rpr-map-gitignore.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/map/14-rpr-map-graph-builder.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/map/15-rpr-map-analysis-bridge.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/map/16-rpr-map-layer-classifier.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/map/17-rpr-map-output.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/map/17a-rpr-map-directory-topology.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/map/17b-rpr-map-architecture-assessment.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/map/17c-rpr-map-representative-chains.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/completed/map/17d-rpr-map-multi-resolution-output.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/map/30-rpr-map-directory-view-and-cycle-detection.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/map/31-rpr-map-coupling-hotspots-and-verdict-reasoning.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/stories/map/32-rpr-map-dependencies-responsibilities-and-test-coverage.md +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/__init__.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_add.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_architecture.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_architecture_unwrapped.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_catalog.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_chat.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_chat_service.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_completer.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_context.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_generate_api.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_generate_domain.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_generate_engine.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_map.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_map_chains.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_map_classifier.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_map_coverage.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_map_dependencies.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_map_extractor.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_map_graph.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_map_output.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_map_responsibility.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_map_topology.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_map_walker.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_packaging.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_prompt_session.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_rpr_parser_stub.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_selector.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_settings.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_sync.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/tests/test_ui.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/update_output.py +0 -0
- {rpr_cli-0.1.7 → rpr_cli-0.1.20}/uv.lock +0 -0
|
@@ -11,6 +11,7 @@ Use React for UI composition, TanStack Query for server-state workflows, TanStac
|
|
|
11
11
|
|
|
12
12
|
- Use functional components.
|
|
13
13
|
- Extract reusable behavior into hooks instead of duplicating component logic.
|
|
14
|
+
- Import the generated shared UI package through the app-scoped package name `@{name}/ui`, such as `@testapp/ui`, not `@repo/{name}-ui`.
|
|
14
15
|
- Prefer a shared base API service at `src/services/base/api.service.ts` when the UI package needs centralized fetch behavior.
|
|
15
16
|
- Prefer a shared `useStateNavigation` hook at `src/hooks/useStateNavigation.ts` when UI state should persist in the URL.
|
|
16
17
|
- Reuse existing components, hooks, and service patterns before introducing a new abstraction.
|
|
@@ -45,6 +45,9 @@ Use this guidance when validating or changing the monorepo setup against the RPR
|
|
|
45
45
|
- Generate React app and library projects in a way that preserves the expected Nx command surface.
|
|
46
46
|
- The web app should expose at least `serve`, `build`, `lint`, `test`, and `typecheck` when those capabilities exist in the generated project.
|
|
47
47
|
- The UI library should expose at least `build`, `lint`, `test`, and `typecheck`.
|
|
48
|
+
- Use app-scoped Node package names: `packages/node/{name}-ui` publishes as `@{name}/ui`, `apps/{name}-web` publishes as `@{name}/web`, and Storybook publishes as `@{name}/sb`.
|
|
49
|
+
- Import the shared UI package through `@{name}/ui`, for example `import { AppThemeProvider } from "@testapp/ui"` for a `TestApp` workspace.
|
|
50
|
+
- Link local Node workspace packages with relative `file:` dependency specs instead of `workspace:*`, because npm must be able to install the generated workspace without unsupported protocol errors.
|
|
48
51
|
- Keep Storybook as a dedicated host project at `packages/node/sb`; do not silently repurpose the UI library as the Storybook project.
|
|
49
52
|
|
|
50
53
|
## Python Expectations
|
|
@@ -81,6 +84,7 @@ npx nx run domain:migrate -- downgrade -1
|
|
|
81
84
|
- Project roots and import package names follow the kebab-case and snake_case rules.
|
|
82
85
|
- Python projects have both `src/` and `tests/`.
|
|
83
86
|
- The domain import package remains `src/{name_underscore}_domain`.
|
|
87
|
+
- Node imports use app-scoped package names such as `@{name}/ui`, not stale `@repo/*` aliases.
|
|
84
88
|
- Storybook remains hosted in `packages/node/sb`.
|
|
85
89
|
- Workspace members and workspace dependency sources are complete.
|
|
86
90
|
- Generated instructions, checks, and scaffolds refer to the current contract rather than stale paths.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.1.20"
|
|
@@ -12,7 +12,9 @@ from rpr.context import RunContext
|
|
|
12
12
|
from rpr.dependencies import (
|
|
13
13
|
ROOT_STORYBOOK_DEV_DEPENDENCIES,
|
|
14
14
|
STORYBOOK_DEV_DEPENDENCIES,
|
|
15
|
+
storybook_host_package_name,
|
|
15
16
|
storybook_package_dependencies,
|
|
17
|
+
ui_package_name,
|
|
16
18
|
)
|
|
17
19
|
from rpr.workspace import ensure_npm_workspaces, write_package_json
|
|
18
20
|
|
|
@@ -185,7 +187,7 @@ def _write_sb_package_json(ctx: RunContext, sb_root: Path, ui_pkg: str) -> None:
|
|
|
185
187
|
ctx,
|
|
186
188
|
sb_root / "package.json",
|
|
187
189
|
defaults={
|
|
188
|
-
"name":
|
|
190
|
+
"name": storybook_host_package_name(ui_pkg),
|
|
189
191
|
"version": "0.1.0",
|
|
190
192
|
"private": True,
|
|
191
193
|
"type": "module",
|
|
@@ -306,7 +308,8 @@ ReactDOM.createRoot(document.getElementById("root")!).render(
|
|
|
306
308
|
|
|
307
309
|
|
|
308
310
|
def _write_sb_app(ctx: RunContext, src_root: Path, ui_pkg: str) -> None:
|
|
309
|
-
|
|
311
|
+
ui_import_name = ui_package_name(ui_pkg)
|
|
312
|
+
content = f"""import {{ uiPackageName }} from "{ui_import_name}";
|
|
310
313
|
|
|
311
314
|
export const storybookHostTitle = "Storybook Host";
|
|
312
315
|
|
|
@@ -368,7 +371,8 @@ export default config;
|
|
|
368
371
|
|
|
369
372
|
|
|
370
373
|
def _write_sb_preview(ctx: RunContext, path: Path, ui_pkg: str) -> None:
|
|
371
|
-
|
|
374
|
+
ui_import_name = ui_package_name(ui_pkg)
|
|
375
|
+
content = """import { appTheme } from "__UI_IMPORT__";
|
|
372
376
|
import { CssBaseline, ThemeProvider } from "@mui/material";
|
|
373
377
|
import type { Preview } from "@storybook/react";
|
|
374
378
|
import { Fragment, createElement } from "react";
|
|
@@ -398,7 +402,7 @@ const preview: Preview = {
|
|
|
398
402
|
};
|
|
399
403
|
|
|
400
404
|
export default preview;
|
|
401
|
-
""".replace("
|
|
405
|
+
""".replace("__UI_IMPORT__", ui_import_name)
|
|
402
406
|
ctx.write_file(path, content)
|
|
403
407
|
|
|
404
408
|
|
|
@@ -13,7 +13,9 @@ from rpr.dependencies import (
|
|
|
13
13
|
UI_LIBRARY_DEPENDENCIES,
|
|
14
14
|
UI_LIBRARY_DEV_DEPENDENCIES,
|
|
15
15
|
WEB_APP_DEV_DEPENDENCIES,
|
|
16
|
+
ui_package_name,
|
|
16
17
|
web_app_dependencies,
|
|
18
|
+
web_package_name,
|
|
17
19
|
)
|
|
18
20
|
from rpr.workspace import ensure_npm_workspaces, write_package_json
|
|
19
21
|
|
|
@@ -140,7 +142,7 @@ def _write_ui_package_json(ctx: RunContext, lib_root: Path, ui_pkg_name: str) ->
|
|
|
140
142
|
ctx,
|
|
141
143
|
lib_root / "package.json",
|
|
142
144
|
defaults={
|
|
143
|
-
"name":
|
|
145
|
+
"name": ui_package_name(ui_pkg_name),
|
|
144
146
|
"version": "0.1.0",
|
|
145
147
|
"private": True,
|
|
146
148
|
"main": "src/index.ts",
|
|
@@ -259,7 +261,7 @@ def _write_app_package_json(
|
|
|
259
261
|
ctx,
|
|
260
262
|
app_root / "package.json",
|
|
261
263
|
defaults={
|
|
262
|
-
"name":
|
|
264
|
+
"name": web_package_name(app_name),
|
|
263
265
|
"version": "0.1.0",
|
|
264
266
|
"private": True,
|
|
265
267
|
"type": "module",
|
|
@@ -370,7 +372,8 @@ ReactDOM.createRoot(document.getElementById("root")!).render(
|
|
|
370
372
|
|
|
371
373
|
def _write_app_tsx(ctx: RunContext, src: Path, app_name: str, ui_pkg_name: str) -> None:
|
|
372
374
|
title = app_name.replace("-", " ").title()
|
|
373
|
-
|
|
375
|
+
ui_import_name = ui_package_name(ui_pkg_name)
|
|
376
|
+
content = f"""import {{ AppThemeProvider, uiPackageName }} from "{ui_import_name}";
|
|
374
377
|
|
|
375
378
|
export const appTitle = "{title}";
|
|
376
379
|
|
|
@@ -13,7 +13,7 @@ from rich.console import Console
|
|
|
13
13
|
|
|
14
14
|
from rpr.cli import app
|
|
15
15
|
from rpr.context import RunContext
|
|
16
|
-
from rpr.dependencies import ROOT_NODE_DEV_DEPENDENCIES
|
|
16
|
+
from rpr.dependencies import ROOT_NODE_DEV_DEPENDENCIES, npm_package_name
|
|
17
17
|
from rpr.generators.base import SyncConfig, load_rules
|
|
18
18
|
from rpr.generators.claude import generate_claude_rules
|
|
19
19
|
from rpr.generators.copilot import generate_copilot_rules
|
|
@@ -438,7 +438,7 @@ def _write_root_package_json(ctx: RunContext, project_name: str) -> None:
|
|
|
438
438
|
else:
|
|
439
439
|
package = {}
|
|
440
440
|
|
|
441
|
-
package
|
|
441
|
+
package["name"] = npm_package_name(project_name)
|
|
442
442
|
package["private"] = True
|
|
443
443
|
|
|
444
444
|
workspaces = package.get("workspaces", [])
|
|
@@ -67,9 +67,35 @@ PYO3_VERSION = MANIFEST["engine"]["pyo3"]["specifier"]
|
|
|
67
67
|
MATURIN_SPEC = MANIFEST["engine"]["maturin"]["specifier"]
|
|
68
68
|
|
|
69
69
|
|
|
70
|
+
def npm_package_name(package_name: str) -> str:
|
|
71
|
+
normalized = package_name.replace("_", "-").lower()
|
|
72
|
+
normalized = re.sub(r"[^a-z0-9._-]+", "-", normalized).strip(".-")
|
|
73
|
+
return normalized or "package"
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def scoped_package_name(scope_name: str, package_name: str) -> str:
|
|
77
|
+
return f"@{npm_package_name(scope_name)}/{npm_package_name(package_name)}"
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _strip_suffix(package_name: str, suffix: str) -> str:
|
|
81
|
+
return package_name[: -len(suffix)] if package_name.endswith(suffix) else package_name
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def ui_package_name(ui_pkg_name: str) -> str:
|
|
85
|
+
return scoped_package_name(_strip_suffix(ui_pkg_name, "-ui"), "ui")
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def web_package_name(app_name: str) -> str:
|
|
89
|
+
return scoped_package_name(_strip_suffix(app_name, "-web"), "web")
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def storybook_host_package_name(ui_pkg_name: str) -> str:
|
|
93
|
+
return scoped_package_name(_strip_suffix(ui_pkg_name, "-ui"), "sb")
|
|
94
|
+
|
|
95
|
+
|
|
70
96
|
def web_app_dependencies(ui_pkg_name: str) -> dict[str, str]:
|
|
71
97
|
return {
|
|
72
|
-
f"
|
|
98
|
+
ui_package_name(ui_pkg_name): f"file:../../packages/node/{ui_pkg_name}",
|
|
73
99
|
"react": UI_LIBRARY_DEPENDENCIES["react"],
|
|
74
100
|
"react-dom": UI_LIBRARY_DEPENDENCIES["react-dom"],
|
|
75
101
|
}
|
|
@@ -77,7 +103,7 @@ def web_app_dependencies(ui_pkg_name: str) -> dict[str, str]:
|
|
|
77
103
|
|
|
78
104
|
def storybook_package_dependencies(ui_pkg_name: str) -> dict[str, str]:
|
|
79
105
|
return {
|
|
80
|
-
f"
|
|
106
|
+
ui_package_name(ui_pkg_name): f"file:../{ui_pkg_name}",
|
|
81
107
|
**STORYBOOK_DEPENDENCIES,
|
|
82
108
|
}
|
|
83
109
|
|
|
@@ -6,279 +6,284 @@ from __future__ import annotations
|
|
|
6
6
|
MANIFEST = {
|
|
7
7
|
"root_node_dev_dependencies": {
|
|
8
8
|
"@eslint/js": {
|
|
9
|
-
"specifier": "
|
|
9
|
+
"specifier": "latest",
|
|
10
10
|
},
|
|
11
11
|
"@nx/eslint": {
|
|
12
|
-
"specifier": "
|
|
12
|
+
"specifier": "latest",
|
|
13
13
|
},
|
|
14
14
|
"@nx/eslint-plugin": {
|
|
15
|
-
"specifier": "
|
|
15
|
+
"specifier": "latest",
|
|
16
16
|
},
|
|
17
17
|
"eslint": {
|
|
18
|
-
"specifier": "
|
|
18
|
+
"specifier": "latest",
|
|
19
19
|
},
|
|
20
20
|
"eslint-plugin-import": {
|
|
21
|
-
"specifier": "
|
|
21
|
+
"specifier": "latest",
|
|
22
22
|
},
|
|
23
23
|
"eslint-plugin-jsx-a11y": {
|
|
24
|
-
"specifier": "
|
|
24
|
+
"specifier": "latest",
|
|
25
25
|
},
|
|
26
26
|
"eslint-plugin-react": {
|
|
27
|
-
"specifier": "
|
|
27
|
+
"specifier": "latest",
|
|
28
28
|
},
|
|
29
29
|
"eslint-plugin-react-hooks": {
|
|
30
|
-
"specifier": "
|
|
30
|
+
"specifier": "latest",
|
|
31
31
|
},
|
|
32
32
|
"globals": {
|
|
33
|
-
"specifier": "
|
|
33
|
+
"specifier": "latest",
|
|
34
34
|
},
|
|
35
35
|
"prettier": {
|
|
36
|
-
"specifier": "
|
|
36
|
+
"specifier": "latest",
|
|
37
37
|
},
|
|
38
38
|
"typescript-eslint": {
|
|
39
|
-
"specifier": "
|
|
39
|
+
"specifier": "latest",
|
|
40
40
|
},
|
|
41
41
|
},
|
|
42
42
|
"root_storybook_dev_dependencies": {
|
|
43
43
|
"@nx/storybook": {
|
|
44
44
|
"registry": "npm",
|
|
45
45
|
"specifier": "latest",
|
|
46
|
-
"strategy": "
|
|
46
|
+
"strategy": "latest",
|
|
47
47
|
}
|
|
48
48
|
},
|
|
49
49
|
"ui_library_dependencies": {
|
|
50
50
|
"@mui/material": {
|
|
51
51
|
"registry": "npm",
|
|
52
|
-
"specifier": "
|
|
53
|
-
"strategy": "
|
|
52
|
+
"specifier": "latest",
|
|
53
|
+
"strategy": "latest",
|
|
54
54
|
},
|
|
55
55
|
"@emotion/react": {
|
|
56
56
|
"registry": "npm",
|
|
57
|
-
"specifier": "
|
|
58
|
-
"strategy": "
|
|
57
|
+
"specifier": "latest",
|
|
58
|
+
"strategy": "latest",
|
|
59
59
|
},
|
|
60
60
|
"@emotion/styled": {
|
|
61
61
|
"registry": "npm",
|
|
62
|
-
"specifier": "
|
|
63
|
-
"strategy": "
|
|
62
|
+
"specifier": "latest",
|
|
63
|
+
"strategy": "latest",
|
|
64
64
|
},
|
|
65
65
|
"@tanstack/react-query": {
|
|
66
66
|
"registry": "npm",
|
|
67
|
-
"specifier": "
|
|
68
|
-
"strategy": "
|
|
67
|
+
"specifier": "latest",
|
|
68
|
+
"strategy": "latest",
|
|
69
69
|
},
|
|
70
70
|
"@tanstack/react-router": {
|
|
71
71
|
"registry": "npm",
|
|
72
|
-
"specifier": "
|
|
73
|
-
"strategy": "
|
|
72
|
+
"specifier": "latest",
|
|
73
|
+
"strategy": "latest",
|
|
74
74
|
},
|
|
75
75
|
"react": {
|
|
76
76
|
"registry": "npm",
|
|
77
|
-
"specifier": "
|
|
78
|
-
"strategy": "
|
|
77
|
+
"specifier": "latest",
|
|
78
|
+
"strategy": "latest",
|
|
79
79
|
},
|
|
80
80
|
"react-dom": {
|
|
81
81
|
"registry": "npm",
|
|
82
|
-
"specifier": "
|
|
83
|
-
"strategy": "
|
|
82
|
+
"specifier": "latest",
|
|
83
|
+
"strategy": "latest",
|
|
84
84
|
},
|
|
85
85
|
},
|
|
86
86
|
"ui_library_dev_dependencies": {
|
|
87
87
|
"@types/react": {
|
|
88
88
|
"registry": "npm",
|
|
89
|
-
"specifier": "
|
|
90
|
-
"strategy": "
|
|
89
|
+
"specifier": "latest",
|
|
90
|
+
"strategy": "latest",
|
|
91
91
|
},
|
|
92
92
|
"@types/react-dom": {
|
|
93
93
|
"registry": "npm",
|
|
94
|
-
"specifier": "
|
|
95
|
-
"strategy": "
|
|
94
|
+
"specifier": "latest",
|
|
95
|
+
"strategy": "latest",
|
|
96
96
|
},
|
|
97
97
|
"typescript": {
|
|
98
98
|
"registry": "npm",
|
|
99
|
-
"specifier": "
|
|
100
|
-
"strategy": "
|
|
99
|
+
"specifier": "latest",
|
|
100
|
+
"strategy": "latest",
|
|
101
101
|
},
|
|
102
102
|
"vite": {
|
|
103
103
|
"registry": "npm",
|
|
104
|
-
"specifier": "
|
|
105
|
-
"strategy": "
|
|
104
|
+
"specifier": "latest",
|
|
105
|
+
"strategy": "latest",
|
|
106
106
|
},
|
|
107
107
|
"vitest": {
|
|
108
108
|
"registry": "npm",
|
|
109
|
-
"specifier": "
|
|
110
|
-
"strategy": "
|
|
109
|
+
"specifier": "latest",
|
|
110
|
+
"strategy": "latest",
|
|
111
111
|
},
|
|
112
112
|
},
|
|
113
113
|
"web_app_dev_dependencies": {
|
|
114
114
|
"@types/react": {
|
|
115
115
|
"registry": "npm",
|
|
116
|
-
"specifier": "
|
|
117
|
-
"strategy": "
|
|
116
|
+
"specifier": "latest",
|
|
117
|
+
"strategy": "latest",
|
|
118
118
|
},
|
|
119
119
|
"@types/react-dom": {
|
|
120
120
|
"registry": "npm",
|
|
121
|
-
"specifier": "
|
|
122
|
-
"strategy": "
|
|
121
|
+
"specifier": "latest",
|
|
122
|
+
"strategy": "latest",
|
|
123
123
|
},
|
|
124
124
|
"@vitejs/plugin-react": {
|
|
125
125
|
"registry": "npm",
|
|
126
126
|
"specifier": "latest",
|
|
127
|
-
"strategy": "
|
|
127
|
+
"strategy": "latest",
|
|
128
128
|
},
|
|
129
129
|
"typescript": {
|
|
130
130
|
"registry": "npm",
|
|
131
|
-
"specifier": "
|
|
132
|
-
"strategy": "
|
|
131
|
+
"specifier": "latest",
|
|
132
|
+
"strategy": "latest",
|
|
133
133
|
},
|
|
134
134
|
"vite": {
|
|
135
135
|
"registry": "npm",
|
|
136
|
-
"specifier": "
|
|
137
|
-
"strategy": "
|
|
136
|
+
"specifier": "latest",
|
|
137
|
+
"strategy": "latest",
|
|
138
138
|
},
|
|
139
139
|
"vitest": {
|
|
140
140
|
"registry": "npm",
|
|
141
|
-
"specifier": "
|
|
142
|
-
"strategy": "
|
|
141
|
+
"specifier": "latest",
|
|
142
|
+
"strategy": "latest",
|
|
143
143
|
},
|
|
144
144
|
},
|
|
145
145
|
"storybook_dependencies": {
|
|
146
146
|
"@emotion/react": {
|
|
147
147
|
"registry": "npm",
|
|
148
|
-
"specifier": "
|
|
149
|
-
"strategy": "
|
|
148
|
+
"specifier": "latest",
|
|
149
|
+
"strategy": "latest",
|
|
150
150
|
},
|
|
151
151
|
"@emotion/styled": {
|
|
152
152
|
"registry": "npm",
|
|
153
|
-
"specifier": "
|
|
154
|
-
"strategy": "
|
|
153
|
+
"specifier": "latest",
|
|
154
|
+
"strategy": "latest",
|
|
155
155
|
},
|
|
156
156
|
"@mui/material": {
|
|
157
157
|
"registry": "npm",
|
|
158
|
-
"specifier": "
|
|
159
|
-
"strategy": "
|
|
158
|
+
"specifier": "latest",
|
|
159
|
+
"strategy": "latest",
|
|
160
160
|
},
|
|
161
161
|
"react": {
|
|
162
162
|
"registry": "npm",
|
|
163
|
-
"specifier": "
|
|
164
|
-
"strategy": "
|
|
163
|
+
"specifier": "latest",
|
|
164
|
+
"strategy": "latest",
|
|
165
165
|
},
|
|
166
166
|
"react-dom": {
|
|
167
167
|
"registry": "npm",
|
|
168
|
-
"specifier": "
|
|
169
|
-
"strategy": "
|
|
168
|
+
"specifier": "latest",
|
|
169
|
+
"strategy": "latest",
|
|
170
170
|
},
|
|
171
171
|
},
|
|
172
172
|
"storybook_dev_dependencies": {
|
|
173
173
|
"@storybook/addon-essentials": {
|
|
174
174
|
"registry": "npm",
|
|
175
|
-
"specifier": "
|
|
176
|
-
"strategy": "
|
|
175
|
+
"specifier": "latest",
|
|
176
|
+
"strategy": "latest",
|
|
177
177
|
},
|
|
178
178
|
"@storybook/react": {
|
|
179
179
|
"registry": "npm",
|
|
180
|
-
"specifier": "
|
|
181
|
-
"strategy": "
|
|
180
|
+
"specifier": "latest",
|
|
181
|
+
"strategy": "latest",
|
|
182
182
|
},
|
|
183
183
|
"@storybook/react-vite": {
|
|
184
184
|
"registry": "npm",
|
|
185
|
-
"specifier": "
|
|
186
|
-
"strategy": "
|
|
185
|
+
"specifier": "latest",
|
|
186
|
+
"strategy": "latest",
|
|
187
|
+
},
|
|
188
|
+
"@vitejs/plugin-react": {
|
|
189
|
+
"registry": "npm",
|
|
190
|
+
"specifier": "latest",
|
|
191
|
+
"strategy": "latest",
|
|
187
192
|
},
|
|
188
193
|
"@types/react": {
|
|
189
194
|
"registry": "npm",
|
|
190
|
-
"specifier": "
|
|
191
|
-
"strategy": "
|
|
195
|
+
"specifier": "latest",
|
|
196
|
+
"strategy": "latest",
|
|
192
197
|
},
|
|
193
198
|
"@types/react-dom": {
|
|
194
199
|
"registry": "npm",
|
|
195
|
-
"specifier": "
|
|
196
|
-
"strategy": "
|
|
200
|
+
"specifier": "latest",
|
|
201
|
+
"strategy": "latest",
|
|
197
202
|
},
|
|
198
203
|
"storybook": {
|
|
199
204
|
"registry": "npm",
|
|
200
|
-
"specifier": "
|
|
201
|
-
"strategy": "
|
|
205
|
+
"specifier": "latest",
|
|
206
|
+
"strategy": "latest",
|
|
202
207
|
},
|
|
203
208
|
"typescript": {
|
|
204
209
|
"registry": "npm",
|
|
205
|
-
"specifier": "
|
|
206
|
-
"strategy": "
|
|
210
|
+
"specifier": "latest",
|
|
211
|
+
"strategy": "latest",
|
|
207
212
|
},
|
|
208
213
|
"vite": {
|
|
209
214
|
"registry": "npm",
|
|
210
|
-
"specifier": "
|
|
211
|
-
"strategy": "
|
|
215
|
+
"specifier": "latest",
|
|
216
|
+
"strategy": "latest",
|
|
212
217
|
},
|
|
213
218
|
"vitest": {
|
|
214
219
|
"registry": "npm",
|
|
215
|
-
"specifier": "
|
|
216
|
-
"strategy": "
|
|
220
|
+
"specifier": "latest",
|
|
221
|
+
"strategy": "latest",
|
|
217
222
|
},
|
|
218
223
|
},
|
|
219
224
|
"domain_runtime_dependencies": {
|
|
220
225
|
"sqlmodel": {
|
|
221
226
|
"registry": "pypi",
|
|
222
227
|
"specifier": "sqlmodel",
|
|
223
|
-
"strategy": "
|
|
228
|
+
"strategy": "latest",
|
|
224
229
|
},
|
|
225
230
|
"httpx": {
|
|
226
231
|
"registry": "pypi",
|
|
227
232
|
"specifier": "httpx",
|
|
228
|
-
"strategy": "
|
|
233
|
+
"strategy": "latest",
|
|
229
234
|
},
|
|
230
235
|
"dependency-injector": {
|
|
231
236
|
"registry": "pypi",
|
|
232
237
|
"specifier": "dependency-injector",
|
|
233
|
-
"strategy": "
|
|
238
|
+
"strategy": "latest",
|
|
234
239
|
},
|
|
235
240
|
"pydantic": {
|
|
236
241
|
"registry": "pypi",
|
|
237
242
|
"specifier": "pydantic",
|
|
238
|
-
"strategy": "
|
|
243
|
+
"strategy": "latest",
|
|
239
244
|
},
|
|
240
245
|
"pydantic-settings": {
|
|
241
246
|
"registry": "pypi",
|
|
242
247
|
"specifier": "pydantic-settings",
|
|
243
|
-
"strategy": "
|
|
248
|
+
"strategy": "latest",
|
|
244
249
|
},
|
|
245
250
|
"asyncpg": {
|
|
246
251
|
"registry": "pypi",
|
|
247
252
|
"specifier": "asyncpg",
|
|
248
|
-
"strategy": "
|
|
253
|
+
"strategy": "latest",
|
|
249
254
|
},
|
|
250
255
|
},
|
|
251
256
|
"domain_migration_dependencies": {
|
|
252
257
|
"alembic": {
|
|
253
258
|
"registry": "pypi",
|
|
254
259
|
"specifier": "alembic",
|
|
255
|
-
"strategy": "
|
|
260
|
+
"strategy": "latest",
|
|
256
261
|
}
|
|
257
262
|
},
|
|
258
263
|
"api_runtime_base_dependencies": {
|
|
259
264
|
"fastapi": {
|
|
260
265
|
"registry": "pypi",
|
|
261
|
-
"specifier": "fastapi
|
|
262
|
-
"strategy": "
|
|
266
|
+
"specifier": "fastapi",
|
|
267
|
+
"strategy": "latest",
|
|
263
268
|
"package": "fastapi",
|
|
264
269
|
},
|
|
265
270
|
"uvicorn[standard]": {
|
|
266
271
|
"registry": "pypi",
|
|
267
|
-
"specifier": "uvicorn[standard]
|
|
268
|
-
"strategy": "
|
|
272
|
+
"specifier": "uvicorn[standard]",
|
|
273
|
+
"strategy": "latest",
|
|
269
274
|
"package": "uvicorn",
|
|
270
275
|
},
|
|
271
276
|
},
|
|
272
277
|
"engine": {
|
|
273
278
|
"pyo3": {
|
|
274
279
|
"registry": "cratesio",
|
|
275
|
-
"specifier": "
|
|
276
|
-
"strategy": "
|
|
280
|
+
"specifier": "*",
|
|
281
|
+
"strategy": "latest",
|
|
277
282
|
},
|
|
278
283
|
"maturin": {
|
|
279
284
|
"registry": "pypi",
|
|
280
|
-
"specifier": "maturin
|
|
281
|
-
"strategy": "
|
|
285
|
+
"specifier": "maturin",
|
|
286
|
+
"strategy": "latest",
|
|
282
287
|
},
|
|
283
288
|
},
|
|
284
|
-
}
|
|
289
|
+
}
|
|
@@ -9,7 +9,7 @@ from urllib.parse import quote
|
|
|
9
9
|
from urllib.request import Request, urlopen
|
|
10
10
|
|
|
11
11
|
RegistryName = Literal["npm", "pypi", "cratesio"]
|
|
12
|
-
RefreshStrategy = Literal["caret", "minimum", "exact", "major-range"]
|
|
12
|
+
RefreshStrategy = Literal["caret", "minimum", "exact", "major-range", "latest"]
|
|
13
13
|
Manifest = dict[str, dict[str, dict[str, str]]]
|
|
14
14
|
|
|
15
15
|
_USER_AGENT = "rpr-cli/0.1.1 (+https://github.com/)"
|
|
@@ -79,13 +79,31 @@ def refresh_dependency_manifest(
|
|
|
79
79
|
continue
|
|
80
80
|
|
|
81
81
|
package = entry.get("package", dependency)
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
82
|
+
if strategy == "latest":
|
|
83
|
+
latest_version = "latest"
|
|
84
|
+
new_specifier = _format_specifier(
|
|
85
|
+
strategy,
|
|
86
|
+
dependency,
|
|
87
|
+
package,
|
|
88
|
+
latest_version,
|
|
89
|
+
registry,
|
|
90
|
+
)
|
|
91
|
+
else:
|
|
92
|
+
cache_key = (registry, package)
|
|
93
|
+
latest_version = latest_version_cache.get(cache_key)
|
|
94
|
+
if latest_version is None:
|
|
95
|
+
latest_version = fetch_latest_version(
|
|
96
|
+
registry, package, timeout=timeout
|
|
97
|
+
)
|
|
98
|
+
latest_version_cache[cache_key] = latest_version
|
|
99
|
+
|
|
100
|
+
new_specifier = _format_specifier(
|
|
101
|
+
strategy,
|
|
102
|
+
dependency,
|
|
103
|
+
package,
|
|
104
|
+
latest_version,
|
|
105
|
+
registry,
|
|
106
|
+
)
|
|
89
107
|
old_specifier = entry["specifier"]
|
|
90
108
|
if new_specifier == old_specifier:
|
|
91
109
|
continue
|
|
@@ -107,8 +125,18 @@ def refresh_dependency_manifest(
|
|
|
107
125
|
|
|
108
126
|
|
|
109
127
|
def _format_specifier(
|
|
110
|
-
strategy: str,
|
|
128
|
+
strategy: str,
|
|
129
|
+
dependency: str,
|
|
130
|
+
package: str,
|
|
131
|
+
latest_version: str,
|
|
132
|
+
registry: str,
|
|
111
133
|
) -> str:
|
|
134
|
+
if strategy == "latest":
|
|
135
|
+
if registry == "npm":
|
|
136
|
+
return "latest"
|
|
137
|
+
if registry == "cratesio":
|
|
138
|
+
return "*"
|
|
139
|
+
return dependency
|
|
112
140
|
if strategy == "caret":
|
|
113
141
|
return f"^{latest_version}"
|
|
114
142
|
if strategy == "minimum":
|
|
@@ -11,6 +11,7 @@ Use React for UI composition, TanStack Query for server-state workflows, TanStac
|
|
|
11
11
|
|
|
12
12
|
- Use functional components.
|
|
13
13
|
- Extract reusable behavior into hooks instead of duplicating component logic.
|
|
14
|
+
- Import the generated shared UI package through the app-scoped package name `@{name}/ui`, such as `@testapp/ui`, not `@repo/{name}-ui`.
|
|
14
15
|
- Prefer a shared base API service at `src/services/base/api.service.ts` when the UI package needs centralized fetch behavior.
|
|
15
16
|
- Prefer a shared `useStateNavigation` hook at `src/hooks/useStateNavigation.ts` when UI state should persist in the URL.
|
|
16
17
|
- Reuse existing components, hooks, and service patterns before introducing a new abstraction.
|