minitest-cli 0.32.0__tar.gz → 0.34.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.34.0}/PKG-INFO +32 -9
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/README.md +31 -8
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/pyproject.toml +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/app_skill.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/apps.py +2 -18
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/apps_dependencies.py +4 -4
- minitest_cli-0.34.0/src/minitest_cli/commands/apps_table.py +28 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/batch.py +26 -19
- minitest_cli-0.34.0/src/minitest_cli/commands/deprecated_alias.py +57 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/draft_feature.py +10 -6
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/draft_feature_apply.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/draft_feature_conflicts.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/draft_feature_helpers.py +3 -1
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/draft_feature_show.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/flow_types_write.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/issues.py +10 -8
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/issues_fix.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/issues_helpers.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/maintenance.py +3 -3
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/maintenance_callbacks.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/run.py +11 -9
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/run_cancel.py +13 -6
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/run_commit.py +17 -9
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/run_display.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/run_helpers.py +3 -3
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/run_recording.py +7 -2
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/run_recording_helpers.py +5 -3
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/skill.py +4 -1
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/tags_helpers.py +2 -1
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/test_profile.py +3 -1
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/test_profile_default.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/user_story.py +14 -10
- minitest_cli-0.34.0/src/minitest_cli/commands/user_story_app_skills.py +51 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/user_story_bindings.py +15 -44
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/user_story_create.py +6 -6
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/user_story_delete.py +3 -3
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/user_story_helpers.py +3 -4
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/user_story_modify.py +5 -5
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/user_story_setup_commit.py +7 -7
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/user_story_update.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/verdicts.py +3 -3
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/main.py +3 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/models/app.py +7 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/utils/dependency_sim.py +3 -3
- minitest_cli-0.34.0/tests/conftest.py +11 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_app_skill_commands.py +6 -3
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_apps_commands.py +15 -1
- minitest_cli-0.34.0/tests/test_deprecated_commands.py +86 -0
- minitest_cli-0.34.0/tests/test_deprecated_flags.py +102 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_draft_feature_commands.py +4 -4
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_issues.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_run_cancel.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_user_story_commands.py +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/uv.lock +1 -1
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/.env.example +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/.github/workflows/ci.yml +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/.github/workflows/install-scripts.yml +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/.github/workflows/release.yml +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/.gitignore +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/.opencode/skill/release/SKILL.md +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/AGENTS.md +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/RELEASE.md +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/install.ps1 +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/install.sh +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/pyrightconfig.json +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/renovate.json +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/__init__.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/api/__init__.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/api/apps_manager_client.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/api/client.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/api/errors.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/assets/__init__.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/assets/callback.html +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/__init__.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/_response_errors.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/app_knowledge.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/app_knowledge_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/app_skill_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/app_skill_secret.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/app_skill_write.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/apps_get.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/apps_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/auth.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/auth_api_key.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/batch_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/batch_warnings.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/build.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/build_commit.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/build_fix_prompts.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/build_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/capabilities.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/commit_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/env.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/env_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/flow_types.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/flow_types_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/init.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/init_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/init_playbook.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/issues_projection.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/issues_service.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/maintenance_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/maintenance_state.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/recording_timeline.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/run_commit_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/run_feedback.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/run_tagged.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/run_targets.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/screens.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/screens_detail.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/screens_format.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/screens_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/screens_tree.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/tags.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/test_file.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/test_file_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/test_file_list.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/test_profile_card.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/test_profile_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/test_profile_list.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/test_profile_update.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/upgrade.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/user_story_camera.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/user_story_criteria.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/user_story_criterion_edits.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/user_story_device_count.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/user_story_overrides.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/user_story_profiles.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/verdicts_helpers.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/verdicts_projection.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/core/__init__.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/core/app_context.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/core/auth.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/core/config.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/core/credentials.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/core/oauth.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/core/tenants.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/core/token_exchange.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/models/__init__.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/models/app_env_vars.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/models/app_failure.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/models/app_screen.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/models/base.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/models/batch.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/models/build.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/models/commit_build.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/models/draft_feature.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/models/flow_type.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/models/issues.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/models/recording.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/models/story_run.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/models/tag.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/models/targets.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/models/user_story.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/utils/__init__.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/utils/confirm.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/utils/mermaid.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/utils/output.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/utils/skill_refresh.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/utils/update_check.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/utils/video_frames.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/__init__.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/_commit_transport.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_api_client_auth.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_app_knowledge_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_apps_dependencies.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_auth.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_auth_api_key.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_auth_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_batch_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_build_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_build_fix_prompts.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_capabilities_command.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_channel_header.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_code_quality.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_commit_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_env.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_flow_types_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_init_command.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_issues_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_mermaid.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_native_device_types.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_network_errors.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_recording_timeline.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_response_errors.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_run_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_run_frames_command.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_screens_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_skill_command.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_suite_change_provenance.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_tags_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_test_file_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_test_profile_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_upgrade_command.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_user_story_bindings_commands.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_user_story_setup_commit.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_verdicts.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.0}/tests/test_verdicts_actionable.py +0 -0
- {minitest_cli-0.32.0 → minitest_cli-0.34.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.34.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,19 +167,42 @@ app defaults.
|
|
|
167
167
|
| ---------------- | ------------------------- |
|
|
168
168
|
| `minitest auth` | Authentication management |
|
|
169
169
|
| `minitest apps` | List, inspect, and create apps |
|
|
170
|
-
| `minitest
|
|
171
|
-
| `minitest
|
|
172
|
-
| `minitest
|
|
170
|
+
| `minitest scenario` | Create, update, list and delete scenarios |
|
|
171
|
+
| `minitest scenario-binding` | Bind test accounts, test files or app skills to scenarios |
|
|
172
|
+
| `minitest draft` | Drafts — branches of the test suite |
|
|
173
|
+
| `minitest test-profile` | Test profiles (Test accounts in the webapp) |
|
|
174
|
+
| `minitest tags` | List, create, update and delete scenario tags |
|
|
175
|
+
| `minitest app-skill` | App skills (Skills in the webapp): procedures Mini loads to arrange test state |
|
|
173
176
|
| `minitest screens` | Inspect the screens exploration mapped for an app |
|
|
174
177
|
| `minitest build` | Native iOS/Android build management |
|
|
175
|
-
| `minitest run` |
|
|
176
|
-
| `minitest
|
|
178
|
+
| `minitest run` | Start runs and inspect their scenario runs |
|
|
179
|
+
| `minitest batch` | List, inspect and cancel runs (a batch is a Run in the webapp) |
|
|
180
|
+
| `minitest issues` | Read app issues and their fix prompts, mark them fixed |
|
|
181
|
+
| `minitest maintenance` | CLI-only scenario maintenance against local code |
|
|
182
|
+
| `minitest skill` | Print the CLI skill for your AI coding agent (not app skills) |
|
|
183
|
+
|
|
184
|
+
### Deprecated names
|
|
185
|
+
|
|
186
|
+
Old names keep working as hidden aliases: they print a deprecation warning on
|
|
187
|
+
stderr and leave `--json` stdout unchanged. Switch to the new names.
|
|
188
|
+
|
|
189
|
+
| Deprecated | Use instead |
|
|
190
|
+
| ---------- | ----------- |
|
|
191
|
+
| `minitest user-story` | `minitest scenario` |
|
|
192
|
+
| `minitest user-story-binding` | `minitest scenario-binding` |
|
|
193
|
+
| `minitest scenario-binding set-skills` | `minitest scenario-binding set-app-skills` |
|
|
194
|
+
| `minitest df` | `minitest draft` |
|
|
195
|
+
| `minitest flow-types` | `minitest tags` |
|
|
196
|
+
| `run from-commit --user-story` / `-u` | `run from-commit --scenario` / `-s` |
|
|
197
|
+
| `batch list --user-story-id` | `batch list --scenario` |
|
|
198
|
+
| `run cancel --srp`, `run recording --srp` | `--target-id` |
|
|
199
|
+
| `--type` on `scenario create/update/list` | `--tag` |
|
|
177
200
|
|
|
178
201
|
## CLI-only maintenance
|
|
179
202
|
|
|
180
|
-
`minitest maintenance` lets a coding agent keep Minitest
|
|
203
|
+
`minitest maintenance` lets a coding agent keep Minitest scenarios in sync
|
|
181
204
|
without connecting GitHub. Run it from the app repository: the code stays on the
|
|
182
|
-
machine, while the CLI sends only proposed
|
|
205
|
+
machine, while the CLI sends only proposed scenario edits and the local HEAD SHA.
|
|
183
206
|
|
|
184
207
|
```bash
|
|
185
208
|
# Print the server-composed maintenance instructions for your coding agent
|
|
@@ -189,7 +212,7 @@ minitest maintenance --agent
|
|
|
189
212
|
minitest --json maintenance context
|
|
190
213
|
minitest maintenance affected --file affected.json
|
|
191
214
|
minitest maintenance change --file change.json
|
|
192
|
-
minitest maintenance status --phase writing --message "Updating affected
|
|
215
|
+
minitest maintenance status --phase writing --message "Updating affected scenarios"
|
|
193
216
|
minitest maintenance complete --changed
|
|
194
217
|
|
|
195
218
|
# Apply proposed edits now, or open the web review queue
|
|
@@ -134,19 +134,42 @@ app defaults.
|
|
|
134
134
|
| ---------------- | ------------------------- |
|
|
135
135
|
| `minitest auth` | Authentication management |
|
|
136
136
|
| `minitest apps` | List, inspect, and create apps |
|
|
137
|
-
| `minitest
|
|
138
|
-
| `minitest
|
|
139
|
-
| `minitest
|
|
137
|
+
| `minitest scenario` | Create, update, list and delete scenarios |
|
|
138
|
+
| `minitest scenario-binding` | Bind test accounts, test files or app skills to scenarios |
|
|
139
|
+
| `minitest draft` | Drafts — branches of the test suite |
|
|
140
|
+
| `minitest test-profile` | Test profiles (Test accounts in the webapp) |
|
|
141
|
+
| `minitest tags` | List, create, update and delete scenario tags |
|
|
142
|
+
| `minitest app-skill` | App skills (Skills in the webapp): procedures Mini loads to arrange test state |
|
|
140
143
|
| `minitest screens` | Inspect the screens exploration mapped for an app |
|
|
141
144
|
| `minitest build` | Native iOS/Android build management |
|
|
142
|
-
| `minitest run` |
|
|
143
|
-
| `minitest
|
|
145
|
+
| `minitest run` | Start runs and inspect their scenario runs |
|
|
146
|
+
| `minitest batch` | List, inspect and cancel runs (a batch is a Run in the webapp) |
|
|
147
|
+
| `minitest issues` | Read app issues and their fix prompts, mark them fixed |
|
|
148
|
+
| `minitest maintenance` | CLI-only scenario maintenance against local code |
|
|
149
|
+
| `minitest skill` | Print the CLI skill for your AI coding agent (not app skills) |
|
|
150
|
+
|
|
151
|
+
### Deprecated names
|
|
152
|
+
|
|
153
|
+
Old names keep working as hidden aliases: they print a deprecation warning on
|
|
154
|
+
stderr and leave `--json` stdout unchanged. Switch to the new names.
|
|
155
|
+
|
|
156
|
+
| Deprecated | Use instead |
|
|
157
|
+
| ---------- | ----------- |
|
|
158
|
+
| `minitest user-story` | `minitest scenario` |
|
|
159
|
+
| `minitest user-story-binding` | `minitest scenario-binding` |
|
|
160
|
+
| `minitest scenario-binding set-skills` | `minitest scenario-binding set-app-skills` |
|
|
161
|
+
| `minitest df` | `minitest draft` |
|
|
162
|
+
| `minitest flow-types` | `minitest tags` |
|
|
163
|
+
| `run from-commit --user-story` / `-u` | `run from-commit --scenario` / `-s` |
|
|
164
|
+
| `batch list --user-story-id` | `batch list --scenario` |
|
|
165
|
+
| `run cancel --srp`, `run recording --srp` | `--target-id` |
|
|
166
|
+
| `--type` on `scenario create/update/list` | `--tag` |
|
|
144
167
|
|
|
145
168
|
## CLI-only maintenance
|
|
146
169
|
|
|
147
|
-
`minitest maintenance` lets a coding agent keep Minitest
|
|
170
|
+
`minitest maintenance` lets a coding agent keep Minitest scenarios in sync
|
|
148
171
|
without connecting GitHub. Run it from the app repository: the code stays on the
|
|
149
|
-
machine, while the CLI sends only proposed
|
|
172
|
+
machine, while the CLI sends only proposed scenario edits and the local HEAD SHA.
|
|
150
173
|
|
|
151
174
|
```bash
|
|
152
175
|
# Print the server-composed maintenance instructions for your coding agent
|
|
@@ -156,7 +179,7 @@ minitest maintenance --agent
|
|
|
156
179
|
minitest --json maintenance context
|
|
157
180
|
minitest maintenance affected --file affected.json
|
|
158
181
|
minitest maintenance change --file change.json
|
|
159
|
-
minitest maintenance status --phase writing --message "Updating affected
|
|
182
|
+
minitest maintenance status --phase writing --message "Updating affected scenarios"
|
|
160
183
|
minitest maintenance complete --changed
|
|
161
184
|
|
|
162
185
|
# Apply proposed edits now, or open the web review queue
|
|
@@ -21,7 +21,7 @@ from minitest_cli.utils.output import print_info, print_json, print_success, pri
|
|
|
21
21
|
|
|
22
22
|
app = typer.Typer(
|
|
23
23
|
name="app-skill",
|
|
24
|
-
help="Manage app skills: procedures Mini loads to arrange test state.",
|
|
24
|
+
help="Manage app skills (Skills in the webapp): procedures Mini loads to arrange test state.",
|
|
25
25
|
no_args_is_help=True,
|
|
26
26
|
)
|
|
27
27
|
app.add_typer(app_skill_secret.app)
|
|
@@ -12,6 +12,7 @@ from minitest_cli.api.client import ApiClient
|
|
|
12
12
|
from minitest_cli.api.errors import format_network_error
|
|
13
13
|
from minitest_cli.commands import apps_dependencies, apps_get
|
|
14
14
|
from minitest_cli.commands.apps_helpers import create_app_request
|
|
15
|
+
from minitest_cli.commands.apps_table import APP_TABLE_HEADERS, app_row
|
|
15
16
|
from minitest_cli.core.auth import require_auth
|
|
16
17
|
from minitest_cli.core.config import Settings
|
|
17
18
|
from minitest_cli.core.tenants import fetch_user_tenants, resolve_tenant_id
|
|
@@ -36,22 +37,6 @@ def _callback() -> None:
|
|
|
36
37
|
"""App management."""
|
|
37
38
|
|
|
38
39
|
|
|
39
|
-
APP_TABLE_HEADERS = ["ID", "Name", "Platform"]
|
|
40
|
-
|
|
41
|
-
_PLATFORM_LABELS: dict[str, str] = {
|
|
42
|
-
"android": "Android",
|
|
43
|
-
"ios": "iOS",
|
|
44
|
-
"web": "Web",
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
def _format_platforms(values: list[str]) -> str:
|
|
49
|
-
"""Render an app's platform lanes for the table."""
|
|
50
|
-
if not values:
|
|
51
|
-
return "—"
|
|
52
|
-
return ", ".join(_PLATFORM_LABELS.get(v, v) for v in values)
|
|
53
|
-
|
|
54
|
-
|
|
55
40
|
def _get_settings() -> Settings:
|
|
56
41
|
return typer.Context.settings # type: ignore[attr-defined]
|
|
57
42
|
|
|
@@ -92,8 +77,7 @@ def list_apps() -> None:
|
|
|
92
77
|
print_json([a.model_dump(mode="json", by_alias=True) for a in data.apps])
|
|
93
78
|
return
|
|
94
79
|
|
|
95
|
-
|
|
96
|
-
print_table(APP_TABLE_HEADERS, rows, title="Apps")
|
|
80
|
+
print_table(APP_TABLE_HEADERS, [app_row(a) for a in data.apps], title="Apps")
|
|
97
81
|
|
|
98
82
|
|
|
99
83
|
@app.command(name="create")
|
|
@@ -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
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""Rows of the `apps list` table."""
|
|
2
|
+
|
|
3
|
+
from minitest_cli.models.app import AppResponse
|
|
4
|
+
|
|
5
|
+
APP_TABLE_HEADERS = ["ID", "Name", "Platform", "Repository", "Folder"]
|
|
6
|
+
|
|
7
|
+
_PLATFORM_LABELS: dict[str, str] = {
|
|
8
|
+
"android": "Android",
|
|
9
|
+
"ios": "iOS",
|
|
10
|
+
"web": "Web",
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _format_platforms(values: list[str]) -> str:
|
|
15
|
+
if not values:
|
|
16
|
+
return "—"
|
|
17
|
+
return ", ".join(_PLATFORM_LABELS.get(v, v) for v in values)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def app_row(app: AppResponse) -> list[str]:
|
|
21
|
+
repo = app.repository
|
|
22
|
+
return [
|
|
23
|
+
app.id,
|
|
24
|
+
app.name,
|
|
25
|
+
_format_platforms(app.platforms),
|
|
26
|
+
repo.full_name if repo else "—",
|
|
27
|
+
(repo.folder or "/") if repo else "—",
|
|
28
|
+
]
|
|
@@ -7,6 +7,7 @@ import typer
|
|
|
7
7
|
|
|
8
8
|
from minitest_cli.api.client import ApiClient
|
|
9
9
|
from minitest_cli.commands.batch_helpers import batches_base_path
|
|
10
|
+
from minitest_cli.commands.deprecated_alias import deprecated_option, merge_deprecated_option
|
|
10
11
|
from minitest_cli.commands.run_display import _derive_run_status
|
|
11
12
|
from minitest_cli.commands.run_helpers import (
|
|
12
13
|
ensure_uuid,
|
|
@@ -26,7 +27,7 @@ from minitest_cli.utils.output import (
|
|
|
26
27
|
print_table,
|
|
27
28
|
)
|
|
28
29
|
|
|
29
|
-
app = typer.Typer(name="batch", help="
|
|
30
|
+
app = typer.Typer(name="batch", help="List, inspect and cancel runs (Runs in the webapp).")
|
|
30
31
|
|
|
31
32
|
BATCH_TABLE_HEADERS = ["ID", "Status", "Source", "Commit", "Tag", "Targets", "Created"]
|
|
32
33
|
|
|
@@ -57,26 +58,32 @@ def list_batches(
|
|
|
57
58
|
typer.Option("--result", help="Filter by derived result (repeatable)."),
|
|
58
59
|
] = None,
|
|
59
60
|
commit_sha: Annotated[str | None, typer.Option("--commit-sha")] = None,
|
|
60
|
-
|
|
61
|
+
scenario_id: Annotated[
|
|
62
|
+
str | None, typer.Option("--scenario", help="Only runs that include this scenario ID.")
|
|
63
|
+
] = None,
|
|
64
|
+
legacy_user_story_id: Annotated[
|
|
65
|
+
str | None, deprecated_option("--user-story-id", new_flag="--scenario")
|
|
66
|
+
] = None,
|
|
61
67
|
search: Annotated[str | None, typer.Option("--search")] = None,
|
|
62
68
|
all_pages: Annotated[bool, typer.Option("--all", help="Fetch all pages.")] = False,
|
|
63
69
|
) -> None:
|
|
64
|
-
"""List batches
|
|
70
|
+
"""List the runs (batches) of the current app."""
|
|
65
71
|
settings, app_id, json_mode = resolve_app()
|
|
66
72
|
if all_pages:
|
|
67
73
|
page, page_size = 1, 100
|
|
68
74
|
|
|
75
|
+
scenario_id = merge_deprecated_option(
|
|
76
|
+
scenario_id, legacy_user_story_id, old_flag="--user-story-id", new_flag="--scenario"
|
|
77
|
+
)
|
|
78
|
+
filters = {
|
|
79
|
+
"status": status_filter,
|
|
80
|
+
"result": result_filter,
|
|
81
|
+
"commit_sha": commit_sha,
|
|
82
|
+
"user_story_id": scenario_id,
|
|
83
|
+
"search": search,
|
|
84
|
+
}
|
|
69
85
|
params: dict[str, object] = {"page": page, "page_size": page_size}
|
|
70
|
-
if
|
|
71
|
-
params["status"] = status_filter
|
|
72
|
-
if result_filter:
|
|
73
|
-
params["result"] = result_filter
|
|
74
|
-
if commit_sha:
|
|
75
|
-
params["commit_sha"] = commit_sha
|
|
76
|
-
if user_story_id:
|
|
77
|
-
params["user_story_id"] = user_story_id
|
|
78
|
-
if search:
|
|
79
|
-
params["search"] = search
|
|
86
|
+
params.update({key: value for key, value in filters.items() if value})
|
|
80
87
|
|
|
81
88
|
async def _list() -> BatchListResponse:
|
|
82
89
|
async with ApiClient(settings) as client:
|
|
@@ -108,9 +115,9 @@ def list_batches(
|
|
|
108
115
|
|
|
109
116
|
@app.command(name="get")
|
|
110
117
|
def get_batch(
|
|
111
|
-
batch_id: Annotated[str, typer.Argument(help="
|
|
118
|
+
batch_id: Annotated[str, typer.Argument(help="Run (batch) ID.")],
|
|
112
119
|
) -> None:
|
|
113
|
-
"""Get
|
|
120
|
+
"""Get one run (batch) with its scenario runs."""
|
|
114
121
|
settings, app_id, json_mode = resolve_app()
|
|
115
122
|
ensure_uuid(batch_id, kind="batch id")
|
|
116
123
|
|
|
@@ -165,17 +172,17 @@ def get_batch(
|
|
|
165
172
|
)
|
|
166
173
|
if rows:
|
|
167
174
|
print_table(
|
|
168
|
-
["Run ID", "
|
|
175
|
+
["Run ID", "Scenario", "Status", "Created"],
|
|
169
176
|
rows,
|
|
170
|
-
title=f"
|
|
177
|
+
title=f"Scenario runs ({len(rows)})",
|
|
171
178
|
)
|
|
172
179
|
|
|
173
180
|
|
|
174
181
|
@app.command()
|
|
175
182
|
def cancel(
|
|
176
|
-
batch_id: Annotated[str, typer.Argument(help="
|
|
183
|
+
batch_id: Annotated[str, typer.Argument(help="Run (batch) ID to cancel.")],
|
|
177
184
|
) -> None:
|
|
178
|
-
"""Cancel a batch and all its pending/running
|
|
185
|
+
"""Cancel a run (batch) and all its pending/running scenario runs."""
|
|
179
186
|
settings, app_id, json_mode = resolve_app()
|
|
180
187
|
ensure_uuid(batch_id, kind="batch id")
|
|
181
188
|
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import functools
|
|
2
|
+
from collections.abc import Callable
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
import typer
|
|
6
|
+
|
|
7
|
+
from minitest_cli.utils.output import print_error, print_warning
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def deprecated_alias(source: typer.Typer, *, old_name: str) -> typer.Typer:
|
|
11
|
+
"""Expose ``source``'s commands under a hidden legacy name that warns on stderr."""
|
|
12
|
+
new_name = source.info.name
|
|
13
|
+
alias = typer.Typer(name=old_name, help=f"Deprecated: use `minitest {new_name}`.", hidden=True)
|
|
14
|
+
|
|
15
|
+
@alias.callback()
|
|
16
|
+
def _warn() -> None:
|
|
17
|
+
print_warning(f"`minitest {old_name}` is deprecated; use `minitest {new_name}` instead.")
|
|
18
|
+
|
|
19
|
+
alias.registered_commands = source.registered_commands
|
|
20
|
+
return alias
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def deprecated_command(
|
|
24
|
+
group: typer.Typer, command: Callable[..., Any], *, old_name: str, new_name: str
|
|
25
|
+
) -> None:
|
|
26
|
+
"""Register ``command`` again under a hidden legacy subcommand name that warns on stderr."""
|
|
27
|
+
group_name = group.info.name
|
|
28
|
+
|
|
29
|
+
@functools.wraps(command)
|
|
30
|
+
def _legacy(*args: Any, **kwargs: Any) -> Any:
|
|
31
|
+
print_warning(
|
|
32
|
+
f"`minitest {group_name} {old_name}` is deprecated; "
|
|
33
|
+
f"use `minitest {group_name} {new_name}` instead."
|
|
34
|
+
)
|
|
35
|
+
return command(*args, **kwargs)
|
|
36
|
+
|
|
37
|
+
group.command(name=old_name, hidden=True, help=f"Deprecated: use `{new_name}`.")(_legacy)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def deprecated_option(*param_decls: str, new_flag: str) -> Any:
|
|
41
|
+
"""A hidden option kept for a renamed flag; pair it with ``merge_deprecated_option``."""
|
|
42
|
+
return typer.Option(*param_decls, hidden=True, help=f"Deprecated alias for {new_flag}.")
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def merge_deprecated_option[T](
|
|
46
|
+
new: T | None, old: T | None, *, old_flag: str, new_flag: str
|
|
47
|
+
) -> T | None:
|
|
48
|
+
"""Return the renamed flag's value, falling back to its deprecated alias with a warning."""
|
|
49
|
+
if old is None:
|
|
50
|
+
return new
|
|
51
|
+
print_warning(f"{old_flag} is deprecated; use {new_flag} instead.")
|
|
52
|
+
if new is None:
|
|
53
|
+
return old
|
|
54
|
+
if isinstance(new, list) and isinstance(old, list):
|
|
55
|
+
return [*new, *old] # type: ignore[return-value]
|
|
56
|
+
print_error(f"Use either {new_flag} or {old_flag}, not both.")
|
|
57
|
+
raise typer.Exit(code=1)
|
|
@@ -11,6 +11,7 @@ import typer
|
|
|
11
11
|
|
|
12
12
|
from minitest_cli.api.client import ApiClient
|
|
13
13
|
from minitest_cli.commands import draft_feature_apply, draft_feature_show
|
|
14
|
+
from minitest_cli.commands.deprecated_alias import deprecated_alias
|
|
14
15
|
from minitest_cli.commands.draft_feature_helpers import (
|
|
15
16
|
DRAFT_FEATURE_TABLE_HEADERS,
|
|
16
17
|
base_path,
|
|
@@ -21,7 +22,7 @@ from minitest_cli.commands.run_helpers import ensure_uuid, resolve_app, run_api_
|
|
|
21
22
|
from minitest_cli.models.draft_feature import DraftFeatureResponse, DraftFeatureStatus
|
|
22
23
|
from minitest_cli.utils.output import output, print_error, print_info, print_success, print_table
|
|
23
24
|
|
|
24
|
-
app = typer.Typer(name="
|
|
25
|
+
app = typer.Typer(name="draft", help="Drafts — branches of the app's test suite.")
|
|
25
26
|
draft_feature_show.register(app)
|
|
26
27
|
draft_feature_apply.register(app)
|
|
27
28
|
|
|
@@ -42,7 +43,7 @@ def list_draft_features(
|
|
|
42
43
|
async def _list() -> list[DraftFeatureResponse]:
|
|
43
44
|
async with ApiClient(settings) as client:
|
|
44
45
|
resp = await client.get(base_path(app_id), params=params)
|
|
45
|
-
handle_response_error(resp, resource="
|
|
46
|
+
handle_response_error(resp, resource="Drafts")
|
|
46
47
|
return [DraftFeatureResponse.model_validate(item) for item in resp.json()]
|
|
47
48
|
|
|
48
49
|
features = run_api_call(_list())
|
|
@@ -51,12 +52,12 @@ def list_draft_features(
|
|
|
51
52
|
output([f.model_dump(mode="json", by_alias=True) for f in features], json_mode=True)
|
|
52
53
|
return
|
|
53
54
|
if not features:
|
|
54
|
-
print_info("No
|
|
55
|
+
print_info("No drafts found.")
|
|
55
56
|
return
|
|
56
57
|
print_table(
|
|
57
58
|
DRAFT_FEATURE_TABLE_HEADERS,
|
|
58
59
|
[format_draft_feature_row(f) for f in features],
|
|
59
|
-
title=f"
|
|
60
|
+
title=f"Drafts ({len(features)})",
|
|
60
61
|
)
|
|
61
62
|
|
|
62
63
|
|
|
@@ -88,7 +89,7 @@ def create_draft_feature(
|
|
|
88
89
|
|
|
89
90
|
feature = run_api_call(_create())
|
|
90
91
|
if not json_mode:
|
|
91
|
-
print_success(f"Draft
|
|
92
|
+
print_success(f"Draft created: {feature.id}")
|
|
92
93
|
output(feature.model_dump(mode="json", by_alias=True), json_mode=json_mode)
|
|
93
94
|
|
|
94
95
|
|
|
@@ -114,4 +115,7 @@ def delete_draft_feature(
|
|
|
114
115
|
if json_mode:
|
|
115
116
|
output(feature.model_dump(mode="json", by_alias=True), json_mode=True)
|
|
116
117
|
else:
|
|
117
|
-
print_success(f"Draft
|
|
118
|
+
print_success(f"Draft abandoned: {feature.id} (status: {feature.status.value})")
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
legacy_app = deprecated_alias(app, old_name="df")
|
{minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/draft_feature_conflicts.py
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Rendering for `minitest
|
|
1
|
+
"""Rendering for `minitest draft show --view conflicts`.
|
|
2
2
|
|
|
3
3
|
The three sides of a conflict are whole story tuples, so printing them as three
|
|
4
4
|
JSON blobs in a table makes the one thing a resolver needs — which key is in
|
{minitest_cli-0.32.0 → minitest_cli-0.34.0}/src/minitest_cli/commands/draft_feature_helpers.py
RENAMED
|
@@ -59,7 +59,9 @@ def handle_response_error(resp: httpx.Response, *, resource: str = "Draft featur
|
|
|
59
59
|
if resp.status_code == 409:
|
|
60
60
|
detail = extract_detail(resp)
|
|
61
61
|
print_error(detail or f"{resource} changed since it was read.")
|
|
62
|
-
print_info(
|
|
62
|
+
print_info(
|
|
63
|
+
"Re-run `draft show --view diff`, rebuild against the mainRev it returns, retry."
|
|
64
|
+
)
|
|
63
65
|
raise typer.Exit(code=EXIT_CONFLICT)
|
|
64
66
|
if resp.status_code >= 400:
|
|
65
67
|
detail = extract_detail(resp)
|
|
@@ -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
|
"""
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Commands for reading app
|
|
1
|
+
"""Commands for reading app issues, their fix prompts, and closing them."""
|
|
2
2
|
|
|
3
3
|
from enum import StrEnum
|
|
4
4
|
from typing import Annotated
|
|
@@ -23,27 +23,29 @@ class IssueCriticality(StrEnum):
|
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
app = typer.Typer(
|
|
26
|
-
name="issues", help="Read app
|
|
26
|
+
name="issues", help="Read app issues, fix prompts, and mark them fixed.", no_args_is_help=True
|
|
27
27
|
)
|
|
28
28
|
app.command()(fix)
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
@app.command("list")
|
|
32
32
|
def list_issues(
|
|
33
|
-
issue: Annotated[str | None, typer.Option("--issue", help="Scope to one
|
|
34
|
-
run: Annotated[str | None, typer.Option("--run", help="Scope to one
|
|
35
|
-
batch: Annotated[
|
|
33
|
+
issue: Annotated[str | None, typer.Option("--issue", help="Scope to one issue ID.")] = None,
|
|
34
|
+
run: Annotated[str | None, typer.Option("--run", help="Scope to one scenario run ID.")] = None,
|
|
35
|
+
batch: Annotated[
|
|
36
|
+
str | None, typer.Option("--batch", help="Scope to one run (batch) ID.")
|
|
37
|
+
] = None,
|
|
36
38
|
platform: Annotated[
|
|
37
39
|
IssuePlatform | None, typer.Option(help="Filter by execution platform.")
|
|
38
40
|
] = None,
|
|
39
41
|
criticality: Annotated[
|
|
40
|
-
IssueCriticality | None, typer.Option(help="Filter by
|
|
42
|
+
IssueCriticality | None, typer.Option(help="Filter by issue criticality.")
|
|
41
43
|
] = None,
|
|
42
44
|
include_resolved: Annotated[
|
|
43
|
-
bool, typer.Option("--include-resolved", help="Include resolved
|
|
45
|
+
bool, typer.Option("--include-resolved", help="Include resolved issues.")
|
|
44
46
|
] = False,
|
|
45
47
|
) -> None:
|
|
46
|
-
"""Return scoped
|
|
48
|
+
"""Return scoped issues, build provenance, fix prompts, and deeplinks as JSON."""
|
|
47
49
|
scopes = {"issue": issue, "run": run, "batch": batch}
|
|
48
50
|
selected = [(kind, value) for kind, value in scopes.items() if value is not None]
|
|
49
51
|
if len(selected) > 1:
|
|
@@ -74,7 +74,7 @@ def fix(
|
|
|
74
74
|
typer.Argument(help="One or more app-failure IDs to mark as fixed."),
|
|
75
75
|
],
|
|
76
76
|
) -> None:
|
|
77
|
-
"""Mark
|
|
77
|
+
"""Mark issues as fixed, reporting one result per ID."""
|
|
78
78
|
settings, app_id, _ = resolve_app()
|
|
79
79
|
results, exit_codes = run_api_call(_fix_issues(settings, app_id, issue_ids))
|
|
80
80
|
fixed = sum(result["status"] == "fixed" for result in results)
|
|
@@ -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)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""`minitest maintenance` — keep
|
|
1
|
+
"""`minitest maintenance` — keep scenarios in sync with local app code, no GitHub.
|
|
2
2
|
|
|
3
3
|
The customer's own coding agent runs the reasoning locally against their checkout;
|
|
4
4
|
only the proposed criteria edits and an opaque commit sha reach Minitest. The maintenance
|
|
@@ -41,7 +41,7 @@ from minitest_cli.utils.output import (
|
|
|
41
41
|
|
|
42
42
|
app = typer.Typer(
|
|
43
43
|
name="maintenance",
|
|
44
|
-
help="
|
|
44
|
+
help="Keep scenarios in sync with local app code (CLI-only, no GitHub).",
|
|
45
45
|
)
|
|
46
46
|
register_callback_commands(app)
|
|
47
47
|
|
|
@@ -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.34.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()
|