minitest-cli 0.27.0__tar.gz → 0.27.2__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 (167) hide show
  1. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/PKG-INFO +5 -2
  2. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/README.md +4 -1
  3. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/pyproject.toml +1 -1
  4. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/apps.py +3 -2
  5. minitest_cli-0.27.2/src/minitest_cli/commands/apps_get.py +43 -0
  6. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/apps_helpers.py +15 -2
  7. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_apps_commands.py +98 -1
  8. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/uv.lock +1 -1
  9. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/.env.example +0 -0
  10. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/.github/workflows/ci.yml +0 -0
  11. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/.github/workflows/install-scripts.yml +0 -0
  12. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/.github/workflows/release.yml +0 -0
  13. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/.gitignore +0 -0
  14. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/.opencode/skill/release/SKILL.md +0 -0
  15. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/AGENTS.md +0 -0
  16. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/RELEASE.md +0 -0
  17. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/install.ps1 +0 -0
  18. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/install.sh +0 -0
  19. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/pyrightconfig.json +0 -0
  20. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/renovate.json +0 -0
  21. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/__init__.py +0 -0
  22. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/api/__init__.py +0 -0
  23. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/api/apps_manager_client.py +0 -0
  24. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/api/client.py +0 -0
  25. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/api/errors.py +0 -0
  26. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/assets/__init__.py +0 -0
  27. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/assets/callback.html +0 -0
  28. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/__init__.py +0 -0
  29. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/_response_errors.py +0 -0
  30. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/app_knowledge.py +0 -0
  31. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/app_knowledge_helpers.py +0 -0
  32. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/apps_dependencies.py +0 -0
  33. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/auth.py +0 -0
  34. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/auth_api_key.py +0 -0
  35. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/batch.py +0 -0
  36. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/batch_helpers.py +0 -0
  37. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/build.py +0 -0
  38. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/build_commit.py +0 -0
  39. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/build_fix_prompts.py +0 -0
  40. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/build_helpers.py +0 -0
  41. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/capabilities.py +0 -0
  42. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/commit_helpers.py +0 -0
  43. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/draft_feature.py +0 -0
  44. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/draft_feature_apply.py +0 -0
  45. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/draft_feature_conflicts.py +0 -0
  46. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/draft_feature_helpers.py +0 -0
  47. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/draft_feature_show.py +0 -0
  48. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/env.py +0 -0
  49. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/env_helpers.py +0 -0
  50. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/flow_types.py +0 -0
  51. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/flow_types_helpers.py +0 -0
  52. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/flow_types_write.py +0 -0
  53. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/init.py +0 -0
  54. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/init_helpers.py +0 -0
  55. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/init_playbook.py +0 -0
  56. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/issues.py +0 -0
  57. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/issues_fix.py +0 -0
  58. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/issues_helpers.py +0 -0
  59. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/issues_projection.py +0 -0
  60. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/issues_service.py +0 -0
  61. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/maintenance.py +0 -0
  62. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/maintenance_callbacks.py +0 -0
  63. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/maintenance_helpers.py +0 -0
  64. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/maintenance_state.py +0 -0
  65. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/run.py +0 -0
  66. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/run_commit.py +0 -0
  67. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/run_commit_helpers.py +0 -0
  68. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/run_display.py +0 -0
  69. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/run_feedback.py +0 -0
  70. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/run_helpers.py +0 -0
  71. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/run_targets.py +0 -0
  72. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/screens.py +0 -0
  73. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/screens_detail.py +0 -0
  74. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/screens_format.py +0 -0
  75. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/screens_helpers.py +0 -0
  76. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/screens_tree.py +0 -0
  77. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/skill.py +0 -0
  78. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/test_file.py +0 -0
  79. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/test_file_helpers.py +0 -0
  80. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/test_file_list.py +0 -0
  81. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/test_profile.py +0 -0
  82. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/test_profile_default.py +0 -0
  83. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/test_profile_helpers.py +0 -0
  84. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/test_profile_list.py +0 -0
  85. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/test_profile_update.py +0 -0
  86. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/upgrade.py +0 -0
  87. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/user_story.py +0 -0
  88. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/user_story_bindings.py +0 -0
  89. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/user_story_camera.py +0 -0
  90. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/user_story_create.py +0 -0
  91. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/user_story_criteria.py +0 -0
  92. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/user_story_criterion_edits.py +0 -0
  93. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/user_story_delete.py +0 -0
  94. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/user_story_device_count.py +0 -0
  95. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/user_story_helpers.py +0 -0
  96. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/user_story_modify.py +0 -0
  97. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/user_story_overrides.py +0 -0
  98. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/user_story_profiles.py +0 -0
  99. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/user_story_update.py +0 -0
  100. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/verdicts.py +0 -0
  101. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/verdicts_helpers.py +0 -0
  102. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/commands/verdicts_projection.py +0 -0
  103. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/core/__init__.py +0 -0
  104. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/core/app_context.py +0 -0
  105. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/core/auth.py +0 -0
  106. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/core/config.py +0 -0
  107. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/core/credentials.py +0 -0
  108. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/core/oauth.py +0 -0
  109. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/core/tenants.py +0 -0
  110. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/core/token_exchange.py +0 -0
  111. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/main.py +0 -0
  112. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/models/__init__.py +0 -0
  113. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/models/app.py +0 -0
  114. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/models/app_env_vars.py +0 -0
  115. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/models/app_failure.py +0 -0
  116. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/models/app_screen.py +0 -0
  117. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/models/base.py +0 -0
  118. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/models/batch.py +0 -0
  119. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/models/build.py +0 -0
  120. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/models/commit_build.py +0 -0
  121. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/models/draft_feature.py +0 -0
  122. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/models/flow_type.py +0 -0
  123. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/models/issues.py +0 -0
  124. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/models/story_run.py +0 -0
  125. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/models/targets.py +0 -0
  126. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/models/user_story.py +0 -0
  127. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/utils/__init__.py +0 -0
  128. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/utils/confirm.py +0 -0
  129. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/utils/dependency_sim.py +0 -0
  130. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/utils/mermaid.py +0 -0
  131. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/utils/output.py +0 -0
  132. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/utils/skill_refresh.py +0 -0
  133. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/src/minitest_cli/utils/update_check.py +0 -0
  134. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/__init__.py +0 -0
  135. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/_commit_transport.py +0 -0
  136. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_app_knowledge_commands.py +0 -0
  137. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_apps_dependencies.py +0 -0
  138. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_auth.py +0 -0
  139. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_auth_api_key.py +0 -0
  140. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_auth_commands.py +0 -0
  141. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_batch_commands.py +0 -0
  142. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_build_commands.py +0 -0
  143. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_build_fix_prompts.py +0 -0
  144. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_capabilities_command.py +0 -0
  145. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_channel_header.py +0 -0
  146. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_code_quality.py +0 -0
  147. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_commit_commands.py +0 -0
  148. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_draft_feature_commands.py +0 -0
  149. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_env.py +0 -0
  150. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_flow_types_commands.py +0 -0
  151. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_init_command.py +0 -0
  152. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_issues.py +0 -0
  153. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_issues_commands.py +0 -0
  154. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_mermaid.py +0 -0
  155. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_network_errors.py +0 -0
  156. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_response_errors.py +0 -0
  157. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_run_commands.py +0 -0
  158. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_screens_commands.py +0 -0
  159. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_skill_command.py +0 -0
  160. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_test_file_commands.py +0 -0
  161. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_test_profile_commands.py +0 -0
  162. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_upgrade_command.py +0 -0
  163. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_user_story_bindings_commands.py +0 -0
  164. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_user_story_commands.py +0 -0
  165. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_verdicts.py +0 -0
  166. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_verdicts_actionable.py +0 -0
  167. {minitest_cli-0.27.0 → minitest_cli-0.27.2}/tests/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: minitest-cli
3
- Version: 0.27.0
3
+ Version: 0.27.2
4
4
  Summary: Minitest CLI – command-line interface for the Minitest testing platform
5
5
  Project-URL: Homepage, https://minitap.ai/
6
6
  Project-URL: Source, https://github.com/minitap-ai/minitest-cli
@@ -91,6 +91,9 @@ minitest auth login
91
91
  # List your apps
92
92
  minitest apps list
93
93
 
94
+ # Inspect one app's full configuration
95
+ minitest apps get <app-id>
96
+
94
97
  # Create a new app on your tenant
95
98
  minitest apps create --name "My Mobile App" --platform ios --platform android
96
99
 
@@ -137,7 +140,7 @@ minitest --app <app-id> run all --ios-build <ios-build-id> --android-build <andr
137
140
  | Command | Description |
138
141
  | ---------------- | ------------------------- |
139
142
  | `minitest auth` | Authentication management |
140
- | `minitest apps` | App management |
143
+ | `minitest apps` | List, inspect, and create apps |
141
144
  | `minitest user-story` | User-story operations |
142
145
  | `minitest df` | Draft features — branches of the test suite |
143
146
  | `minitest flow-types` | List flow types, create/rename/delete custom ones |
@@ -58,6 +58,9 @@ minitest auth login
58
58
  # List your apps
59
59
  minitest apps list
60
60
 
61
+ # Inspect one app's full configuration
62
+ minitest apps get <app-id>
63
+
61
64
  # Create a new app on your tenant
62
65
  minitest apps create --name "My Mobile App" --platform ios --platform android
63
66
 
@@ -104,7 +107,7 @@ minitest --app <app-id> run all --ios-build <ios-build-id> --android-build <andr
104
107
  | Command | Description |
105
108
  | ---------------- | ------------------------- |
106
109
  | `minitest auth` | Authentication management |
107
- | `minitest apps` | App management |
110
+ | `minitest apps` | List, inspect, and create apps |
108
111
  | `minitest user-story` | User-story operations |
109
112
  | `minitest df` | Draft features — branches of the test suite |
110
113
  | `minitest flow-types` | List flow types, create/rename/delete custom ones |
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "minitest-cli"
3
- version = "0.27.0"
3
+ version = "0.27.2"
4
4
  description = "Minitest CLI – command-line interface for the Minitest testing platform"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -1,4 +1,4 @@
1
- """App management commands: list, create, dependencies."""
1
+ """App management commands: list, get, create, dependencies."""
2
2
 
3
3
  import asyncio
4
4
  from pathlib import Path
@@ -10,7 +10,7 @@ import typer
10
10
  from minitest_cli.api.apps_manager_client import AppsManagerClient # noqa: F401 re-exported for tests
11
11
  from minitest_cli.api.client import ApiClient
12
12
  from minitest_cli.api.errors import format_network_error
13
- from minitest_cli.commands import apps_dependencies
13
+ from minitest_cli.commands import apps_dependencies, apps_get
14
14
  from minitest_cli.commands.apps_helpers import create_app_request
15
15
  from minitest_cli.core.auth import require_auth
16
16
  from minitest_cli.core.config import Settings
@@ -28,6 +28,7 @@ EXIT_NETWORK_ERROR = 3
28
28
 
29
29
  app = typer.Typer(name="apps", help="App management.")
30
30
  app.command(name="dependencies")(apps_dependencies.dependencies)
31
+ app.command(name="get")(apps_get.get_app)
31
32
 
32
33
 
33
34
  @app.callback()
@@ -0,0 +1,43 @@
1
+ import asyncio
2
+ from typing import Annotated
3
+
4
+ import httpx
5
+ import typer
6
+
7
+ from minitest_cli.api.errors import format_network_error
8
+ from minitest_cli.commands.apps_helpers import get_app_request
9
+ from minitest_cli.commands.env_helpers import resolve_app_and_tenant
10
+ from minitest_cli.core.auth import require_auth
11
+ from minitest_cli.models.app import AppDetailResponse
12
+ from minitest_cli.utils.output import print_error, print_json
13
+
14
+ EXIT_NETWORK_ERROR = 3
15
+
16
+
17
+ def get_app(
18
+ app_id: Annotated[str, typer.Argument(help="App ID.")],
19
+ ) -> None:
20
+ settings = typer.Context.settings # type: ignore[attr-defined]
21
+ json_mode = typer.Context.json_mode # type: ignore[attr-defined]
22
+ require_auth(settings)
23
+
24
+ async def _run() -> AppDetailResponse:
25
+ resolved_app_id, tenant_id = await resolve_app_and_tenant(settings, app_id)
26
+ return await get_app_request(
27
+ settings,
28
+ tenant_id=tenant_id,
29
+ app_id=resolved_app_id,
30
+ )
31
+
32
+ try:
33
+ detail = asyncio.run(_run())
34
+ except httpx.HTTPError as exc:
35
+ print_error(format_network_error(exc))
36
+ raise typer.Exit(code=EXIT_NETWORK_ERROR) from exc
37
+
38
+ payload = detail.model_dump(mode="json", by_alias=True)
39
+ if json_mode:
40
+ print_json(payload)
41
+ return
42
+ for key, value in payload.items():
43
+ print(f"{key}: {'-' if value is None else value}") # noqa: T201
@@ -33,7 +33,7 @@ def extract_backend_detail(resp: httpx.Response) -> str:
33
33
  return resp.text or f"HTTP {resp.status_code}"
34
34
 
35
35
 
36
- def handle_create_response_error(resp: httpx.Response) -> None:
36
+ def handle_apps_manager_response_error(resp: httpx.Response) -> None:
37
37
  """Map a non-2xx apps-manager response to an exit code with a clean message."""
38
38
  if resp.status_code < 400:
39
39
  return
@@ -97,5 +97,18 @@ async def create_app_request(
97
97
  if icon_handle is not None:
98
98
  icon_handle.close()
99
99
 
100
- handle_create_response_error(resp)
100
+ handle_apps_manager_response_error(resp)
101
+ return AppDetailResponse.model_validate(resp.json())
102
+
103
+
104
+ async def get_app_request(
105
+ settings: Settings,
106
+ *,
107
+ tenant_id: str,
108
+ app_id: str,
109
+ ) -> AppDetailResponse:
110
+ async with AppsManagerClient(settings) as client:
111
+ resp = await client.get(f"/api/v1/tenants/{tenant_id}/apps/{app_id}")
112
+
113
+ handle_apps_manager_response_error(resp)
101
114
  return AppDetailResponse.model_validate(resp.json())
@@ -1,4 +1,4 @@
1
- """Tests for minitest_cli.commands.apps — CLI commands list and create."""
1
+ """Tests for minitest_cli.commands.apps — CLI commands list, get, and create."""
2
2
 
3
3
  import json
4
4
  from datetime import UTC, datetime
@@ -199,6 +199,103 @@ class TestListApps:
199
199
  assert "—" in result.output
200
200
 
201
201
 
202
+ class TestGetApp:
203
+ def test_json_output_fetches_full_record_from_apps_manager(self, tmp_path):
204
+ settings = _make_settings(tmp_path)
205
+ list_client = _mock_client(_mock_response(200, _APPS_DATA))
206
+ detail_client = _mock_client(_mock_response(200, _APP_RECORD))
207
+
208
+ with (
209
+ patch("minitest_cli.commands.env_helpers.ApiClient", return_value=list_client),
210
+ patch(
211
+ "minitest_cli.commands.apps_helpers.AppsManagerClient",
212
+ return_value=detail_client,
213
+ ),
214
+ ):
215
+ result = _run_with_context(["get", "aaa-111"], settings, json_mode=True)
216
+
217
+ assert result.exit_code == 0, result.output
218
+ payload = json.loads(result.output)
219
+ assert payload["id"] == "app-xyz"
220
+ assert payload["tenantId"] == "t-1"
221
+ assert payload["description"] == "A demo"
222
+ list_client.get.assert_called_once_with("/api/v1/apps")
223
+ detail_client.get.assert_called_once_with("/api/v1/tenants/t-1/apps/aaa-111")
224
+
225
+ def test_human_output_prints_app_details(self, tmp_path):
226
+ settings = _make_settings(tmp_path)
227
+ list_client = _mock_client(_mock_response(200, _APPS_DATA))
228
+ detail_client = _mock_client(_mock_response(200, _APP_RECORD))
229
+
230
+ with (
231
+ patch("minitest_cli.commands.env_helpers.ApiClient", return_value=list_client),
232
+ patch(
233
+ "minitest_cli.commands.apps_helpers.AppsManagerClient",
234
+ return_value=detail_client,
235
+ ),
236
+ ):
237
+ result = _run_with_context(["get", "aaa-111"], settings)
238
+
239
+ assert result.exit_code == 0, result.output
240
+ assert "name: Foo" in result.output
241
+ assert "tenantId: t-1" in result.output
242
+ assert "description: A demo" in result.output
243
+
244
+ def test_unknown_app_exits_not_found_without_calling_apps_manager(self, tmp_path):
245
+ settings = _make_settings(tmp_path)
246
+ list_client = _mock_client(_mock_response(200, _APPS_DATA))
247
+ detail_client = MagicMock()
248
+
249
+ with (
250
+ patch("minitest_cli.commands.env_helpers.ApiClient", return_value=list_client),
251
+ patch(
252
+ "minitest_cli.commands.apps_helpers.AppsManagerClient",
253
+ return_value=detail_client,
254
+ ),
255
+ ):
256
+ result = _run_with_context(["get", "missing"], settings)
257
+
258
+ assert result.exit_code == 4
259
+ assert "App not found" in result.output
260
+ detail_client.assert_not_called()
261
+
262
+ def test_apps_manager_not_found_exits_not_found(self, tmp_path):
263
+ settings = _make_settings(tmp_path)
264
+ list_client = _mock_client(_mock_response(200, _APPS_DATA))
265
+ detail_client = _mock_client(_mock_response(404, {"detail": "App not found"}))
266
+
267
+ with (
268
+ patch("minitest_cli.commands.env_helpers.ApiClient", return_value=list_client),
269
+ patch(
270
+ "minitest_cli.commands.apps_helpers.AppsManagerClient",
271
+ return_value=detail_client,
272
+ ),
273
+ ):
274
+ result = _run_with_context(["get", "aaa-111"], settings)
275
+
276
+ assert result.exit_code == 4
277
+ assert "App not found" in result.output
278
+
279
+ def test_network_error_exits_network_error(self, tmp_path):
280
+ settings = _make_settings(tmp_path)
281
+ list_client = _mock_client(_mock_response(200, _APPS_DATA))
282
+ detail_client = AsyncMock()
283
+ detail_client.__aenter__ = AsyncMock(return_value=detail_client)
284
+ detail_client.__aexit__ = AsyncMock(return_value=False)
285
+ detail_client.get = AsyncMock(side_effect=httpx.ConnectError("connection refused"))
286
+
287
+ with (
288
+ patch("minitest_cli.commands.env_helpers.ApiClient", return_value=list_client),
289
+ patch(
290
+ "minitest_cli.commands.apps_helpers.AppsManagerClient",
291
+ return_value=detail_client,
292
+ ),
293
+ ):
294
+ result = _run_with_context(["get", "aaa-111"], settings)
295
+
296
+ assert result.exit_code == 3
297
+
298
+
202
299
  # ---------------------------------------------------------------------------
203
300
  # `apps create` tests
204
301
  # ---------------------------------------------------------------------------
@@ -141,7 +141,7 @@ wheels = [
141
141
 
142
142
  [[package]]
143
143
  name = "minitest-cli"
144
- version = "0.27.0"
144
+ version = "0.27.2"
145
145
  source = { editable = "." }
146
146
  dependencies = [
147
147
  { name = "httpx" },
File without changes
File without changes
File without changes
File without changes
File without changes