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.
- {thothctl-0.13.6 → thothctl-0.14.2}/PKG-INFO +1 -1
- thothctl-0.14.2/docs/template_engine/github_templates.md +145 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/init/commands/project.py +32 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/azure_devops/get_azure_devops.py +1 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/github/get_github.py +1 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_template/create_template.py +4 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_template/github_template_loader.py +6 -1
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/project/project.py +2 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/mcp/amazon_q_server.py +2 -1
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/upgrade/upgrade_service.py +1 -1
- thothctl-0.14.2/src/thothctl/version.py +2 -0
- thothctl-0.14.2/tests/test_cdk_language_selection.py +159 -0
- thothctl-0.14.2/tests/test_template_url_fix.py +109 -0
- thothctl-0.13.6/docs/template_engine/github_templates.md +0 -88
- thothctl-0.13.6/src/thothctl/version.py +0 -2
- {thothctl-0.13.6 → thothctl-0.14.2}/.devcontainer/Dockerfile +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/.devcontainer/README.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/.devcontainer/devcontainer.json +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/.github/workflows/python-publish.yml +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/.gitignore +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/.pre-commit-config.yaml +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/.readthedocs.yaml +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/AWS_PRICING_API_FINAL_REPORT.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/AWS_PRICING_API_IMPLEMENTATION_PLAN.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/AWS_PRICING_REFACTOR_REPORT.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/Dockerfile +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/LICENSE +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/README.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/TECHNICAL_DEBT_METRICS.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/catalog/catalog-info.yaml +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/dashboard/README.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/ai-review/README.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/ai-review/agentcore.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/blast-radius.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/check_environment.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/check_iac.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/check_overview.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/check_project_iac.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/check_space.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/cost-analysis-quick-reference.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/cost-analysis.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/deps-advanced.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/deps.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/drift-detection.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/check/plan.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/document/document_iac.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/document/document_overview.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/document/iac.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/document/use_cases.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/generate/generate_components.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/generate/generate_stacks.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/init/init.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/init/init_space.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/inventory/CHANGELOG.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/inventory/frameworks/terraform.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/inventory/frameworks/terragrunt.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/inventory/iac.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/inventory/inventory_iac.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/inventory/inventory_overview.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/list/list_overview.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/list/list_projects.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/list/list_spaces.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/mcp/mcp.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/project/iac.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/project/project_cleanup.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/project/project_convert.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/project/project_overview.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/project/project_upgrade.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/project/use_cases.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/remove/remove_overview.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/remove/remove_project.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/remove/remove_space.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/scan/iac.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/scan/scan_iac.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/scan/scan_overview.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/scan/use_cases.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/commands/upgrade/upgrade_overview.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/concepts.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/cross_platform_support.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/framework_architecture.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/infrasctructure_composition.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/software_architecture.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/space_configuration.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/use_cases/README.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/use_cases/ai_dlc.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/use_cases/check_command.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/use_cases/devsecops_quickstart.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/use_cases/devsecops_sdlc.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/use_cases/inventory_command.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/use_cases/platform_engineering_templates.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/use_cases/space_management.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/framework/use_cases/tasks/create_template.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/iac_devsecops_use_case.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/automate_tasks_command.png +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/commnad_init.png +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/create_component.gif +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/create_inventory.gif +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/doc_command.png +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/document_project_code.gif +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/framework/thothforge-framework.svg +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/framework/thothfr.png +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/iacpeerbot_summary.png +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/init_project.gif +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/inventory_command.png +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/notification_img.png +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/report_dependencies.png +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/report_dependencies_summary.png +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/restore_inventory_version.gif +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/reuse_project_pattern.gif +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/scan_code.gif +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/scan_command.png +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/sync_wk_command.png +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/transform_command.png +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/update_inventory_version.gif +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/validate_command.png +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/validate_environment.gif +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/img/validate_project.gif +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/includes/abbreviations.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/index.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/installation/windows_installation.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/javascripts/tablesort.js +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/mcp.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/navigation.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/quick_start.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/requirements.txt +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/stylesheets/extra-enhanced.css +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/stylesheets/extra.css +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/telemetry.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/template_engine/template_engine.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/troubleshooting/linux_troubleshooting.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/troubleshooting/macos_troubleshooting.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/troubleshooting/troubleshooting.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/docs/troubleshooting/windows_troubleshooting.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/mkdocs.yaml +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/pyproject.toml +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/scripts/run_mcp_server.sh +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/application/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/autocomplete.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/cli.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/cli.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/analyze.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/apply_fix.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/configure.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/configure_decisions.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/decide.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/history.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/improve.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/orchestrate.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/override.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/report.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/ai_review/commands/serve.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/check/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/check/cli.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/check/commands/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/check/commands/environment.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/check/commands/iac.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/check/commands/project/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/check/commands/project/iac.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/check/commands/project.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/dashboard/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/dashboard/cli.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/dashboard/commands/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/dashboard/commands/launch.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/document/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/document/cli.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/document/commands/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/document/commands/iac.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/generate/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/generate/cli.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/generate/commands/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/generate/commands/component.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/generate/commands/stacks.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/init/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/init/cli.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/init/commands/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/init/commands/env.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/init/commands/space.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/inventory/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/inventory/cli.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/inventory/commands/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/inventory/commands/check.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/inventory/commands/iac.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/list/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/list/cli.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/list/commands/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/list/commands/projects.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/list/commands/spaces.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/mcp/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/mcp/cli.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/mcp/commands/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/mcp/commands/register.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/mcp/commands/server.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/mcp/commands/status.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/mcp/commands/stop.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/project/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/project/cli.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/project/commands/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/project/commands/bootstrap.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/project/commands/cleanup.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/project/commands/convert.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/project/commands/upgrade.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/remove/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/remove/cli.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/remove/project.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/remove/space.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/scan/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/scan/cli.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/scan/commands/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/scan/commands/iac.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/commands/upgrade/cli.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/common/.thothcf.setup.toml +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/common/.thothcf_home.toml +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/common/.thothcf_module.toml +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/common/.thothcf_project.toml +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/common/.thothcf_template_parameters.toml +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/common/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/common/common.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/common/terragrunt/.thothcf_project.toml +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/config/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/config/constants.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/config/default_values.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/config/defaults.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/config/models.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/config/settings.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/config/template_config.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/config/template_configs.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/config/templates.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/config/validation.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/cli_ui.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/commands.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/config.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/azure_devops/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/azure_devops/pull_request_comments.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/github/pull_request_comments.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/integrate_messages_services/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/integrate_messages_services/microsoft_teams.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/integrate_messages_services/sent_message_teams.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/pattern_names.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/pr_comments/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/integrations/pr_comments/pr_comment_publisher.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/logger.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/telemetry.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/core/version_tools.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/domain/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/domain/interfaces/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/domain/models/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/mcp/README.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/mcp/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/mcp/server.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/agentcore/agentcore.json +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/ai_agent.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/analyzers/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/analyzers/code_reviewer.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/analyzers/context_builder.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/analyzers/report_analyzer.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/analyzers/risk_assessor.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/bedrock_agent_api.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/config/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/config/ai_settings.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/config/decision_rules.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/decision_engine.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/main.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/memory.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/orchestrator.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/pr_decision_publisher.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/providers/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/providers/azure_provider.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/providers/bedrock_agent_provider.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/providers/bedrock_provider.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/providers/ollama_provider.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/providers/openai_provider.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/safety/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/safety/safety_guard.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/utils/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/utils/cost_tracker.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/utils/fix_patterns.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/utils/fix_prompts.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/utils/formatters.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/ai_review/utils/prompts.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/environment/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/environment/check_environment.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/blast_radius_service.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/check_origin_version.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/check_project_structure.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/cost_analyzer.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/models/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/models/cloudformation_mapper.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/models/cost_models.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/aws_pricing_client.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/base_pricing.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/apigateway_pricing.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/bedrock_pricing.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/cloudwatch_pricing.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/dynamodb_pricing.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/ebs_pricing.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/ec2_pricing.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/ecs_pricing.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/eip_pricing.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/eks_pricing.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/elb_pricing.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/free_resources_pricing.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/kms_pricing.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/lambda_pricing.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/msk_pricing.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/rds_pricing.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/s3_pricing.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/secrets_manager_pricing.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/pricing/providers/vpc_pricing.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/cost/unified_cost_report.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/drift/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/drift/drift_ai.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/drift/drift_history.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/drift/drift_policy.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/drift/drift_report.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/drift/drift_service.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/drift/models.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/risk_assessment.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/check/project/validate_project_structure.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/dashboard/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/dashboard/dashboard_service.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/dashboard/data_loader.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/document/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/document/create_documentation.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/document/files_content.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/document/files_scan.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/document/iac_documentation.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/document/iac_grunt_graph.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/document/iac_grunt_info.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_stacks/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_stacks/config_generator.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_stacks/remote_config_generation.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_stacks/stack_service.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_stacks/templates/terragrunt.hcl.j2 +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_template/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_template/config.yaml +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_template/create_code.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_template/create_component.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_template/create_component_service.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_template/create_stacks.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_template/files_content.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/generate/create_template/project_templates.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/environment/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/environment/install_tools.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/project/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/space/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/space/example_space.toml +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/space/local_registry.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/space/space.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/space/space_config.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/init/space/space_service.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/inventory/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/inventory/changelog_parser.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/inventory/inventory_service.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/inventory/models.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/inventory/module_compatibility_service.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/inventory/report_service.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/inventory/schema_compatibility_service.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/inventory/terragrunt_parser.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/inventory/update_versions.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/inventory/version_service.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/mcp/README.md +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/mcp/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/mcp/example.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/mcp/service.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/mcp/simple_http_server.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/bootstrap/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/bootstrap/bootstrap_service.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/cleanup/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/cleanup/clean_project.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/cleanup/clean_space.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/convert/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/convert/conversion_service.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/convert/get_project_data.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/convert/post_init.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/convert/project_converter.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/convert/project_defaults.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/convert/set_project_parameters.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/create_terramate/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/create_terramate/create_terramate_stacks.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/create_terramate/detect_changes_stacks.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/create_terramate/manage_terramate_stacks.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/upgrade/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/compliance_review.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/import_reports.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/scan_service.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/scanners/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/scanners/checkov.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/scanners/kics.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/scanners/opa.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/scanners/scan_reports.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/scanners/scanners.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/scanners/terraform_compliance.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/scanners/tfsec.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/scan/scanners/trivy.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/templates/reports/inventory_report.html +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/templates/reports/inventory_report.js +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/templates/unified_report_styles.css +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/banner.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/create_compliance_html_reports.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/create_html_reports.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/delete_directory.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/fix_report_styling.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/report_html_utils.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/templates/dashboard.html +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/templates/index_report.html +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/templates/individual_report.html +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/templates/simple_report.html +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/templates/unified_report_styles.css +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/templates/unified_simple_report.html +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/common/templates/xunit_report.html +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/crypto.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/manage_backend_resources/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/manage_backend_resources/manage_backend_resources.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/modules_ops/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/modules_ops/terraform_module_details.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/modules_ops/terraform_modules_fetcher.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/platform_utils.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/process_hcl/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/process_hcl/analyze_terraform_plan.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/process_hcl/graph_manager.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/process_hcl/graph_terragrunt_dependencies.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/process_hcl/process_terraform_file.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/process_hcl/risk_analyzing_terraform_plan.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/sync_workspaces/__init__.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/sync_workspaces/sync_terraform_workspaces.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/sync_workspaces/sync_terragrunt_workspaces.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/template_loader.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/utils/thoth_colors.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/wellcome_banner.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/conftest.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_agentcore_entrypoint.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_aws_pricing_client.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_azure_devops_pr_comments.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_bedrock_pricing.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_context_steering.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_cost_analyzer.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_cost_models.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_cost_pr_comments.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_dashboard_loading_fix.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_dashboard_service.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_drift.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_drift_detection.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_ec2_pricing.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_github_pr_comments.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_iac_cost_integration.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_inventory_pr_comments.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_kics_scanner.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_mermaid_edge_labels.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_new_cost_providers.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_parallel_scan.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_platform_utils.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_pr_comment_publisher.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_provider_source_url_fix.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_provider_versions.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_scan_pr_comments.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_space_command.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_space_config.py +0 -0
- {thothctl-0.13.6 → thothctl-0.14.2}/tests/test_terragrunt_parser.py +0 -0
- {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.
|
|
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
|
)
|
|
@@ -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/
|
|
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
|
{thothctl-0.13.6 → thothctl-0.14.2}/src/thothctl/services/project/upgrade/upgrade_service.py
RENAMED
|
@@ -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,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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|