thothctl 0.26.0__tar.gz → 0.26.1__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 (573) hide show
  1. {thothctl-0.26.0 → thothctl-0.26.1}/PKG-INFO +1 -1
  2. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/generate/commands/iac.py +20 -0
  3. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/intent/composition_models.py +0 -1
  4. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/intent/intent_service.py +398 -20
  5. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/intent/project_assembler.py +80 -17
  6. thothctl-0.26.1/src/thothctl/services/generate/intent/scaffold_loader.py +317 -0
  7. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/intent/validator.py +2 -2
  8. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/version.py +1 -1
  9. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_generate_iac_validator.py +6 -6
  10. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_rules_compiler.py +4 -4
  11. {thothctl-0.26.0 → thothctl-0.26.1}/.devcontainer/Dockerfile +0 -0
  12. {thothctl-0.26.0 → thothctl-0.26.1}/.devcontainer/README.md +0 -0
  13. {thothctl-0.26.0 → thothctl-0.26.1}/.devcontainer/devcontainer.json +0 -0
  14. {thothctl-0.26.0 → thothctl-0.26.1}/.github/workflows/docs.yml +0 -0
  15. {thothctl-0.26.0 → thothctl-0.26.1}/.github/workflows/python-publish.yml +0 -0
  16. {thothctl-0.26.0 → thothctl-0.26.1}/.github/workflows/release.yml +0 -0
  17. {thothctl-0.26.0 → thothctl-0.26.1}/.gitignore +0 -0
  18. {thothctl-0.26.0 → thothctl-0.26.1}/.pre-commit-config.yaml +0 -0
  19. {thothctl-0.26.0 → thothctl-0.26.1}/.pydocstyle +0 -0
  20. {thothctl-0.26.0 → thothctl-0.26.1}/.readthedocs.yaml +0 -0
  21. {thothctl-0.26.0 → thothctl-0.26.1}/Dockerfile +0 -0
  22. {thothctl-0.26.0 → thothctl-0.26.1}/LICENSE +0 -0
  23. {thothctl-0.26.0 → thothctl-0.26.1}/README.md +0 -0
  24. {thothctl-0.26.0 → thothctl-0.26.1}/__init__.py +0 -0
  25. {thothctl-0.26.0 → thothctl-0.26.1}/docs/catalog/catalog-info.yaml +0 -0
  26. {thothctl-0.26.0 → thothctl-0.26.1}/docs/dashboard/README.md +0 -0
  27. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/ai-review/README.md +0 -0
  28. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/ai-review/agent_specifications.md +0 -0
  29. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/ai-review/agentcore.md +0 -0
  30. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/blast-radius.md +0 -0
  31. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/check_environment.md +0 -0
  32. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/check_iac.md +0 -0
  33. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/check_overview.md +0 -0
  34. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/check_project_iac.md +0 -0
  35. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/check_space.md +0 -0
  36. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/cost-analysis-quick-reference.md +0 -0
  37. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/cost-analysis.md +0 -0
  38. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/customizing_rules.md +0 -0
  39. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/deps-advanced.md +0 -0
  40. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/deps.md +0 -0
  41. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/drift-detection.md +0 -0
  42. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/plan.md +0 -0
  43. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/dashboard/dashboard_overview.md +0 -0
  44. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/document/customizing_docs.md +0 -0
  45. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/document/document_iac.md +0 -0
  46. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/document/document_overview.md +0 -0
  47. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/document/iac.md +0 -0
  48. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/document/mermaid_examples.md +0 -0
  49. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/document/mermaid_quickref.md +0 -0
  50. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/document/use_cases.md +0 -0
  51. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/generate/generate_components.md +0 -0
  52. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/generate/generate_iac.md +0 -0
  53. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/generate/generate_stacks.md +0 -0
  54. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/init/init.md +0 -0
  55. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/init/init_space.md +0 -0
  56. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/inventory/CHANGELOG.md +0 -0
  57. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/inventory/frameworks/terraform.md +0 -0
  58. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/inventory/frameworks/terragrunt.md +0 -0
  59. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/inventory/iac.md +0 -0
  60. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/inventory/inventory_iac.md +0 -0
  61. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/inventory/inventory_overview.md +0 -0
  62. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/list/list_overview.md +0 -0
  63. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/list/list_projects.md +0 -0
  64. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/list/list_spaces.md +0 -0
  65. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/mcp/mcp.md +0 -0
  66. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/project/iac.md +0 -0
  67. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/project/project_cleanup.md +0 -0
  68. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/project/project_convert.md +0 -0
  69. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/project/project_overview.md +0 -0
  70. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/project/project_upgrade.md +0 -0
  71. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/project/use_cases.md +0 -0
  72. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/remove/remove_overview.md +0 -0
  73. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/remove/remove_project.md +0 -0
  74. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/remove/remove_space.md +0 -0
  75. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/scan/iac.md +0 -0
  76. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/scan/scan_iac.md +0 -0
  77. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/scan/scan_overview.md +0 -0
  78. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/scan/use_cases.md +0 -0
  79. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/space/space_overview.md +0 -0
  80. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/upgrade/upgrade_overview.md +0 -0
  81. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/workflow/workflow_devsecops.md +0 -0
  82. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/workflow/workflow_overview.md +0 -0
  83. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/concepts.md +0 -0
  84. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/cross_platform_support.md +0 -0
  85. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/framework_architecture.md +0 -0
  86. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/infrastructure_composition.md +0 -0
  87. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/policy_as_code.md +0 -0
  88. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/roadmap_fdi.md +0 -0
  89. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/software_architecture.md +0 -0
  90. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/space_configuration.md +0 -0
  91. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/specs/phase1.9_composition_generation.md +0 -0
  92. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/specs/phase1_intent_to_iac.md +0 -0
  93. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/use_cases/README.md +0 -0
  94. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/use_cases/ai_dlc.md +0 -0
  95. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/use_cases/check_command.md +0 -0
  96. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/use_cases/devsecops_quickstart.md +0 -0
  97. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/use_cases/devsecops_sdlc.md +0 -0
  98. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/use_cases/inventory_command.md +0 -0
  99. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/use_cases/platform_engineering_templates.md +0 -0
  100. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/use_cases/space_management.md +0 -0
  101. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/use_cases/tasks/create_template.md +0 -0
  102. {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/use_cases/tasks/workflow_implementation_plan.md +0 -0
  103. {thothctl-0.26.0 → thothctl-0.26.1}/docs/img/commnad_init.png +0 -0
  104. {thothctl-0.26.0 → thothctl-0.26.1}/docs/img/framework/thothforge-framework.svg +0 -0
  105. {thothctl-0.26.0 → thothctl-0.26.1}/docs/img/framework/thothfr.png +0 -0
  106. {thothctl-0.26.0 → thothctl-0.26.1}/docs/img/icon-light.png +0 -0
  107. {thothctl-0.26.0 → thothctl-0.26.1}/docs/img/icon.png +0 -0
  108. {thothctl-0.26.0 → thothctl-0.26.1}/docs/img/init_project.gif +0 -0
  109. {thothctl-0.26.0 → thothctl-0.26.1}/docs/img/stable/scan_report_example.png +0 -0
  110. {thothctl-0.26.0 → thothctl-0.26.1}/docs/includes/abbreviations.md +0 -0
  111. {thothctl-0.26.0 → thothctl-0.26.1}/docs/index.md +0 -0
  112. {thothctl-0.26.0 → thothctl-0.26.1}/docs/installation/devcontainer_setup.md +0 -0
  113. {thothctl-0.26.0 → thothctl-0.26.1}/docs/installation/linux_installation.md +0 -0
  114. {thothctl-0.26.0 → thothctl-0.26.1}/docs/installation/windows_installation.md +0 -0
  115. {thothctl-0.26.0 → thothctl-0.26.1}/docs/javascripts/tablesort.js +0 -0
  116. {thothctl-0.26.0 → thothctl-0.26.1}/docs/mcp.md +0 -0
  117. {thothctl-0.26.0 → thothctl-0.26.1}/docs/navigation.md +0 -0
  118. {thothctl-0.26.0 → thothctl-0.26.1}/docs/quick_start.md +0 -0
  119. {thothctl-0.26.0 → thothctl-0.26.1}/docs/requirements.txt +0 -0
  120. {thothctl-0.26.0 → thothctl-0.26.1}/docs/stylesheets/extra-enhanced.css +0 -0
  121. {thothctl-0.26.0 → thothctl-0.26.1}/docs/stylesheets/extra.css +0 -0
  122. {thothctl-0.26.0 → thothctl-0.26.1}/docs/telemetry.md +0 -0
  123. {thothctl-0.26.0 → thothctl-0.26.1}/docs/template_engine/cli_commands_audit.md +0 -0
  124. {thothctl-0.26.0 → thothctl-0.26.1}/docs/template_engine/for_developers.md +0 -0
  125. {thothctl-0.26.0 → thothctl-0.26.1}/docs/template_engine/for_platform_engineers.md +0 -0
  126. {thothctl-0.26.0 → thothctl-0.26.1}/docs/template_engine/github_templates.md +0 -0
  127. {thothctl-0.26.0 → thothctl-0.26.1}/docs/template_engine/template_engine.md +0 -0
  128. {thothctl-0.26.0 → thothctl-0.26.1}/docs/toolkit_overview.md +0 -0
  129. {thothctl-0.26.0 → thothctl-0.26.1}/docs/troubleshooting/linux_troubleshooting.md +0 -0
  130. {thothctl-0.26.0 → thothctl-0.26.1}/docs/troubleshooting/macos_troubleshooting.md +0 -0
  131. {thothctl-0.26.0 → thothctl-0.26.1}/docs/troubleshooting/troubleshooting.md +0 -0
  132. {thothctl-0.26.0 → thothctl-0.26.1}/docs/troubleshooting/windows_troubleshooting.md +0 -0
  133. {thothctl-0.26.0 → thothctl-0.26.1}/mkdocs.yaml +0 -0
  134. {thothctl-0.26.0 → thothctl-0.26.1}/pyproject.toml +0 -0
  135. {thothctl-0.26.0 → thothctl-0.26.1}/scripts/check_output_consistency.py +0 -0
  136. {thothctl-0.26.0 → thothctl-0.26.1}/scripts/run_mcp_server.sh +0 -0
  137. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/__init__.py +0 -0
  138. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/application/__init__.py +0 -0
  139. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/autocomplete.py +0 -0
  140. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/cli.py +0 -0
  141. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/__init__.py +0 -0
  142. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/__init__.py +0 -0
  143. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/cli.py +0 -0
  144. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/__init__.py +0 -0
  145. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/analyze.py +0 -0
  146. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/apply_fix.py +0 -0
  147. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/configure.py +0 -0
  148. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/configure_decisions.py +0 -0
  149. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/decide.py +0 -0
  150. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/history.py +0 -0
  151. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/improve.py +0 -0
  152. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/orchestrate.py +0 -0
  153. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/override.py +0 -0
  154. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/report.py +0 -0
  155. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/serve.py +0 -0
  156. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/check/__init__.py +0 -0
  157. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/check/cli.py +0 -0
  158. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/check/commands/__init__.py +0 -0
  159. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/check/commands/config.py +0 -0
  160. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/check/commands/environment.py +0 -0
  161. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/check/commands/iac.py +0 -0
  162. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/check/commands/project/__init__.py +0 -0
  163. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/check/commands/project/iac.py +0 -0
  164. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/check/commands/project.py +0 -0
  165. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/check/commands/space.py +0 -0
  166. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/dashboard/__init__.py +0 -0
  167. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/dashboard/cli.py +0 -0
  168. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/dashboard/commands/__init__.py +0 -0
  169. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/dashboard/commands/launch.py +0 -0
  170. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/document/__init__.py +0 -0
  171. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/document/cli.py +0 -0
  172. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/document/commands/__init__.py +0 -0
  173. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/document/commands/iac.py +0 -0
  174. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/generate/__init__.py +0 -0
  175. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/generate/cli.py +0 -0
  176. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/generate/commands/__init__.py +0 -0
  177. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/generate/commands/component.py +0 -0
  178. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/generate/commands/stacks.py +0 -0
  179. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/init/__init__.py +0 -0
  180. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/init/cli.py +0 -0
  181. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/init/commands/__init__.py +0 -0
  182. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/init/commands/env.py +0 -0
  183. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/init/commands/project.py +0 -0
  184. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/init/commands/space.py +0 -0
  185. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/init/commands/template.py +0 -0
  186. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/inventory/__init__.py +0 -0
  187. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/inventory/cli.py +0 -0
  188. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/inventory/commands/__init__.py +0 -0
  189. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/inventory/commands/check.py +0 -0
  190. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/inventory/commands/iac.py +0 -0
  191. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/list/__init__.py +0 -0
  192. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/list/cli.py +0 -0
  193. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/list/commands/__init__.py +0 -0
  194. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/list/commands/projects.py +0 -0
  195. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/list/commands/spaces.py +0 -0
  196. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/list/commands/templates.py +0 -0
  197. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/mcp/__init__.py +0 -0
  198. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/mcp/cli.py +0 -0
  199. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/mcp/commands/__init__.py +0 -0
  200. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/mcp/commands/register.py +0 -0
  201. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/mcp/commands/server.py +0 -0
  202. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/mcp/commands/status.py +0 -0
  203. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/mcp/commands/stop.py +0 -0
  204. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/project/__init__.py +0 -0
  205. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/project/cli.py +0 -0
  206. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/project/commands/__init__.py +0 -0
  207. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/project/commands/bootstrap.py +0 -0
  208. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/project/commands/cleanup.py +0 -0
  209. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/project/commands/convert.py +0 -0
  210. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/project/commands/upgrade.py +0 -0
  211. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/quickstart/__init__.py +0 -0
  212. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/quickstart/cli.py +0 -0
  213. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/remove/__init__.py +0 -0
  214. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/remove/cli.py +0 -0
  215. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/remove/project.py +0 -0
  216. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/remove/space.py +0 -0
  217. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/scan/__init__.py +0 -0
  218. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/scan/cli.py +0 -0
  219. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/scan/commands/__init__.py +0 -0
  220. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/scan/commands/iac.py +0 -0
  221. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/space/__init__.py +0 -0
  222. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/space/cli.py +0 -0
  223. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/space/commands/__init__.py +0 -0
  224. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/space/commands/activate.py +0 -0
  225. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/space/commands/deactivate.py +0 -0
  226. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/space/commands/export_space.py +0 -0
  227. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/space/commands/import_space.py +0 -0
  228. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/space/commands/show.py +0 -0
  229. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/space/commands/update.py +0 -0
  230. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/upgrade/cli.py +0 -0
  231. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/workflow/__init__.py +0 -0
  232. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/workflow/cli.py +0 -0
  233. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/workflow/commands/__init__.py +0 -0
  234. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/workflow/commands/devsecops.py +0 -0
  235. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/workflow/commands/run.py +0 -0
  236. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/common/.thothcf.setup.toml +0 -0
  237. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/common/.thothcf_home.toml +0 -0
  238. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/common/.thothcf_module.toml +0 -0
  239. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/common/.thothcf_project.toml +0 -0
  240. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/common/.thothcf_template_parameters.toml +0 -0
  241. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/common/__init__.py +0 -0
  242. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/common/common.py +0 -0
  243. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/common/terragrunt/.thothcf_project.toml +0 -0
  244. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/config/__init__.py +0 -0
  245. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/config/constants.py +0 -0
  246. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/config/default_values.py +0 -0
  247. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/config/defaults.py +0 -0
  248. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/config/models.py +0 -0
  249. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/config/settings.py +0 -0
  250. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/config/template_config.py +0 -0
  251. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/config/template_configs.py +0 -0
  252. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/config/templates.py +0 -0
  253. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/config/validation.py +0 -0
  254. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/__init__.py +0 -0
  255. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/cli_ui.py +0 -0
  256. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/commands.py +0 -0
  257. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/config.py +0 -0
  258. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/__init__.py +0 -0
  259. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/azure_devops/__init__.py +0 -0
  260. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/azure_devops/get_azure_devops.py +0 -0
  261. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/azure_devops/pull_request_comments.py +0 -0
  262. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/github/get_github.py +0 -0
  263. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/github/pull_request_comments.py +0 -0
  264. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/integrate_messages_services/__init__.py +0 -0
  265. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/integrate_messages_services/microsoft_teams.py +0 -0
  266. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/integrate_messages_services/sent_message_teams.py +0 -0
  267. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/pattern_names.py +0 -0
  268. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/pr_comments/__init__.py +0 -0
  269. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/pr_comments/pr_comment_publisher.py +0 -0
  270. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/logger.py +0 -0
  271. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/telemetry.py +0 -0
  272. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/version_tools.py +0 -0
  273. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/domain/__init__.py +0 -0
  274. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/domain/interfaces/__init__.py +0 -0
  275. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/domain/models/__init__.py +0 -0
  276. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/mcp/README.md +0 -0
  277. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/mcp/__init__.py +0 -0
  278. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/mcp/server.py +0 -0
  279. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/__init__.py +0 -0
  280. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/__init__.py +0 -0
  281. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/agentcore/agentcore.json +0 -0
  282. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/ai_agent.py +0 -0
  283. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/analyzers/__init__.py +0 -0
  284. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/analyzers/code_reviewer.py +0 -0
  285. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/analyzers/context_builder.py +0 -0
  286. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/analyzers/report_analyzer.py +0 -0
  287. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/analyzers/risk_assessor.py +0 -0
  288. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/bedrock_agent_api.py +0 -0
  289. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/config/__init__.py +0 -0
  290. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/config/ai_settings.py +0 -0
  291. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/config/decision_rules.py +0 -0
  292. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/decision_engine.py +0 -0
  293. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/main.py +0 -0
  294. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/memory.py +0 -0
  295. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/orchestrator.py +0 -0
  296. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/pr_decision_publisher.py +0 -0
  297. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/providers/__init__.py +0 -0
  298. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/providers/azure_provider.py +0 -0
  299. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/providers/bedrock_agent_provider.py +0 -0
  300. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/providers/bedrock_provider.py +0 -0
  301. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/providers/ollama_provider.py +0 -0
  302. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/providers/openai_provider.py +0 -0
  303. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/safety/__init__.py +0 -0
  304. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/safety/safety_guard.py +0 -0
  305. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/strands_agent.py +0 -0
  306. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/tracing.py +0 -0
  307. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/utils/__init__.py +0 -0
  308. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/utils/cost_tracker.py +0 -0
  309. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/utils/fix_patterns.py +0 -0
  310. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/utils/fix_prompts.py +0 -0
  311. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/utils/formatters.py +0 -0
  312. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/utils/prompts.py +0 -0
  313. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/__init__.py +0 -0
  314. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/environment/__init__.py +0 -0
  315. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/environment/check_environment.py +0 -0
  316. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/org_policy_loader.py +0 -0
  317. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/__init__.py +0 -0
  318. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/blast_radius_service.py +0 -0
  319. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cfn_blast_radius_service.py +0 -0
  320. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/check_origin_version.py +0 -0
  321. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/check_project_structure.py +0 -0
  322. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/__init__.py +0 -0
  323. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/cost_analyzer.py +0 -0
  324. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/models/__init__.py +0 -0
  325. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/models/cloudformation_mapper.py +0 -0
  326. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/models/cost_models.py +0 -0
  327. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/__init__.py +0 -0
  328. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/aws_pricing_client.py +0 -0
  329. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/base_pricing.py +0 -0
  330. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/__init__.py +0 -0
  331. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/apigateway_pricing.py +0 -0
  332. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/bedrock_pricing.py +0 -0
  333. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/cloudwatch_pricing.py +0 -0
  334. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/dynamodb_pricing.py +0 -0
  335. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/ebs_pricing.py +0 -0
  336. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/ec2_pricing.py +0 -0
  337. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/ecs_pricing.py +0 -0
  338. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/eip_pricing.py +0 -0
  339. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/eks_pricing.py +0 -0
  340. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/elb_pricing.py +0 -0
  341. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/free_resources_pricing.py +0 -0
  342. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/kms_pricing.py +0 -0
  343. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/lambda_pricing.py +0 -0
  344. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/msk_pricing.py +0 -0
  345. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/rds_pricing.py +0 -0
  346. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/s3_pricing.py +0 -0
  347. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/secrets_manager_pricing.py +0 -0
  348. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/vpc_pricing.py +0 -0
  349. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/unified_cost_report.py +0 -0
  350. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/drift/__init__.py +0 -0
  351. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/drift/cfn_drift_service.py +0 -0
  352. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/drift/drift_ai.py +0 -0
  353. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/drift/drift_history.py +0 -0
  354. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/drift/drift_policy.py +0 -0
  355. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/drift/drift_report.py +0 -0
  356. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/drift/drift_service.py +0 -0
  357. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/drift/models.py +0 -0
  358. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/risk_assessment.py +0 -0
  359. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/validate_project_structure.py +0 -0
  360. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/rule_merger.py +0 -0
  361. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/rules_compiler.py +0 -0
  362. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/stack_optimizer/__init__.py +0 -0
  363. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/dashboard/__init__.py +0 -0
  364. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/dashboard/dashboard_service.py +0 -0
  365. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/dashboard/data_loader.py +0 -0
  366. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/document/__init__.py +0 -0
  367. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/document/architecture_renderer.py +0 -0
  368. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/document/create_documentation.py +0 -0
  369. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/document/files_content.py +0 -0
  370. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/document/files_scan.py +0 -0
  371. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/document/iac_documentation.py +0 -0
  372. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/document/iac_grunt_graph.py +0 -0
  373. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/document/iac_grunt_info.py +0 -0
  374. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/document/topology_generator.py +0 -0
  375. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/__init__.py +0 -0
  376. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_stacks/__init__.py +0 -0
  377. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_stacks/config_generator.py +0 -0
  378. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_stacks/remote_config_generation.py +0 -0
  379. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_stacks/stack_service.py +0 -0
  380. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_stacks/templates/terragrunt.hcl.j2 +0 -0
  381. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_stacks/terragrunt.hcl +0 -0
  382. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_template/__init__.py +0 -0
  383. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_template/config.yaml +0 -0
  384. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_template/create_code.py +0 -0
  385. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_template/create_component.py +0 -0
  386. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_template/create_component_service.py +0 -0
  387. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_template/create_stacks.py +0 -0
  388. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_template/create_template.py +0 -0
  389. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_template/files_content.py +0 -0
  390. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_template/github_template_loader.py +0 -0
  391. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_template/project_templates.py +0 -0
  392. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/intent/__init__.py +0 -0
  393. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/intent/code_generator.py +0 -0
  394. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/intent/context_builder.py +0 -0
  395. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/intent/intent_decomposer.py +0 -0
  396. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/intent/models.py +0 -0
  397. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/intent/prompts.py +0 -0
  398. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/__init__.py +0 -0
  399. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/environment/__init__.py +0 -0
  400. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/environment/install_tools.py +0 -0
  401. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/environment/prerequisite_checker.py +0 -0
  402. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/environment/tool_packs.py +0 -0
  403. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/project/__init__.py +0 -0
  404. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/project/project.py +0 -0
  405. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/space/__init__.py +0 -0
  406. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/space/example_space.toml +0 -0
  407. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/space/export_import.py +0 -0
  408. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/space/inheritance.py +0 -0
  409. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/space/space.py +0 -0
  410. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/space/terraform_module_cache.py +0 -0
  411. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/__init__.py +0 -0
  412. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/cdk_parsers.py +0 -0
  413. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/cdk_sbom_service.py +0 -0
  414. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/changelog_parser.py +0 -0
  415. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/inventory_service.py +0 -0
  416. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/models.py +0 -0
  417. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/module_compatibility_service.py +0 -0
  418. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/report_service.py +0 -0
  419. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/schema_compatibility_service.py +0 -0
  420. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/terragrunt_parser.py +0 -0
  421. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/update_versions.py +0 -0
  422. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/version_service.py +0 -0
  423. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/mcp/README.md +0 -0
  424. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/mcp/__init__.py +0 -0
  425. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/mcp/simple_http_server.py +0 -0
  426. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/mcp/stdio_server.py +0 -0
  427. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/__init__.py +0 -0
  428. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/bootstrap/__init__.py +0 -0
  429. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/bootstrap/bootstrap_service.py +0 -0
  430. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/cleanup/__init__.py +0 -0
  431. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/cleanup/clean_project.py +0 -0
  432. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/cleanup/clean_space.py +0 -0
  433. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/convert/__init__.py +0 -0
  434. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/convert/conversion_service.py +0 -0
  435. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/convert/get_project_data.py +0 -0
  436. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/convert/post_init.py +0 -0
  437. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/convert/project_converter.py +0 -0
  438. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/convert/project_defaults.py +0 -0
  439. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/convert/set_project_parameters.py +0 -0
  440. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/create_terramate/__init__.py +0 -0
  441. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/create_terramate/create_terramate_stacks.py +0 -0
  442. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/create_terramate/detect_changes_stacks.py +0 -0
  443. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/create_terramate/manage_terramate_stacks.py +0 -0
  444. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/upgrade/__init__.py +0 -0
  445. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/upgrade/upgrade_service.py +0 -0
  446. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/__init__.py +0 -0
  447. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/compliance_review.py +0 -0
  448. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/import_reports.py +0 -0
  449. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/models.py +0 -0
  450. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/report_parser.py +0 -0
  451. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/sarif_output.py +0 -0
  452. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scan_history.py +0 -0
  453. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scan_service.py +0 -0
  454. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scanners/__init__.py +0 -0
  455. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scanners/checkov.py +0 -0
  456. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scanners/kics.py +0 -0
  457. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scanners/opa.py +0 -0
  458. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scanners/scan_reports.py +0 -0
  459. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scanners/scanners.py +0 -0
  460. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scanners/terraform_compliance.py +0 -0
  461. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scanners/tfsec.py +0 -0
  462. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scanners/trivy.py +0 -0
  463. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/__init__.py +0 -0
  464. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/custom_workflow_engine.py +0 -0
  465. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/models.py +0 -0
  466. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/phases/__init__.py +0 -0
  467. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/phases/base.py +0 -0
  468. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/phases/build.py +0 -0
  469. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/phases/deploy.py +0 -0
  470. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/phases/develop.py +0 -0
  471. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/phases/monitor.py +0 -0
  472. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/phases/plan.py +0 -0
  473. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/phases/secure.py +0 -0
  474. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/phases/test.py +0 -0
  475. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/workflow_service.py +0 -0
  476. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/templates/ai_reports/pr_comment.md +0 -0
  477. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/templates/reports/inventory_report.html +0 -0
  478. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/templates/reports/inventory_report.js +0 -0
  479. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/templates/unified_report_styles.css +0 -0
  480. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/__init__.py +0 -0
  481. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/banner.py +0 -0
  482. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/__init__.py +0 -0
  483. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/create_compliance_html_reports.py +0 -0
  484. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/create_html_reports.py +0 -0
  485. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/delete_directory.py +0 -0
  486. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/fix_report_styling.py +0 -0
  487. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/render_scan_report.py +0 -0
  488. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/report_html_utils.py +0 -0
  489. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/templates/dashboard.html +0 -0
  490. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/templates/index_report.html +0 -0
  491. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/templates/individual_report.html +0 -0
  492. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/templates/simple_report.html +0 -0
  493. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/templates/unified_report_styles.css +0 -0
  494. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/templates/unified_scan_report.html +0 -0
  495. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/templates/unified_simple_report.html +0 -0
  496. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/templates/xunit_report.html +0 -0
  497. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/crypto.py +0 -0
  498. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/git_changes.py +0 -0
  499. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/manage_backend_resources/__init__.py +0 -0
  500. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/manage_backend_resources/manage_backend_resources.py +0 -0
  501. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/modules_ops/__init__.py +0 -0
  502. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/modules_ops/terraform_module_details.py +0 -0
  503. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/modules_ops/terraform_modules_fetcher.py +0 -0
  504. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/platform_utils.py +0 -0
  505. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/process_hcl/__init__.py +0 -0
  506. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/process_hcl/analyze_terraform_plan.py +0 -0
  507. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/process_hcl/graph_manager.py +0 -0
  508. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/process_hcl/graph_terragrunt_dependencies.py +0 -0
  509. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/process_hcl/process_terraform_file.py +0 -0
  510. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/process_hcl/risk_analyzing_terraform_plan.py +0 -0
  511. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/sync_workspaces/__init__.py +0 -0
  512. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/sync_workspaces/sync_terraform_workspaces.py +0 -0
  513. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/sync_workspaces/sync_terragrunt_workspaces.py +0 -0
  514. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/template_loader.py +0 -0
  515. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/thoth_colors.py +0 -0
  516. {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/wellcome_banner.py +0 -0
  517. {thothctl-0.26.0 → thothctl-0.26.1}/tests/conftest.py +0 -0
  518. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_agentcore_entrypoint.py +0 -0
  519. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_ai_apply_fix.py +0 -0
  520. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_ai_decision_engine.py +0 -0
  521. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_ai_fix_patterns.py +0 -0
  522. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_ai_memory.py +0 -0
  523. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_ai_orchestrator.py +0 -0
  524. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_ai_pr_decision.py +0 -0
  525. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_ai_safety_guard.py +0 -0
  526. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_aws_pricing_client.py +0 -0
  527. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_azure_devops_pr_comments.py +0 -0
  528. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_bedrock_pricing.py +0 -0
  529. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_cdk_inventory.py +0 -0
  530. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_cdk_language_selection.py +0 -0
  531. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_cfn_blast_radius.py +0 -0
  532. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_cfn_drift_detection.py +0 -0
  533. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_context_steering.py +0 -0
  534. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_cost_analyzer.py +0 -0
  535. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_cost_models.py +0 -0
  536. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_cost_policy_enforcement.py +0 -0
  537. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_cost_pr_comments.py +0 -0
  538. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_dashboard_loading_fix.py +0 -0
  539. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_dashboard_service.py +0 -0
  540. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_drift.py +0 -0
  541. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_drift_detection.py +0 -0
  542. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_ec2_pricing.py +0 -0
  543. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_generate_iac_codegen.py +0 -0
  544. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_generate_iac_context.py +0 -0
  545. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_generate_iac_prompts.py +0 -0
  546. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_generate_iac_service.py +0 -0
  547. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_github_pr_comments.py +0 -0
  548. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_iac_cost_integration.py +0 -0
  549. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_init_ai_tools.py +0 -0
  550. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_init_template_params.py +0 -0
  551. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_intent_quick_wins.py +0 -0
  552. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_intent_rules_integration.py +0 -0
  553. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_inventory_pr_comments.py +0 -0
  554. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_kics_scanner.py +0 -0
  555. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_mermaid_edge_labels.py +0 -0
  556. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_new_cost_providers.py +0 -0
  557. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_opa_data_files.py +0 -0
  558. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_parallel_scan.py +0 -0
  559. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_platform_utils.py +0 -0
  560. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_pr_comment_publisher.py +0 -0
  561. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_provider_source_url_fix.py +0 -0
  562. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_provider_versions.py +0 -0
  563. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_scan_cfn_support.py +0 -0
  564. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_scan_command.py +0 -0
  565. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_scan_pr_comments.py +0 -0
  566. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_space_command.py +0 -0
  567. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_space_management.py +0 -0
  568. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_stack_optimizer.py +0 -0
  569. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_template_url_fix.py +0 -0
  570. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_terragrunt_parser.py +0 -0
  571. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_topology_generator.py +0 -0
  572. {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_workflow_integration.py +0 -0
  573. {thothctl-0.26.0 → thothctl-0.26.1}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: thothctl
3
- Version: 0.26.0
3
+ Version: 0.26.1
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
@@ -111,6 +111,9 @@ class GenerateIaCCommand(ClickCommand):
111
111
 
112
112
  # Generate
113
113
  with self.ui.status_spinner("🤖 Generating infrastructure code..."):
114
+ import time
115
+
116
+ self._start_time = time.time()
114
117
  result = service.generate(
115
118
  intent=intent,
116
119
  directory=directory,
@@ -191,6 +194,23 @@ class GenerateIaCCommand(ClickCommand):
191
194
  if result.explanation:
192
195
  console.print(f"📝 {result.explanation}")
193
196
 
197
+ # Show metrics
198
+ import time
199
+
200
+ elapsed = time.time() - self._start_time if hasattr(self, "_start_time") else 0
201
+ metrics_parts = []
202
+ if result.context_tokens:
203
+ metrics_parts.append(f"context: ~{result.context_tokens} tokens")
204
+ if result.generation_tokens:
205
+ metrics_parts.append(f"generation: ~{result.generation_tokens} tokens")
206
+ if elapsed > 0:
207
+ metrics_parts.append(f"time: {elapsed:.1f}s")
208
+ if result.iterations > 1:
209
+ metrics_parts.append(f"iterations: {result.iterations}")
210
+ metrics_parts.append(f"files: {len(result.files)}")
211
+ if metrics_parts:
212
+ console.print(f"⏱️ Metrics: {' | '.join(metrics_parts)}")
213
+
194
214
  # Final guidance
195
215
  console.print("")
196
216
  if should_apply:
@@ -8,7 +8,6 @@ from collections import deque
8
8
  from dataclasses import dataclass, field
9
9
  from typing import Dict, List, Optional
10
10
 
11
-
12
11
  # Canonical layer ordering (lower index = deployed first)
13
12
  LAYER_ORDER: Dict[str, int] = {
14
13
  "foundation": 0,
@@ -424,6 +424,182 @@ class IntentToIaCService:
424
424
 
425
425
  return "\n".join(lines)
426
426
 
427
+ def _load_scaffold_example(self, project_type: str, stack) -> str:
428
+ """Load a real scaffold example as few-shot context for per-stack generation.
429
+
430
+ Fetches the official scaffold from GitHub (cached locally) and uses its
431
+ real stack files as examples the AI should follow. The scaffold IS the
432
+ source of truth for code structure.
433
+
434
+ Resolution order:
435
+ 1. Local cache (~/.thothcf/<scaffold_name>/)
436
+ 2. Auto-clone from GitHub (thothforge org) on first use
437
+ """
438
+ from pathlib import Path
439
+
440
+ # Official scaffolds per project type
441
+ scaffold_registry = {
442
+ "terraform-terragrunt": {
443
+ "name": "terraform_terragrunt_scaffold_project",
444
+ "repo": "thothforge/terraform_terragrunt_scaffold_project",
445
+ },
446
+ "terragrunt": {
447
+ "name": "terraform_terragrunt_scaffold_project",
448
+ "repo": "thothforge/terraform_terragrunt_scaffold_project",
449
+ },
450
+ "terraform": {
451
+ "name": "terraform_project_scaffold",
452
+ "repo": "thothforge/terraform_project_scaffold",
453
+ },
454
+ "cdkv2": {
455
+ "name": "cdkv2_typescript_scaffold",
456
+ "repo": "thothforge/cdkv2_typescript_scaffold",
457
+ },
458
+ }
459
+
460
+ scaffold_info = scaffold_registry.get(project_type)
461
+ if not scaffold_info:
462
+ return self._default_composition_rules()
463
+
464
+ scaffold_cache = Path.home() / ".thothcf"
465
+ scaffold_dir = scaffold_cache / scaffold_info["name"]
466
+
467
+ # Auto-fetch scaffold from GitHub if not cached
468
+ if not scaffold_dir.exists() or not list(scaffold_dir.rglob("*.tf")):
469
+ scaffold_dir = self._fetch_scaffold(scaffold_info["repo"], scaffold_dir)
470
+
471
+ example_parts = []
472
+
473
+ if scaffold_dir.exists():
474
+ # Find a matching or similar stack in the scaffold
475
+ stacks_dir = scaffold_dir / "stacks"
476
+ if stacks_dir.exists():
477
+ # Try exact match first, then same domain, then any from same layer
478
+ candidates = list(stacks_dir.rglob("main.tf"))
479
+ best_match = None
480
+
481
+ for candidate in candidates:
482
+ rel = str(candidate.relative_to(stacks_dir))
483
+ if stack.domain in rel or stack.name in rel:
484
+ best_match = candidate.parent
485
+ break
486
+
487
+ if not best_match and candidates:
488
+ # Take first example from the same layer
489
+ for candidate in candidates:
490
+ rel = str(candidate.relative_to(stacks_dir))
491
+ if stack.layer in rel:
492
+ best_match = candidate.parent
493
+ break
494
+
495
+ if best_match:
496
+ # Load the example files
497
+ for tf_file in sorted(best_match.glob("*.tf")):
498
+ content = tf_file.read_text(encoding="utf-8", errors="ignore")
499
+ if content.strip():
500
+ example_parts.append(
501
+ f"### Scaffold example: {tf_file.name}\n```hcl\n{content.strip()}\n```"
502
+ )
503
+ tg_file = best_match / "terragrunt.hcl"
504
+ if tg_file.exists():
505
+ content = tg_file.read_text(encoding="utf-8", errors="ignore")
506
+ if content.strip():
507
+ example_parts.append(
508
+ f"### Scaffold example: terragrunt.hcl\n```hcl\n{content.strip()}\n```"
509
+ )
510
+
511
+ # Always include the composition rules (whether scaffold found or not)
512
+ rules = (
513
+ "COMPOSITION RULES (from scaffold):\n"
514
+ "- Generate ONLY: main.tf, variables.tf, outputs.tf (flat paths)\n"
515
+ "- main.tf must contain ONLY resources/modules/data — "
516
+ "NO terraform{}, provider{}, or backend{} blocks\n"
517
+ "- Provider and backend are managed by root.hcl (terragrunt generates them)\n"
518
+ "- Use var.tags for tags (passed from terragrunt inputs)\n"
519
+ "- Use var.project and var.environment for naming\n"
520
+ )
521
+
522
+ if example_parts:
523
+ return (
524
+ "FOLLOW THIS SCAFFOLD PATTERN (from your org's official scaffold):\n\n"
525
+ + "\n\n".join(example_parts[:3]) # Max 3 files as example
526
+ + f"\n\n{rules}"
527
+ )
528
+ else:
529
+ return rules
530
+
531
+ @staticmethod
532
+ def _fetch_scaffold(repo: str, target_dir) -> "Path":
533
+ """Fetch official scaffold from GitHub via gh CLI (cached locally)."""
534
+ import shutil
535
+ import subprocess
536
+ from pathlib import Path
537
+
538
+ target = Path(target_dir)
539
+
540
+ if shutil.which("gh"):
541
+ try:
542
+ logger.info(f"Fetching scaffold from github.com/{repo}...")
543
+ target.parent.mkdir(parents=True, exist_ok=True)
544
+ result = subprocess.run(
545
+ ["gh", "repo", "clone", repo, str(target), "--", "--depth=1"],
546
+ capture_output=True,
547
+ text=True,
548
+ timeout=60,
549
+ )
550
+ if result.returncode == 0:
551
+ logger.info(f"Scaffold cached at {target}")
552
+ return target
553
+ else:
554
+ logger.warning(f"Failed to fetch scaffold: {result.stderr[:200]}")
555
+ except Exception as e:
556
+ logger.warning(f"Scaffold fetch failed: {e}")
557
+
558
+ return target
559
+
560
+ @staticmethod
561
+ def _default_composition_rules() -> str:
562
+ """Fallback composition rules when no scaffold is available."""
563
+ return (
564
+ "COMPOSITION RULES:\n"
565
+ "- Generate ONLY: main.tf, variables.tf, outputs.tf (flat paths)\n"
566
+ "- main.tf must contain ONLY resources/modules/data — "
567
+ "NO terraform{}, provider{}, or backend{} blocks\n"
568
+ "- Provider and backend are managed by root.hcl (terragrunt generates them)\n"
569
+ "- Use var.tags for tags (passed from terragrunt inputs)\n"
570
+ "- Use var.project and var.environment for naming\n"
571
+ )
572
+
573
+ @staticmethod
574
+ def _strip_terraform_block(content: str) -> str:
575
+ """Remove terraform {}, provider {}, and backend blocks from generated code.
576
+
577
+ In terragrunt projects, root.hcl handles provider and backend config.
578
+ Per-stack .tf files should only contain resources, data sources, and locals.
579
+ """
580
+ import re
581
+
582
+ # Remove terraform { ... } block (multi-line, handles nested braces)
583
+ content = re.sub(
584
+ r"terraform\s*\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}\s*\n?",
585
+ "",
586
+ content,
587
+ flags=re.DOTALL,
588
+ )
589
+
590
+ # Remove provider "aws" { ... } block
591
+ content = re.sub(
592
+ r'provider\s+"[^"]+"\s*\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}\s*\n?',
593
+ "",
594
+ content,
595
+ flags=re.DOTALL,
596
+ )
597
+
598
+ # Clean up excessive blank lines left behind
599
+ content = re.sub(r"\n{3,}", "\n\n", content)
600
+
601
+ return content.strip() + "\n"
602
+
427
603
  # ------------------------------------------------------------------
428
604
  # Composition generation (multi-stack)
429
605
  # ------------------------------------------------------------------
@@ -443,27 +619,41 @@ class IntentToIaCService:
443
619
  ) -> IntentResult:
444
620
  """Generate a full multi-stack project from a complex intent.
445
621
 
446
- 1. Build context
447
- 2. Decompose intent into stacks (AI call)
448
- 3. Generate code per stack (AI call per stack)
449
- 4. Assemble project structure (deterministic)
450
- 5. Validate + write
622
+ Uses scaffold-driven generation:
623
+ 1. Load scaffold structure (deterministic skeleton)
624
+ 2. Build context
625
+ 3. Decompose intent into stacks (AI call)
626
+ 4. Assemble project structure using scaffold boilerplate (deterministic)
627
+ 5. Generate code per stack using scaffold examples as context (AI per stack)
628
+ 6. Post-process: validate completeness against scaffold rules
629
+ 7. Validate + write
451
630
  """
452
- from .composition_models import CompositionPlan
453
631
  from .intent_decomposer import IntentDecomposer
454
632
  from .project_assembler import ProjectAssembler
633
+ from .scaffold_loader import ScaffoldLoader
455
634
 
456
635
  logger.info(
457
636
  f"Composition generation: '{intent[:80]}' "
458
637
  f"(type={project_type}, mode={'incremental' if incremental else 'full'})"
459
638
  )
460
639
 
461
- # Step 1: Build context
640
+ # Step 1: Load scaffold structure (deterministic skeleton)
641
+ # The scaffold defines the project skeleton — AI only fills resource content.
642
+ scaffold_loader = ScaffoldLoader(project_type=project_type)
643
+ scaffold = scaffold_loader.load()
644
+ logger.info(
645
+ f"Scaffold loaded: {scaffold.project_type} "
646
+ f"(root_files={len(scaffold.root_files)}, "
647
+ f"boilerplate={len(scaffold.boilerplate)}, "
648
+ f"examples={len(scaffold.examples)})"
649
+ )
650
+
651
+ # Step 2: Build context
462
652
  context_payload = self.context_builder.build_context(directory, project_type)
463
653
  context_text = context_payload.compile()
464
654
  resolved_type = context_payload.project_type
465
655
 
466
- # Step 2: Decompose intent into stacks
656
+ # Step 3: Decompose intent into stacks
467
657
  decomposer = IntentDecomposer(provider=self.provider, model=self.model)
468
658
  plan = decomposer.decompose(intent, resolved_type, context_text)
469
659
 
@@ -488,33 +678,50 @@ class IntentToIaCService:
488
678
  plan.needs_root_config = False
489
679
  plan.needs_common = False
490
680
 
491
- # Step 3: Assemble project structure (root.hcl, common/, terragrunt.hcl per stack)
681
+ # Step 4: Assemble project structure using scaffold boilerplate
492
682
  assembler = ProjectAssembler(project_type=resolved_type)
493
683
  structure_files = assembler.assemble(
494
- plan, target_dir, existing_project=incremental
684
+ plan, target_dir, existing_project=incremental, scaffold=scaffold
495
685
  )
496
686
 
497
- # Step 4: Generate code per stack (AI calls)
687
+ # Step 5: Generate code per stack using scaffold examples as context
498
688
  all_files = list(structure_files)
499
689
  ordered_stacks = plan.topological_order()
500
690
 
501
691
  for stack in ordered_stacks:
502
692
  logger.info(f"Generating stack: {stack.path} ({stack.intent[:50]})")
503
693
 
694
+ # Build scaffold context for this stack from loaded scaffold
695
+ scaffold_context = self._build_scaffold_context(scaffold, stack)
696
+ stack_intent = f"{stack.intent}\n\n{scaffold_context}"
697
+
504
698
  # Generate the Terraform code for this stack
505
699
  stack_generation = self.code_generator.generate(
506
- intent=stack.intent,
700
+ intent=stack_intent,
507
701
  context=context_text,
508
- project_type=resolved_type,
702
+ project_type="terraform", # Generate pure TF resources
509
703
  )
510
704
 
511
705
  if stack_generation.files:
512
706
  # Prefix file paths with stack path
707
+ # Strip any nested path from AI output — keep only filename
513
708
  for f in stack_generation.files:
514
- prefixed_path = f"{stack.path}/{f.path}"
515
- all_files.append(
516
- GeneratedFile(path=prefixed_path, content=f.content)
517
- )
709
+ # AI sometimes returns full paths or nested structures
710
+ # We only want the filename (main.tf, variables.tf, etc.)
711
+ filename = Path(f.path).name
712
+ # Skip files that aren't Terraform files
713
+ if not filename.endswith((".tf", ".tfvars", ".hcl", ".md")):
714
+ continue
715
+ # Skip if AI regenerated a terragrunt.hcl (assembler already made one)
716
+ if filename == "terragrunt.hcl":
717
+ continue
718
+ # Strip terraform/provider/backend blocks from .tf files
719
+ # (root.hcl handles these in terragrunt projects)
720
+ content = f.content
721
+ if resolved_type in ("terraform-terragrunt", "terragrunt"):
722
+ content = self._strip_terraform_block(content)
723
+ prefixed_path = f"{stack.path}/{filename}"
724
+ all_files.append(GeneratedFile(path=prefixed_path, content=content))
518
725
 
519
726
  if not all_files:
520
727
  return IntentResult(
@@ -523,7 +730,12 @@ class IntentToIaCService:
523
730
  context_tokens=context_payload.total_tokens_estimate,
524
731
  )
525
732
 
526
- # Step 5: Validate (optional)
733
+ # Step 6: Post-process — ensure completeness against scaffold rules
734
+ all_files = self._ensure_scaffold_completeness(
735
+ all_files, scaffold, ordered_stacks
736
+ )
737
+
738
+ # Step 7: Validate (optional)
527
739
  validation = ValidationResult(passed=True)
528
740
  if not skip_validation:
529
741
  org_policy_dir = self._resolve_org_policy_dir(directory)
@@ -535,12 +747,12 @@ class IntentToIaCService:
535
747
  skip_framework_validate=True, # Can't run terraform validate on partial project
536
748
  )
537
749
 
538
- # Step 6: Write to disk if --apply
750
+ # Step 8: Write to disk if --apply
539
751
  if apply and all_files:
540
752
  self._write_files(all_files, target_dir)
541
753
  logger.info(f"Project written to: {target_dir}")
542
754
 
543
- # Step 7: Generate diagram
755
+ # Step 9: Generate diagram
544
756
  diagram = None
545
757
  if include_diagram and all_files:
546
758
  resources = []
@@ -560,5 +772,171 @@ class IntentToIaCService:
560
772
  modules_used=[s.module_source for s in plan.stacks if s.module_source],
561
773
  estimated_resources=[s.name for s in plan.stacks],
562
774
  context_tokens=context_payload.total_tokens_estimate,
775
+ generation_tokens=sum(len(f.content) // 4 for f in all_files),
563
776
  diagram=diagram,
564
777
  )
778
+
779
+ # ------------------------------------------------------------------
780
+ # Scaffold-driven helpers (Tasks 3-6)
781
+ # ------------------------------------------------------------------
782
+
783
+ def _build_scaffold_context(self, scaffold, stack) -> str:
784
+ """Build scaffold context for per-stack generation from ScaffoldStructure.
785
+
786
+ Uses scaffold.examples to find the best matching few-shot pattern for
787
+ the current stack (by domain/layer/name similarity). Falls back to
788
+ composition rules if no example matches.
789
+
790
+ Args:
791
+ scaffold: ScaffoldStructure with examples and rules.
792
+ stack: StackPlan being generated.
793
+
794
+ Returns:
795
+ Prompt section with scaffold examples and rules.
796
+ """
797
+
798
+ example_parts = []
799
+
800
+ if scaffold.examples:
801
+ # Find best matching examples: prefer same domain, then same layer
802
+ scored_examples = []
803
+ for rel_path, content in scaffold.examples.items():
804
+ score = 0
805
+ path_lower = rel_path.lower()
806
+ if stack.domain and stack.domain in path_lower:
807
+ score += 3
808
+ if stack.name and stack.name in path_lower:
809
+ score += 5
810
+ if stack.layer and stack.layer in path_lower:
811
+ score += 2
812
+ scored_examples.append((score, rel_path, content))
813
+
814
+ # Sort by score descending, take top 3
815
+ scored_examples.sort(key=lambda x: x[0], reverse=True)
816
+ for _score, rel_path, content in scored_examples[:3]:
817
+ example_parts.append(
818
+ f"### Scaffold example: {rel_path}\n```hcl\n{content.strip()}\n```"
819
+ )
820
+
821
+ # Build composition rules from scaffold metadata
822
+ required_files = ", ".join(scaffold.stack_required_files) or (
823
+ "main.tf, variables.tf, outputs.tf"
824
+ )
825
+ rules = (
826
+ f"COMPOSITION RULES (from scaffold):\n"
827
+ f"- Generate ONLY these files: {required_files}\n"
828
+ f"- main.tf must contain ONLY resources/modules/data — "
829
+ f"NO terraform{{}}, provider{{}}, or backend{{}} blocks\n"
830
+ f"- Provider and backend are managed by root.hcl (terragrunt generates them)\n"
831
+ f"- Use var.tags for tags (passed from terragrunt inputs)\n"
832
+ f"- Use var.project and var.environment for naming\n"
833
+ )
834
+
835
+ if example_parts:
836
+ return (
837
+ "FOLLOW THIS SCAFFOLD PATTERN (from your org's official scaffold):\n\n"
838
+ + "\n\n".join(example_parts)
839
+ + f"\n\n{rules}"
840
+ )
841
+ else:
842
+ return rules
843
+
844
+ def _ensure_scaffold_completeness(
845
+ self, files: List[GeneratedFile], scaffold, ordered_stacks
846
+ ) -> List[GeneratedFile]:
847
+ """Ensure all stacks have the required files per scaffold rules.
848
+
849
+ If the AI missed generating a required file (e.g., outputs.tf),
850
+ add a placeholder so the project structure is complete.
851
+
852
+ Args:
853
+ files: All generated files so far.
854
+ scaffold: ScaffoldStructure with stack_required_files.
855
+ ordered_stacks: Stacks in the plan.
856
+
857
+ Returns:
858
+ Updated file list with any missing required files added.
859
+ """
860
+ if not scaffold.stack_required_files:
861
+ return files
862
+
863
+ # Build a set of existing file paths
864
+ existing_paths = {f.path for f in files}
865
+ added = []
866
+
867
+ for stack in ordered_stacks:
868
+ for required_file in scaffold.stack_required_files:
869
+ # terragrunt.hcl is handled by the assembler
870
+ if required_file == "terragrunt.hcl":
871
+ continue
872
+
873
+ expected_path = f"{stack.path}/{required_file}"
874
+ if expected_path not in existing_paths:
875
+ # Generate a minimal placeholder
876
+ placeholder = self._placeholder_for_file(
877
+ required_file, stack.name, stack.domain
878
+ )
879
+ added.append(GeneratedFile(path=expected_path, content=placeholder))
880
+ logger.info(
881
+ f"Scaffold completeness: added missing {expected_path}"
882
+ )
883
+
884
+ if added:
885
+ logger.info(
886
+ f"Post-processing added {len(added)} missing required files"
887
+ )
888
+
889
+ return files + added
890
+
891
+ @staticmethod
892
+ def _placeholder_for_file(filename: str, stack_name: str, domain: str) -> str:
893
+ """Generate a minimal placeholder for a missing required file.
894
+
895
+ Args:
896
+ filename: The required filename (e.g., "variables.tf", "outputs.tf").
897
+ stack_name: Stack name for contextual comments.
898
+ domain: Stack domain for contextual comments.
899
+
900
+ Returns:
901
+ Minimal valid HCL content for the file.
902
+ """
903
+ if filename == "variables.tf":
904
+ return (
905
+ f"# Variables for {stack_name} ({domain})\n"
906
+ f"# Generated placeholder — populate with required inputs\n\n"
907
+ f'variable "project" {{\n'
908
+ f' description = "Project name"\n'
909
+ f' type = string\n'
910
+ f"}}\n\n"
911
+ f'variable "environment" {{\n'
912
+ f' description = "Environment name"\n'
913
+ f' type = string\n'
914
+ f"}}\n\n"
915
+ f'variable "tags" {{\n'
916
+ f' description = "Common tags for all resources"\n'
917
+ f' type = map(string)\n'
918
+ f" default = {{}}\n"
919
+ f"}}\n"
920
+ )
921
+ elif filename == "outputs.tf":
922
+ return (
923
+ f"# Outputs for {stack_name} ({domain})\n"
924
+ f"# Generated placeholder — add outputs consumed by dependent stacks\n"
925
+ )
926
+ elif filename == "main.tf":
927
+ return (
928
+ f"# Main resources for {stack_name} ({domain})\n"
929
+ f"# Generated placeholder — add resource definitions\n"
930
+ )
931
+ elif filename == "README.md":
932
+ return (
933
+ f"# {stack_name}\n\n"
934
+ f"Stack for {domain} resources.\n\n"
935
+ f"## Usage\n\n"
936
+ f"```bash\n"
937
+ f"terragrunt plan\n"
938
+ f"terragrunt apply\n"
939
+ f"```\n"
940
+ )
941
+ else:
942
+ return f"# {filename} for {stack_name} ({domain})\n"