opsmith-cli 0.4.5b0__tar.gz → 0.6.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.
- opsmith_cli-0.6.0/.claude/settings.json +5 -0
- opsmith_cli-0.6.0/.flake8 +3 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/.github/workflows/python-publish.yml +2 -2
- opsmith_cli-0.6.0/.github/workflows/tests.yml +31 -0
- opsmith_cli-0.6.0/.pre-commit-config.yaml +41 -0
- opsmith_cli-0.6.0/CHANGELOG.md +234 -0
- opsmith_cli-0.6.0/CLAUDE.md +423 -0
- opsmith_cli-0.6.0/PKG-INFO +538 -0
- opsmith_cli-0.6.0/README.md +496 -0
- opsmith_cli-0.6.0/docs/README.md +18 -0
- opsmith_cli-0.6.0/docs/notes/2026-09-04-migration-plan.md +289 -0
- opsmith_cli-0.6.0/docs/notes/README.md +15 -0
- opsmith_cli-0.6.0/docs/reference/2026-09-21-agent-skill.md +142 -0
- opsmith_cli-0.6.0/docs/reference/README.md +20 -0
- opsmith_cli-0.6.0/docs/specs/2026-09-04-phase-0-headless-core/0a-cli-split-and-errors.md +104 -0
- opsmith_cli-0.6.0/docs/specs/2026-09-04-phase-0-headless-core/0b-context-and-events.md +99 -0
- opsmith_cli-0.6.0/docs/specs/2026-09-04-phase-0-headless-core/0c-model-config-and-tool-checks.md +90 -0
- opsmith_cli-0.6.0/docs/specs/2026-09-04-phase-0-headless-core/0d-interaction-api.md +101 -0
- opsmith_cli-0.6.0/docs/specs/2026-09-04-phase-0-headless-core/0e-headless-mode.md +105 -0
- opsmith_cli-0.6.0/docs/specs/2026-09-04-phase-0-headless-core/0f-headless-subcommands.md +93 -0
- opsmith_cli-0.6.0/docs/specs/2026-09-04-phase-0-headless-core/0g-provider-questions-and-plan.md +93 -0
- opsmith_cli-0.6.0/docs/specs/2026-09-04-phase-0-headless-core/README.md +117 -0
- opsmith_cli-0.6.0/docs/specs/2026-09-04-phase-1-harness-integration.md +180 -0
- opsmith_cli-0.6.0/docs/specs/2026-09-04-phase-2-service-model-v2.md +439 -0
- opsmith_cli-0.6.0/docs/specs/2026-09-04-phase-3-customization.md +251 -0
- opsmith_cli-0.6.0/docs/specs/2026-09-04-phase-4-remote-state.md +199 -0
- opsmith_cli-0.6.0/docs/specs/2026-09-04-phase-5-recipes.md +226 -0
- opsmith_cli-0.6.0/docs/specs/2026-09-04-phase-6-agentic-analysis.md +165 -0
- opsmith_cli-0.6.0/docs/specs/2026-09-04-phase-7-mcp-server.md +94 -0
- opsmith_cli-0.6.0/docs/specs/2026-09-04-phase-8-data-durability.md +107 -0
- opsmith_cli-0.6.0/docs/specs/README.md +55 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/agent.py +21 -5
- opsmith_cli-0.6.0/opsmith/cli/agent_install.py +776 -0
- opsmith_cli-0.6.0/opsmith/cli/app.py +578 -0
- opsmith_cli-0.6.0/opsmith/cli/commands/__init__.py +71 -0
- opsmith_cli-0.6.0/opsmith/cli/commands/agent.py +180 -0
- opsmith_cli-0.6.0/opsmith/cli/commands/analyze.py +32 -0
- opsmith_cli-0.6.0/opsmith/cli/commands/config.py +121 -0
- opsmith_cli-0.6.0/opsmith/cli/commands/deploy.py +80 -0
- opsmith_cli-0.6.0/opsmith/cli/commands/env.py +345 -0
- opsmith_cli-0.6.0/opsmith/cli/commands/release.py +110 -0
- opsmith_cli-0.6.0/opsmith/cli/commands/setup.py +53 -0
- opsmith_cli-0.6.0/opsmith/cli/commands/validate.py +79 -0
- opsmith_cli-0.6.0/opsmith/cli/flags.py +231 -0
- opsmith_cli-0.6.0/opsmith/cli/interaction.py +305 -0
- opsmith_cli-0.6.0/opsmith/cli/output.py +396 -0
- opsmith_cli-0.6.0/opsmith/cli/skill_refs.py +471 -0
- opsmith_cli-0.6.0/opsmith/cli/state.py +63 -0
- opsmith_cli-0.6.0/opsmith/cloud_providers/aws.py +262 -0
- opsmith_cli-0.6.0/opsmith/cloud_providers/base.py +278 -0
- opsmith_cli-0.6.0/opsmith/cloud_providers/gcp.py +348 -0
- opsmith_cli-0.6.0/opsmith/core/answers.py +453 -0
- opsmith_cli-0.6.0/opsmith/core/config.py +359 -0
- opsmith_cli-0.6.0/opsmith/core/context.py +119 -0
- opsmith_cli-0.6.0/opsmith/core/errors.py +360 -0
- opsmith_cli-0.6.0/opsmith/core/events.py +177 -0
- opsmith_cli-0.6.0/opsmith/core/interaction.py +669 -0
- opsmith_cli-0.6.0/opsmith/core/llm.py +151 -0
- opsmith_cli-0.6.0/opsmith/core/operations.py +1253 -0
- opsmith_cli-0.6.0/opsmith/core/provisioners.py +109 -0
- opsmith_cli-0.6.0/opsmith/core/questions.py +606 -0
- opsmith_cli-0.6.0/opsmith/core/results.py +544 -0
- opsmith_cli-0.6.0/opsmith/core/steps.py +127 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/deployment_strategies/base.py +225 -93
- opsmith_cli-0.6.0/opsmith/deployment_strategies/monolithic.py +1917 -0
- opsmith_cli-0.6.0/opsmith/git_repo.py +179 -0
- opsmith_cli-0.6.0/opsmith/infra_provisioners/__init__.py +0 -0
- opsmith_cli-0.6.0/opsmith/infra_provisioners/ansible_provisioner.py +112 -0
- opsmith_cli-0.6.0/opsmith/infra_provisioners/base_provisioner.py +151 -0
- opsmith_cli-0.6.0/opsmith/infra_provisioners/terraform_provisioner.py +112 -0
- opsmith_cli-0.6.0/opsmith/main.py +9 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/models.py +45 -88
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/repo_map.py +42 -39
- opsmith_cli-0.6.0/opsmith/service_detector.py +518 -0
- opsmith_cli-0.6.0/opsmith/settings.py +51 -0
- opsmith_cli-0.6.0/opsmith/skill/SKILL.md +279 -0
- opsmith_cli-0.6.0/opsmith/skill/references/commands.md +774 -0
- opsmith_cli-0.6.0/opsmith/skill/references/config-schema.md +88 -0
- opsmith_cli-0.6.0/opsmith/skill/references/ownership.md +64 -0
- opsmith_cli-0.6.0/opsmith/skill/references/workflows.md +124 -0
- opsmith_cli-0.6.0/opsmith/templates/docker_compose_run/aws/main.yml +51 -0
- opsmith_cli-0.6.0/opsmith/templates/docker_compose_run/gcp/main.yml +51 -0
- opsmith_cli-0.6.0/opsmith/tests/__init__.py +0 -0
- opsmith_cli-0.6.0/opsmith/tests/conftest.py +556 -0
- opsmith_cli-0.6.0/opsmith/tests/test_agent_install.py +371 -0
- opsmith_cli-0.6.0/opsmith/tests/test_answers.py +299 -0
- opsmith_cli-0.6.0/opsmith/tests/test_boundaries.py +120 -0
- opsmith_cli-0.6.0/opsmith/tests/test_cli_contract.py +444 -0
- opsmith_cli-0.6.0/opsmith/tests/test_cloud_providers.py +273 -0
- opsmith_cli-0.6.0/opsmith/tests/test_commands.py +280 -0
- opsmith_cli-0.6.0/opsmith/tests/test_config_commands.py +261 -0
- opsmith_cli-0.6.0/opsmith/tests/test_env_plan.py +638 -0
- opsmith_cli-0.6.0/opsmith/tests/test_error_hints.py +111 -0
- opsmith_cli-0.6.0/opsmith/tests/test_events.py +234 -0
- opsmith_cli-0.6.0/opsmith/tests/test_flag_mapping.py +227 -0
- opsmith_cli-0.6.0/opsmith/tests/test_git_repo.py +144 -0
- opsmith_cli-0.6.0/opsmith/tests/test_interaction.py +743 -0
- opsmith_cli-0.6.0/opsmith/tests/test_interaction_keys.py +329 -0
- opsmith_cli-0.6.0/opsmith/tests/test_llm_config.py +151 -0
- opsmith_cli-0.6.0/opsmith/tests/test_monolithic_strategy.py +1199 -0
- opsmith_cli-0.6.0/opsmith/tests/test_operations.py +1034 -0
- opsmith_cli-0.6.0/opsmith/tests/test_provisioners.py +237 -0
- opsmith_cli-0.6.0/opsmith/tests/test_questions.py +328 -0
- opsmith_cli-0.6.0/opsmith/tests/test_requirements.py +180 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/tests/test_service_detector.py +111 -4
- opsmith_cli-0.6.0/opsmith/tests/test_skill_refs.py +218 -0
- opsmith_cli-0.6.0/opsmith/tests/test_steps.py +114 -0
- opsmith_cli-0.6.0/opsmith/tests/test_validate_commands.py +385 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/types.py +122 -15
- opsmith_cli-0.6.0/opsmith/utils.py +202 -0
- opsmith_cli-0.6.0/pyproject.toml +98 -0
- opsmith_cli-0.6.0/scripts/build_skill_refs.py +50 -0
- opsmith_cli-0.6.0/uv.lock +2304 -0
- opsmith_cli-0.4.5b0/.flake8 +0 -3
- opsmith_cli-0.4.5b0/.pre-commit-config.yaml +0 -22
- opsmith_cli-0.4.5b0/CONVENTIONS.md +0 -35
- opsmith_cli-0.4.5b0/PKG-INFO +0 -273
- opsmith_cli-0.4.5b0/README.md +0 -236
- opsmith_cli-0.4.5b0/opsmith/cloud_providers/aws.py +0 -190
- opsmith_cli-0.4.5b0/opsmith/cloud_providers/base.py +0 -176
- opsmith_cli-0.4.5b0/opsmith/cloud_providers/gcp.py +0 -233
- opsmith_cli-0.4.5b0/opsmith/deployment_strategies/monolithic.py +0 -1336
- opsmith_cli-0.4.5b0/opsmith/exceptions.py +0 -10
- opsmith_cli-0.4.5b0/opsmith/git_repo.py +0 -114
- opsmith_cli-0.4.5b0/opsmith/infra_provisioners/ansible_provisioner.py +0 -53
- opsmith_cli-0.4.5b0/opsmith/infra_provisioners/base_provisioner.py +0 -96
- opsmith_cli-0.4.5b0/opsmith/infra_provisioners/terraform_provisioner.py +0 -80
- opsmith_cli-0.4.5b0/opsmith/main.py +0 -593
- opsmith_cli-0.4.5b0/opsmith/service_detector.py +0 -365
- opsmith_cli-0.4.5b0/opsmith/settings.py +0 -29
- opsmith_cli-0.4.5b0/opsmith/templates/docker_compose_run/aws/main.yml +0 -26
- opsmith_cli-0.4.5b0/opsmith/templates/docker_compose_run/gcp/main.yml +0 -26
- opsmith_cli-0.4.5b0/opsmith/utils.py +0 -114
- opsmith_cli-0.4.5b0/pyproject.toml +0 -65
- opsmith_cli-0.4.5b0/uv.lock +0 -3757
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/.gitignore +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/LICENSE.txt +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/__init__.py +0 -0
- {opsmith_cli-0.4.5b0/opsmith/infra_provisioners → opsmith_cli-0.6.0/opsmith/cli}/__init__.py +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/cloud_providers/__init__.py +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/constants.py +0 -0
- {opsmith_cli-0.4.5b0/opsmith/tests → opsmith_cli-0.6.0/opsmith/core}/__init__.py +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/deployment_strategies/__init__.py +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/prompts.py +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/README.md +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/arduino-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/c-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/c_sharp-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/chatito-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/commonlisp-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/cpp-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/csharp-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/d-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/dart-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/elisp-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/elixir-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/elm-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/gleam-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/go-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/hcl-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/java-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/javascript-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/kotlin-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/lua-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/ocaml-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/ocaml_interface-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/php-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/pony-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/properties-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/python-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/ql-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/r-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/racket-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/ruby-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/rust-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/scala-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/solidity-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/swift-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/typescript-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/queries/tree-sitter-languages/udev-tags.scm +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/cloud_storage_cleanup/aws/main.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/cloud_storage_cleanup/gcp/main.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/container_registry/aws/main.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/container_registry/aws/outputs.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/container_registry/aws/variables.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/container_registry/gcp/main.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/container_registry/gcp/outputs.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/container_registry/gcp/variables.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/docker_build_push/aws/main.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/docker_build_push/gcp/main.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/docker_compose_deploy/aws/inventory.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/docker_compose_deploy/aws/main.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/docker_compose_deploy/gcp/inventory.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/docker_compose_deploy/gcp/main.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/docker_compose_run/aws/inventory.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/docker_compose_run/gcp/inventory.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/docker_compose_snippets/base.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/docker_compose_snippets/elasticsearch.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/docker_compose_snippets/kafka.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/docker_compose_snippets/mongodb.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/docker_compose_snippets/mysql.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/docker_compose_snippets/postgresql.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/docker_compose_snippets/rabbitmq.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/docker_compose_snippets/redis.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/docker_compose_snippets/services/backend_api.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/docker_compose_snippets/services/backend_worker.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/docker_compose_snippets/services/full_stack.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/docker_compose_snippets/traefik.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/docker_compose_snippets/weaviate.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/dockerfiles/python_backend_api +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/dockerfiles/python_backend_worker +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/fetch_remote_files/aws/inventory.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/fetch_remote_files/aws/main.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/fetch_remote_files/gcp/inventory.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/fetch_remote_files/gcp/main.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/frontend_bucket_cert/aws/main.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/frontend_bucket_cert/aws/outputs.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/frontend_bucket_cert/aws/variables.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/frontend_bucket_cert/gcp/main.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/frontend_bucket_cert/gcp/outputs.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/frontend_bucket_cert/gcp/variables.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/frontend_cdn/aws/main.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/frontend_cdn/aws/outputs.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/frontend_cdn/aws/variables.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/frontend_cdn/gcp/main.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/frontend_cdn/gcp/outputs.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/frontend_cdn/gcp/variables.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/frontend_deploy/aws/main.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/frontend_deploy/gcp/main.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/virtual_machine/aws/main.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/virtual_machine/aws/outputs.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/virtual_machine/aws/variables.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/virtual_machine/gcp/main.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/virtual_machine/gcp/outputs.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/virtual_machine/gcp/variables.tf +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/virtual_machine_setup/aws/inventory.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/virtual_machine_setup/aws/main.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/virtual_machine_setup/gcp/inventory.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/opsmith/templates/virtual_machine_setup/gcp/main.yml +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/resources/deploy_demo.gif +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/resources/deploy_demo.svg +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/resources/setup_demo.gif +0 -0
- {opsmith_cli-0.4.5b0 → opsmith_cli-0.6.0}/resources/setup_demo.svg +0 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
name: Tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
pytest:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
strategy:
|
|
15
|
+
fail-fast: false
|
|
16
|
+
matrix:
|
|
17
|
+
python-version: ["3.12", "3.13", "3.14"]
|
|
18
|
+
|
|
19
|
+
steps:
|
|
20
|
+
- uses: actions/checkout@v5
|
|
21
|
+
|
|
22
|
+
- name: Install uv
|
|
23
|
+
uses: astral-sh/setup-uv@v7
|
|
24
|
+
with:
|
|
25
|
+
python-version: ${{ matrix.python-version }}
|
|
26
|
+
|
|
27
|
+
- name: Install dependencies
|
|
28
|
+
run: uv sync --group dev
|
|
29
|
+
|
|
30
|
+
- name: Run tests
|
|
31
|
+
run: uv run pytest
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/PyCQA/isort
|
|
3
|
+
rev: 5.12.0
|
|
4
|
+
hooks:
|
|
5
|
+
- id: isort
|
|
6
|
+
args: ["--profile", "black"]
|
|
7
|
+
- repo: https://github.com/psf/black
|
|
8
|
+
rev: 26.5.1
|
|
9
|
+
hooks:
|
|
10
|
+
- id: black
|
|
11
|
+
args: ["--line-length", "100", "--preview"]
|
|
12
|
+
- repo: https://github.com/pycqa/flake8
|
|
13
|
+
rev: 7.1.0
|
|
14
|
+
hooks:
|
|
15
|
+
- id: flake8
|
|
16
|
+
args: ["--show-source"]
|
|
17
|
+
- repo: https://github.com/codespell-project/codespell
|
|
18
|
+
rev: v2.2.6
|
|
19
|
+
hooks:
|
|
20
|
+
- id: codespell
|
|
21
|
+
additional_dependencies:
|
|
22
|
+
- tomli
|
|
23
|
+
- repo: local
|
|
24
|
+
hooks:
|
|
25
|
+
- id: build-skill-refs
|
|
26
|
+
name: regenerate the agent skill references
|
|
27
|
+
# It regenerates rather than complaining, so a change to a command or the schema updates
|
|
28
|
+
# the skill in the same commit. CI enforces it separately, through test_skill_refs.py,
|
|
29
|
+
# because CI runs pytest and nothing else.
|
|
30
|
+
entry: uv run python scripts/build_skill_refs.py
|
|
31
|
+
language: system
|
|
32
|
+
pass_filenames: false
|
|
33
|
+
files: ^(opsmith/(cli|core)/|opsmith/types\.py|scripts/build_skill_refs\.py)
|
|
34
|
+
- id: mypy
|
|
35
|
+
name: mypy
|
|
36
|
+
# Run through uv rather than mirrors-mypy: the pydantic plugin has to import the same
|
|
37
|
+
# pydantic the project pins, which an isolated hook environment would not have.
|
|
38
|
+
entry: uv run mypy
|
|
39
|
+
language: system
|
|
40
|
+
types: [python]
|
|
41
|
+
pass_filenames: false
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to Opsmith are recorded here. The format follows
|
|
4
|
+
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project follows
|
|
5
|
+
[semantic versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
|
+
|
|
7
|
+
## [0.6.0] - 2026-09-21
|
|
8
|
+
|
|
9
|
+
Coding-harness integration, phase 1 of the
|
|
10
|
+
[migration to 1.0](docs/notes/2026-09-04-migration-plan.md): Opsmith ships the instructions a
|
|
11
|
+
coding agent needs in order to drive it.
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- **An Agent Skill, shipped in the package and installed into your harness.**
|
|
16
|
+
`opsmith agent install --target claude` copies it into `.claude/skills/`, and the other
|
|
17
|
+
targets are `agents`, `codex`, `opencode`, `cursor`, `gemini`, plus `auto`;
|
|
18
|
+
`--target` is required, because installing writes into directories belonging to your other
|
|
19
|
+
tools; `opsmith agent status` says where it is
|
|
20
|
+
and whether it is the version you are running; `opsmith agent uninstall` removes exactly what
|
|
21
|
+
was installed and nothing else. None of the three needs a model or a cloud account, because
|
|
22
|
+
copying files does not. `--agents-md` additionally writes an Opsmith section into `AGENTS.md`
|
|
23
|
+
and an `@AGENTS.md` import into `CLAUDE.md`, between markers, so re-running updates in place.
|
|
24
|
+
The skill teaches the workflow, the ownership rules for `.opsmith/`, the exit codes and the
|
|
25
|
+
run-again loop; two of its four references are generated from the CLI and the pydantic models,
|
|
26
|
+
so they cannot drift from the code.
|
|
27
|
+
- **`opsmith dockerfile validate [--service SLUG] [--timeout S]`** builds each service's
|
|
28
|
+
Dockerfile and runs the image, and reports the build and run outcome with the last fifty lines
|
|
29
|
+
of each. It exits 4 when the model judges the failure to be the Dockerfile's fault, with the
|
|
30
|
+
report in `error.details`, and exits 0 when it does not - a container that exits because the
|
|
31
|
+
database it wants does not exist yet is not a broken Dockerfile, and an agent should not try to
|
|
32
|
+
fix one. With no `--service` it checks every service built from a Dockerfile. `--timeout`
|
|
33
|
+
lengthens the container watch; the build ceiling is not configurable, because shortening it
|
|
34
|
+
would turn a slow but correct build into a failure.
|
|
35
|
+
- **`opsmith --version`**, so a harness can tell which release's instructions it is holding.
|
|
36
|
+
|
|
37
|
+
### Changed
|
|
38
|
+
|
|
39
|
+
- `opsmith config validate`, `config schema` and `config show` return typed results rather than
|
|
40
|
+
ad-hoc dictionaries. The JSON envelopes are unchanged; what changes is that the generated
|
|
41
|
+
command reference can now name each one's result model, which was the point.
|
|
42
|
+
- `opsmith run` and everything else that exits with a status of its own is now described as such
|
|
43
|
+
in the generated reference, derived from the result model rather than written down, so a second
|
|
44
|
+
such command would inherit the note.
|
|
45
|
+
|
|
46
|
+
### Fixed
|
|
47
|
+
|
|
48
|
+
- A Terraform output that cannot be parsed as JSON now carries a hint naming the command to run in
|
|
49
|
+
the working directory, like every other failure. It was the one error in the package raised
|
|
50
|
+
without one.
|
|
51
|
+
|
|
52
|
+
## [0.5.0] - 2026-09-20
|
|
53
|
+
|
|
54
|
+
The headless core, phase 0 of the [migration to 1.0](docs/notes/2026-09-04-migration-plan.md),
|
|
55
|
+
complete: parts 0a to 0g.
|
|
56
|
+
|
|
57
|
+
### Added
|
|
58
|
+
|
|
59
|
+
- `opsmith env plan` reports every answer creating an environment will need, before anything is
|
|
60
|
+
created. For each one it gives the key, the question, the options where it can list them, the
|
|
61
|
+
default where there is one, and the environment variable a secret should arrive in - and says
|
|
62
|
+
which of them this run would actually stop for, which depends on whether `--accept-defaults`
|
|
63
|
+
is in use. It writes nothing, creates nothing, and needs neither docker nor terraform.
|
|
64
|
+
It does read from your cloud account where it can, to list the regions the account really has,
|
|
65
|
+
but a machine that has no credentials yet still gets the plan and is told which parts of it
|
|
66
|
+
went unlisted.
|
|
67
|
+
- Which questions exist depends on the cloud provider and the deployment strategy, so a plan
|
|
68
|
+
that has not been told those two reports what it can, names them as the answers to give first,
|
|
69
|
+
and says `complete: false` rather than passing a short list off as the whole one. The same
|
|
70
|
+
holds for a provider or strategy that declares no questions: `partial_reasons` names it.
|
|
71
|
+
- `opsmith env plan --write-answers FILE` writes that list as a YAML file to fill in and hand
|
|
72
|
+
back with `--answers`. Anything with a default is written with it; anything still to be
|
|
73
|
+
answered is written commented out, because a key present with an empty value counts as an
|
|
74
|
+
answer of the empty string and would quietly satisfy the question it was meant to leave open.
|
|
75
|
+
A secret is always commented out - those belong in a `--env-file`.
|
|
76
|
+
- Cloud providers declare their questions as data. `AWS` declares the region, `GCP` the project,
|
|
77
|
+
the region and the zone, each saying which earlier answer its listing depends on. A question
|
|
78
|
+
declared this way is asked through exactly the same interaction as one asked inline, so a
|
|
79
|
+
flag, a file or an environment variable answers it identically; what is new is only that it
|
|
80
|
+
can be reported before it is reached.
|
|
81
|
+
- Naming a cloud provider or a deployment strategy that is not installed is now
|
|
82
|
+
`INVALID_ARGUMENT` and exit 2, with the names that would have worked in the details. It used
|
|
83
|
+
to be an unhandled `ValueError` reported as an internal failure.
|
|
84
|
+
|
|
85
|
+
- Everything the `setup` and `deploy` menus can do is now a subcommand that takes flags and never
|
|
86
|
+
prompts: `opsmith init`, `env list`, `env create`, `env status`, `release`, `update`, `run` and
|
|
87
|
+
`destroy`. The menus remain, and dispatch to exactly the same functions, so the two cannot
|
|
88
|
+
drift. See "Running Opsmith without a terminal" in the README.
|
|
89
|
+
- Every flag is shorthand for an answer, on the keys the questions already had: `--region
|
|
90
|
+
us-east-1` is `--answer env.region=us-east-1`, and `--domain api=api.example.com` is `--answer
|
|
91
|
+
env.domain.api=api.example.com`. Also `--name`, `--provider`, `--strategy`, `--project-id`,
|
|
92
|
+
`--zone`, `--instance-type`, `--domain-email`, `--env-var KEY=VALUE`, `--build-env
|
|
93
|
+
slug:KEY=VALUE`, `--app-name` and `--rescan`.
|
|
94
|
+
- Every command returns a typed result, which is what `--output json` now puts in the envelope's
|
|
95
|
+
`result` field: the infrastructure, the registry, the urls per service and the DNS records a
|
|
96
|
+
creation asked for; the images and health verdict of a release; what a destroy tore down. Each
|
|
97
|
+
also carries `notices` and `next_steps`, so a driver reading only stdout gets what a person
|
|
98
|
+
watching the terminal would have seen.
|
|
99
|
+
- Infrastructure is reported as a list of `Resource` — a `kind`, an `id`, and whatever of `name`,
|
|
100
|
+
`region`, `address`, `size` and `details` applies — rather than as fields shaped for a single
|
|
101
|
+
virtual machine. A strategy that raises several machines reports several of them; one that
|
|
102
|
+
deploys to a cluster or a serverless platform reports what it actually made. `destroy` reports
|
|
103
|
+
the same shape it created, in place of the strings it used to name things with.
|
|
104
|
+
- `opsmith run` reports which host the command ran on, in the result's `target`.
|
|
105
|
+
- `opsmith run` exits with the exit code of the command it ran, and reports the tail of its
|
|
106
|
+
stdout and stderr in the result. A non-zero exit is no longer reported as a failed playbook.
|
|
107
|
+
- `opsmith env list` and `opsmith env status` read the repository and nothing else. They need no
|
|
108
|
+
cloud account, no docker and no terraform, and run with an empty `PATH`.
|
|
109
|
+
- `opsmith init --app-name "My App"` writes the deployment configuration without scanning the
|
|
110
|
+
repository, for a harness that intends to author the services itself and have Opsmith validate
|
|
111
|
+
them.
|
|
112
|
+
- `opsmith env create --no-deploy` writes the environment to the configuration without creating
|
|
113
|
+
anything. Running `env create` again for an environment that has not been deployed picks it up
|
|
114
|
+
rather than refusing the name, so a creation that stopped part way can be finished.
|
|
115
|
+
- Headless runs. A run with no terminal never blocks on a question: it resolves the answer, or it
|
|
116
|
+
stops with the key that is missing and the command to run again. Answers come from `--answer
|
|
117
|
+
key=value`, `--env-file`, `--answers`, `OPSMITH_ANSWER_<KEY>`, and what the environment has
|
|
118
|
+
already been asked, in that order; `--accept-defaults` takes each question's own default.
|
|
119
|
+
A run is headless when `--non-interactive` or `OPSMITH_NON_INTERACTIVE` says so, when stdin is
|
|
120
|
+
not a terminal, or when `--output json` is in use.
|
|
121
|
+
- Two new stops, both resumable by running the same command again: `MISSING_ANSWER` (exit 3),
|
|
122
|
+
which names the key, the choices and the variable that would carry a secret; and
|
|
123
|
+
`PENDING_ACTION` (exit 8), which names something outside Opsmith that has to happen first. Both
|
|
124
|
+
carry the command to resume with, which is the invocation that stopped, minus its credentials.
|
|
125
|
+
- An answer store per environment. Every answer is written the moment it is given, in both
|
|
126
|
+
interactive and headless runs, so a run that stops never asks for the same thing twice.
|
|
127
|
+
- Opsmith now keeps what it remembers outside your repository, under
|
|
128
|
+
`~/.opsmith/projects/<name>-<digest>/environments/<env>/`: the answers an environment has given,
|
|
129
|
+
the secrets it needs until the environment itself holds them, and the steps a run has finished.
|
|
130
|
+
None of it is authored and none of it belongs in a diff; keeping the secrets out of the tree is
|
|
131
|
+
also the only promise that holds, since an ignore rule says nothing about `git add -f`, an
|
|
132
|
+
archive of the directory, or a build context that never read it. Set `state_dir:` in
|
|
133
|
+
`.opsmith.conf.yml` to put it somewhere else.
|
|
134
|
+
- `opsmith setup --accept-detected` takes the detected services and dependencies as they are,
|
|
135
|
+
instead of opening an editor to review each one.
|
|
136
|
+
- `ctx.steps.once("vm.create")`, a ledger for a step that cannot simply be run again, kept in
|
|
137
|
+
`.opsmith/environments/<env>/steps.yml`. It is a convenience for strategy authors; a strategy
|
|
138
|
+
whose steps are idempotent needs nothing.
|
|
139
|
+
- `opsmith config validate|schema|show`: check, describe and print the deployment configuration
|
|
140
|
+
without a cloud account, docker or terraform. `config schema --format markdown` renders the
|
|
141
|
+
schema as a document.
|
|
142
|
+
- `--output json`: exactly one JSON envelope on stdout, with progress streamed to stderr as NDJSON.
|
|
143
|
+
- The model may be configured without typing it: `--model` falls back to `OPSMITH_MODEL` and then
|
|
144
|
+
to `model:` in `.opsmith.conf.yml`, and `--api-key` falls back to the provider's own key
|
|
145
|
+
variable (`OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `GEMINI_API_KEY`).
|
|
146
|
+
- Stable error codes and exit codes: 2 for a usage or validation error, 4 for a failing external
|
|
147
|
+
tool, 5 for cloud credentials, 6 for a model that gave up. Every failure carries a code, a
|
|
148
|
+
message, a hint and machine-readable details.
|
|
149
|
+
- Tracing is an extra: `pip install "opsmith-cli[logfire]"` to use `--logfire-token`.
|
|
150
|
+
|
|
151
|
+
### Changed
|
|
152
|
+
|
|
153
|
+
- **Breaking, for third-party cloud providers.** `get_account_details` is replaced by three
|
|
154
|
+
classmethods on `BaseCloudProvider`, because it was doing three things that happen at three
|
|
155
|
+
different times: `detect_account` reaches the account and reads the facts that are not a
|
|
156
|
+
matter of choice, and must not ask anything; `questions` declares what needs choosing, as
|
|
157
|
+
data; and `build_detail` turns both into the record the environment keeps. Only the first and
|
|
158
|
+
last are required - a provider that declares no questions and asks inside `build_detail`
|
|
159
|
+
through `ctx.interact` works exactly as before, and gives up nothing but its coverage in
|
|
160
|
+
`env plan`. There are no known third-party providers; this is acceptable before 1.0.
|
|
161
|
+
- **Breaking, for GCP environments created headlessly.** The zone used to be taken silently as
|
|
162
|
+
the first of the region's zones, which is why `--zone` existed and did nothing. It is a real
|
|
163
|
+
question now: at a terminal the first zone is preselected, so pressing enter gives the old
|
|
164
|
+
answer, and a headless run supplies `--zone` or takes the same first zone with
|
|
165
|
+
`--accept-defaults`. A headless GCP run that did neither now stops with `MISSING_ANSWER`
|
|
166
|
+
naming `env.zone`, which `opsmith env plan` will have told it about beforehand.
|
|
167
|
+
- Splitting the providers up narrows their error handling as a side effect worth having: each
|
|
168
|
+
call to a cloud SDK is guarded on its own rather than a whole flow at once, so a failure is
|
|
169
|
+
reported against the thing that actually failed - reaching the account, or listing the regions
|
|
170
|
+
- instead of everything in the block being reported as broken credentials.
|
|
171
|
+
- **Breaking, for third-party deployment strategies.** The five action methods on
|
|
172
|
+
`BaseDeploymentStrategy` now return a result model from `opsmith.core.results` — `deploy` an
|
|
173
|
+
`EnvCreateResult`, `release` a `ReleaseResult`, `update` an `UpdateResult`, `run` a `RunResult`,
|
|
174
|
+
`destroy` a `DestroyResult` — and a sixth method, `status`, reports what an environment is
|
|
175
|
+
running by reading its own state file without contacting a cloud. A strategy still has to
|
|
176
|
+
declare nothing ahead of time and still asks whatever it needs through `ctx.interact`; what
|
|
177
|
+
changed is that it now describes what it did, because the CLI reports that. It may now also
|
|
178
|
+
implement `questions`, listing what it is going to ask so that `opsmith env plan` can report
|
|
179
|
+
it - which is optional, is never asked on the strategy's behalf, and costs a strategy that
|
|
180
|
+
skips it nothing but a line in the plan saying the list is partial. Those descriptions name no
|
|
181
|
+
topology — infrastructure is a list of `Resource`, not a public IP and an instance type — so a
|
|
182
|
+
strategy that is not one machine can still answer honestly. There are no known third-party
|
|
183
|
+
strategies; this is acceptable before 1.0.
|
|
184
|
+
- There is no blanket `--yes`. The draft CLI contract carried one, meaning "accept every
|
|
185
|
+
destructive confirmation in this run"; it is not in 0.5.0. It was pure sugar - `--answer
|
|
186
|
+
delete.confirm=DELETE` already says the same thing for one gate rather than all of them - and
|
|
187
|
+
a flag that generic cannot be read where it is written: `opsmith --yes destroy --env dev` puts
|
|
188
|
+
the approval nowhere near what it approves, and the word says nothing about which of a run's
|
|
189
|
+
confirmations it covers. Anything irreversible is now answered by name, and `--accept-defaults`
|
|
190
|
+
still refuses those keys, so no blanket option approves an irreversible action.
|
|
191
|
+
- Running `deploy` in a repository that has not been set up now exits 2 with `INVALID_CONFIG` and
|
|
192
|
+
a hint naming `opsmith setup`, rather than exiting 1 with no machine-readable reason.
|
|
193
|
+
- Asking for an environment the configuration does not declare is `UNKNOWN_ENVIRONMENT` and exit
|
|
194
|
+
2, with the names that do exist in the details. It used to be an unhandled `ValueError`.
|
|
195
|
+
- Importing Opsmith no longer requires `git` on the `PATH`. GitPython looks for the executable
|
|
196
|
+
while it is being imported, so a module-level import made every command fail on a machine
|
|
197
|
+
without git, long before anything asked for a repository. It is imported where a repository is
|
|
198
|
+
opened instead, which is what lets the commands that need no tooling run without any.
|
|
199
|
+
- A missing or unrunnable `git` is now a usage error naming git, exit 2, rather than an unhandled
|
|
200
|
+
crash reported as a bug in Opsmith. It is distinct from "this is not a git repository", because
|
|
201
|
+
the two are fixed differently: one wants git installed, the other wants `git init`.
|
|
202
|
+
- The DNS step waits instead of asking. Opsmith shows the records, then polls until they resolve
|
|
203
|
+
rather than asking whether they were created. Interactively it re-checks when you say so;
|
|
204
|
+
headlessly it polls until `--wait-timeout` and then exits 8 with the records that are still
|
|
205
|
+
missing, and creating them and running the command again resumes at the wait.
|
|
206
|
+
- `--model` and `--api-key` no longer prompt when they are missing. A run with no model
|
|
207
|
+
configured exits 2 and names every way to supply one, so a headless run can never hang on a
|
|
208
|
+
prompt. Option order no longer matters either, and `--help` no longer needs either of them.
|
|
209
|
+
- docker and terraform are checked per command rather than for every command, so commands that
|
|
210
|
+
do not deploy anything run on a machine without them. A missing tool now exits 2 rather than 1.
|
|
211
|
+
- The rules that the `setup` editors enforced — a provider left as `user_choice`, the same
|
|
212
|
+
provider listed twice — are now applied by `config validate` as well, against the same code.
|
|
213
|
+
|
|
214
|
+
### Fixed
|
|
215
|
+
|
|
216
|
+
- Reporting a problem with an edited service or dependency no longer crashes. The details of a
|
|
217
|
+
notice are spread across the event's own fields, and a `ConfigIssue` carries a `message`, which
|
|
218
|
+
collided with the event's - so the one path that reports an invalid edit raised a `TypeError`
|
|
219
|
+
instead of saying what was wrong. Details named after a field of the event are nested now.
|
|
220
|
+
- Ansible variables no longer travel on the command line. They carry the whole compose `.env`
|
|
221
|
+
body, which was readable by every process on the machine and was repeated in the details of a
|
|
222
|
+
failed playbook. They go in a file only the current user can read, removed when the run ends.
|
|
223
|
+
- Build-time environment variables are no longer written to `state.yml` in the clear. They move
|
|
224
|
+
to the environment's answer store, secrets to its secret half. An existing `state.yml` hands
|
|
225
|
+
its values over on the next release or update, so nothing is asked for again, and the field is
|
|
226
|
+
never written back.
|
|
227
|
+
|
|
228
|
+
### Removed
|
|
229
|
+
|
|
230
|
+
- The unused `networkx` and `pick` dependencies.
|
|
231
|
+
- `pydantic-ai` in favour of `pydantic-ai-slim[anthropic,google,openai]`, which is what the
|
|
232
|
+
bundled models need. `boto3` and `pydantic-settings`, previously used but undeclared, are now
|
|
233
|
+
declared. A third-party model plugin for a provider outside OpenAI, Anthropic and Google must
|
|
234
|
+
now declare the pydantic-ai extra it needs.
|