minitest-cli 0.32.0__tar.gz → 0.33.0__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.
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/PKG-INFO +5 -4
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/README.md +4 -3
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/pyproject.toml +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/apps_dependencies.py +4 -4
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/batch.py +5 -5
- minitest_cli-0.33.0/src/minitest_cli/commands/deprecated_alias.py +16 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/flow_types_write.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/issues.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/issues_helpers.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/maintenance.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/maintenance_callbacks.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/run.py +7 -7
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/run_cancel.py +2 -2
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/run_commit.py +2 -2
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/run_display.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/run_helpers.py +3 -3
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/run_recording.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/tags_helpers.py +2 -1
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/test_profile_default.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/user_story.py +14 -10
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/user_story_bindings.py +13 -11
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/user_story_create.py +6 -6
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/user_story_delete.py +3 -3
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/user_story_helpers.py +3 -4
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/user_story_modify.py +5 -5
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/user_story_setup_commit.py +7 -7
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/user_story_update.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/verdicts.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/main.py +2 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/utils/dependency_sim.py +3 -3
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_issues.py +1 -1
- minitest_cli-0.33.0/tests/test_scenario_command.py +74 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_user_story_commands.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/uv.lock +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/.env.example +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/.github/workflows/ci.yml +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/.github/workflows/install-scripts.yml +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/.github/workflows/release.yml +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/.gitignore +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/.opencode/skill/release/SKILL.md +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/AGENTS.md +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/RELEASE.md +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/install.ps1 +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/install.sh +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/pyrightconfig.json +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/renovate.json +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/__init__.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/api/__init__.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/api/apps_manager_client.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/api/client.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/api/errors.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/assets/__init__.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/assets/callback.html +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/__init__.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/_response_errors.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/app_knowledge.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/app_knowledge_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/app_skill.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/app_skill_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/app_skill_secret.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/app_skill_write.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/apps.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/apps_get.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/apps_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/auth.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/auth_api_key.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/batch_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/batch_warnings.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/build.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/build_commit.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/build_fix_prompts.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/build_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/capabilities.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/commit_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/draft_feature.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/draft_feature_apply.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/draft_feature_conflicts.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/draft_feature_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/draft_feature_show.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/env.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/env_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/flow_types.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/flow_types_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/init.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/init_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/init_playbook.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/issues_fix.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/issues_projection.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/issues_service.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/maintenance_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/maintenance_state.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/recording_timeline.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/run_commit_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/run_feedback.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/run_recording_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/run_tagged.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/run_targets.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/screens.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/screens_detail.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/screens_format.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/screens_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/screens_tree.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/skill.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/tags.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/test_file.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/test_file_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/test_file_list.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/test_profile.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/test_profile_card.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/test_profile_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/test_profile_list.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/test_profile_update.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/upgrade.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/user_story_camera.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/user_story_criteria.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/user_story_criterion_edits.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/user_story_device_count.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/user_story_overrides.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/user_story_profiles.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/verdicts_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/verdicts_projection.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/core/__init__.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/core/app_context.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/core/auth.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/core/config.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/core/credentials.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/core/oauth.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/core/tenants.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/core/token_exchange.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/models/__init__.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/models/app.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/models/app_env_vars.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/models/app_failure.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/models/app_screen.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/models/base.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/models/batch.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/models/build.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/models/commit_build.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/models/draft_feature.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/models/flow_type.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/models/issues.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/models/recording.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/models/story_run.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/models/tag.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/models/targets.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/models/user_story.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/utils/__init__.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/utils/confirm.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/utils/mermaid.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/utils/output.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/utils/skill_refresh.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/utils/update_check.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/utils/video_frames.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/__init__.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/_commit_transport.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_api_client_auth.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_app_knowledge_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_app_skill_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_apps_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_apps_dependencies.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_auth.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_auth_api_key.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_auth_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_batch_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_build_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_build_fix_prompts.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_capabilities_command.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_channel_header.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_code_quality.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_commit_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_draft_feature_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_env.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_flow_types_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_init_command.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_issues_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_mermaid.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_native_device_types.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_network_errors.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_recording_timeline.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_response_errors.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_run_cancel.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_run_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_run_frames_command.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_screens_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_skill_command.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_suite_change_provenance.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_tags_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_test_file_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_test_profile_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_upgrade_command.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_user_story_bindings_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_user_story_setup_commit.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_verdicts.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_verdicts_actionable.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.33.0}/tests/test_version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: minitest-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.33.0
|
|
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
|
|
@@ -167,7 +167,8 @@ app defaults.
|
|
|
167
167
|
| ---------------- | ------------------------- |
|
|
168
168
|
| `minitest auth` | Authentication management |
|
|
169
169
|
| `minitest apps` | List, inspect, and create apps |
|
|
170
|
-
| `minitest
|
|
170
|
+
| `minitest scenario` | Create, update, list and delete scenarios (`user-story` is a deprecated alias) |
|
|
171
|
+
| `minitest scenario-binding` | Bind test profiles, files or skills to scenarios (`user-story-binding` is a deprecated alias) |
|
|
171
172
|
| `minitest df` | Draft features — branches of the test suite |
|
|
172
173
|
| `minitest flow-types` | List flow types, create/rename/delete custom ones |
|
|
173
174
|
| `minitest screens` | Inspect the screens exploration mapped for an app |
|
|
@@ -177,7 +178,7 @@ app defaults.
|
|
|
177
178
|
|
|
178
179
|
## CLI-only maintenance
|
|
179
180
|
|
|
180
|
-
`minitest maintenance` lets a coding agent keep Minitest
|
|
181
|
+
`minitest maintenance` lets a coding agent keep Minitest scenarios in sync
|
|
181
182
|
without connecting GitHub. Run it from the app repository: the code stays on the
|
|
182
183
|
machine, while the CLI sends only proposed test-flow edits and the local HEAD SHA.
|
|
183
184
|
|
|
@@ -189,7 +190,7 @@ minitest maintenance --agent
|
|
|
189
190
|
minitest --json maintenance context
|
|
190
191
|
minitest maintenance affected --file affected.json
|
|
191
192
|
minitest maintenance change --file change.json
|
|
192
|
-
minitest maintenance status --phase writing --message "Updating affected
|
|
193
|
+
minitest maintenance status --phase writing --message "Updating affected scenarios"
|
|
193
194
|
minitest maintenance complete --changed
|
|
194
195
|
|
|
195
196
|
# Apply proposed edits now, or open the web review queue
|
|
@@ -134,7 +134,8 @@ app defaults.
|
|
|
134
134
|
| ---------------- | ------------------------- |
|
|
135
135
|
| `minitest auth` | Authentication management |
|
|
136
136
|
| `minitest apps` | List, inspect, and create apps |
|
|
137
|
-
| `minitest
|
|
137
|
+
| `minitest scenario` | Create, update, list and delete scenarios (`user-story` is a deprecated alias) |
|
|
138
|
+
| `minitest scenario-binding` | Bind test profiles, files or skills to scenarios (`user-story-binding` is a deprecated alias) |
|
|
138
139
|
| `minitest df` | Draft features — branches of the test suite |
|
|
139
140
|
| `minitest flow-types` | List flow types, create/rename/delete custom ones |
|
|
140
141
|
| `minitest screens` | Inspect the screens exploration mapped for an app |
|
|
@@ -144,7 +145,7 @@ app defaults.
|
|
|
144
145
|
|
|
145
146
|
## CLI-only maintenance
|
|
146
147
|
|
|
147
|
-
`minitest maintenance` lets a coding agent keep Minitest
|
|
148
|
+
`minitest maintenance` lets a coding agent keep Minitest scenarios in sync
|
|
148
149
|
without connecting GitHub. Run it from the app repository: the code stays on the
|
|
149
150
|
machine, while the CLI sends only proposed test-flow edits and the local HEAD SHA.
|
|
150
151
|
|
|
@@ -156,7 +157,7 @@ minitest maintenance --agent
|
|
|
156
157
|
minitest --json maintenance context
|
|
157
158
|
minitest maintenance affected --file affected.json
|
|
158
159
|
minitest maintenance change --file change.json
|
|
159
|
-
minitest maintenance status --phase writing --message "Updating affected
|
|
160
|
+
minitest maintenance status --phase writing --message "Updating affected scenarios"
|
|
160
161
|
minitest maintenance complete --changed
|
|
161
162
|
|
|
162
163
|
# Apply proposed edits now, or open the web review queue
|
|
@@ -45,7 +45,7 @@ def dependencies(
|
|
|
45
45
|
"--simulate",
|
|
46
46
|
help=(
|
|
47
47
|
"Simulate dependency edits without writing: reports cycle "
|
|
48
|
-
"verdict, affected
|
|
48
|
+
"verdict, affected scenarios, and the new run order."
|
|
49
49
|
),
|
|
50
50
|
),
|
|
51
51
|
] = False,
|
|
@@ -54,7 +54,7 @@ def dependencies(
|
|
|
54
54
|
typer.Option(
|
|
55
55
|
"--add",
|
|
56
56
|
help=(
|
|
57
|
-
"Edge to add, as <story_id>:<depends_on_id> — the
|
|
57
|
+
"Edge to add, as <story_id>:<depends_on_id> — the scenario will "
|
|
58
58
|
"depend on (run after) the second id. Repeatable; requires --simulate."
|
|
59
59
|
),
|
|
60
60
|
),
|
|
@@ -69,7 +69,7 @@ def dependencies(
|
|
|
69
69
|
),
|
|
70
70
|
] = None,
|
|
71
71
|
) -> None:
|
|
72
|
-
"""Print the
|
|
72
|
+
"""Print the scenario dependency graph as a Mermaid flowchart.
|
|
73
73
|
|
|
74
74
|
Fetches the dependency graph for the app and renders it as a Mermaid
|
|
75
75
|
``flowchart TD`` diagram to stdout. With ``--json``, outputs the raw
|
|
@@ -129,7 +129,7 @@ def dependencies(
|
|
|
129
129
|
|
|
130
130
|
mermaid = build_dependency_graph(nodes, edges)
|
|
131
131
|
if not mermaid:
|
|
132
|
-
print_info("No
|
|
132
|
+
print_info("No scenarios found for this app.")
|
|
133
133
|
raise typer.Exit(code=0)
|
|
134
134
|
|
|
135
135
|
print(mermaid) # noqa: T201
|
|
@@ -26,7 +26,7 @@ from minitest_cli.utils.output import (
|
|
|
26
26
|
print_table,
|
|
27
27
|
)
|
|
28
28
|
|
|
29
|
-
app = typer.Typer(name="batch", help="Manage batch runs (multi-
|
|
29
|
+
app = typer.Typer(name="batch", help="Manage batch runs (multi-scenario executions).")
|
|
30
30
|
|
|
31
31
|
BATCH_TABLE_HEADERS = ["ID", "Status", "Source", "Commit", "Tag", "Targets", "Created"]
|
|
32
32
|
|
|
@@ -110,7 +110,7 @@ def list_batches(
|
|
|
110
110
|
def get_batch(
|
|
111
111
|
batch_id: Annotated[str, typer.Argument(help="Batch ID.")],
|
|
112
112
|
) -> None:
|
|
113
|
-
"""Get a single batch with its
|
|
113
|
+
"""Get a single batch with its scenario runs."""
|
|
114
114
|
settings, app_id, json_mode = resolve_app()
|
|
115
115
|
ensure_uuid(batch_id, kind="batch id")
|
|
116
116
|
|
|
@@ -165,9 +165,9 @@ def get_batch(
|
|
|
165
165
|
)
|
|
166
166
|
if rows:
|
|
167
167
|
print_table(
|
|
168
|
-
["Run ID", "
|
|
168
|
+
["Run ID", "Scenario", "Status", "Created"],
|
|
169
169
|
rows,
|
|
170
|
-
title=f"
|
|
170
|
+
title=f"Scenario runs ({len(rows)})",
|
|
171
171
|
)
|
|
172
172
|
|
|
173
173
|
|
|
@@ -175,7 +175,7 @@ def get_batch(
|
|
|
175
175
|
def cancel(
|
|
176
176
|
batch_id: Annotated[str, typer.Argument(help="Batch ID to cancel.")],
|
|
177
177
|
) -> None:
|
|
178
|
-
"""Cancel a batch and all its pending/running
|
|
178
|
+
"""Cancel a batch and all its pending/running scenario runs."""
|
|
179
179
|
settings, app_id, json_mode = resolve_app()
|
|
180
180
|
ensure_uuid(batch_id, kind="batch id")
|
|
181
181
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import typer
|
|
2
|
+
|
|
3
|
+
from minitest_cli.utils.output import print_warning
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def deprecated_alias(source: typer.Typer, *, old_name: str) -> typer.Typer:
|
|
7
|
+
"""Expose ``source``'s commands under a hidden legacy name that warns on stderr."""
|
|
8
|
+
new_name = source.info.name
|
|
9
|
+
alias = typer.Typer(name=old_name, help=f"Deprecated: use `minitest {new_name}`.", hidden=True)
|
|
10
|
+
|
|
11
|
+
@alias.callback()
|
|
12
|
+
def _warn() -> None:
|
|
13
|
+
print_warning(f"`minitest {old_name}` is deprecated; use `minitest {new_name}` instead.")
|
|
14
|
+
|
|
15
|
+
alias.registered_commands = source.registered_commands
|
|
16
|
+
return alias
|
|
@@ -48,7 +48,7 @@ def create_flow_type(
|
|
|
48
48
|
color: Annotated[str, typer.Option("--color", help="Tailwind color name.")] = "gray",
|
|
49
49
|
usage_prompt: UsagePromptOption = None,
|
|
50
50
|
) -> None:
|
|
51
|
-
"""Create a custom flow type, usable as --type on any
|
|
51
|
+
"""Create a custom flow type, usable as --type on any scenario command.
|
|
52
52
|
|
|
53
53
|
Custom types are tenant-scoped: every app on your tenant can use them.
|
|
54
54
|
"""
|
|
@@ -31,7 +31,7 @@ app.command()(fix)
|
|
|
31
31
|
@app.command("list")
|
|
32
32
|
def list_issues(
|
|
33
33
|
issue: Annotated[str | None, typer.Option("--issue", help="Scope to one failure ID.")] = None,
|
|
34
|
-
run: Annotated[str | None, typer.Option("--run", help="Scope to one
|
|
34
|
+
run: Annotated[str | None, typer.Option("--run", help="Scope to one scenario run ID.")] = None,
|
|
35
35
|
batch: Annotated[str | None, typer.Option("--batch", help="Scope to one batch ID.")] = None,
|
|
36
36
|
platform: Annotated[
|
|
37
37
|
IssuePlatform | None, typer.Option(help="Filter by execution platform.")
|
|
@@ -122,7 +122,7 @@ async def _reject_batch_id_passed_as_run(client: ApiClient, app_id: str, given_i
|
|
|
122
122
|
"""
|
|
123
123
|
if await fetch_optional_batch(client, app_id, given_id) is None:
|
|
124
124
|
return
|
|
125
|
-
print_error(f"Run not found: {given_id} is a batch id, not a
|
|
125
|
+
print_error(f"Run not found: {given_id} is a batch id, not a scenario-run id.")
|
|
126
126
|
err_console.print(" [dim]The webapp path[/dim] /test/runs/<id> [dim]carries a batch id.[/dim]")
|
|
127
127
|
err_console.print(f" [yellow]Try:[/yellow] [bold]--batch {given_id}[/bold]")
|
|
128
128
|
raise typer.Exit(code=EXIT_NOT_FOUND)
|
|
@@ -69,7 +69,7 @@ def maintenance(
|
|
|
69
69
|
|
|
70
70
|
@app.command()
|
|
71
71
|
def context() -> None:
|
|
72
|
-
"""Open a maintenance run and emit its context (mode, fromSha,
|
|
72
|
+
"""Open a maintenance run and emit its context (mode, fromSha, scenarios) as JSON.
|
|
73
73
|
|
|
74
74
|
First run for an app has no watermark → audit mode (review the whole suite). Later runs
|
|
75
75
|
return the previous sha so the agent diffs `git diff <fromSha>..HEAD` locally.
|
{minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/maintenance_callbacks.py
RENAMED
|
@@ -19,7 +19,7 @@ def register_callback_commands(app: typer.Typer) -> None:
|
|
|
19
19
|
def affected(
|
|
20
20
|
file: Annotated[Path, typer.Option("--file", help="JSON file: {stories:[...]}.")],
|
|
21
21
|
) -> None:
|
|
22
|
-
"""Declare which
|
|
22
|
+
"""Declare which scenarios the change affects (idempotent per run)."""
|
|
23
23
|
_post_file(file, sub_path="affected-stories")
|
|
24
24
|
|
|
25
25
|
@app.command()
|
|
@@ -56,7 +56,7 @@ app = typer.Typer(name="run", help="Test execution.")
|
|
|
56
56
|
@app.command()
|
|
57
57
|
def start(
|
|
58
58
|
user_story: Annotated[
|
|
59
|
-
str | None, typer.Argument(help="
|
|
59
|
+
str | None, typer.Argument(help="Scenario name or UUID to run. Excludes --tag.")
|
|
60
60
|
] = None,
|
|
61
61
|
tag: Annotated[
|
|
62
62
|
list[str] | None,
|
|
@@ -71,9 +71,9 @@ def start(
|
|
|
71
71
|
bool, typer.Option("--watch/--no-watch", help="Poll for results (default: watch).")
|
|
72
72
|
] = True,
|
|
73
73
|
) -> None:
|
|
74
|
-
"""Start a run for one
|
|
74
|
+
"""Start a run for one scenario, or one batch over every scenario with --tag."""
|
|
75
75
|
if (user_story is None) == (not tag):
|
|
76
|
-
print_error("Pass either a
|
|
76
|
+
print_error("Pass either a scenario or --tag, not both or neither.")
|
|
77
77
|
raise typer.Exit(code=1)
|
|
78
78
|
settings, app_id, json_mode = resolve_app()
|
|
79
79
|
targets = build_targets(ios_build, android_build, web, ios_device_type, android_device_type)
|
|
@@ -88,7 +88,7 @@ def start(
|
|
|
88
88
|
body = CreateBatchRequest(user_story_ids=[user_story_id], targets=targets)
|
|
89
89
|
batch = await post_batch(client, app_id, body)
|
|
90
90
|
if not batch.story_runs:
|
|
91
|
-
print_error("Batch created but no
|
|
91
|
+
print_error("Batch created but no scenario runs were returned.")
|
|
92
92
|
raise typer.Exit(code=3)
|
|
93
93
|
run = batch.story_runs[0]
|
|
94
94
|
if not watch:
|
|
@@ -131,7 +131,7 @@ def status(
|
|
|
131
131
|
|
|
132
132
|
@app.command(name="list")
|
|
133
133
|
def list_runs(
|
|
134
|
-
user_story: Annotated[str, typer.Argument(help="
|
|
134
|
+
user_story: Annotated[str, typer.Argument(help="Scenario name or UUID to list runs for.")],
|
|
135
135
|
page: Annotated[int, typer.Option(help="Page number.")] = 1,
|
|
136
136
|
page_size: Annotated[int, typer.Option(help="Items per page.")] = 20,
|
|
137
137
|
status_filter: Annotated[
|
|
@@ -143,7 +143,7 @@ def list_runs(
|
|
|
143
143
|
] = None,
|
|
144
144
|
all_pages: Annotated[bool, typer.Option("--all", help="Fetch all results.")] = False,
|
|
145
145
|
) -> None:
|
|
146
|
-
"""List runs for a
|
|
146
|
+
"""List runs for a scenario."""
|
|
147
147
|
settings, app_id, json_mode = resolve_app()
|
|
148
148
|
if all_pages:
|
|
149
149
|
page, page_size = 1, 100
|
|
@@ -175,7 +175,7 @@ def run_all(
|
|
|
175
175
|
ios_device_type: IosDeviceTypeOpt = None,
|
|
176
176
|
android_device_type: AndroidDeviceTypeOpt = None,
|
|
177
177
|
) -> None:
|
|
178
|
-
"""Start a batch covering every
|
|
178
|
+
"""Start a batch covering every scenario for the app."""
|
|
179
179
|
settings, app_id, json_mode = resolve_app()
|
|
180
180
|
targets = build_targets(ios_build, android_build, web, ios_device_type, android_device_type)
|
|
181
181
|
|
|
@@ -90,10 +90,10 @@ def cancel(
|
|
|
90
90
|
] = None,
|
|
91
91
|
srp_id: Annotated[
|
|
92
92
|
str | None,
|
|
93
|
-
typer.Option("--srp", help="Only cancel this
|
|
93
|
+
typer.Option("--srp", help="Only cancel this scenario-run platform ID."),
|
|
94
94
|
] = None,
|
|
95
95
|
) -> None:
|
|
96
|
-
"""Cancel every pending or running platform of a
|
|
96
|
+
"""Cancel every pending or running platform of a scenario run."""
|
|
97
97
|
settings, app_id, json_mode = resolve_app()
|
|
98
98
|
ensure_uuid(run_id, kind="run id")
|
|
99
99
|
if srp_id is not None:
|
|
@@ -39,7 +39,7 @@ UserStoryOpt = Annotated[
|
|
|
39
39
|
typer.Option(
|
|
40
40
|
"--user-story",
|
|
41
41
|
"-u",
|
|
42
|
-
help="
|
|
42
|
+
help="Scenario id or name. Repeatable. Omit to run every scenario.",
|
|
43
43
|
),
|
|
44
44
|
]
|
|
45
45
|
|
|
@@ -97,7 +97,7 @@ def from_commit(
|
|
|
97
97
|
print_success(f"Batch {batch.id} is {batch.status.value}")
|
|
98
98
|
if batch.status is BatchStatus.failed and not batch.story_runs:
|
|
99
99
|
print_warning(
|
|
100
|
-
"The batch failed before any
|
|
100
|
+
"The batch failed before any scenario ran, which usually means the build failed. "
|
|
101
101
|
f"Inspect it with `minitest build list --status failed`. {CONNECT_REPO_HINT}"
|
|
102
102
|
)
|
|
103
103
|
elif not watch:
|
|
@@ -13,7 +13,7 @@ from minitest_cli.utils.output import (
|
|
|
13
13
|
print_table,
|
|
14
14
|
)
|
|
15
15
|
|
|
16
|
-
RUN_TABLE_HEADERS = ["ID", "
|
|
16
|
+
RUN_TABLE_HEADERS = ["ID", "Scenario", "Status", "Created"]
|
|
17
17
|
|
|
18
18
|
RESULTS_TABLE_HEADERS = ["Criterion ID", "Platform", "Result", "Fail Reason"]
|
|
19
19
|
|
|
@@ -102,7 +102,7 @@ def handle_response_error(resp: httpx.Response, *, resource: str = "Run") -> Non
|
|
|
102
102
|
detail = extract_detail(resp) or ""
|
|
103
103
|
if "violates foreign key constraint" in detail:
|
|
104
104
|
msg = f"{resource} references a resource that does not exist."
|
|
105
|
-
print_error(f"{msg} Check the
|
|
105
|
+
print_error(f"{msg} Check the scenario and build IDs.")
|
|
106
106
|
raise typer.Exit(code=EXIT_NOT_FOUND)
|
|
107
107
|
if resp.status_code >= 400:
|
|
108
108
|
detail = extract_detail(resp)
|
|
@@ -141,14 +141,14 @@ async def resolve_user_story_id(
|
|
|
141
141
|
f"/api/v1/apps/{app_id}/user-stories",
|
|
142
142
|
params={"page_size": 100},
|
|
143
143
|
)
|
|
144
|
-
handle_response_error(resp, resource="
|
|
144
|
+
handle_response_error(resp, resource="Scenario")
|
|
145
145
|
|
|
146
146
|
items = resp.json().get("items", [])
|
|
147
147
|
for story in items:
|
|
148
148
|
if story.get("name", "").lower() == user_story_ref.lower():
|
|
149
149
|
return story["id"]
|
|
150
150
|
|
|
151
|
-
print_error(f"
|
|
151
|
+
print_error(f"Scenario not found: '{user_story_ref}'. Use a valid scenario name or UUID.")
|
|
152
152
|
raise typer.Exit(code=EXIT_NOT_FOUND)
|
|
153
153
|
|
|
154
154
|
|
|
@@ -37,7 +37,7 @@ WidthOpt = Annotated[int, typer.Option("--width", min=32, help="Frame width in p
|
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
def recording(
|
|
40
|
-
run_id: Annotated[str, typer.Argument(help="
|
|
40
|
+
run_id: Annotated[str, typer.Argument(help="Scenario-run ID.")],
|
|
41
41
|
platform: Annotated[str | None, typer.Option(help="Target platform (ios/android/web).")] = None,
|
|
42
42
|
srp: Annotated[str | None, typer.Option(help="Exact target (srpId) when ambiguous.")] = None,
|
|
43
43
|
device: Annotated[int, typer.Option(min=1, help="Device index on multi-device runs.")] = 1,
|
|
@@ -11,7 +11,8 @@ from minitest_cli.utils.output import print_error, print_warning
|
|
|
11
11
|
TagOption = Annotated[
|
|
12
12
|
list[str] | None,
|
|
13
13
|
typer.Option(
|
|
14
|
-
"--tag",
|
|
14
|
+
"--tag",
|
|
15
|
+
help="Tag name (repeatable; replaces the scenario's tags). Unknown tags are created.",
|
|
15
16
|
),
|
|
16
17
|
]
|
|
17
18
|
ClearTagsOption = Annotated[
|
{minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/test_profile_default.py
RENAMED
|
@@ -26,7 +26,7 @@ def register(app: typer.Typer) -> None:
|
|
|
26
26
|
) -> None:
|
|
27
27
|
"""Set a test profile as the default for the app.
|
|
28
28
|
|
|
29
|
-
New
|
|
29
|
+
New scenarios without an explicit ``--profile`` will auto-assign
|
|
30
30
|
this profile.
|
|
31
31
|
"""
|
|
32
32
|
settings = get_settings()
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""Scenario commands (legacy name: user story): list, get."""
|
|
2
2
|
|
|
3
3
|
from typing import Annotated, Any
|
|
4
4
|
|
|
@@ -11,6 +11,7 @@ from minitest_cli.commands import (
|
|
|
11
11
|
user_story_modify,
|
|
12
12
|
user_story_setup_commit,
|
|
13
13
|
)
|
|
14
|
+
from minitest_cli.commands.deprecated_alias import deprecated_alias
|
|
14
15
|
from minitest_cli.commands.tags_helpers import (
|
|
15
16
|
LegacyTypeOption,
|
|
16
17
|
collect_tag_names,
|
|
@@ -35,7 +36,7 @@ from minitest_cli.core.app_context import resolve_app_id
|
|
|
35
36
|
from minitest_cli.core.auth import require_auth
|
|
36
37
|
from minitest_cli.utils.output import output, print_info, print_table
|
|
37
38
|
|
|
38
|
-
app = typer.Typer(name="
|
|
39
|
+
app = typer.Typer(name="scenario", help="Create, update, list and delete scenarios.")
|
|
39
40
|
app.command(name="create")(user_story_create.create_user_story)
|
|
40
41
|
app.command(name="update")(user_story_modify.update_user_story)
|
|
41
42
|
app.command(name="delete")(user_story_delete.delete_user_story)
|
|
@@ -47,7 +48,7 @@ app.command(name="revoke-setup-commit")(user_story_setup_commit.revoke_setup_com
|
|
|
47
48
|
def list_user_stories(
|
|
48
49
|
tag: Annotated[
|
|
49
50
|
list[str] | None,
|
|
50
|
-
typer.Option("--tag", help="Only
|
|
51
|
+
typer.Option("--tag", help="Only scenarios carrying any of these tags (repeatable)."),
|
|
51
52
|
] = None,
|
|
52
53
|
user_story_type: LegacyTypeOption = None,
|
|
53
54
|
page: Annotated[int, typer.Option("--page", min=1, help="Page number.")] = 1,
|
|
@@ -56,10 +57,10 @@ def list_user_stories(
|
|
|
56
57
|
] = 20,
|
|
57
58
|
all_stories: Annotated[
|
|
58
59
|
bool,
|
|
59
|
-
typer.Option("--all", help="Fetch all
|
|
60
|
+
typer.Option("--all", help="Fetch all scenarios (ignores --page and --page-size)."),
|
|
60
61
|
] = False,
|
|
61
62
|
) -> None:
|
|
62
|
-
"""List
|
|
63
|
+
"""List scenarios for the active app."""
|
|
63
64
|
settings = get_settings()
|
|
64
65
|
json_mode = is_json_mode()
|
|
65
66
|
require_auth(settings)
|
|
@@ -86,16 +87,16 @@ def list_user_stories(
|
|
|
86
87
|
|
|
87
88
|
items = page_items(data)
|
|
88
89
|
if not items:
|
|
89
|
-
print_info("No
|
|
90
|
+
print_info("No scenarios found.")
|
|
90
91
|
return
|
|
91
92
|
|
|
92
93
|
if all_stories:
|
|
93
|
-
title = f"
|
|
94
|
+
title = f"Scenarios (showing all {len(items)} scenarios)"
|
|
94
95
|
tip = None
|
|
95
96
|
elif isinstance(data, dict):
|
|
96
97
|
title, tip = format_pagination_info(data, page, page_size)
|
|
97
98
|
else:
|
|
98
|
-
title, tip = "
|
|
99
|
+
title, tip = "Scenarios", None
|
|
99
100
|
show_devices = any(effective_device_count(s) > 1 for s in items)
|
|
100
101
|
headers = [*USER_STORY_TABLE_HEADERS, "Devices"] if show_devices else USER_STORY_TABLE_HEADERS
|
|
101
102
|
rows = [format_user_story_row(s, show_devices=show_devices) for s in items]
|
|
@@ -106,9 +107,9 @@ def list_user_stories(
|
|
|
106
107
|
|
|
107
108
|
@app.command(name="get")
|
|
108
109
|
def get_user_story(
|
|
109
|
-
user_story_id: Annotated[str, typer.Argument(help="
|
|
110
|
+
user_story_id: Annotated[str, typer.Argument(help="Scenario ID.")],
|
|
110
111
|
) -> None:
|
|
111
|
-
"""Show details for a specific
|
|
112
|
+
"""Show details for a specific scenario."""
|
|
112
113
|
settings = get_settings()
|
|
113
114
|
json_mode = is_json_mode()
|
|
114
115
|
require_auth(settings)
|
|
@@ -130,3 +131,6 @@ def get_user_story(
|
|
|
130
131
|
if isinstance(permission, dict):
|
|
131
132
|
print_info(f"Setup commit allowed: {permission.get('customerQuote')}")
|
|
132
133
|
output(data, json_mode=json_mode)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
legacy_app = deprecated_alias(app, old_name="user-story")
|
{minitest_cli-0.32.0 → minitest_cli-0.33.0}/src/minitest_cli/commands/user_story_bindings.py
RENAMED
|
@@ -3,6 +3,7 @@ from typing import Annotated, Any
|
|
|
3
3
|
import typer
|
|
4
4
|
|
|
5
5
|
from minitest_cli.api.client import ApiClient
|
|
6
|
+
from minitest_cli.commands.deprecated_alias import deprecated_alias
|
|
6
7
|
from minitest_cli.commands.app_skill_helpers import handle_skill_response
|
|
7
8
|
from minitest_cli.commands.user_story_helpers import (
|
|
8
9
|
base_path,
|
|
@@ -16,9 +17,7 @@ from minitest_cli.core.app_context import resolve_app_id
|
|
|
16
17
|
from minitest_cli.core.auth import require_auth
|
|
17
18
|
from minitest_cli.utils.output import output, print_error, print_info, print_success, print_table
|
|
18
19
|
|
|
19
|
-
app = typer.Typer(
|
|
20
|
-
name="user-story-binding", help="Bind test profiles, files or skills to user stories."
|
|
21
|
-
)
|
|
20
|
+
app = typer.Typer(name="scenario-binding", help="Bind test profiles, files or skills to scenarios.")
|
|
22
21
|
|
|
23
22
|
_FILE_BINDING_HEADERS = ["ID", "Name", "Kind"]
|
|
24
23
|
|
|
@@ -37,7 +36,7 @@ def _normalize_items(data: Any) -> list[dict[str, Any]]:
|
|
|
37
36
|
|
|
38
37
|
@app.command(name="set-profile")
|
|
39
38
|
def set_profile(
|
|
40
|
-
user_story_id: Annotated[str, typer.Argument(help="
|
|
39
|
+
user_story_id: Annotated[str, typer.Argument(help="Scenario ID.")],
|
|
41
40
|
profile_ids: Annotated[
|
|
42
41
|
list[str] | None,
|
|
43
42
|
typer.Option(
|
|
@@ -74,16 +73,16 @@ def set_profile(
|
|
|
74
73
|
data = run_api_call(_run())
|
|
75
74
|
if not json_mode:
|
|
76
75
|
if clear:
|
|
77
|
-
print_success(f"Test profiles cleared on
|
|
76
|
+
print_success(f"Test profiles cleared on scenario {user_story_id}.")
|
|
78
77
|
else:
|
|
79
78
|
bound = ", ".join(profile_ids or [])
|
|
80
|
-
print_success(f"Test profiles [{bound}] bound to
|
|
79
|
+
print_success(f"Test profiles [{bound}] bound to scenario {user_story_id}.")
|
|
81
80
|
output(data, json_mode=json_mode)
|
|
82
81
|
|
|
83
82
|
|
|
84
83
|
@app.command(name="set-files")
|
|
85
84
|
def set_files(
|
|
86
|
-
user_story_id: Annotated[str, typer.Argument(help="
|
|
85
|
+
user_story_id: Annotated[str, typer.Argument(help="Scenario ID.")],
|
|
87
86
|
file_ids: Annotated[
|
|
88
87
|
list[str] | None,
|
|
89
88
|
typer.Option(
|
|
@@ -124,7 +123,7 @@ def set_files(
|
|
|
124
123
|
output(data, json_mode=True)
|
|
125
124
|
return
|
|
126
125
|
if not items:
|
|
127
|
-
print_info("No files bound to this
|
|
126
|
+
print_info("No files bound to this scenario.")
|
|
128
127
|
return
|
|
129
128
|
rows = [_binding_row(f) for f in items]
|
|
130
129
|
print_table(_FILE_BINDING_HEADERS, rows, title=f"Files bound to {user_story_id} ({len(items)})")
|
|
@@ -132,7 +131,7 @@ def set_files(
|
|
|
132
131
|
|
|
133
132
|
@app.command(name="set-skills")
|
|
134
133
|
def set_skills(
|
|
135
|
-
user_story_id: Annotated[str, typer.Argument(help="
|
|
134
|
+
user_story_id: Annotated[str, typer.Argument(help="Scenario ID.")],
|
|
136
135
|
skill_names: Annotated[
|
|
137
136
|
list[str] | None,
|
|
138
137
|
typer.Option("--skill", help="Skill name Mini loads before starting (repeatable)."),
|
|
@@ -167,7 +166,7 @@ def set_skills(
|
|
|
167
166
|
|
|
168
167
|
@app.command(name="list-files")
|
|
169
168
|
def list_files(
|
|
170
|
-
user_story_id: Annotated[str, typer.Argument(help="
|
|
169
|
+
user_story_id: Annotated[str, typer.Argument(help="Scenario ID.")],
|
|
171
170
|
page: Annotated[int, typer.Option("--page", min=1)] = 1,
|
|
172
171
|
page_size: Annotated[int, typer.Option("--page-size", min=1, max=100)] = 50,
|
|
173
172
|
) -> None:
|
|
@@ -191,7 +190,10 @@ def list_files(
|
|
|
191
190
|
output(data, json_mode=True)
|
|
192
191
|
return
|
|
193
192
|
if not items:
|
|
194
|
-
print_info("No files bound to this
|
|
193
|
+
print_info("No files bound to this scenario.")
|
|
195
194
|
return
|
|
196
195
|
rows = [_binding_row(f) for f in items]
|
|
197
196
|
print_table(_FILE_BINDING_HEADERS, rows, title=f"Files bound to {user_story_id} ({len(items)})")
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
legacy_app = deprecated_alias(app, old_name="user-story-binding")
|
|
@@ -28,11 +28,11 @@ from minitest_cli.utils.output import output, print_error, print_info, print_suc
|
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
def create_user_story(
|
|
31
|
-
name: Annotated[str, typer.Option("--name", help="
|
|
31
|
+
name: Annotated[str, typer.Option("--name", help="Scenario name.")],
|
|
32
32
|
tag: TagOption = None,
|
|
33
33
|
user_story_type: LegacyTypeOption = None,
|
|
34
34
|
description: Annotated[
|
|
35
|
-
str | None, typer.Option("--description", help="
|
|
35
|
+
str | None, typer.Option("--description", help="Scenario description.")
|
|
36
36
|
] = None,
|
|
37
37
|
criteria: Annotated[
|
|
38
38
|
list[str] | None, typer.Option("--criteria", help="Acceptance criteria (repeatable).")
|
|
@@ -42,7 +42,7 @@ def create_user_story(
|
|
|
42
42
|
typer.Option(
|
|
43
43
|
"--depends-on",
|
|
44
44
|
help=(
|
|
45
|
-
"Parent
|
|
45
|
+
"Parent scenario IDs this scenario depends on (repeatable). "
|
|
46
46
|
"Validated server-side after creation: same-app, no cycles, "
|
|
47
47
|
"references must exist."
|
|
48
48
|
),
|
|
@@ -67,7 +67,7 @@ def create_user_story(
|
|
|
67
67
|
),
|
|
68
68
|
] = None,
|
|
69
69
|
) -> None:
|
|
70
|
-
"""Create a new
|
|
70
|
+
"""Create a new scenario."""
|
|
71
71
|
if idempotency_key is not None and not 1 <= len(idempotency_key) <= 255:
|
|
72
72
|
raise typer.BadParameter(
|
|
73
73
|
"must contain between 1 and 255 characters",
|
|
@@ -108,7 +108,7 @@ def create_user_story(
|
|
|
108
108
|
if depends_on:
|
|
109
109
|
story_id = created.get("id")
|
|
110
110
|
if not story_id:
|
|
111
|
-
print_error("Server did not return an id for the new
|
|
111
|
+
print_error("Server did not return an id for the new scenario.")
|
|
112
112
|
raise typer.Exit(code=1)
|
|
113
113
|
patch_resp = await client.patch(
|
|
114
114
|
f"{base_path(app_id)}/{story_id}",
|
|
@@ -120,7 +120,7 @@ def create_user_story(
|
|
|
120
120
|
|
|
121
121
|
data = run_api_call(_run())
|
|
122
122
|
if not json_mode:
|
|
123
|
-
print_success(f"
|
|
123
|
+
print_success(f"Scenario created: {data.get('id', '')}")
|
|
124
124
|
bound = format_bound_profiles(data)
|
|
125
125
|
if bound:
|
|
126
126
|
label = "Default profile auto-assigned" if not profile else "Profiles bound"
|
|
@@ -19,10 +19,10 @@ from minitest_cli.utils.output import output, print_error, print_success
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
def delete_user_story(
|
|
22
|
-
user_story_id: Annotated[str, typer.Argument(help="
|
|
22
|
+
user_story_id: Annotated[str, typer.Argument(help="Scenario ID.")],
|
|
23
23
|
force: Annotated[bool, typer.Option("--force", help="Skip confirmation.")] = False,
|
|
24
24
|
) -> None:
|
|
25
|
-
"""Delete a
|
|
25
|
+
"""Delete a scenario. Requires --force flag."""
|
|
26
26
|
settings = get_settings()
|
|
27
27
|
json_mode = is_json_mode()
|
|
28
28
|
require_auth(settings)
|
|
@@ -40,4 +40,4 @@ def delete_user_story(
|
|
|
40
40
|
if json_mode:
|
|
41
41
|
output({"deleted": True, "id": user_story_id}, json_mode=True)
|
|
42
42
|
else:
|
|
43
|
-
print_success(f"
|
|
43
|
+
print_success(f"Scenario deleted: {user_story_id}")
|
|
@@ -61,7 +61,7 @@ def extract_detail(resp: httpx.Response) -> str | None:
|
|
|
61
61
|
return body.get("message")
|
|
62
62
|
|
|
63
63
|
|
|
64
|
-
def handle_response_error(resp: httpx.Response, *, resource: str = "
|
|
64
|
+
def handle_response_error(resp: httpx.Response, *, resource: str = "Scenario") -> None:
|
|
65
65
|
if resp.status_code == 404:
|
|
66
66
|
detail = extract_detail(resp)
|
|
67
67
|
print_error(detail or f"{resource} not found.")
|
|
@@ -169,14 +169,13 @@ def format_pagination_info(
|
|
|
169
169
|
start = (current_page - 1) * current_page_size + 1
|
|
170
170
|
end = min(start + item_count - 1, total)
|
|
171
171
|
|
|
172
|
-
title = f"
|
|
172
|
+
title = f"Scenarios (Page {current_page} of {total_pages}, showing {start}-{end} of {total})"
|
|
173
173
|
|
|
174
174
|
tip = None
|
|
175
175
|
if current_page < total_pages:
|
|
176
176
|
next_page = current_page + 1
|
|
177
177
|
tip = (
|
|
178
|
-
f"\n💡 Tip: Use --page {next_page} to see more, "
|
|
179
|
-
f"or --all to fetch all {total} user stories"
|
|
178
|
+
f"\n💡 Tip: Use --page {next_page} to see more, or --all to fetch all {total} scenarios"
|
|
180
179
|
)
|
|
181
180
|
elif total > current_page_size and current_page_size < 100:
|
|
182
181
|
tip = f"\n💡 Tip: Use --all to fetch all {total} user stories in one request"
|