thothctl 0.16.4__tar.gz → 0.16.7__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 (505) hide show
  1. {thothctl-0.16.4 → thothctl-0.16.7}/PKG-INFO +19 -2
  2. {thothctl-0.16.4 → thothctl-0.16.7}/README.md +18 -1
  3. thothctl-0.16.7/docs/framework/commands/check/deps.md +145 -0
  4. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/check/commands/iac.py +150 -20
  5. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/ai_agent.py +83 -21
  6. thothctl-0.16.7/src/thothctl/version.py +2 -0
  7. thothctl-0.16.4/docs/framework/commands/check/deps.md +0 -50
  8. thothctl-0.16.4/src/thothctl/version.py +0 -2
  9. {thothctl-0.16.4 → thothctl-0.16.7}/.devcontainer/Dockerfile +0 -0
  10. {thothctl-0.16.4 → thothctl-0.16.7}/.devcontainer/README.md +0 -0
  11. {thothctl-0.16.4 → thothctl-0.16.7}/.devcontainer/devcontainer.json +0 -0
  12. {thothctl-0.16.4 → thothctl-0.16.7}/.github/workflows/docs.yml +0 -0
  13. {thothctl-0.16.4 → thothctl-0.16.7}/.github/workflows/python-publish.yml +0 -0
  14. {thothctl-0.16.4 → thothctl-0.16.7}/.gitignore +0 -0
  15. {thothctl-0.16.4 → thothctl-0.16.7}/.pre-commit-config.yaml +0 -0
  16. {thothctl-0.16.4 → thothctl-0.16.7}/.readthedocs.yaml +0 -0
  17. {thothctl-0.16.4 → thothctl-0.16.7}/AWS_PRICING_API_FINAL_REPORT.md +0 -0
  18. {thothctl-0.16.4 → thothctl-0.16.7}/AWS_PRICING_API_IMPLEMENTATION_PLAN.md +0 -0
  19. {thothctl-0.16.4 → thothctl-0.16.7}/AWS_PRICING_REFACTOR_REPORT.md +0 -0
  20. {thothctl-0.16.4 → thothctl-0.16.7}/Dockerfile +0 -0
  21. {thothctl-0.16.4 → thothctl-0.16.7}/LICENSE +0 -0
  22. {thothctl-0.16.4 → thothctl-0.16.7}/TECHNICAL_DEBT_METRICS.md +0 -0
  23. {thothctl-0.16.4 → thothctl-0.16.7}/__init__.py +0 -0
  24. {thothctl-0.16.4 → thothctl-0.16.7}/docs/catalog/catalog-info.yaml +0 -0
  25. {thothctl-0.16.4 → thothctl-0.16.7}/docs/dashboard/README.md +0 -0
  26. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/ai-review/README.md +0 -0
  27. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/ai-review/agent_specifications.md +0 -0
  28. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/ai-review/agentcore.md +0 -0
  29. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/blast-radius.md +0 -0
  30. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/check_environment.md +0 -0
  31. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/check_iac.md +0 -0
  32. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/check_overview.md +0 -0
  33. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/check_project_iac.md +0 -0
  34. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/check_space.md +0 -0
  35. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/cost-analysis-quick-reference.md +0 -0
  36. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/cost-analysis.md +0 -0
  37. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/customizing_rules.md +0 -0
  38. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/deps-advanced.md +0 -0
  39. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/drift-detection.md +0 -0
  40. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/plan.md +0 -0
  41. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/document/customizing_docs.md +0 -0
  42. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/document/document_iac.md +0 -0
  43. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/document/document_overview.md +0 -0
  44. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/document/iac.md +0 -0
  45. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/document/use_cases.md +0 -0
  46. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/generate/generate_components.md +0 -0
  47. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/generate/generate_stacks.md +0 -0
  48. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/init/init.md +0 -0
  49. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/init/init_space.md +0 -0
  50. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/inventory/CHANGELOG.md +0 -0
  51. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/inventory/frameworks/terraform.md +0 -0
  52. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/inventory/frameworks/terragrunt.md +0 -0
  53. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/inventory/iac.md +0 -0
  54. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/inventory/inventory_iac.md +0 -0
  55. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/inventory/inventory_overview.md +0 -0
  56. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/list/list_overview.md +0 -0
  57. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/list/list_projects.md +0 -0
  58. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/list/list_spaces.md +0 -0
  59. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/mcp/mcp.md +0 -0
  60. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/project/iac.md +0 -0
  61. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/project/project_cleanup.md +0 -0
  62. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/project/project_convert.md +0 -0
  63. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/project/project_overview.md +0 -0
  64. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/project/project_upgrade.md +0 -0
  65. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/project/use_cases.md +0 -0
  66. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/remove/remove_overview.md +0 -0
  67. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/remove/remove_project.md +0 -0
  68. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/remove/remove_space.md +0 -0
  69. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/scan/iac.md +0 -0
  70. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/scan/scan_iac.md +0 -0
  71. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/scan/scan_overview.md +0 -0
  72. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/scan/use_cases.md +0 -0
  73. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/upgrade/upgrade_overview.md +0 -0
  74. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/concepts.md +0 -0
  75. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/cross_platform_support.md +0 -0
  76. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/framework_architecture.md +0 -0
  77. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/infrasctructure_composition.md +0 -0
  78. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/policy_as_code.md +0 -0
  79. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/roadmap_fdi.md +0 -0
  80. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/software_architecture.md +0 -0
  81. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/space_configuration.md +0 -0
  82. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/use_cases/README.md +0 -0
  83. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/use_cases/ai_dlc.md +0 -0
  84. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/use_cases/check_command.md +0 -0
  85. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/use_cases/devsecops_quickstart.md +0 -0
  86. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/use_cases/devsecops_sdlc.md +0 -0
  87. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/use_cases/inventory_command.md +0 -0
  88. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/use_cases/platform_engineering_templates.md +0 -0
  89. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/use_cases/space_management.md +0 -0
  90. {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/use_cases/tasks/create_template.md +0 -0
  91. {thothctl-0.16.4 → thothctl-0.16.7}/docs/iac_devsecops_use_case.md +0 -0
  92. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/automate_tasks_command.png +0 -0
  93. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/commnad_init.png +0 -0
  94. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/create_component.gif +0 -0
  95. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/create_inventory.gif +0 -0
  96. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/doc_command.png +0 -0
  97. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/document_project_code.gif +0 -0
  98. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/framework/thothforge-framework.svg +0 -0
  99. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/framework/thothfr.png +0 -0
  100. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/iacpeerbot_summary.png +0 -0
  101. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/icon-light.png +0 -0
  102. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/icon.png +0 -0
  103. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/init_project.gif +0 -0
  104. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/inventory_command.png +0 -0
  105. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/notification_img.png +0 -0
  106. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/report_dependencies.png +0 -0
  107. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/report_dependencies_summary.png +0 -0
  108. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/restore_inventory_version.gif +0 -0
  109. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/reuse_project_pattern.gif +0 -0
  110. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/scan_code.gif +0 -0
  111. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/scan_command.png +0 -0
  112. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/sync_wk_command.png +0 -0
  113. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/transform_command.png +0 -0
  114. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/update_inventory_version.gif +0 -0
  115. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/validate_command.png +0 -0
  116. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/validate_environment.gif +0 -0
  117. {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/validate_project.gif +0 -0
  118. {thothctl-0.16.4 → thothctl-0.16.7}/docs/includes/abbreviations.md +0 -0
  119. {thothctl-0.16.4 → thothctl-0.16.7}/docs/index.md +0 -0
  120. {thothctl-0.16.4 → thothctl-0.16.7}/docs/installation/linux_installation.md +0 -0
  121. {thothctl-0.16.4 → thothctl-0.16.7}/docs/installation/windows_installation.md +0 -0
  122. {thothctl-0.16.4 → thothctl-0.16.7}/docs/javascripts/tablesort.js +0 -0
  123. {thothctl-0.16.4 → thothctl-0.16.7}/docs/mcp.md +0 -0
  124. {thothctl-0.16.4 → thothctl-0.16.7}/docs/navigation.md +0 -0
  125. {thothctl-0.16.4 → thothctl-0.16.7}/docs/quick_start.md +0 -0
  126. {thothctl-0.16.4 → thothctl-0.16.7}/docs/requirements.txt +0 -0
  127. {thothctl-0.16.4 → thothctl-0.16.7}/docs/stylesheets/extra-enhanced.css +0 -0
  128. {thothctl-0.16.4 → thothctl-0.16.7}/docs/stylesheets/extra.css +0 -0
  129. {thothctl-0.16.4 → thothctl-0.16.7}/docs/telemetry.md +0 -0
  130. {thothctl-0.16.4 → thothctl-0.16.7}/docs/template_engine/cli_commands_audit.md +0 -0
  131. {thothctl-0.16.4 → thothctl-0.16.7}/docs/template_engine/for_developers.md +0 -0
  132. {thothctl-0.16.4 → thothctl-0.16.7}/docs/template_engine/for_platform_engineers.md +0 -0
  133. {thothctl-0.16.4 → thothctl-0.16.7}/docs/template_engine/github_templates.md +0 -0
  134. {thothctl-0.16.4 → thothctl-0.16.7}/docs/template_engine/template_engine.md +0 -0
  135. {thothctl-0.16.4 → thothctl-0.16.7}/docs/troubleshooting/linux_troubleshooting.md +0 -0
  136. {thothctl-0.16.4 → thothctl-0.16.7}/docs/troubleshooting/macos_troubleshooting.md +0 -0
  137. {thothctl-0.16.4 → thothctl-0.16.7}/docs/troubleshooting/troubleshooting.md +0 -0
  138. {thothctl-0.16.4 → thothctl-0.16.7}/docs/troubleshooting/windows_troubleshooting.md +0 -0
  139. {thothctl-0.16.4 → thothctl-0.16.7}/mkdocs.yaml +0 -0
  140. {thothctl-0.16.4 → thothctl-0.16.7}/pyproject.toml +0 -0
  141. {thothctl-0.16.4 → thothctl-0.16.7}/scripts/run_mcp_server.sh +0 -0
  142. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/__init__.py +0 -0
  143. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/application/__init__.py +0 -0
  144. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/autocomplete.py +0 -0
  145. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/cli.py +0 -0
  146. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/__init__.py +0 -0
  147. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/__init__.py +0 -0
  148. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/cli.py +0 -0
  149. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/__init__.py +0 -0
  150. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/analyze.py +0 -0
  151. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/apply_fix.py +0 -0
  152. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/configure.py +0 -0
  153. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/configure_decisions.py +0 -0
  154. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/decide.py +0 -0
  155. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/history.py +0 -0
  156. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/improve.py +0 -0
  157. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/orchestrate.py +0 -0
  158. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/override.py +0 -0
  159. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/report.py +0 -0
  160. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/serve.py +0 -0
  161. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/check/__init__.py +0 -0
  162. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/check/cli.py +0 -0
  163. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/check/commands/__init__.py +0 -0
  164. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/check/commands/environment.py +0 -0
  165. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/check/commands/project/__init__.py +0 -0
  166. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/check/commands/project/iac.py +0 -0
  167. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/check/commands/project.py +0 -0
  168. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/dashboard/__init__.py +0 -0
  169. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/dashboard/cli.py +0 -0
  170. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/dashboard/commands/__init__.py +0 -0
  171. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/dashboard/commands/launch.py +0 -0
  172. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/document/__init__.py +0 -0
  173. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/document/cli.py +0 -0
  174. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/document/commands/__init__.py +0 -0
  175. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/document/commands/iac.py +0 -0
  176. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/generate/__init__.py +0 -0
  177. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/generate/cli.py +0 -0
  178. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/generate/commands/__init__.py +0 -0
  179. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/generate/commands/component.py +0 -0
  180. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/generate/commands/stacks.py +0 -0
  181. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/init/__init__.py +0 -0
  182. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/init/cli.py +0 -0
  183. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/init/commands/__init__.py +0 -0
  184. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/init/commands/env.py +0 -0
  185. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/init/commands/project.py +0 -0
  186. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/init/commands/space.py +0 -0
  187. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/init/commands/template.py +0 -0
  188. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/inventory/__init__.py +0 -0
  189. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/inventory/cli.py +0 -0
  190. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/inventory/commands/__init__.py +0 -0
  191. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/inventory/commands/check.py +0 -0
  192. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/inventory/commands/iac.py +0 -0
  193. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/list/__init__.py +0 -0
  194. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/list/cli.py +0 -0
  195. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/list/commands/__init__.py +0 -0
  196. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/list/commands/projects.py +0 -0
  197. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/list/commands/spaces.py +0 -0
  198. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/mcp/__init__.py +0 -0
  199. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/mcp/cli.py +0 -0
  200. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/mcp/commands/__init__.py +0 -0
  201. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/mcp/commands/register.py +0 -0
  202. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/mcp/commands/server.py +0 -0
  203. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/mcp/commands/status.py +0 -0
  204. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/mcp/commands/stop.py +0 -0
  205. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/project/__init__.py +0 -0
  206. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/project/cli.py +0 -0
  207. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/project/commands/__init__.py +0 -0
  208. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/project/commands/bootstrap.py +0 -0
  209. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/project/commands/cleanup.py +0 -0
  210. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/project/commands/convert.py +0 -0
  211. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/project/commands/upgrade.py +0 -0
  212. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/remove/__init__.py +0 -0
  213. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/remove/cli.py +0 -0
  214. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/remove/project.py +0 -0
  215. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/remove/space.py +0 -0
  216. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/scan/__init__.py +0 -0
  217. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/scan/cli.py +0 -0
  218. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/scan/commands/__init__.py +0 -0
  219. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/scan/commands/iac.py +0 -0
  220. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/space/__init__.py +0 -0
  221. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/space/cli.py +0 -0
  222. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/space/commands/__init__.py +0 -0
  223. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/space/commands/activate.py +0 -0
  224. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/space/commands/update.py +0 -0
  225. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/upgrade/cli.py +0 -0
  226. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/common/.thothcf.setup.toml +0 -0
  227. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/common/.thothcf_home.toml +0 -0
  228. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/common/.thothcf_module.toml +0 -0
  229. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/common/.thothcf_project.toml +0 -0
  230. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/common/.thothcf_template_parameters.toml +0 -0
  231. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/common/__init__.py +0 -0
  232. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/common/common.py +0 -0
  233. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/common/terragrunt/.thothcf_project.toml +0 -0
  234. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/config/__init__.py +0 -0
  235. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/config/constants.py +0 -0
  236. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/config/default_values.py +0 -0
  237. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/config/defaults.py +0 -0
  238. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/config/models.py +0 -0
  239. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/config/settings.py +0 -0
  240. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/config/template_config.py +0 -0
  241. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/config/template_configs.py +0 -0
  242. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/config/templates.py +0 -0
  243. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/config/validation.py +0 -0
  244. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/__init__.py +0 -0
  245. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/cli_ui.py +0 -0
  246. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/commands.py +0 -0
  247. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/config.py +0 -0
  248. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/__init__.py +0 -0
  249. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/azure_devops/__init__.py +0 -0
  250. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/azure_devops/get_azure_devops.py +0 -0
  251. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/azure_devops/pull_request_comments.py +0 -0
  252. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/github/get_github.py +0 -0
  253. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/github/pull_request_comments.py +0 -0
  254. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/integrate_messages_services/__init__.py +0 -0
  255. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/integrate_messages_services/microsoft_teams.py +0 -0
  256. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/integrate_messages_services/sent_message_teams.py +0 -0
  257. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/pattern_names.py +0 -0
  258. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/pr_comments/__init__.py +0 -0
  259. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/pr_comments/pr_comment_publisher.py +0 -0
  260. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/logger.py +0 -0
  261. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/telemetry.py +0 -0
  262. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/version_tools.py +0 -0
  263. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/domain/__init__.py +0 -0
  264. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/domain/interfaces/__init__.py +0 -0
  265. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/domain/models/__init__.py +0 -0
  266. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/mcp/README.md +0 -0
  267. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/mcp/__init__.py +0 -0
  268. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/mcp/server.py +0 -0
  269. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/__init__.py +0 -0
  270. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/__init__.py +0 -0
  271. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/agentcore/agentcore.json +0 -0
  272. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/analyzers/__init__.py +0 -0
  273. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/analyzers/code_reviewer.py +0 -0
  274. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/analyzers/context_builder.py +0 -0
  275. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/analyzers/report_analyzer.py +0 -0
  276. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/analyzers/risk_assessor.py +0 -0
  277. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/bedrock_agent_api.py +0 -0
  278. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/config/__init__.py +0 -0
  279. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/config/ai_settings.py +0 -0
  280. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/config/decision_rules.py +0 -0
  281. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/decision_engine.py +0 -0
  282. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/main.py +0 -0
  283. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/memory.py +0 -0
  284. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/orchestrator.py +0 -0
  285. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/pr_decision_publisher.py +0 -0
  286. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/providers/__init__.py +0 -0
  287. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/providers/azure_provider.py +0 -0
  288. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/providers/bedrock_agent_provider.py +0 -0
  289. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/providers/bedrock_provider.py +0 -0
  290. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/providers/ollama_provider.py +0 -0
  291. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/providers/openai_provider.py +0 -0
  292. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/safety/__init__.py +0 -0
  293. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/safety/safety_guard.py +0 -0
  294. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/strands_agent.py +0 -0
  295. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/tracing.py +0 -0
  296. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/utils/__init__.py +0 -0
  297. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/utils/cost_tracker.py +0 -0
  298. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/utils/fix_patterns.py +0 -0
  299. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/utils/fix_prompts.py +0 -0
  300. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/utils/formatters.py +0 -0
  301. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/utils/prompts.py +0 -0
  302. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/__init__.py +0 -0
  303. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/environment/__init__.py +0 -0
  304. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/environment/check_environment.py +0 -0
  305. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/org_policy_loader.py +0 -0
  306. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/__init__.py +0 -0
  307. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/blast_radius_service.py +0 -0
  308. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/check_origin_version.py +0 -0
  309. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/check_project_structure.py +0 -0
  310. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/__init__.py +0 -0
  311. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/cost_analyzer.py +0 -0
  312. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/models/__init__.py +0 -0
  313. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/models/cloudformation_mapper.py +0 -0
  314. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/models/cost_models.py +0 -0
  315. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/__init__.py +0 -0
  316. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/aws_pricing_client.py +0 -0
  317. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/base_pricing.py +0 -0
  318. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/__init__.py +0 -0
  319. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/apigateway_pricing.py +0 -0
  320. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/bedrock_pricing.py +0 -0
  321. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/cloudwatch_pricing.py +0 -0
  322. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/dynamodb_pricing.py +0 -0
  323. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/ebs_pricing.py +0 -0
  324. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/ec2_pricing.py +0 -0
  325. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/ecs_pricing.py +0 -0
  326. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/eip_pricing.py +0 -0
  327. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/eks_pricing.py +0 -0
  328. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/elb_pricing.py +0 -0
  329. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/free_resources_pricing.py +0 -0
  330. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/kms_pricing.py +0 -0
  331. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/lambda_pricing.py +0 -0
  332. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/msk_pricing.py +0 -0
  333. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/rds_pricing.py +0 -0
  334. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/s3_pricing.py +0 -0
  335. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/secrets_manager_pricing.py +0 -0
  336. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/vpc_pricing.py +0 -0
  337. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/unified_cost_report.py +0 -0
  338. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/drift/__init__.py +0 -0
  339. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/drift/drift_ai.py +0 -0
  340. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/drift/drift_history.py +0 -0
  341. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/drift/drift_policy.py +0 -0
  342. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/drift/drift_report.py +0 -0
  343. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/drift/drift_service.py +0 -0
  344. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/drift/models.py +0 -0
  345. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/risk_assessment.py +0 -0
  346. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/validate_project_structure.py +0 -0
  347. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/rule_merger.py +0 -0
  348. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/dashboard/__init__.py +0 -0
  349. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/dashboard/dashboard_service.py +0 -0
  350. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/dashboard/data_loader.py +0 -0
  351. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/document/__init__.py +0 -0
  352. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/document/create_documentation.py +0 -0
  353. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/document/files_content.py +0 -0
  354. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/document/files_scan.py +0 -0
  355. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/document/iac_documentation.py +0 -0
  356. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/document/iac_grunt_graph.py +0 -0
  357. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/document/iac_grunt_info.py +0 -0
  358. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/__init__.py +0 -0
  359. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_stacks/__init__.py +0 -0
  360. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_stacks/config_generator.py +0 -0
  361. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_stacks/remote_config_generation.py +0 -0
  362. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_stacks/stack_service.py +0 -0
  363. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_stacks/templates/terragrunt.hcl.j2 +0 -0
  364. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_template/__init__.py +0 -0
  365. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_template/config.yaml +0 -0
  366. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_template/create_code.py +0 -0
  367. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_template/create_component.py +0 -0
  368. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_template/create_component_service.py +0 -0
  369. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_template/create_stacks.py +0 -0
  370. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_template/create_template.py +0 -0
  371. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_template/files_content.py +0 -0
  372. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_template/github_template_loader.py +0 -0
  373. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_template/project_templates.py +0 -0
  374. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/init/__init__.py +0 -0
  375. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/init/environment/__init__.py +0 -0
  376. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/init/environment/install_tools.py +0 -0
  377. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/init/project/__init__.py +0 -0
  378. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/init/project/project.py +0 -0
  379. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/init/space/__init__.py +0 -0
  380. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/init/space/example_space.toml +0 -0
  381. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/init/space/local_registry.py +0 -0
  382. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/init/space/space.py +0 -0
  383. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/inventory/__init__.py +0 -0
  384. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/inventory/changelog_parser.py +0 -0
  385. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/inventory/inventory_service.py +0 -0
  386. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/inventory/models.py +0 -0
  387. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/inventory/module_compatibility_service.py +0 -0
  388. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/inventory/report_service.py +0 -0
  389. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/inventory/schema_compatibility_service.py +0 -0
  390. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/inventory/terragrunt_parser.py +0 -0
  391. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/inventory/update_versions.py +0 -0
  392. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/inventory/version_service.py +0 -0
  393. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/mcp/README.md +0 -0
  394. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/mcp/__init__.py +0 -0
  395. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/mcp/amazon_q_server.py +0 -0
  396. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/mcp/example.py +0 -0
  397. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/mcp/service.py +0 -0
  398. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/mcp/simple_http_server.py +0 -0
  399. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/__init__.py +0 -0
  400. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/bootstrap/__init__.py +0 -0
  401. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/bootstrap/bootstrap_service.py +0 -0
  402. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/cleanup/__init__.py +0 -0
  403. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/cleanup/clean_project.py +0 -0
  404. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/cleanup/clean_space.py +0 -0
  405. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/convert/__init__.py +0 -0
  406. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/convert/conversion_service.py +0 -0
  407. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/convert/get_project_data.py +0 -0
  408. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/convert/post_init.py +0 -0
  409. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/convert/project_converter.py +0 -0
  410. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/convert/project_defaults.py +0 -0
  411. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/convert/set_project_parameters.py +0 -0
  412. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/create_terramate/__init__.py +0 -0
  413. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/create_terramate/create_terramate_stacks.py +0 -0
  414. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/create_terramate/detect_changes_stacks.py +0 -0
  415. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/create_terramate/manage_terramate_stacks.py +0 -0
  416. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/upgrade/__init__.py +0 -0
  417. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/upgrade/upgrade_service.py +0 -0
  418. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/__init__.py +0 -0
  419. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/compliance_review.py +0 -0
  420. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/import_reports.py +0 -0
  421. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/models.py +0 -0
  422. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/report_parser.py +0 -0
  423. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/sarif_output.py +0 -0
  424. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scan_history.py +0 -0
  425. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scan_service.py +0 -0
  426. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scanners/__init__.py +0 -0
  427. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scanners/checkov.py +0 -0
  428. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scanners/kics.py +0 -0
  429. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scanners/opa.py +0 -0
  430. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scanners/scan_reports.py +0 -0
  431. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scanners/scanners.py +0 -0
  432. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scanners/terraform_compliance.py +0 -0
  433. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scanners/tfsec.py +0 -0
  434. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scanners/trivy.py +0 -0
  435. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/templates/reports/inventory_report.html +0 -0
  436. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/templates/reports/inventory_report.js +0 -0
  437. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/templates/unified_report_styles.css +0 -0
  438. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/__init__.py +0 -0
  439. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/banner.py +0 -0
  440. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/__init__.py +0 -0
  441. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/create_compliance_html_reports.py +0 -0
  442. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/create_html_reports.py +0 -0
  443. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/delete_directory.py +0 -0
  444. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/fix_report_styling.py +0 -0
  445. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/render_scan_report.py +0 -0
  446. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/report_html_utils.py +0 -0
  447. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/templates/dashboard.html +0 -0
  448. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/templates/index_report.html +0 -0
  449. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/templates/individual_report.html +0 -0
  450. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/templates/simple_report.html +0 -0
  451. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/templates/unified_report_styles.css +0 -0
  452. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/templates/unified_scan_report.html +0 -0
  453. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/templates/unified_simple_report.html +0 -0
  454. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/templates/xunit_report.html +0 -0
  455. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/crypto.py +0 -0
  456. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/manage_backend_resources/__init__.py +0 -0
  457. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/manage_backend_resources/manage_backend_resources.py +0 -0
  458. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/modules_ops/__init__.py +0 -0
  459. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/modules_ops/terraform_module_details.py +0 -0
  460. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/modules_ops/terraform_modules_fetcher.py +0 -0
  461. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/platform_utils.py +0 -0
  462. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/process_hcl/__init__.py +0 -0
  463. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/process_hcl/analyze_terraform_plan.py +0 -0
  464. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/process_hcl/graph_manager.py +0 -0
  465. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/process_hcl/graph_terragrunt_dependencies.py +0 -0
  466. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/process_hcl/process_terraform_file.py +0 -0
  467. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/process_hcl/risk_analyzing_terraform_plan.py +0 -0
  468. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/sync_workspaces/__init__.py +0 -0
  469. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/sync_workspaces/sync_terraform_workspaces.py +0 -0
  470. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/sync_workspaces/sync_terragrunt_workspaces.py +0 -0
  471. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/template_loader.py +0 -0
  472. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/thoth_colors.py +0 -0
  473. {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/wellcome_banner.py +0 -0
  474. {thothctl-0.16.4 → thothctl-0.16.7}/tests/conftest.py +0 -0
  475. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_agentcore_entrypoint.py +0 -0
  476. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_aws_pricing_client.py +0 -0
  477. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_azure_devops_pr_comments.py +0 -0
  478. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_bedrock_pricing.py +0 -0
  479. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_cdk_language_selection.py +0 -0
  480. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_context_steering.py +0 -0
  481. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_cost_analyzer.py +0 -0
  482. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_cost_models.py +0 -0
  483. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_cost_pr_comments.py +0 -0
  484. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_dashboard_loading_fix.py +0 -0
  485. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_dashboard_service.py +0 -0
  486. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_drift.py +0 -0
  487. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_drift_detection.py +0 -0
  488. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_ec2_pricing.py +0 -0
  489. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_github_pr_comments.py +0 -0
  490. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_iac_cost_integration.py +0 -0
  491. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_inventory_pr_comments.py +0 -0
  492. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_kics_scanner.py +0 -0
  493. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_mermaid_edge_labels.py +0 -0
  494. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_new_cost_providers.py +0 -0
  495. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_parallel_scan.py +0 -0
  496. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_platform_utils.py +0 -0
  497. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_pr_comment_publisher.py +0 -0
  498. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_provider_source_url_fix.py +0 -0
  499. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_provider_versions.py +0 -0
  500. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_scan_pr_comments.py +0 -0
  501. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_space_command.py +0 -0
  502. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_space_management.py +0 -0
  503. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_template_url_fix.py +0 -0
  504. {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_terragrunt_parser.py +0 -0
  505. {thothctl-0.16.4 → thothctl-0.16.7}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: thothctl
3
- Version: 0.16.4
3
+ Version: 0.16.7
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
@@ -441,6 +441,7 @@ Use Trivy to find vulnerabilities (CVE) & misconfigurations (IaC) across code re
441
441
  ## OS Packages
442
442
 
443
443
  - dot or graphviz
444
+ - graph-easy (optional, for `--format boxart` topology view)
444
445
 
445
446
  You can install them with:
446
447
 
@@ -448,11 +449,19 @@ You can install them with:
448
449
  Chocolatey packages Graphviz for **Windows**.
449
450
 
450
451
  `choco install graphviz`
452
+
453
+ > For `graph-easy` on Windows, use WSL: `sudo apt install libgraph-easy-perl`
454
+
451
455
  ### Linux
452
456
  Install packages with apt for Linux/Debian
453
457
  -
454
458
  ```bash
455
- sudo apt install graphviz -y
459
+ sudo apt install graphviz libgraph-easy-perl -y
460
+ ```
461
+
462
+ ### macOS
463
+ ```bash
464
+ brew install graphviz graph-easy
456
465
  ```
457
466
  - python >= 3.8
458
467
  - check: `python --version`
@@ -483,3 +492,11 @@ pip install --upgrade thothctl
483
492
  - ~~AI Agent for IaC Security — multi-agent orchestrator, auto-decisions, code fixes, adaptive memory~~
484
493
  - Create Stacks and Infrastructure composition engine
485
494
  - Strands Agents SDK integration for advanced memory and session management
495
+ - **Intent-to-IaC Generation** — Natural language → governed Terraform/Tofu code, grounded in organizational templates and rules
496
+ - **Organizational Rulesets / Policy Engine** — Custom naming, tagging, security, and architecture rules enforced at generation and CI/CD time (OPA/Rego support)
497
+ - **Compliance Scoring with Evidence** — Scored findings mapped to SOC2/ISO27001/CIS/NIST, code citations, auditor-ready evidence export
498
+ - **Composable Workflow Engine** — Declarative YAML workflows with DAG dependencies for multi-step IaC operations (scan → review → fix → validate → deploy)
499
+ - **Graph-Aware State Visibility** — Parse tfstate into queryable resource graph (SQLite), blast radius analysis, SQL queries across all infrastructure
500
+ - **Architecture Diagram Generation** — Auto-generate Mermaid/Graphviz topology diagrams from IaC, synced with code changes
501
+
502
+ 📖 **Full roadmap**: [ThothCTL Roadmap 2026 — Competitive Analysis & Plan](../thothctl_roadmap_2026.md)
@@ -392,6 +392,7 @@ Use Trivy to find vulnerabilities (CVE) & misconfigurations (IaC) across code re
392
392
  ## OS Packages
393
393
 
394
394
  - dot or graphviz
395
+ - graph-easy (optional, for `--format boxart` topology view)
395
396
 
396
397
  You can install them with:
397
398
 
@@ -399,11 +400,19 @@ You can install them with:
399
400
  Chocolatey packages Graphviz for **Windows**.
400
401
 
401
402
  `choco install graphviz`
403
+
404
+ > For `graph-easy` on Windows, use WSL: `sudo apt install libgraph-easy-perl`
405
+
402
406
  ### Linux
403
407
  Install packages with apt for Linux/Debian
404
408
  -
405
409
  ```bash
406
- sudo apt install graphviz -y
410
+ sudo apt install graphviz libgraph-easy-perl -y
411
+ ```
412
+
413
+ ### macOS
414
+ ```bash
415
+ brew install graphviz graph-easy
407
416
  ```
408
417
  - python >= 3.8
409
418
  - check: `python --version`
@@ -434,3 +443,11 @@ pip install --upgrade thothctl
434
443
  - ~~AI Agent for IaC Security — multi-agent orchestrator, auto-decisions, code fixes, adaptive memory~~
435
444
  - Create Stacks and Infrastructure composition engine
436
445
  - Strands Agents SDK integration for advanced memory and session management
446
+ - **Intent-to-IaC Generation** — Natural language → governed Terraform/Tofu code, grounded in organizational templates and rules
447
+ - **Organizational Rulesets / Policy Engine** — Custom naming, tagging, security, and architecture rules enforced at generation and CI/CD time (OPA/Rego support)
448
+ - **Compliance Scoring with Evidence** — Scored findings mapped to SOC2/ISO27001/CIS/NIST, code citations, auditor-ready evidence export
449
+ - **Composable Workflow Engine** — Declarative YAML workflows with DAG dependencies for multi-step IaC operations (scan → review → fix → validate → deploy)
450
+ - **Graph-Aware State Visibility** — Parse tfstate into queryable resource graph (SQLite), blast radius analysis, SQL queries across all infrastructure
451
+ - **Architecture Diagram Generation** — Auto-generate Mermaid/Graphviz topology diagrams from IaC, synced with code changes
452
+
453
+ 📖 **Full roadmap**: [ThothCTL Roadmap 2026 — Competitive Analysis & Plan](../thothctl_roadmap_2026.md)
@@ -0,0 +1,145 @@
1
+ # Check Dependencies Command
2
+
3
+ ## Overview
4
+
5
+ The `check deps` command visualizes and analyzes infrastructure dependencies in your Terragrunt projects. It parses the DAG (Directed Acyclic Graph) from `terragrunt dag graph`, calculates component risk scores, and renders the topology in multiple formats.
6
+
7
+ ## Usage
8
+
9
+ ```bash
10
+ # Default: Rich tree with risk percentages
11
+ thothctl check iac -type deps
12
+
13
+ # ASCII box topology (best for terminal sharing)
14
+ thothctl check iac -type deps --format boxart
15
+
16
+ # Interactive HTML in browser (vis.js graph)
17
+ thothctl check iac -type deps --format html
18
+
19
+ # Raw DOT output (pipe to graphviz or other tools)
20
+ thothctl check iac -type deps --format dot
21
+ ```
22
+
23
+ ## Output Formats
24
+
25
+ | Format | Description | Use Case |
26
+ |--------|-------------|----------|
27
+ | `tree` | Rich tree with color-coded risk | Default terminal view |
28
+ | `boxart` | ASCII box drawing topology | Copy/paste into docs, Slack, PRs |
29
+ | `html` | Interactive vis.js graph in browser | Presentations, exploration |
30
+ | `dot` | Raw GraphViz DOT | Pipe to `dot`, `neato`, custom tools |
31
+
32
+ ### Tree (default)
33
+
34
+ ```
35
+ Infrastructure Modules
36
+ └── stacks/observability/network/reachability-analyzer (31.0% risk)
37
+ ├── stacks/foundation/network/security-groups (38.5% risk)
38
+ │ └── stacks/foundation/network/vpc (46.5% risk)
39
+ └── stacks/platform/data/rds (42.5% risk)
40
+ ```
41
+
42
+ ### Boxart
43
+
44
+ ```
45
+ ┌───────────────┐ ┌──────────────────┐
46
+ │ vpc 47% │ │ security-groups 39% │
47
+ └───────────────┘ └──────────────────┘
48
+ │ │
49
+ ▼ ▼
50
+ ┌───────────────┐ ┌──────────────────┐
51
+ │ rds 43% │ │ vpc-lattice 34% │
52
+ └───────────────┘ └──────────────────┘
53
+ ```
54
+
55
+ For best quality boxart, install `graph-easy`:
56
+
57
+ | OS | Install Command |
58
+ |----|----------------|
59
+ | **Linux (Debian/Ubuntu)** | `sudo apt install libgraph-easy-perl` |
60
+ | **macOS** | `brew install graph-easy` |
61
+ | **Windows** | `choco install graphviz` then use `--format dot \| dot -Tpng -o graph.png` |
62
+
63
+ > **Note**: Without `graph-easy`, ThothCTL uses a built-in Python fallback renderer.
64
+
65
+ ### HTML
66
+
67
+ Opens an interactive topology in your default browser with:
68
+ - Hierarchical top-down layout
69
+ - Color-coded nodes (green < 30% risk, orange 30-50%, red > 50%)
70
+ - Hover for full stack path
71
+ - Saved to `Reports/dependency_topology.html`
72
+
73
+ ### DOT
74
+
75
+ Outputs raw DOT graph for piping:
76
+
77
+ ```bash
78
+ # Generate PNG image
79
+ thothctl check iac -type deps --format dot | dot -Tpng -o topology.png
80
+
81
+ # Generate SVG
82
+ thothctl check iac -type deps --format dot | dot -Tsvg -o topology.svg
83
+
84
+ # Open in xdot viewer
85
+ thothctl check iac -type deps --format dot | xdot -
86
+ ```
87
+
88
+ ## Prerequisites
89
+
90
+ | Tool | Required | Install |
91
+ |------|----------|---------|
92
+ | `terragrunt` | ✅ Required | [terragrunt.gruntwork.io](https://terragrunt.gruntwork.io/) |
93
+ | `graphviz` | Optional (for `--format dot` piping) | See below |
94
+ | `graph-easy` | Optional (for `--format boxart` enhanced output) | See below |
95
+
96
+ ### Installing Graphviz
97
+
98
+ | OS | Command |
99
+ |----|---------|
100
+ | Linux (Debian/Ubuntu) | `sudo apt install graphviz` |
101
+ | macOS | `brew install graphviz` |
102
+ | Windows | `choco install graphviz` |
103
+
104
+ ### Installing graph-easy
105
+
106
+ | OS | Command |
107
+ |----|---------|
108
+ | Linux (Debian/Ubuntu) | `sudo apt install libgraph-easy-perl` |
109
+ | macOS | `brew install graph-easy` |
110
+ | Windows (WSL) | `sudo apt install libgraph-easy-perl` |
111
+
112
+ > **Windows native**: `graph-easy` is a Perl tool. On native Windows, use WSL or the `--format html` alternative.
113
+
114
+ ## Features
115
+
116
+ - **Risk Assessment**: Each component gets a risk percentage based on fan-in/fan-out degree and dependency depth
117
+ - **Terragrunt Details**: Shows mock_outputs and config_path from `dependency` blocks
118
+ - **Multiple Renderers**: Terminal, ASCII art, browser, and raw DOT
119
+ - **CI/CD Friendly**: `--format dot` for pipeline image generation, `--format boxart` for PR comments
120
+
121
+ ## Examples
122
+
123
+ ### CI/CD Pipeline — Post topology to PR
124
+
125
+ ```bash
126
+ # Generate boxart for PR comment
127
+ echo '```' > /tmp/deps.md
128
+ thothctl check iac -type deps --format boxart >> /tmp/deps.md
129
+ echo '```' >> /tmp/deps.md
130
+ gh pr comment --body-file /tmp/deps.md
131
+ ```
132
+
133
+ ### Generate documentation artifact
134
+
135
+ ```bash
136
+ thothctl check iac -type deps --format html
137
+ # → Opens browser + saves Reports/dependency_topology.html
138
+ ```
139
+
140
+ ## Related Commands
141
+
142
+ - [`check blast-radius`](blast-radius.md) — Assess change impact analysis
143
+ - [`check tfplan`](plan.md) — Analyze Terraform plans
144
+ - [`inventory iac`](../inventory/iac.md) — Create dependency inventory
145
+ - [`document iac`](../document/iac.md) — Generate documentation with graphs
@@ -70,7 +70,8 @@ class CheckIaCCommand(ClickCommand):
70
70
  elif kwargs['check_type'] == "deps":
71
71
  result = self._visualize_dependencies(
72
72
  directory=directory,
73
- dagtool='terragrunt' # Force terragrunt as the tool for dependencies
73
+ dagtool='terragrunt',
74
+ output_format=kwargs.get('format', 'tree'),
74
75
  )
75
76
  return result
76
77
  elif kwargs['check_type'] == "blast-radius":
@@ -593,7 +594,7 @@ class CheckIaCCommand(ClickCommand):
593
594
 
594
595
  f.write("\n")
595
596
 
596
- def _visualize_dependencies(self, directory: str, dagtool: str = 'terragrunt') -> bool:
597
+ def _visualize_dependencies(self, directory: str, dagtool: str = 'terragrunt', output_format: str = 'tree') -> bool:
597
598
  """Visualize infrastructure dependencies using terragrunt graph commands"""
598
599
  self.logger.info(f"Visualizing dependencies in {directory} using {dagtool}")
599
600
 
@@ -620,21 +621,22 @@ class CheckIaCCommand(ClickCommand):
620
621
  self.console.print(result.stderr)
621
622
  return False
622
623
 
623
- # Parse and visualize the DOT graph
624
624
  dot_graph = result.stdout
625
-
626
- # Parse the DOT graph to extract nodes and edges
625
+
626
+ # Route to the appropriate renderer
627
+ if output_format == "dot":
628
+ click.echo(dot_graph)
629
+ return True
630
+ elif output_format == "boxart":
631
+ return self._render_boxart(dot_graph, directory)
632
+ elif output_format == "html":
633
+ return self._render_html_topology(dot_graph, directory)
634
+
635
+ # Default: tree format
627
636
  nodes, edges = self._parse_dot_graph(dot_graph)
628
-
629
- # Calculate risk percentages for each component
630
637
  risks = calculate_component_risks(nodes, edges, directory)
631
-
632
- # Parse terragrunt.hcl files to get dependency details
633
638
  dep_info = self._parse_terragrunt_dependencies(directory)
634
-
635
- # Display the enhanced visualization with risk percentages and dependency info
636
639
  self._display_dependency_graph(dot_graph, risks, dep_info)
637
-
638
640
  return True
639
641
 
640
642
  except Exception as e:
@@ -642,6 +644,129 @@ class CheckIaCCommand(ClickCommand):
642
644
  self.console.print(f"[red]Error: {str(e)}[/red]")
643
645
  return False
644
646
 
647
+
648
+ def _render_boxart(self, dot_graph: str, directory: str) -> bool:
649
+ """Render dependency graph as ASCII box art using graph-easy or fallback."""
650
+ # Try graph-easy first (best output)
651
+ try:
652
+ result = subprocess.run(
653
+ ['graph-easy', '--from=dot', '--as=boxart'],
654
+ input=dot_graph, capture_output=True, text=True, check=True
655
+ )
656
+ self.console.print(Panel("[bold blue]🔄 Dependency Topology[/bold blue]", box=box.ROUNDED))
657
+ click.echo(result.stdout)
658
+ return True
659
+ except (FileNotFoundError, subprocess.CalledProcessError):
660
+ pass
661
+
662
+ # Fallback: pure Python box rendering
663
+ nodes, edges = self._parse_dot_graph(dot_graph)
664
+ risks = calculate_component_risks(nodes, edges, directory)
665
+
666
+ self.console.print(Panel("[bold blue]🔄 Dependency Topology (boxart)[/bold blue]", box=box.ROUNDED))
667
+ self.console.print("[dim]Install graph-easy for better rendering: sudo apt install libgraph-easy-perl[/dim]\n")
668
+
669
+ # Simple layered box drawing
670
+ # Build adjacency: who depends on whom
671
+ dependents = {n: set() for n in nodes}
672
+ for src, tgt in edges:
673
+ if src in dependents:
674
+ dependents[src].add(tgt)
675
+
676
+ # Find layers (topological sort by depth)
677
+ depth = {n: 0 for n in nodes}
678
+ changed = True
679
+ while changed:
680
+ changed = False
681
+ for src, tgt in edges:
682
+ if depth.get(src, 0) <= depth.get(tgt, 0):
683
+ depth[src] = depth[tgt] + 1
684
+ changed = True
685
+
686
+ max_depth = max(depth.values()) if depth else 0
687
+ layers = [[] for _ in range(max_depth + 1)]
688
+ for n, d in depth.items():
689
+ layers[max_depth - d].append(n)
690
+
691
+ # Render boxes per layer
692
+ for i, layer in enumerate(layers):
693
+ if not layer:
694
+ continue
695
+ boxes = []
696
+ for node in layer:
697
+ short = node.split("/")[-1] if "/" in node else node
698
+ risk = risks.get(node, 0)
699
+ boxes.append(f"┌{'─' * (len(short) + 6)}┐")
700
+ boxes.append(f"│ {short} {risk:.0f}% │")
701
+ boxes.append(f"└{'─' * (len(short) + 6)}┘")
702
+
703
+ # Print boxes side by side
704
+ lines_per_box = 3
705
+ row_boxes = [boxes[j:j+lines_per_box] for j in range(0, len(boxes), lines_per_box)]
706
+ for line_idx in range(lines_per_box):
707
+ click.echo(" ".join(b[line_idx] for b in row_boxes))
708
+
709
+ # Print arrows between layers
710
+ if i < len(layers) - 1:
711
+ click.echo(" │")
712
+ click.echo(" ▼")
713
+
714
+ return True
715
+
716
+ def _render_html_topology(self, dot_graph: str, directory: str) -> bool:
717
+ """Render interactive HTML topology and open in browser."""
718
+ import webbrowser
719
+ from pathlib import Path
720
+
721
+ nodes, edges = self._parse_dot_graph(dot_graph)
722
+ risks = calculate_component_risks(nodes, edges, directory)
723
+
724
+ # Build nodes/edges JSON for vis.js
725
+ vis_nodes = []
726
+ for i, node in enumerate(nodes):
727
+ short = node.split("/")[-1] if "/" in node else node
728
+ risk = risks.get(node, 0)
729
+ color = "#4caf50" if risk < 30 else "#ff9800" if risk < 50 else "#f44336"
730
+ vis_nodes.append(f'{{id: {i}, label: "{short}\\n{risk:.0f}% risk", color: "{color}", title: "{node}"}}')
731
+
732
+ node_idx = {n: i for i, n in enumerate(nodes)}
733
+ vis_edges = []
734
+ for src, tgt in edges:
735
+ if src in node_idx and tgt in node_idx:
736
+ vis_edges.append(f'{{from: {node_idx[src]}, to: {node_idx[tgt]}, arrows: "to"}}')
737
+
738
+ html = f"""<!DOCTYPE html>
739
+ <html><head><title>ThothCTL - Dependency Topology</title>
740
+ <script src="https://unpkg.com/vis-network/standalone/umd/vis-network.min.js"></script>
741
+ <style>
742
+ body {{ margin: 0; font-family: Inter, sans-serif; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); }}
743
+ #graph {{ width: 100vw; height: 100vh; }}
744
+ h1 {{ position: absolute; top: 10px; left: 20px; color: white; font-size: 1.2em; z-index: 10; }}
745
+ </style></head><body>
746
+ <h1>🔄 ThothCTL Dependency Topology</h1>
747
+ <div id="graph"></div>
748
+ <script>
749
+ var nodes = new vis.DataSet([{', '.join(vis_nodes)}]);
750
+ var edges = new vis.DataSet([{', '.join(vis_edges)}]);
751
+ var container = document.getElementById('graph');
752
+ var data = {{ nodes: nodes, edges: edges }};
753
+ var options = {{
754
+ layout: {{ hierarchical: {{ direction: "UD", sortMethod: "directed" }} }},
755
+ physics: false,
756
+ nodes: {{ shape: "box", font: {{ size: 14 }}, margin: 10 }},
757
+ edges: {{ color: "#ffffff80", width: 2 }}
758
+ }};
759
+ new vis.Network(container, data, options);
760
+ </script></body></html>"""
761
+
762
+ out_path = Path(directory) / "Reports" / "dependency_topology.html"
763
+ out_path.parent.mkdir(parents=True, exist_ok=True)
764
+ out_path.write_text(html)
765
+
766
+ self.console.print(f"[green]✅ HTML topology saved to {out_path}[/green]")
767
+ webbrowser.open(f"file://{out_path.resolve()}")
768
+ return True
769
+
645
770
  def _parse_terragrunt_dependencies(self, directory: str) -> Dict[str, Dict]:
646
771
  """Parse terragrunt.hcl files to extract dependency and mock_outputs information.
647
772
 
@@ -721,6 +846,13 @@ class CheckIaCCommand(ClickCommand):
721
846
  # Display dependency details if available
722
847
  if dep_info:
723
848
  self._display_dependency_details(dep_info)
849
+
850
+ # Display summary
851
+ self.console.print(f"\n[green]✅ Found {len(nodes)} modules with {len(edges)} dependencies[/green]")
852
+
853
+ # Display risk legend
854
+ if risks:
855
+ self._display_risk_legend()
724
856
 
725
857
  def _display_dependency_details(self, dep_info: Dict) -> None:
726
858
  """Display detailed dependency information from terragrunt.hcl files.
@@ -749,14 +881,6 @@ class CheckIaCCommand(ClickCommand):
749
881
  value_str = value_str[:47] + "..."
750
882
  self.console.print(f" • {key} = [green]{value_str}[/green]")
751
883
 
752
-
753
- # Display summary
754
- self.console.print(f"\n[green]✅ Found {len(nodes)} modules with {len(edges)} dependencies[/green]")
755
-
756
- # Display risk legend
757
- if risks:
758
- self._display_risk_legend()
759
-
760
884
  def _display_risk_legend(self) -> None:
761
885
  """Display a legend for risk levels"""
762
886
  legend = Table(show_header=False, box=box.SIMPLE)
@@ -1428,6 +1552,12 @@ cli = CheckIaCCommand.as_click_command(
1428
1552
  type=click.Choice(["tfplan", "deps", "blast-radius", "cost-analysis", "drift"], case_sensitive=True),
1429
1553
  default="tfplan",
1430
1554
  ),
1555
+ click.option(
1556
+ '--format',
1557
+ type=click.Choice(['tree', 'boxart', 'html', 'dot'], case_sensitive=True),
1558
+ default='tree',
1559
+ help='Output format for deps visualization (tree: Rich tree, boxart: ASCII boxes, html: interactive browser, dot: raw DOT)'
1560
+ ),
1431
1561
  click.option(
1432
1562
  '--plan-file',
1433
1563
  help="Path to terraform plan JSON file (for blast-radius)",
@@ -106,19 +106,23 @@ class AIReviewAgent:
106
106
 
107
107
  # Use compact prompt for local models (Ollama) to fit VRAM constraints
108
108
  if self._provider.name == "ollama":
109
- # Hybrid: scan data for structured findings + LLM for recommendations
110
- base_result = self._basic_analysis(ctx.scan_results, basic_risk) if basic_risk else self._empty_result()
111
- try:
112
- ai_response = self._provider.analyze(SYSTEM_COMPACT, formatted)
113
- # AI might return JSON or text — either way, use it as recommendations
114
- if isinstance(ai_response, dict) and ai_response.get("recommendations"):
115
- base_result["recommendations"] = ai_response["recommendations"]
116
- base_result["architecture_assessment"] = ai_response.get("architecture_assessment", "")
117
- elif isinstance(ai_response, dict) and ai_response.get("_raw_text"):
118
- base_result["recommendations"] = [ai_response["_raw_text"][:2000]]
119
- except Exception as e:
120
- logger.debug(f"LLM recommendations failed: {e}")
121
- result = base_result
109
+ # qwen models handle JSON well use direct approach
110
+ if "qwen" in self._provider.model.lower():
111
+ fallback = (lambda: self._basic_analysis(ctx.scan_results, basic_risk)) if basic_risk else self._empty_result
112
+ result = self._call_ai(SYSTEM_COMPACT, formatted, "analyze_directory", fallback=fallback)
113
+ else:
114
+ # Other models (mistral, gemma): hybrid scan data + LLM recommendations
115
+ base_result = self._basic_analysis(ctx.scan_results, basic_risk) if basic_risk else self._empty_result()
116
+ try:
117
+ ai_response = self._provider.analyze(SYSTEM_COMPACT, formatted)
118
+ if isinstance(ai_response, dict) and ai_response.get("recommendations"):
119
+ base_result["recommendations"] = ai_response["recommendations"]
120
+ base_result["architecture_assessment"] = ai_response.get("architecture_assessment", "")
121
+ elif isinstance(ai_response, dict) and ai_response.get("_raw_text"):
122
+ base_result["recommendations"] = [ai_response["_raw_text"][:2000]]
123
+ except Exception as e:
124
+ logger.debug(f"LLM recommendations failed: {e}")
125
+ result = base_result
122
126
  else:
123
127
  system_prompt = SYSTEM_FULL_ANALYSIS
124
128
  fallback = (lambda: self._basic_analysis(ctx.scan_results, basic_risk)) if basic_risk else self._empty_result
@@ -175,31 +179,63 @@ class AIReviewAgent:
175
179
  return self._pattern_fixes(scan_results, code_files, severity_filter)
176
180
 
177
181
  content = self._format_fix_request(scan_results, code_files, severity_filter)
178
- result = self._call_ai(SYSTEM_FIX_GENERATOR, content, "generate_fixes",
182
+
183
+ # Use compact fix prompt for Ollama
184
+ if self._provider.name == "ollama":
185
+ fix_prompt = (
186
+ "IaC fix generator. Generate fixes for the STACK files (where modules are called), "
187
+ "NOT inside .terraform/modules/. Add missing parameters to module blocks.\n"
188
+ "Respond with JSON: {\"fixes\":[{\"fix_id\":\"fix_001\",\"finding_id\":\"check_id\","
189
+ "\"file\":\"stack main.tf path\",\"severity\":\"HIGH\",\"description\":\"what\","
190
+ "\"original\":\"exact module block code\",\"replacement\":\"fixed module block with new params\"}],"
191
+ "\"summary\":{\"total_findings\":N,\"fixes_generated\":N,\"skipped\":N}}"
192
+ )
193
+ else:
194
+ fix_prompt = SYSTEM_FIX_GENERATOR
195
+
196
+ result = self._call_ai(fix_prompt, content, "generate_fixes",
179
197
  fallback=lambda: self._pattern_fixes(scan_results, code_files, severity_filter))
180
198
  s.set_attribute("fixes_generated", len(result.get("fixes", [])))
181
199
  return result
182
200
 
183
201
  def _format_fix_request(self, scan_results: Dict, code_files: Dict,
184
202
  severity_filter: str = None) -> str:
185
- """Format findings + code into a fix request for the AI."""
203
+ """Format findings + code + org policy into a fix request for the AI."""
186
204
  severity_order = {"CRITICAL": 0, "HIGH": 1, "MEDIUM": 2, "LOW": 3}
187
205
  min_sev = severity_order.get((severity_filter or "LOW").upper(), 3)
188
206
 
189
- sections = ["# Findings to Fix\n"]
207
+ sections = []
208
+
209
+ # Add org policy context if available
210
+ org_rules = self._load_org_policy_context()
211
+ if org_rules:
212
+ sections.append("# Organization Rules (fixes MUST comply)\n")
213
+ sections.append(org_rules)
214
+ sections.append("")
215
+
216
+ sections.append("# Findings to Fix\n")
190
217
  for tool, data in scan_results.get("tools", {}).items():
191
218
  for f in data.get("findings", []):
192
219
  sev = f.get("severity", "MEDIUM").upper()
193
220
  if severity_order.get(sev, 2) <= min_sev:
194
- sections.append(
195
- f"- [{sev}] {f.get('check_id', '')}: {f.get('check_name', '')} "
196
- f"in {f.get('file', '')} resource={f.get('resource', '')}"
197
- )
221
+ file_path = f.get("file", "")
222
+ # Map .terraform/modules/ findings to the stack module call
223
+ if ".terraform/modules/" in file_path or ".terraform\\modules\\" in file_path:
224
+ resource = f.get("resource", "")
225
+ sections.append(
226
+ f"- [{sev}] {f.get('check_id', '')}: {f.get('check_name', '')} "
227
+ f"resource={resource} (fix in the MODULE CALL, not module source)"
228
+ )
229
+ else:
230
+ sections.append(
231
+ f"- [{sev}] {f.get('check_id', '')}: {f.get('check_name', '')} "
232
+ f"in {file_path} resource={f.get('resource', '')}"
233
+ )
198
234
  if f.get("guideline"):
199
235
  sections.append(f" Guideline: {f['guideline']}")
200
236
 
201
237
  sections.append("\n# Affected Code Files\n")
202
- char_budget = 25000
238
+ char_budget = 25000 if self._provider.name != "ollama" else 8000
203
239
  used = 0
204
240
  for path, content in sorted(code_files.items()):
205
241
  entry = f"\n--- {path} ---\n{content}\n"
@@ -211,6 +247,32 @@ class AIReviewAgent:
211
247
 
212
248
  return "\n".join(sections)
213
249
 
250
+
251
+ def _load_org_policy_context(self) -> str:
252
+ """Load org policy rules as context for fix generation."""
253
+ from ..check.org_policy_loader import get_org_policy_path
254
+ org_path = get_org_policy_path()
255
+ if not org_path:
256
+ return ""
257
+
258
+ parts = []
259
+ rules_file = Path(org_path) / "rules" / "base.toml"
260
+ if rules_file.exists():
261
+ content = rules_file.read_text()
262
+ # Extract key rules compactly
263
+ for line in content.splitlines():
264
+ if any(k in line for k in ["required_tags", "pattern", "public_ingress", "enforcement"]):
265
+ parts.append(line.strip())
266
+
267
+ # Add naming/tagging rego summaries
268
+ for rego in (Path(org_path) / "shared" / "policy").glob("*.rego"):
269
+ text = rego.read_text()
270
+ for line in text.splitlines():
271
+ if line.startswith(("required_tags", "naming_pattern", "deny[", "warn[")):
272
+ parts.append(line.strip())
273
+
274
+ return "\n".join(parts[:15]) # Cap at 15 lines to save tokens
275
+
214
276
  def _fixes_from_analysis(self, analysis: Dict, directory: str) -> Dict:
215
277
  """Extract fix suggestions from an existing AI analysis."""
216
278
  fixes = []
@@ -0,0 +1,2 @@
1
+ """Version module."""
2
+ __version__ = "0.16.7"
@@ -1,50 +0,0 @@
1
- # Check Dependencies Command
2
-
3
- ## Overview
4
-
5
- The `check deps` command visualizes and analyzes dependencies in your Infrastructure as Code projects.
6
-
7
- ## Usage
8
-
9
- ```bash
10
- # Basic dependency check
11
- thothctl check iac -type deps
12
-
13
- # With recursive search
14
- thothctl check iac --recursive -type deps
15
-
16
- # Generate dependency graph
17
- thothctl check iac -type deps --dependencies
18
- ```
19
-
20
- ## Features
21
-
22
- - **Dependency Visualization**: Generate ASCII and SVG dependency graphs
23
- - **Terragrunt Integration**: Analyze terragrunt.hcl dependencies
24
- - **Recursive Analysis**: Process multiple directories
25
- - **Graph Generation**: Create visual dependency maps
26
-
27
- ## Output
28
-
29
- The command generates:
30
- - ASCII dependency tree in terminal
31
- - SVG graph files for visual representation
32
- - Dependency analysis reports
33
-
34
- ## Examples
35
-
36
- ### Basic Dependency Analysis
37
- ```bash
38
- thothctl check iac -type deps
39
- ```
40
-
41
- ### Generate Visual Graph
42
- ```bash
43
- thothctl check iac -type deps --dependencies
44
- ```
45
-
46
- ## Related Commands
47
-
48
- - [`check tfplan`](plan.md) - Analyze Terraform plans
49
- - [`check blast-radius`](blast-radius.md) - Assess change impact
50
- - [`inventory iac`](../inventory/iac.md) - Create dependency inventory
@@ -1,2 +0,0 @@
1
- """Version module."""
2
- __version__ = "0.16.4"