minitest-cli 0.41.0__tar.gz → 0.43.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.41.0 → minitest_cli-0.43.0}/.github/workflows/release.yml +0 -50
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/AGENTS.md +2 -1
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/PKG-INFO +76 -7
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/README.md +75 -6
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/RELEASE.md +4 -14
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/pyproject.toml +1 -1
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/app_network_helpers.py +9 -4
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/apps.py +2 -0
- minitest_cli-0.43.0/src/minitest_cli/commands/backend_api.py +152 -0
- minitest_cli-0.43.0/src/minitest_cli/commands/backend_api_helpers.py +93 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/run.py +34 -11
- minitest_cli-0.43.0/src/minitest_cli/commands/run_backend_override.py +30 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/run_commit.py +8 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/run_tagged.py +43 -5
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/upgrade.py +16 -28
- minitest_cli-0.43.0/src/minitest_cli/commands/upgrade_auto.py +81 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/main.py +3 -2
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/models/batch.py +8 -0
- minitest_cli-0.43.0/src/minitest_cli/utils/auto_update.py +156 -0
- minitest_cli-0.43.0/src/minitest_cli/utils/auto_update_notices.py +41 -0
- minitest_cli-0.43.0/src/minitest_cli/utils/auto_update_state.py +163 -0
- minitest_cli-0.43.0/src/minitest_cli/utils/auto_update_worker.py +135 -0
- minitest_cli-0.43.0/src/minitest_cli/utils/update_check.py +116 -0
- minitest_cli-0.43.0/src/minitest_cli/utils/versions.py +14 -0
- minitest_cli-0.43.0/tests/_backend_api_server.py +101 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/conftest.py +2 -0
- minitest_cli-0.43.0/tests/test_auto_update.py +189 -0
- minitest_cli-0.43.0/tests/test_auto_update_worker.py +213 -0
- minitest_cli-0.43.0/tests/test_backend_api_commands.py +96 -0
- minitest_cli-0.43.0/tests/test_backend_api_openapi_auth.py +104 -0
- minitest_cli-0.43.0/tests/test_run_backend_override.py +57 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_run_commands.py +101 -0
- minitest_cli-0.43.0/tests/test_upgrade_auto_command.py +88 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_upgrade_command.py +5 -30
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/uv.lock +4 -4
- minitest_cli-0.41.0/src/minitest_cli/utils/update_check.py +0 -110
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/.env.example +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/.github/workflows/ci.yml +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/.github/workflows/install-scripts.yml +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/.gitignore +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/.opencode/skill/release/SKILL.md +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/install.ps1 +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/install.sh +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/pyrightconfig.json +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/renovate.json +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/__init__.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/api/__init__.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/api/apps_manager_client.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/api/client.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/api/errors.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/assets/__init__.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/assets/callback.html +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/__init__.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/_abi_mismatch.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/_response_errors.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/app_knowledge.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/app_knowledge_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/app_skill.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/app_skill_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/app_skill_secret.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/app_skill_write.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/apps_dependencies.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/apps_get.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/apps_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/apps_table.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/auth.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/auth_api_key.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/batch.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/batch_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/batch_warnings.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/build.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/build_bundle.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/build_commit.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/build_conversion.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/build_fix_prompts.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/build_get.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/build_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/build_signing.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/capabilities.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/commit_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/deprecated_alias.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/draft.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/draft_asks.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/draft_conversation.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/draft_create.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/draft_feature.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/draft_feature_apply.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/draft_feature_conflicts.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/draft_feature_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/draft_feature_show.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/draft_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/draft_legacy.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/draft_lifecycle.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/draft_pr.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/draft_render.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/draft_update.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/draft_watch.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/env.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/env_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/flow_types.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/flow_types_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/flow_types_write.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/glossary.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/init.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/init_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/init_playbook.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/issues.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/issues_fix.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/issues_get.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/issues_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/issues_projection.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/issues_service.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/knowledge.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/knowledge_documents.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/knowledge_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/private_network.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/private_network_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/recording_timeline.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/residential_proxy.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/run_cancel.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/run_commit_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/run_display.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/run_feedback.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/run_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/run_list.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/run_logs.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/run_recording.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/run_recording_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/run_targets.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/schedules.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/schedules_body.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/schedules_create.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/schedules_display.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/schedules_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/schedules_history.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/schedules_options.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/schedules_scope.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/schedules_spec.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/schedules_update.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/schedules_where.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/screens.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/screens_detail.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/screens_format.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/screens_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/screens_tree.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/secret.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/secret_create.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/secret_extract.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/secret_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/secret_lint.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/secret_manage.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/secret_state.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/secret_value.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/skill.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/tags.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/tags_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/test_file.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/test_file_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/test_file_list.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/test_profile.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/test_profile_card.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/test_profile_default.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/test_profile_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/test_profile_list.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/test_profile_secret_refs.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/test_profile_update.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/user_story.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/user_story_app_skills.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/user_story_bindings.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/user_story_camera.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/user_story_create.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/user_story_criteria.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/user_story_criterion_edits.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/user_story_delete.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/user_story_device_count.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/user_story_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/user_story_iap.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/user_story_modify.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/user_story_overrides.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/user_story_profiles.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/user_story_setup_commit.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/user_story_update.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/verdicts.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/verdicts_helpers.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/verdicts_projection.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/core/__init__.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/core/app_context.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/core/auth.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/core/config.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/core/credentials.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/core/oauth.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/core/tenants.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/core/token_exchange.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/models/__init__.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/models/app.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/models/app_env_vars.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/models/app_failure.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/models/app_screen.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/models/base.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/models/build.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/models/commit_build.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/models/draft_feature.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/models/flow_type.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/models/issues.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/models/lane_logs.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/models/recording.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/models/story_run.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/models/tag.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/models/targets.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/models/user_story.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/utils/__init__.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/utils/confirm.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/utils/dependency_sim.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/utils/mermaid.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/utils/output.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/utils/skill_refresh.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/utils/video_frames.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/__init__.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/_commit_transport.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/_network_settings_server.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/_secret_router.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/draft_backend.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_api_client_auth.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_app_context.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_app_knowledge_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_app_skill_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_apps_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_apps_dependencies.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_auth.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_auth_api_key.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_auth_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_batch_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_build_bundle.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_build_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_build_fix_prompts.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_build_get_command.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_capabilities_command.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_channel_header.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_code_quality.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_commit_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_config_defaults.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_deprecated_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_deprecated_flags.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_draft_ask_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_draft_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_draft_conversation_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_draft_feature_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_draft_pr_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_env.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_flow_types_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_init_command.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_issues.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_issues_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_issues_get_command.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_knowledge_v2_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_mermaid.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_native_device_types.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_network_errors.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_physical_devices.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_private_network_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_recording_timeline.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_residential_proxy_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_response_errors.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_run_cancel.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_run_frames_command.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_run_logs_command.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_schedules_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_screens_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_secret_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_secret_create.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_secret_lint_extract.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_skill_command.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_suite_change_provenance.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_tags_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_test_file_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_test_profile_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_test_profile_secret_refs.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_user_story_bindings_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_user_story_commands.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_user_story_in_app_purchases.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_user_story_setup_commit.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_verdicts.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_verdicts_actionable.py +0 -0
- {minitest_cli-0.41.0 → minitest_cli-0.43.0}/tests/test_version.py +0 -0
|
@@ -78,53 +78,3 @@ jobs:
|
|
|
78
78
|
with:
|
|
79
79
|
generate_release_notes: true
|
|
80
80
|
files: dist/*
|
|
81
|
-
|
|
82
|
-
update-homebrew:
|
|
83
|
-
needs: publish-pypi
|
|
84
|
-
runs-on: ubuntu-latest
|
|
85
|
-
steps:
|
|
86
|
-
- name: Fetch PyPI metadata
|
|
87
|
-
id: pypi
|
|
88
|
-
run: |
|
|
89
|
-
VERSION="${GITHUB_REF_NAME#v}"
|
|
90
|
-
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
|
|
91
|
-
|
|
92
|
-
echo "Waiting for minitest-cli $VERSION to be available on PyPI..."
|
|
93
|
-
for i in $(seq 1 30); do
|
|
94
|
-
if curl -sSf --connect-timeout 5 --max-time 15 \
|
|
95
|
-
"https://pypi.org/pypi/minitest-cli/$VERSION/json" -o /tmp/pypi.json.tmp; then
|
|
96
|
-
mv /tmp/pypi.json.tmp /tmp/pypi.json
|
|
97
|
-
echo "Package is available on PyPI"
|
|
98
|
-
break
|
|
99
|
-
fi
|
|
100
|
-
echo "Attempt $i/30 - not yet available, waiting 10s..."
|
|
101
|
-
sleep 10
|
|
102
|
-
done
|
|
103
|
-
|
|
104
|
-
if [ ! -f /tmp/pypi.json ]; then
|
|
105
|
-
echo "::error::Package not found on PyPI after 5 minutes"
|
|
106
|
-
exit 1
|
|
107
|
-
fi
|
|
108
|
-
|
|
109
|
-
SDIST_URL=$(jq -r '.urls[] | select(.packagetype == "sdist") | .url' /tmp/pypi.json)
|
|
110
|
-
SDIST_SHA256=$(jq -r '.urls[] | select(.packagetype == "sdist") | .digests.sha256' /tmp/pypi.json)
|
|
111
|
-
if [ -z "$SDIST_URL" ] || [ "$SDIST_URL" = "null" ] || [ -z "$SDIST_SHA256" ] || [ "$SDIST_SHA256" = "null" ]; then
|
|
112
|
-
echo "::error::sdist metadata is missing from PyPI response"
|
|
113
|
-
exit 1
|
|
114
|
-
fi
|
|
115
|
-
echo "sdist_url=$SDIST_URL" >> "$GITHUB_OUTPUT"
|
|
116
|
-
echo "sdist_sha256=$SDIST_SHA256" >> "$GITHUB_OUTPUT"
|
|
117
|
-
|
|
118
|
-
- name: Trigger Homebrew tap update
|
|
119
|
-
uses: peter-evans/repository-dispatch@v3
|
|
120
|
-
with:
|
|
121
|
-
token: ${{ secrets.HOMEBREW_TAP_TOKEN }}
|
|
122
|
-
repository: minitap-ai/homebrew-tap
|
|
123
|
-
event-type: update-formula
|
|
124
|
-
client-payload: |
|
|
125
|
-
{
|
|
126
|
-
"formula": "minitest-cli",
|
|
127
|
-
"version": "${{ steps.pypi.outputs.version }}",
|
|
128
|
-
"sdist_url": "${{ steps.pypi.outputs.sdist_url }}",
|
|
129
|
-
"sdist_sha256": "${{ steps.pypi.outputs.sdist_sha256 }}"
|
|
130
|
-
}
|
|
@@ -22,7 +22,8 @@ uv add <package> # Add new dependency (always
|
|
|
22
22
|
- `api/client.py` - httpx async client with auto auth + X-Minitest-Channel header
|
|
23
23
|
- `utils/`
|
|
24
24
|
- `output.py` - --json helpers: stdout=data, stderr=diagnostics
|
|
25
|
-
- `update_check.py` - PyPI version check (cached
|
|
25
|
+
- `update_check.py` - PyPI version check (cached 1h, non-blocking); hands newer releases to auto-update
|
|
26
|
+
- `auto_update*.py` - background self-update of the CLI and agent skill: eligibility and plan (`auto_update.py`), lock/state/running-command registry and the saved on/off preference (`auto_update_state.py`, toggled by `minitest upgrade auto`, `commands/upgrade_auto.py`), one-time notices, and the detached worker (`python -m minitest_cli.utils.auto_update_worker`). Tests run with `MINITEST_NO_AUTO_UPDATE=1` (conftest) so they never touch the real install.
|
|
26
27
|
- `main.py` - Typer app entry point, global flags, command group registration
|
|
27
28
|
- `tests/` - Unit tests
|
|
28
29
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: minitest-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.43.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
|
|
@@ -62,12 +62,6 @@ Both scripts use `uv` if available, or install it automatically.
|
|
|
62
62
|
uv tool install minitest-cli
|
|
63
63
|
```
|
|
64
64
|
|
|
65
|
-
**Homebrew** (macOS):
|
|
66
|
-
|
|
67
|
-
```bash
|
|
68
|
-
brew install minitap-ai/tap/minitest-cli
|
|
69
|
-
```
|
|
70
|
-
|
|
71
65
|
**uvx** (zero-install, all platforms):
|
|
72
66
|
|
|
73
67
|
```bash
|
|
@@ -83,6 +77,33 @@ uv sync
|
|
|
83
77
|
uv run minitest --help
|
|
84
78
|
```
|
|
85
79
|
|
|
80
|
+
### Staying up to date
|
|
81
|
+
|
|
82
|
+
A CLI installed with `uv tool install` or the one-liner keeps itself
|
|
83
|
+
current. When a command sees a newer release on PyPI, it updates the CLI in the
|
|
84
|
+
background and your next command runs the new version. The update waits until
|
|
85
|
+
no other `minitest` command is running, and only installs releases that have
|
|
86
|
+
been out for at least an hour. The same background job refreshes the agent
|
|
87
|
+
skill (`npx skills update minitest-cli`) when it has changed. The next command
|
|
88
|
+
prints one line saying what was updated; the details go to
|
|
89
|
+
`~/.minitest/auto_update.log`.
|
|
90
|
+
|
|
91
|
+
Auto-update never runs in CI (`CI` set), in containers, on Windows, or for
|
|
92
|
+
`uvx` and source checkouts; those keep printing an "Update available" notice.
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
minitest upgrade auto # show the setting, why it is off, the last update
|
|
96
|
+
minitest upgrade auto off # turn it off for this user (saved in ~/.minitest/preferences.json)
|
|
97
|
+
minitest upgrade auto on # turn it back on
|
|
98
|
+
minitest upgrade # update by hand at any time
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
`MINITEST_NO_AUTO_UPDATE=1` also turns it off, and wins over the saved setting.
|
|
102
|
+
|
|
103
|
+
> **Installed with Homebrew?** The `minitap-ai/tap/minitest-cli` formula is
|
|
104
|
+
> retired: it stopped at 0.24.0 and is now disabled. Switch to uv with
|
|
105
|
+
> `brew uninstall minitest-cli && uv tool install minitest-cli`.
|
|
106
|
+
|
|
86
107
|
## Quick Start
|
|
87
108
|
|
|
88
109
|
```bash
|
|
@@ -191,6 +212,7 @@ app defaults.
|
|
|
191
212
|
| `MINITEST_WEBAPP_URL` | Minitest webapp base URL (used for review links) | No (defaults to production) |
|
|
192
213
|
| `MINITEST_SUPABASE_URL` | Supabase project URL used for OAuth login | No (defaults to production) |
|
|
193
214
|
| `MINITEST_SUPABASE_PUBLISHABLE_KEY` | Supabase publishable (anon) key used for OAuth login | No (defaults to production) |
|
|
215
|
+
| `MINITEST_NO_AUTO_UPDATE` | Set to `1` to stop the CLI and agent skill from updating themselves (or run `minitest upgrade auto off`) | No |
|
|
194
216
|
|
|
195
217
|
> The recommended way to set these is to copy `.env.example` to `.env` — the CLI loads `.env` automatically. The shipped `.env.example` already targets the **dev** environment (see below).
|
|
196
218
|
|
|
@@ -368,6 +390,53 @@ least one domain. Connectors cannot be created from the CLI: a workspace owner
|
|
|
368
390
|
or admin creates them in the webapp, under **Workspace settings → Private
|
|
369
391
|
network**.
|
|
370
392
|
|
|
393
|
+
## Backend API
|
|
394
|
+
|
|
395
|
+
Mini can read the OpenAPI document of a backend you own and call it during runs,
|
|
396
|
+
authenticated with app vault secrets (it is off by default). `set` reads the
|
|
397
|
+
current settings first and changes only what you pass.
|
|
398
|
+
|
|
399
|
+
```bash
|
|
400
|
+
minitest --app <app-id> apps backend-api show
|
|
401
|
+
minitest --app <app-id> apps backend-api set --enable \
|
|
402
|
+
--base-url https://api.staging.example.com \
|
|
403
|
+
--openapi-url https://api.staging.example.com/openapi.json \
|
|
404
|
+
--secret API_TOKEN [--remove-secret <name> ...] [--clear-secrets] \
|
|
405
|
+
[--skill <name-or-id> | --clear-skill]
|
|
406
|
+
minitest --app <app-id> apps backend-api set --disable
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
Secrets are named references to the app vault (`minitest secret set`); `show`
|
|
410
|
+
warns about names no longer in the vault. URLs must be public `http(s)`
|
|
411
|
+
addresses: private, loopback and cloud-metadata addresses are rejected.
|
|
412
|
+
|
|
413
|
+
When the OpenAPI document itself needs authentication, say how to download it.
|
|
414
|
+
The credential comes from the app vault, is used for that download only, and is
|
|
415
|
+
sent only to the saved OpenAPI URL's origin (a one-run OpenAPI URL on another
|
|
416
|
+
origin gets none):
|
|
417
|
+
|
|
418
|
+
```bash
|
|
419
|
+
minitest --app <app-id> apps backend-api set --openapi-auth bearer --openapi-auth-secret API_TOKEN
|
|
420
|
+
minitest --app <app-id> apps backend-api set --openapi-auth header \
|
|
421
|
+
--openapi-auth-header X-Api-Key --openapi-auth-secret API_TOKEN
|
|
422
|
+
minitest --app <app-id> apps backend-api set --openapi-auth basic \
|
|
423
|
+
--openapi-auth-username docs-reader --openapi-auth-secret DOCS_PASSWORD
|
|
424
|
+
minitest --app <app-id> apps backend-api set --openapi-auth query \
|
|
425
|
+
--openapi-auth-param api_key --openapi-auth-secret API_TOKEN
|
|
426
|
+
minitest --app <app-id> apps backend-api set --openapi-auth none
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
To point one run at another backend, pass `--backend-base-url` and/or
|
|
430
|
+
`--backend-openapi-url` to `run start`, `run all` or `run from-commit`. Only
|
|
431
|
+
that run uses them; the saved settings do not change, and the app's backend API
|
|
432
|
+
must be on.
|
|
433
|
+
|
|
434
|
+
```bash
|
|
435
|
+
minitest --app <app-id> run all --web \
|
|
436
|
+
--backend-base-url https://pr-42.api.example.com \
|
|
437
|
+
--backend-openapi-url https://pr-42.api.example.com/openapi.json
|
|
438
|
+
```
|
|
439
|
+
|
|
371
440
|
## Exit Codes
|
|
372
441
|
|
|
373
442
|
| Code | Meaning |
|
|
@@ -28,12 +28,6 @@ Both scripts use `uv` if available, or install it automatically.
|
|
|
28
28
|
uv tool install minitest-cli
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
**Homebrew** (macOS):
|
|
32
|
-
|
|
33
|
-
```bash
|
|
34
|
-
brew install minitap-ai/tap/minitest-cli
|
|
35
|
-
```
|
|
36
|
-
|
|
37
31
|
**uvx** (zero-install, all platforms):
|
|
38
32
|
|
|
39
33
|
```bash
|
|
@@ -49,6 +43,33 @@ uv sync
|
|
|
49
43
|
uv run minitest --help
|
|
50
44
|
```
|
|
51
45
|
|
|
46
|
+
### Staying up to date
|
|
47
|
+
|
|
48
|
+
A CLI installed with `uv tool install` or the one-liner keeps itself
|
|
49
|
+
current. When a command sees a newer release on PyPI, it updates the CLI in the
|
|
50
|
+
background and your next command runs the new version. The update waits until
|
|
51
|
+
no other `minitest` command is running, and only installs releases that have
|
|
52
|
+
been out for at least an hour. The same background job refreshes the agent
|
|
53
|
+
skill (`npx skills update minitest-cli`) when it has changed. The next command
|
|
54
|
+
prints one line saying what was updated; the details go to
|
|
55
|
+
`~/.minitest/auto_update.log`.
|
|
56
|
+
|
|
57
|
+
Auto-update never runs in CI (`CI` set), in containers, on Windows, or for
|
|
58
|
+
`uvx` and source checkouts; those keep printing an "Update available" notice.
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
minitest upgrade auto # show the setting, why it is off, the last update
|
|
62
|
+
minitest upgrade auto off # turn it off for this user (saved in ~/.minitest/preferences.json)
|
|
63
|
+
minitest upgrade auto on # turn it back on
|
|
64
|
+
minitest upgrade # update by hand at any time
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
`MINITEST_NO_AUTO_UPDATE=1` also turns it off, and wins over the saved setting.
|
|
68
|
+
|
|
69
|
+
> **Installed with Homebrew?** The `minitap-ai/tap/minitest-cli` formula is
|
|
70
|
+
> retired: it stopped at 0.24.0 and is now disabled. Switch to uv with
|
|
71
|
+
> `brew uninstall minitest-cli && uv tool install minitest-cli`.
|
|
72
|
+
|
|
52
73
|
## Quick Start
|
|
53
74
|
|
|
54
75
|
```bash
|
|
@@ -157,6 +178,7 @@ app defaults.
|
|
|
157
178
|
| `MINITEST_WEBAPP_URL` | Minitest webapp base URL (used for review links) | No (defaults to production) |
|
|
158
179
|
| `MINITEST_SUPABASE_URL` | Supabase project URL used for OAuth login | No (defaults to production) |
|
|
159
180
|
| `MINITEST_SUPABASE_PUBLISHABLE_KEY` | Supabase publishable (anon) key used for OAuth login | No (defaults to production) |
|
|
181
|
+
| `MINITEST_NO_AUTO_UPDATE` | Set to `1` to stop the CLI and agent skill from updating themselves (or run `minitest upgrade auto off`) | No |
|
|
160
182
|
|
|
161
183
|
> The recommended way to set these is to copy `.env.example` to `.env` — the CLI loads `.env` automatically. The shipped `.env.example` already targets the **dev** environment (see below).
|
|
162
184
|
|
|
@@ -334,6 +356,53 @@ least one domain. Connectors cannot be created from the CLI: a workspace owner
|
|
|
334
356
|
or admin creates them in the webapp, under **Workspace settings → Private
|
|
335
357
|
network**.
|
|
336
358
|
|
|
359
|
+
## Backend API
|
|
360
|
+
|
|
361
|
+
Mini can read the OpenAPI document of a backend you own and call it during runs,
|
|
362
|
+
authenticated with app vault secrets (it is off by default). `set` reads the
|
|
363
|
+
current settings first and changes only what you pass.
|
|
364
|
+
|
|
365
|
+
```bash
|
|
366
|
+
minitest --app <app-id> apps backend-api show
|
|
367
|
+
minitest --app <app-id> apps backend-api set --enable \
|
|
368
|
+
--base-url https://api.staging.example.com \
|
|
369
|
+
--openapi-url https://api.staging.example.com/openapi.json \
|
|
370
|
+
--secret API_TOKEN [--remove-secret <name> ...] [--clear-secrets] \
|
|
371
|
+
[--skill <name-or-id> | --clear-skill]
|
|
372
|
+
minitest --app <app-id> apps backend-api set --disable
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
Secrets are named references to the app vault (`minitest secret set`); `show`
|
|
376
|
+
warns about names no longer in the vault. URLs must be public `http(s)`
|
|
377
|
+
addresses: private, loopback and cloud-metadata addresses are rejected.
|
|
378
|
+
|
|
379
|
+
When the OpenAPI document itself needs authentication, say how to download it.
|
|
380
|
+
The credential comes from the app vault, is used for that download only, and is
|
|
381
|
+
sent only to the saved OpenAPI URL's origin (a one-run OpenAPI URL on another
|
|
382
|
+
origin gets none):
|
|
383
|
+
|
|
384
|
+
```bash
|
|
385
|
+
minitest --app <app-id> apps backend-api set --openapi-auth bearer --openapi-auth-secret API_TOKEN
|
|
386
|
+
minitest --app <app-id> apps backend-api set --openapi-auth header \
|
|
387
|
+
--openapi-auth-header X-Api-Key --openapi-auth-secret API_TOKEN
|
|
388
|
+
minitest --app <app-id> apps backend-api set --openapi-auth basic \
|
|
389
|
+
--openapi-auth-username docs-reader --openapi-auth-secret DOCS_PASSWORD
|
|
390
|
+
minitest --app <app-id> apps backend-api set --openapi-auth query \
|
|
391
|
+
--openapi-auth-param api_key --openapi-auth-secret API_TOKEN
|
|
392
|
+
minitest --app <app-id> apps backend-api set --openapi-auth none
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
To point one run at another backend, pass `--backend-base-url` and/or
|
|
396
|
+
`--backend-openapi-url` to `run start`, `run all` or `run from-commit`. Only
|
|
397
|
+
that run uses them; the saved settings do not change, and the app's backend API
|
|
398
|
+
must be on.
|
|
399
|
+
|
|
400
|
+
```bash
|
|
401
|
+
minitest --app <app-id> run all --web \
|
|
402
|
+
--backend-base-url https://pr-42.api.example.com \
|
|
403
|
+
--backend-openapi-url https://pr-42.api.example.com/openapi.json
|
|
404
|
+
```
|
|
405
|
+
|
|
337
406
|
## Exit Codes
|
|
338
407
|
|
|
339
408
|
| Code | Meaning |
|
|
@@ -3,8 +3,10 @@
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
5
|
Releases are automated via GitHub Actions. Pushing a version tag triggers the
|
|
6
|
-
full pipeline: build, publish to PyPI, create a GitHub Release
|
|
7
|
-
Homebrew formula
|
|
6
|
+
full pipeline: build, publish to PyPI, and create a GitHub Release. uv is the
|
|
7
|
+
only distribution channel (the Homebrew formula is retired); users
|
|
8
|
+
on a `uv tool install` pick the release up automatically through auto-update
|
|
9
|
+
once it has been on PyPI for an hour.
|
|
8
10
|
|
|
9
11
|
## Steps
|
|
10
12
|
|
|
@@ -38,8 +40,6 @@ The tag push triggers `.github/workflows/release.yml`, which:
|
|
|
38
40
|
2. **Publish to PyPI** — uses trusted publishing (OIDC), no API token needed
|
|
39
41
|
3. **GitHub Release** — creates a release with auto-generated notes and attaches
|
|
40
42
|
the built artifacts
|
|
41
|
-
4. **Homebrew update** — dispatches an event to `minitap-ai/homebrew-tap` with
|
|
42
|
-
the new version, sdist URL, and SHA256 hash
|
|
43
43
|
|
|
44
44
|
### 4. Verify
|
|
45
45
|
|
|
@@ -52,11 +52,6 @@ minitest --version
|
|
|
52
52
|
|
|
53
53
|
# uvx
|
|
54
54
|
uvx --from minitest-cli@X.Y.Z minitest --version
|
|
55
|
-
|
|
56
|
-
# Homebrew (after tap update completes)
|
|
57
|
-
brew update
|
|
58
|
-
brew install minitap-ai/tap/minitest-cli
|
|
59
|
-
minitest --version
|
|
60
55
|
```
|
|
61
56
|
|
|
62
57
|
## Prerequisites
|
|
@@ -76,11 +71,6 @@ Configure on PyPI at https://pypi.org/manage/project/minitest-cli/settings/publi
|
|
|
76
71
|
|
|
77
72
|
Create a GitHub Actions environment named `pypi` in the repository settings.
|
|
78
73
|
|
|
79
|
-
### Homebrew tap token
|
|
80
|
-
|
|
81
|
-
A `HOMEBREW_TAP_TOKEN` secret must be set in this repository with a GitHub
|
|
82
|
-
personal access token that has write access to `minitap-ai/homebrew-tap`.
|
|
83
|
-
|
|
84
74
|
## Version scheme
|
|
85
75
|
|
|
86
76
|
We follow [Semantic Versioning](https://semver.org/):
|
{minitest_cli-0.41.0 → minitest_cli-0.43.0}/src/minitest_cli/commands/app_network_helpers.py
RENAMED
|
@@ -38,12 +38,12 @@ def fail(message: str, code: int = EXIT_GENERAL_ERROR) -> typer.Exit:
|
|
|
38
38
|
return typer.Exit(code=code)
|
|
39
39
|
|
|
40
40
|
|
|
41
|
-
def _raise_for_status(resp: httpx.Response) -> None:
|
|
41
|
+
def _raise_for_status(resp: httpx.Response, forbidden: str) -> None:
|
|
42
42
|
if resp.status_code < 400:
|
|
43
43
|
return
|
|
44
44
|
detail = extract_detail(resp)
|
|
45
45
|
if resp.status_code == 403:
|
|
46
|
-
raise fail(f"{
|
|
46
|
+
raise fail(f"{forbidden} ({detail})", EXIT_AUTH_ERROR)
|
|
47
47
|
if resp.status_code == 401:
|
|
48
48
|
raise fail(f"Authentication failed: {detail}", EXIT_AUTH_ERROR)
|
|
49
49
|
if resp.status_code == 404:
|
|
@@ -54,12 +54,17 @@ def _raise_for_status(resp: httpx.Response) -> None:
|
|
|
54
54
|
|
|
55
55
|
|
|
56
56
|
def call_api(
|
|
57
|
-
settings: Settings,
|
|
57
|
+
settings: Settings,
|
|
58
|
+
method: str,
|
|
59
|
+
path: str,
|
|
60
|
+
body: dict[str, Any] | None = None,
|
|
61
|
+
*,
|
|
62
|
+
forbidden: str = ADMIN_ONLY_MESSAGE,
|
|
58
63
|
) -> dict[str, Any]:
|
|
59
64
|
async def _run() -> dict[str, Any]:
|
|
60
65
|
async with ApiClient(settings) as client:
|
|
61
66
|
resp = await client.request(method, path, json=body)
|
|
62
|
-
_raise_for_status(resp)
|
|
67
|
+
_raise_for_status(resp, forbidden)
|
|
63
68
|
try:
|
|
64
69
|
return resp.json()
|
|
65
70
|
except ValueError as exc:
|
|
@@ -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 (
|
|
14
14
|
apps_dependencies,
|
|
15
|
+
backend_api,
|
|
15
16
|
apps_get,
|
|
16
17
|
private_network,
|
|
17
18
|
residential_proxy,
|
|
@@ -38,6 +39,7 @@ app.command(name="dependencies")(apps_dependencies.dependencies)
|
|
|
38
39
|
app.command(name="get")(apps_get.get_app)
|
|
39
40
|
app.add_typer(residential_proxy.app)
|
|
40
41
|
app.add_typer(private_network.app)
|
|
42
|
+
app.add_typer(backend_api.app)
|
|
41
43
|
|
|
42
44
|
|
|
43
45
|
@app.callback()
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"""'apps backend-api': the backend Mini reads an OpenAPI document of and calls during runs."""
|
|
2
|
+
|
|
3
|
+
from typing import Annotated, Any
|
|
4
|
+
|
|
5
|
+
import typer
|
|
6
|
+
|
|
7
|
+
from minitest_cli.commands.app_network_helpers import call_api, fail, is_json_mode, resolve_target
|
|
8
|
+
from minitest_cli.core.config import Settings
|
|
9
|
+
from minitest_cli.commands.app_skill_helpers import skills_path
|
|
10
|
+
from minitest_cli.commands.backend_api_helpers import (
|
|
11
|
+
merge_secret_names,
|
|
12
|
+
openapi_auth_body,
|
|
13
|
+
render_config,
|
|
14
|
+
)
|
|
15
|
+
from minitest_cli.utils.output import print_success
|
|
16
|
+
|
|
17
|
+
app = typer.Typer(
|
|
18
|
+
name="backend-api",
|
|
19
|
+
help=(
|
|
20
|
+
"Backend API of the app (--app): during runs Mini searches its OpenAPI document and "
|
|
21
|
+
"calls it, authenticated with app vault secrets. Off by default."
|
|
22
|
+
),
|
|
23
|
+
no_args_is_help=True,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _path(app_id: str) -> str:
|
|
28
|
+
return f"/api/v1/apps/{app_id}/backend-config"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _call(
|
|
32
|
+
settings: Settings, method: str, path: str, body: dict[str, Any] | None = None
|
|
33
|
+
) -> dict[str, Any]:
|
|
34
|
+
return call_api(settings, method, path, body, forbidden="You cannot access this app.")
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@app.command(name="show")
|
|
38
|
+
def show() -> None:
|
|
39
|
+
"""Show the app's backend API settings."""
|
|
40
|
+
settings, app_id = resolve_target()
|
|
41
|
+
render_config(_call(settings, "GET", _path(app_id)))
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@app.command(name="set")
|
|
45
|
+
def set_config(
|
|
46
|
+
enable: Annotated[
|
|
47
|
+
bool | None,
|
|
48
|
+
typer.Option(
|
|
49
|
+
"--enable/--disable",
|
|
50
|
+
help="Switch it on or off. On needs a base URL and an OpenAPI URL.",
|
|
51
|
+
),
|
|
52
|
+
] = None,
|
|
53
|
+
base_url: Annotated[
|
|
54
|
+
str | None,
|
|
55
|
+
typer.Option("--base-url", help="Base URL Mini calls, e.g. https://api.staging.example."),
|
|
56
|
+
] = None,
|
|
57
|
+
openapi_url: Annotated[
|
|
58
|
+
str | None,
|
|
59
|
+
typer.Option("--openapi-url", help="URL of the OpenAPI (or Swagger) document."),
|
|
60
|
+
] = None,
|
|
61
|
+
secret: Annotated[
|
|
62
|
+
list[str] | None,
|
|
63
|
+
typer.Option(
|
|
64
|
+
"--secret",
|
|
65
|
+
help="App vault secret Mini authenticates calls with (repeatable), e.g. API_TOKEN.",
|
|
66
|
+
),
|
|
67
|
+
] = None,
|
|
68
|
+
remove_secret: Annotated[
|
|
69
|
+
list[str] | None,
|
|
70
|
+
typer.Option("--remove-secret", help="Authentication secret to drop (repeatable)."),
|
|
71
|
+
] = None,
|
|
72
|
+
clear_secrets: Annotated[
|
|
73
|
+
bool,
|
|
74
|
+
typer.Option("--clear-secrets", help="Drop every current secret before adding --secret."),
|
|
75
|
+
] = False,
|
|
76
|
+
skill: Annotated[
|
|
77
|
+
str | None,
|
|
78
|
+
typer.Option("--skill", help="App skill (name or id) explaining how to use the backend."),
|
|
79
|
+
] = None,
|
|
80
|
+
clear_skill: Annotated[
|
|
81
|
+
bool, typer.Option("--clear-skill", help="Stop pointing Mini at a skill.")
|
|
82
|
+
] = False,
|
|
83
|
+
openapi_auth: Annotated[
|
|
84
|
+
str | None,
|
|
85
|
+
typer.Option(
|
|
86
|
+
"--openapi-auth",
|
|
87
|
+
help=(
|
|
88
|
+
"How the OpenAPI document is downloaded when it needs authentication: none, "
|
|
89
|
+
"bearer, header, basic or query. Used for nothing else, and only sent to the "
|
|
90
|
+
"saved OpenAPI URL's origin."
|
|
91
|
+
),
|
|
92
|
+
),
|
|
93
|
+
] = None,
|
|
94
|
+
openapi_auth_secret: Annotated[
|
|
95
|
+
str | None,
|
|
96
|
+
typer.Option("--openapi-auth-secret", help="App vault secret holding the credential."),
|
|
97
|
+
] = None,
|
|
98
|
+
openapi_auth_header: Annotated[
|
|
99
|
+
str | None, typer.Option("--openapi-auth-header", help="Header name, for header.")
|
|
100
|
+
] = None,
|
|
101
|
+
openapi_auth_username: Annotated[
|
|
102
|
+
str | None, typer.Option("--openapi-auth-username", help="Username, for basic.")
|
|
103
|
+
] = None,
|
|
104
|
+
openapi_auth_param: Annotated[
|
|
105
|
+
str | None, typer.Option("--openapi-auth-param", help="Query parameter, for query.")
|
|
106
|
+
] = None,
|
|
107
|
+
) -> None:
|
|
108
|
+
"""Change the app's backend API settings; options not passed stay as they are."""
|
|
109
|
+
if skill and clear_skill:
|
|
110
|
+
raise fail("Pass either --skill or --clear-skill, not both.")
|
|
111
|
+
changes = [enable is not None, base_url, openapi_url, secret, remove_secret, clear_secrets]
|
|
112
|
+
auth_names = {
|
|
113
|
+
"--openapi-auth-header": openapi_auth_header,
|
|
114
|
+
"--openapi-auth-username": openapi_auth_username,
|
|
115
|
+
"--openapi-auth-param": openapi_auth_param,
|
|
116
|
+
}
|
|
117
|
+
auth_given = any([openapi_auth, openapi_auth_secret, *auth_names.values()])
|
|
118
|
+
if not any([*changes, skill, clear_skill, auth_given]):
|
|
119
|
+
raise fail(
|
|
120
|
+
"Nothing to change: pass --enable/--disable, --base-url, --openapi-url, "
|
|
121
|
+
"a secret option, a skill option or an --openapi-auth option."
|
|
122
|
+
)
|
|
123
|
+
settings, app_id = resolve_target()
|
|
124
|
+
current = _call(settings, "GET", _path(app_id))
|
|
125
|
+
body: dict[str, Any] = {
|
|
126
|
+
"enabled": current["enabled"] if enable is None else enable,
|
|
127
|
+
"baseUrl": current["baseUrl"] if base_url is None else base_url,
|
|
128
|
+
"openapiUrl": current["openapiUrl"] if openapi_url is None else openapi_url,
|
|
129
|
+
"authenticationSecretNames": merge_secret_names(
|
|
130
|
+
current["authenticationSecretNames"],
|
|
131
|
+
add=secret,
|
|
132
|
+
remove=remove_secret,
|
|
133
|
+
clear=clear_secrets,
|
|
134
|
+
),
|
|
135
|
+
"skillId": current["skill"]["id"] if current["skill"] else None,
|
|
136
|
+
}
|
|
137
|
+
if auth_given:
|
|
138
|
+
body["openapiAuth"] = openapi_auth_body(
|
|
139
|
+
current["openapiAuth"],
|
|
140
|
+
auth_type=openapi_auth,
|
|
141
|
+
secret=openapi_auth_secret,
|
|
142
|
+
names=auth_names,
|
|
143
|
+
)
|
|
144
|
+
if clear_skill:
|
|
145
|
+
body["skillId"] = None
|
|
146
|
+
elif skill:
|
|
147
|
+
body["skillId"] = _call(settings, "GET", f"{skills_path(app_id)}/{skill}")["id"]
|
|
148
|
+
|
|
149
|
+
updated = _call(settings, "PUT", _path(app_id), body)
|
|
150
|
+
if not is_json_mode():
|
|
151
|
+
print_success("Backend API updated.")
|
|
152
|
+
render_config(updated)
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"""Rendering and secret-list editing for 'apps backend-api'."""
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from minitest_cli.commands.app_network_helpers import fail, is_json_mode, on_off
|
|
6
|
+
from minitest_cli.utils.output import print_json, print_warning
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def merge_secret_names(
|
|
10
|
+
current: list[str], *, add: list[str] | None, remove: list[str] | None, clear: bool
|
|
11
|
+
) -> list[str]:
|
|
12
|
+
"""Apply ``--clear-secrets``, ``--remove-secret`` then ``--secret``."""
|
|
13
|
+
removed = {name.strip() for name in remove or []}
|
|
14
|
+
unknown = sorted(removed - set(current))
|
|
15
|
+
if unknown:
|
|
16
|
+
raise fail(f"Not an authentication secret of this app: {', '.join(unknown)}.")
|
|
17
|
+
base = [] if clear else [name for name in current if name not in removed]
|
|
18
|
+
return list(dict.fromkeys([*base, *(name.strip() for name in add or [])]))
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
OPENAPI_AUTH_TYPES = ("none", "bearer", "header", "basic", "query")
|
|
22
|
+
_AUTH_NAME_FIELD = {
|
|
23
|
+
"header": ("headerName", "--openapi-auth-header"),
|
|
24
|
+
"basic": ("username", "--openapi-auth-username"),
|
|
25
|
+
"query": ("paramName", "--openapi-auth-param"),
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def openapi_auth_body(
|
|
30
|
+
current: dict[str, Any],
|
|
31
|
+
*,
|
|
32
|
+
auth_type: str | None,
|
|
33
|
+
secret: str | None,
|
|
34
|
+
names: dict[str, str | None],
|
|
35
|
+
) -> dict[str, Any]:
|
|
36
|
+
"""Apply the --openapi-auth options to the saved setting; ``names`` is keyed by option."""
|
|
37
|
+
kind = auth_type or current["type"]
|
|
38
|
+
if kind not in OPENAPI_AUTH_TYPES:
|
|
39
|
+
raise fail(f"--openapi-auth must be one of: {', '.join(OPENAPI_AUTH_TYPES)}.")
|
|
40
|
+
field = _AUTH_NAME_FIELD.get(kind)
|
|
41
|
+
stray = [
|
|
42
|
+
option for option, value in names.items() if value and (not field or option != field[1])
|
|
43
|
+
]
|
|
44
|
+
if kind == "none" and secret:
|
|
45
|
+
stray.insert(0, "--openapi-auth-secret")
|
|
46
|
+
if stray:
|
|
47
|
+
raise fail(f"{', '.join(stray)} does not apply to --openapi-auth {kind}.")
|
|
48
|
+
if kind == "none":
|
|
49
|
+
return {"type": "none"}
|
|
50
|
+
same = current["type"] == kind
|
|
51
|
+
body = {"type": kind, "secretName": secret or (current.get("secretName") if same else None)}
|
|
52
|
+
if field:
|
|
53
|
+
body[field[0]] = names[field[1]] or (current.get(field[0]) if same else None)
|
|
54
|
+
required = [("--openapi-auth-secret", body["secretName"])] + (
|
|
55
|
+
[(field[1], body[field[0]])] if field else []
|
|
56
|
+
)
|
|
57
|
+
missing = [option for option, value in required if not value]
|
|
58
|
+
if missing:
|
|
59
|
+
raise fail(f"--openapi-auth {kind} needs {' and '.join(missing)}.")
|
|
60
|
+
return body
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _describe_openapi_auth(auth: dict[str, Any]) -> str:
|
|
64
|
+
if auth["type"] == "none":
|
|
65
|
+
return "none"
|
|
66
|
+
field = _AUTH_NAME_FIELD.get(auth["type"])
|
|
67
|
+
detail = f" {field[0]}={auth[field[0]]}" if field else ""
|
|
68
|
+
return f"{auth['type']}{detail} secret={auth['secretName']}"
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def render_config(config: dict[str, Any]) -> None:
|
|
72
|
+
if is_json_mode():
|
|
73
|
+
print_json(config)
|
|
74
|
+
else:
|
|
75
|
+
skill = config["skill"]
|
|
76
|
+
print(f"Enabled: {on_off(config['enabled'])}") # noqa: T201
|
|
77
|
+
print(f"Base URL: {config['baseUrl'] or '-'}") # noqa: T201
|
|
78
|
+
print(f"OpenAPI URL: {config['openapiUrl'] or '-'}") # noqa: T201
|
|
79
|
+
secrets = ", ".join(config["authenticationSecretNames"]) or "-"
|
|
80
|
+
print(f"Authentication secrets: {secrets}") # noqa: T201
|
|
81
|
+
print(f"Skill: {skill['name'] + ' ' + skill['id'] if skill else '-'}") # noqa: T201
|
|
82
|
+
print(f"OpenAPI download: {_describe_openapi_auth(config['openapiAuth'])}") # noqa: T201
|
|
83
|
+
missing = config["missingSecretNames"]
|
|
84
|
+
if missing:
|
|
85
|
+
print_warning(
|
|
86
|
+
f"Not in the app vault anymore: {', '.join(missing)}. Create them with "
|
|
87
|
+
"'minitest secret set' or drop them with --remove-secret."
|
|
88
|
+
)
|
|
89
|
+
if config["openapiAuthSecretMissing"]:
|
|
90
|
+
print_warning(
|
|
91
|
+
f"The OpenAPI download secret {config['openapiAuth']['secretName']} is not in the "
|
|
92
|
+
"app vault anymore: runs will not start until it is created again or replaced."
|
|
93
|
+
)
|