rpr-cli 0.1.3__tar.gz → 0.1.6__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 (221) hide show
  1. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/.github/workflows/publish-pypi.yml +10 -5
  2. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/PKG-INFO +8 -3
  3. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/README.md +7 -2
  4. rpr_cli-0.1.6/src/rpr/__init__.py +1 -0
  5. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/commands/init.py +25 -4
  6. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/dependency_manifest_data.py +11 -33
  7. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_init.py +88 -2
  8. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_refresh.py +2 -0
  9. rpr_cli-0.1.3/src/rpr/__init__.py +0 -1
  10. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/.github/agents/story.agent.md +0 -0
  11. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/.gitignore +0 -0
  12. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/CLAUDE.md +0 -0
  13. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/GEMINI.md +0 -0
  14. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/LICENSE +0 -0
  15. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/Sample-dot-github/instructions/all.instructions.md +0 -0
  16. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/Sample-dot-github/instructions/api.instructions.md +0 -0
  17. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/Sample-dot-github/instructions/domain.instructions.md +0 -0
  18. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/Sample-dot-github/instructions/frontend.instructions.md +0 -0
  19. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/Sample-dot-github/instructions/rust-engine.instructions.md +0 -0
  20. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/Sample-dot-github/instructions/setup-guide.instructions.md +0 -0
  21. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/Sample-dot-github/instructions/tooling-setup.instructions.md +0 -0
  22. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/Sample-dot-github/instructions/tooling.instructions.md +0 -0
  23. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/Sample-dot-github/scaffolds/README.md +0 -0
  24. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/Sample-dot-github/scaffolds/api/main.py +0 -0
  25. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/Sample-dot-github/scaffolds/domain/base-repo.md +0 -0
  26. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/Sample-dot-github/scaffolds/domain/base_entity.md +0 -0
  27. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/Sample-dot-github/scaffolds/frontend/api.service.ts +0 -0
  28. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/Sample-dot-github/scaffolds/frontend/useStateNavigation.ts +0 -0
  29. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/changelogs/mui_v9.txt +0 -0
  30. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/code-map.md +0 -0
  31. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/nx_uv_setup.md +0 -0
  32. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/patch_output.py +0 -0
  33. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/pyproject.toml +0 -0
  34. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/rpr-parser/Cargo.lock +0 -0
  35. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/rpr-parser/Cargo.toml +0 -0
  36. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/rpr-parser/pyproject.toml +0 -0
  37. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/rpr-parser/rpr_parser.pyi +0 -0
  38. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/rpr-parser/src/config/container.rs +0 -0
  39. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/rpr-parser/src/config/mod.rs +0 -0
  40. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/rpr-parser/src/config/settings.rs +0 -0
  41. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/rpr-parser/src/graph.rs +0 -0
  42. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/rpr-parser/src/lib.rs +0 -0
  43. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/rpr-parser/src/models/dtos/mod.rs +0 -0
  44. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/rpr-parser/src/models/entities/mod.rs +0 -0
  45. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/rpr-parser/src/models/entities/users.rs +0 -0
  46. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/rpr-parser/src/models/mod.rs +0 -0
  47. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/rpr-parser/src/parse.rs +0 -0
  48. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/rpr-parser/src/repos/base.rs +0 -0
  49. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/rpr-parser/src/repos/mod.rs +0 -0
  50. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/rpr-parser/src/repos/users.rs +0 -0
  51. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/rpr-parser/src/resolve.rs +0 -0
  52. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/rpr-parser/src/walker.rs +0 -0
  53. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/rpr-parser/uv.lock +0 -0
  54. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/special_files.md +0 -0
  55. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/agent/__init__.py +0 -0
  56. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/agent/approval.py +0 -0
  57. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/agent/bootstrap.py +0 -0
  58. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/agent/client.py +0 -0
  59. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/agent/control.py +0 -0
  60. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/agent/mock.py +0 -0
  61. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/agent/runtime.py +0 -0
  62. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/agent/session.py +0 -0
  63. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/agent/tools/__init__.py +0 -0
  64. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/agent/tools/base.py +0 -0
  65. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/agent/tools/mutating.py +0 -0
  66. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/agent/tools/readonly.py +0 -0
  67. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/agent/tools/registry.py +0 -0
  68. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/application/__init__.py +0 -0
  69. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/application/catalog.py +0 -0
  70. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/application/chat_service.py +0 -0
  71. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/application/checks.py +0 -0
  72. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/application/cli_adapter.py +0 -0
  73. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/application/completer.py +0 -0
  74. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/application/conversation_service.py +0 -0
  75. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/application/prompt_service.py +0 -0
  76. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/application/selector.py +0 -0
  77. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/application/shell.py +0 -0
  78. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/checks/__init__.py +0 -0
  79. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/checks/base.py +0 -0
  80. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/checks/instructions.py +0 -0
  81. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/checks/packages.py +0 -0
  82. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/checks/workspace.py +0 -0
  83. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/cli.py +0 -0
  84. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/commands/__init__.py +0 -0
  85. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/commands/add.py +0 -0
  86. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/commands/chat.py +0 -0
  87. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/commands/check.py +0 -0
  88. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/commands/generate/__init__.py +0 -0
  89. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/commands/generate/api.py +0 -0
  90. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/commands/generate/domain.py +0 -0
  91. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/commands/generate/engine.py +0 -0
  92. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/commands/generate/storybook.py +0 -0
  93. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/commands/generate/ui.py +0 -0
  94. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/commands/map.py +0 -0
  95. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/commands/refresh.py +0 -0
  96. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/commands/settings.py +0 -0
  97. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/commands/sync.py +0 -0
  98. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/context.py +0 -0
  99. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/dependencies.py +0 -0
  100. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/generators/__init__.py +0 -0
  101. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/generators/base.py +0 -0
  102. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/generators/claude.py +0 -0
  103. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/generators/copilot.py +0 -0
  104. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/generators/cursor.py +0 -0
  105. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/generators/gemini.py +0 -0
  106. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/manifest_refresh.py +0 -0
  107. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/map/__init__.py +0 -0
  108. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/map/architecture.py +0 -0
  109. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/map/chains.py +0 -0
  110. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/map/classifier.py +0 -0
  111. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/map/coverage.py +0 -0
  112. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/map/dependencies.py +0 -0
  113. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/map/extractor.py +0 -0
  114. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/map/graph.py +0 -0
  115. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/map/output.py +0 -0
  116. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/map/responsibility.py +0 -0
  117. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/map/topology.py +0 -0
  118. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/map/walker.py +0 -0
  119. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/scaffolds/domain/base_entity.md +0 -0
  120. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/scaffolds/domain/base_repo.md +0 -0
  121. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/scaffolds/domain/container.md +0 -0
  122. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/scaffolds/domain/settings.md +0 -0
  123. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/scaffolds/instructions/all.instructions.md +0 -0
  124. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/scaffolds/instructions/api.instructions.md +0 -0
  125. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/scaffolds/instructions/domain.instructions.md +0 -0
  126. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/scaffolds/instructions/frontend.instructions.md +0 -0
  127. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/scaffolds/instructions/rust-engine.instructions.md +0 -0
  128. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/scaffolds/instructions/setup-guide.instructions.md +0 -0
  129. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/scaffolds/instructions/tooling-setup.instructions.md +0 -0
  130. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/scaffolds/instructions/tooling.instructions.md +0 -0
  131. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/scaffolds/js_special_files/fetch.service.md +0 -0
  132. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/scaffolds/js_special_files/sticky-navigation.md +0 -0
  133. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/scaffolds/special_files/domain_container.md +0 -0
  134. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/scaffolds/special_files/domain_settings.md +0 -0
  135. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/scaffolds/special_files/dto_util.md +0 -0
  136. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/scaffolds/special_files/encrypted_column.md +0 -0
  137. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/scaffolds/special_files/mapper_util.md +0 -0
  138. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/scaffolds/special_files/partial_update.md +0 -0
  139. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/templates/__init__.py +0 -0
  140. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/templates/registry.py +0 -0
  141. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/ui/__init__.py +0 -0
  142. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/ui/console.py +0 -0
  143. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/ui/markdown.py +0 -0
  144. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/ui/prompt_session.py +0 -0
  145. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/ui/renderers.py +0 -0
  146. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/ui/theme.py +0 -0
  147. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/src/rpr/workspace.py +0 -0
  148. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/README.md +0 -0
  149. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/00-bootstrap-cli.md +0 -0
  150. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/01-rpr-init.md +0 -0
  151. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/02-rpr-generate-domain.md +0 -0
  152. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/03-rpr-generate-api.md +0 -0
  153. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/04-rpr-generate-ui.md +0 -0
  154. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/05-rpr-generate-engine.md +0 -0
  155. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/06-rpr-generate-storybook.md +0 -0
  156. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/07-rpr-sync-rules.md +0 -0
  157. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/08-rpr-add-template.md +0 -0
  158. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/09-rpr-check.md +0 -0
  159. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/10-rpr-domain-config.md +0 -0
  160. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/chat/18-rpr-terminal-ui-foundation.md +0 -0
  161. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/chat/19-rpr-markdown-rendering.md +0 -0
  162. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/chat/20-rpr-chat-repl.md +0 -0
  163. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/chat/21-rpr-agent-tool-loop.md +0 -0
  164. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/chat/22-rpr-chat-tui.md +0 -0
  165. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/chat/23-rpr-chat-unified-command-shell.md +0 -0
  166. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/chat/24-rpr-async-chat-runtime-and-services.md +0 -0
  167. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/chat/25-rpr-prompt-service-and-conversation-lifecycle.md +0 -0
  168. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/chat/26-rpr-shared-command-catalog.md +0 -0
  169. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/chat/27-rpr-slash-command-selection-panel.md +0 -0
  170. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/chat/28-rpr-chat-cancellable-and-multiline-input.md +0 -0
  171. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/chat/29-rpr-file-context-selection.md +0 -0
  172. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/map/11-rpr-map-command.md +0 -0
  173. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/map/12-rpr-map-file-walker.md +0 -0
  174. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/map/13-rpr-map-rust-engine.md +0 -0
  175. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/map/13a-rpr-map-gitignore.md +0 -0
  176. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/map/14-rpr-map-graph-builder.md +0 -0
  177. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/map/15-rpr-map-analysis-bridge.md +0 -0
  178. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/map/16-rpr-map-layer-classifier.md +0 -0
  179. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/map/17-rpr-map-output.md +0 -0
  180. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/map/17a-rpr-map-directory-topology.md +0 -0
  181. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/map/17b-rpr-map-architecture-assessment.md +0 -0
  182. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/map/17c-rpr-map-representative-chains.md +0 -0
  183. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/completed/map/17d-rpr-map-multi-resolution-output.md +0 -0
  184. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/map/30-rpr-map-directory-view-and-cycle-detection.md +0 -0
  185. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/map/31-rpr-map-coupling-hotspots-and-verdict-reasoning.md +0 -0
  186. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/stories/map/32-rpr-map-dependencies-responsibilities-and-test-coverage.md +0 -0
  187. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/__init__.py +0 -0
  188. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_add.py +0 -0
  189. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_architecture.py +0 -0
  190. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_architecture_unwrapped.py +0 -0
  191. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_catalog.py +0 -0
  192. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_chat.py +0 -0
  193. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_chat_service.py +0 -0
  194. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_check.py +0 -0
  195. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_completer.py +0 -0
  196. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_context.py +0 -0
  197. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_generate_api.py +0 -0
  198. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_generate_domain.py +0 -0
  199. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_generate_engine.py +0 -0
  200. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_generate_storybook.py +0 -0
  201. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_generate_ui.py +0 -0
  202. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_map.py +0 -0
  203. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_map_chains.py +0 -0
  204. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_map_classifier.py +0 -0
  205. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_map_coverage.py +0 -0
  206. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_map_dependencies.py +0 -0
  207. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_map_extractor.py +0 -0
  208. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_map_graph.py +0 -0
  209. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_map_output.py +0 -0
  210. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_map_responsibility.py +0 -0
  211. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_map_topology.py +0 -0
  212. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_map_walker.py +0 -0
  213. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_packaging.py +0 -0
  214. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_prompt_session.py +0 -0
  215. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_rpr_parser_stub.py +0 -0
  216. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_selector.py +0 -0
  217. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_settings.py +0 -0
  218. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_sync.py +0 -0
  219. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/tests/test_ui.py +0 -0
  220. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/update_output.py +0 -0
  221. {rpr_cli-0.1.3 → rpr_cli-0.1.6}/uv.lock +0 -0
@@ -9,20 +9,26 @@ on:
9
9
  jobs:
10
10
  publish:
11
11
  runs-on: ubuntu-latest
12
+ env:
13
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
14
+ environment:
15
+ name: pypi
16
+ url: https://pypi.org/p/rpr-cli
12
17
  permissions:
13
18
  contents: read
19
+ id-token: write
14
20
 
15
21
  steps:
16
22
  - name: Check out repository
17
- uses: actions/checkout@v4
23
+ uses: actions/checkout@v6
18
24
 
19
25
  - name: Set up Python
20
- uses: actions/setup-python@v5
26
+ uses: actions/setup-python@v6
21
27
  with:
22
28
  python-version: "3.14"
23
29
 
24
30
  - name: Set up uv
25
- uses: astral-sh/setup-uv@v5
31
+ uses: astral-sh/setup-uv@v8.1.0
26
32
 
27
33
  - name: Validate tag matches package version
28
34
  run: |
@@ -50,5 +56,4 @@ jobs:
50
56
  - name: Publish to PyPI
51
57
  uses: pypa/gh-action-pypi-publish@release/v1
52
58
  with:
53
- user: __token__
54
- password: ${{ secrets.PYPI_API_TOKEN }}
59
+ attestations: true
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rpr-cli
3
- Version: 0.1.3
3
+ Version: 0.1.6
4
4
  Summary: RPR CLI -- React Python Rust monorepo scaffolding orchestrator
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -55,6 +55,8 @@ uv add ../project-getting-started/dist/rpr_cli-*.whl
55
55
 
56
56
  Create a new NX + UV monorepo, then add apps and packages as needed.
57
57
 
58
+ > NX monorepo uses integrated mode.
59
+
58
60
  ```bash
59
61
  rpr init my-app # Create/init my-app with root NX + UV tooling and AI instructions
60
62
  cd my-app
@@ -67,12 +69,13 @@ rpr generate storybook # Add Storybook for UI component development
67
69
 
68
70
  `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
71
 
70
- By default, `rpr init` scaffolds the root workspace and AI instructions only. To create project components during initialization, repeat `--scaffold`:
72
+ 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:
71
73
 
72
74
  ```bash
73
75
  rpr init todo-list --scaffold domain
74
76
  rpr init todo-list --scaffold api --domain-migrations
75
77
  rpr init todo-list --scaffold api --scaffold web --domain-migrations
78
+ rpr init todo-list --scaffold instructions, domain, api, ui, web, storybook
76
79
  ```
77
80
 
78
81
  Available scaffolds are:
@@ -227,7 +230,9 @@ This repo is set up to publish the package `rpr-cli` to PyPI from GitHub Actions
227
230
  One-time setup:
228
231
 
229
232
  1. Create the PyPI project `rpr-cli`.
230
- 2. Add a repository secret named `PYPI_API_TOKEN` with an API token that can upload that project.
233
+ 2. Create a PyPI Trusted Publisher for this repository using workflow `.github/workflows/publish-pypi.yml` and environment `pypi`.
234
+
235
+ No `PYPI_API_TOKEN` secret is required when publishing through GitHub Actions OIDC.
231
236
 
232
237
  Release flow:
233
238
 
@@ -40,6 +40,8 @@ uv add ../project-getting-started/dist/rpr_cli-*.whl
40
40
 
41
41
  Create a new NX + UV monorepo, then add apps and packages as needed.
42
42
 
43
+ > NX monorepo uses integrated mode.
44
+
43
45
  ```bash
44
46
  rpr init my-app # Create/init my-app with root NX + UV tooling and AI instructions
45
47
  cd my-app
@@ -52,12 +54,13 @@ rpr generate storybook # Add Storybook for UI component development
52
54
 
53
55
  `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.
54
56
 
55
- By default, `rpr init` scaffolds the root workspace and AI instructions only. To create project components during initialization, repeat `--scaffold`:
57
+ 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:
56
58
 
57
59
  ```bash
58
60
  rpr init todo-list --scaffold domain
59
61
  rpr init todo-list --scaffold api --domain-migrations
60
62
  rpr init todo-list --scaffold api --scaffold web --domain-migrations
63
+ rpr init todo-list --scaffold instructions, domain, api, ui, web, storybook
61
64
  ```
62
65
 
63
66
  Available scaffolds are:
@@ -212,7 +215,9 @@ This repo is set up to publish the package `rpr-cli` to PyPI from GitHub Actions
212
215
  One-time setup:
213
216
 
214
217
  1. Create the PyPI project `rpr-cli`.
215
- 2. Add a repository secret named `PYPI_API_TOKEN` with an API token that can upload that project.
218
+ 2. Create a PyPI Trusted Publisher for this repository using workflow `.github/workflows/publish-pypi.yml` and environment `pypi`.
219
+
220
+ No `PYPI_API_TOKEN` secret is required when publishing through GitHub Actions OIDC.
216
221
 
217
222
  Release flow:
218
223
 
@@ -0,0 +1 @@
1
+ __version__ = "0.1.6"
@@ -106,6 +106,25 @@ def _normalize_scaffold_name(value: str) -> ScaffoldName:
106
106
  return normalized # type: ignore[return-value]
107
107
 
108
108
 
109
+ def _parse_scaffold_values(
110
+ values: list[str] | None,
111
+ extra_args: list[str],
112
+ ) -> list[ScaffoldName]:
113
+ raw_values = values or []
114
+ if extra_args and not raw_values:
115
+ raise typer.BadParameter(
116
+ "Unexpected extra arguments. Use --scaffold to select components."
117
+ )
118
+
119
+ scaffolds: list[ScaffoldName] = []
120
+ for raw_value in [*raw_values, *extra_args]:
121
+ for value in raw_value.split(","):
122
+ value = value.strip()
123
+ if value:
124
+ scaffolds.append(_normalize_scaffold_name(value))
125
+ return scaffolds
126
+
127
+
109
128
  def _resolve_scaffolds(scaffolds: list[ScaffoldName] | None) -> list[ScaffoldName]:
110
129
  requested = scaffolds or ["instructions"]
111
130
  resolved: list[ScaffoldName] = []
@@ -675,8 +694,9 @@ API_BASE_URL=http://localhost:8000
675
694
  # ---------------------------------------------------------------------------
676
695
 
677
696
 
678
- @app.command()
697
+ @app.command(context_settings={"allow_extra_args": True})
679
698
  def init(
699
+ ctx: typer.Context,
680
700
  project_name: Annotated[
681
701
  str | None, typer.Argument(help="Name of the project to create.")
682
702
  ] = None,
@@ -691,8 +711,9 @@ def init(
691
711
  typer.Option(
692
712
  "--scaffold",
693
713
  help=(
694
- "Repeat to scaffold additional components: instructions, domain, "
695
- "api, ui, web, storybook, engine. Defaults to instructions only."
714
+ "Repeat or pass a comma-separated list to scaffold additional "
715
+ "components: instructions, domain, api, ui, web, storybook, "
716
+ "engine. Defaults to instructions only."
696
717
  ),
697
718
  ),
698
719
  ] = None,
@@ -712,7 +733,7 @@ def init(
712
733
  project_name = typer.prompt("Project name")
713
734
 
714
735
  selected_scaffolds = _resolve_scaffolds(
715
- [_normalize_scaffold_name(value) for value in scaffold or []]
736
+ _parse_scaffold_values(scaffold, list(ctx.args))
716
737
  )
717
738
  if domain_migrations and "domain" not in selected_scaffolds:
718
739
  raise typer.BadParameter(
@@ -6,59 +6,37 @@ from __future__ import annotations
6
6
  MANIFEST = {
7
7
  "root_node_dev_dependencies": {
8
8
  "@eslint/js": {
9
- "registry": "npm",
10
- "specifier": "latest",
11
- "strategy": "caret",
9
+ "specifier": "^9.39.4",
12
10
  },
13
11
  "@nx/eslint": {
14
- "registry": "npm",
15
- "specifier": "latest",
16
- "strategy": "caret",
12
+ "specifier": "^22.7.1",
17
13
  },
18
14
  "@nx/eslint-plugin": {
19
- "registry": "npm",
20
- "specifier": "latest",
21
- "strategy": "caret",
15
+ "specifier": "^22.7.1",
22
16
  },
23
17
  "eslint": {
24
- "registry": "npm",
25
- "specifier": "latest",
26
- "strategy": "caret",
18
+ "specifier": "^9.39.4",
27
19
  },
28
20
  "eslint-plugin-import": {
29
- "registry": "npm",
30
- "specifier": "latest",
31
- "strategy": "caret",
21
+ "specifier": "^2.32.0",
32
22
  },
33
23
  "eslint-plugin-jsx-a11y": {
34
- "registry": "npm",
35
- "specifier": "latest",
36
- "strategy": "caret",
24
+ "specifier": "^6.10.2",
37
25
  },
38
26
  "eslint-plugin-react": {
39
- "registry": "npm",
40
- "specifier": "latest",
41
- "strategy": "caret",
27
+ "specifier": "^7.37.5",
42
28
  },
43
29
  "eslint-plugin-react-hooks": {
44
- "registry": "npm",
45
- "specifier": "latest",
46
- "strategy": "caret",
30
+ "specifier": "^7.1.1",
47
31
  },
48
32
  "globals": {
49
- "registry": "npm",
50
- "specifier": "latest",
51
- "strategy": "caret",
33
+ "specifier": "^15.15.0",
52
34
  },
53
35
  "prettier": {
54
- "registry": "npm",
55
- "specifier": "latest",
56
- "strategy": "caret",
36
+ "specifier": "^3.7.4",
57
37
  },
58
38
  "typescript-eslint": {
59
- "registry": "npm",
60
- "specifier": "latest",
61
- "strategy": "caret",
39
+ "specifier": "^8.59.2",
62
40
  },
63
41
  },
64
42
  "root_storybook_dev_dependencies": {
@@ -74,8 +74,17 @@ def test_init_new_workspace_disables_nx_cloud(monkeypatch):
74
74
  package_json = json.loads((project_dir / "package.json").read_text())
75
75
  assert package_json["scripts"]["lint"] == "npx nx run-many --target=lint --all"
76
76
  assert package_json["workspaces"] == ["apps/*", "packages/node/*"]
77
- assert "eslint" in package_json["devDependencies"]
78
- assert "prettier" in package_json["devDependencies"]
77
+ dev_dependencies = package_json["devDependencies"]
78
+ assert "eslint" in dev_dependencies
79
+ assert "prettier" in dev_dependencies
80
+ assert dev_dependencies["eslint"] == "^9.39.4"
81
+ assert dev_dependencies["@eslint/js"] == "^9.39.4"
82
+ assert dev_dependencies["eslint-plugin-import"] == "^2.32.0"
83
+ assert dev_dependencies["eslint-plugin-jsx-a11y"] == "^6.10.2"
84
+ assert dev_dependencies["eslint-plugin-react"] == "^7.37.5"
85
+ assert not any(
86
+ version == "latest" for version in dev_dependencies.values()
87
+ )
79
88
 
80
89
  assert (project_dir / "eslint.config.mjs").exists()
81
90
  assert (project_dir / ".prettierrc").exists()
@@ -210,6 +219,83 @@ def test_init_scaffold_selection_runs_requested_generators_in_dependency_order(
210
219
  ]
211
220
 
212
221
 
222
+ def test_init_accepts_comma_separated_scaffold_values(monkeypatch):
223
+ scaffold_calls: list[str] = []
224
+ instructions_calls: list[dict[str, object]] = []
225
+
226
+ def fake_run_command(
227
+ self, cmd, *, cwd=None, env=None, capture=False, supports_dry_run=False
228
+ ):
229
+ return _completed(cmd)
230
+
231
+ def fake_domain(*, name, dry_run, migrations=False):
232
+ scaffold_calls.append(f"domain:{name}:{dry_run}:{migrations}")
233
+
234
+ def fake_api(*, name, dry_run):
235
+ scaffold_calls.append(f"api:{name}:{dry_run}")
236
+
237
+ def fake_ui(*, name, dry_run, include_library=True, include_web=True):
238
+ scaffold_calls.append(
239
+ f"ui:{name}:{dry_run}:{include_library}:{include_web}"
240
+ )
241
+
242
+ def fake_storybook(*, ui_package=None, dry_run):
243
+ scaffold_calls.append(f"storybook:{ui_package}:{dry_run}")
244
+
245
+ monkeypatch.setattr("rpr.context.RunContext.run_command", fake_run_command)
246
+ monkeypatch.setattr(
247
+ "rpr.commands.init._scaffold_ai_instructions",
248
+ lambda *args, **kwargs: instructions_calls.append({"args": args, "kwargs": kwargs}),
249
+ )
250
+ monkeypatch.setattr("rpr.commands.generate.domain.domain", fake_domain)
251
+ monkeypatch.setattr("rpr.commands.generate.api.api", fake_api)
252
+ monkeypatch.setattr("rpr.commands.generate.ui.ui", fake_ui)
253
+ monkeypatch.setattr("rpr.commands.generate.storybook.storybook", fake_storybook)
254
+
255
+ commands = [
256
+ [
257
+ "init",
258
+ "comma-space",
259
+ "--scaffold",
260
+ "instructions,",
261
+ "domain,",
262
+ "api,",
263
+ "ui,",
264
+ "web,",
265
+ "storybook",
266
+ ],
267
+ [
268
+ "init",
269
+ "comma-tight",
270
+ "--scaffold",
271
+ "instructions,domain,api,ui,web,storybook",
272
+ ],
273
+ [
274
+ "init",
275
+ "comma-quoted",
276
+ "--scaffold",
277
+ "instructions, domain, api, ui, web, storybook",
278
+ ],
279
+ ]
280
+
281
+ with runner.isolated_filesystem():
282
+ for command in commands:
283
+ scaffold_calls.clear()
284
+ instructions_calls.clear()
285
+
286
+ result = runner.invoke(app, command)
287
+
288
+ project_name = command[1]
289
+ assert result.exit_code == 0, result.stdout
290
+ assert len(instructions_calls) == 1
291
+ assert scaffold_calls == [
292
+ f"domain:{project_name}:False:False",
293
+ f"api:{project_name}:False",
294
+ f"ui:{project_name}:False:True:True",
295
+ f"storybook:{project_name}-ui:False",
296
+ ]
297
+
298
+
213
299
  def test_init_forwards_domain_migrations(monkeypatch):
214
300
  recorded_calls: list[dict[str, object]] = []
215
301
  scaffold_calls: list[str] = []
@@ -27,6 +27,8 @@ def test_refresh_manifest_updates_manifest_data_file(monkeypatch, tmp_path: Path
27
27
  assert result.exit_code == 0, result.stdout
28
28
  assert "uvicorn[standard]: uvicorn[standard]>=0.34 -> uvicorn[standard]>=9.9.9" in result.stdout
29
29
  updated = manifest_path.read_text()
30
+ assert "'eslint': {'specifier': '^9.39.4'}" in updated
31
+ assert "'eslint-plugin-import': {'specifier': '^2.32.0'}" in updated
30
32
  assert "'specifier': '^9.9.9'" in updated
31
33
  assert "'specifier': 'fastapi>=9.9.9'" in updated
32
34
  assert "'specifier': 'uvicorn[standard]>=9.9.9'" in updated
@@ -1 +0,0 @@
1
- __version__ = "0.1.3"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes