thothctl 0.13.6__tar.gz → 0.14.2__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 (479) hide show
  1. {thothctl-0.13.6 → thothctl-0.14.2}/PKG-INFO +1 -1
  2. thothctl-0.14.2/docs/template_engine/github_templates.md +145 -0
  3. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/init/commands/project.py +32 -0
  4. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/azure_devops/get_azure_devops.py +1 -0
  5. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/github/get_github.py +1 -0
  6. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_template/create_template.py +4 -0
  7. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_template/github_template_loader.py +6 -1
  8. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/project/project.py +2 -0
  9. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/mcp/amazon_q_server.py +2 -1
  10. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/upgrade/upgrade_service.py +1 -1
  11. thothctl-0.14.2/src/thothctl/version.py +2 -0
  12. thothctl-0.14.2/tests/test_cdk_language_selection.py +159 -0
  13. thothctl-0.14.2/tests/test_template_url_fix.py +109 -0
  14. thothctl-0.13.6/docs/template_engine/github_templates.md +0 -88
  15. thothctl-0.13.6/src/thothctl/version.py +0 -2
  16. {thothctl-0.13.6 → thothctl-0.14.2}/.devcontainer/Dockerfile +0 -0
  17. {thothctl-0.13.6 → thothctl-0.14.2}/.devcontainer/README.md +0 -0
  18. {thothctl-0.13.6 → thothctl-0.14.2}/.devcontainer/devcontainer.json +0 -0
  19. {thothctl-0.13.6 → thothctl-0.14.2}/.github/workflows/python-publish.yml +0 -0
  20. {thothctl-0.13.6 → thothctl-0.14.2}/.gitignore +0 -0
  21. {thothctl-0.13.6 → thothctl-0.14.2}/.pre-commit-config.yaml +0 -0
  22. {thothctl-0.13.6 → thothctl-0.14.2}/.readthedocs.yaml +0 -0
  23. {thothctl-0.13.6 → thothctl-0.14.2}/AWS_PRICING_API_FINAL_REPORT.md +0 -0
  24. {thothctl-0.13.6 → thothctl-0.14.2}/AWS_PRICING_API_IMPLEMENTATION_PLAN.md +0 -0
  25. {thothctl-0.13.6 → thothctl-0.14.2}/AWS_PRICING_REFACTOR_REPORT.md +0 -0
  26. {thothctl-0.13.6 → thothctl-0.14.2}/Dockerfile +0 -0
  27. {thothctl-0.13.6 → thothctl-0.14.2}/LICENSE +0 -0
  28. {thothctl-0.13.6 → thothctl-0.14.2}/README.md +0 -0
  29. {thothctl-0.13.6 → thothctl-0.14.2}/TECHNICAL_DEBT_METRICS.md +0 -0
  30. {thothctl-0.13.6 → thothctl-0.14.2}/__init__.py +0 -0
  31. {thothctl-0.13.6 → thothctl-0.14.2}/docs/catalog/catalog-info.yaml +0 -0
  32. {thothctl-0.13.6 → thothctl-0.14.2}/docs/dashboard/README.md +0 -0
  33. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/ai-review/README.md +0 -0
  34. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/ai-review/agentcore.md +0 -0
  35. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/blast-radius.md +0 -0
  36. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/check_environment.md +0 -0
  37. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/check_iac.md +0 -0
  38. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/check_overview.md +0 -0
  39. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/check_project_iac.md +0 -0
  40. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/check_space.md +0 -0
  41. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/cost-analysis-quick-reference.md +0 -0
  42. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/cost-analysis.md +0 -0
  43. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/deps-advanced.md +0 -0
  44. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/deps.md +0 -0
  45. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/drift-detection.md +0 -0
  46. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/plan.md +0 -0
  47. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/document/document_iac.md +0 -0
  48. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/document/document_overview.md +0 -0
  49. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/document/iac.md +0 -0
  50. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/document/use_cases.md +0 -0
  51. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/generate/generate_components.md +0 -0
  52. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/generate/generate_stacks.md +0 -0
  53. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/init/init.md +0 -0
  54. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/init/init_space.md +0 -0
  55. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/inventory/CHANGELOG.md +0 -0
  56. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/inventory/frameworks/terraform.md +0 -0
  57. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/inventory/frameworks/terragrunt.md +0 -0
  58. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/inventory/iac.md +0 -0
  59. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/inventory/inventory_iac.md +0 -0
  60. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/inventory/inventory_overview.md +0 -0
  61. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/list/list_overview.md +0 -0
  62. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/list/list_projects.md +0 -0
  63. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/list/list_spaces.md +0 -0
  64. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/mcp/mcp.md +0 -0
  65. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/project/iac.md +0 -0
  66. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/project/project_cleanup.md +0 -0
  67. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/project/project_convert.md +0 -0
  68. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/project/project_overview.md +0 -0
  69. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/project/project_upgrade.md +0 -0
  70. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/project/use_cases.md +0 -0
  71. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/remove/remove_overview.md +0 -0
  72. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/remove/remove_project.md +0 -0
  73. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/remove/remove_space.md +0 -0
  74. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/scan/iac.md +0 -0
  75. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/scan/scan_iac.md +0 -0
  76. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/scan/scan_overview.md +0 -0
  77. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/scan/use_cases.md +0 -0
  78. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/upgrade/upgrade_overview.md +0 -0
  79. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/concepts.md +0 -0
  80. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/cross_platform_support.md +0 -0
  81. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/framework_architecture.md +0 -0
  82. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/infrasctructure_composition.md +0 -0
  83. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/software_architecture.md +0 -0
  84. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/space_configuration.md +0 -0
  85. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/use_cases/README.md +0 -0
  86. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/use_cases/ai_dlc.md +0 -0
  87. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/use_cases/check_command.md +0 -0
  88. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/use_cases/devsecops_quickstart.md +0 -0
  89. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/use_cases/devsecops_sdlc.md +0 -0
  90. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/use_cases/inventory_command.md +0 -0
  91. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/use_cases/platform_engineering_templates.md +0 -0
  92. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/use_cases/space_management.md +0 -0
  93. {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/use_cases/tasks/create_template.md +0 -0
  94. {thothctl-0.13.6 → thothctl-0.14.2}/docs/iac_devsecops_use_case.md +0 -0
  95. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/automate_tasks_command.png +0 -0
  96. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/commnad_init.png +0 -0
  97. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/create_component.gif +0 -0
  98. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/create_inventory.gif +0 -0
  99. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/doc_command.png +0 -0
  100. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/document_project_code.gif +0 -0
  101. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/framework/thothforge-framework.svg +0 -0
  102. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/framework/thothfr.png +0 -0
  103. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/iacpeerbot_summary.png +0 -0
  104. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/init_project.gif +0 -0
  105. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/inventory_command.png +0 -0
  106. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/notification_img.png +0 -0
  107. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/report_dependencies.png +0 -0
  108. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/report_dependencies_summary.png +0 -0
  109. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/restore_inventory_version.gif +0 -0
  110. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/reuse_project_pattern.gif +0 -0
  111. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/scan_code.gif +0 -0
  112. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/scan_command.png +0 -0
  113. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/sync_wk_command.png +0 -0
  114. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/transform_command.png +0 -0
  115. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/update_inventory_version.gif +0 -0
  116. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/validate_command.png +0 -0
  117. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/validate_environment.gif +0 -0
  118. {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/validate_project.gif +0 -0
  119. {thothctl-0.13.6 → thothctl-0.14.2}/docs/includes/abbreviations.md +0 -0
  120. {thothctl-0.13.6 → thothctl-0.14.2}/docs/index.md +0 -0
  121. {thothctl-0.13.6 → thothctl-0.14.2}/docs/installation/windows_installation.md +0 -0
  122. {thothctl-0.13.6 → thothctl-0.14.2}/docs/javascripts/tablesort.js +0 -0
  123. {thothctl-0.13.6 → thothctl-0.14.2}/docs/mcp.md +0 -0
  124. {thothctl-0.13.6 → thothctl-0.14.2}/docs/navigation.md +0 -0
  125. {thothctl-0.13.6 → thothctl-0.14.2}/docs/quick_start.md +0 -0
  126. {thothctl-0.13.6 → thothctl-0.14.2}/docs/requirements.txt +0 -0
  127. {thothctl-0.13.6 → thothctl-0.14.2}/docs/stylesheets/extra-enhanced.css +0 -0
  128. {thothctl-0.13.6 → thothctl-0.14.2}/docs/stylesheets/extra.css +0 -0
  129. {thothctl-0.13.6 → thothctl-0.14.2}/docs/telemetry.md +0 -0
  130. {thothctl-0.13.6 → thothctl-0.14.2}/docs/template_engine/template_engine.md +0 -0
  131. {thothctl-0.13.6 → thothctl-0.14.2}/docs/troubleshooting/linux_troubleshooting.md +0 -0
  132. {thothctl-0.13.6 → thothctl-0.14.2}/docs/troubleshooting/macos_troubleshooting.md +0 -0
  133. {thothctl-0.13.6 → thothctl-0.14.2}/docs/troubleshooting/troubleshooting.md +0 -0
  134. {thothctl-0.13.6 → thothctl-0.14.2}/docs/troubleshooting/windows_troubleshooting.md +0 -0
  135. {thothctl-0.13.6 → thothctl-0.14.2}/mkdocs.yaml +0 -0
  136. {thothctl-0.13.6 → thothctl-0.14.2}/pyproject.toml +0 -0
  137. {thothctl-0.13.6 → thothctl-0.14.2}/scripts/run_mcp_server.sh +0 -0
  138. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/__init__.py +0 -0
  139. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/application/__init__.py +0 -0
  140. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/autocomplete.py +0 -0
  141. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/cli.py +0 -0
  142. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/__init__.py +0 -0
  143. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/__init__.py +0 -0
  144. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/cli.py +0 -0
  145. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/__init__.py +0 -0
  146. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/analyze.py +0 -0
  147. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/apply_fix.py +0 -0
  148. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/configure.py +0 -0
  149. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/configure_decisions.py +0 -0
  150. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/decide.py +0 -0
  151. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/history.py +0 -0
  152. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/improve.py +0 -0
  153. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/orchestrate.py +0 -0
  154. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/override.py +0 -0
  155. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/report.py +0 -0
  156. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/serve.py +0 -0
  157. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/check/__init__.py +0 -0
  158. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/check/cli.py +0 -0
  159. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/check/commands/__init__.py +0 -0
  160. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/check/commands/environment.py +0 -0
  161. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/check/commands/iac.py +0 -0
  162. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/check/commands/project/__init__.py +0 -0
  163. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/check/commands/project/iac.py +0 -0
  164. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/check/commands/project.py +0 -0
  165. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/dashboard/__init__.py +0 -0
  166. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/dashboard/cli.py +0 -0
  167. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/dashboard/commands/__init__.py +0 -0
  168. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/dashboard/commands/launch.py +0 -0
  169. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/document/__init__.py +0 -0
  170. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/document/cli.py +0 -0
  171. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/document/commands/__init__.py +0 -0
  172. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/document/commands/iac.py +0 -0
  173. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/generate/__init__.py +0 -0
  174. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/generate/cli.py +0 -0
  175. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/generate/commands/__init__.py +0 -0
  176. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/generate/commands/component.py +0 -0
  177. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/generate/commands/stacks.py +0 -0
  178. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/init/__init__.py +0 -0
  179. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/init/cli.py +0 -0
  180. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/init/commands/__init__.py +0 -0
  181. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/init/commands/env.py +0 -0
  182. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/init/commands/space.py +0 -0
  183. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/inventory/__init__.py +0 -0
  184. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/inventory/cli.py +0 -0
  185. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/inventory/commands/__init__.py +0 -0
  186. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/inventory/commands/check.py +0 -0
  187. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/inventory/commands/iac.py +0 -0
  188. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/list/__init__.py +0 -0
  189. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/list/cli.py +0 -0
  190. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/list/commands/__init__.py +0 -0
  191. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/list/commands/projects.py +0 -0
  192. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/list/commands/spaces.py +0 -0
  193. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/mcp/__init__.py +0 -0
  194. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/mcp/cli.py +0 -0
  195. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/mcp/commands/__init__.py +0 -0
  196. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/mcp/commands/register.py +0 -0
  197. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/mcp/commands/server.py +0 -0
  198. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/mcp/commands/status.py +0 -0
  199. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/mcp/commands/stop.py +0 -0
  200. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/project/__init__.py +0 -0
  201. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/project/cli.py +0 -0
  202. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/project/commands/__init__.py +0 -0
  203. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/project/commands/bootstrap.py +0 -0
  204. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/project/commands/cleanup.py +0 -0
  205. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/project/commands/convert.py +0 -0
  206. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/project/commands/upgrade.py +0 -0
  207. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/remove/__init__.py +0 -0
  208. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/remove/cli.py +0 -0
  209. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/remove/project.py +0 -0
  210. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/remove/space.py +0 -0
  211. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/scan/__init__.py +0 -0
  212. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/scan/cli.py +0 -0
  213. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/scan/commands/__init__.py +0 -0
  214. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/scan/commands/iac.py +0 -0
  215. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/upgrade/cli.py +0 -0
  216. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/common/.thothcf.setup.toml +0 -0
  217. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/common/.thothcf_home.toml +0 -0
  218. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/common/.thothcf_module.toml +0 -0
  219. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/common/.thothcf_project.toml +0 -0
  220. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/common/.thothcf_template_parameters.toml +0 -0
  221. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/common/__init__.py +0 -0
  222. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/common/common.py +0 -0
  223. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/common/terragrunt/.thothcf_project.toml +0 -0
  224. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/config/__init__.py +0 -0
  225. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/config/constants.py +0 -0
  226. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/config/default_values.py +0 -0
  227. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/config/defaults.py +0 -0
  228. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/config/models.py +0 -0
  229. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/config/settings.py +0 -0
  230. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/config/template_config.py +0 -0
  231. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/config/template_configs.py +0 -0
  232. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/config/templates.py +0 -0
  233. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/config/validation.py +0 -0
  234. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/__init__.py +0 -0
  235. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/cli_ui.py +0 -0
  236. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/commands.py +0 -0
  237. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/config.py +0 -0
  238. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/__init__.py +0 -0
  239. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/azure_devops/__init__.py +0 -0
  240. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/azure_devops/pull_request_comments.py +0 -0
  241. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/github/pull_request_comments.py +0 -0
  242. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/integrate_messages_services/__init__.py +0 -0
  243. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/integrate_messages_services/microsoft_teams.py +0 -0
  244. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/integrate_messages_services/sent_message_teams.py +0 -0
  245. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/pattern_names.py +0 -0
  246. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/pr_comments/__init__.py +0 -0
  247. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/pr_comments/pr_comment_publisher.py +0 -0
  248. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/logger.py +0 -0
  249. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/telemetry.py +0 -0
  250. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/version_tools.py +0 -0
  251. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/domain/__init__.py +0 -0
  252. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/domain/interfaces/__init__.py +0 -0
  253. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/domain/models/__init__.py +0 -0
  254. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/mcp/README.md +0 -0
  255. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/mcp/__init__.py +0 -0
  256. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/mcp/server.py +0 -0
  257. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/__init__.py +0 -0
  258. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/__init__.py +0 -0
  259. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/agentcore/agentcore.json +0 -0
  260. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/ai_agent.py +0 -0
  261. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/analyzers/__init__.py +0 -0
  262. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/analyzers/code_reviewer.py +0 -0
  263. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/analyzers/context_builder.py +0 -0
  264. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/analyzers/report_analyzer.py +0 -0
  265. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/analyzers/risk_assessor.py +0 -0
  266. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/bedrock_agent_api.py +0 -0
  267. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/config/__init__.py +0 -0
  268. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/config/ai_settings.py +0 -0
  269. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/config/decision_rules.py +0 -0
  270. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/decision_engine.py +0 -0
  271. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/main.py +0 -0
  272. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/memory.py +0 -0
  273. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/orchestrator.py +0 -0
  274. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/pr_decision_publisher.py +0 -0
  275. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/providers/__init__.py +0 -0
  276. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/providers/azure_provider.py +0 -0
  277. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/providers/bedrock_agent_provider.py +0 -0
  278. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/providers/bedrock_provider.py +0 -0
  279. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/providers/ollama_provider.py +0 -0
  280. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/providers/openai_provider.py +0 -0
  281. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/safety/__init__.py +0 -0
  282. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/safety/safety_guard.py +0 -0
  283. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/utils/__init__.py +0 -0
  284. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/utils/cost_tracker.py +0 -0
  285. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/utils/fix_patterns.py +0 -0
  286. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/utils/fix_prompts.py +0 -0
  287. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/utils/formatters.py +0 -0
  288. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/utils/prompts.py +0 -0
  289. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/__init__.py +0 -0
  290. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/environment/__init__.py +0 -0
  291. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/environment/check_environment.py +0 -0
  292. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/__init__.py +0 -0
  293. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/blast_radius_service.py +0 -0
  294. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/check_origin_version.py +0 -0
  295. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/check_project_structure.py +0 -0
  296. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/__init__.py +0 -0
  297. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/cost_analyzer.py +0 -0
  298. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/models/__init__.py +0 -0
  299. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/models/cloudformation_mapper.py +0 -0
  300. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/models/cost_models.py +0 -0
  301. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/__init__.py +0 -0
  302. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/aws_pricing_client.py +0 -0
  303. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/base_pricing.py +0 -0
  304. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/__init__.py +0 -0
  305. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/apigateway_pricing.py +0 -0
  306. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/bedrock_pricing.py +0 -0
  307. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/cloudwatch_pricing.py +0 -0
  308. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/dynamodb_pricing.py +0 -0
  309. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/ebs_pricing.py +0 -0
  310. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/ec2_pricing.py +0 -0
  311. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/ecs_pricing.py +0 -0
  312. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/eip_pricing.py +0 -0
  313. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/eks_pricing.py +0 -0
  314. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/elb_pricing.py +0 -0
  315. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/free_resources_pricing.py +0 -0
  316. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/kms_pricing.py +0 -0
  317. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/lambda_pricing.py +0 -0
  318. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/msk_pricing.py +0 -0
  319. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/rds_pricing.py +0 -0
  320. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/s3_pricing.py +0 -0
  321. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/secrets_manager_pricing.py +0 -0
  322. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/vpc_pricing.py +0 -0
  323. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/unified_cost_report.py +0 -0
  324. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/drift/__init__.py +0 -0
  325. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/drift/drift_ai.py +0 -0
  326. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/drift/drift_history.py +0 -0
  327. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/drift/drift_policy.py +0 -0
  328. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/drift/drift_report.py +0 -0
  329. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/drift/drift_service.py +0 -0
  330. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/drift/models.py +0 -0
  331. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/risk_assessment.py +0 -0
  332. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/validate_project_structure.py +0 -0
  333. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/dashboard/__init__.py +0 -0
  334. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/dashboard/dashboard_service.py +0 -0
  335. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/dashboard/data_loader.py +0 -0
  336. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/document/__init__.py +0 -0
  337. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/document/create_documentation.py +0 -0
  338. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/document/files_content.py +0 -0
  339. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/document/files_scan.py +0 -0
  340. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/document/iac_documentation.py +0 -0
  341. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/document/iac_grunt_graph.py +0 -0
  342. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/document/iac_grunt_info.py +0 -0
  343. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/__init__.py +0 -0
  344. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_stacks/__init__.py +0 -0
  345. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_stacks/config_generator.py +0 -0
  346. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_stacks/remote_config_generation.py +0 -0
  347. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_stacks/stack_service.py +0 -0
  348. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_stacks/templates/terragrunt.hcl.j2 +0 -0
  349. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_template/__init__.py +0 -0
  350. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_template/config.yaml +0 -0
  351. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_template/create_code.py +0 -0
  352. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_template/create_component.py +0 -0
  353. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_template/create_component_service.py +0 -0
  354. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_template/create_stacks.py +0 -0
  355. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_template/files_content.py +0 -0
  356. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_template/project_templates.py +0 -0
  357. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/__init__.py +0 -0
  358. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/environment/__init__.py +0 -0
  359. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/environment/install_tools.py +0 -0
  360. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/project/__init__.py +0 -0
  361. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/space/__init__.py +0 -0
  362. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/space/example_space.toml +0 -0
  363. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/space/local_registry.py +0 -0
  364. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/space/space.py +0 -0
  365. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/space/space_config.py +0 -0
  366. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/space/space_service.py +0 -0
  367. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/inventory/__init__.py +0 -0
  368. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/inventory/changelog_parser.py +0 -0
  369. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/inventory/inventory_service.py +0 -0
  370. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/inventory/models.py +0 -0
  371. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/inventory/module_compatibility_service.py +0 -0
  372. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/inventory/report_service.py +0 -0
  373. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/inventory/schema_compatibility_service.py +0 -0
  374. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/inventory/terragrunt_parser.py +0 -0
  375. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/inventory/update_versions.py +0 -0
  376. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/inventory/version_service.py +0 -0
  377. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/mcp/README.md +0 -0
  378. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/mcp/__init__.py +0 -0
  379. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/mcp/example.py +0 -0
  380. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/mcp/service.py +0 -0
  381. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/mcp/simple_http_server.py +0 -0
  382. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/__init__.py +0 -0
  383. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/bootstrap/__init__.py +0 -0
  384. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/bootstrap/bootstrap_service.py +0 -0
  385. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/cleanup/__init__.py +0 -0
  386. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/cleanup/clean_project.py +0 -0
  387. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/cleanup/clean_space.py +0 -0
  388. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/convert/__init__.py +0 -0
  389. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/convert/conversion_service.py +0 -0
  390. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/convert/get_project_data.py +0 -0
  391. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/convert/post_init.py +0 -0
  392. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/convert/project_converter.py +0 -0
  393. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/convert/project_defaults.py +0 -0
  394. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/convert/set_project_parameters.py +0 -0
  395. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/create_terramate/__init__.py +0 -0
  396. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/create_terramate/create_terramate_stacks.py +0 -0
  397. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/create_terramate/detect_changes_stacks.py +0 -0
  398. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/create_terramate/manage_terramate_stacks.py +0 -0
  399. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/upgrade/__init__.py +0 -0
  400. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/__init__.py +0 -0
  401. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/compliance_review.py +0 -0
  402. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/import_reports.py +0 -0
  403. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/scan_service.py +0 -0
  404. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/scanners/__init__.py +0 -0
  405. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/scanners/checkov.py +0 -0
  406. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/scanners/kics.py +0 -0
  407. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/scanners/opa.py +0 -0
  408. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/scanners/scan_reports.py +0 -0
  409. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/scanners/scanners.py +0 -0
  410. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/scanners/terraform_compliance.py +0 -0
  411. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/scanners/tfsec.py +0 -0
  412. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/scanners/trivy.py +0 -0
  413. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/templates/reports/inventory_report.html +0 -0
  414. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/templates/reports/inventory_report.js +0 -0
  415. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/templates/unified_report_styles.css +0 -0
  416. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/__init__.py +0 -0
  417. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/banner.py +0 -0
  418. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/__init__.py +0 -0
  419. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/create_compliance_html_reports.py +0 -0
  420. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/create_html_reports.py +0 -0
  421. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/delete_directory.py +0 -0
  422. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/fix_report_styling.py +0 -0
  423. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/report_html_utils.py +0 -0
  424. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/templates/dashboard.html +0 -0
  425. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/templates/index_report.html +0 -0
  426. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/templates/individual_report.html +0 -0
  427. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/templates/simple_report.html +0 -0
  428. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/templates/unified_report_styles.css +0 -0
  429. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/templates/unified_simple_report.html +0 -0
  430. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/templates/xunit_report.html +0 -0
  431. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/crypto.py +0 -0
  432. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/manage_backend_resources/__init__.py +0 -0
  433. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/manage_backend_resources/manage_backend_resources.py +0 -0
  434. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/modules_ops/__init__.py +0 -0
  435. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/modules_ops/terraform_module_details.py +0 -0
  436. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/modules_ops/terraform_modules_fetcher.py +0 -0
  437. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/platform_utils.py +0 -0
  438. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/process_hcl/__init__.py +0 -0
  439. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/process_hcl/analyze_terraform_plan.py +0 -0
  440. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/process_hcl/graph_manager.py +0 -0
  441. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/process_hcl/graph_terragrunt_dependencies.py +0 -0
  442. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/process_hcl/process_terraform_file.py +0 -0
  443. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/process_hcl/risk_analyzing_terraform_plan.py +0 -0
  444. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/sync_workspaces/__init__.py +0 -0
  445. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/sync_workspaces/sync_terraform_workspaces.py +0 -0
  446. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/sync_workspaces/sync_terragrunt_workspaces.py +0 -0
  447. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/template_loader.py +0 -0
  448. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/thoth_colors.py +0 -0
  449. {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/wellcome_banner.py +0 -0
  450. {thothctl-0.13.6 → thothctl-0.14.2}/tests/conftest.py +0 -0
  451. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_agentcore_entrypoint.py +0 -0
  452. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_aws_pricing_client.py +0 -0
  453. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_azure_devops_pr_comments.py +0 -0
  454. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_bedrock_pricing.py +0 -0
  455. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_context_steering.py +0 -0
  456. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_cost_analyzer.py +0 -0
  457. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_cost_models.py +0 -0
  458. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_cost_pr_comments.py +0 -0
  459. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_dashboard_loading_fix.py +0 -0
  460. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_dashboard_service.py +0 -0
  461. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_drift.py +0 -0
  462. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_drift_detection.py +0 -0
  463. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_ec2_pricing.py +0 -0
  464. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_github_pr_comments.py +0 -0
  465. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_iac_cost_integration.py +0 -0
  466. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_inventory_pr_comments.py +0 -0
  467. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_kics_scanner.py +0 -0
  468. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_mermaid_edge_labels.py +0 -0
  469. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_new_cost_providers.py +0 -0
  470. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_parallel_scan.py +0 -0
  471. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_platform_utils.py +0 -0
  472. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_pr_comment_publisher.py +0 -0
  473. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_provider_source_url_fix.py +0 -0
  474. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_provider_versions.py +0 -0
  475. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_scan_pr_comments.py +0 -0
  476. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_space_command.py +0 -0
  477. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_space_config.py +0 -0
  478. {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_terragrunt_parser.py +0 -0
  479. {thothctl-0.13.6 → thothctl-0.14.2}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: thothctl
3
- Version: 0.13.6
3
+ Version: 0.14.2
4
4
  Summary: A CLI for Developer Control Plane. Accelerate your cloud IaC deployments.
5
5
  Project-URL: Homepage, https://github.com/thothforge/thothctl
6
6
  Author-email: Alejandro Velez <velez94@pm.me>
@@ -0,0 +1,145 @@
1
+ # GitHub Template Integration
2
+
3
+ ThothCTL automatically loads project templates from GitHub public repositories based on the project type. This provides standardized, up-to-date project scaffolding for different infrastructure frameworks.
4
+
5
+ ## Default Behavior
6
+
7
+ When you run `thothctl init project`, the system will:
8
+
9
+ 1. **Load from GitHub first**: Automatically clone the appropriate template repository based on project type
10
+ 2. **Fallback to local templates**: If GitHub loading fails, use local hardcoded templates
11
+ 3. **Apply template processing**: Replace placeholders and configure the project
12
+
13
+ ## Supported Project Types and Templates
14
+
15
+ ### Terraform / Terragrunt / OpenTofu
16
+
17
+ | Project Type | Default Repository |
18
+ |-------------|-------------------|
19
+ | `terragrunt` | https://github.com/thothforge/terragrunt_project_scaffold.git |
20
+ | `terraform` | https://github.com/thothforge/terraform_project_scaffold.git |
21
+ | `terraform-terragrunt` | https://github.com/thothforge/terraform_terragrunt_scaffold_project.git |
22
+ | `terraform_module` | https://github.com/thothforge/terraform_module_scaffold.git |
23
+ | `tofu` | https://github.com/thothforge/tofu_project_scaffold.git |
24
+
25
+ ### AWS CDK v2
26
+
27
+ CDK projects support language selection. When `--project-type cdkv2` is used, thothctl prompts for the programming language (or defaults to TypeScript in batch mode).
28
+
29
+ | Project Type | Language | Default Repository |
30
+ |-------------|----------|-------------------|
31
+ | `cdkv2-typescript` | TypeScript | https://github.com/thothforge/cdkv2_typescript_scaffold.git |
32
+ | `cdkv2-python` | Python | https://github.com/thothforge/cdkv2_python_scaffold.git |
33
+ | `cdkv2-java` | Java | https://github.com/thothforge/cdkv2_java_scaffold.git |
34
+ | `cdkv2-csharp` | C# | https://github.com/thothforge/cdkv2_csharp_scaffold.git |
35
+ | `cdkv2-go` | Go | https://github.com/thothforge/cdkv2_go_scaffold.git |
36
+ | `cdkv2` | Generic (defaults to TypeScript) | https://github.com/thothforge/cdkv2_typescript_scaffold.git |
37
+
38
+ All CDK scaffolds include:
39
+
40
+ - **cdk-nag** AwsSolutions pack enabled by default
41
+ - Multi-environment support via YAML configuration
42
+ - Layered stack architecture (foundation / platform / application)
43
+ - `.kiro/` steering docs, skills, and agent configuration
44
+ - Backstage catalog integration
45
+ - `#{...}#` template placeholders for thothctl processing
46
+
47
+ ## Usage Examples
48
+
49
+ ### Terraform Projects
50
+ ```bash
51
+ # Terraform + Terragrunt project
52
+ thothctl init project --project-name my-infrastructure --project-type terraform-terragrunt
53
+
54
+ # Terraform project
55
+ thothctl init project --project-name my-terraform --project-type terraform
56
+ ```
57
+
58
+ ### CDK Projects
59
+ ```bash
60
+ # Interactive — prompts for language selection
61
+ thothctl init project --project-name my-app --project-type cdkv2
62
+
63
+ # Explicit language
64
+ thothctl init project --project-name my-app --project-type cdkv2 --language typescript
65
+ thothctl init project --project-name my-api --project-type cdkv2 -l python
66
+
67
+ # Batch mode — defaults to TypeScript
68
+ thothctl init project --project-name my-app --project-type cdkv2 --batch
69
+ ```
70
+
71
+ ### Managing Template Configurations
72
+
73
+ #### List Available Templates
74
+ ```bash
75
+ # Show default GitHub templates
76
+ thothctl list templates
77
+
78
+ # Show templates from a specific space (VCS-based)
79
+ thothctl list templates --space my-space
80
+ ```
81
+
82
+ #### Set Custom Template Repository
83
+ ```bash
84
+ # Override default template for any project type
85
+ thothctl init template --project-type cdkv2-typescript --template-url https://github.com/myorg/custom-cdk-ts.git
86
+ thothctl init template --project-type terragrunt --template-url https://github.com/myorg/custom-terragrunt.git
87
+ ```
88
+
89
+ ## Configuration
90
+
91
+ Template URLs are stored in `~/.thothcf/.thothctl_templates.toml`:
92
+
93
+ ```toml
94
+ [templates]
95
+ terragrunt = "https://github.com/myorg/custom-terragrunt-template.git"
96
+ cdkv2-typescript = "https://github.com/myorg/custom-cdk-ts-template.git"
97
+ cdkv2-python = "https://github.com/myorg/custom-cdk-python-template.git"
98
+ ```
99
+
100
+ ## CDK Scaffold Structure
101
+
102
+ Each CDK scaffold follows the ThothForge enterprise pattern:
103
+
104
+ ```
105
+ project/
106
+ ├── bin/ # CDK app entry point
107
+ ├── lib/
108
+ │ ├── stacks/ # Stack definitions by domain
109
+ │ │ ├── foundation/ # VPC, IAM, S3
110
+ │ │ ├── platform/ # EKS, RDS, ElastiCache
111
+ │ │ └── application/ # Lambda, API Gateway
112
+ │ └── constructs/ # Reusable constructs
113
+ ├── app/functions/ # Lambda source code
114
+ ├── project_configs/
115
+ │ ├── environment_options.yaml # Multi-env config (#{...}# placeholders)
116
+ │ └── config-loader.* # Config loader
117
+ ├── test/ # Jest / pytest tests
118
+ ├── .thothcf.toml # ThothForge template config
119
+ ├── .kiro/ # Kiro steering, skills, agents, MCP settings
120
+ ├── .pre-commit-config.yaml
121
+ └── docs/catalog/ # Backstage integration
122
+ ```
123
+
124
+ ## Benefits
125
+
126
+ - **Always Up-to-Date**: Templates are fetched from the latest version in the repository
127
+ - **Language-Aware**: CDK projects automatically select the right scaffold per language
128
+ - **Standardized**: Consistent project structure across teams and organizations
129
+ - **Customizable**: Organizations can override default templates with their own
130
+ - **Fallback Safety**: Local templates ensure functionality even without internet access
131
+ - **Zero Configuration**: Works out of the box with sensible defaults
132
+
133
+ ## Requirements
134
+
135
+ - Internet access for GitHub template loading
136
+ - Git installed on the system
137
+ - GitPython dependency (automatically installed with thothctl)
138
+
139
+ ## Troubleshooting
140
+
141
+ If template loading fails:
142
+ 1. Check internet connectivity
143
+ 2. Verify the repository URL is accessible
144
+ 3. The system will automatically fall back to local templates
145
+ 4. Check logs with `--debug` flag for detailed error information
@@ -88,12 +88,34 @@ class ProjectInitCommand(ClickCommand):
88
88
  space: Optional[str] = None,
89
89
  batch: bool = False,
90
90
  context: str = None,
91
+ language: str = None,
91
92
  **kwargs,
92
93
  ) -> None:
93
94
  """Execute project initialization"""
94
95
  project_name = project_name.strip()
95
96
  project_path = Path(f"./{project_name}")
96
97
 
98
+ # Handle CDK language selection
99
+ if project_type == "cdkv2":
100
+ if not language:
101
+ if batch:
102
+ language = "typescript"
103
+ else:
104
+ import inquirer
105
+ from colorama import Fore
106
+ questions = [
107
+ inquirer.List(
108
+ "language",
109
+ message=f"{Fore.GREEN}Select CDK language",
110
+ choices=["typescript", "python", "java", "csharp", "go"],
111
+ default="typescript",
112
+ ),
113
+ ]
114
+ answer = inquirer.prompt(questions)
115
+ language = answer["language"] if answer else "typescript"
116
+ self.ui.print_info(f"🔤 CDK language: {language}")
117
+ project_type = f"cdkv2-{language}"
118
+
97
119
  self.ui.print_info(f"🚀 Initializing project: {project_name}")
98
120
 
99
121
  # If space is provided, show info and get VCS provider
@@ -595,4 +617,14 @@ cli = ProjectInitCommand.as_click_command(help="Initialize a new project")(
595
617
  type=click.Path(exists=True),
596
618
  default=None,
597
619
  ),
620
+ click.option(
621
+ "-l",
622
+ "--language",
623
+ default=None,
624
+ type=click.Choice(
625
+ ["typescript", "python", "java", "csharp", "go"],
626
+ case_sensitive=True,
627
+ ),
628
+ help="Programming language for CDK projects (only used with --project-type cdkv2)",
629
+ ),
598
630
  )
@@ -148,6 +148,7 @@ def clone_repo(
148
148
  repo_meta = {
149
149
  "repo_name": repository["Name"],
150
150
  "repo_url": repository["RemoteUrl"],
151
+ "template_url": repository["RemoteUrl"],
151
152
  "commit": f"{sha}".replace('"', "'"),
152
153
  "tag": tag,
153
154
  }
@@ -169,6 +169,7 @@ def clone_repo(
169
169
  repo_meta = {
170
170
  "repo_name": repository["Name"],
171
171
  "repo_url": repository["RemoteUrl"],
172
+ "template_url": repository["RemoteUrl"],
172
173
  "commit": f"{sha}".replace('"', "'"),
173
174
  "tag": tag,
174
175
  }
@@ -38,6 +38,8 @@ def init_thothcf_content(project_type="terraform-terragrunt"):
38
38
  template = thothcf_toml_module_content
39
39
  elif project_type in ["terragrunt", "terraform-terragrunt"]:
40
40
  template = thothcf_toml_content # Use same content as terraform for now
41
+ elif project_type.startswith("cdkv2"):
42
+ template = thothcf_toml_content # Use same content as terraform for now
41
43
  else:
42
44
  logging.error(f"Project type {project_type} not supported")
43
45
  raise ValueError(f"Project type {project_type} not supported")
@@ -100,6 +102,8 @@ def create_project(
100
102
  elif project_type == "terraform-module":
101
103
  template = terraform_module_template
102
104
  elif project_type in ["terragrunt", "terraform-terragrunt"]:
105
+ template = thothcf_toml_content # Use same content as terraform for now
106
+ elif project_type.startswith("cdkv2"):
103
107
  template = terragrunt_template
104
108
  else:
105
109
  template = terraform_template # Default fallback
@@ -23,7 +23,12 @@ class GitHubTemplateLoader:
23
23
  "terraform": "https://github.com/thothforge/terraform_project_scaffold.git",
24
24
  "terraform-module": "https://github.com/thothforge/terraform_module_scaffold.git",
25
25
  "tofu": "https://github.com/thothforge/tofu_project_scaffold.git",
26
- "cdkv2": "https://github.com/thothforge/cdkv2_project_scaffold.git",
26
+ "cdkv2": "https://github.com/thothforge/cdkv2_typescript_scaffold.git",
27
+ "cdkv2-typescript": "https://github.com/thothforge/cdkv2_typescript_scaffold.git",
28
+ "cdkv2-python": "https://github.com/thothforge/cdkv2_python_scaffold.git",
29
+ "cdkv2-java": "https://github.com/thothforge/cdkv2_java_scaffold.git",
30
+ "cdkv2-csharp": "https://github.com/thothforge/cdkv2_csharp_scaffold.git",
31
+ "cdkv2-go": "https://github.com/thothforge/cdkv2_go_scaffold.git",
27
32
  }
28
33
 
29
34
  def __init__(self, logger=None):
@@ -268,6 +268,7 @@ class ProjectService:
268
268
  repo_meta = {
269
269
  "repo_name": selected_template["repo_name"],
270
270
  "repo_url": clean_url,
271
+ "template_url": clean_url,
271
272
  "commit": f"{sha}".replace('"', "'"),
272
273
  "tag": tag if tag else "",
273
274
  }
@@ -443,6 +444,7 @@ class ProjectService:
443
444
  repo_meta = {
444
445
  "repo_name": selected_template["repo_name"],
445
446
  "repo_url": clean_url,
447
+ "template_url": clean_url,
446
448
  "commit": f"{sha}".replace('"', "'"),
447
449
  "tag": tag if tag else "",
448
450
  }
@@ -68,7 +68,8 @@ async def serve_amazon_q():
68
68
  "properties": {
69
69
  "project_name": {"type": "string", "description": "Name of the project"},
70
70
  "project_type": {"type": "string", "description": "Type of project", "default": "terraform-terragrunt", "enum": ["terraform", "terraform-terragrunt", "tofu", "cdkv2", "terraform_module", "terragrunt", "custom"]},
71
- "space": {"type": "string", "description": "Space name (optional)"}
71
+ "space": {"type": "string", "description": "Space name (optional)"},
72
+ "language": {"type": "string", "description": "CDK language (only for cdkv2)", "enum": ["typescript", "python", "java", "csharp", "go"]}
72
73
  },
73
74
  "required": ["project_name"],
74
75
  "additionalProperties": False
@@ -47,7 +47,7 @@ class ProjectUpgradeService:
47
47
  return {"success": False, "error": "No project metadata found in .thothcf.toml"}
48
48
 
49
49
  # Get remote template info
50
- template_url = metadata.get("template_url")
50
+ template_url = metadata.get("template_url") or metadata.get("repo_url")
51
51
  if not template_url:
52
52
  return {"success": False, "error": "No template_url found in project metadata"}
53
53
 
@@ -0,0 +1,2 @@
1
+ """Version module."""
2
+ __version__ = "0.14.2"
@@ -0,0 +1,159 @@
1
+ """Unit tests for CDK language selection in project init workflow."""
2
+
3
+ import pytest
4
+ from pathlib import Path
5
+ from unittest.mock import MagicMock, patch
6
+
7
+ from thothctl.services.generate.create_template.github_template_loader import GitHubTemplateLoader
8
+
9
+
10
+ class TestGitHubTemplateLoaderCdkLanguages:
11
+ """Test that CDK language variants are registered in the template loader."""
12
+
13
+ def test_cdkv2_generic_template_exists(self):
14
+ loader = GitHubTemplateLoader()
15
+ assert "cdkv2" in loader.DEFAULT_TEMPLATES
16
+
17
+ @pytest.mark.parametrize("language", ["typescript", "python", "java", "csharp", "go"])
18
+ def test_cdkv2_language_template_exists(self, language):
19
+ loader = GitHubTemplateLoader()
20
+ key = f"cdkv2-{language}"
21
+ assert key in loader.DEFAULT_TEMPLATES
22
+ assert "thothforge" in loader.DEFAULT_TEMPLATES[key]
23
+ assert language in loader.DEFAULT_TEMPLATES[key]
24
+
25
+ def test_cdkv2_language_urls_are_unique(self):
26
+ loader = GitHubTemplateLoader()
27
+ cdk_urls = [v for k, v in loader.DEFAULT_TEMPLATES.items() if k.startswith("cdkv2-")]
28
+ assert len(cdk_urls) == len(set(cdk_urls))
29
+
30
+ def test_is_template_available_for_cdk_languages(self):
31
+ loader = GitHubTemplateLoader()
32
+ for lang in ["typescript", "python", "java", "csharp", "go"]:
33
+ assert loader.is_template_available(f"cdkv2-{lang}")
34
+
35
+ def test_non_existent_language_not_available(self):
36
+ loader = GitHubTemplateLoader()
37
+ assert not loader.is_template_available("cdkv2-rust")
38
+
39
+ @pytest.mark.parametrize("language", ["typescript", "python", "java", "csharp", "go"])
40
+ def test_load_template_resolves_correct_url(self, language):
41
+ """Verify load_template picks the right URL for each CDK language."""
42
+ loader = GitHubTemplateLoader()
43
+ loader.config = MagicMock()
44
+ loader.config.get_template_url.return_value = None # No user override
45
+
46
+ with patch.object(loader, '_clone_and_copy_template', return_value={"ok": True}) as mock_clone:
47
+ loader.load_template("my-app", f"cdkv2-{language}")
48
+ mock_clone.assert_called_once_with(
49
+ loader.DEFAULT_TEMPLATES[f"cdkv2-{language}"],
50
+ "my-app",
51
+ f"cdkv2-{language}",
52
+ )
53
+
54
+
55
+ class TestProjectInitCdkLanguageSelection:
56
+ """Test the CLI command handles --language flag correctly."""
57
+
58
+ def test_cli_has_language_option(self):
59
+ from thothctl.commands.init.commands.project import cli
60
+ param_names = [p.name for p in cli.params]
61
+ assert "language" in param_names
62
+
63
+ def test_language_choices(self):
64
+ from thothctl.commands.init.commands.project import cli
65
+ lang_param = next(p for p in cli.params if p.name == "language")
66
+ assert hasattr(lang_param.type, "choices")
67
+ assert set(lang_param.type.choices) == {"typescript", "python", "java", "csharp", "go"}
68
+
69
+ def test_cdkv2_language_rewrite_logic(self):
70
+ """Test the core logic: cdkv2 + python → cdkv2-python."""
71
+ # Simulate what _execute does
72
+ project_type = "cdkv2"
73
+ language = "python"
74
+ if project_type == "cdkv2" and language:
75
+ project_type = f"cdkv2-{language}"
76
+ assert project_type == "cdkv2-python"
77
+
78
+ def test_cdkv2_batch_defaults_to_typescript(self):
79
+ """In batch mode without --language, cdkv2 defaults to typescript."""
80
+ project_type = "cdkv2"
81
+ language = None
82
+ batch = True
83
+ if project_type == "cdkv2":
84
+ if not language:
85
+ if batch:
86
+ language = "typescript"
87
+ project_type = f"cdkv2-{language}"
88
+ assert project_type == "cdkv2-typescript"
89
+
90
+ def test_terraform_ignores_language(self):
91
+ """Language rewrite only applies to cdkv2."""
92
+ project_type = "terraform"
93
+ language = "python"
94
+ if project_type == "cdkv2" and language:
95
+ project_type = f"cdkv2-{language}"
96
+ assert project_type == "terraform"
97
+
98
+ @pytest.mark.parametrize("language", ["typescript", "python", "java", "csharp", "go"])
99
+ def test_all_languages_produce_valid_project_type(self, language):
100
+ project_type = "cdkv2"
101
+ project_type = f"cdkv2-{language}"
102
+ loader = GitHubTemplateLoader()
103
+ assert project_type in loader.DEFAULT_TEMPLATES
104
+
105
+
106
+ class TestTemplatePlaceholdersCdk:
107
+ """Test that CDK scaffold files have correct template placeholders."""
108
+
109
+ def test_environment_yaml_has_placeholders(self):
110
+ yaml_path = Path(__file__).parent.parent.parent / \
111
+ "iac-scaffold/cdkv2_scaffold_project/project_configs/environment_options.yaml"
112
+ if not yaml_path.exists():
113
+ pytest.skip("CDK scaffold not found at expected path")
114
+ content = yaml_path.read_text()
115
+ assert "#{project_name}#" in content
116
+ assert "#{deployment_region}#" in content
117
+ assert "#{owner}#" in content
118
+
119
+ def test_catalog_yaml_has_placeholders(self):
120
+ catalog_path = Path(__file__).parent.parent.parent / \
121
+ "iac-scaffold/cdkv2_scaffold_project/docs/catalog/catalog-info.yaml"
122
+ if not catalog_path.exists():
123
+ pytest.skip("CDK scaffold not found at expected path")
124
+ content = catalog_path.read_text()
125
+ assert "#{project_name}#" in content
126
+ assert "#{owner}#" in content
127
+
128
+ def test_typescript_files_have_no_placeholders(self):
129
+ """TS files should NOT have #{...}# — config is externalized to YAML."""
130
+ lib_path = Path(__file__).parent.parent.parent / \
131
+ "iac-scaffold/cdkv2_scaffold_project/lib"
132
+ if not lib_path.exists():
133
+ pytest.skip("CDK scaffold not found at expected path")
134
+ for ts_file in lib_path.rglob("*.ts"):
135
+ content = ts_file.read_text()
136
+ assert "#{" not in content, f"Found placeholder in TS file: {ts_file}"
137
+
138
+ def test_thothcf_toml_keys_match_placeholders(self):
139
+ """All #{...}# placeholders in scaffold files must have a matching .thothcf.toml key."""
140
+ import re
141
+ base = Path(__file__).parent.parent.parent / "iac-scaffold/cdkv2_scaffold_project"
142
+ if not base.exists():
143
+ pytest.skip("CDK scaffold not found")
144
+
145
+ toml_content = (base / ".thothcf.toml").read_text()
146
+ toml_keys = set(re.findall(r'\[template_input_parameters\.(\w+)\]', toml_content))
147
+
148
+ # Collect all placeholders from scaffold files
149
+ placeholders = set()
150
+ for f in base.rglob("*"):
151
+ if f.is_file() and f.suffix in (".yaml", ".yml", ".md") and ".git" not in str(f):
152
+ try:
153
+ content = f.read_text()
154
+ placeholders.update(re.findall(r'#\{(\w+)\}#', content))
155
+ except UnicodeDecodeError:
156
+ pass
157
+
158
+ missing = placeholders - toml_keys
159
+ assert not missing, f"Placeholders {missing} have no matching .thothcf.toml key"
@@ -0,0 +1,109 @@
1
+ """Unit tests for template_url fix in upgrade service and metadata creation."""
2
+
3
+ import pytest
4
+ from pathlib import Path
5
+ from unittest.mock import patch, MagicMock
6
+ import toml
7
+
8
+ from thothctl.services.project.upgrade.upgrade_service import ProjectUpgradeService
9
+
10
+
11
+ @pytest.fixture
12
+ def upgrade_service():
13
+ return ProjectUpgradeService()
14
+
15
+
16
+ @pytest.fixture
17
+ def project_with_metadata(tmp_path):
18
+ """Create a project dir with .thothcf.toml containing origin_metadata."""
19
+ def _create(metadata: dict):
20
+ toml_path = tmp_path / ".thothcf.toml"
21
+ toml_path.write_text(toml.dumps({"origin_metadata": metadata}))
22
+ return tmp_path
23
+ return _create
24
+
25
+
26
+ class TestUpgradeServiceTemplateUrl:
27
+ """Test that upgrade service resolves template_url from metadata correctly."""
28
+
29
+ def test_reads_template_url_when_present(self, upgrade_service, project_with_metadata):
30
+ """upgrade should use template_url if it exists."""
31
+ project_path = project_with_metadata({
32
+ "repo_name": "my-template",
33
+ "repo_url": "https://dev.azure.com/org/proj/_git/my-template",
34
+ "template_url": "https://dev.azure.com/org/proj/_git/my-template",
35
+ "commit": "abc123",
36
+ "tag": "v1.0.0",
37
+ })
38
+
39
+ with patch.object(upgrade_service, '_clone_template', side_effect=Exception("stop")):
40
+ result = upgrade_service.upgrade_project(project_path)
41
+
42
+ # It should have attempted to clone (meaning template_url was found)
43
+ assert result["error"] != "No template_url found in project metadata"
44
+
45
+ def test_falls_back_to_repo_url(self, upgrade_service, project_with_metadata):
46
+ """upgrade should fall back to repo_url when template_url is missing."""
47
+ project_path = project_with_metadata({
48
+ "repo_name": "terraform_azdo_mangement_blueprint",
49
+ "repo_url": "https://dev.azure.com/GFT-SE/KE-054129-001/_git/terraform_azdo_mangement_blueprint",
50
+ "commit": "cb29795b95f4ac476baf3955561ab1999b1eb4ae",
51
+ "tag": "",
52
+ })
53
+
54
+ with patch.object(upgrade_service, '_clone_template', side_effect=Exception("stop")):
55
+ result = upgrade_service.upgrade_project(project_path)
56
+
57
+ # Should NOT fail with "No template_url found"
58
+ assert "No template_url found" not in result.get("error", "")
59
+
60
+ def test_fails_when_neither_url_present(self, upgrade_service, project_with_metadata):
61
+ """upgrade should fail if neither template_url nor repo_url exists."""
62
+ project_path = project_with_metadata({
63
+ "repo_name": "some-repo",
64
+ "commit": "abc123",
65
+ "tag": "",
66
+ })
67
+
68
+ result = upgrade_service.upgrade_project(project_path)
69
+
70
+ assert result["success"] is False
71
+ assert "No template_url found" in result["error"]
72
+
73
+ def test_no_metadata_file(self, upgrade_service, tmp_path):
74
+ """upgrade should fail gracefully if .thothcf.toml doesn't exist."""
75
+ result = upgrade_service.upgrade_project(tmp_path)
76
+
77
+ assert result["success"] is False
78
+ assert "No project metadata found" in result["error"]
79
+
80
+
81
+ class TestRepoMetaIncludesTemplateUrl:
82
+ """Test that init paths include template_url in repo_meta."""
83
+
84
+ def test_azure_clone_repo_includes_template_url(self):
85
+ """clone_repo in get_azure_devops should include template_url."""
86
+ from unittest.mock import patch, MagicMock
87
+ import thothctl.core.integrations.azure_devops.get_azure_devops as azdo
88
+
89
+ mock_repo = MagicMock()
90
+ mock_repo.tags = []
91
+ mock_repo.rev_parse.return_value = MagicMock(hexsha="abc123")
92
+
93
+ fake_repos = [{"Name": "my-template", "RemoteUrl": "https://dev.azure.com/org/proj/_git/my-template"}]
94
+
95
+ with patch.object(azdo, 'get_repos_patterns', return_value=fake_repos), \
96
+ patch.object(azdo.inquirer, 'prompt', return_value={"repository": "my-template"}), \
97
+ patch.object(azdo.git.Repo, 'clone_from', return_value=mock_repo), \
98
+ patch.object(azdo.git.Repo, 'init'), \
99
+ patch.object(azdo.shutil, 'rmtree'), \
100
+ patch.object(azdo.os.path, 'join', return_value="/tmp/.git"):
101
+
102
+ result = azdo.clone_repo(
103
+ git_client=MagicMock(),
104
+ project_name="proj",
105
+ path="/tmp/test",
106
+ )
107
+
108
+ assert "template_url" in result
109
+ assert result["template_url"] == result["repo_url"]
@@ -1,88 +0,0 @@
1
- # GitHub Template Integration
2
-
3
- ThothCTL now automatically loads project templates from GitHub public repositories based on the project type. This provides standardized, up-to-date project scaffolding for different infrastructure frameworks.
4
-
5
- ## Default Behavior
6
-
7
- When you run `thothctl init project`, the system will:
8
-
9
- 1. **Load from GitHub first**: Automatically clone the appropriate template repository based on project type
10
- 2. **Fallback to local templates**: If GitHub loading fails, use local hardcoded templates
11
- 3. **Apply template processing**: Replace placeholders and configure the project
12
-
13
- ## Supported Project Types and Templates
14
-
15
- | Project Type | Default Repository |
16
- |-------------|-------------------|
17
- | `terragrunt` | https://github.com/thothforge/terragrunt_project_scaffold.git |
18
- | `terraform` | https://github.com/thothforge/terraform_project_scaffold.git |
19
- | `terraform_module` | https://github.com/thothforge/terraform_module_scaffold.git |
20
- | `tofu` | https://github.com/thothforge/tofu_project_scaffold.git |
21
- | `cdkv2` | https://github.com/thothforge/cdkv2_project_scaffold.git |
22
-
23
- ## Usage Examples
24
-
25
- ### Basic Project Creation
26
- ```bash
27
- # Creates a terragrunt project using the GitHub template
28
- thothctl init project --project-name my-infrastructure --project-type terragrunt
29
-
30
- # Creates a terraform project using the GitHub template
31
- thothctl init project --project-name my-terraform --project-type terraform
32
- ```
33
-
34
- ### Managing Template Configurations
35
-
36
- #### List Available Templates
37
- ```bash
38
- # Show default GitHub templates
39
- thothctl list templates
40
-
41
- # Show templates from a specific space (VCS-based)
42
- thothctl list templates --space my-space
43
-
44
- # Show both default and VCS templates
45
- thothctl list templates --space my-space --defaults
46
- ```
47
-
48
- #### Set Custom Template Repository
49
- ```bash
50
- thothctl init template --project-type terragrunt --template-url https://github.com/myorg/custom-terragrunt-template.git
51
- ```
52
-
53
- #### View Current Template URL
54
- ```bash
55
- thothctl init template --project-type terragrunt
56
- ```
57
-
58
- ## Configuration
59
-
60
- Template URLs are stored in `~/.thothcf/.thothctl_templates.toml`:
61
-
62
- ```toml
63
- [templates]
64
- terragrunt = "https://github.com/myorg/custom-terragrunt-template.git"
65
- terraform = "https://github.com/myorg/custom-terraform-template.git"
66
- ```
67
-
68
- ## Benefits
69
-
70
- - **Always Up-to-Date**: Templates are fetched from the latest version in the repository
71
- - **Standardized**: Consistent project structure across teams and organizations
72
- - **Customizable**: Organizations can override default templates with their own
73
- - **Fallback Safety**: Local templates ensure functionality even without internet access
74
- - **Zero Configuration**: Works out of the box with sensible defaults
75
-
76
- ## Requirements
77
-
78
- - Internet access for GitHub template loading
79
- - Git installed on the system
80
- - GitPython dependency (automatically installed with thothctl)
81
-
82
- ## Troubleshooting
83
-
84
- If template loading fails:
85
- 1. Check internet connectivity
86
- 2. Verify the repository URL is accessible
87
- 3. The system will automatically fall back to local templates
88
- 4. Check logs with `--debug` flag for detailed error information
@@ -1,2 +0,0 @@
1
- """Version module."""
2
- __version__ = "0.13.6"