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