thothctl 0.18.6__tar.gz → 0.18.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 (506) hide show
  1. thothctl-0.18.7/.devcontainer/Dockerfile +8 -0
  2. thothctl-0.18.7/.devcontainer/README.md +73 -0
  3. thothctl-0.18.7/.devcontainer/devcontainer.json +64 -0
  4. {thothctl-0.18.6 → thothctl-0.18.7}/PKG-INFO +1 -1
  5. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/use_cases/devsecops_sdlc.md +9 -9
  6. thothctl-0.18.7/docs/installation/devcontainer_setup.md +93 -0
  7. {thothctl-0.18.6 → thothctl-0.18.7}/docs/navigation.md +1 -0
  8. {thothctl-0.18.6 → thothctl-0.18.7}/mkdocs.yaml +1 -0
  9. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/inventory/commands/iac.py +1 -1
  10. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/inventory/inventory_service.py +12 -6
  11. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/inventory/report_service.py +8 -2
  12. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/scan/scanners/opa.py +141 -10
  13. thothctl-0.18.7/src/thothctl/version.py +2 -0
  14. thothctl-0.18.6/.devcontainer/Dockerfile +0 -49
  15. thothctl-0.18.6/.devcontainer/README.md +0 -55
  16. thothctl-0.18.6/.devcontainer/devcontainer.json +0 -27
  17. thothctl-0.18.6/src/thothctl/version.py +0 -2
  18. {thothctl-0.18.6 → thothctl-0.18.7}/.github/workflows/docs.yml +0 -0
  19. {thothctl-0.18.6 → thothctl-0.18.7}/.github/workflows/python-publish.yml +0 -0
  20. {thothctl-0.18.6 → thothctl-0.18.7}/.gitignore +0 -0
  21. {thothctl-0.18.6 → thothctl-0.18.7}/.pre-commit-config.yaml +0 -0
  22. {thothctl-0.18.6 → thothctl-0.18.7}/.readthedocs.yaml +0 -0
  23. {thothctl-0.18.6 → thothctl-0.18.7}/Dockerfile +0 -0
  24. {thothctl-0.18.6 → thothctl-0.18.7}/LICENSE +0 -0
  25. {thothctl-0.18.6 → thothctl-0.18.7}/README.md +0 -0
  26. {thothctl-0.18.6 → thothctl-0.18.7}/__init__.py +0 -0
  27. {thothctl-0.18.6 → thothctl-0.18.7}/docs/catalog/catalog-info.yaml +0 -0
  28. {thothctl-0.18.6 → thothctl-0.18.7}/docs/dashboard/README.md +0 -0
  29. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/ai-review/README.md +0 -0
  30. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/ai-review/agent_specifications.md +0 -0
  31. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/ai-review/agentcore.md +0 -0
  32. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/check/blast-radius.md +0 -0
  33. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/check/check_environment.md +0 -0
  34. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/check/check_iac.md +0 -0
  35. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/check/check_overview.md +0 -0
  36. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/check/check_project_iac.md +0 -0
  37. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/check/check_space.md +0 -0
  38. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/check/cost-analysis-quick-reference.md +0 -0
  39. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/check/cost-analysis.md +0 -0
  40. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/check/customizing_rules.md +0 -0
  41. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/check/deps-advanced.md +0 -0
  42. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/check/deps.md +0 -0
  43. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/check/drift-detection.md +0 -0
  44. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/check/plan.md +0 -0
  45. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/document/customizing_docs.md +0 -0
  46. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/document/document_iac.md +0 -0
  47. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/document/document_overview.md +0 -0
  48. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/document/iac.md +0 -0
  49. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/document/use_cases.md +0 -0
  50. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/generate/generate_components.md +0 -0
  51. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/generate/generate_stacks.md +0 -0
  52. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/init/init.md +0 -0
  53. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/init/init_space.md +0 -0
  54. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/inventory/CHANGELOG.md +0 -0
  55. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/inventory/frameworks/terraform.md +0 -0
  56. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/inventory/frameworks/terragrunt.md +0 -0
  57. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/inventory/iac.md +0 -0
  58. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/inventory/inventory_iac.md +0 -0
  59. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/inventory/inventory_overview.md +0 -0
  60. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/list/list_overview.md +0 -0
  61. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/list/list_projects.md +0 -0
  62. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/list/list_spaces.md +0 -0
  63. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/mcp/mcp.md +0 -0
  64. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/project/iac.md +0 -0
  65. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/project/project_cleanup.md +0 -0
  66. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/project/project_convert.md +0 -0
  67. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/project/project_overview.md +0 -0
  68. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/project/project_upgrade.md +0 -0
  69. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/project/use_cases.md +0 -0
  70. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/remove/remove_overview.md +0 -0
  71. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/remove/remove_project.md +0 -0
  72. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/remove/remove_space.md +0 -0
  73. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/scan/iac.md +0 -0
  74. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/scan/scan_iac.md +0 -0
  75. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/scan/scan_overview.md +0 -0
  76. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/scan/use_cases.md +0 -0
  77. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/commands/upgrade/upgrade_overview.md +0 -0
  78. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/concepts.md +0 -0
  79. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/cross_platform_support.md +0 -0
  80. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/framework_architecture.md +0 -0
  81. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/infrasctructure_composition.md +0 -0
  82. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/policy_as_code.md +0 -0
  83. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/roadmap_fdi.md +0 -0
  84. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/software_architecture.md +0 -0
  85. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/space_configuration.md +0 -0
  86. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/use_cases/README.md +0 -0
  87. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/use_cases/ai_dlc.md +0 -0
  88. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/use_cases/check_command.md +0 -0
  89. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/use_cases/devsecops_quickstart.md +0 -0
  90. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/use_cases/inventory_command.md +0 -0
  91. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/use_cases/platform_engineering_templates.md +0 -0
  92. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/use_cases/space_management.md +0 -0
  93. {thothctl-0.18.6 → thothctl-0.18.7}/docs/framework/use_cases/tasks/create_template.md +0 -0
  94. {thothctl-0.18.6 → thothctl-0.18.7}/docs/iac_devsecops_use_case.md +0 -0
  95. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/automate_tasks_command.png +0 -0
  96. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/commnad_init.png +0 -0
  97. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/create_component.gif +0 -0
  98. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/create_inventory.gif +0 -0
  99. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/doc_command.png +0 -0
  100. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/document_project_code.gif +0 -0
  101. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/framework/thothforge-framework.svg +0 -0
  102. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/framework/thothfr.png +0 -0
  103. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/iacpeerbot_summary.png +0 -0
  104. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/icon-light.png +0 -0
  105. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/icon.png +0 -0
  106. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/init_project.gif +0 -0
  107. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/inventory_command.png +0 -0
  108. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/notification_img.png +0 -0
  109. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/report_dependencies.png +0 -0
  110. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/report_dependencies_summary.png +0 -0
  111. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/restore_inventory_version.gif +0 -0
  112. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/reuse_project_pattern.gif +0 -0
  113. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/scan_code.gif +0 -0
  114. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/scan_command.png +0 -0
  115. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/stable/scan_report_example.png +0 -0
  116. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/sync_wk_command.png +0 -0
  117. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/transform_command.png +0 -0
  118. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/update_inventory_version.gif +0 -0
  119. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/validate_command.png +0 -0
  120. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/validate_environment.gif +0 -0
  121. {thothctl-0.18.6 → thothctl-0.18.7}/docs/img/validate_project.gif +0 -0
  122. {thothctl-0.18.6 → thothctl-0.18.7}/docs/includes/abbreviations.md +0 -0
  123. {thothctl-0.18.6 → thothctl-0.18.7}/docs/index.md +0 -0
  124. {thothctl-0.18.6 → thothctl-0.18.7}/docs/installation/linux_installation.md +0 -0
  125. {thothctl-0.18.6 → thothctl-0.18.7}/docs/installation/windows_installation.md +0 -0
  126. {thothctl-0.18.6 → thothctl-0.18.7}/docs/javascripts/tablesort.js +0 -0
  127. {thothctl-0.18.6 → thothctl-0.18.7}/docs/mcp.md +0 -0
  128. {thothctl-0.18.6 → thothctl-0.18.7}/docs/quick_start.md +0 -0
  129. {thothctl-0.18.6 → thothctl-0.18.7}/docs/requirements.txt +0 -0
  130. {thothctl-0.18.6 → thothctl-0.18.7}/docs/stylesheets/extra-enhanced.css +0 -0
  131. {thothctl-0.18.6 → thothctl-0.18.7}/docs/stylesheets/extra.css +0 -0
  132. {thothctl-0.18.6 → thothctl-0.18.7}/docs/telemetry.md +0 -0
  133. {thothctl-0.18.6 → thothctl-0.18.7}/docs/template_engine/cli_commands_audit.md +0 -0
  134. {thothctl-0.18.6 → thothctl-0.18.7}/docs/template_engine/for_developers.md +0 -0
  135. {thothctl-0.18.6 → thothctl-0.18.7}/docs/template_engine/for_platform_engineers.md +0 -0
  136. {thothctl-0.18.6 → thothctl-0.18.7}/docs/template_engine/github_templates.md +0 -0
  137. {thothctl-0.18.6 → thothctl-0.18.7}/docs/template_engine/template_engine.md +0 -0
  138. {thothctl-0.18.6 → thothctl-0.18.7}/docs/troubleshooting/linux_troubleshooting.md +0 -0
  139. {thothctl-0.18.6 → thothctl-0.18.7}/docs/troubleshooting/macos_troubleshooting.md +0 -0
  140. {thothctl-0.18.6 → thothctl-0.18.7}/docs/troubleshooting/troubleshooting.md +0 -0
  141. {thothctl-0.18.6 → thothctl-0.18.7}/docs/troubleshooting/windows_troubleshooting.md +0 -0
  142. {thothctl-0.18.6 → thothctl-0.18.7}/pyproject.toml +0 -0
  143. {thothctl-0.18.6 → thothctl-0.18.7}/scripts/run_mcp_server.sh +0 -0
  144. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/__init__.py +0 -0
  145. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/application/__init__.py +0 -0
  146. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/autocomplete.py +0 -0
  147. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/cli.py +0 -0
  148. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/__init__.py +0 -0
  149. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/ai_review/__init__.py +0 -0
  150. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/ai_review/cli.py +0 -0
  151. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/ai_review/commands/__init__.py +0 -0
  152. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/ai_review/commands/analyze.py +0 -0
  153. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/ai_review/commands/apply_fix.py +0 -0
  154. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/ai_review/commands/configure.py +0 -0
  155. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/ai_review/commands/configure_decisions.py +0 -0
  156. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/ai_review/commands/decide.py +0 -0
  157. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/ai_review/commands/history.py +0 -0
  158. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/ai_review/commands/improve.py +0 -0
  159. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/ai_review/commands/orchestrate.py +0 -0
  160. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/ai_review/commands/override.py +0 -0
  161. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/ai_review/commands/report.py +0 -0
  162. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/ai_review/commands/serve.py +0 -0
  163. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/check/__init__.py +0 -0
  164. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/check/cli.py +0 -0
  165. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/check/commands/__init__.py +0 -0
  166. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/check/commands/environment.py +0 -0
  167. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/check/commands/iac.py +0 -0
  168. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/check/commands/project/__init__.py +0 -0
  169. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/check/commands/project/iac.py +0 -0
  170. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/check/commands/project.py +0 -0
  171. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/dashboard/__init__.py +0 -0
  172. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/dashboard/cli.py +0 -0
  173. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/dashboard/commands/__init__.py +0 -0
  174. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/dashboard/commands/launch.py +0 -0
  175. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/document/__init__.py +0 -0
  176. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/document/cli.py +0 -0
  177. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/document/commands/__init__.py +0 -0
  178. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/document/commands/iac.py +0 -0
  179. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/generate/__init__.py +0 -0
  180. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/generate/cli.py +0 -0
  181. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/generate/commands/__init__.py +0 -0
  182. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/generate/commands/component.py +0 -0
  183. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/generate/commands/stacks.py +0 -0
  184. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/init/__init__.py +0 -0
  185. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/init/cli.py +0 -0
  186. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/init/commands/__init__.py +0 -0
  187. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/init/commands/env.py +0 -0
  188. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/init/commands/project.py +0 -0
  189. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/init/commands/space.py +0 -0
  190. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/init/commands/template.py +0 -0
  191. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/inventory/__init__.py +0 -0
  192. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/inventory/cli.py +0 -0
  193. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/inventory/commands/__init__.py +0 -0
  194. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/inventory/commands/check.py +0 -0
  195. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/list/__init__.py +0 -0
  196. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/list/cli.py +0 -0
  197. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/list/commands/__init__.py +0 -0
  198. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/list/commands/projects.py +0 -0
  199. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/list/commands/spaces.py +0 -0
  200. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/mcp/__init__.py +0 -0
  201. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/mcp/cli.py +0 -0
  202. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/mcp/commands/__init__.py +0 -0
  203. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/mcp/commands/register.py +0 -0
  204. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/mcp/commands/server.py +0 -0
  205. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/mcp/commands/status.py +0 -0
  206. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/mcp/commands/stop.py +0 -0
  207. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/project/__init__.py +0 -0
  208. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/project/cli.py +0 -0
  209. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/project/commands/__init__.py +0 -0
  210. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/project/commands/bootstrap.py +0 -0
  211. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/project/commands/cleanup.py +0 -0
  212. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/project/commands/convert.py +0 -0
  213. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/project/commands/upgrade.py +0 -0
  214. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/remove/__init__.py +0 -0
  215. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/remove/cli.py +0 -0
  216. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/remove/project.py +0 -0
  217. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/remove/space.py +0 -0
  218. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/scan/__init__.py +0 -0
  219. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/scan/cli.py +0 -0
  220. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/scan/commands/__init__.py +0 -0
  221. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/scan/commands/iac.py +0 -0
  222. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/space/__init__.py +0 -0
  223. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/space/cli.py +0 -0
  224. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/space/commands/__init__.py +0 -0
  225. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/space/commands/activate.py +0 -0
  226. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/space/commands/show.py +0 -0
  227. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/space/commands/update.py +0 -0
  228. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/commands/upgrade/cli.py +0 -0
  229. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/common/.thothcf.setup.toml +0 -0
  230. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/common/.thothcf_home.toml +0 -0
  231. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/common/.thothcf_module.toml +0 -0
  232. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/common/.thothcf_project.toml +0 -0
  233. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/common/.thothcf_template_parameters.toml +0 -0
  234. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/common/__init__.py +0 -0
  235. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/common/common.py +0 -0
  236. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/common/terragrunt/.thothcf_project.toml +0 -0
  237. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/config/__init__.py +0 -0
  238. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/config/constants.py +0 -0
  239. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/config/default_values.py +0 -0
  240. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/config/defaults.py +0 -0
  241. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/config/models.py +0 -0
  242. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/config/settings.py +0 -0
  243. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/config/template_config.py +0 -0
  244. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/config/template_configs.py +0 -0
  245. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/config/templates.py +0 -0
  246. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/config/validation.py +0 -0
  247. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/core/__init__.py +0 -0
  248. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/core/cli_ui.py +0 -0
  249. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/core/commands.py +0 -0
  250. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/core/config.py +0 -0
  251. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/core/integrations/__init__.py +0 -0
  252. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/core/integrations/azure_devops/__init__.py +0 -0
  253. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/core/integrations/azure_devops/get_azure_devops.py +0 -0
  254. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/core/integrations/azure_devops/pull_request_comments.py +0 -0
  255. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/core/integrations/github/get_github.py +0 -0
  256. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/core/integrations/github/pull_request_comments.py +0 -0
  257. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/core/integrations/integrate_messages_services/__init__.py +0 -0
  258. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/core/integrations/integrate_messages_services/microsoft_teams.py +0 -0
  259. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/core/integrations/integrate_messages_services/sent_message_teams.py +0 -0
  260. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/core/integrations/pattern_names.py +0 -0
  261. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/core/integrations/pr_comments/__init__.py +0 -0
  262. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/core/integrations/pr_comments/pr_comment_publisher.py +0 -0
  263. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/core/logger.py +0 -0
  264. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/core/telemetry.py +0 -0
  265. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/core/version_tools.py +0 -0
  266. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/domain/__init__.py +0 -0
  267. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/domain/interfaces/__init__.py +0 -0
  268. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/domain/models/__init__.py +0 -0
  269. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/mcp/README.md +0 -0
  270. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/mcp/__init__.py +0 -0
  271. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/mcp/server.py +0 -0
  272. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/__init__.py +0 -0
  273. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/__init__.py +0 -0
  274. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/agentcore/agentcore.json +0 -0
  275. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/ai_agent.py +0 -0
  276. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/analyzers/__init__.py +0 -0
  277. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/analyzers/code_reviewer.py +0 -0
  278. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/analyzers/context_builder.py +0 -0
  279. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/analyzers/report_analyzer.py +0 -0
  280. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/analyzers/risk_assessor.py +0 -0
  281. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/bedrock_agent_api.py +0 -0
  282. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/config/__init__.py +0 -0
  283. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/config/ai_settings.py +0 -0
  284. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/config/decision_rules.py +0 -0
  285. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/decision_engine.py +0 -0
  286. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/main.py +0 -0
  287. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/memory.py +0 -0
  288. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/orchestrator.py +0 -0
  289. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/pr_decision_publisher.py +0 -0
  290. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/providers/__init__.py +0 -0
  291. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/providers/azure_provider.py +0 -0
  292. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/providers/bedrock_agent_provider.py +0 -0
  293. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/providers/bedrock_provider.py +0 -0
  294. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/providers/ollama_provider.py +0 -0
  295. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/providers/openai_provider.py +0 -0
  296. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/safety/__init__.py +0 -0
  297. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/safety/safety_guard.py +0 -0
  298. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/strands_agent.py +0 -0
  299. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/tracing.py +0 -0
  300. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/utils/__init__.py +0 -0
  301. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/utils/cost_tracker.py +0 -0
  302. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/utils/fix_patterns.py +0 -0
  303. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/utils/fix_prompts.py +0 -0
  304. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/utils/formatters.py +0 -0
  305. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/ai_review/utils/prompts.py +0 -0
  306. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/__init__.py +0 -0
  307. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/environment/__init__.py +0 -0
  308. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/environment/check_environment.py +0 -0
  309. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/org_policy_loader.py +0 -0
  310. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/__init__.py +0 -0
  311. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/blast_radius_service.py +0 -0
  312. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/check_origin_version.py +0 -0
  313. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/check_project_structure.py +0 -0
  314. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/__init__.py +0 -0
  315. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/cost_analyzer.py +0 -0
  316. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/models/__init__.py +0 -0
  317. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/models/cloudformation_mapper.py +0 -0
  318. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/models/cost_models.py +0 -0
  319. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/__init__.py +0 -0
  320. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/aws_pricing_client.py +0 -0
  321. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/base_pricing.py +0 -0
  322. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/providers/__init__.py +0 -0
  323. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/providers/apigateway_pricing.py +0 -0
  324. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/providers/bedrock_pricing.py +0 -0
  325. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/providers/cloudwatch_pricing.py +0 -0
  326. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/providers/dynamodb_pricing.py +0 -0
  327. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/providers/ebs_pricing.py +0 -0
  328. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/providers/ec2_pricing.py +0 -0
  329. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/providers/ecs_pricing.py +0 -0
  330. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/providers/eip_pricing.py +0 -0
  331. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/providers/eks_pricing.py +0 -0
  332. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/providers/elb_pricing.py +0 -0
  333. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/providers/free_resources_pricing.py +0 -0
  334. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/providers/kms_pricing.py +0 -0
  335. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/providers/lambda_pricing.py +0 -0
  336. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/providers/msk_pricing.py +0 -0
  337. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/providers/rds_pricing.py +0 -0
  338. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/providers/s3_pricing.py +0 -0
  339. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/providers/secrets_manager_pricing.py +0 -0
  340. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/pricing/providers/vpc_pricing.py +0 -0
  341. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/cost/unified_cost_report.py +0 -0
  342. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/drift/__init__.py +0 -0
  343. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/drift/drift_ai.py +0 -0
  344. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/drift/drift_history.py +0 -0
  345. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/drift/drift_policy.py +0 -0
  346. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/drift/drift_report.py +0 -0
  347. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/drift/drift_service.py +0 -0
  348. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/drift/models.py +0 -0
  349. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/risk_assessment.py +0 -0
  350. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/project/validate_project_structure.py +0 -0
  351. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/rule_merger.py +0 -0
  352. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/check/stack_optimizer/__init__.py +0 -0
  353. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/dashboard/__init__.py +0 -0
  354. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/dashboard/dashboard_service.py +0 -0
  355. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/dashboard/data_loader.py +0 -0
  356. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/document/__init__.py +0 -0
  357. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/document/create_documentation.py +0 -0
  358. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/document/files_content.py +0 -0
  359. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/document/files_scan.py +0 -0
  360. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/document/iac_documentation.py +0 -0
  361. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/document/iac_grunt_graph.py +0 -0
  362. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/document/iac_grunt_info.py +0 -0
  363. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/generate/__init__.py +0 -0
  364. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/generate/create_stacks/__init__.py +0 -0
  365. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/generate/create_stacks/config_generator.py +0 -0
  366. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/generate/create_stacks/remote_config_generation.py +0 -0
  367. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/generate/create_stacks/stack_service.py +0 -0
  368. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/generate/create_stacks/templates/terragrunt.hcl.j2 +0 -0
  369. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/generate/create_template/__init__.py +0 -0
  370. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/generate/create_template/config.yaml +0 -0
  371. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/generate/create_template/create_code.py +0 -0
  372. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/generate/create_template/create_component.py +0 -0
  373. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/generate/create_template/create_component_service.py +0 -0
  374. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/generate/create_template/create_stacks.py +0 -0
  375. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/generate/create_template/create_template.py +0 -0
  376. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/generate/create_template/files_content.py +0 -0
  377. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/generate/create_template/github_template_loader.py +0 -0
  378. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/generate/create_template/project_templates.py +0 -0
  379. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/init/__init__.py +0 -0
  380. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/init/environment/__init__.py +0 -0
  381. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/init/environment/install_tools.py +0 -0
  382. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/init/project/__init__.py +0 -0
  383. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/init/project/project.py +0 -0
  384. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/init/space/__init__.py +0 -0
  385. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/init/space/example_space.toml +0 -0
  386. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/init/space/local_registry.py +0 -0
  387. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/init/space/space.py +0 -0
  388. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/inventory/__init__.py +0 -0
  389. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/inventory/changelog_parser.py +0 -0
  390. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/inventory/models.py +0 -0
  391. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/inventory/module_compatibility_service.py +0 -0
  392. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/inventory/schema_compatibility_service.py +0 -0
  393. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/inventory/terragrunt_parser.py +0 -0
  394. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/inventory/update_versions.py +0 -0
  395. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/inventory/version_service.py +0 -0
  396. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/mcp/README.md +0 -0
  397. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/mcp/__init__.py +0 -0
  398. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/mcp/simple_http_server.py +0 -0
  399. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/mcp/stdio_server.py +0 -0
  400. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/project/__init__.py +0 -0
  401. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/project/bootstrap/__init__.py +0 -0
  402. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/project/bootstrap/bootstrap_service.py +0 -0
  403. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/project/cleanup/__init__.py +0 -0
  404. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/project/cleanup/clean_project.py +0 -0
  405. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/project/cleanup/clean_space.py +0 -0
  406. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/project/convert/__init__.py +0 -0
  407. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/project/convert/conversion_service.py +0 -0
  408. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/project/convert/get_project_data.py +0 -0
  409. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/project/convert/post_init.py +0 -0
  410. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/project/convert/project_converter.py +0 -0
  411. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/project/convert/project_defaults.py +0 -0
  412. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/project/convert/set_project_parameters.py +0 -0
  413. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/project/create_terramate/__init__.py +0 -0
  414. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/project/create_terramate/create_terramate_stacks.py +0 -0
  415. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/project/create_terramate/detect_changes_stacks.py +0 -0
  416. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/project/create_terramate/manage_terramate_stacks.py +0 -0
  417. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/project/upgrade/__init__.py +0 -0
  418. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/project/upgrade/upgrade_service.py +0 -0
  419. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/scan/__init__.py +0 -0
  420. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/scan/compliance_review.py +0 -0
  421. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/scan/import_reports.py +0 -0
  422. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/scan/models.py +0 -0
  423. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/scan/report_parser.py +0 -0
  424. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/scan/sarif_output.py +0 -0
  425. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/scan/scan_history.py +0 -0
  426. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/scan/scan_service.py +0 -0
  427. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/scan/scanners/__init__.py +0 -0
  428. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/scan/scanners/checkov.py +0 -0
  429. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/scan/scanners/kics.py +0 -0
  430. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/scan/scanners/scan_reports.py +0 -0
  431. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/scan/scanners/scanners.py +0 -0
  432. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/scan/scanners/terraform_compliance.py +0 -0
  433. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/scan/scanners/tfsec.py +0 -0
  434. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/services/scan/scanners/trivy.py +0 -0
  435. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/templates/reports/inventory_report.html +0 -0
  436. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/templates/reports/inventory_report.js +0 -0
  437. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/templates/unified_report_styles.css +0 -0
  438. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/__init__.py +0 -0
  439. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/banner.py +0 -0
  440. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/common/__init__.py +0 -0
  441. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/common/create_compliance_html_reports.py +0 -0
  442. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/common/create_html_reports.py +0 -0
  443. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/common/delete_directory.py +0 -0
  444. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/common/fix_report_styling.py +0 -0
  445. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/common/render_scan_report.py +0 -0
  446. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/common/report_html_utils.py +0 -0
  447. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/common/templates/dashboard.html +0 -0
  448. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/common/templates/index_report.html +0 -0
  449. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/common/templates/individual_report.html +0 -0
  450. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/common/templates/simple_report.html +0 -0
  451. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/common/templates/unified_report_styles.css +0 -0
  452. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/common/templates/unified_scan_report.html +0 -0
  453. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/common/templates/unified_simple_report.html +0 -0
  454. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/common/templates/xunit_report.html +0 -0
  455. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/crypto.py +0 -0
  456. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/manage_backend_resources/__init__.py +0 -0
  457. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/manage_backend_resources/manage_backend_resources.py +0 -0
  458. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/modules_ops/__init__.py +0 -0
  459. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/modules_ops/terraform_module_details.py +0 -0
  460. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/modules_ops/terraform_modules_fetcher.py +0 -0
  461. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/platform_utils.py +0 -0
  462. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/process_hcl/__init__.py +0 -0
  463. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/process_hcl/analyze_terraform_plan.py +0 -0
  464. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/process_hcl/graph_manager.py +0 -0
  465. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/process_hcl/graph_terragrunt_dependencies.py +0 -0
  466. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/process_hcl/process_terraform_file.py +0 -0
  467. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/process_hcl/risk_analyzing_terraform_plan.py +0 -0
  468. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/sync_workspaces/__init__.py +0 -0
  469. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/sync_workspaces/sync_terraform_workspaces.py +0 -0
  470. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/sync_workspaces/sync_terragrunt_workspaces.py +0 -0
  471. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/template_loader.py +0 -0
  472. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/utils/thoth_colors.py +0 -0
  473. {thothctl-0.18.6 → thothctl-0.18.7}/src/thothctl/wellcome_banner.py +0 -0
  474. {thothctl-0.18.6 → thothctl-0.18.7}/tests/conftest.py +0 -0
  475. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_agentcore_entrypoint.py +0 -0
  476. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_aws_pricing_client.py +0 -0
  477. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_azure_devops_pr_comments.py +0 -0
  478. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_bedrock_pricing.py +0 -0
  479. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_cdk_language_selection.py +0 -0
  480. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_context_steering.py +0 -0
  481. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_cost_analyzer.py +0 -0
  482. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_cost_models.py +0 -0
  483. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_cost_pr_comments.py +0 -0
  484. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_dashboard_loading_fix.py +0 -0
  485. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_dashboard_service.py +0 -0
  486. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_drift.py +0 -0
  487. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_drift_detection.py +0 -0
  488. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_ec2_pricing.py +0 -0
  489. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_github_pr_comments.py +0 -0
  490. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_iac_cost_integration.py +0 -0
  491. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_inventory_pr_comments.py +0 -0
  492. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_kics_scanner.py +0 -0
  493. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_mermaid_edge_labels.py +0 -0
  494. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_new_cost_providers.py +0 -0
  495. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_parallel_scan.py +0 -0
  496. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_platform_utils.py +0 -0
  497. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_pr_comment_publisher.py +0 -0
  498. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_provider_source_url_fix.py +0 -0
  499. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_provider_versions.py +0 -0
  500. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_scan_pr_comments.py +0 -0
  501. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_space_command.py +0 -0
  502. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_space_management.py +0 -0
  503. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_stack_optimizer.py +0 -0
  504. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_template_url_fix.py +0 -0
  505. {thothctl-0.18.6 → thothctl-0.18.7}/tests/test_terragrunt_parser.py +0 -0
  506. {thothctl-0.18.6 → thothctl-0.18.7}/tox.ini +0 -0
@@ -0,0 +1,8 @@
1
+ FROM mcr.microsoft.com/devcontainers/python:3.12
2
+
3
+ RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
4
+ && apt-get -y install --no-install-recommends \
5
+ graphviz \
6
+ libgraph-easy-perl \
7
+ wkhtmltopdf \
8
+ && apt-get clean -y && rm -rf /var/lib/apt/lists/*
@@ -0,0 +1,73 @@
1
+ # ThothForge Development Container
2
+
3
+ A modern devcontainer setup for ThothCTL development using the [Dev Container Features](https://containers.dev/features) specification.
4
+
5
+ ## What's Included
6
+
7
+ ### Tools (via Features — auto-updated)
8
+
9
+ | Tool | Purpose |
10
+ |------|---------|
11
+ | OpenTofu | IaC provisioning |
12
+ | Terragrunt | IaC orchestration |
13
+ | terraform-docs | Module documentation generation |
14
+ | Trivy | Vulnerability & misconfiguration scanning |
15
+ | TFSec | Terraform security scanner |
16
+ | TFLint | Terraform linter |
17
+ | ShellCheck | Shell script linter |
18
+ | AWS CLI | Cloud operations |
19
+ | GitHub CLI | PR workflows, code review |
20
+ | Docker-in-Docker | Required for KICS scanner |
21
+
22
+ ### System Packages (via Dockerfile)
23
+
24
+ - **graphviz** — Diagram generation (`thothctl document`)
25
+ - **libgraph-easy-perl** — ASCII topology views (`--format boxart`)
26
+ - **wkhtmltopdf** — PDF report generation
27
+
28
+ ### Python (via lifecycle hooks)
29
+
30
+ - ThothCTL installed in **editable mode** (`pip install -e '.[telemetry]'`)
31
+ - pre-commit hooks configured automatically
32
+ - Checkov for IaC security scanning
33
+
34
+ ## Getting Started
35
+
36
+ 1. Install [VS Code](https://code.visualstudio.com/) + [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)
37
+ 2. Install [Docker](https://www.docker.com/products/docker-desktop/)
38
+ 3. Clone the repository
39
+ 4. Open in VS Code → "Reopen in Container"
40
+
41
+ Once built, the container is ready with all tools. ThothCTL runs from source:
42
+
43
+ ```bash
44
+ thothctl --version
45
+ thothctl check iac -type security --recursive
46
+ thothctl dashboard start --port 8080
47
+ thothctl mcp start
48
+ ```
49
+
50
+ ## Ports
51
+
52
+ | Port | Service |
53
+ |------|---------|
54
+ | 8080 | ThothCTL Dashboard |
55
+ | 5001 | MCP Server |
56
+
57
+ ## Environment Variables
58
+
59
+ Pass these from your host to configure behavior:
60
+
61
+ | Variable | Purpose |
62
+ |----------|---------|
63
+ | `THOTHCTL_DEBUG` | Enable debug logging |
64
+ | `THOTH_LOG_LEVEL` | Set log level |
65
+
66
+ AWS credentials are mounted from `~/.aws` automatically.
67
+
68
+ ## Customizing
69
+
70
+ - **Add tools**: Add features to `devcontainer.json` from [containers.dev/features](https://containers.dev/features)
71
+ - **Add system packages**: Edit the `Dockerfile`
72
+ - **Add Python deps**: Modify `postCreateCommand` in `devcontainer.json`
73
+ - **Rebuild**: Command Palette → "Dev Containers: Rebuild Container"
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "ThothForge Infrastructure Development",
3
+ "build": {
4
+ "dockerfile": "Dockerfile"
5
+ },
6
+ "features": {
7
+ "ghcr.io/devcontainers/features/aws-cli:1": {},
8
+ "ghcr.io/devcontainers/features/github-cli:1": {},
9
+ "ghcr.io/devcontainers/features/docker-in-docker:4": {},
10
+ "ghcr.io/devcontainers-extra/features/opentofu:1": {},
11
+ "ghcr.io/devcontainers-extra/features/terragrunt:1": {},
12
+ "ghcr.io/devcontainers-extra/features/terraform-docs:1": {},
13
+ "ghcr.io/dhoeric/features/trivy:1": {},
14
+ "ghcr.io/dhoeric/features/tfsec:1": {},
15
+ "ghcr.io/devcontainers-extra/features/shellcheck:1": {},
16
+ "ghcr.io/devcontainers-extra/features/tflint:1": {}
17
+ },
18
+ "forwardPorts": [8080, 5001],
19
+ "portsAttributes": {
20
+ "8080": { "label": "ThothCTL Dashboard", "onAutoForward": "notify" },
21
+ "5001": { "label": "MCP Server", "onAutoForward": "silent" }
22
+ },
23
+ "containerEnv": {
24
+ "THOTHCTL_DEBUG": "${localEnv:THOTHCTL_DEBUG}",
25
+ "THOTH_LOG_LEVEL": "${localEnv:THOTH_LOG_LEVEL}",
26
+ "THOTH_MEMORY_MODE": "local"
27
+ },
28
+ "remoteEnv": {
29
+ "PATH": "${containerEnv:PATH}:/home/vscode/.local/bin"
30
+ },
31
+ "mounts": [
32
+ "source=${localEnv:HOME}/.aws,target=/home/vscode/.aws,type=bind,consistency=cached"
33
+ ],
34
+ "remoteUser": "vscode",
35
+ "postCreateCommand": {
36
+ "install-dev": "pip install -e '.[telemetry]'",
37
+ "pre-commit": "pip install pre-commit && pre-commit install",
38
+ "checkov": "pip install checkov"
39
+ },
40
+ "postStartCommand": "thothctl --version",
41
+ "customizations": {
42
+ "vscode": {
43
+ "extensions": [
44
+ "hashicorp.terraform",
45
+ "ms-python.python",
46
+ "ms-python.vscode-pylance",
47
+ "ms-azuretools.vscode-docker",
48
+ "redhat.vscode-yaml",
49
+ "timonwong.shellcheck",
50
+ "charliermarsh.ruff",
51
+ "eamodio.gitlens",
52
+ "github.copilot"
53
+ ],
54
+ "settings": {
55
+ "terminal.integrated.defaultProfile.linux": "bash",
56
+ "python.defaultInterpreterPath": "/usr/local/bin/python",
57
+ "[python]": {
58
+ "editor.defaultFormatter": "charliermarsh.ruff",
59
+ "editor.formatOnSave": true
60
+ }
61
+ }
62
+ }
63
+ }
64
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: thothctl
3
- Version: 0.18.6
3
+ Version: 0.18.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
@@ -7,7 +7,7 @@ This guide demonstrates how ThothCTL enables a complete DevSecOps Software Devel
7
7
  ## The DevSecOps SDLC Phases
8
8
 
9
9
  ```mermaid
10
- %%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#3f51b5','primaryTextColor':'#fff','primaryBorderColor':'#303f9f','lineColor':'#536dfe','secondaryColor':'#536dfe','tertiaryColor':'#fff','background':'#ffffff','mainBkg':'#e3f2fd','secondBkg':'#bbdefb','tertiaryBkg':'#90caf9','textColor':'#000000','fontSize':'14px'}}}%%
10
+ %%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#3f51b5','primaryTextColor':'#ffffff','primaryBorderColor':'#303f9f','lineColor':'#536dfe','secondaryColor':'#536dfe','tertiaryColor':'#fff','background':'transparent','mainBkg':'#3f51b5','secondBkg':'#536dfe','tertiaryBkg':'#90caf9','textColor':'#ffffff','nodeTextColor':'#ffffff','fontSize':'14px'}}}%%
11
11
  graph TB
12
12
  A["Plan<br/>📋 Cost Estimation<br/>Risk Assessment<br/>Template Selection"] --> B["Develop<br/>💻 Environment Check<br/>Structure Validation<br/>Best Practices"]
13
13
  B --> C["Build<br/>🔨 Inventory Creation<br/>Dependency Tracking<br/>Version Management"]
@@ -18,14 +18,14 @@ graph TB
18
18
  G --> H["Monitor<br/>📊 Dashboard<br/>Continuous Scan<br/>Drift Detection"]
19
19
  H --> A
20
20
 
21
- classDef planStyle fill:#01579b,stroke:#0288d1,stroke-width:2px,color:#fff
22
- classDef devStyle fill:#1b5e20,stroke:#2e7d32,stroke-width:2px,color:#fff
23
- classDef buildStyle fill:#e65100,stroke:#ef6c00,stroke-width:2px,color:#fff
24
- classDef testStyle fill:#4a148c,stroke:#6a1b9a,stroke-width:2px,color:#fff
25
- classDef secureStyle fill:#b71c1c,stroke:#c62828,stroke-width:2px,color:#fff
26
- classDef deployStyle fill:#004d40,stroke:#00695c,stroke-width:2px,color:#fff
27
- classDef operateStyle fill:#880e4f,stroke:#ad1457,stroke-width:2px,color:#fff
28
- classDef monitorStyle fill:#33691e,stroke:#558b2f,stroke-width:2px,color:#fff
21
+ classDef planStyle fill:#01579b,stroke:#0288d1,stroke-width:2px,color:#ffffff
22
+ classDef devStyle fill:#1b5e20,stroke:#2e7d32,stroke-width:2px,color:#ffffff
23
+ classDef buildStyle fill:#e65100,stroke:#ef6c00,stroke-width:2px,color:#ffffff
24
+ classDef testStyle fill:#4a148c,stroke:#6a1b9a,stroke-width:2px,color:#ffffff
25
+ classDef secureStyle fill:#b71c1c,stroke:#c62828,stroke-width:2px,color:#ffffff
26
+ classDef deployStyle fill:#004d40,stroke:#00695c,stroke-width:2px,color:#ffffff
27
+ classDef operateStyle fill:#880e4f,stroke:#ad1457,stroke-width:2px,color:#ffffff
28
+ classDef monitorStyle fill:#33691e,stroke:#558b2f,stroke-width:2px,color:#ffffff
29
29
 
30
30
  class A planStyle
31
31
  class B devStyle
@@ -0,0 +1,93 @@
1
+ # Development Container Setup
2
+
3
+ ThothCTL provides a ready-to-use [Dev Container](https://containers.dev/) for a fully configured local development environment. It works on **any OS** (Linux, macOS, Windows) and ensures all contributors have identical tooling.
4
+
5
+ ## Prerequisites
6
+
7
+ - [Docker](https://docs.docker.com/get-docker/)
8
+ - [VS Code](https://code.visualstudio.com/) + [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)
9
+
10
+ > Also works with GitHub Codespaces, JetBrains Gateway, and the [devcontainer CLI](https://github.com/devcontainers/cli).
11
+
12
+ ## Quick Start
13
+
14
+ ```bash
15
+ git clone https://github.com/thothforge/thothctl.git
16
+ cd thothctl
17
+ code .
18
+ # VS Code will prompt: "Reopen in Container" → click it
19
+ ```
20
+
21
+ After the container builds (~2 min first time), ThothCTL is installed in editable mode and all tools are ready:
22
+
23
+ ```bash
24
+ thothctl --version
25
+ tofu --version
26
+ terragrunt --version
27
+ trivy --version
28
+ checkov --version
29
+ ```
30
+
31
+ ## Included Tools
32
+
33
+ | Category | Tools |
34
+ |----------|-------|
35
+ | **IaC** | OpenTofu, Terragrunt, terraform-docs, TFLint |
36
+ | **Security** | Trivy, TFSec, Checkov, ShellCheck |
37
+ | **Cloud** | AWS CLI, Docker-in-Docker (for KICS) |
38
+ | **Dev Workflow** | GitHub CLI, pre-commit, Ruff |
39
+ | **Diagrams** | Graphviz, graph-easy |
40
+
41
+ ## Exposed Ports
42
+
43
+ | Port | Service | Command |
44
+ |------|---------|---------|
45
+ | 8080 | Dashboard | `thothctl dashboard start --port 8080` |
46
+ | 5001 | MCP Server | `thothctl mcp start` |
47
+
48
+ ## Environment Variables
49
+
50
+ Set these on your host to pass them into the container:
51
+
52
+ | Variable | Purpose | Default |
53
+ |----------|---------|---------|
54
+ | `THOTHCTL_DEBUG` | Enable debug logging | — |
55
+ | `THOTH_LOG_LEVEL` | Log level (DEBUG, INFO, etc.) | — |
56
+ | `AWS_PROFILE` | AWS profile to use | default |
57
+
58
+ AWS credentials are mounted from `~/.aws` automatically.
59
+
60
+ ## Development Workflow
61
+
62
+ The container installs ThothCTL in editable mode, so code changes are reflected immediately:
63
+
64
+ ```bash
65
+ # Run tests
66
+ python -m pytest tests/ -v --cov=src/
67
+
68
+ # Lint & format
69
+ ruff check src/ --fix
70
+ ruff format src/
71
+
72
+ # Run pre-commit hooks
73
+ pre-commit run --all-files
74
+ ```
75
+
76
+ ## Customizing
77
+
78
+ - **Add a tool**: Add a [Feature](https://containers.dev/features) to `.devcontainer/devcontainer.json`
79
+ - **Add a system package**: Edit `.devcontainer/Dockerfile`
80
+ - **Rebuild**: Command Palette → "Dev Containers: Rebuild Container"
81
+
82
+ ## Using Without VS Code
83
+
84
+ ```bash
85
+ # Install the devcontainer CLI
86
+ npm install -g @devcontainers/cli
87
+
88
+ # Build and start
89
+ devcontainer up --workspace-folder .
90
+
91
+ # Execute commands inside
92
+ devcontainer exec --workspace-folder . thothctl --version
93
+ ```
@@ -3,6 +3,7 @@
3
3
  ## Getting Started
4
4
 
5
5
  - [Quick Start](quick_start.md) - Universal installation and setup
6
+ - [Dev Container Setup](installation/devcontainer_setup.md) - One-click development environment (any OS)
6
7
  - [Windows Installation](installation/windows_installation.md) - Windows-specific setup guide
7
8
  - [Windows Troubleshooting](troubleshooting/windows_troubleshooting.md) - Windows-specific issues
8
9
 
@@ -23,6 +23,7 @@ nav:
23
23
  - Installation:
24
24
  - Linux & macOS: installation/linux_installation.md
25
25
  - Windows: installation/windows_installation.md
26
+ - Dev Container: installation/devcontainer_setup.md
26
27
  - Commands:
27
28
  - Init: framework/commands/init/init.md
28
29
  - Check:
@@ -504,7 +504,7 @@ cli = IaCInvCommand.as_click_command(
504
504
  "--inventory-path",
505
505
  help="Path for saving inventory reports",
506
506
  type=click.Path(),
507
- default="./Reports/inventory-sbom",
507
+ default="./Reports",
508
508
  ),
509
509
  click.option(
510
510
  "-cv",
@@ -606,16 +606,18 @@ class InventoryService:
606
606
  inventory_dict["technical_debt"] = tech_debt_metrics
607
607
  logger.info(f"Technical debt score: {tech_debt_metrics.get('debt_score', 0):.1f}%")
608
608
  # Generate reports
609
- reports_path = Path(reports_directory)
609
+ reports_path = Path(reports_directory) / "inventory"
610
610
  if not reports_path.is_absolute():
611
611
  reports_path = source_path / reports_path
612
612
 
613
613
  reports_path.mkdir(exist_ok=True, parents=True)
614
614
 
615
615
  if report_type in ("html", "all"):
616
+ html_reports_path = reports_path / "html_reports"
617
+ html_reports_path.mkdir(exist_ok=True, parents=True)
616
618
  html_path = self.report_service.create_html_report(
617
619
  inventory_dict,
618
- reports_directory=str(reports_path)
620
+ reports_directory=str(html_reports_path)
619
621
  )
620
622
 
621
623
  if report_type in ("json", "all"):
@@ -1066,11 +1068,13 @@ class InventoryService:
1066
1068
  }
1067
1069
 
1068
1070
  # Generate reports
1069
- reports_path = Path(reports_directory) / "inventory-sbom"
1071
+ reports_path = Path(reports_directory) / "inventory"
1070
1072
  reports_path.mkdir(parents=True, exist_ok=True)
1071
1073
 
1072
1074
  if report_type in ("html", "all"):
1073
- self.report_service.create_html_report(inventory_dict, reports_directory=str(reports_path))
1075
+ html_reports_path = reports_path / "html_reports"
1076
+ html_reports_path.mkdir(parents=True, exist_ok=True)
1077
+ self.report_service.create_html_report(inventory_dict, reports_directory=str(html_reports_path))
1074
1078
  if report_type in ("json", "all"):
1075
1079
  self.report_service.create_json_report(inventory_dict, reports_directory=str(reports_path))
1076
1080
  if print_console:
@@ -1404,13 +1408,15 @@ class InventoryService:
1404
1408
  # Generate reports
1405
1409
  if reports_directory:
1406
1410
  try:
1407
- reports_path = Path(reports_directory)
1411
+ reports_path = Path(reports_directory) / "inventory"
1408
1412
  reports_path.mkdir(exist_ok=True, parents=True)
1409
1413
 
1410
1414
  if report_type in ("html", "all"):
1415
+ html_reports_path = reports_path / "html_reports"
1416
+ html_reports_path.mkdir(exist_ok=True, parents=True)
1411
1417
  html_path = self.report_service.create_html_report(
1412
1418
  inventory_dict,
1413
- reports_directory=str(reports_path)
1419
+ reports_directory=str(html_reports_path)
1414
1420
  )
1415
1421
 
1416
1422
  if report_type in ("json", "all"):
@@ -25,7 +25,8 @@ class ReportService:
25
25
  def __init__(self, reports_directory: str = "Reports"):
26
26
  """Initialize report service."""
27
27
  self.reports_dir = Path(reports_directory)
28
- self.reports_dir.mkdir(exist_ok=True, parents=True)
28
+ self.inventory_dir = self.reports_dir / "inventory"
29
+ self.inventory_dir.mkdir(exist_ok=True, parents=True)
29
30
  self.console = Console()
30
31
  self.template_loader = get_template_loader()
31
32
 
@@ -37,7 +38,12 @@ class ReportService:
37
38
  reports_dir = Path(reports_directory)
38
39
  reports_dir.mkdir(exist_ok=True, parents=True)
39
40
  else:
40
- reports_dir = self.reports_dir
41
+ # Use inventory subdirectory; html goes into html_reports/
42
+ if extension == "html":
43
+ reports_dir = self.inventory_dir / "html_reports"
44
+ else:
45
+ reports_dir = self.inventory_dir
46
+ reports_dir.mkdir(exist_ok=True, parents=True)
41
47
 
42
48
  return reports_dir / f"{report_name}_{timestamp}.{extension}"
43
49
 
@@ -138,7 +138,10 @@ class OPAScanner(ScannerPort):
138
138
  f.write(result_junit.stdout or "")
139
139
 
140
140
  # Parse JSON results
141
- report_data = self._parse_conftest_json(result_json.stdout)
141
+ report_data, findings = self._parse_conftest_json(result_json.stdout)
142
+
143
+ # Generate HTML report (unified style)
144
+ self._generate_html_report(report_dir, report_data, findings, "Conftest")
142
145
 
143
146
  # conftest exit codes: 0=pass, 1=failure/violation, 2=error
144
147
  if result_json.returncode == 2:
@@ -150,6 +153,7 @@ class OPAScanner(ScannerPort):
150
153
  "error": result_json.stderr,
151
154
  "report_path": report_dir,
152
155
  "report_data": report_data,
156
+ "findings": findings,
153
157
  }
154
158
 
155
159
  self.ui.show_success()
@@ -157,6 +161,7 @@ class OPAScanner(ScannerPort):
157
161
  "status": "COMPLETE",
158
162
  "report_path": report_dir,
159
163
  "report_data": report_data,
164
+ "findings": findings,
160
165
  "issues_count": report_data.get("failed_count", 0),
161
166
  }
162
167
 
@@ -228,7 +233,7 @@ class OPAScanner(ScannerPort):
228
233
  with open(json_report, "w") as f:
229
234
  f.write(result.stdout or "{}")
230
235
 
231
- report_data = self._parse_opa_json(result.stdout)
236
+ report_data, findings = self._parse_opa_json(result.stdout)
232
237
 
233
238
  if result.returncode != 0 and not result.stdout:
234
239
  self.ui.show_error(f"OPA error: {result.stderr}")
@@ -237,13 +242,18 @@ class OPAScanner(ScannerPort):
237
242
  "error": result.stderr,
238
243
  "report_path": report_dir,
239
244
  "report_data": report_data,
245
+ "findings": findings,
240
246
  }
241
247
 
248
+ # Generate HTML report (unified style)
249
+ self._generate_html_report(report_dir, report_data, findings, "OPA")
250
+
242
251
  self.ui.show_success()
243
252
  return {
244
253
  "status": "COMPLETE",
245
254
  "report_path": report_dir,
246
255
  "report_data": report_data,
256
+ "findings": findings,
247
257
  "issues_count": report_data.get("failed_count", 0),
248
258
  }
249
259
 
@@ -257,24 +267,52 @@ class OPAScanner(ScannerPort):
257
267
 
258
268
  # ── Parsing ────────────────────────────────────────────────────────
259
269
 
260
- def _parse_conftest_json(self, stdout: str) -> Dict:
261
- """Parse conftest JSON output into report_data format.
270
+ def _parse_conftest_json(self, stdout: str) -> tuple:
271
+ """Parse conftest JSON output into report_data and findings list.
262
272
 
263
273
  Conftest JSON structure:
264
274
  [{"filename": "...", "successes": N,
265
275
  "failures": [{"msg": "..."}], "warnings": [{"msg": "..."}]}]
276
+
277
+ Returns:
278
+ Tuple of (report_data dict, findings list)
266
279
  """
267
280
  try:
268
281
  results = json.loads(stdout) if stdout else []
269
282
  except json.JSONDecodeError:
270
- return self._empty_report_data()
283
+ return self._empty_report_data(), []
271
284
 
272
285
  passed = sum(r.get("successes", 0) for r in results)
273
286
  failed = sum(len(r.get("failures", [])) for r in results)
274
287
  warnings = sum(len(r.get("warnings", [])) for r in results)
275
288
  exceptions = sum(len(r.get("exceptions", [])) for r in results)
276
289
 
277
- return {
290
+ # Build structured findings
291
+ findings = []
292
+ for r in results:
293
+ filename = r.get("filename", "unknown")
294
+ for failure in r.get("failures", []):
295
+ findings.append({
296
+ "id": "OPA",
297
+ "severity": "HIGH",
298
+ "title": failure.get("msg", "Policy violation"),
299
+ "resource": failure.get("metadata", {}).get("resource", ""),
300
+ "file": filename,
301
+ "line": failure.get("metadata", {}).get("line", 0),
302
+ "namespace": r.get("namespace", ""),
303
+ })
304
+ for warning in r.get("warnings", []):
305
+ findings.append({
306
+ "id": "OPA",
307
+ "severity": "MEDIUM",
308
+ "title": warning.get("msg", "Policy warning"),
309
+ "resource": warning.get("metadata", {}).get("resource", ""),
310
+ "file": filename,
311
+ "line": warning.get("metadata", {}).get("line", 0),
312
+ "namespace": r.get("namespace", ""),
313
+ })
314
+
315
+ report_data = {
278
316
  "passed_count": passed,
279
317
  "failed_count": failed,
280
318
  "skipped_count": exceptions,
@@ -282,16 +320,21 @@ class OPAScanner(ScannerPort):
282
320
  "warning_count": warnings,
283
321
  }
284
322
 
285
- def _parse_opa_json(self, stdout: str) -> Dict:
323
+ return report_data, findings
324
+
325
+ def _parse_opa_json(self, stdout: str) -> tuple:
286
326
  """Parse opa exec JSON output.
287
327
 
288
328
  OPA exec structure:
289
329
  {"result": [{"path": "file.json", "result": true/false/<value>}]}
330
+
331
+ Returns:
332
+ Tuple of (report_data dict, findings list)
290
333
  """
291
334
  try:
292
335
  data = json.loads(stdout) if stdout else {}
293
336
  except json.JSONDecodeError:
294
- return self._empty_report_data()
337
+ return self._empty_report_data(), []
295
338
 
296
339
  results = data.get("result", [])
297
340
  passed = sum(1 for r in results if r.get("result") is True)
@@ -299,13 +342,29 @@ class OPAScanner(ScannerPort):
299
342
  # Results that are neither true nor false (e.g. score values)
300
343
  other = len(results) - passed - failed
301
344
 
302
- return {
345
+ findings = []
346
+ for r in results:
347
+ if r.get("result") is False:
348
+ findings.append({
349
+ "id": "OPA",
350
+ "severity": "HIGH",
351
+ "title": f"Policy denied: {Path(r.get('path', 'unknown')).name}",
352
+ "resource": "",
353
+ "file": r.get("path", "unknown"),
354
+ "line": 0,
355
+ "namespace": "",
356
+ })
357
+
358
+ report_data = {
303
359
  "passed_count": passed,
304
360
  "failed_count": failed,
305
361
  "skipped_count": other,
306
362
  "error_count": 0,
363
+ "warning_count": 0,
307
364
  }
308
365
 
366
+ return report_data, findings
367
+
309
368
  @staticmethod
310
369
  def _empty_report_data() -> Dict:
311
370
  return {
@@ -313,8 +372,81 @@ class OPAScanner(ScannerPort):
313
372
  "failed_count": 0,
314
373
  "skipped_count": 0,
315
374
  "error_count": 0,
375
+ "warning_count": 0,
316
376
  }
317
377
 
378
+ def _generate_html_report(
379
+ self, report_dir: str, report_data: Dict, findings: List[Dict], tool_name: str
380
+ ) -> None:
381
+ """Generate HTML report in unified ThothCTL style (matches KICS/TF-compliance)."""
382
+ from datetime import datetime
383
+
384
+ html_dir = os.path.join(report_dir, "html_reports")
385
+ os.makedirs(html_dir, exist_ok=True)
386
+
387
+ passed = report_data.get("passed_count", 0)
388
+ failed = report_data.get("failed_count", 0)
389
+ warnings = report_data.get("warning_count", 0)
390
+ total = passed + failed + warnings
391
+ rate = round(passed / total * 100, 1) if total > 0 else 100.0
392
+
393
+ # Build findings table rows
394
+ rows = ""
395
+ for f in findings:
396
+ sev = f.get("severity", "MEDIUM").lower()
397
+ ns = f.get("namespace", "")
398
+ ns_badge = f' <span class="ns">{ns}</span>' if ns else ""
399
+ rows += f"""<tr>
400
+ <td><span class="sev {sev}">{f.get('severity', '')}</span></td>
401
+ <td><code>{f.get('id', '')}</code></td>
402
+ <td>{f.get('title', '')}{ns_badge}</td>
403
+ <td>{f.get('file', '')}{(':' + str(f['line'])) if f.get('line') else ''}</td>
404
+ <td>{f.get('resource', '') or '—'}</td>
405
+ </tr>"""
406
+
407
+ html = f"""<!DOCTYPE html><html><head><meta charset="UTF-8">
408
+ <title>{tool_name} Scan Results</title>
409
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap" rel="stylesheet">
410
+ <style>
411
+ body{{font-family:'Inter',sans-serif;margin:0;padding:20px;background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);min-height:100vh;color:#111827}}
412
+ .container{{max-width:1100px;margin:0 auto;background:white;border-radius:12px;box-shadow:0 20px 60px rgba(0,0,0,0.15);overflow:hidden}}
413
+ .header{{background:linear-gradient(135deg,#667eea,#764ba2);color:white;padding:24px}}
414
+ .header h1{{margin:0;font-size:1.5rem}} .header p{{margin:5px 0 0;opacity:0.9;font-size:0.85rem}}
415
+ .tool-badge{{background:rgba(255,255,255,0.2);padding:4px 10px;border-radius:12px;font-size:0.75rem;margin-left:8px}}
416
+ .content{{padding:24px}}
417
+ .cards{{display:flex;gap:12px;margin-bottom:20px}}
418
+ .card{{background:#f9fafb;padding:16px;border-radius:8px;text-align:center;flex:1}}
419
+ .card .val{{font-size:1.5rem;font-weight:700}} .card .lbl{{font-size:0.7rem;color:#6b7280;text-transform:uppercase}}
420
+ table{{width:100%;border-collapse:collapse;font-size:0.83rem}}
421
+ th{{background:#f3f4f6;padding:10px 12px;text-align:left;font-size:0.75rem;text-transform:uppercase;color:#6b7280}}
422
+ td{{padding:8px 12px;border-top:1px solid #e5e7eb}} tr:hover{{background:#f9fafb}}
423
+ .sev{{padding:2px 8px;border-radius:10px;font-size:0.7rem;font-weight:600}}
424
+ .sev.critical{{background:#fef2f2;color:#dc2626}} .sev.high{{background:#fef2f2;color:#ef4444}}
425
+ .sev.medium{{background:#fffbeb;color:#b45309}} .sev.low{{background:#fefce8;color:#92400e}} .sev.info{{background:#eff6ff;color:#3b82f6}}
426
+ code{{background:#f3f4f6;padding:2px 4px;border-radius:3px;font-size:0.8rem}}
427
+ .ns{{background:#eff6ff;color:#3b82f6;padding:2px 6px;border-radius:8px;font-size:0.7rem;margin-left:4px}}
428
+ .footer{{padding:16px 24px;background:#f9fafb;font-size:0.75rem;color:#9ca3af;text-align:center}}
429
+ @media print{{body{{background:white;padding:0}} .container{{box-shadow:none}}}}
430
+ </style></head><body>
431
+ <div class="container">
432
+ <div class="header"><h1>🛡️ Security Scan Results<span class="tool-badge">{tool_name}</span></h1>
433
+ <p>Scanned {datetime.now().strftime('%Y-%m-%d %H:%M')} — {failed} violation{'s' if failed != 1 else ''} found</p></div>
434
+ <div class="content">
435
+ <div class="cards">
436
+ <div class="card"><div class="val">{total}</div><div class="lbl">Total Checks</div></div>
437
+ <div class="card"><div class="val" style="color:#10b981">{passed}</div><div class="lbl">Passed</div></div>
438
+ <div class="card"><div class="val" style="color:#ef4444">{failed}</div><div class="lbl">Failed</div></div>
439
+ <div class="card"><div class="val" style="color:#f59e0b">{warnings}</div><div class="lbl">Warnings</div></div>
440
+ <div class="card"><div class="val" style="color:#667eea">{rate}%</div><div class="lbl">Success Rate</div></div>
441
+ </div>
442
+ {'<table><thead><tr><th>Severity</th><th>Rule</th><th>Policy Violation</th><th>File</th><th>Resource</th></tr></thead><tbody>' + rows + '</tbody></table>' if findings else '<p style="color:#10b981;font-weight:600">✅ All policies passed — no violations found</p>'}
443
+ </div>
444
+ <div class="footer">Generated by ThothCTL</div>
445
+ </div></body></html>"""
446
+
447
+ with open(os.path.join(html_dir, "index.html"), "w", encoding="utf-8") as f:
448
+ f.write(html)
449
+
318
450
  # ── Helpers ─────────────────────────────────────────────────────────
319
451
 
320
452
  def _resolve_policy_dir(self, base_dir: str, policy_dir: str) -> Optional[str]:
@@ -372,7 +504,6 @@ class OPAScanner(ScannerPort):
372
504
  def _clone_policy_repo(self, repo_url: str) -> Optional[str]:
373
505
  """Clone a policy Git repository to local cache. Returns path or None."""
374
506
  import hashlib
375
- import tempfile
376
507
 
377
508
  try:
378
509
  import git
@@ -0,0 +1,2 @@
1
+ """Version module."""
2
+ __version__ = "0.18.7"