rpr-cli 0.2.0__tar.gz → 0.3.1__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.2.0 → rpr_cli-0.3.1}/PKG-INFO +1 -1
- {rpr_cli-0.2.0/src/rpr/scaffolds → rpr_cli-0.3.1/Sample-dot-github}/instructions/all.instructions.md +1 -1
- {rpr_cli-0.2.0/src/rpr/scaffolds → rpr_cli-0.3.1/Sample-dot-github}/instructions/rust-engine.instructions.md +2 -1
- {rpr_cli-0.2.0/src/rpr/scaffolds → rpr_cli-0.3.1/Sample-dot-github}/instructions/tooling-setup.instructions.md +26 -32
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/Sample-dot-github/instructions/tooling.instructions.md +9 -8
- rpr_cli-0.3.1/src/rpr/__init__.py +1 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/checks/packages.py +41 -4
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/checks/workspace.py +12 -6
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/commands/generate/api.py +24 -4
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/commands/generate/domain.py +28 -3
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/commands/generate/engine.py +8 -1
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/commands/generate/storybook.py +82 -108
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/commands/generate/ui.py +90 -82
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/commands/init.py +140 -95
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/context.py +14 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/dependencies.py +4 -3
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/dependency_manifest_data.py +27 -32
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/domain/settings.md +16 -4
- {rpr_cli-0.2.0/Sample-dot-github → rpr_cli-0.3.1/src/rpr/scaffolds}/instructions/all.instructions.md +8 -8
- {rpr_cli-0.2.0/Sample-dot-github → rpr_cli-0.3.1/src/rpr/scaffolds}/instructions/rust-engine.instructions.md +3 -2
- rpr_cli-0.3.1/src/rpr/scaffolds/instructions/tooling-setup.instructions.md +91 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/instructions/tooling.instructions.md +9 -8
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/special_files/domain_settings.md +16 -4
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/workspace.py +14 -1
- rpr_cli-0.3.1/stories/package-maintenance/default-vite-8-oxc-toolchain.md +146 -0
- rpr_cli-0.3.1/stories/package-maintenance/typescript-7-frontend-scaffold-compatibility.md +123 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_check.py +12 -11
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_context.py +30 -1
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_generate_api.py +8 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_generate_domain.py +35 -5
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_generate_engine.py +2 -1
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_generate_storybook.py +23 -45
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_generate_ui.py +45 -16
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_init.py +120 -26
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_sync.py +14 -2
- rpr_cli-0.2.0/Sample-dot-github/instructions/tooling-setup.instructions.md +0 -97
- rpr_cli-0.2.0/src/rpr/__init__.py +0 -1
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/.github/agents/story.agent.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/.github/workflows/publish-pypi.yml +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/.gitignore +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/CLAUDE.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/GEMINI.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/LICENSE +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/README.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/Sample-dot-github/instructions/api.instructions.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/Sample-dot-github/instructions/domain.instructions.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/Sample-dot-github/instructions/frontend.instructions.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/Sample-dot-github/instructions/setup-guide.instructions.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/README.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/api/main.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/domain/base-repo.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/domain/base_entity.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/frontend/api.service.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/frontend/useStateNavigation.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/frontend/virtual-list/VirtualComponent.spec.tsx +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/frontend/virtual-list/VirtualComponent.tsx +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/frontend/virtual-list/VirtualComponentList.spec.tsx +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/frontend/virtual-list/VirtualComponentList.tsx +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/frontend/virtual-list/index.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/changelogs/mui_v9.txt +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/code-map.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/nx_uv_setup.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/patch_output.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/plan-languageAwareTemplateAdd.prompt.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/pyproject.toml +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/rpr-parser/Cargo.lock +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/rpr-parser/Cargo.toml +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/rpr-parser/pyproject.toml +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/rpr-parser/rpr_parser.pyi +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/rpr-parser/src/config/container.rs +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/rpr-parser/src/config/mod.rs +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/rpr-parser/src/config/settings.rs +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/rpr-parser/src/graph.rs +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/rpr-parser/src/lib.rs +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/rpr-parser/src/models/dtos/mod.rs +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/rpr-parser/src/models/entities/mod.rs +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/rpr-parser/src/models/entities/users.rs +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/rpr-parser/src/models/mod.rs +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/rpr-parser/src/parse.rs +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/rpr-parser/src/repos/base.rs +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/rpr-parser/src/repos/mod.rs +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/rpr-parser/src/repos/users.rs +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/rpr-parser/src/resolve.rs +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/rpr-parser/src/walker.rs +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/rpr-parser/uv.lock +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/special_files.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/agent/__init__.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/agent/approval.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/agent/bootstrap.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/agent/client.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/agent/control.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/agent/mock.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/agent/runtime.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/agent/session.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/agent/tools/__init__.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/agent/tools/base.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/agent/tools/mutating.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/agent/tools/readonly.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/agent/tools/registry.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/application/__init__.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/application/catalog.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/application/chat_service.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/application/checks.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/application/cli_adapter.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/application/completer.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/application/conversation_service.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/application/prompt_service.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/application/selector.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/application/shell.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/checks/__init__.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/checks/base.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/checks/instructions.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/cli.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/commands/__init__.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/commands/add.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/commands/chat.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/commands/check.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/commands/generate/__init__.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/commands/map.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/commands/refresh.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/commands/settings.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/commands/sync.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/commands/update.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/generators/__init__.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/generators/base.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/generators/claude.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/generators/copilot.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/generators/cursor.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/generators/gemini.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/generators/github.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/manifest_refresh.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/map/__init__.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/map/architecture.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/map/chains.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/map/classifier.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/map/coverage.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/map/dependencies.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/map/extractor.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/map/graph.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/map/output.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/map/responsibility.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/map/topology.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/map/walker.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/package_updates.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/domain/base_entity.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/domain/base_repo.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/domain/container.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/instructions/api.instructions.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/instructions/domain.instructions.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/instructions/frontend.instructions.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/instructions/setup-guide.instructions.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/README.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/client/index.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/client/types.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/ChatComposer.spec.tsx +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/ChatComposer.tsx +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/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.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/fileDrop.spec.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/fileDrop.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/index.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/ChatComposerMentionTokens.tsx +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/ChatSuggestionsPopover.tsx +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/LocalFileSuggestionAction.tsx +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/index.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/localFileSuggestions.spec.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/localFileSuggestions.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/triggerDetection.spec.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/triggerDetection.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/types.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/useChatSuggestions.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/types.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/useChatComposer.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/useChatStream.spec.tsx +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/useChatStream.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/index.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/testing/createMockChatStreamClient.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/testing/createMockSuggestionProvider.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/testing/index.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/thread/ChatMessage.tsx +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/thread/ChatMessageContent.spec.tsx +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/thread/ChatMessageContent.tsx +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/thread/ChatThread.spec.tsx +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/thread/ChatThread.tsx +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/thread/README.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/thread/contentFormat.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/thread/index.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/thread/streaming.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/thread/types.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/virtual-list/VirtualComponent.spec.tsx +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/virtual-list/VirtualComponent.tsx +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/virtual-list/VirtualComponentList.spec.tsx +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/virtual-list/VirtualComponentList.tsx +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/virtual-list/index.ts +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/fetch.service.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/sticky-navigation.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/sticky-navigation.spec.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/vitest-browser-config.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/special_files/camel_case_model.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/special_files/domain_container.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/special_files/dto_util.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/special_files/encrypted_column.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/special_files/mapper_util.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/scaffolds/special_files/partial_update.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/templates/__init__.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/templates/registry.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/ui/__init__.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/ui/console.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/ui/markdown.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/ui/prompt_session.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/ui/renderers.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/src/rpr/ui/theme.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/README.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/00-bootstrap-cli.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/01-rpr-init.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/02-rpr-generate-domain.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/03-rpr-generate-api.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/04-rpr-generate-ui.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/05-rpr-generate-engine.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/06-rpr-generate-storybook.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/07-rpr-sync-rules.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/08-rpr-add-template.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/09-rpr-check.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/10-rpr-domain-config.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/chat/18-rpr-terminal-ui-foundation.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/chat/19-rpr-markdown-rendering.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/chat/20-rpr-chat-repl.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/chat/21-rpr-agent-tool-loop.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/chat/22-rpr-chat-tui.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/chat/23-rpr-chat-unified-command-shell.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/chat/24-rpr-async-chat-runtime-and-services.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/chat/25-rpr-prompt-service-and-conversation-lifecycle.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/chat/26-rpr-shared-command-catalog.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/chat/27-rpr-slash-command-selection-panel.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/chat/28-rpr-chat-cancellable-and-multiline-input.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/chat/29-rpr-file-context-selection.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/map/11-rpr-map-command.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/map/12-rpr-map-file-walker.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/map/13-rpr-map-rust-engine.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/map/13a-rpr-map-gitignore.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/map/14-rpr-map-graph-builder.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/map/15-rpr-map-analysis-bridge.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/map/16-rpr-map-layer-classifier.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/map/17-rpr-map-output.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/map/17a-rpr-map-directory-topology.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/map/17b-rpr-map-architecture-assessment.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/map/17c-rpr-map-representative-chains.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/completed/map/17d-rpr-map-multi-resolution-output.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/map/30-rpr-map-directory-view-and-cycle-detection.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/map/31-rpr-map-coupling-hotspots-and-verdict-reasoning.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/map/32-rpr-map-dependencies-responsibilities-and-test-coverage.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/stories/package-maintenance/rpr-update-packages.md +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/__init__.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_add.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_architecture.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_architecture_unwrapped.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_catalog.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_chat.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_chat_service.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_completer.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_map.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_map_chains.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_map_classifier.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_map_coverage.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_map_dependencies.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_map_extractor.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_map_graph.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_map_output.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_map_responsibility.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_map_topology.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_map_walker.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_package_updates.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_packaging.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_prompt_session.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_refresh.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_rpr_parser_stub.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_selector.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_settings.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_ui.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/tests/test_update_packages.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/update_output.py +0 -0
- {rpr_cli-0.2.0 → rpr_cli-0.3.1}/uv.lock +0 -0
{rpr_cli-0.2.0/src/rpr/scaffolds → rpr_cli-0.3.1/Sample-dot-github}/instructions/all.instructions.md
RENAMED
|
@@ -37,7 +37,7 @@ This project uses an NX + UV monorepo with a domain-driven design approach. Appl
|
|
|
37
37
|
- Instruction files describe when to use a pattern and what constraints to follow.
|
|
38
38
|
- `setup-guide.instructions.md` captures the NX + UV workspace contract for root setup, project layout, naming, and expected command surfaces.
|
|
39
39
|
- `tooling.instructions.md` defines workspace-wide linting, formatting, and pre-commit conventions.
|
|
40
|
-
- `tooling-setup.instructions.md` contains detailed setup guidance for root tooling files such as `pyproject.toml`, `nx.json`, `.pre-commit-config.yaml`, and
|
|
40
|
+
- `tooling-setup.instructions.md` contains detailed setup guidance for root tooling files such as `pyproject.toml`, `nx.json`, `.pre-commit-config.yaml`, `.oxlintrc.json`, `.oxfmtrc.json`, and `.dependency-cruiser.cjs`.
|
|
41
41
|
- Shared utility implementations should live in stable project paths so code can reuse them instead of duplicating the same helpers in multiple places.
|
|
42
42
|
- Files in `.github/scaffolds/` are reference examples. Use them as guidance if they exist, but do not force the codebase to match them when local conventions already differ.
|
|
43
43
|
|
|
@@ -25,7 +25,8 @@ Use Rust for performance-sensitive code that needs a Python-facing API. This pac
|
|
|
25
25
|
|
|
26
26
|
- `engine:build` should run `uv run maturin develop` from the engine package directory.
|
|
27
27
|
- `engine:lint` should run `cargo clippy --all-targets --all-features -- -D warnings`.
|
|
28
|
-
- `
|
|
28
|
+
- `format` should run `cargo fmt`.
|
|
29
|
+
- `format:check` should run `cargo fmt --check`.
|
|
29
30
|
|
|
30
31
|
## Binding Conventions
|
|
31
32
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
|
-
applyTo: "pyproject.toml,nx.json,.pre-commit-config.yaml,package.json,apps/*/project.json,packages/**/project.json,
|
|
3
|
-
description: "Use when setting up or modifying Ruff, TypeScript linting,
|
|
2
|
+
applyTo: "pyproject.toml,nx.json,.pre-commit-config.yaml,package.json,.oxlintrc.json,.oxfmtrc.json,.dependency-cruiser.cjs,apps/*/project.json,packages/**/project.json,packages/python/*_engine/Cargo.toml"
|
|
3
|
+
description: "Use when setting up or modifying Ruff, TypeScript linting, Oxlint, Oxfmt, cargo fmt, Clippy, or pre-commit in an RPR workspace"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Tooling Setup
|
|
@@ -17,37 +17,24 @@ Use this guidance when editing workspace tooling files or bootstrapping linting,
|
|
|
17
17
|
|
|
18
18
|
- Use Ruff for Python linting and formatting.
|
|
19
19
|
- Keep Ruff configuration in the root `pyproject.toml`.
|
|
20
|
-
- Prefer `uv run ruff check` for linting and `
|
|
20
|
+
- Prefer `uv run ruff check` for linting and `uvx ruff format .` / `uvx ruff format --check .` for Python project format targets.
|
|
21
21
|
- If the workspace already has a Ruff config, extend it rather than replacing it with a different rule set.
|
|
22
22
|
- If bootstrapping from the current RPR defaults, preserve the existing generated baseline unless the task explicitly asks for different rules.
|
|
23
23
|
|
|
24
24
|
## TypeScript and React Baseline
|
|
25
25
|
|
|
26
|
-
- In the current RPR generator, the default `lint` target for Node and React projects is `npx
|
|
26
|
+
- In the current RPR generator, the default `lint` target for Node and React projects is `npx oxlint .`.
|
|
27
27
|
- Keep `typecheck` as a separate target that runs `npx tsc --noEmit`.
|
|
28
|
-
- Use
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
```json
|
|
34
|
-
{
|
|
35
|
-
"plugins": [
|
|
36
|
-
{
|
|
37
|
-
"plugin": "@nx/eslint/plugin",
|
|
38
|
-
"options": {
|
|
39
|
-
"targetName": "lint"
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
]
|
|
43
|
-
}
|
|
44
|
-
```
|
|
28
|
+
- Use root `.oxlintrc.json` and `.oxfmtrc.json` files; Oxlint and Oxfmt discover them when targets run from a nested project directory.
|
|
29
|
+
- Node project `format` and `format:check` targets use `npx oxfmt --write .` and `npx oxfmt --check .`; root `npm run format` and `npm run format:check` run the matching Nx targets across the workspace.
|
|
30
|
+
- Generated frontend projects install `@typescript/native@npm:typescript@^7.0.2` for `npx tsc` and `typescript@npm:@typescript/typescript6@^6.0.2` for tools that require the TypeScript 6 API. Do not restore `baseUrl`, because TypeScript 7 rejects it; keep Vite client types explicit in the generated web app configuration.
|
|
31
|
+
- Keep `.dependency-cruiser.cjs` and `npm run boundaries` aligned with the generated module-boundary rules. Do not reintroduce ESLint solely for boundary checking.
|
|
45
32
|
|
|
46
33
|
## Rust Baseline
|
|
47
34
|
|
|
48
35
|
- Use `cargo fmt --check` for formatting validation.
|
|
49
36
|
- Use `cargo clippy --all-targets --all-features -- -D warnings` for linting.
|
|
50
|
-
- In RPR-generated engine packages,
|
|
37
|
+
- In RPR-generated engine packages, `format` runs `cargo fmt`, `format:check` runs `cargo fmt --check`, and `engine:lint` runs Clippy.
|
|
51
38
|
|
|
52
39
|
## Pre-commit Rules
|
|
53
40
|
|
|
@@ -55,7 +42,7 @@ Valid `nx.json` plugin example:
|
|
|
55
42
|
- Define one hook per command. Do not reuse a single hook entry for two commands.
|
|
56
43
|
- Hook ids, documented manual run commands, and actual entries must match exactly.
|
|
57
44
|
- Prefer commands the workspace already uses in `project.json`, `package.json`, or root scripts.
|
|
58
|
-
- When bootstrapping a fresh RPR workspace, scaffold `
|
|
45
|
+
- When bootstrapping a fresh RPR workspace, scaffold `oxlint` and `oxfmt` hooks with the matching config files.
|
|
59
46
|
|
|
60
47
|
Valid local hook example aligned with the current RPR defaults:
|
|
61
48
|
|
|
@@ -75,15 +62,21 @@ repos:
|
|
|
75
62
|
language: system
|
|
76
63
|
pass_filenames: false
|
|
77
64
|
|
|
78
|
-
- id:
|
|
79
|
-
name:
|
|
80
|
-
entry: npx
|
|
65
|
+
- id: oxfmt
|
|
66
|
+
name: Oxfmt
|
|
67
|
+
entry: npx oxfmt --write .
|
|
68
|
+
language: system
|
|
69
|
+
pass_filenames: false
|
|
70
|
+
|
|
71
|
+
- id: oxlint
|
|
72
|
+
name: Oxlint (NX)
|
|
73
|
+
entry: npx nx run-many --target=lint --all --exclude=engine -- --fix
|
|
81
74
|
language: system
|
|
82
75
|
pass_filenames: false
|
|
83
76
|
|
|
84
|
-
- id:
|
|
85
|
-
name:
|
|
86
|
-
entry: npx
|
|
77
|
+
- id: module-boundaries
|
|
78
|
+
name: Module boundaries
|
|
79
|
+
entry: npx depcruise apps packages/node
|
|
87
80
|
language: system
|
|
88
81
|
pass_filenames: false
|
|
89
82
|
```
|
|
@@ -91,7 +84,8 @@ repos:
|
|
|
91
84
|
## Consistency Checks
|
|
92
85
|
|
|
93
86
|
- Use `package.json`, not `packages.json`.
|
|
94
|
-
-
|
|
95
|
-
- If you introduce a hook named `
|
|
96
|
-
-
|
|
87
|
+
- Keep a separate `typecheck` target for `npx tsc --noEmit`; Oxlint does not replace TypeScript compilation.
|
|
88
|
+
- If you introduce a hook named `oxlint` or `oxfmt`, define that hook explicitly.
|
|
89
|
+
- Keep the `module-boundaries` hook aligned with the root `boundaries` script and `.dependency-cruiser.cjs`.
|
|
90
|
+
- If you document Oxc, ensure the package install, config format, Nx integration, and manual commands all match.
|
|
97
91
|
- If a long-form guide conflicts with the generated project defaults, update the guide or the generator so they agree.
|
|
@@ -11,32 +11,33 @@ Use the workspace's existing linting, formatting, and pre-commit setup when it a
|
|
|
11
11
|
|
|
12
12
|
- Use Ruff for Python linting and formatting.
|
|
13
13
|
- Keep Ruff configuration in the root `pyproject.toml` under `[tool.ruff]`.
|
|
14
|
-
-
|
|
14
|
+
- Use `uvx ruff format .` and `uvx ruff format --check .` through each Python project's Nx `format` and `format:check` targets.
|
|
15
15
|
- If the project already pins Ruff in dependencies, keep it there. Do not rely on undocumented cache behavior as the only installation path.
|
|
16
16
|
|
|
17
17
|
## TypeScript and React
|
|
18
18
|
|
|
19
|
-
- In RPR-generated workspaces, use
|
|
20
|
-
- Keep
|
|
21
|
-
-
|
|
22
|
-
- Keep `lint`, `format`, and `typecheck` responsibilities separate. Do not use TypeScript typechecking as a substitute for
|
|
19
|
+
- In RPR-generated workspaces, use Oxlint for JavaScript and TypeScript linting, Oxfmt for Node project formatting, and `npx tsc --noEmit` as a separate typecheck target.
|
|
20
|
+
- Keep root `.oxlintrc.json` and `.oxfmtrc.json` configuration aligned with generated Nx targets and pre-commit hooks.
|
|
21
|
+
- Use `npm run format` and `npm run format:check` to orchestrate every project's matching Nx target; do not invoke Oxfmt over the repository root.
|
|
22
|
+
- Keep `lint`, `format`, and `typecheck` responsibilities separate. Do not use TypeScript typechecking as a substitute for Oxlint.
|
|
23
|
+
- Keep `.dependency-cruiser.cjs` and `npm run boundaries` aligned with the generated import-boundary rules.
|
|
23
24
|
|
|
24
25
|
## Rust
|
|
25
26
|
|
|
26
27
|
- Use `cargo fmt --check` for formatting validation.
|
|
27
28
|
- Use `cargo clippy --all-targets --all-features -- -D warnings` for linting.
|
|
28
|
-
-
|
|
29
|
+
- Use the engine's `format` and `format:check` targets for `cargo fmt` and `cargo fmt --check`; retain `engine:lint` for Clippy.
|
|
29
30
|
|
|
30
31
|
## Pre-commit
|
|
31
32
|
|
|
32
33
|
- Pre-commit hooks must call commands that already exist in the workspace.
|
|
33
34
|
- Keep hook ids, entries, and manual run examples aligned. Do not document a hook name that is not defined.
|
|
34
35
|
- Prefer running workspace-level commands through `uv run`, `npx`, `npx nx`, or existing package-manager scripts rather than ad hoc shell fragments.
|
|
35
|
-
- When the default Node tooling is scaffolded, keep `
|
|
36
|
+
- When the default Node tooling is scaffolded, keep `oxlint` and `oxfmt` hooks aligned with the generated config files.
|
|
36
37
|
- Ensure YAML examples are syntactically valid before adding them to shared docs or instructions.
|
|
37
38
|
|
|
38
39
|
## Change Discipline
|
|
39
40
|
|
|
40
|
-
- Reuse existing root config files such as `pyproject.toml`, `nx.json`,
|
|
41
|
+
- Reuse existing root config files such as `pyproject.toml`, `nx.json`, `.oxlintrc.json`, `.oxfmtrc.json`, and `.pre-commit-config.yaml` instead of creating duplicates.
|
|
41
42
|
- When a task is specifically to bootstrap tooling from scratch, keep the configuration consistent across docs, generated targets, and hook examples.
|
|
42
43
|
- Use `tooling-setup.instructions.md` for file-level guidance when editing root tooling config files.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.3.1"
|
|
@@ -67,7 +67,7 @@ def check_packages(project_dir: Path, variables: dict[str, str]) -> list[CheckRe
|
|
|
67
67
|
_check_project_targets(
|
|
68
68
|
area="Domain targets",
|
|
69
69
|
project_json=domain_dir / "project.json",
|
|
70
|
-
required_targets={"build", "test", "lint"},
|
|
70
|
+
required_targets={"build", "test", "lint", "format", "format:check"},
|
|
71
71
|
suggestion=f"rpr generate domain {name}",
|
|
72
72
|
)
|
|
73
73
|
)
|
|
@@ -130,7 +130,14 @@ def check_packages(project_dir: Path, variables: dict[str, str]) -> list[CheckRe
|
|
|
130
130
|
_check_project_targets(
|
|
131
131
|
area="API targets",
|
|
132
132
|
project_json=api_dir / "project.json",
|
|
133
|
-
required_targets={
|
|
133
|
+
required_targets={
|
|
134
|
+
"serve",
|
|
135
|
+
"build",
|
|
136
|
+
"test",
|
|
137
|
+
"lint",
|
|
138
|
+
"format",
|
|
139
|
+
"format:check",
|
|
140
|
+
},
|
|
134
141
|
suggestion=f"rpr generate api {name}",
|
|
135
142
|
)
|
|
136
143
|
)
|
|
@@ -173,7 +180,14 @@ def check_packages(project_dir: Path, variables: dict[str, str]) -> list[CheckRe
|
|
|
173
180
|
_check_project_targets(
|
|
174
181
|
area="UI targets",
|
|
175
182
|
project_json=ui_dir / "project.json",
|
|
176
|
-
required_targets={
|
|
183
|
+
required_targets={
|
|
184
|
+
"build",
|
|
185
|
+
"lint",
|
|
186
|
+
"format",
|
|
187
|
+
"format:check",
|
|
188
|
+
"test",
|
|
189
|
+
"typecheck",
|
|
190
|
+
},
|
|
177
191
|
suggestion=f"rpr generate ui {name}",
|
|
178
192
|
)
|
|
179
193
|
)
|
|
@@ -202,7 +216,15 @@ def check_packages(project_dir: Path, variables: dict[str, str]) -> list[CheckRe
|
|
|
202
216
|
_check_project_targets(
|
|
203
217
|
area="Web targets",
|
|
204
218
|
project_json=web_dir / "project.json",
|
|
205
|
-
required_targets={
|
|
219
|
+
required_targets={
|
|
220
|
+
"serve",
|
|
221
|
+
"build",
|
|
222
|
+
"lint",
|
|
223
|
+
"format",
|
|
224
|
+
"format:check",
|
|
225
|
+
"test",
|
|
226
|
+
"typecheck",
|
|
227
|
+
},
|
|
206
228
|
suggestion=f"rpr generate ui {name} --no-library",
|
|
207
229
|
)
|
|
208
230
|
)
|
|
@@ -235,6 +257,8 @@ def check_packages(project_dir: Path, variables: dict[str, str]) -> list[CheckRe
|
|
|
235
257
|
"serve",
|
|
236
258
|
"build",
|
|
237
259
|
"lint",
|
|
260
|
+
"format",
|
|
261
|
+
"format:check",
|
|
238
262
|
"test",
|
|
239
263
|
"typecheck",
|
|
240
264
|
"storybook",
|
|
@@ -264,6 +288,19 @@ def check_packages(project_dir: Path, variables: dict[str, str]) -> list[CheckRe
|
|
|
264
288
|
)
|
|
265
289
|
)
|
|
266
290
|
if engine_dir is not None:
|
|
291
|
+
results.append(
|
|
292
|
+
_check_project_targets(
|
|
293
|
+
area="Engine targets",
|
|
294
|
+
project_json=engine_dir / "project.json",
|
|
295
|
+
required_targets={
|
|
296
|
+
"engine:build",
|
|
297
|
+
"engine:lint",
|
|
298
|
+
"format",
|
|
299
|
+
"format:check",
|
|
300
|
+
},
|
|
301
|
+
suggestion=f"rpr generate engine {name}",
|
|
302
|
+
)
|
|
303
|
+
)
|
|
267
304
|
results.append(
|
|
268
305
|
_check_engine_install_metadata(
|
|
269
306
|
engine_dir=engine_dir,
|
|
@@ -20,7 +20,7 @@ def check_workspace(project_dir: Path) -> list[CheckResult]:
|
|
|
20
20
|
nx_data = json.loads(nx_json.read_text())
|
|
21
21
|
nx_ok = True
|
|
22
22
|
nx_cloud_disabled = nx_data.get("neverConnectToCloud") is True
|
|
23
|
-
except
|
|
23
|
+
except OSError, json.JSONDecodeError:
|
|
24
24
|
nx_ok = False
|
|
25
25
|
|
|
26
26
|
results.append(
|
|
@@ -53,7 +53,7 @@ def check_workspace(project_dir: Path) -> list[CheckResult]:
|
|
|
53
53
|
pyproject_data = tomllib.loads(pyproject.read_text())
|
|
54
54
|
tool = pyproject_data.get("tool", {})
|
|
55
55
|
uv_ok = "uv" in tool and "workspace" in tool["uv"]
|
|
56
|
-
except
|
|
56
|
+
except OSError, tomllib.TOMLDecodeError:
|
|
57
57
|
uv_ok = False
|
|
58
58
|
|
|
59
59
|
results.append(
|
|
@@ -76,8 +76,12 @@ def check_workspace(project_dir: Path) -> list[CheckResult]:
|
|
|
76
76
|
uv_require_version = "required-version" in tool.get("uv", {})
|
|
77
77
|
pytest_config = "pytest" in tool and "ini_options" in tool["pytest"]
|
|
78
78
|
|
|
79
|
-
dependency_groups =
|
|
80
|
-
|
|
79
|
+
dependency_groups = (
|
|
80
|
+
pyproject_data.get("dependency-groups", {}) if pyproject_data else {}
|
|
81
|
+
)
|
|
82
|
+
dev_dependencies = (
|
|
83
|
+
dependency_groups.get("dev", []) if isinstance(dependency_groups, dict) else []
|
|
84
|
+
)
|
|
81
85
|
if isinstance(dev_dependencies, list):
|
|
82
86
|
required = {
|
|
83
87
|
"pytest",
|
|
@@ -113,7 +117,7 @@ def check_workspace(project_dir: Path) -> list[CheckResult]:
|
|
|
113
117
|
"apps/*",
|
|
114
118
|
"packages/node/*",
|
|
115
119
|
}.issubset(set(workspaces))
|
|
116
|
-
except
|
|
120
|
+
except OSError, json.JSONDecodeError:
|
|
117
121
|
node_workspace_ok = False
|
|
118
122
|
|
|
119
123
|
results.append(
|
|
@@ -139,7 +143,9 @@ def check_workspace(project_dir: Path) -> list[CheckResult]:
|
|
|
139
143
|
"nbstripout",
|
|
140
144
|
"uv run ruff format",
|
|
141
145
|
"uv run ruff check --fix",
|
|
142
|
-
"npx
|
|
146
|
+
"npx oxfmt --write .",
|
|
147
|
+
"npx nx run-many --target=lint --all --exclude=engine -- --fix",
|
|
148
|
+
"npx depcruise apps packages/node",
|
|
143
149
|
)
|
|
144
150
|
)
|
|
145
151
|
|
|
@@ -137,6 +137,20 @@ def _write_api_project_json(ctx: RunContext, api_root: Path, app_name: str) -> N
|
|
|
137
137
|
"cwd": f"apps/{app_name}",
|
|
138
138
|
},
|
|
139
139
|
},
|
|
140
|
+
"format": {
|
|
141
|
+
"executor": "nx:run-commands",
|
|
142
|
+
"options": {
|
|
143
|
+
"command": "uvx ruff format .",
|
|
144
|
+
"cwd": f"apps/{app_name}",
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
"format:check": {
|
|
148
|
+
"executor": "nx:run-commands",
|
|
149
|
+
"options": {
|
|
150
|
+
"command": "uvx ruff format --check .",
|
|
151
|
+
"cwd": f"apps/{app_name}",
|
|
152
|
+
},
|
|
153
|
+
},
|
|
140
154
|
},
|
|
141
155
|
}
|
|
142
156
|
ctx.write_file(api_root / "project.json", json.dumps(project, indent=2) + "\n")
|
|
@@ -152,6 +166,8 @@ from starlette.responses import JSONResponse
|
|
|
152
166
|
|
|
153
167
|
from {domain_underscore}.config.container import Container
|
|
154
168
|
|
|
169
|
+
from .routes.health import router as health_router
|
|
170
|
+
|
|
155
171
|
_container = Container()
|
|
156
172
|
|
|
157
173
|
|
|
@@ -167,11 +183,17 @@ async def lifespan(app: FastAPI):
|
|
|
167
183
|
|
|
168
184
|
|
|
169
185
|
async def generic_exception_handler(request: Request, exc: Exception) -> JSONResponse:
|
|
170
|
-
return JSONResponse(
|
|
186
|
+
return JSONResponse(
|
|
187
|
+
status_code=500,
|
|
188
|
+
content={{"message": "Internal server error"}},
|
|
189
|
+
)
|
|
171
190
|
|
|
172
191
|
|
|
173
192
|
async def validation_exception_handler(request: Request, exc: RequestValidationError) -> JSONResponse:
|
|
174
|
-
return JSONResponse(
|
|
193
|
+
return JSONResponse(
|
|
194
|
+
status_code=422,
|
|
195
|
+
content={{"message": "Validation error", "details": exc.errors()}},
|
|
196
|
+
)
|
|
175
197
|
|
|
176
198
|
|
|
177
199
|
def create_app() -> FastAPI:
|
|
@@ -184,8 +206,6 @@ def create_app() -> FastAPI:
|
|
|
184
206
|
|
|
185
207
|
app.add_exception_handler(Exception, generic_exception_handler)
|
|
186
208
|
app.add_exception_handler(RequestValidationError, validation_exception_handler)
|
|
187
|
-
from .routes.health import router as health_router
|
|
188
|
-
|
|
189
209
|
app.include_router(health_router, prefix="/api/health", tags=["Health"])
|
|
190
210
|
|
|
191
211
|
return app
|
|
@@ -39,6 +39,13 @@ def domain(
|
|
|
39
39
|
dry_run: Annotated[
|
|
40
40
|
bool, typer.Option("--dry-run", help="Preview changes without writing.")
|
|
41
41
|
] = False,
|
|
42
|
+
utilities: Annotated[
|
|
43
|
+
bool,
|
|
44
|
+
typer.Option(
|
|
45
|
+
"--utilities/--no-utilities",
|
|
46
|
+
help="Offer common utility templates after scaffolding.",
|
|
47
|
+
),
|
|
48
|
+
] = True,
|
|
42
49
|
) -> None:
|
|
43
50
|
"""Scaffold a DDD Python domain package."""
|
|
44
51
|
if not name:
|
|
@@ -109,7 +116,7 @@ def domain(
|
|
|
109
116
|
console.print(f"\n[bold green]Done![/] Domain package created at {domain_root}")
|
|
110
117
|
|
|
111
118
|
# --- post-scaffold utility prompt --------------------------------------
|
|
112
|
-
if
|
|
119
|
+
if utilities:
|
|
113
120
|
_offer_utility_templates(ctx, name)
|
|
114
121
|
|
|
115
122
|
|
|
@@ -192,6 +199,20 @@ def _write_project_json(
|
|
|
192
199
|
"command": f"uv run ruff check {root}/src",
|
|
193
200
|
},
|
|
194
201
|
},
|
|
202
|
+
"format": {
|
|
203
|
+
"executor": "nx:run-commands",
|
|
204
|
+
"options": {
|
|
205
|
+
"command": "uvx ruff format .",
|
|
206
|
+
"cwd": root,
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
"format:check": {
|
|
210
|
+
"executor": "nx:run-commands",
|
|
211
|
+
"options": {
|
|
212
|
+
"command": "uvx ruff format --check .",
|
|
213
|
+
"cwd": root,
|
|
214
|
+
},
|
|
215
|
+
},
|
|
195
216
|
},
|
|
196
217
|
}
|
|
197
218
|
if include_migrations:
|
|
@@ -386,5 +407,9 @@ def _offer_utility_templates(ctx: RunContext, name: str) -> None:
|
|
|
386
407
|
console.print(f" [dim]rpr add template python {t} --name {name}[/]")
|
|
387
408
|
|
|
388
409
|
if typer.confirm("\nWould you like to add these utilities now?", default=False):
|
|
389
|
-
|
|
390
|
-
|
|
410
|
+
_add_utility_templates(ctx, name)
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
def _add_utility_templates(ctx: RunContext, name: str) -> None:
|
|
414
|
+
for template in _UTILITY_TEMPLATES:
|
|
415
|
+
ctx.run_command(["rpr", "add", "template", "python", template, "--name", name])
|
|
@@ -137,7 +137,14 @@ def _write_engine_project_json(
|
|
|
137
137
|
"cwd": f"packages/python/{engine_name}",
|
|
138
138
|
},
|
|
139
139
|
},
|
|
140
|
-
"
|
|
140
|
+
"format": {
|
|
141
|
+
"executor": "nx:run-commands",
|
|
142
|
+
"options": {
|
|
143
|
+
"command": "cargo fmt",
|
|
144
|
+
"cwd": f"packages/python/{engine_name}",
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
"format:check": {
|
|
141
148
|
"executor": "nx:run-commands",
|
|
142
149
|
"options": {
|
|
143
150
|
"command": "cargo fmt --check",
|