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.
Files changed (507) hide show
  1. {thothctl-0.20.2 → thothctl-0.20.4}/PKG-INFO +1 -1
  2. {thothctl-0.20.2 → thothctl-0.20.4}/docs/dashboard/README.md +24 -0
  3. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/blast-radius.md +106 -0
  4. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/scan/scan_overview.md +68 -0
  5. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/scan/commands/iac.py +20 -2
  6. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scanners/opa.py +6 -0
  7. thothctl-0.20.4/src/thothctl/version.py +2 -0
  8. thothctl-0.20.2/src/thothctl/version.py +0 -2
  9. {thothctl-0.20.2 → thothctl-0.20.4}/.devcontainer/Dockerfile +0 -0
  10. {thothctl-0.20.2 → thothctl-0.20.4}/.devcontainer/README.md +0 -0
  11. {thothctl-0.20.2 → thothctl-0.20.4}/.devcontainer/devcontainer.json +0 -0
  12. {thothctl-0.20.2 → thothctl-0.20.4}/.github/workflows/docs.yml +0 -0
  13. {thothctl-0.20.2 → thothctl-0.20.4}/.github/workflows/python-publish.yml +0 -0
  14. {thothctl-0.20.2 → thothctl-0.20.4}/.gitignore +0 -0
  15. {thothctl-0.20.2 → thothctl-0.20.4}/.pre-commit-config.yaml +0 -0
  16. {thothctl-0.20.2 → thothctl-0.20.4}/.readthedocs.yaml +0 -0
  17. {thothctl-0.20.2 → thothctl-0.20.4}/Dockerfile +0 -0
  18. {thothctl-0.20.2 → thothctl-0.20.4}/LICENSE +0 -0
  19. {thothctl-0.20.2 → thothctl-0.20.4}/README.md +0 -0
  20. {thothctl-0.20.2 → thothctl-0.20.4}/__init__.py +0 -0
  21. {thothctl-0.20.2 → thothctl-0.20.4}/docs/catalog/catalog-info.yaml +0 -0
  22. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/ai-review/README.md +0 -0
  23. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/ai-review/agent_specifications.md +0 -0
  24. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/ai-review/agentcore.md +0 -0
  25. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/check_environment.md +0 -0
  26. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/check_iac.md +0 -0
  27. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/check_overview.md +0 -0
  28. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/check_project_iac.md +0 -0
  29. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/check_space.md +0 -0
  30. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/cost-analysis-quick-reference.md +0 -0
  31. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/cost-analysis.md +0 -0
  32. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/customizing_rules.md +0 -0
  33. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/deps-advanced.md +0 -0
  34. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/deps.md +0 -0
  35. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/drift-detection.md +0 -0
  36. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/check/plan.md +0 -0
  37. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/document/customizing_docs.md +0 -0
  38. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/document/document_iac.md +0 -0
  39. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/document/document_overview.md +0 -0
  40. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/document/iac.md +0 -0
  41. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/document/use_cases.md +0 -0
  42. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/generate/generate_components.md +0 -0
  43. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/generate/generate_stacks.md +0 -0
  44. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/init/init.md +0 -0
  45. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/init/init_space.md +0 -0
  46. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/inventory/CHANGELOG.md +0 -0
  47. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/inventory/frameworks/terraform.md +0 -0
  48. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/inventory/frameworks/terragrunt.md +0 -0
  49. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/inventory/iac.md +0 -0
  50. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/inventory/inventory_iac.md +0 -0
  51. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/inventory/inventory_overview.md +0 -0
  52. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/list/list_overview.md +0 -0
  53. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/list/list_projects.md +0 -0
  54. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/list/list_spaces.md +0 -0
  55. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/mcp/mcp.md +0 -0
  56. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/project/iac.md +0 -0
  57. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/project/project_cleanup.md +0 -0
  58. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/project/project_convert.md +0 -0
  59. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/project/project_overview.md +0 -0
  60. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/project/project_upgrade.md +0 -0
  61. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/project/use_cases.md +0 -0
  62. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/remove/remove_overview.md +0 -0
  63. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/remove/remove_project.md +0 -0
  64. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/remove/remove_space.md +0 -0
  65. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/scan/iac.md +0 -0
  66. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/scan/scan_iac.md +0 -0
  67. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/scan/use_cases.md +0 -0
  68. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/commands/upgrade/upgrade_overview.md +0 -0
  69. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/concepts.md +0 -0
  70. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/cross_platform_support.md +0 -0
  71. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/framework_architecture.md +0 -0
  72. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/infrasctructure_composition.md +0 -0
  73. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/policy_as_code.md +0 -0
  74. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/roadmap_fdi.md +0 -0
  75. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/software_architecture.md +0 -0
  76. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/space_configuration.md +0 -0
  77. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/use_cases/README.md +0 -0
  78. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/use_cases/ai_dlc.md +0 -0
  79. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/use_cases/check_command.md +0 -0
  80. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/use_cases/devsecops_quickstart.md +0 -0
  81. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/use_cases/devsecops_sdlc.md +0 -0
  82. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/use_cases/inventory_command.md +0 -0
  83. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/use_cases/platform_engineering_templates.md +0 -0
  84. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/use_cases/space_management.md +0 -0
  85. {thothctl-0.20.2 → thothctl-0.20.4}/docs/framework/use_cases/tasks/create_template.md +0 -0
  86. {thothctl-0.20.2 → thothctl-0.20.4}/docs/iac_devsecops_use_case.md +0 -0
  87. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/automate_tasks_command.png +0 -0
  88. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/commnad_init.png +0 -0
  89. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/create_component.gif +0 -0
  90. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/create_inventory.gif +0 -0
  91. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/doc_command.png +0 -0
  92. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/document_project_code.gif +0 -0
  93. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/framework/thothforge-framework.svg +0 -0
  94. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/framework/thothfr.png +0 -0
  95. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/iacpeerbot_summary.png +0 -0
  96. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/icon-light.png +0 -0
  97. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/icon.png +0 -0
  98. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/init_project.gif +0 -0
  99. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/inventory_command.png +0 -0
  100. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/notification_img.png +0 -0
  101. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/report_dependencies.png +0 -0
  102. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/report_dependencies_summary.png +0 -0
  103. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/restore_inventory_version.gif +0 -0
  104. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/reuse_project_pattern.gif +0 -0
  105. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/scan_code.gif +0 -0
  106. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/scan_command.png +0 -0
  107. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/stable/scan_report_example.png +0 -0
  108. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/sync_wk_command.png +0 -0
  109. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/transform_command.png +0 -0
  110. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/update_inventory_version.gif +0 -0
  111. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/validate_command.png +0 -0
  112. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/validate_environment.gif +0 -0
  113. {thothctl-0.20.2 → thothctl-0.20.4}/docs/img/validate_project.gif +0 -0
  114. {thothctl-0.20.2 → thothctl-0.20.4}/docs/includes/abbreviations.md +0 -0
  115. {thothctl-0.20.2 → thothctl-0.20.4}/docs/index.md +0 -0
  116. {thothctl-0.20.2 → thothctl-0.20.4}/docs/installation/devcontainer_setup.md +0 -0
  117. {thothctl-0.20.2 → thothctl-0.20.4}/docs/installation/linux_installation.md +0 -0
  118. {thothctl-0.20.2 → thothctl-0.20.4}/docs/installation/windows_installation.md +0 -0
  119. {thothctl-0.20.2 → thothctl-0.20.4}/docs/javascripts/tablesort.js +0 -0
  120. {thothctl-0.20.2 → thothctl-0.20.4}/docs/mcp.md +0 -0
  121. {thothctl-0.20.2 → thothctl-0.20.4}/docs/navigation.md +0 -0
  122. {thothctl-0.20.2 → thothctl-0.20.4}/docs/quick_start.md +0 -0
  123. {thothctl-0.20.2 → thothctl-0.20.4}/docs/requirements.txt +0 -0
  124. {thothctl-0.20.2 → thothctl-0.20.4}/docs/stylesheets/extra-enhanced.css +0 -0
  125. {thothctl-0.20.2 → thothctl-0.20.4}/docs/stylesheets/extra.css +0 -0
  126. {thothctl-0.20.2 → thothctl-0.20.4}/docs/telemetry.md +0 -0
  127. {thothctl-0.20.2 → thothctl-0.20.4}/docs/template_engine/cli_commands_audit.md +0 -0
  128. {thothctl-0.20.2 → thothctl-0.20.4}/docs/template_engine/for_developers.md +0 -0
  129. {thothctl-0.20.2 → thothctl-0.20.4}/docs/template_engine/for_platform_engineers.md +0 -0
  130. {thothctl-0.20.2 → thothctl-0.20.4}/docs/template_engine/github_templates.md +0 -0
  131. {thothctl-0.20.2 → thothctl-0.20.4}/docs/template_engine/template_engine.md +0 -0
  132. {thothctl-0.20.2 → thothctl-0.20.4}/docs/troubleshooting/linux_troubleshooting.md +0 -0
  133. {thothctl-0.20.2 → thothctl-0.20.4}/docs/troubleshooting/macos_troubleshooting.md +0 -0
  134. {thothctl-0.20.2 → thothctl-0.20.4}/docs/troubleshooting/troubleshooting.md +0 -0
  135. {thothctl-0.20.2 → thothctl-0.20.4}/docs/troubleshooting/windows_troubleshooting.md +0 -0
  136. {thothctl-0.20.2 → thothctl-0.20.4}/mkdocs.yaml +0 -0
  137. {thothctl-0.20.2 → thothctl-0.20.4}/pyproject.toml +0 -0
  138. {thothctl-0.20.2 → thothctl-0.20.4}/scripts/run_mcp_server.sh +0 -0
  139. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/__init__.py +0 -0
  140. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/application/__init__.py +0 -0
  141. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/autocomplete.py +0 -0
  142. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/cli.py +0 -0
  143. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/__init__.py +0 -0
  144. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/__init__.py +0 -0
  145. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/cli.py +0 -0
  146. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/__init__.py +0 -0
  147. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/analyze.py +0 -0
  148. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/apply_fix.py +0 -0
  149. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/configure.py +0 -0
  150. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/configure_decisions.py +0 -0
  151. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/decide.py +0 -0
  152. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/history.py +0 -0
  153. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/improve.py +0 -0
  154. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/orchestrate.py +0 -0
  155. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/override.py +0 -0
  156. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/report.py +0 -0
  157. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/ai_review/commands/serve.py +0 -0
  158. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/check/__init__.py +0 -0
  159. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/check/cli.py +0 -0
  160. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/check/commands/__init__.py +0 -0
  161. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/check/commands/environment.py +0 -0
  162. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/check/commands/iac.py +0 -0
  163. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/check/commands/project/__init__.py +0 -0
  164. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/check/commands/project/iac.py +0 -0
  165. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/check/commands/project.py +0 -0
  166. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/dashboard/__init__.py +0 -0
  167. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/dashboard/cli.py +0 -0
  168. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/dashboard/commands/__init__.py +0 -0
  169. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/dashboard/commands/launch.py +0 -0
  170. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/document/__init__.py +0 -0
  171. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/document/cli.py +0 -0
  172. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/document/commands/__init__.py +0 -0
  173. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/document/commands/iac.py +0 -0
  174. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/generate/__init__.py +0 -0
  175. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/generate/cli.py +0 -0
  176. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/generate/commands/__init__.py +0 -0
  177. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/generate/commands/component.py +0 -0
  178. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/generate/commands/stacks.py +0 -0
  179. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/init/__init__.py +0 -0
  180. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/init/cli.py +0 -0
  181. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/init/commands/__init__.py +0 -0
  182. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/init/commands/env.py +0 -0
  183. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/init/commands/project.py +0 -0
  184. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/init/commands/space.py +0 -0
  185. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/init/commands/template.py +0 -0
  186. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/inventory/__init__.py +0 -0
  187. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/inventory/cli.py +0 -0
  188. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/inventory/commands/__init__.py +0 -0
  189. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/inventory/commands/check.py +0 -0
  190. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/inventory/commands/iac.py +0 -0
  191. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/list/__init__.py +0 -0
  192. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/list/cli.py +0 -0
  193. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/list/commands/__init__.py +0 -0
  194. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/list/commands/projects.py +0 -0
  195. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/list/commands/spaces.py +0 -0
  196. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/mcp/__init__.py +0 -0
  197. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/mcp/cli.py +0 -0
  198. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/mcp/commands/__init__.py +0 -0
  199. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/mcp/commands/register.py +0 -0
  200. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/mcp/commands/server.py +0 -0
  201. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/mcp/commands/status.py +0 -0
  202. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/mcp/commands/stop.py +0 -0
  203. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/project/__init__.py +0 -0
  204. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/project/cli.py +0 -0
  205. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/project/commands/__init__.py +0 -0
  206. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/project/commands/bootstrap.py +0 -0
  207. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/project/commands/cleanup.py +0 -0
  208. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/project/commands/convert.py +0 -0
  209. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/project/commands/upgrade.py +0 -0
  210. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/remove/__init__.py +0 -0
  211. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/remove/cli.py +0 -0
  212. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/remove/project.py +0 -0
  213. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/remove/space.py +0 -0
  214. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/scan/__init__.py +0 -0
  215. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/scan/cli.py +0 -0
  216. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/scan/commands/__init__.py +0 -0
  217. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/space/__init__.py +0 -0
  218. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/space/cli.py +0 -0
  219. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/space/commands/__init__.py +0 -0
  220. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/space/commands/activate.py +0 -0
  221. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/space/commands/show.py +0 -0
  222. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/space/commands/update.py +0 -0
  223. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/commands/upgrade/cli.py +0 -0
  224. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/common/.thothcf.setup.toml +0 -0
  225. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/common/.thothcf_home.toml +0 -0
  226. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/common/.thothcf_module.toml +0 -0
  227. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/common/.thothcf_project.toml +0 -0
  228. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/common/.thothcf_template_parameters.toml +0 -0
  229. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/common/__init__.py +0 -0
  230. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/common/common.py +0 -0
  231. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/common/terragrunt/.thothcf_project.toml +0 -0
  232. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/config/__init__.py +0 -0
  233. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/config/constants.py +0 -0
  234. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/config/default_values.py +0 -0
  235. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/config/defaults.py +0 -0
  236. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/config/models.py +0 -0
  237. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/config/settings.py +0 -0
  238. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/config/template_config.py +0 -0
  239. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/config/template_configs.py +0 -0
  240. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/config/templates.py +0 -0
  241. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/config/validation.py +0 -0
  242. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/__init__.py +0 -0
  243. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/cli_ui.py +0 -0
  244. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/commands.py +0 -0
  245. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/config.py +0 -0
  246. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/__init__.py +0 -0
  247. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/azure_devops/__init__.py +0 -0
  248. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/azure_devops/get_azure_devops.py +0 -0
  249. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/azure_devops/pull_request_comments.py +0 -0
  250. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/github/get_github.py +0 -0
  251. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/github/pull_request_comments.py +0 -0
  252. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/integrate_messages_services/__init__.py +0 -0
  253. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/integrate_messages_services/microsoft_teams.py +0 -0
  254. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/integrate_messages_services/sent_message_teams.py +0 -0
  255. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/pattern_names.py +0 -0
  256. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/pr_comments/__init__.py +0 -0
  257. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/integrations/pr_comments/pr_comment_publisher.py +0 -0
  258. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/logger.py +0 -0
  259. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/telemetry.py +0 -0
  260. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/core/version_tools.py +0 -0
  261. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/domain/__init__.py +0 -0
  262. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/domain/interfaces/__init__.py +0 -0
  263. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/domain/models/__init__.py +0 -0
  264. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/mcp/README.md +0 -0
  265. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/mcp/__init__.py +0 -0
  266. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/mcp/server.py +0 -0
  267. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/__init__.py +0 -0
  268. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/__init__.py +0 -0
  269. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/agentcore/agentcore.json +0 -0
  270. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/ai_agent.py +0 -0
  271. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/analyzers/__init__.py +0 -0
  272. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/analyzers/code_reviewer.py +0 -0
  273. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/analyzers/context_builder.py +0 -0
  274. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/analyzers/report_analyzer.py +0 -0
  275. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/analyzers/risk_assessor.py +0 -0
  276. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/bedrock_agent_api.py +0 -0
  277. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/config/__init__.py +0 -0
  278. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/config/ai_settings.py +0 -0
  279. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/config/decision_rules.py +0 -0
  280. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/decision_engine.py +0 -0
  281. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/main.py +0 -0
  282. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/memory.py +0 -0
  283. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/orchestrator.py +0 -0
  284. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/pr_decision_publisher.py +0 -0
  285. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/providers/__init__.py +0 -0
  286. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/providers/azure_provider.py +0 -0
  287. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/providers/bedrock_agent_provider.py +0 -0
  288. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/providers/bedrock_provider.py +0 -0
  289. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/providers/ollama_provider.py +0 -0
  290. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/providers/openai_provider.py +0 -0
  291. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/safety/__init__.py +0 -0
  292. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/safety/safety_guard.py +0 -0
  293. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/strands_agent.py +0 -0
  294. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/tracing.py +0 -0
  295. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/utils/__init__.py +0 -0
  296. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/utils/cost_tracker.py +0 -0
  297. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/utils/fix_patterns.py +0 -0
  298. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/utils/fix_prompts.py +0 -0
  299. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/utils/formatters.py +0 -0
  300. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/ai_review/utils/prompts.py +0 -0
  301. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/__init__.py +0 -0
  302. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/environment/__init__.py +0 -0
  303. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/environment/check_environment.py +0 -0
  304. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/org_policy_loader.py +0 -0
  305. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/__init__.py +0 -0
  306. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/blast_radius_service.py +0 -0
  307. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/check_origin_version.py +0 -0
  308. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/check_project_structure.py +0 -0
  309. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/__init__.py +0 -0
  310. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/cost_analyzer.py +0 -0
  311. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/models/__init__.py +0 -0
  312. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/models/cloudformation_mapper.py +0 -0
  313. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/models/cost_models.py +0 -0
  314. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/__init__.py +0 -0
  315. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/aws_pricing_client.py +0 -0
  316. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/base_pricing.py +0 -0
  317. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/__init__.py +0 -0
  318. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/apigateway_pricing.py +0 -0
  319. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/bedrock_pricing.py +0 -0
  320. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/cloudwatch_pricing.py +0 -0
  321. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/dynamodb_pricing.py +0 -0
  322. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/ebs_pricing.py +0 -0
  323. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/ec2_pricing.py +0 -0
  324. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/ecs_pricing.py +0 -0
  325. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/eip_pricing.py +0 -0
  326. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/eks_pricing.py +0 -0
  327. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/elb_pricing.py +0 -0
  328. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/free_resources_pricing.py +0 -0
  329. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/kms_pricing.py +0 -0
  330. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/lambda_pricing.py +0 -0
  331. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/msk_pricing.py +0 -0
  332. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/rds_pricing.py +0 -0
  333. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/s3_pricing.py +0 -0
  334. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/secrets_manager_pricing.py +0 -0
  335. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/pricing/providers/vpc_pricing.py +0 -0
  336. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/cost/unified_cost_report.py +0 -0
  337. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/drift/__init__.py +0 -0
  338. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/drift/drift_ai.py +0 -0
  339. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/drift/drift_history.py +0 -0
  340. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/drift/drift_policy.py +0 -0
  341. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/drift/drift_report.py +0 -0
  342. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/drift/drift_service.py +0 -0
  343. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/drift/models.py +0 -0
  344. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/risk_assessment.py +0 -0
  345. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/project/validate_project_structure.py +0 -0
  346. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/rule_merger.py +0 -0
  347. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/check/stack_optimizer/__init__.py +0 -0
  348. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/dashboard/__init__.py +0 -0
  349. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/dashboard/dashboard_service.py +0 -0
  350. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/dashboard/data_loader.py +0 -0
  351. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/document/__init__.py +0 -0
  352. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/document/architecture_renderer.py +0 -0
  353. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/document/create_documentation.py +0 -0
  354. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/document/files_content.py +0 -0
  355. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/document/files_scan.py +0 -0
  356. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/document/iac_documentation.py +0 -0
  357. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/document/iac_grunt_graph.py +0 -0
  358. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/document/iac_grunt_info.py +0 -0
  359. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/document/topology_generator.py +0 -0
  360. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/__init__.py +0 -0
  361. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_stacks/__init__.py +0 -0
  362. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_stacks/config_generator.py +0 -0
  363. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_stacks/remote_config_generation.py +0 -0
  364. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_stacks/stack_service.py +0 -0
  365. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_stacks/templates/terragrunt.hcl.j2 +0 -0
  366. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_template/__init__.py +0 -0
  367. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_template/config.yaml +0 -0
  368. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_template/create_code.py +0 -0
  369. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_template/create_component.py +0 -0
  370. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_template/create_component_service.py +0 -0
  371. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_template/create_stacks.py +0 -0
  372. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_template/create_template.py +0 -0
  373. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_template/files_content.py +0 -0
  374. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_template/github_template_loader.py +0 -0
  375. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/generate/create_template/project_templates.py +0 -0
  376. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/init/__init__.py +0 -0
  377. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/init/environment/__init__.py +0 -0
  378. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/init/environment/install_tools.py +0 -0
  379. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/init/project/__init__.py +0 -0
  380. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/init/project/project.py +0 -0
  381. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/init/space/__init__.py +0 -0
  382. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/init/space/example_space.toml +0 -0
  383. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/init/space/local_registry.py +0 -0
  384. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/init/space/space.py +0 -0
  385. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/inventory/__init__.py +0 -0
  386. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/inventory/changelog_parser.py +0 -0
  387. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/inventory/inventory_service.py +0 -0
  388. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/inventory/models.py +0 -0
  389. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/inventory/module_compatibility_service.py +0 -0
  390. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/inventory/report_service.py +0 -0
  391. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/inventory/schema_compatibility_service.py +0 -0
  392. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/inventory/terragrunt_parser.py +0 -0
  393. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/inventory/update_versions.py +0 -0
  394. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/inventory/version_service.py +0 -0
  395. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/mcp/README.md +0 -0
  396. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/mcp/__init__.py +0 -0
  397. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/mcp/simple_http_server.py +0 -0
  398. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/mcp/stdio_server.py +0 -0
  399. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/__init__.py +0 -0
  400. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/bootstrap/__init__.py +0 -0
  401. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/bootstrap/bootstrap_service.py +0 -0
  402. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/cleanup/__init__.py +0 -0
  403. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/cleanup/clean_project.py +0 -0
  404. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/cleanup/clean_space.py +0 -0
  405. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/convert/__init__.py +0 -0
  406. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/convert/conversion_service.py +0 -0
  407. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/convert/get_project_data.py +0 -0
  408. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/convert/post_init.py +0 -0
  409. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/convert/project_converter.py +0 -0
  410. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/convert/project_defaults.py +0 -0
  411. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/convert/set_project_parameters.py +0 -0
  412. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/create_terramate/__init__.py +0 -0
  413. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/create_terramate/create_terramate_stacks.py +0 -0
  414. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/create_terramate/detect_changes_stacks.py +0 -0
  415. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/create_terramate/manage_terramate_stacks.py +0 -0
  416. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/upgrade/__init__.py +0 -0
  417. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/project/upgrade/upgrade_service.py +0 -0
  418. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/__init__.py +0 -0
  419. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/compliance_review.py +0 -0
  420. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/import_reports.py +0 -0
  421. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/models.py +0 -0
  422. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/report_parser.py +0 -0
  423. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/sarif_output.py +0 -0
  424. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scan_history.py +0 -0
  425. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scan_service.py +0 -0
  426. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scanners/__init__.py +0 -0
  427. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scanners/checkov.py +0 -0
  428. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scanners/kics.py +0 -0
  429. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scanners/scan_reports.py +0 -0
  430. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scanners/scanners.py +0 -0
  431. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scanners/terraform_compliance.py +0 -0
  432. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scanners/tfsec.py +0 -0
  433. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/services/scan/scanners/trivy.py +0 -0
  434. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/templates/reports/inventory_report.html +0 -0
  435. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/templates/reports/inventory_report.js +0 -0
  436. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/templates/unified_report_styles.css +0 -0
  437. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/__init__.py +0 -0
  438. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/banner.py +0 -0
  439. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/__init__.py +0 -0
  440. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/create_compliance_html_reports.py +0 -0
  441. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/create_html_reports.py +0 -0
  442. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/delete_directory.py +0 -0
  443. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/fix_report_styling.py +0 -0
  444. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/render_scan_report.py +0 -0
  445. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/report_html_utils.py +0 -0
  446. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/templates/dashboard.html +0 -0
  447. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/templates/index_report.html +0 -0
  448. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/templates/individual_report.html +0 -0
  449. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/templates/simple_report.html +0 -0
  450. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/templates/unified_report_styles.css +0 -0
  451. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/templates/unified_scan_report.html +0 -0
  452. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/templates/unified_simple_report.html +0 -0
  453. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/common/templates/xunit_report.html +0 -0
  454. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/crypto.py +0 -0
  455. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/manage_backend_resources/__init__.py +0 -0
  456. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/manage_backend_resources/manage_backend_resources.py +0 -0
  457. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/modules_ops/__init__.py +0 -0
  458. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/modules_ops/terraform_module_details.py +0 -0
  459. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/modules_ops/terraform_modules_fetcher.py +0 -0
  460. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/platform_utils.py +0 -0
  461. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/process_hcl/__init__.py +0 -0
  462. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/process_hcl/analyze_terraform_plan.py +0 -0
  463. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/process_hcl/graph_manager.py +0 -0
  464. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/process_hcl/graph_terragrunt_dependencies.py +0 -0
  465. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/process_hcl/process_terraform_file.py +0 -0
  466. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/process_hcl/risk_analyzing_terraform_plan.py +0 -0
  467. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/sync_workspaces/__init__.py +0 -0
  468. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/sync_workspaces/sync_terraform_workspaces.py +0 -0
  469. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/sync_workspaces/sync_terragrunt_workspaces.py +0 -0
  470. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/template_loader.py +0 -0
  471. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/utils/thoth_colors.py +0 -0
  472. {thothctl-0.20.2 → thothctl-0.20.4}/src/thothctl/wellcome_banner.py +0 -0
  473. {thothctl-0.20.2 → thothctl-0.20.4}/tests/conftest.py +0 -0
  474. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_agentcore_entrypoint.py +0 -0
  475. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_aws_pricing_client.py +0 -0
  476. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_azure_devops_pr_comments.py +0 -0
  477. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_bedrock_pricing.py +0 -0
  478. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_cdk_language_selection.py +0 -0
  479. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_context_steering.py +0 -0
  480. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_cost_analyzer.py +0 -0
  481. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_cost_models.py +0 -0
  482. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_cost_pr_comments.py +0 -0
  483. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_dashboard_loading_fix.py +0 -0
  484. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_dashboard_service.py +0 -0
  485. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_drift.py +0 -0
  486. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_drift_detection.py +0 -0
  487. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_ec2_pricing.py +0 -0
  488. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_github_pr_comments.py +0 -0
  489. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_iac_cost_integration.py +0 -0
  490. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_inventory_pr_comments.py +0 -0
  491. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_kics_scanner.py +0 -0
  492. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_mermaid_edge_labels.py +0 -0
  493. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_new_cost_providers.py +0 -0
  494. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_opa_data_files.py +0 -0
  495. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_parallel_scan.py +0 -0
  496. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_platform_utils.py +0 -0
  497. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_pr_comment_publisher.py +0 -0
  498. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_provider_source_url_fix.py +0 -0
  499. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_provider_versions.py +0 -0
  500. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_scan_pr_comments.py +0 -0
  501. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_space_command.py +0 -0
  502. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_space_management.py +0 -0
  503. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_stack_optimizer.py +0 -0
  504. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_template_url_fix.py +0 -0
  505. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_terragrunt_parser.py +0 -0
  506. {thothctl-0.20.2 → thothctl-0.20.4}/tests/test_topology_generator.py +0 -0
  507. {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.2
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=self._parse_options(options) if options else {},
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
- ctx.exit(1)
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)
@@ -0,0 +1,2 @@
1
+ """Version module."""
2
+ __version__ = "0.20.4"
@@ -1,2 +0,0 @@
1
- """Version module."""
2
- __version__ = "0.20.2"
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