rpr-cli 0.2.1__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.
Files changed (281) hide show
  1. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/PKG-INFO +1 -1
  2. {rpr_cli-0.2.1/src/rpr/scaffolds → rpr_cli-0.3.1/Sample-dot-github}/instructions/all.instructions.md +1 -1
  3. {rpr_cli-0.2.1/src/rpr/scaffolds → rpr_cli-0.3.1/Sample-dot-github}/instructions/rust-engine.instructions.md +2 -1
  4. {rpr_cli-0.2.1/src/rpr/scaffolds → rpr_cli-0.3.1/Sample-dot-github}/instructions/tooling-setup.instructions.md +26 -32
  5. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/Sample-dot-github/instructions/tooling.instructions.md +9 -8
  6. rpr_cli-0.3.1/src/rpr/__init__.py +1 -0
  7. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/checks/packages.py +41 -4
  8. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/checks/workspace.py +12 -6
  9. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/commands/generate/api.py +24 -4
  10. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/commands/generate/domain.py +28 -3
  11. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/commands/generate/engine.py +8 -1
  12. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/commands/generate/storybook.py +82 -108
  13. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/commands/generate/ui.py +90 -82
  14. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/commands/init.py +140 -95
  15. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/context.py +14 -0
  16. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/dependencies.py +4 -3
  17. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/dependency_manifest_data.py +27 -32
  18. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/domain/settings.md +16 -4
  19. {rpr_cli-0.2.1/Sample-dot-github → rpr_cli-0.3.1/src/rpr/scaffolds}/instructions/all.instructions.md +8 -8
  20. {rpr_cli-0.2.1/Sample-dot-github → rpr_cli-0.3.1/src/rpr/scaffolds}/instructions/rust-engine.instructions.md +3 -2
  21. rpr_cli-0.3.1/src/rpr/scaffolds/instructions/tooling-setup.instructions.md +91 -0
  22. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/instructions/tooling.instructions.md +9 -8
  23. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/special_files/domain_settings.md +16 -4
  24. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/workspace.py +14 -1
  25. rpr_cli-0.3.1/stories/package-maintenance/default-vite-8-oxc-toolchain.md +146 -0
  26. rpr_cli-0.3.1/stories/package-maintenance/typescript-7-frontend-scaffold-compatibility.md +123 -0
  27. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_check.py +12 -11
  28. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_context.py +30 -1
  29. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_generate_api.py +8 -0
  30. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_generate_domain.py +35 -5
  31. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_generate_engine.py +2 -1
  32. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_generate_storybook.py +23 -45
  33. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_generate_ui.py +45 -16
  34. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_init.py +120 -26
  35. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_sync.py +14 -2
  36. rpr_cli-0.2.1/Sample-dot-github/instructions/tooling-setup.instructions.md +0 -97
  37. rpr_cli-0.2.1/src/rpr/__init__.py +0 -1
  38. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/.github/agents/story.agent.md +0 -0
  39. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/.github/workflows/publish-pypi.yml +0 -0
  40. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/.gitignore +0 -0
  41. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/CLAUDE.md +0 -0
  42. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/GEMINI.md +0 -0
  43. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/LICENSE +0 -0
  44. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/README.md +0 -0
  45. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/Sample-dot-github/instructions/api.instructions.md +0 -0
  46. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/Sample-dot-github/instructions/domain.instructions.md +0 -0
  47. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/Sample-dot-github/instructions/frontend.instructions.md +0 -0
  48. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/Sample-dot-github/instructions/setup-guide.instructions.md +0 -0
  49. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/README.md +0 -0
  50. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/api/main.py +0 -0
  51. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/domain/base-repo.md +0 -0
  52. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/domain/base_entity.md +0 -0
  53. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/frontend/api.service.ts +0 -0
  54. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/frontend/useStateNavigation.ts +0 -0
  55. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/frontend/virtual-list/VirtualComponent.spec.tsx +0 -0
  56. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/frontend/virtual-list/VirtualComponent.tsx +0 -0
  57. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/frontend/virtual-list/VirtualComponentList.spec.tsx +0 -0
  58. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/frontend/virtual-list/VirtualComponentList.tsx +0 -0
  59. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/Sample-dot-github/scaffolds/frontend/virtual-list/index.ts +0 -0
  60. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/changelogs/mui_v9.txt +0 -0
  61. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/code-map.md +0 -0
  62. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/nx_uv_setup.md +0 -0
  63. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/patch_output.py +0 -0
  64. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/plan-languageAwareTemplateAdd.prompt.md +0 -0
  65. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/pyproject.toml +0 -0
  66. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/rpr-parser/Cargo.lock +0 -0
  67. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/rpr-parser/Cargo.toml +0 -0
  68. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/rpr-parser/pyproject.toml +0 -0
  69. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/rpr-parser/rpr_parser.pyi +0 -0
  70. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/rpr-parser/src/config/container.rs +0 -0
  71. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/rpr-parser/src/config/mod.rs +0 -0
  72. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/rpr-parser/src/config/settings.rs +0 -0
  73. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/rpr-parser/src/graph.rs +0 -0
  74. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/rpr-parser/src/lib.rs +0 -0
  75. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/rpr-parser/src/models/dtos/mod.rs +0 -0
  76. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/rpr-parser/src/models/entities/mod.rs +0 -0
  77. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/rpr-parser/src/models/entities/users.rs +0 -0
  78. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/rpr-parser/src/models/mod.rs +0 -0
  79. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/rpr-parser/src/parse.rs +0 -0
  80. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/rpr-parser/src/repos/base.rs +0 -0
  81. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/rpr-parser/src/repos/mod.rs +0 -0
  82. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/rpr-parser/src/repos/users.rs +0 -0
  83. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/rpr-parser/src/resolve.rs +0 -0
  84. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/rpr-parser/src/walker.rs +0 -0
  85. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/rpr-parser/uv.lock +0 -0
  86. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/special_files.md +0 -0
  87. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/agent/__init__.py +0 -0
  88. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/agent/approval.py +0 -0
  89. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/agent/bootstrap.py +0 -0
  90. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/agent/client.py +0 -0
  91. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/agent/control.py +0 -0
  92. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/agent/mock.py +0 -0
  93. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/agent/runtime.py +0 -0
  94. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/agent/session.py +0 -0
  95. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/agent/tools/__init__.py +0 -0
  96. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/agent/tools/base.py +0 -0
  97. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/agent/tools/mutating.py +0 -0
  98. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/agent/tools/readonly.py +0 -0
  99. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/agent/tools/registry.py +0 -0
  100. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/application/__init__.py +0 -0
  101. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/application/catalog.py +0 -0
  102. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/application/chat_service.py +0 -0
  103. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/application/checks.py +0 -0
  104. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/application/cli_adapter.py +0 -0
  105. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/application/completer.py +0 -0
  106. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/application/conversation_service.py +0 -0
  107. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/application/prompt_service.py +0 -0
  108. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/application/selector.py +0 -0
  109. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/application/shell.py +0 -0
  110. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/checks/__init__.py +0 -0
  111. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/checks/base.py +0 -0
  112. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/checks/instructions.py +0 -0
  113. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/cli.py +0 -0
  114. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/commands/__init__.py +0 -0
  115. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/commands/add.py +0 -0
  116. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/commands/chat.py +0 -0
  117. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/commands/check.py +0 -0
  118. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/commands/generate/__init__.py +0 -0
  119. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/commands/map.py +0 -0
  120. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/commands/refresh.py +0 -0
  121. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/commands/settings.py +0 -0
  122. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/commands/sync.py +0 -0
  123. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/commands/update.py +0 -0
  124. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/generators/__init__.py +0 -0
  125. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/generators/base.py +0 -0
  126. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/generators/claude.py +0 -0
  127. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/generators/copilot.py +0 -0
  128. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/generators/cursor.py +0 -0
  129. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/generators/gemini.py +0 -0
  130. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/generators/github.py +0 -0
  131. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/manifest_refresh.py +0 -0
  132. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/map/__init__.py +0 -0
  133. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/map/architecture.py +0 -0
  134. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/map/chains.py +0 -0
  135. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/map/classifier.py +0 -0
  136. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/map/coverage.py +0 -0
  137. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/map/dependencies.py +0 -0
  138. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/map/extractor.py +0 -0
  139. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/map/graph.py +0 -0
  140. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/map/output.py +0 -0
  141. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/map/responsibility.py +0 -0
  142. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/map/topology.py +0 -0
  143. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/map/walker.py +0 -0
  144. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/package_updates.py +0 -0
  145. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/domain/base_entity.md +0 -0
  146. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/domain/base_repo.md +0 -0
  147. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/domain/container.md +0 -0
  148. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/instructions/api.instructions.md +0 -0
  149. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/instructions/domain.instructions.md +0 -0
  150. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/instructions/frontend.instructions.md +0 -0
  151. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/instructions/setup-guide.instructions.md +0 -0
  152. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/README.md +0 -0
  153. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/client/index.ts +0 -0
  154. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/client/types.ts +0 -0
  155. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/ChatComposer.spec.tsx +0 -0
  156. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/ChatComposer.tsx +0 -0
  157. {rpr_cli-0.2.1 → 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
  158. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/fileDrop.spec.ts +0 -0
  159. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/fileDrop.ts +0 -0
  160. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/index.ts +0 -0
  161. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/ChatComposerMentionTokens.tsx +0 -0
  162. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/ChatSuggestionsPopover.tsx +0 -0
  163. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/LocalFileSuggestionAction.tsx +0 -0
  164. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/index.ts +0 -0
  165. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/localFileSuggestions.spec.ts +0 -0
  166. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/localFileSuggestions.ts +0 -0
  167. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/triggerDetection.spec.ts +0 -0
  168. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/triggerDetection.ts +0 -0
  169. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/types.ts +0 -0
  170. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/suggestions/useChatSuggestions.ts +0 -0
  171. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/types.ts +0 -0
  172. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/useChatComposer.ts +0 -0
  173. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/useChatStream.spec.tsx +0 -0
  174. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/composer/useChatStream.ts +0 -0
  175. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/index.ts +0 -0
  176. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/testing/createMockChatStreamClient.ts +0 -0
  177. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/testing/createMockSuggestionProvider.ts +0 -0
  178. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/testing/index.ts +0 -0
  179. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/thread/ChatMessage.tsx +0 -0
  180. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/thread/ChatMessageContent.spec.tsx +0 -0
  181. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/thread/ChatMessageContent.tsx +0 -0
  182. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/thread/ChatThread.spec.tsx +0 -0
  183. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/thread/ChatThread.tsx +0 -0
  184. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/thread/README.md +0 -0
  185. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/thread/contentFormat.ts +0 -0
  186. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/thread/index.ts +0 -0
  187. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/thread/streaming.ts +0 -0
  188. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/thread/types.ts +0 -0
  189. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/virtual-list/VirtualComponent.spec.tsx +0 -0
  190. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/virtual-list/VirtualComponent.tsx +0 -0
  191. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/virtual-list/VirtualComponentList.spec.tsx +0 -0
  192. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/virtual-list/VirtualComponentList.tsx +0 -0
  193. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/chat/virtual-list/index.ts +0 -0
  194. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/fetch.service.md +0 -0
  195. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/sticky-navigation.md +0 -0
  196. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/sticky-navigation.spec.md +0 -0
  197. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/js_special_files/vitest-browser-config.md +0 -0
  198. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/special_files/camel_case_model.md +0 -0
  199. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/special_files/domain_container.md +0 -0
  200. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/special_files/dto_util.md +0 -0
  201. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/special_files/encrypted_column.md +0 -0
  202. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/special_files/mapper_util.md +0 -0
  203. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/scaffolds/special_files/partial_update.md +0 -0
  204. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/templates/__init__.py +0 -0
  205. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/templates/registry.py +0 -0
  206. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/ui/__init__.py +0 -0
  207. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/ui/console.py +0 -0
  208. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/ui/markdown.py +0 -0
  209. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/ui/prompt_session.py +0 -0
  210. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/ui/renderers.py +0 -0
  211. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/src/rpr/ui/theme.py +0 -0
  212. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/README.md +0 -0
  213. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/00-bootstrap-cli.md +0 -0
  214. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/01-rpr-init.md +0 -0
  215. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/02-rpr-generate-domain.md +0 -0
  216. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/03-rpr-generate-api.md +0 -0
  217. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/04-rpr-generate-ui.md +0 -0
  218. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/05-rpr-generate-engine.md +0 -0
  219. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/06-rpr-generate-storybook.md +0 -0
  220. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/07-rpr-sync-rules.md +0 -0
  221. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/08-rpr-add-template.md +0 -0
  222. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/09-rpr-check.md +0 -0
  223. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/10-rpr-domain-config.md +0 -0
  224. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/chat/18-rpr-terminal-ui-foundation.md +0 -0
  225. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/chat/19-rpr-markdown-rendering.md +0 -0
  226. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/chat/20-rpr-chat-repl.md +0 -0
  227. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/chat/21-rpr-agent-tool-loop.md +0 -0
  228. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/chat/22-rpr-chat-tui.md +0 -0
  229. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/chat/23-rpr-chat-unified-command-shell.md +0 -0
  230. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/chat/24-rpr-async-chat-runtime-and-services.md +0 -0
  231. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/chat/25-rpr-prompt-service-and-conversation-lifecycle.md +0 -0
  232. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/chat/26-rpr-shared-command-catalog.md +0 -0
  233. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/chat/27-rpr-slash-command-selection-panel.md +0 -0
  234. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/chat/28-rpr-chat-cancellable-and-multiline-input.md +0 -0
  235. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/chat/29-rpr-file-context-selection.md +0 -0
  236. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/map/11-rpr-map-command.md +0 -0
  237. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/map/12-rpr-map-file-walker.md +0 -0
  238. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/map/13-rpr-map-rust-engine.md +0 -0
  239. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/map/13a-rpr-map-gitignore.md +0 -0
  240. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/map/14-rpr-map-graph-builder.md +0 -0
  241. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/map/15-rpr-map-analysis-bridge.md +0 -0
  242. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/map/16-rpr-map-layer-classifier.md +0 -0
  243. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/map/17-rpr-map-output.md +0 -0
  244. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/map/17a-rpr-map-directory-topology.md +0 -0
  245. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/map/17b-rpr-map-architecture-assessment.md +0 -0
  246. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/map/17c-rpr-map-representative-chains.md +0 -0
  247. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/completed/map/17d-rpr-map-multi-resolution-output.md +0 -0
  248. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/map/30-rpr-map-directory-view-and-cycle-detection.md +0 -0
  249. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/map/31-rpr-map-coupling-hotspots-and-verdict-reasoning.md +0 -0
  250. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/map/32-rpr-map-dependencies-responsibilities-and-test-coverage.md +0 -0
  251. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/stories/package-maintenance/rpr-update-packages.md +0 -0
  252. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/__init__.py +0 -0
  253. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_add.py +0 -0
  254. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_architecture.py +0 -0
  255. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_architecture_unwrapped.py +0 -0
  256. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_catalog.py +0 -0
  257. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_chat.py +0 -0
  258. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_chat_service.py +0 -0
  259. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_completer.py +0 -0
  260. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_map.py +0 -0
  261. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_map_chains.py +0 -0
  262. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_map_classifier.py +0 -0
  263. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_map_coverage.py +0 -0
  264. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_map_dependencies.py +0 -0
  265. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_map_extractor.py +0 -0
  266. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_map_graph.py +0 -0
  267. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_map_output.py +0 -0
  268. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_map_responsibility.py +0 -0
  269. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_map_topology.py +0 -0
  270. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_map_walker.py +0 -0
  271. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_package_updates.py +0 -0
  272. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_packaging.py +0 -0
  273. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_prompt_session.py +0 -0
  274. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_refresh.py +0 -0
  275. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_rpr_parser_stub.py +0 -0
  276. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_selector.py +0 -0
  277. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_settings.py +0 -0
  278. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_ui.py +0 -0
  279. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/tests/test_update_packages.py +0 -0
  280. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/update_output.py +0 -0
  281. {rpr_cli-0.2.1 → rpr_cli-0.3.1}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rpr-cli
3
- Version: 0.2.1
3
+ Version: 0.3.1
4
4
  Summary: RPR CLI -- React Python Rust monorepo scaffolding orchestrator
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -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 `eslint.config.mjs`.
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
- - `engine:format` should run `cargo fmt --check`.
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,apps/*/eslint.config.mjs,packages/**/eslint.config.mjs,packages/python/*_engine/Cargo.toml"
3
- description: "Use when setting up or modifying Ruff, TypeScript linting, ESLint, Prettier, cargo fmt, Clippy, or pre-commit in an RPR workspace"
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 `uv run ruff format` for formatting.
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 eslint .`.
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 ESLint flat config and the Nx plugin entry `@nx/eslint/plugin` in `nx.json`.
29
- - Treat Prettier as the default formatter for Node-side code and keep it complementary to ESLint.
30
-
31
- Valid `nx.json` plugin example:
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, prefer the existing Nx targets `engine:format` and `engine:lint`.
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 `eslint` and `prettier` hooks with the matching config files.
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: prettier
79
- name: Prettier
80
- entry: npx prettier --write .
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: eslint
85
- name: ESLint
86
- entry: npx eslint . --ext .js,.jsx,.ts,.tsx --fix
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
- - If linting uses ESLint, keep a separate `typecheck` target for `npx tsc --noEmit`.
95
- - If you introduce a hook named `eslint` or `prettier`, define that hook explicitly.
96
- - If you document ESLint, ensure the package install, config format, Nx integration, and manual commands all match.
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
- - Prefer workspace commands such as `uv run ruff check` and `uv run ruff format`.
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 ESLint flat config for JavaScript and TypeScript linting, Prettier for formatting, and `npx tsc --noEmit` as a separate typecheck target.
20
- - Keep the root `nx.json` ESLint plugin entry and project-local `eslint.config.mjs` files aligned.
21
- - Extend existing flat-config files instead of introducing a different ESLint config format.
22
- - Keep `lint`, `format`, and `typecheck` responsibilities separate. Do not use TypeScript typechecking as a substitute for ESLint.
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
- - Prefer existing Nx targets such as `engine:format` and `engine:lint` when they exist.
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 `eslint` and `prettier` hooks aligned with the generated config files.
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`, `eslint.config.mjs`, and `.pre-commit-config.yaml` instead of creating duplicates.
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={"serve", "build", "test", "lint"},
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={"build", "lint", "test", "typecheck"},
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={"serve", "build", "lint", "test", "typecheck"},
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 (OSError, json.JSONDecodeError):
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 (OSError, tomllib.TOMLDecodeError):
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 = pyproject_data.get("dependency-groups", {}) if pyproject_data else {}
80
- dev_dependencies = dependency_groups.get("dev", []) if isinstance(dependency_groups, dict) else []
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 (OSError, json.JSONDecodeError):
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 nx run-many --target=lint --all --fix --exclude=engine",
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(status_code=500, content={{"message": "Internal server error"}})
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(status_code=422, content={{"message": "Validation error", "details": exc.errors()}})
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 not dry_run:
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
- for t in _UTILITY_TEMPLATES:
390
- ctx.run_command(["rpr", "add", "template", "python", t, "--name", name])
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
- "engine:format": {
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",