rpr-cli 0.3.5__tar.gz → 0.3.10__tar.gz

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