thothctl 0.20.2__tar.gz → 0.20.4__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.2 → thothctl-0.20.4}/PKG-INFO +1 -1
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/dashboard/README.md +24 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/blast-radius.md +106 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/scan/scan_overview.md +68 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/scan/commands/iac.py +20 -2
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scanners/opa.py +6 -0
- thothctl-0.20.4/src/thothctl/version.py +2 -0
- thothctl-0.20.2/src/thothctl/version.py +0 -2
- {thothctl-0.20.2 → thothctl-0.20.4}/.devcontainer/Dockerfile +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/.devcontainer/README.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/.devcontainer/devcontainer.json +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/.github/workflows/docs.yml +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/.github/workflows/python-publish.yml +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/.gitignore +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/.pre-commit-config.yaml +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/.readthedocs.yaml +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/Dockerfile +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/LICENSE +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/README.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/catalog/catalog-info.yaml +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/ai-review/README.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/ai-review/agent_specifications.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/ai-review/agentcore.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/check_environment.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/check_iac.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/check_overview.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/check_project_iac.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/check_space.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/cost-analysis-quick-reference.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/cost-analysis.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/customizing_rules.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/deps-advanced.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/deps.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/drift-detection.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/plan.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/document/customizing_docs.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/document/document_iac.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/document/document_overview.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/document/iac.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/document/use_cases.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/generate/generate_components.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/generate/generate_stacks.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/init/init.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/init/init_space.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/inventory/CHANGELOG.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/inventory/frameworks/terraform.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/inventory/frameworks/terragrunt.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/inventory/iac.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/inventory/inventory_iac.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/inventory/inventory_overview.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/list/list_overview.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/list/list_projects.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/list/list_spaces.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/mcp/mcp.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/project/iac.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/project/project_cleanup.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/project/project_convert.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/project/project_overview.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/project/project_upgrade.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/project/use_cases.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/remove/remove_overview.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/remove/remove_project.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/remove/remove_space.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/scan/iac.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/scan/scan_iac.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/scan/use_cases.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/upgrade/upgrade_overview.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/concepts.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/cross_platform_support.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/framework_architecture.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/infrasctructure_composition.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/policy_as_code.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/roadmap_fdi.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/software_architecture.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/space_configuration.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/use_cases/README.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/use_cases/ai_dlc.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/use_cases/check_command.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/use_cases/devsecops_quickstart.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/use_cases/devsecops_sdlc.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/use_cases/inventory_command.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/use_cases/platform_engineering_templates.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/use_cases/space_management.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/use_cases/tasks/create_template.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/iac_devsecops_use_case.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/automate_tasks_command.png +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/commnad_init.png +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/create_component.gif +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/create_inventory.gif +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/doc_command.png +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/document_project_code.gif +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/framework/thothforge-framework.svg +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/framework/thothfr.png +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/iacpeerbot_summary.png +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/icon-light.png +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/icon.png +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/init_project.gif +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/inventory_command.png +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/notification_img.png +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/report_dependencies.png +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/report_dependencies_summary.png +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/restore_inventory_version.gif +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/reuse_project_pattern.gif +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/scan_code.gif +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/scan_command.png +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/stable/scan_report_example.png +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/sync_wk_command.png +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/transform_command.png +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/update_inventory_version.gif +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/validate_command.png +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/validate_environment.gif +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/validate_project.gif +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/includes/abbreviations.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/index.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/installation/devcontainer_setup.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/installation/linux_installation.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/installation/windows_installation.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/javascripts/tablesort.js +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/mcp.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/navigation.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/quick_start.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/requirements.txt +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/stylesheets/extra-enhanced.css +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/stylesheets/extra.css +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/telemetry.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/template_engine/cli_commands_audit.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/template_engine/for_developers.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/template_engine/for_platform_engineers.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/template_engine/github_templates.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/template_engine/template_engine.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/troubleshooting/linux_troubleshooting.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/troubleshooting/macos_troubleshooting.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/troubleshooting/troubleshooting.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/docs/troubleshooting/windows_troubleshooting.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/mkdocs.yaml +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/pyproject.toml +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/scripts/run_mcp_server.sh +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/application/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/autocomplete.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/cli.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/cli.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/analyze.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/apply_fix.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/configure.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/configure_decisions.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/decide.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/history.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/improve.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/orchestrate.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/override.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/report.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/serve.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/check/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/check/cli.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/check/commands/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/check/commands/environment.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/check/commands/iac.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/check/commands/project/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/check/commands/project/iac.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/check/commands/project.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/dashboard/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/dashboard/cli.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/dashboard/commands/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/dashboard/commands/launch.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/document/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/document/cli.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/document/commands/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/document/commands/iac.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/generate/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/generate/cli.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/generate/commands/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/generate/commands/component.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/generate/commands/stacks.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/init/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/init/cli.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/init/commands/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/init/commands/env.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/init/commands/project.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/init/commands/space.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/init/commands/template.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/inventory/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/inventory/cli.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/inventory/commands/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/inventory/commands/check.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/inventory/commands/iac.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/list/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/list/cli.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/list/commands/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/list/commands/projects.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/list/commands/spaces.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/mcp/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/mcp/cli.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/mcp/commands/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/mcp/commands/register.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/mcp/commands/server.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/mcp/commands/status.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/mcp/commands/stop.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/project/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/project/cli.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/project/commands/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/project/commands/bootstrap.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/project/commands/cleanup.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/project/commands/convert.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/project/commands/upgrade.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/remove/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/remove/cli.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/remove/project.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/remove/space.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/scan/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/scan/cli.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/scan/commands/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/space/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/space/cli.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/space/commands/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/space/commands/activate.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/space/commands/show.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/space/commands/update.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/upgrade/cli.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/common/.thothcf.setup.toml +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/common/.thothcf_home.toml +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/common/.thothcf_module.toml +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/common/.thothcf_project.toml +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/common/.thothcf_template_parameters.toml +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/common/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/common/common.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/common/terragrunt/.thothcf_project.toml +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/config/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/config/constants.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/config/default_values.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/config/defaults.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/config/models.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/config/settings.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/config/template_config.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/config/template_configs.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/config/templates.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/config/validation.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/cli_ui.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/commands.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/config.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/azure_devops/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/azure_devops/get_azure_devops.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/azure_devops/pull_request_comments.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/github/get_github.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/github/pull_request_comments.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/integrate_messages_services/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/integrate_messages_services/microsoft_teams.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/integrate_messages_services/sent_message_teams.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/pattern_names.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/pr_comments/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/pr_comments/pr_comment_publisher.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/logger.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/telemetry.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/version_tools.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/domain/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/domain/interfaces/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/domain/models/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/mcp/README.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/mcp/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/mcp/server.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/agentcore/agentcore.json +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/ai_agent.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/analyzers/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/analyzers/code_reviewer.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/analyzers/context_builder.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/analyzers/report_analyzer.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/analyzers/risk_assessor.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/bedrock_agent_api.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/config/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/config/ai_settings.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/config/decision_rules.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/decision_engine.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/main.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/memory.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/orchestrator.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/pr_decision_publisher.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/providers/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/providers/azure_provider.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/providers/bedrock_agent_provider.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/providers/bedrock_provider.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/providers/ollama_provider.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/providers/openai_provider.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/safety/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/safety/safety_guard.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/strands_agent.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/tracing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/utils/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/utils/cost_tracker.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/utils/fix_patterns.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/utils/fix_prompts.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/utils/formatters.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/utils/prompts.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/environment/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/environment/check_environment.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/org_policy_loader.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/blast_radius_service.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/check_origin_version.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/check_project_structure.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/cost_analyzer.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/models/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/models/cloudformation_mapper.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/models/cost_models.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/aws_pricing_client.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/base_pricing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/apigateway_pricing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/bedrock_pricing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/cloudwatch_pricing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/dynamodb_pricing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/ebs_pricing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/ec2_pricing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/ecs_pricing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/eip_pricing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/eks_pricing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/elb_pricing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/free_resources_pricing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/kms_pricing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/lambda_pricing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/msk_pricing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/rds_pricing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/s3_pricing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/secrets_manager_pricing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/vpc_pricing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/unified_cost_report.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/drift/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/drift/drift_ai.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/drift/drift_history.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/drift/drift_policy.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/drift/drift_report.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/drift/drift_service.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/drift/models.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/risk_assessment.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/validate_project_structure.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/rule_merger.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/stack_optimizer/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/dashboard/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/dashboard/dashboard_service.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/dashboard/data_loader.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/document/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/document/architecture_renderer.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/document/create_documentation.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/document/files_content.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/document/files_scan.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/document/iac_documentation.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/document/iac_grunt_graph.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/document/iac_grunt_info.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/document/topology_generator.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_stacks/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_stacks/config_generator.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_stacks/remote_config_generation.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_stacks/stack_service.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_stacks/templates/terragrunt.hcl.j2 +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_template/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_template/config.yaml +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_template/create_code.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_template/create_component.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_template/create_component_service.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_template/create_stacks.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_template/create_template.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_template/files_content.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_template/github_template_loader.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_template/project_templates.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/init/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/init/environment/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/init/environment/install_tools.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/init/project/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/init/project/project.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/init/space/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/init/space/example_space.toml +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/init/space/local_registry.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/init/space/space.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/inventory/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/inventory/changelog_parser.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/inventory/inventory_service.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/inventory/models.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/inventory/module_compatibility_service.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/inventory/report_service.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/inventory/schema_compatibility_service.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/inventory/terragrunt_parser.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/inventory/update_versions.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/inventory/version_service.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/mcp/README.md +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/mcp/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/mcp/simple_http_server.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/mcp/stdio_server.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/bootstrap/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/bootstrap/bootstrap_service.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/cleanup/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/cleanup/clean_project.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/cleanup/clean_space.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/convert/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/convert/conversion_service.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/convert/get_project_data.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/convert/post_init.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/convert/project_converter.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/convert/project_defaults.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/convert/set_project_parameters.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/create_terramate/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/create_terramate/create_terramate_stacks.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/create_terramate/detect_changes_stacks.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/create_terramate/manage_terramate_stacks.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/upgrade/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/upgrade/upgrade_service.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/compliance_review.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/import_reports.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/models.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/report_parser.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/sarif_output.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scan_history.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scan_service.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scanners/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scanners/checkov.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scanners/kics.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scanners/scan_reports.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scanners/scanners.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scanners/terraform_compliance.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scanners/tfsec.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scanners/trivy.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/templates/reports/inventory_report.html +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/templates/reports/inventory_report.js +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/templates/unified_report_styles.css +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/banner.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/create_compliance_html_reports.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/create_html_reports.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/delete_directory.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/fix_report_styling.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/render_scan_report.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/report_html_utils.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/templates/dashboard.html +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/templates/index_report.html +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/templates/individual_report.html +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/templates/simple_report.html +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/templates/unified_report_styles.css +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/templates/unified_scan_report.html +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/templates/unified_simple_report.html +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/templates/xunit_report.html +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/crypto.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/manage_backend_resources/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/manage_backend_resources/manage_backend_resources.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/modules_ops/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/modules_ops/terraform_module_details.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/modules_ops/terraform_modules_fetcher.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/platform_utils.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/process_hcl/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/process_hcl/analyze_terraform_plan.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/process_hcl/graph_manager.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/process_hcl/graph_terragrunt_dependencies.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/process_hcl/process_terraform_file.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/process_hcl/risk_analyzing_terraform_plan.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/sync_workspaces/__init__.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/sync_workspaces/sync_terraform_workspaces.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/sync_workspaces/sync_terragrunt_workspaces.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/template_loader.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/thoth_colors.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/wellcome_banner.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/conftest.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_agentcore_entrypoint.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_aws_pricing_client.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_azure_devops_pr_comments.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_bedrock_pricing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_cdk_language_selection.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_context_steering.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_cost_analyzer.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_cost_models.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_cost_pr_comments.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_dashboard_loading_fix.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_dashboard_service.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_drift.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_drift_detection.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_ec2_pricing.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_github_pr_comments.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_iac_cost_integration.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_inventory_pr_comments.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_kics_scanner.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_mermaid_edge_labels.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_new_cost_providers.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_opa_data_files.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_parallel_scan.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_platform_utils.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_pr_comment_publisher.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_provider_source_url_fix.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_provider_versions.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_scan_pr_comments.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_space_command.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_space_management.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_stack_optimizer.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_template_url_fix.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_terragrunt_parser.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_topology_generator.py +0 -0
- {thothctl-0.20.2 → thothctl-0.20.4}/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.4
|
|
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
|
|
@@ -12,6 +12,7 @@ The ThothCTL Dashboard provides a unified web interface to view and manage all y
|
|
|
12
12
|
- **⚠️ Risk Assessment**: Blast radius analysis and mitigation strategies
|
|
13
13
|
- **🔍 Drift Detection**: Infrastructure drift visualization between IaC and live cloud state
|
|
14
14
|
- **🤖 AI Token Usage**: Track AI provider token consumption and cost metrics
|
|
15
|
+
- **🗺️ Infrastructure Topology** — Mermaid dependency graph with blast radius overlay, zoom controls, AWS architecture PNG download
|
|
15
16
|
- **🔄 Real-time Refresh**: Manual data refresh capability
|
|
16
17
|
- **📱 Responsive Design**: Works on desktop, tablet, and mobile devices
|
|
17
18
|
- **🌙 Complete dark mode support**
|
|
@@ -126,6 +127,23 @@ Monitor AI provider consumption:
|
|
|
126
127
|
- Usage trends over time
|
|
127
128
|
- Budget threshold indicators
|
|
128
129
|
|
|
130
|
+
### Infrastructure Topology
|
|
131
|
+
|
|
132
|
+
The infrastructure topology view is integrated within the **Blast Radius** tab, providing a unified visualization of your infrastructure dependencies and change impact:
|
|
133
|
+
|
|
134
|
+
- **Summary cards**: Total stacks, resources, changed resources, and resource categories at a glance
|
|
135
|
+
- **Color-coded legend**: Resource categories (compute, storage, networking, etc.) with distinct colors for quick identification
|
|
136
|
+
- **Mermaid dependency graph**: Interactive diagram showing resource relationships with blast radius overlay. Includes zoom controls (+/−/Fit) for navigating large topologies
|
|
137
|
+
- **Resources-by-stack tables**: Collapsible tables showing detailed resource breakdown per stack
|
|
138
|
+
- **PNG download**: Export a professional architecture diagram with official AWS icons for documentation and presentations
|
|
139
|
+
|
|
140
|
+
**Data source**: `Reports/topology/topology.json`
|
|
141
|
+
|
|
142
|
+
**Generate topology data**:
|
|
143
|
+
```bash
|
|
144
|
+
thothctl check iac -type blast-radius --recursive
|
|
145
|
+
```
|
|
146
|
+
|
|
129
147
|
## Architecture
|
|
130
148
|
|
|
131
149
|
### Twelve-Factor App Compliance
|
|
@@ -177,6 +195,7 @@ class DashboardDataLoader:
|
|
|
177
195
|
- `GET /api/sbom` - CycloneDX SBOM data
|
|
178
196
|
- `GET /api/cost-analysis` - Cost analysis data
|
|
179
197
|
- `GET /api/blast-radius` - Risk assessment data
|
|
198
|
+
- `GET /api/topology` - Infrastructure topology with mermaid diagram
|
|
180
199
|
- `GET /api/drift` - Drift detection data
|
|
181
200
|
- `GET /api/ai-usage` - AI token/cost usage
|
|
182
201
|
- `GET /api/reports/{path}` - Serve HTML reports for iframe viewing
|
|
@@ -231,6 +250,11 @@ Reports/
|
|
|
231
250
|
│ ├── InventoryIaC_*.json # Inventory data
|
|
232
251
|
│ ├── InventoryIaC_cyclonedx_*.json # CycloneDX SBOM data
|
|
233
252
|
│ └── html_reports/ # Inventory HTML reports
|
|
253
|
+
├── topology/
|
|
254
|
+
│ ├── topology.json # Infrastructure topology data
|
|
255
|
+
│ └── architecture.png # AWS architecture diagram
|
|
256
|
+
├── blast-radius/
|
|
257
|
+
│ └── blast_radius_*.json # Blast radius analysis
|
|
234
258
|
├── opa/
|
|
235
259
|
│ └── html_reports/ # OPA/compliance HTML reports
|
|
236
260
|
├── cost_analysis_*.json # Cost analysis
|
|
@@ -257,3 +257,109 @@ Components can be marked with specific criticality levels:
|
|
|
257
257
|
- [`thothctl check -type plan`](../check/plan.md) - Plan validation
|
|
258
258
|
- [`thothctl inventory iac`](../inventory/iac.md) - Infrastructure inventory
|
|
259
259
|
- [`thothctl scan iac`](../scan/iac.md) - Security scanning
|
|
260
|
+
|
|
261
|
+
## Blast Radius v0.20.0+ Enhancements
|
|
262
|
+
|
|
263
|
+
Starting with v0.20.0, the blast radius command includes significant improvements to change detection, topology generation, and report outputs.
|
|
264
|
+
|
|
265
|
+
### Enhanced Usage
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
thothctl check iac -type blast-radius --recursive
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### What it does (v0.20.0+)
|
|
272
|
+
|
|
273
|
+
1. Finds `tfplan.json` files recursively across all stacks
|
|
274
|
+
2. Filters out no-op/read resources (only create/update/delete/replace affect blast radius)
|
|
275
|
+
3. Propagates changes through the dependency graph
|
|
276
|
+
4. Classifies risk: LOW/MEDIUM/HIGH/CRITICAL using ITIL v4
|
|
277
|
+
5. Generates ITIL change type: STANDARD/NORMAL/EMERGENCY
|
|
278
|
+
6. Saves reports to `Reports/blast-radius/blast_radius_*.json`
|
|
279
|
+
7. Generates infrastructure topology diagram (`Reports/topology/`)
|
|
280
|
+
|
|
281
|
+
### Report Outputs
|
|
282
|
+
|
|
283
|
+
```
|
|
284
|
+
Reports/
|
|
285
|
+
├── blast-radius/
|
|
286
|
+
│ └── blast_radius_20260705_*.json # Risk assessment data
|
|
287
|
+
└── topology/
|
|
288
|
+
├── topology.json # Full topology + mermaid
|
|
289
|
+
├── topology.mmd # Standalone mermaid file
|
|
290
|
+
└── architecture.png # Professional AWS diagram
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### No-Changes Handling
|
|
294
|
+
|
|
295
|
+
When terraform plan shows no changes (all no-op), blast radius returns LOW risk with:
|
|
296
|
+
|
|
297
|
+
- Zero affected components
|
|
298
|
+
- Context about total infrastructure size
|
|
299
|
+
- Clear message that no create/update/delete actions were detected
|
|
300
|
+
|
|
301
|
+
This ensures pipelines don't fail on plans with no actionable changes while still providing visibility into the existing infrastructure footprint.
|
|
302
|
+
|
|
303
|
+
### Infrastructure Topology
|
|
304
|
+
|
|
305
|
+
The blast radius command automatically generates visual topology outputs:
|
|
306
|
+
|
|
307
|
+
- **Mermaid diagram** with color-coded nodes (create=blue, update=orange, delete=red dashed)
|
|
308
|
+
- **PNG architecture diagram** with official AWS icons via mingrammer/diagrams
|
|
309
|
+
- **Resource-level detail** per stack with category and action badges
|
|
310
|
+
|
|
311
|
+
The topology files are written to `Reports/topology/` and include both machine-readable JSON and renderable diagram formats suitable for embedding in PRs or documentation.
|
|
312
|
+
|
|
313
|
+
### Dashboard Integration
|
|
314
|
+
|
|
315
|
+
The web dashboard shows blast radius + topology in a unified view under the **💥 Blast Radius** tab. This includes:
|
|
316
|
+
|
|
317
|
+
- Risk summary with ITIL classification
|
|
318
|
+
- Interactive topology diagram
|
|
319
|
+
- Per-stack affected resource breakdown
|
|
320
|
+
- Change action badges (create, update, delete, replace)
|
|
321
|
+
|
|
322
|
+
## Dual-Mode Cost Analysis (v0.20.0+)
|
|
323
|
+
|
|
324
|
+
The `thothctl check iac -type cost-analysis` command now provides dual-mode cost estimation:
|
|
325
|
+
|
|
326
|
+
### Usage
|
|
327
|
+
|
|
328
|
+
```bash
|
|
329
|
+
thothctl check iac -type cost-analysis --recursive
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### Modes
|
|
333
|
+
|
|
334
|
+
- **Change delta**: Cost of resources being created/modified (for PR reviews). This shows the incremental cost impact of the proposed changes.
|
|
335
|
+
- **Total running cost**: Cost of ALL planned resources (from `planned_values`). This provides a full picture of what the infrastructure costs to run.
|
|
336
|
+
|
|
337
|
+
### No-Changes Behavior
|
|
338
|
+
|
|
339
|
+
When no changes are detected in the plan, cost analysis shows the total running cost instead of `$0`. This gives teams continuous visibility into their infrastructure spend even when no modifications are pending.
|
|
340
|
+
|
|
341
|
+
### JSON Report Fields
|
|
342
|
+
|
|
343
|
+
The cost analysis JSON report includes:
|
|
344
|
+
|
|
345
|
+
| Field | Description |
|
|
346
|
+
|-------|-------------|
|
|
347
|
+
| `total_running_monthly_cost` | Monthly cost of all planned resources |
|
|
348
|
+
| `total_running_annual_cost` | Annual projection of all planned resources |
|
|
349
|
+
| `total_planned_resources` | Count of all resources in the plan |
|
|
350
|
+
| `change_delta_monthly_cost` | Monthly cost delta from changes only |
|
|
351
|
+
| `change_delta_annual_cost` | Annual cost delta from changes only |
|
|
352
|
+
|
|
353
|
+
### Example Output
|
|
354
|
+
|
|
355
|
+
```json
|
|
356
|
+
{
|
|
357
|
+
"total_running_monthly_cost": 1250.00,
|
|
358
|
+
"total_running_annual_cost": 15000.00,
|
|
359
|
+
"total_planned_resources": 47,
|
|
360
|
+
"change_delta_monthly_cost": 85.50,
|
|
361
|
+
"change_delta_annual_cost": 1026.00
|
|
362
|
+
}
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
This dual-mode approach ensures that PR reviews show the marginal cost of changes while still providing the full cost picture for governance and budgeting.
|
|
@@ -138,6 +138,74 @@ warn contains msg if {
|
|
|
138
138
|
}
|
|
139
139
|
```
|
|
140
140
|
|
|
141
|
+
### YAML Data Files for Policy Parameterization (v0.20.2)
|
|
142
|
+
|
|
143
|
+
OPA/Conftest now supports automatic conversion of YAML data files (`.yaml`/`.yml`) to JSON for policy parameterization. This allows you to externalize policy parameters — such as allowed regions, required tags, and thresholds — from your Rego code into maintainable YAML configuration files.
|
|
144
|
+
|
|
145
|
+
#### How It Works
|
|
146
|
+
|
|
147
|
+
- Place YAML files alongside your `.rego` policies (e.g., `policy/config.yaml`)
|
|
148
|
+
- ThothCTL auto-converts YAML data files to JSON before running Conftest
|
|
149
|
+
- Conftest automatically loads the converted JSON as data via its `--data` flag
|
|
150
|
+
- **Caching**: only reconverts if the YAML source is newer than the existing JSON, avoiding unnecessary work on repeated scans
|
|
151
|
+
|
|
152
|
+
#### Use Case
|
|
153
|
+
|
|
154
|
+
Externalize policy parameters that change across teams or environments without modifying Rego logic:
|
|
155
|
+
|
|
156
|
+
- Allowed cloud regions
|
|
157
|
+
- Required resource tags
|
|
158
|
+
- Cost or resource count thresholds
|
|
159
|
+
- Naming convention patterns
|
|
160
|
+
|
|
161
|
+
#### Example
|
|
162
|
+
|
|
163
|
+
Define your parameters in YAML:
|
|
164
|
+
|
|
165
|
+
```yaml
|
|
166
|
+
# policy/config.yaml
|
|
167
|
+
allowed_regions:
|
|
168
|
+
- us-east-1
|
|
169
|
+
- eu-west-1
|
|
170
|
+
required_tags:
|
|
171
|
+
- Environment
|
|
172
|
+
- Owner
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Reference them in your Rego policy via `data.config`:
|
|
176
|
+
|
|
177
|
+
```rego
|
|
178
|
+
# policy/regions.rego
|
|
179
|
+
package main
|
|
180
|
+
import data.config
|
|
181
|
+
|
|
182
|
+
deny[msg] {
|
|
183
|
+
# uses config.allowed_regions from YAML
|
|
184
|
+
resource := input.resource.aws_instance[name]
|
|
185
|
+
not resource.provider_region in config.allowed_regions
|
|
186
|
+
msg := sprintf("Instance '%s' deployed in non-allowed region", [name])
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
deny[msg] {
|
|
190
|
+
resource := input.resource.aws_instance[name]
|
|
191
|
+
missing := {tag | tag := config.required_tags[_]; not resource.tags[tag]}
|
|
192
|
+
count(missing) > 0
|
|
193
|
+
msg := sprintf("Instance '%s' missing required tags: %v", [name, missing])
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
#### Directory Layout
|
|
198
|
+
|
|
199
|
+
```
|
|
200
|
+
policy/
|
|
201
|
+
├── config.yaml # Externalized parameters (auto-converted to JSON)
|
|
202
|
+
├── regions.rego # Policy using data.config.allowed_regions
|
|
203
|
+
├── tagging.rego # Policy using data.config.required_tags
|
|
204
|
+
└── ...
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
No additional CLI flags are needed — ThothCTL detects YAML files in the policy directory automatically.
|
|
208
|
+
|
|
141
209
|
## Enforcement (v0.19.0)
|
|
142
210
|
|
|
143
211
|
When `--enforcement hard` is specified, ThothCTL gates the pipeline based on scan findings:
|
|
@@ -83,11 +83,19 @@ class RestoredIaCScanCommand(ClickCommand):
|
|
|
83
83
|
start_time = time.perf_counter()
|
|
84
84
|
|
|
85
85
|
# Execute scan with original functionality
|
|
86
|
+
# Build scanner options
|
|
87
|
+
scan_options = self._parse_options(options) if options else {}
|
|
88
|
+
|
|
89
|
+
# Inject --policy-dir into OPA options if provided
|
|
90
|
+
policy_dir = kwargs.get('policy_dir')
|
|
91
|
+
if policy_dir:
|
|
92
|
+
scan_options['policy_dir'] = policy_dir
|
|
93
|
+
|
|
86
94
|
results = scan_service.execute_scans(
|
|
87
95
|
directory=code_directory,
|
|
88
96
|
reports_dir=reports_dir,
|
|
89
97
|
selected_tools=tools,
|
|
90
|
-
options=
|
|
98
|
+
options=scan_options,
|
|
91
99
|
tftool=tftool,
|
|
92
100
|
max_workers=max_workers,
|
|
93
101
|
compact=compact,
|
|
@@ -255,8 +263,10 @@ class RestoredIaCScanCommand(ClickCommand):
|
|
|
255
263
|
border_style="red"
|
|
256
264
|
)
|
|
257
265
|
self.console.print(enforcement_panel)
|
|
258
|
-
|
|
266
|
+
raise SystemExit(1)
|
|
259
267
|
|
|
268
|
+
except SystemExit:
|
|
269
|
+
raise # Let enforcement exit propagate without showing error panel
|
|
260
270
|
except Exception as e:
|
|
261
271
|
error_panel = Panel(
|
|
262
272
|
f"[bold red]Security scan could not complete[/bold red]\n\n"
|
|
@@ -717,6 +727,14 @@ cli = RestoredIaCScanCommand.as_click_command(
|
|
|
717
727
|
help="Additional options for scanning tools (key=value,key2=value2)",
|
|
718
728
|
type=str,
|
|
719
729
|
),
|
|
730
|
+
click.option(
|
|
731
|
+
"--policy-dir",
|
|
732
|
+
help="Policy directory or Git URL for OPA/Conftest (default: 'policy'). "
|
|
733
|
+
"Supports: local path, absolute path, Git URL (https://...), "
|
|
734
|
+
"or THOTH_ORG_POLICY env var.",
|
|
735
|
+
type=str,
|
|
736
|
+
default=None,
|
|
737
|
+
),
|
|
720
738
|
click.option(
|
|
721
739
|
"--tftool",
|
|
722
740
|
default="tofu",
|
|
@@ -163,6 +163,12 @@ class OPAScanner(ScannerPort):
|
|
|
163
163
|
if options.get("data_dir"):
|
|
164
164
|
cmd_json.extend(["--data", options["data_dir"]])
|
|
165
165
|
|
|
166
|
+
# Auto-detect JSON data files in the policy directory and pass via --data
|
|
167
|
+
# conftest requires explicit --data to load JSON into the data namespace
|
|
168
|
+
# (the --policy flag only loads .rego files)
|
|
169
|
+
for data_file in sorted(Path(abs_policy).glob("*.json")):
|
|
170
|
+
cmd_json.extend(["--data", str(data_file)])
|
|
171
|
+
|
|
166
172
|
cmd_json.extend(scan_files)
|
|
167
173
|
|
|
168
174
|
self.ui.start_scan_message(abs_dir)
|
|
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.2 → thothctl-0.20.4}/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
|
{thothctl-0.20.2 → thothctl-0.20.4}/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.2 → thothctl-0.20.4}/docs/framework/commands/inventory/frameworks/terraform.md
RENAMED
|
File without changes
|
{thothctl-0.20.2 → thothctl-0.20.4}/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
|
{thothctl-0.20.2 → thothctl-0.20.4}/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
|