thothctl 0.16.2__tar.gz → 0.16.3__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.16.2 → thothctl-0.16.3}/PKG-INFO +1 -1
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/check/check_project_iac.md +90 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/scan/scan_iac.md +90 -2
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/scan/scan_overview.md +4 -2
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/use_cases/tasks/create_template.md +4 -4
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/index.md +2 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/check/commands/project/iac.py +89 -3
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/core/version_tools.py +1 -1
- thothctl-0.16.3/src/thothctl/services/check/org_policy_loader.py +95 -0
- thothctl-0.16.3/src/thothctl/services/check/rule_merger.py +182 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/scan/scan_service.py +2 -1
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/scan/scanners/opa.py +10 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/scan/scanners/scanners.py +2 -1
- thothctl-0.16.3/src/thothctl/services/scan/scanners/terraform_compliance.py +338 -0
- thothctl-0.16.3/src/thothctl/version.py +2 -0
- thothctl-0.16.2/src/thothctl/services/scan/scanners/terraform_compliance.py +0 -0
- thothctl-0.16.2/src/thothctl/version.py +0 -2
- {thothctl-0.16.2 → thothctl-0.16.3}/.devcontainer/Dockerfile +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/.devcontainer/README.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/.devcontainer/devcontainer.json +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/.github/workflows/docs.yml +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/.github/workflows/python-publish.yml +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/.gitignore +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/.pre-commit-config.yaml +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/.readthedocs.yaml +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/AWS_PRICING_API_FINAL_REPORT.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/AWS_PRICING_API_IMPLEMENTATION_PLAN.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/AWS_PRICING_REFACTOR_REPORT.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/Dockerfile +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/LICENSE +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/README.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/TECHNICAL_DEBT_METRICS.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/catalog/catalog-info.yaml +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/dashboard/README.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/ai-review/README.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/ai-review/agent_specifications.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/ai-review/agentcore.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/check/blast-radius.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/check/check_environment.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/check/check_iac.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/check/check_overview.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/check/check_space.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/check/cost-analysis-quick-reference.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/check/cost-analysis.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/check/customizing_rules.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/check/deps-advanced.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/check/deps.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/check/drift-detection.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/check/plan.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/document/customizing_docs.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/document/document_iac.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/document/document_overview.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/document/iac.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/document/use_cases.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/generate/generate_components.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/generate/generate_stacks.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/init/init.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/init/init_space.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/inventory/CHANGELOG.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/inventory/frameworks/terraform.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/inventory/frameworks/terragrunt.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/inventory/iac.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/inventory/inventory_iac.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/inventory/inventory_overview.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/list/list_overview.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/list/list_projects.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/list/list_spaces.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/mcp/mcp.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/project/iac.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/project/project_cleanup.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/project/project_convert.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/project/project_overview.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/project/project_upgrade.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/project/use_cases.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/remove/remove_overview.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/remove/remove_project.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/remove/remove_space.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/scan/iac.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/scan/use_cases.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/commands/upgrade/upgrade_overview.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/concepts.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/cross_platform_support.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/framework_architecture.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/infrasctructure_composition.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/policy_as_code.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/roadmap_fdi.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/software_architecture.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/space_configuration.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/use_cases/README.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/use_cases/ai_dlc.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/use_cases/check_command.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/use_cases/devsecops_quickstart.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/use_cases/devsecops_sdlc.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/use_cases/inventory_command.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/use_cases/platform_engineering_templates.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/framework/use_cases/space_management.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/iac_devsecops_use_case.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/automate_tasks_command.png +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/commnad_init.png +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/create_component.gif +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/create_inventory.gif +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/doc_command.png +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/document_project_code.gif +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/framework/thothforge-framework.svg +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/framework/thothfr.png +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/iacpeerbot_summary.png +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/icon-light.png +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/icon.png +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/init_project.gif +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/inventory_command.png +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/notification_img.png +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/report_dependencies.png +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/report_dependencies_summary.png +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/restore_inventory_version.gif +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/reuse_project_pattern.gif +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/scan_code.gif +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/scan_command.png +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/sync_wk_command.png +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/transform_command.png +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/update_inventory_version.gif +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/validate_command.png +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/validate_environment.gif +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/img/validate_project.gif +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/includes/abbreviations.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/installation/linux_installation.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/installation/windows_installation.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/javascripts/tablesort.js +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/mcp.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/navigation.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/quick_start.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/requirements.txt +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/stylesheets/extra-enhanced.css +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/stylesheets/extra.css +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/telemetry.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/template_engine/cli_commands_audit.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/template_engine/for_developers.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/template_engine/for_platform_engineers.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/template_engine/github_templates.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/template_engine/template_engine.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/troubleshooting/linux_troubleshooting.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/troubleshooting/macos_troubleshooting.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/troubleshooting/troubleshooting.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/docs/troubleshooting/windows_troubleshooting.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/mkdocs.yaml +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/pyproject.toml +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/scripts/run_mcp_server.sh +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/application/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/autocomplete.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/cli.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/ai_review/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/ai_review/cli.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/ai_review/commands/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/ai_review/commands/analyze.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/ai_review/commands/apply_fix.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/ai_review/commands/configure.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/ai_review/commands/configure_decisions.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/ai_review/commands/decide.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/ai_review/commands/history.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/ai_review/commands/improve.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/ai_review/commands/orchestrate.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/ai_review/commands/override.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/ai_review/commands/report.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/ai_review/commands/serve.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/check/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/check/cli.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/check/commands/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/check/commands/environment.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/check/commands/iac.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/check/commands/project/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/check/commands/project.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/dashboard/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/dashboard/cli.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/dashboard/commands/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/dashboard/commands/launch.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/document/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/document/cli.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/document/commands/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/document/commands/iac.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/generate/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/generate/cli.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/generate/commands/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/generate/commands/component.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/generate/commands/stacks.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/init/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/init/cli.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/init/commands/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/init/commands/env.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/init/commands/project.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/init/commands/space.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/init/commands/template.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/inventory/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/inventory/cli.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/inventory/commands/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/inventory/commands/check.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/inventory/commands/iac.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/list/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/list/cli.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/list/commands/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/list/commands/projects.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/list/commands/spaces.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/mcp/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/mcp/cli.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/mcp/commands/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/mcp/commands/register.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/mcp/commands/server.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/mcp/commands/status.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/mcp/commands/stop.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/project/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/project/cli.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/project/commands/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/project/commands/bootstrap.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/project/commands/cleanup.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/project/commands/convert.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/project/commands/upgrade.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/remove/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/remove/cli.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/remove/project.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/remove/space.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/scan/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/scan/cli.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/scan/commands/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/scan/commands/iac.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/space/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/space/cli.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/space/commands/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/space/commands/activate.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/space/commands/update.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/commands/upgrade/cli.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/common/.thothcf.setup.toml +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/common/.thothcf_home.toml +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/common/.thothcf_module.toml +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/common/.thothcf_project.toml +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/common/.thothcf_template_parameters.toml +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/common/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/common/common.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/common/terragrunt/.thothcf_project.toml +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/config/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/config/constants.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/config/default_values.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/config/defaults.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/config/models.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/config/settings.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/config/template_config.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/config/template_configs.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/config/templates.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/config/validation.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/core/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/core/cli_ui.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/core/commands.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/core/config.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/core/integrations/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/core/integrations/azure_devops/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/core/integrations/azure_devops/get_azure_devops.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/core/integrations/azure_devops/pull_request_comments.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/core/integrations/github/get_github.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/core/integrations/github/pull_request_comments.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/core/integrations/integrate_messages_services/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/core/integrations/integrate_messages_services/microsoft_teams.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/core/integrations/integrate_messages_services/sent_message_teams.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/core/integrations/pattern_names.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/core/integrations/pr_comments/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/core/integrations/pr_comments/pr_comment_publisher.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/core/logger.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/core/telemetry.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/domain/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/domain/interfaces/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/domain/models/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/mcp/README.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/mcp/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/mcp/server.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/agentcore/agentcore.json +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/ai_agent.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/analyzers/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/analyzers/code_reviewer.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/analyzers/context_builder.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/analyzers/report_analyzer.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/analyzers/risk_assessor.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/bedrock_agent_api.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/config/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/config/ai_settings.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/config/decision_rules.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/decision_engine.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/main.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/memory.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/orchestrator.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/pr_decision_publisher.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/providers/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/providers/azure_provider.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/providers/bedrock_agent_provider.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/providers/bedrock_provider.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/providers/ollama_provider.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/providers/openai_provider.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/safety/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/safety/safety_guard.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/tracing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/utils/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/utils/cost_tracker.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/utils/fix_patterns.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/utils/fix_prompts.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/utils/formatters.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/ai_review/utils/prompts.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/environment/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/environment/check_environment.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/blast_radius_service.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/check_origin_version.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/check_project_structure.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/cost_analyzer.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/models/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/models/cloudformation_mapper.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/models/cost_models.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/aws_pricing_client.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/base_pricing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/providers/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/providers/apigateway_pricing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/providers/bedrock_pricing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/providers/cloudwatch_pricing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/providers/dynamodb_pricing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/providers/ebs_pricing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/providers/ec2_pricing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/providers/ecs_pricing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/providers/eip_pricing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/providers/eks_pricing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/providers/elb_pricing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/providers/free_resources_pricing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/providers/kms_pricing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/providers/lambda_pricing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/providers/msk_pricing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/providers/rds_pricing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/providers/s3_pricing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/providers/secrets_manager_pricing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/pricing/providers/vpc_pricing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/cost/unified_cost_report.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/drift/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/drift/drift_ai.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/drift/drift_history.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/drift/drift_policy.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/drift/drift_report.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/drift/drift_service.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/drift/models.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/risk_assessment.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/check/project/validate_project_structure.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/dashboard/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/dashboard/dashboard_service.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/dashboard/data_loader.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/document/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/document/create_documentation.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/document/files_content.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/document/files_scan.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/document/iac_documentation.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/document/iac_grunt_graph.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/document/iac_grunt_info.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/generate/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/generate/create_stacks/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/generate/create_stacks/config_generator.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/generate/create_stacks/remote_config_generation.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/generate/create_stacks/stack_service.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/generate/create_stacks/templates/terragrunt.hcl.j2 +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/generate/create_template/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/generate/create_template/config.yaml +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/generate/create_template/create_code.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/generate/create_template/create_component.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/generate/create_template/create_component_service.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/generate/create_template/create_stacks.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/generate/create_template/create_template.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/generate/create_template/files_content.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/generate/create_template/github_template_loader.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/generate/create_template/project_templates.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/init/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/init/environment/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/init/environment/install_tools.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/init/project/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/init/project/project.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/init/space/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/init/space/example_space.toml +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/init/space/local_registry.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/init/space/space.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/inventory/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/inventory/changelog_parser.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/inventory/inventory_service.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/inventory/models.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/inventory/module_compatibility_service.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/inventory/report_service.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/inventory/schema_compatibility_service.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/inventory/terragrunt_parser.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/inventory/update_versions.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/inventory/version_service.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/mcp/README.md +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/mcp/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/mcp/amazon_q_server.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/mcp/example.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/mcp/service.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/mcp/simple_http_server.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/project/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/project/bootstrap/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/project/bootstrap/bootstrap_service.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/project/cleanup/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/project/cleanup/clean_project.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/project/cleanup/clean_space.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/project/convert/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/project/convert/conversion_service.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/project/convert/get_project_data.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/project/convert/post_init.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/project/convert/project_converter.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/project/convert/project_defaults.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/project/convert/set_project_parameters.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/project/create_terramate/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/project/create_terramate/create_terramate_stacks.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/project/create_terramate/detect_changes_stacks.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/project/create_terramate/manage_terramate_stacks.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/project/upgrade/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/project/upgrade/upgrade_service.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/scan/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/scan/compliance_review.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/scan/import_reports.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/scan/models.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/scan/report_parser.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/scan/sarif_output.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/scan/scan_history.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/scan/scanners/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/scan/scanners/checkov.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/scan/scanners/kics.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/scan/scanners/scan_reports.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/scan/scanners/tfsec.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/services/scan/scanners/trivy.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/templates/reports/inventory_report.html +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/templates/reports/inventory_report.js +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/templates/unified_report_styles.css +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/banner.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/common/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/common/create_compliance_html_reports.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/common/create_html_reports.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/common/delete_directory.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/common/fix_report_styling.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/common/render_scan_report.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/common/report_html_utils.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/common/templates/dashboard.html +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/common/templates/index_report.html +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/common/templates/individual_report.html +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/common/templates/simple_report.html +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/common/templates/unified_report_styles.css +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/common/templates/unified_scan_report.html +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/common/templates/unified_simple_report.html +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/common/templates/xunit_report.html +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/crypto.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/manage_backend_resources/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/manage_backend_resources/manage_backend_resources.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/modules_ops/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/modules_ops/terraform_module_details.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/modules_ops/terraform_modules_fetcher.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/platform_utils.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/process_hcl/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/process_hcl/analyze_terraform_plan.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/process_hcl/graph_manager.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/process_hcl/graph_terragrunt_dependencies.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/process_hcl/process_terraform_file.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/process_hcl/risk_analyzing_terraform_plan.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/sync_workspaces/__init__.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/sync_workspaces/sync_terraform_workspaces.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/sync_workspaces/sync_terragrunt_workspaces.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/template_loader.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/utils/thoth_colors.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/src/thothctl/wellcome_banner.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/conftest.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_agentcore_entrypoint.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_aws_pricing_client.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_azure_devops_pr_comments.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_bedrock_pricing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_cdk_language_selection.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_context_steering.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_cost_analyzer.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_cost_models.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_cost_pr_comments.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_dashboard_loading_fix.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_dashboard_service.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_drift.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_drift_detection.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_ec2_pricing.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_github_pr_comments.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_iac_cost_integration.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_inventory_pr_comments.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_kics_scanner.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_mermaid_edge_labels.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_new_cost_providers.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_parallel_scan.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_platform_utils.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_pr_comment_publisher.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_provider_source_url_fix.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_provider_versions.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_scan_pr_comments.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_space_command.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_space_management.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_template_url_fix.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tests/test_terragrunt_parser.py +0 -0
- {thothctl-0.16.2 → thothctl-0.16.3}/tox.ini +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: thothctl
|
|
3
|
-
Version: 0.16.
|
|
3
|
+
Version: 0.16.3
|
|
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
|
|
@@ -17,9 +17,99 @@ Options:
|
|
|
17
17
|
Type of IaC check to perform [default: structure]
|
|
18
18
|
-p, --project-type [stack|module]
|
|
19
19
|
Project type: stack or module [default: stack]
|
|
20
|
+
--org-policy TEXT Organization policy source (Git URL or local path)
|
|
21
|
+
--enforcement [soft|hard] Enforcement mode: soft (report) or hard (fail pipeline)
|
|
20
22
|
--help Show this message and exit.
|
|
21
23
|
```
|
|
22
24
|
|
|
25
|
+
## Organization Policy Enforcement
|
|
26
|
+
|
|
27
|
+
ThothCTL can enforce organizational standards that projects **cannot override**. This ensures all projects in your organization follow the same structure, naming, and tagging rules — regardless of what individual `.thothcf.toml` files contain.
|
|
28
|
+
|
|
29
|
+
### How It Works
|
|
30
|
+
|
|
31
|
+
1. Set `THOTH_ORG_POLICY` to your org policy Git repo (or pass `--org-policy`)
|
|
32
|
+
2. The repo contains `rules/base.toml` + `rules/<project_type>.toml`
|
|
33
|
+
3. ThothCTL merges org rules with project rules — **mandatory org rules cannot be weakened**
|
|
34
|
+
4. Violations are reported with enforcement level (mandatory = fail, recommended = warn)
|
|
35
|
+
|
|
36
|
+
### Usage
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# Via env var (CI/CD recommended)
|
|
40
|
+
export THOTH_ORG_POLICY=https://github.com/myorg/org-policies.git
|
|
41
|
+
thothctl check project iac --enforcement hard
|
|
42
|
+
|
|
43
|
+
# Pin to a version
|
|
44
|
+
export THOTH_ORG_POLICY=https://github.com/myorg/org-policies.git@v1.0
|
|
45
|
+
thothctl check project iac --enforcement hard
|
|
46
|
+
|
|
47
|
+
# Via flag
|
|
48
|
+
thothctl check project iac --org-policy /path/to/org-policies --enforcement hard
|
|
49
|
+
|
|
50
|
+
# Local path (development)
|
|
51
|
+
thothctl check project iac --org-policy ../org-iac-policies
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Enforcement Levels
|
|
55
|
+
|
|
56
|
+
| Level | Behavior | Project Can Override? |
|
|
57
|
+
|-------|----------|---------------------|
|
|
58
|
+
| `mandatory` | Fails pipeline with `--enforcement hard` | ❌ No |
|
|
59
|
+
| `recommended` | Warning only | ⚠️ Can opt-out |
|
|
60
|
+
| `informational` | Report only | ✅ Yes |
|
|
61
|
+
|
|
62
|
+
### Org Policy Repo Structure
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
org-policies/
|
|
66
|
+
├── rules/ # ThothCTL structural rules
|
|
67
|
+
│ ├── base.toml # All project types
|
|
68
|
+
│ ├── terraform-terragrunt.toml
|
|
69
|
+
│ ├── terraform_module.toml
|
|
70
|
+
│ └── cdkv2.toml
|
|
71
|
+
├── shared/policy/ # OPA/Rego policies (used by scan iac -t opa)
|
|
72
|
+
│ ├── naming.rego
|
|
73
|
+
│ ├── tagging.rego
|
|
74
|
+
│ └── regions.rego
|
|
75
|
+
└── README.md
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
The same repo serves both:
|
|
79
|
+
- **`thothctl check project iac`** → reads `rules/`
|
|
80
|
+
- **`thothctl scan iac -t opa`** → reads `shared/policy/` (auto-discovered via `THOTH_ORG_POLICY`)
|
|
81
|
+
|
|
82
|
+
### Example Output
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
📜 Loading org policy from: https://github.com/myorg/org-policies.git
|
|
86
|
+
|
|
87
|
+
❌ Mandatory Violations
|
|
88
|
+
┌────────────────────────────────────┬─────────────────┬─────────┐
|
|
89
|
+
│ Rule │ Expected │ Found │
|
|
90
|
+
├────────────────────────────────────┼─────────────────┼─────────┤
|
|
91
|
+
│ project_structure.folders.docs │ docs/ exists │ missing │
|
|
92
|
+
│ project_structure.root_files │ .pre-commit... │ missing │
|
|
93
|
+
└────────────────────────────────────┴─────────────────┴─────────┘
|
|
94
|
+
|
|
95
|
+
⚠️ Recommendations
|
|
96
|
+
┌────────────────────────────────────┬─────────────────┬─────────┐
|
|
97
|
+
│ Rule │ Expected │ Found │
|
|
98
|
+
├────────────────────────────────────┼─────────────────┼─────────┤
|
|
99
|
+
│ project_structure.folders.common │ common/ exists │ missing │
|
|
100
|
+
└────────────────────────────────────┴─────────────────┴─────────┘
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### CI/CD Integration
|
|
104
|
+
|
|
105
|
+
```yaml
|
|
106
|
+
# GitHub Actions
|
|
107
|
+
- name: Check org compliance
|
|
108
|
+
run: thothctl check project iac --enforcement hard
|
|
109
|
+
env:
|
|
110
|
+
THOTH_ORG_POLICY: https://github.com/myorg/org-policies.git@v1.0
|
|
111
|
+
```
|
|
112
|
+
|
|
23
113
|
## Project Types
|
|
24
114
|
|
|
25
115
|
### Stack Projects (`-p stack`)
|
|
@@ -58,13 +58,101 @@ thothctl scan iac -t kics
|
|
|
58
58
|
|
|
59
59
|
### Terraform-compliance
|
|
60
60
|
|
|
61
|
-
[Terraform-compliance](https://terraform-compliance.com/) is a lightweight
|
|
61
|
+
[Terraform-compliance](https://terraform-compliance.com/) (v1.15.1) is a lightweight BDD test framework that evaluates `tfplan.json` files against Gherkin `.feature` files. It enables human-readable compliance scenarios like "S3 buckets must have encryption enabled."
|
|
62
|
+
|
|
63
|
+
#### Prerequisites
|
|
62
64
|
|
|
63
65
|
```bash
|
|
64
|
-
|
|
66
|
+
pip install terraform-compliance
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Requires `tfplan.json` files in your project (generated with `terraform show -json tfplan.binary > tfplan.json`).
|
|
70
|
+
|
|
71
|
+
#### Usage
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# Local features directory
|
|
75
|
+
thothctl scan iac -t terraform-compliance -o "features_dir=features"
|
|
76
|
+
|
|
77
|
+
# Git repository with subpath (//subpath syntax)
|
|
78
|
+
thothctl scan iac -t terraform-compliance -o "features_dir=https://github.com/myorg/org-policies.git//compliance/features"
|
|
79
|
+
|
|
80
|
+
# Git repository (auto-discovers compliance/features/ or features/)
|
|
81
|
+
thothctl scan iac -t terraform-compliance -o "features_dir=https://github.com/myorg/org-policies.git"
|
|
82
|
+
|
|
83
|
+
# SSH Git URL with subpath
|
|
84
|
+
thothctl scan iac -t terraform-compliance -o "features_dir=git@github.com:myorg/compliance.git//features"
|
|
85
|
+
|
|
86
|
+
# Auto-discover from THOTH_ORG_POLICY (looks in compliance/features/)
|
|
87
|
+
export THOTH_ORG_POLICY=https://github.com/myorg/org-policies.git
|
|
65
88
|
thothctl scan iac -t terraform-compliance
|
|
66
89
|
```
|
|
67
90
|
|
|
91
|
+
#### Features Resolution
|
|
92
|
+
|
|
93
|
+
| Priority | Source | Example |
|
|
94
|
+
|----------|--------|---------|
|
|
95
|
+
| 1 | **Git URL with `//subpath`** | `https://github.com/myorg/policies.git//compliance/features` |
|
|
96
|
+
| 2 | **Git URL** (auto-discovers `compliance/features/` or `features/`) | `https://github.com/myorg/policies.git` |
|
|
97
|
+
| 3 | **Relative to project** | `features/` |
|
|
98
|
+
| 4 | **Absolute path** | `/shared/compliance/features` |
|
|
99
|
+
| 5 | **`THOTH_ORG_POLICY` env** → `compliance/features/` | Auto-discovered |
|
|
100
|
+
|
|
101
|
+
#### Writing Feature Files
|
|
102
|
+
|
|
103
|
+
Feature files use Gherkin syntax:
|
|
104
|
+
|
|
105
|
+
```gherkin
|
|
106
|
+
Feature: Ensure encryption is enabled for all storage resources
|
|
107
|
+
|
|
108
|
+
Scenario: S3 buckets must have encryption
|
|
109
|
+
Given I have aws_s3_bucket defined
|
|
110
|
+
Then it must have server_side_encryption_configuration
|
|
111
|
+
|
|
112
|
+
Scenario: RDS instances must be encrypted
|
|
113
|
+
Given I have aws_db_instance defined
|
|
114
|
+
Then it must have storage_encrypted
|
|
115
|
+
And its value must be true
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
```gherkin
|
|
119
|
+
Feature: Ensure all resources have required tags
|
|
120
|
+
|
|
121
|
+
Scenario Outline: Resources must have mandatory tags
|
|
122
|
+
Given I have resource that supports tags defined
|
|
123
|
+
Then it must have tags
|
|
124
|
+
And it must contain <tag>
|
|
125
|
+
|
|
126
|
+
Examples:
|
|
127
|
+
| tag |
|
|
128
|
+
| Environment |
|
|
129
|
+
| Owner |
|
|
130
|
+
| Project |
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
#### Per-Stack Scanning
|
|
134
|
+
|
|
135
|
+
ThothCTL finds all `tfplan.json` files in your project and runs terraform-compliance against each one individually. Results are aggregated into:
|
|
136
|
+
|
|
137
|
+
- Per-stack HTML reports at `Reports/terraform-compliance/html_reports/`
|
|
138
|
+
- Unified `scan_report.html` alongside other tools
|
|
139
|
+
|
|
140
|
+
#### Organization Policy Integration
|
|
141
|
+
|
|
142
|
+
Store feature files in your org policy repo alongside OPA policies:
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
org-policies/
|
|
146
|
+
├── compliance/features/ ← terraform-compliance features
|
|
147
|
+
│ ├── encryption.feature
|
|
148
|
+
│ ├── tagging.feature
|
|
149
|
+
│ └── networking.feature
|
|
150
|
+
├── shared/policy/ ← OPA/Rego policies
|
|
151
|
+
└── rules/ ← ThothCTL structure rules
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Both tools share the same `THOTH_ORG_POLICY` env var.
|
|
155
|
+
|
|
68
156
|
### OPA / Conftest
|
|
69
157
|
|
|
70
158
|
[Open Policy Agent (OPA)](https://www.openpolicyagent.org/) is a CNCF-graduated general-purpose policy engine. ThothCTL integrates OPA through two modes:
|
|
@@ -79,10 +79,12 @@ ThothCTL automatically tracks scan results in `~/.thothcf/scan_history.db` (SQLi
|
|
|
79
79
|
| **Checkov** | Static analysis with built-in rules | `checkov` binary |
|
|
80
80
|
| **Trivy** | Vulnerability and misconfiguration detection | `trivy` binary |
|
|
81
81
|
| **KICS** | Static analysis via Docker | Docker |
|
|
82
|
-
| **Terraform-compliance** | BDD-style compliance testing | `terraform-compliance`
|
|
82
|
+
| **Terraform-compliance** | BDD-style compliance testing against tfplan.json | `terraform-compliance` (pip) |
|
|
83
83
|
| **OPA/Conftest** | Custom policy evaluation with Rego | `conftest` and/or `opa` binary |
|
|
84
84
|
|
|
85
|
-
Each tool has its own strengths. Combine built-in rule scanners (Checkov, Trivy) with custom policy tools (OPA) for comprehensive coverage.
|
|
85
|
+
Each tool has its own strengths. Combine built-in rule scanners (Checkov, Trivy) with custom policy tools (OPA, Terraform-compliance) for comprehensive coverage.
|
|
86
|
+
|
|
87
|
+
**Organization Policy Repo**: Set `THOTH_ORG_POLICY` env var to point all policy tools (OPA, terraform-compliance, project structure rules) to a single centralized governance repository.
|
|
86
88
|
|
|
87
89
|
## Next Steps
|
|
88
90
|
|
|
@@ -269,8 +269,8 @@ content = ["main.tf", "variables.tf", "outputs.tf"]
|
|
|
269
269
|
|
|
270
270
|
## Related Documentation
|
|
271
271
|
|
|
272
|
-
- [Template Engine Overview](
|
|
273
|
-
- [GitHub Templates](
|
|
274
|
-
- [Project Convert](
|
|
275
|
-
- [Project Upgrade](
|
|
272
|
+
- [Template Engine Overview](../../../template_engine/template_engine.md)
|
|
273
|
+
- [GitHub Templates](../../../template_engine/github_templates.md)
|
|
274
|
+
- [Project Convert](../../commands/project/project_convert.md)
|
|
275
|
+
- [Project Upgrade](../../commands/project/project_upgrade.md)
|
|
276
276
|
- [Platform Engineering Templates](../platform_engineering_templates.md)
|
|
@@ -52,6 +52,8 @@ pip install thothctl
|
|
|
52
52
|
| **Security** | [Checkov](https://www.checkov.io/) | Native (pip) |
|
|
53
53
|
| **Security** | [Trivy](https://trivy.dev/) | CLI binary |
|
|
54
54
|
| **Security** | [KICS](https://docs.kics.io/) | Docker container |
|
|
55
|
+
| **Compliance** | [Terraform-compliance](https://terraform-compliance.com/) | CLI binary |
|
|
56
|
+
| **Policy** | [OPA/Conftest](https://www.openpolicyagent.org/) | CLI binary |
|
|
55
57
|
| **Docs** | [Terraform-docs](https://terraform-docs.io/) | CLI binary |
|
|
56
58
|
| **AI** | [OpenAI](https://platform.openai.com/) | GPT-4 Turbo |
|
|
57
59
|
| **AI** | [AWS Bedrock](https://aws.amazon.com/bedrock/) | Claude Sonnet (InvokeModel + Agent) |
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import logging
|
|
2
|
+
import os
|
|
2
3
|
import click
|
|
3
4
|
import sys
|
|
4
5
|
import io
|
|
@@ -173,6 +174,8 @@ class CheckProjectIaCCommand(ClickCommand):
|
|
|
173
174
|
ctx = click.get_current_context()
|
|
174
175
|
directory = ctx.obj.get("CODE_DIRECTORY", ".")
|
|
175
176
|
project_type = kwargs.get('project_type', 'stack')
|
|
177
|
+
org_policy = kwargs.get('org_policy')
|
|
178
|
+
enforcement = kwargs.get('enforcement', 'soft')
|
|
176
179
|
|
|
177
180
|
# Create header with project type
|
|
178
181
|
header_text = f"🏗️ Infrastructure as Code {'Module' if project_type == 'module' else 'Stack'} Structure Check"
|
|
@@ -184,6 +187,9 @@ class CheckProjectIaCCommand(ClickCommand):
|
|
|
184
187
|
))
|
|
185
188
|
|
|
186
189
|
try:
|
|
190
|
+
# Run org policy check if source is provided
|
|
191
|
+
org_violations = self._check_org_policy(directory, project_type, org_policy)
|
|
192
|
+
|
|
187
193
|
# Capture stdout to format it nicely
|
|
188
194
|
captured_output = io.StringIO()
|
|
189
195
|
|
|
@@ -196,13 +202,19 @@ class CheckProjectIaCCommand(ClickCommand):
|
|
|
196
202
|
project_type=project_type
|
|
197
203
|
)
|
|
198
204
|
except SystemExit as e:
|
|
199
|
-
# Handle sys.exit() from validation service
|
|
200
205
|
result = e.code == 0
|
|
201
206
|
|
|
202
207
|
# Format and display the captured output
|
|
203
208
|
output = captured_output.getvalue()
|
|
204
209
|
if output.strip():
|
|
205
210
|
self._format_validation_output(output)
|
|
211
|
+
|
|
212
|
+
# Display org policy results
|
|
213
|
+
if org_violations is not None:
|
|
214
|
+
self._display_org_violations(org_violations, enforcement)
|
|
215
|
+
mandatory_fails = [v for v in org_violations if v.enforcement == "mandatory"]
|
|
216
|
+
if mandatory_fails and enforcement == "hard":
|
|
217
|
+
result = False
|
|
206
218
|
|
|
207
219
|
# Create summary
|
|
208
220
|
if result:
|
|
@@ -224,8 +236,8 @@ class CheckProjectIaCCommand(ClickCommand):
|
|
|
224
236
|
self.console.print()
|
|
225
237
|
self.console.print(summary_panel)
|
|
226
238
|
|
|
227
|
-
#
|
|
228
|
-
if not result and kwargs.get('mode') == 'strict':
|
|
239
|
+
# Exit with error code if hard enforcement has mandatory violations
|
|
240
|
+
if not result and (kwargs.get('mode') == 'strict' or enforcement == 'hard'):
|
|
229
241
|
exit(1)
|
|
230
242
|
|
|
231
243
|
except Exception as e:
|
|
@@ -233,6 +245,69 @@ class CheckProjectIaCCommand(ClickCommand):
|
|
|
233
245
|
self.logger.error(f"Failed to execute IaC project check: {str(e)}")
|
|
234
246
|
raise
|
|
235
247
|
|
|
248
|
+
def _check_org_policy(self, directory: str, project_type: str, org_policy=None):
|
|
249
|
+
"""Check project against organizational policy if available."""
|
|
250
|
+
from .....services.check.org_policy_loader import get_org_policy_path, resolve_rules_dir
|
|
251
|
+
from .....services.check.rule_merger import load_org_rules, merge_with_project, evaluate
|
|
252
|
+
|
|
253
|
+
org_path = get_org_policy_path(org_policy)
|
|
254
|
+
if not org_path:
|
|
255
|
+
return None
|
|
256
|
+
|
|
257
|
+
rules_dir = resolve_rules_dir(org_path)
|
|
258
|
+
if not rules_dir:
|
|
259
|
+
logger.info(f"No rules/ directory in org policy at {org_path}")
|
|
260
|
+
return None
|
|
261
|
+
|
|
262
|
+
self.console.print(f"[blue]📜 Loading org policy from: {org_path}[/blue]")
|
|
263
|
+
|
|
264
|
+
# Map CLI project_type to toml filename
|
|
265
|
+
type_map = {"stack": "terraform-terragrunt", "module": "terraform_module"}
|
|
266
|
+
rule_type = type_map.get(project_type, project_type)
|
|
267
|
+
|
|
268
|
+
ruleset = load_org_rules(rules_dir, rule_type)
|
|
269
|
+
project_toml = os.path.join(directory, ".thothcf.toml")
|
|
270
|
+
ruleset = merge_with_project(ruleset, project_toml)
|
|
271
|
+
|
|
272
|
+
return evaluate(ruleset, directory)
|
|
273
|
+
|
|
274
|
+
def _display_org_violations(self, violations, enforcement: str):
|
|
275
|
+
"""Display org policy violations in a Rich table."""
|
|
276
|
+
if not violations:
|
|
277
|
+
self.console.print(Panel(
|
|
278
|
+
"✅ [green]Organization policy check passed[/green]",
|
|
279
|
+
title="Org Policy",
|
|
280
|
+
style="green",
|
|
281
|
+
box=box.ROUNDED,
|
|
282
|
+
))
|
|
283
|
+
return
|
|
284
|
+
|
|
285
|
+
mandatory = [v for v in violations if v.enforcement == "mandatory"]
|
|
286
|
+
recommended = [v for v in violations if v.enforcement == "recommended"]
|
|
287
|
+
info = [v for v in violations if v.enforcement == "informational"]
|
|
288
|
+
|
|
289
|
+
if mandatory:
|
|
290
|
+
table = Table(title="❌ Mandatory Violations", box=box.ROUNDED, header_style="bold red")
|
|
291
|
+
table.add_column("Rule", style="cyan")
|
|
292
|
+
table.add_column("Expected", style="green")
|
|
293
|
+
table.add_column("Found", style="red")
|
|
294
|
+
for v in mandatory:
|
|
295
|
+
table.add_row(v.rule, v.expected, v.found)
|
|
296
|
+
self.console.print(table)
|
|
297
|
+
|
|
298
|
+
if recommended:
|
|
299
|
+
table = Table(title="⚠️ Recommendations", box=box.ROUNDED, header_style="bold yellow")
|
|
300
|
+
table.add_column("Rule", style="cyan")
|
|
301
|
+
table.add_column("Expected", style="green")
|
|
302
|
+
table.add_column("Found", style="yellow")
|
|
303
|
+
for v in recommended:
|
|
304
|
+
table.add_row(v.rule, v.expected, v.found)
|
|
305
|
+
self.console.print(table)
|
|
306
|
+
|
|
307
|
+
if info:
|
|
308
|
+
for v in info:
|
|
309
|
+
self.console.print(f" ℹ️ {v.rule}: {v.expected} (found: {v.found})")
|
|
310
|
+
|
|
236
311
|
def _validate_project_structure(self, directory: str, mode: str = "soft", check_type: str = "structure", project_type: str = "stack") -> bool:
|
|
237
312
|
"""Validate the IaC project structure
|
|
238
313
|
|
|
@@ -269,4 +344,15 @@ cli = CheckProjectIaCCommand.as_click_command(
|
|
|
269
344
|
type=click.Choice(["stack", "module"], case_sensitive=False),
|
|
270
345
|
default="stack"
|
|
271
346
|
),
|
|
347
|
+
click.option(
|
|
348
|
+
"--org-policy",
|
|
349
|
+
help="Organization policy source (Git URL or local path). Also reads THOTH_ORG_POLICY env var.",
|
|
350
|
+
default=None,
|
|
351
|
+
),
|
|
352
|
+
click.option(
|
|
353
|
+
"--enforcement",
|
|
354
|
+
help="Enforcement mode: soft (report only) or hard (fail on mandatory violations)",
|
|
355
|
+
type=click.Choice(["soft", "hard"], case_sensitive=False),
|
|
356
|
+
default="soft",
|
|
357
|
+
),
|
|
272
358
|
)
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"""Organizational Policy Loader — fetches and caches org policy repo."""
|
|
2
|
+
import hashlib
|
|
3
|
+
import logging
|
|
4
|
+
import os
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Optional
|
|
7
|
+
|
|
8
|
+
logger = logging.getLogger(__name__)
|
|
9
|
+
|
|
10
|
+
CACHE_DIR = Path.home() / ".thothcf" / ".policy_cache"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def get_org_policy_path(org_policy: Optional[str] = None) -> Optional[str]:
|
|
14
|
+
"""Resolve org policy repo path. Clones/caches if Git URL.
|
|
15
|
+
|
|
16
|
+
Resolution:
|
|
17
|
+
1. Explicit --org-policy argument
|
|
18
|
+
2. THOTH_ORG_POLICY env var
|
|
19
|
+
3. None (no org policy)
|
|
20
|
+
|
|
21
|
+
Returns:
|
|
22
|
+
Absolute path to cached org policy repo, or None.
|
|
23
|
+
"""
|
|
24
|
+
source = org_policy or os.environ.get("THOTH_ORG_POLICY")
|
|
25
|
+
if not source:
|
|
26
|
+
return None
|
|
27
|
+
|
|
28
|
+
# If it's already a local path
|
|
29
|
+
if os.path.isdir(source):
|
|
30
|
+
return os.path.abspath(source)
|
|
31
|
+
|
|
32
|
+
# Git URL — clone/cache
|
|
33
|
+
if _is_git_url(source):
|
|
34
|
+
return _clone_or_pull(source)
|
|
35
|
+
|
|
36
|
+
return None
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def resolve_rules_dir(org_path: str) -> Optional[str]:
|
|
40
|
+
"""Get the rules/ directory from an org policy repo."""
|
|
41
|
+
rules_dir = os.path.join(org_path, "rules")
|
|
42
|
+
return rules_dir if os.path.isdir(rules_dir) else None
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def resolve_policy_dir(org_path: str) -> Optional[str]:
|
|
46
|
+
"""Get the policy/ directory (OPA/Rego) from an org policy repo."""
|
|
47
|
+
# Check policy/ first, then shared/policy/ (common convention)
|
|
48
|
+
for candidate in ["policy", os.path.join("shared", "policy")]:
|
|
49
|
+
policy_dir = os.path.join(org_path, candidate)
|
|
50
|
+
if os.path.isdir(policy_dir):
|
|
51
|
+
return policy_dir
|
|
52
|
+
return None
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _is_git_url(value: str) -> bool:
|
|
56
|
+
return value.startswith(("https://", "git@", "ssh://", "git://"))
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _clone_or_pull(repo_url: str) -> Optional[str]:
|
|
60
|
+
"""Clone or update a Git repo to local cache."""
|
|
61
|
+
try:
|
|
62
|
+
import git
|
|
63
|
+
except ImportError:
|
|
64
|
+
logger.error("GitPython required. Install: pip install gitpython")
|
|
65
|
+
return None
|
|
66
|
+
|
|
67
|
+
# Parse optional @ref
|
|
68
|
+
ref = None
|
|
69
|
+
if "@" in repo_url and not repo_url.startswith("git@"):
|
|
70
|
+
repo_url, ref = repo_url.rsplit("@", 1)
|
|
71
|
+
elif repo_url.startswith("git@") and repo_url.count("@") > 1:
|
|
72
|
+
repo_url, ref = repo_url.rsplit("@", 1)
|
|
73
|
+
|
|
74
|
+
url_hash = hashlib.sha256(repo_url.encode()).hexdigest()[:12]
|
|
75
|
+
cache_path = CACHE_DIR / url_hash
|
|
76
|
+
CACHE_DIR.mkdir(parents=True, exist_ok=True)
|
|
77
|
+
|
|
78
|
+
try:
|
|
79
|
+
if (cache_path / ".git").exists():
|
|
80
|
+
repo = git.Repo(cache_path)
|
|
81
|
+
repo.remotes.origin.fetch()
|
|
82
|
+
if ref:
|
|
83
|
+
repo.git.checkout(ref)
|
|
84
|
+
else:
|
|
85
|
+
repo.remotes.origin.pull()
|
|
86
|
+
else:
|
|
87
|
+
kwargs = {"depth": 1} if not ref else {}
|
|
88
|
+
repo = git.Repo.clone_from(repo_url, cache_path, **kwargs)
|
|
89
|
+
if ref:
|
|
90
|
+
repo.git.checkout(ref)
|
|
91
|
+
|
|
92
|
+
return str(cache_path)
|
|
93
|
+
except Exception as e:
|
|
94
|
+
logger.error(f"Failed to clone org policy repo: {e}")
|
|
95
|
+
return None
|