thothctl 0.20.0__tar.gz → 0.20.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {thothctl-0.20.0 → thothctl-0.20.2}/PKG-INFO +1 -1
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/document/architecture_renderer.py +6 -2
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/scan/scanners/opa.py +62 -0
- thothctl-0.20.2/src/thothctl/version.py +2 -0
- thothctl-0.20.2/tests/test_opa_data_files.py +169 -0
- thothctl-0.20.0/src/thothctl/version.py +0 -2
- {thothctl-0.20.0 → thothctl-0.20.2}/.devcontainer/Dockerfile +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/.devcontainer/README.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/.devcontainer/devcontainer.json +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/.github/workflows/docs.yml +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/.github/workflows/python-publish.yml +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/.gitignore +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/.pre-commit-config.yaml +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/.readthedocs.yaml +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/Dockerfile +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/LICENSE +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/README.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/catalog/catalog-info.yaml +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/dashboard/README.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/ai-review/README.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/ai-review/agent_specifications.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/ai-review/agentcore.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/check/blast-radius.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/check/check_environment.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/check/check_iac.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/check/check_overview.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/check/check_project_iac.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/check/check_space.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/check/cost-analysis-quick-reference.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/check/cost-analysis.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/check/customizing_rules.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/check/deps-advanced.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/check/deps.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/check/drift-detection.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/check/plan.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/document/customizing_docs.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/document/document_iac.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/document/document_overview.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/document/iac.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/document/use_cases.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/generate/generate_components.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/generate/generate_stacks.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/init/init.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/init/init_space.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/inventory/CHANGELOG.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/inventory/frameworks/terraform.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/inventory/frameworks/terragrunt.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/inventory/iac.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/inventory/inventory_iac.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/inventory/inventory_overview.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/list/list_overview.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/list/list_projects.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/list/list_spaces.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/mcp/mcp.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/project/iac.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/project/project_cleanup.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/project/project_convert.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/project/project_overview.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/project/project_upgrade.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/project/use_cases.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/remove/remove_overview.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/remove/remove_project.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/remove/remove_space.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/scan/iac.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/scan/scan_iac.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/scan/scan_overview.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/scan/use_cases.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/upgrade/upgrade_overview.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/concepts.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/cross_platform_support.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/framework_architecture.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/infrasctructure_composition.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/policy_as_code.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/roadmap_fdi.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/software_architecture.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/space_configuration.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/use_cases/README.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/use_cases/ai_dlc.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/use_cases/check_command.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/use_cases/devsecops_quickstart.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/use_cases/devsecops_sdlc.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/use_cases/inventory_command.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/use_cases/platform_engineering_templates.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/use_cases/space_management.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/use_cases/tasks/create_template.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/iac_devsecops_use_case.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/automate_tasks_command.png +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/commnad_init.png +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/create_component.gif +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/create_inventory.gif +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/doc_command.png +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/document_project_code.gif +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/framework/thothforge-framework.svg +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/framework/thothfr.png +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/iacpeerbot_summary.png +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/icon-light.png +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/icon.png +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/init_project.gif +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/inventory_command.png +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/notification_img.png +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/report_dependencies.png +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/report_dependencies_summary.png +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/restore_inventory_version.gif +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/reuse_project_pattern.gif +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/scan_code.gif +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/scan_command.png +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/stable/scan_report_example.png +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/sync_wk_command.png +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/transform_command.png +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/update_inventory_version.gif +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/validate_command.png +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/validate_environment.gif +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/img/validate_project.gif +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/includes/abbreviations.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/index.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/installation/devcontainer_setup.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/installation/linux_installation.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/installation/windows_installation.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/javascripts/tablesort.js +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/mcp.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/navigation.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/quick_start.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/requirements.txt +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/stylesheets/extra-enhanced.css +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/stylesheets/extra.css +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/telemetry.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/template_engine/cli_commands_audit.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/template_engine/for_developers.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/template_engine/for_platform_engineers.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/template_engine/github_templates.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/template_engine/template_engine.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/troubleshooting/linux_troubleshooting.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/troubleshooting/macos_troubleshooting.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/troubleshooting/troubleshooting.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/docs/troubleshooting/windows_troubleshooting.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/mkdocs.yaml +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/pyproject.toml +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/scripts/run_mcp_server.sh +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/application/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/autocomplete.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/cli.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/ai_review/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/ai_review/cli.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/ai_review/commands/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/ai_review/commands/analyze.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/ai_review/commands/apply_fix.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/ai_review/commands/configure.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/ai_review/commands/configure_decisions.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/ai_review/commands/decide.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/ai_review/commands/history.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/ai_review/commands/improve.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/ai_review/commands/orchestrate.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/ai_review/commands/override.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/ai_review/commands/report.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/ai_review/commands/serve.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/check/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/check/cli.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/check/commands/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/check/commands/environment.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/check/commands/iac.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/check/commands/project/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/check/commands/project/iac.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/check/commands/project.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/dashboard/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/dashboard/cli.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/dashboard/commands/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/dashboard/commands/launch.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/document/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/document/cli.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/document/commands/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/document/commands/iac.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/generate/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/generate/cli.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/generate/commands/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/generate/commands/component.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/generate/commands/stacks.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/init/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/init/cli.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/init/commands/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/init/commands/env.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/init/commands/project.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/init/commands/space.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/init/commands/template.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/inventory/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/inventory/cli.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/inventory/commands/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/inventory/commands/check.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/inventory/commands/iac.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/list/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/list/cli.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/list/commands/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/list/commands/projects.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/list/commands/spaces.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/mcp/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/mcp/cli.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/mcp/commands/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/mcp/commands/register.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/mcp/commands/server.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/mcp/commands/status.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/mcp/commands/stop.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/project/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/project/cli.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/project/commands/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/project/commands/bootstrap.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/project/commands/cleanup.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/project/commands/convert.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/project/commands/upgrade.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/remove/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/remove/cli.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/remove/project.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/remove/space.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/scan/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/scan/cli.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/scan/commands/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/scan/commands/iac.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/space/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/space/cli.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/space/commands/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/space/commands/activate.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/space/commands/show.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/space/commands/update.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/commands/upgrade/cli.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/common/.thothcf.setup.toml +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/common/.thothcf_home.toml +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/common/.thothcf_module.toml +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/common/.thothcf_project.toml +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/common/.thothcf_template_parameters.toml +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/common/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/common/common.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/common/terragrunt/.thothcf_project.toml +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/config/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/config/constants.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/config/default_values.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/config/defaults.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/config/models.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/config/settings.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/config/template_config.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/config/template_configs.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/config/templates.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/config/validation.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/core/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/core/cli_ui.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/core/commands.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/core/config.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/core/integrations/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/core/integrations/azure_devops/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/core/integrations/azure_devops/get_azure_devops.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/core/integrations/azure_devops/pull_request_comments.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/core/integrations/github/get_github.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/core/integrations/github/pull_request_comments.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/core/integrations/integrate_messages_services/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/core/integrations/integrate_messages_services/microsoft_teams.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/core/integrations/integrate_messages_services/sent_message_teams.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/core/integrations/pattern_names.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/core/integrations/pr_comments/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/core/integrations/pr_comments/pr_comment_publisher.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/core/logger.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/core/telemetry.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/core/version_tools.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/domain/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/domain/interfaces/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/domain/models/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/mcp/README.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/mcp/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/mcp/server.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/agentcore/agentcore.json +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/ai_agent.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/analyzers/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/analyzers/code_reviewer.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/analyzers/context_builder.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/analyzers/report_analyzer.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/analyzers/risk_assessor.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/bedrock_agent_api.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/config/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/config/ai_settings.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/config/decision_rules.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/decision_engine.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/main.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/memory.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/orchestrator.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/pr_decision_publisher.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/providers/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/providers/azure_provider.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/providers/bedrock_agent_provider.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/providers/bedrock_provider.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/providers/ollama_provider.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/providers/openai_provider.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/safety/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/safety/safety_guard.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/strands_agent.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/tracing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/utils/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/utils/cost_tracker.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/utils/fix_patterns.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/utils/fix_prompts.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/utils/formatters.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/ai_review/utils/prompts.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/environment/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/environment/check_environment.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/org_policy_loader.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/blast_radius_service.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/check_origin_version.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/check_project_structure.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/cost_analyzer.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/models/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/models/cloudformation_mapper.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/models/cost_models.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/aws_pricing_client.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/base_pricing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/providers/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/providers/apigateway_pricing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/providers/bedrock_pricing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/providers/cloudwatch_pricing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/providers/dynamodb_pricing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/providers/ebs_pricing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/providers/ec2_pricing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/providers/ecs_pricing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/providers/eip_pricing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/providers/eks_pricing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/providers/elb_pricing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/providers/free_resources_pricing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/providers/kms_pricing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/providers/lambda_pricing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/providers/msk_pricing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/providers/rds_pricing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/providers/s3_pricing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/providers/secrets_manager_pricing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/pricing/providers/vpc_pricing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/cost/unified_cost_report.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/drift/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/drift/drift_ai.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/drift/drift_history.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/drift/drift_policy.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/drift/drift_report.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/drift/drift_service.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/drift/models.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/risk_assessment.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/project/validate_project_structure.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/rule_merger.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/check/stack_optimizer/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/dashboard/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/dashboard/dashboard_service.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/dashboard/data_loader.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/document/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/document/create_documentation.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/document/files_content.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/document/files_scan.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/document/iac_documentation.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/document/iac_grunt_graph.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/document/iac_grunt_info.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/document/topology_generator.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/generate/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/generate/create_stacks/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/generate/create_stacks/config_generator.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/generate/create_stacks/remote_config_generation.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/generate/create_stacks/stack_service.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/generate/create_stacks/templates/terragrunt.hcl.j2 +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/generate/create_template/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/generate/create_template/config.yaml +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/generate/create_template/create_code.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/generate/create_template/create_component.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/generate/create_template/create_component_service.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/generate/create_template/create_stacks.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/generate/create_template/create_template.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/generate/create_template/files_content.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/generate/create_template/github_template_loader.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/generate/create_template/project_templates.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/init/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/init/environment/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/init/environment/install_tools.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/init/project/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/init/project/project.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/init/space/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/init/space/example_space.toml +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/init/space/local_registry.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/init/space/space.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/inventory/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/inventory/changelog_parser.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/inventory/inventory_service.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/inventory/models.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/inventory/module_compatibility_service.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/inventory/report_service.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/inventory/schema_compatibility_service.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/inventory/terragrunt_parser.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/inventory/update_versions.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/inventory/version_service.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/mcp/README.md +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/mcp/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/mcp/simple_http_server.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/mcp/stdio_server.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/project/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/project/bootstrap/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/project/bootstrap/bootstrap_service.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/project/cleanup/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/project/cleanup/clean_project.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/project/cleanup/clean_space.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/project/convert/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/project/convert/conversion_service.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/project/convert/get_project_data.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/project/convert/post_init.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/project/convert/project_converter.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/project/convert/project_defaults.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/project/convert/set_project_parameters.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/project/create_terramate/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/project/create_terramate/create_terramate_stacks.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/project/create_terramate/detect_changes_stacks.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/project/create_terramate/manage_terramate_stacks.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/project/upgrade/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/project/upgrade/upgrade_service.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/scan/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/scan/compliance_review.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/scan/import_reports.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/scan/models.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/scan/report_parser.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/scan/sarif_output.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/scan/scan_history.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/scan/scan_service.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/scan/scanners/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/scan/scanners/checkov.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/scan/scanners/kics.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/scan/scanners/scan_reports.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/scan/scanners/scanners.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/scan/scanners/terraform_compliance.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/scan/scanners/tfsec.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/services/scan/scanners/trivy.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/templates/reports/inventory_report.html +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/templates/reports/inventory_report.js +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/templates/unified_report_styles.css +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/banner.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/common/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/common/create_compliance_html_reports.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/common/create_html_reports.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/common/delete_directory.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/common/fix_report_styling.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/common/render_scan_report.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/common/report_html_utils.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/common/templates/dashboard.html +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/common/templates/index_report.html +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/common/templates/individual_report.html +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/common/templates/simple_report.html +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/common/templates/unified_report_styles.css +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/common/templates/unified_scan_report.html +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/common/templates/unified_simple_report.html +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/common/templates/xunit_report.html +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/crypto.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/manage_backend_resources/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/manage_backend_resources/manage_backend_resources.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/modules_ops/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/modules_ops/terraform_module_details.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/modules_ops/terraform_modules_fetcher.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/platform_utils.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/process_hcl/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/process_hcl/analyze_terraform_plan.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/process_hcl/graph_manager.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/process_hcl/graph_terragrunt_dependencies.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/process_hcl/process_terraform_file.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/process_hcl/risk_analyzing_terraform_plan.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/sync_workspaces/__init__.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/sync_workspaces/sync_terraform_workspaces.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/sync_workspaces/sync_terragrunt_workspaces.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/template_loader.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/utils/thoth_colors.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/src/thothctl/wellcome_banner.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/conftest.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_agentcore_entrypoint.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_aws_pricing_client.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_azure_devops_pr_comments.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_bedrock_pricing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_cdk_language_selection.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_context_steering.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_cost_analyzer.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_cost_models.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_cost_pr_comments.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_dashboard_loading_fix.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_dashboard_service.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_drift.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_drift_detection.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_ec2_pricing.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_github_pr_comments.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_iac_cost_integration.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_inventory_pr_comments.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_kics_scanner.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_mermaid_edge_labels.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_new_cost_providers.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_parallel_scan.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_platform_utils.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_pr_comment_publisher.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_provider_source_url_fix.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_provider_versions.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_scan_pr_comments.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_space_command.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_space_management.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_stack_optimizer.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_template_url_fix.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_terragrunt_parser.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tests/test_topology_generator.py +0 -0
- {thothctl-0.20.0 → thothctl-0.20.2}/tox.ini +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: thothctl
|
|
3
|
-
Version: 0.20.
|
|
3
|
+
Version: 0.20.2
|
|
4
4
|
Summary: A CLI for Developer Control Plane. Accelerate your cloud IaC deployments.
|
|
5
5
|
Project-URL: SourceCode, https://github.com/thothforge/thothctl
|
|
6
6
|
Project-URL: HomePage, https://github.com/thothforge/thothctl
|
|
@@ -179,13 +179,17 @@ def render_architecture_diagram(topology, output_path: str, fmt: str = "png") ->
|
|
|
179
179
|
if not cls:
|
|
180
180
|
continue
|
|
181
181
|
|
|
182
|
-
# Build label
|
|
182
|
+
# Build label — use friendly AWS service name
|
|
183
183
|
short_name = node.name.split("[")[0]
|
|
184
|
+
# Use label (e.g. "Aurora", "VPC") unless name is more descriptive
|
|
185
|
+
display_name = node.label
|
|
186
|
+
if short_name and short_name not in ("this", "default") and short_name != node.label.lower().replace(" ", "_"):
|
|
187
|
+
display_name = f"{node.label}\n({short_name})"
|
|
184
188
|
action_badge = {
|
|
185
189
|
"create": " 🆕", "update": " ✏️",
|
|
186
190
|
"delete": " 🗑️", "replace": " ♻️"
|
|
187
191
|
}.get(node.action.value, "")
|
|
188
|
-
label = f"{
|
|
192
|
+
label = f"{display_name}{action_badge}"
|
|
189
193
|
|
|
190
194
|
obj = cls(label)
|
|
191
195
|
node_objects[node.address] = obj
|
|
@@ -5,6 +5,10 @@ Supports two modes:
|
|
|
5
5
|
- opa: Plan-based evaluation using `opa exec` against tfplan.json files
|
|
6
6
|
|
|
7
7
|
Both modes use the same Rego policy language and can share policies.
|
|
8
|
+
|
|
9
|
+
Data files (params.yaml / params.json) in the policy directory are automatically
|
|
10
|
+
loaded into OPA's data namespace, enabling externalized policy parameters.
|
|
11
|
+
YAML files are converted to JSON at scan time for OPA compatibility.
|
|
8
12
|
"""
|
|
9
13
|
|
|
10
14
|
import json
|
|
@@ -53,6 +57,58 @@ class OPAScanner(ScannerPort):
|
|
|
53
57
|
|
|
54
58
|
# ── Conftest mode ──────────────────────────────────────────────────
|
|
55
59
|
|
|
60
|
+
def _prepare_data_files(self, policy_dir: str) -> None:
|
|
61
|
+
"""Convert YAML data files to JSON in the policy directory.
|
|
62
|
+
|
|
63
|
+
OPA/Conftest natively load .json files into the data namespace but not YAML.
|
|
64
|
+
This method finds *.yaml/*.yml data files (excluding .rego test data) in the
|
|
65
|
+
policy directory and generates corresponding .json files so that Rego policies
|
|
66
|
+
can reference them via data.<filename>.<key>.
|
|
67
|
+
|
|
68
|
+
This enables teams to manage policy parameters in human-readable YAML while
|
|
69
|
+
keeping OPA compatibility transparent.
|
|
70
|
+
"""
|
|
71
|
+
policy_path = Path(policy_dir)
|
|
72
|
+
if not policy_path.is_dir():
|
|
73
|
+
return
|
|
74
|
+
|
|
75
|
+
yaml_files = list(policy_path.glob("*.yaml")) + list(policy_path.glob("*.yml"))
|
|
76
|
+
|
|
77
|
+
# Filter: only convert files that look like data/param files
|
|
78
|
+
# (skip files that are test fixtures, conftest config, etc.)
|
|
79
|
+
skip_prefixes = ("conftest", "opa", ".")
|
|
80
|
+
data_files = [
|
|
81
|
+
f for f in yaml_files
|
|
82
|
+
if not f.name.startswith(skip_prefixes)
|
|
83
|
+
]
|
|
84
|
+
|
|
85
|
+
if not data_files:
|
|
86
|
+
return
|
|
87
|
+
|
|
88
|
+
try:
|
|
89
|
+
import yaml
|
|
90
|
+
except ImportError:
|
|
91
|
+
self.logger.warning(
|
|
92
|
+
"PyYAML not installed — cannot convert YAML data files to JSON. "
|
|
93
|
+
"Install with: pip install pyyaml"
|
|
94
|
+
)
|
|
95
|
+
return
|
|
96
|
+
|
|
97
|
+
for yaml_file in data_files:
|
|
98
|
+
json_file = yaml_file.with_suffix(".json")
|
|
99
|
+
# Only regenerate if YAML is newer than JSON (or JSON doesn't exist)
|
|
100
|
+
if json_file.exists() and json_file.stat().st_mtime >= yaml_file.stat().st_mtime:
|
|
101
|
+
continue
|
|
102
|
+
try:
|
|
103
|
+
with open(yaml_file, "r", encoding="utf-8") as yf:
|
|
104
|
+
data = yaml.safe_load(yf)
|
|
105
|
+
with open(json_file, "w", encoding="utf-8") as jf:
|
|
106
|
+
json.dump(data, jf, indent=2, ensure_ascii=False)
|
|
107
|
+
self.logger.info(f"Converted {yaml_file.name} → {json_file.name}")
|
|
108
|
+
self.ui.show_info(f"📄 Data file: {yaml_file.name} → {json_file.name}")
|
|
109
|
+
except Exception as e:
|
|
110
|
+
self.logger.warning(f"Failed to convert {yaml_file}: {e}")
|
|
111
|
+
|
|
56
112
|
def _scan_with_conftest(
|
|
57
113
|
self, directory: str, reports_dir: str, policy_dir: str, options: Dict
|
|
58
114
|
) -> Dict[str, str]:
|
|
@@ -74,6 +130,9 @@ class OPAScanner(ScannerPort):
|
|
|
74
130
|
)
|
|
75
131
|
return {"status": "SKIPPED", "error": "No policy directory found"}
|
|
76
132
|
|
|
133
|
+
# Convert YAML data files to JSON for OPA data namespace
|
|
134
|
+
self._prepare_data_files(abs_policy)
|
|
135
|
+
|
|
77
136
|
# Collect scannable files
|
|
78
137
|
scan_files = self._find_scannable_files(abs_dir)
|
|
79
138
|
if not scan_files:
|
|
@@ -196,6 +255,9 @@ class OPAScanner(ScannerPort):
|
|
|
196
255
|
)
|
|
197
256
|
return {"status": "SKIPPED", "error": "No policy directory found"}
|
|
198
257
|
|
|
258
|
+
# Convert YAML data files to JSON for OPA data namespace
|
|
259
|
+
self._prepare_data_files(abs_policy)
|
|
260
|
+
|
|
199
261
|
# Find tfplan.json files
|
|
200
262
|
plan_files = self._find_plan_files(abs_dir)
|
|
201
263
|
if not plan_files:
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"""Unit tests for OPA scanner YAML→JSON data file conversion."""
|
|
2
|
+
import json
|
|
3
|
+
import os
|
|
4
|
+
import tempfile
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
import pytest
|
|
8
|
+
import yaml
|
|
9
|
+
|
|
10
|
+
from thothctl.services.scan.scanners.opa import OPAScanner
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class TestPrepareDataFiles:
|
|
14
|
+
"""Test the _prepare_data_files YAML→JSON conversion."""
|
|
15
|
+
|
|
16
|
+
def setup_method(self):
|
|
17
|
+
self.scanner = OPAScanner()
|
|
18
|
+
|
|
19
|
+
def test_converts_yaml_to_json(self, tmp_path):
|
|
20
|
+
"""params.yaml should be converted to params.json."""
|
|
21
|
+
params = {
|
|
22
|
+
"tags": {
|
|
23
|
+
"required_tags": ["Project", "Environment"],
|
|
24
|
+
"allowed_values": {
|
|
25
|
+
"Project": ["sbsb001-bank4us", "sbsb002-kora"],
|
|
26
|
+
"Environment": ["dev", "qa", "prod"],
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
"naming": {"pattern": "^[a-z0-9-]+$"},
|
|
30
|
+
}
|
|
31
|
+
yaml_file = tmp_path / "params.yaml"
|
|
32
|
+
yaml_file.write_text(yaml.dump(params))
|
|
33
|
+
|
|
34
|
+
self.scanner._prepare_data_files(str(tmp_path))
|
|
35
|
+
|
|
36
|
+
json_file = tmp_path / "params.json"
|
|
37
|
+
assert json_file.exists(), "params.json should be created"
|
|
38
|
+
loaded = json.loads(json_file.read_text())
|
|
39
|
+
assert loaded == params
|
|
40
|
+
|
|
41
|
+
def test_skips_conftest_yaml(self, tmp_path):
|
|
42
|
+
"""conftest.yaml should NOT be converted."""
|
|
43
|
+
conftest_yaml = tmp_path / "conftest.yaml"
|
|
44
|
+
conftest_yaml.write_text("parser: yaml\n")
|
|
45
|
+
|
|
46
|
+
self.scanner._prepare_data_files(str(tmp_path))
|
|
47
|
+
|
|
48
|
+
assert not (tmp_path / "conftest.json").exists()
|
|
49
|
+
|
|
50
|
+
def test_skips_opa_yaml(self, tmp_path):
|
|
51
|
+
"""opa.yaml should NOT be converted."""
|
|
52
|
+
opa_yaml = tmp_path / "opa.yaml"
|
|
53
|
+
opa_yaml.write_text("services:\n - name: default\n")
|
|
54
|
+
|
|
55
|
+
self.scanner._prepare_data_files(str(tmp_path))
|
|
56
|
+
|
|
57
|
+
assert not (tmp_path / "opa.json").exists()
|
|
58
|
+
|
|
59
|
+
def test_skips_hidden_files(self, tmp_path):
|
|
60
|
+
"""Hidden .yaml files should NOT be converted."""
|
|
61
|
+
hidden = tmp_path / ".secrets.yaml"
|
|
62
|
+
hidden.write_text("api_key: abc123\n")
|
|
63
|
+
|
|
64
|
+
self.scanner._prepare_data_files(str(tmp_path))
|
|
65
|
+
|
|
66
|
+
assert not (tmp_path / ".secrets.json").exists()
|
|
67
|
+
|
|
68
|
+
def test_multiple_yaml_files(self, tmp_path):
|
|
69
|
+
"""Multiple YAML data files should all be converted."""
|
|
70
|
+
(tmp_path / "params.yaml").write_text(yaml.dump({"key": "val1"}))
|
|
71
|
+
(tmp_path / "overrides.yaml").write_text(yaml.dump({"key": "val2"}))
|
|
72
|
+
|
|
73
|
+
self.scanner._prepare_data_files(str(tmp_path))
|
|
74
|
+
|
|
75
|
+
assert (tmp_path / "params.json").exists()
|
|
76
|
+
assert (tmp_path / "overrides.json").exists()
|
|
77
|
+
assert json.loads((tmp_path / "params.json").read_text()) == {"key": "val1"}
|
|
78
|
+
assert json.loads((tmp_path / "overrides.json").read_text()) == {"key": "val2"}
|
|
79
|
+
|
|
80
|
+
def test_caching_skips_if_json_is_newer(self, tmp_path):
|
|
81
|
+
"""Should NOT regenerate JSON if it's already up-to-date."""
|
|
82
|
+
params = {"tags": {"required_tags": ["Project"]}}
|
|
83
|
+
yaml_file = tmp_path / "params.yaml"
|
|
84
|
+
yaml_file.write_text(yaml.dump(params))
|
|
85
|
+
|
|
86
|
+
json_file = tmp_path / "params.json"
|
|
87
|
+
json_file.write_text(json.dumps({"old": "data"}))
|
|
88
|
+
|
|
89
|
+
# Make JSON newer than YAML
|
|
90
|
+
os.utime(json_file, (9999999999, 9999999999))
|
|
91
|
+
|
|
92
|
+
self.scanner._prepare_data_files(str(tmp_path))
|
|
93
|
+
|
|
94
|
+
# JSON should keep old content since it's newer
|
|
95
|
+
loaded = json.loads(json_file.read_text())
|
|
96
|
+
assert loaded == {"old": "data"}
|
|
97
|
+
|
|
98
|
+
def test_regenerates_if_yaml_is_newer(self, tmp_path):
|
|
99
|
+
"""Should regenerate JSON if YAML is newer."""
|
|
100
|
+
params = {"tags": {"required_tags": ["Project", "Product"]}}
|
|
101
|
+
yaml_file = tmp_path / "params.yaml"
|
|
102
|
+
yaml_file.write_text(yaml.dump(params))
|
|
103
|
+
|
|
104
|
+
json_file = tmp_path / "params.json"
|
|
105
|
+
json_file.write_text(json.dumps({"stale": "data"}))
|
|
106
|
+
|
|
107
|
+
# Make YAML newer than JSON
|
|
108
|
+
os.utime(json_file, (1000000000, 1000000000))
|
|
109
|
+
os.utime(yaml_file, (9999999999, 9999999999))
|
|
110
|
+
|
|
111
|
+
self.scanner._prepare_data_files(str(tmp_path))
|
|
112
|
+
|
|
113
|
+
loaded = json.loads(json_file.read_text())
|
|
114
|
+
assert loaded == params
|
|
115
|
+
|
|
116
|
+
def test_handles_empty_directory(self, tmp_path):
|
|
117
|
+
"""Should do nothing for empty directories."""
|
|
118
|
+
self.scanner._prepare_data_files(str(tmp_path))
|
|
119
|
+
# No exception, no files created
|
|
120
|
+
assert list(tmp_path.iterdir()) == []
|
|
121
|
+
|
|
122
|
+
def test_handles_nonexistent_directory(self):
|
|
123
|
+
"""Should do nothing for non-existent directories."""
|
|
124
|
+
self.scanner._prepare_data_files("/nonexistent/path")
|
|
125
|
+
# Should not raise
|
|
126
|
+
|
|
127
|
+
def test_yml_extension_also_converted(self, tmp_path):
|
|
128
|
+
"""*.yml files should also be converted."""
|
|
129
|
+
(tmp_path / "sizing.yml").write_text(
|
|
130
|
+
yaml.dump({"blocked_types": ["m5.4xlarge"]})
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
self.scanner._prepare_data_files(str(tmp_path))
|
|
134
|
+
|
|
135
|
+
json_file = tmp_path / "sizing.json"
|
|
136
|
+
assert json_file.exists()
|
|
137
|
+
assert json.loads(json_file.read_text()) == {"blocked_types": ["m5.4xlarge"]}
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
class TestOPAScannerIntegration:
|
|
141
|
+
"""Integration tests for OPA scanner with data files and Rego policies."""
|
|
142
|
+
|
|
143
|
+
def test_conftest_loads_params_from_json(self, tmp_path):
|
|
144
|
+
"""Conftest should correctly resolve data.params references from params.json."""
|
|
145
|
+
# Create a minimal policy that uses data.params
|
|
146
|
+
policy_dir = tmp_path / "policy"
|
|
147
|
+
policy_dir.mkdir()
|
|
148
|
+
|
|
149
|
+
rego = """package tagging
|
|
150
|
+
required_tags := data.params.tags.required_tags
|
|
151
|
+
deny contains msg if {
|
|
152
|
+
resource := input.resource_changes[_]
|
|
153
|
+
required := required_tags[_]
|
|
154
|
+
not resource.change.after.tags_all[required]
|
|
155
|
+
msg := sprintf("Missing tag: %s", [required])
|
|
156
|
+
}
|
|
157
|
+
"""
|
|
158
|
+
(policy_dir / "tagging.rego").write_text(rego)
|
|
159
|
+
(policy_dir / "params.yaml").write_text(
|
|
160
|
+
yaml.dump({"tags": {"required_tags": ["Project", "Environment"]}})
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
# Prepare data files (convert YAML→JSON)
|
|
164
|
+
scanner = OPAScanner()
|
|
165
|
+
scanner._prepare_data_files(str(policy_dir))
|
|
166
|
+
|
|
167
|
+
# Verify JSON was generated correctly
|
|
168
|
+
params_json = json.loads((policy_dir / "params.json").read_text())
|
|
169
|
+
assert params_json["tags"]["required_tags"] == ["Project", "Environment"]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/ai-review/agent_specifications.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/check/cost-analysis-quick-reference.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/inventory/frameworks/terraform.md
RENAMED
|
File without changes
|
{thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/commands/inventory/frameworks/terragrunt.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{thothctl-0.20.0 → thothctl-0.20.2}/docs/framework/use_cases/platform_engineering_templates.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|