thothctl 0.26.0__tar.gz → 0.26.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {thothctl-0.26.0 → thothctl-0.26.1}/PKG-INFO +1 -1
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/generate/commands/iac.py +20 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/intent/composition_models.py +0 -1
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/intent/intent_service.py +398 -20
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/intent/project_assembler.py +80 -17
- thothctl-0.26.1/src/thothctl/services/generate/intent/scaffold_loader.py +317 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/intent/validator.py +2 -2
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/version.py +1 -1
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_generate_iac_validator.py +6 -6
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_rules_compiler.py +4 -4
- {thothctl-0.26.0 → thothctl-0.26.1}/.devcontainer/Dockerfile +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/.devcontainer/README.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/.devcontainer/devcontainer.json +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/.github/workflows/docs.yml +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/.github/workflows/python-publish.yml +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/.github/workflows/release.yml +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/.gitignore +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/.pre-commit-config.yaml +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/.pydocstyle +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/.readthedocs.yaml +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/Dockerfile +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/LICENSE +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/README.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/catalog/catalog-info.yaml +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/dashboard/README.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/ai-review/README.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/ai-review/agent_specifications.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/ai-review/agentcore.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/blast-radius.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/check_environment.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/check_iac.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/check_overview.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/check_project_iac.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/check_space.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/cost-analysis-quick-reference.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/cost-analysis.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/customizing_rules.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/deps-advanced.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/deps.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/drift-detection.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/check/plan.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/dashboard/dashboard_overview.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/document/customizing_docs.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/document/document_iac.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/document/document_overview.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/document/iac.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/document/mermaid_examples.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/document/mermaid_quickref.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/document/use_cases.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/generate/generate_components.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/generate/generate_iac.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/generate/generate_stacks.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/init/init.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/init/init_space.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/inventory/CHANGELOG.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/inventory/frameworks/terraform.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/inventory/frameworks/terragrunt.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/inventory/iac.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/inventory/inventory_iac.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/inventory/inventory_overview.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/list/list_overview.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/list/list_projects.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/list/list_spaces.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/mcp/mcp.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/project/iac.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/project/project_cleanup.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/project/project_convert.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/project/project_overview.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/project/project_upgrade.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/project/use_cases.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/remove/remove_overview.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/remove/remove_project.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/remove/remove_space.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/scan/iac.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/scan/scan_iac.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/scan/scan_overview.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/scan/use_cases.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/space/space_overview.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/upgrade/upgrade_overview.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/workflow/workflow_devsecops.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/commands/workflow/workflow_overview.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/concepts.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/cross_platform_support.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/framework_architecture.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/infrastructure_composition.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/policy_as_code.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/roadmap_fdi.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/software_architecture.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/space_configuration.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/specs/phase1.9_composition_generation.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/specs/phase1_intent_to_iac.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/use_cases/README.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/use_cases/ai_dlc.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/use_cases/check_command.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/use_cases/devsecops_quickstart.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/use_cases/devsecops_sdlc.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/use_cases/inventory_command.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/use_cases/platform_engineering_templates.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/use_cases/space_management.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/use_cases/tasks/create_template.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/framework/use_cases/tasks/workflow_implementation_plan.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/img/commnad_init.png +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/img/framework/thothforge-framework.svg +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/img/framework/thothfr.png +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/img/icon-light.png +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/img/icon.png +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/img/init_project.gif +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/img/stable/scan_report_example.png +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/includes/abbreviations.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/index.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/installation/devcontainer_setup.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/installation/linux_installation.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/installation/windows_installation.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/javascripts/tablesort.js +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/mcp.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/navigation.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/quick_start.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/requirements.txt +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/stylesheets/extra-enhanced.css +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/stylesheets/extra.css +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/telemetry.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/template_engine/cli_commands_audit.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/template_engine/for_developers.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/template_engine/for_platform_engineers.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/template_engine/github_templates.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/template_engine/template_engine.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/toolkit_overview.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/troubleshooting/linux_troubleshooting.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/troubleshooting/macos_troubleshooting.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/troubleshooting/troubleshooting.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/docs/troubleshooting/windows_troubleshooting.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/mkdocs.yaml +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/pyproject.toml +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/scripts/check_output_consistency.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/scripts/run_mcp_server.sh +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/application/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/autocomplete.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/cli.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/cli.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/analyze.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/apply_fix.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/configure.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/configure_decisions.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/decide.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/history.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/improve.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/orchestrate.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/override.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/report.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/ai_review/commands/serve.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/check/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/check/cli.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/check/commands/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/check/commands/config.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/check/commands/environment.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/check/commands/iac.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/check/commands/project/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/check/commands/project/iac.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/check/commands/project.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/check/commands/space.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/dashboard/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/dashboard/cli.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/dashboard/commands/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/dashboard/commands/launch.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/document/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/document/cli.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/document/commands/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/document/commands/iac.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/generate/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/generate/cli.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/generate/commands/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/generate/commands/component.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/generate/commands/stacks.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/init/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/init/cli.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/init/commands/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/init/commands/env.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/init/commands/project.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/init/commands/space.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/init/commands/template.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/inventory/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/inventory/cli.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/inventory/commands/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/inventory/commands/check.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/inventory/commands/iac.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/list/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/list/cli.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/list/commands/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/list/commands/projects.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/list/commands/spaces.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/list/commands/templates.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/mcp/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/mcp/cli.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/mcp/commands/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/mcp/commands/register.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/mcp/commands/server.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/mcp/commands/status.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/mcp/commands/stop.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/project/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/project/cli.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/project/commands/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/project/commands/bootstrap.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/project/commands/cleanup.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/project/commands/convert.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/project/commands/upgrade.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/quickstart/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/quickstart/cli.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/remove/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/remove/cli.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/remove/project.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/remove/space.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/scan/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/scan/cli.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/scan/commands/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/scan/commands/iac.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/space/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/space/cli.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/space/commands/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/space/commands/activate.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/space/commands/deactivate.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/space/commands/export_space.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/space/commands/import_space.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/space/commands/show.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/space/commands/update.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/upgrade/cli.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/workflow/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/workflow/cli.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/workflow/commands/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/workflow/commands/devsecops.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/commands/workflow/commands/run.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/common/.thothcf.setup.toml +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/common/.thothcf_home.toml +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/common/.thothcf_module.toml +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/common/.thothcf_project.toml +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/common/.thothcf_template_parameters.toml +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/common/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/common/common.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/common/terragrunt/.thothcf_project.toml +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/config/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/config/constants.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/config/default_values.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/config/defaults.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/config/models.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/config/settings.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/config/template_config.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/config/template_configs.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/config/templates.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/config/validation.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/cli_ui.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/commands.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/config.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/azure_devops/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/azure_devops/get_azure_devops.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/azure_devops/pull_request_comments.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/github/get_github.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/github/pull_request_comments.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/integrate_messages_services/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/integrate_messages_services/microsoft_teams.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/integrate_messages_services/sent_message_teams.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/pattern_names.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/pr_comments/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/integrations/pr_comments/pr_comment_publisher.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/logger.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/telemetry.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/core/version_tools.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/domain/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/domain/interfaces/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/domain/models/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/mcp/README.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/mcp/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/mcp/server.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/agentcore/agentcore.json +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/ai_agent.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/analyzers/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/analyzers/code_reviewer.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/analyzers/context_builder.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/analyzers/report_analyzer.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/analyzers/risk_assessor.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/bedrock_agent_api.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/config/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/config/ai_settings.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/config/decision_rules.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/decision_engine.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/main.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/memory.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/orchestrator.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/pr_decision_publisher.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/providers/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/providers/azure_provider.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/providers/bedrock_agent_provider.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/providers/bedrock_provider.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/providers/ollama_provider.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/providers/openai_provider.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/safety/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/safety/safety_guard.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/strands_agent.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/tracing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/utils/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/utils/cost_tracker.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/utils/fix_patterns.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/utils/fix_prompts.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/utils/formatters.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/ai_review/utils/prompts.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/environment/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/environment/check_environment.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/org_policy_loader.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/blast_radius_service.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cfn_blast_radius_service.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/check_origin_version.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/check_project_structure.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/cost_analyzer.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/models/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/models/cloudformation_mapper.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/models/cost_models.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/aws_pricing_client.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/base_pricing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/apigateway_pricing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/bedrock_pricing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/cloudwatch_pricing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/dynamodb_pricing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/ebs_pricing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/ec2_pricing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/ecs_pricing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/eip_pricing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/eks_pricing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/elb_pricing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/free_resources_pricing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/kms_pricing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/lambda_pricing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/msk_pricing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/rds_pricing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/s3_pricing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/secrets_manager_pricing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/pricing/providers/vpc_pricing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/cost/unified_cost_report.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/drift/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/drift/cfn_drift_service.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/drift/drift_ai.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/drift/drift_history.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/drift/drift_policy.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/drift/drift_report.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/drift/drift_service.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/drift/models.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/risk_assessment.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/project/validate_project_structure.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/rule_merger.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/rules_compiler.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/check/stack_optimizer/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/dashboard/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/dashboard/dashboard_service.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/dashboard/data_loader.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/document/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/document/architecture_renderer.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/document/create_documentation.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/document/files_content.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/document/files_scan.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/document/iac_documentation.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/document/iac_grunt_graph.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/document/iac_grunt_info.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/document/topology_generator.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_stacks/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_stacks/config_generator.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_stacks/remote_config_generation.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_stacks/stack_service.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_stacks/templates/terragrunt.hcl.j2 +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_stacks/terragrunt.hcl +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_template/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_template/config.yaml +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_template/create_code.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_template/create_component.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_template/create_component_service.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_template/create_stacks.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_template/create_template.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_template/files_content.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_template/github_template_loader.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/create_template/project_templates.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/intent/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/intent/code_generator.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/intent/context_builder.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/intent/intent_decomposer.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/intent/models.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/generate/intent/prompts.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/environment/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/environment/install_tools.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/environment/prerequisite_checker.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/environment/tool_packs.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/project/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/project/project.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/space/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/space/example_space.toml +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/space/export_import.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/space/inheritance.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/space/space.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/init/space/terraform_module_cache.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/cdk_parsers.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/cdk_sbom_service.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/changelog_parser.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/inventory_service.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/models.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/module_compatibility_service.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/report_service.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/schema_compatibility_service.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/terragrunt_parser.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/update_versions.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/inventory/version_service.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/mcp/README.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/mcp/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/mcp/simple_http_server.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/mcp/stdio_server.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/bootstrap/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/bootstrap/bootstrap_service.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/cleanup/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/cleanup/clean_project.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/cleanup/clean_space.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/convert/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/convert/conversion_service.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/convert/get_project_data.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/convert/post_init.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/convert/project_converter.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/convert/project_defaults.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/convert/set_project_parameters.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/create_terramate/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/create_terramate/create_terramate_stacks.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/create_terramate/detect_changes_stacks.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/create_terramate/manage_terramate_stacks.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/upgrade/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/project/upgrade/upgrade_service.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/compliance_review.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/import_reports.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/models.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/report_parser.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/sarif_output.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scan_history.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scan_service.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scanners/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scanners/checkov.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scanners/kics.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scanners/opa.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scanners/scan_reports.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scanners/scanners.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scanners/terraform_compliance.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scanners/tfsec.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/scan/scanners/trivy.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/custom_workflow_engine.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/models.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/phases/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/phases/base.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/phases/build.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/phases/deploy.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/phases/develop.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/phases/monitor.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/phases/plan.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/phases/secure.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/phases/test.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/services/workflow/workflow_service.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/templates/ai_reports/pr_comment.md +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/templates/reports/inventory_report.html +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/templates/reports/inventory_report.js +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/templates/unified_report_styles.css +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/banner.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/create_compliance_html_reports.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/create_html_reports.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/delete_directory.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/fix_report_styling.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/render_scan_report.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/report_html_utils.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/templates/dashboard.html +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/templates/index_report.html +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/templates/individual_report.html +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/templates/simple_report.html +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/templates/unified_report_styles.css +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/templates/unified_scan_report.html +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/templates/unified_simple_report.html +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/common/templates/xunit_report.html +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/crypto.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/git_changes.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/manage_backend_resources/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/manage_backend_resources/manage_backend_resources.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/modules_ops/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/modules_ops/terraform_module_details.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/modules_ops/terraform_modules_fetcher.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/platform_utils.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/process_hcl/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/process_hcl/analyze_terraform_plan.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/process_hcl/graph_manager.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/process_hcl/graph_terragrunt_dependencies.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/process_hcl/process_terraform_file.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/process_hcl/risk_analyzing_terraform_plan.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/sync_workspaces/__init__.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/sync_workspaces/sync_terraform_workspaces.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/sync_workspaces/sync_terragrunt_workspaces.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/template_loader.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/utils/thoth_colors.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/src/thothctl/wellcome_banner.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/conftest.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_agentcore_entrypoint.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_ai_apply_fix.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_ai_decision_engine.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_ai_fix_patterns.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_ai_memory.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_ai_orchestrator.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_ai_pr_decision.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_ai_safety_guard.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_aws_pricing_client.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_azure_devops_pr_comments.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_bedrock_pricing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_cdk_inventory.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_cdk_language_selection.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_cfn_blast_radius.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_cfn_drift_detection.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_context_steering.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_cost_analyzer.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_cost_models.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_cost_policy_enforcement.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_cost_pr_comments.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_dashboard_loading_fix.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_dashboard_service.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_drift.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_drift_detection.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_ec2_pricing.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_generate_iac_codegen.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_generate_iac_context.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_generate_iac_prompts.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_generate_iac_service.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_github_pr_comments.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_iac_cost_integration.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_init_ai_tools.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_init_template_params.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_intent_quick_wins.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_intent_rules_integration.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_inventory_pr_comments.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_kics_scanner.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_mermaid_edge_labels.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_new_cost_providers.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_opa_data_files.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_parallel_scan.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_platform_utils.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_pr_comment_publisher.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_provider_source_url_fix.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_provider_versions.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_scan_cfn_support.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_scan_command.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_scan_pr_comments.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_space_command.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_space_management.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_stack_optimizer.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_template_url_fix.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_terragrunt_parser.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_topology_generator.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tests/test_workflow_integration.py +0 -0
- {thothctl-0.26.0 → thothctl-0.26.1}/tox.ini +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: thothctl
|
|
3
|
-
Version: 0.26.
|
|
3
|
+
Version: 0.26.1
|
|
4
4
|
Summary: A CLI for Developer Control Plane. Accelerate your cloud IaC deployments.
|
|
5
5
|
Project-URL: SourceCode, https://github.com/thothforge/thothctl
|
|
6
6
|
Project-URL: HomePage, https://github.com/thothforge/thothctl
|
|
@@ -111,6 +111,9 @@ class GenerateIaCCommand(ClickCommand):
|
|
|
111
111
|
|
|
112
112
|
# Generate
|
|
113
113
|
with self.ui.status_spinner("🤖 Generating infrastructure code..."):
|
|
114
|
+
import time
|
|
115
|
+
|
|
116
|
+
self._start_time = time.time()
|
|
114
117
|
result = service.generate(
|
|
115
118
|
intent=intent,
|
|
116
119
|
directory=directory,
|
|
@@ -191,6 +194,23 @@ class GenerateIaCCommand(ClickCommand):
|
|
|
191
194
|
if result.explanation:
|
|
192
195
|
console.print(f"📝 {result.explanation}")
|
|
193
196
|
|
|
197
|
+
# Show metrics
|
|
198
|
+
import time
|
|
199
|
+
|
|
200
|
+
elapsed = time.time() - self._start_time if hasattr(self, "_start_time") else 0
|
|
201
|
+
metrics_parts = []
|
|
202
|
+
if result.context_tokens:
|
|
203
|
+
metrics_parts.append(f"context: ~{result.context_tokens} tokens")
|
|
204
|
+
if result.generation_tokens:
|
|
205
|
+
metrics_parts.append(f"generation: ~{result.generation_tokens} tokens")
|
|
206
|
+
if elapsed > 0:
|
|
207
|
+
metrics_parts.append(f"time: {elapsed:.1f}s")
|
|
208
|
+
if result.iterations > 1:
|
|
209
|
+
metrics_parts.append(f"iterations: {result.iterations}")
|
|
210
|
+
metrics_parts.append(f"files: {len(result.files)}")
|
|
211
|
+
if metrics_parts:
|
|
212
|
+
console.print(f"⏱️ Metrics: {' | '.join(metrics_parts)}")
|
|
213
|
+
|
|
194
214
|
# Final guidance
|
|
195
215
|
console.print("")
|
|
196
216
|
if should_apply:
|
|
@@ -424,6 +424,182 @@ class IntentToIaCService:
|
|
|
424
424
|
|
|
425
425
|
return "\n".join(lines)
|
|
426
426
|
|
|
427
|
+
def _load_scaffold_example(self, project_type: str, stack) -> str:
|
|
428
|
+
"""Load a real scaffold example as few-shot context for per-stack generation.
|
|
429
|
+
|
|
430
|
+
Fetches the official scaffold from GitHub (cached locally) and uses its
|
|
431
|
+
real stack files as examples the AI should follow. The scaffold IS the
|
|
432
|
+
source of truth for code structure.
|
|
433
|
+
|
|
434
|
+
Resolution order:
|
|
435
|
+
1. Local cache (~/.thothcf/<scaffold_name>/)
|
|
436
|
+
2. Auto-clone from GitHub (thothforge org) on first use
|
|
437
|
+
"""
|
|
438
|
+
from pathlib import Path
|
|
439
|
+
|
|
440
|
+
# Official scaffolds per project type
|
|
441
|
+
scaffold_registry = {
|
|
442
|
+
"terraform-terragrunt": {
|
|
443
|
+
"name": "terraform_terragrunt_scaffold_project",
|
|
444
|
+
"repo": "thothforge/terraform_terragrunt_scaffold_project",
|
|
445
|
+
},
|
|
446
|
+
"terragrunt": {
|
|
447
|
+
"name": "terraform_terragrunt_scaffold_project",
|
|
448
|
+
"repo": "thothforge/terraform_terragrunt_scaffold_project",
|
|
449
|
+
},
|
|
450
|
+
"terraform": {
|
|
451
|
+
"name": "terraform_project_scaffold",
|
|
452
|
+
"repo": "thothforge/terraform_project_scaffold",
|
|
453
|
+
},
|
|
454
|
+
"cdkv2": {
|
|
455
|
+
"name": "cdkv2_typescript_scaffold",
|
|
456
|
+
"repo": "thothforge/cdkv2_typescript_scaffold",
|
|
457
|
+
},
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
scaffold_info = scaffold_registry.get(project_type)
|
|
461
|
+
if not scaffold_info:
|
|
462
|
+
return self._default_composition_rules()
|
|
463
|
+
|
|
464
|
+
scaffold_cache = Path.home() / ".thothcf"
|
|
465
|
+
scaffold_dir = scaffold_cache / scaffold_info["name"]
|
|
466
|
+
|
|
467
|
+
# Auto-fetch scaffold from GitHub if not cached
|
|
468
|
+
if not scaffold_dir.exists() or not list(scaffold_dir.rglob("*.tf")):
|
|
469
|
+
scaffold_dir = self._fetch_scaffold(scaffold_info["repo"], scaffold_dir)
|
|
470
|
+
|
|
471
|
+
example_parts = []
|
|
472
|
+
|
|
473
|
+
if scaffold_dir.exists():
|
|
474
|
+
# Find a matching or similar stack in the scaffold
|
|
475
|
+
stacks_dir = scaffold_dir / "stacks"
|
|
476
|
+
if stacks_dir.exists():
|
|
477
|
+
# Try exact match first, then same domain, then any from same layer
|
|
478
|
+
candidates = list(stacks_dir.rglob("main.tf"))
|
|
479
|
+
best_match = None
|
|
480
|
+
|
|
481
|
+
for candidate in candidates:
|
|
482
|
+
rel = str(candidate.relative_to(stacks_dir))
|
|
483
|
+
if stack.domain in rel or stack.name in rel:
|
|
484
|
+
best_match = candidate.parent
|
|
485
|
+
break
|
|
486
|
+
|
|
487
|
+
if not best_match and candidates:
|
|
488
|
+
# Take first example from the same layer
|
|
489
|
+
for candidate in candidates:
|
|
490
|
+
rel = str(candidate.relative_to(stacks_dir))
|
|
491
|
+
if stack.layer in rel:
|
|
492
|
+
best_match = candidate.parent
|
|
493
|
+
break
|
|
494
|
+
|
|
495
|
+
if best_match:
|
|
496
|
+
# Load the example files
|
|
497
|
+
for tf_file in sorted(best_match.glob("*.tf")):
|
|
498
|
+
content = tf_file.read_text(encoding="utf-8", errors="ignore")
|
|
499
|
+
if content.strip():
|
|
500
|
+
example_parts.append(
|
|
501
|
+
f"### Scaffold example: {tf_file.name}\n```hcl\n{content.strip()}\n```"
|
|
502
|
+
)
|
|
503
|
+
tg_file = best_match / "terragrunt.hcl"
|
|
504
|
+
if tg_file.exists():
|
|
505
|
+
content = tg_file.read_text(encoding="utf-8", errors="ignore")
|
|
506
|
+
if content.strip():
|
|
507
|
+
example_parts.append(
|
|
508
|
+
f"### Scaffold example: terragrunt.hcl\n```hcl\n{content.strip()}\n```"
|
|
509
|
+
)
|
|
510
|
+
|
|
511
|
+
# Always include the composition rules (whether scaffold found or not)
|
|
512
|
+
rules = (
|
|
513
|
+
"COMPOSITION RULES (from scaffold):\n"
|
|
514
|
+
"- Generate ONLY: main.tf, variables.tf, outputs.tf (flat paths)\n"
|
|
515
|
+
"- main.tf must contain ONLY resources/modules/data — "
|
|
516
|
+
"NO terraform{}, provider{}, or backend{} blocks\n"
|
|
517
|
+
"- Provider and backend are managed by root.hcl (terragrunt generates them)\n"
|
|
518
|
+
"- Use var.tags for tags (passed from terragrunt inputs)\n"
|
|
519
|
+
"- Use var.project and var.environment for naming\n"
|
|
520
|
+
)
|
|
521
|
+
|
|
522
|
+
if example_parts:
|
|
523
|
+
return (
|
|
524
|
+
"FOLLOW THIS SCAFFOLD PATTERN (from your org's official scaffold):\n\n"
|
|
525
|
+
+ "\n\n".join(example_parts[:3]) # Max 3 files as example
|
|
526
|
+
+ f"\n\n{rules}"
|
|
527
|
+
)
|
|
528
|
+
else:
|
|
529
|
+
return rules
|
|
530
|
+
|
|
531
|
+
@staticmethod
|
|
532
|
+
def _fetch_scaffold(repo: str, target_dir) -> "Path":
|
|
533
|
+
"""Fetch official scaffold from GitHub via gh CLI (cached locally)."""
|
|
534
|
+
import shutil
|
|
535
|
+
import subprocess
|
|
536
|
+
from pathlib import Path
|
|
537
|
+
|
|
538
|
+
target = Path(target_dir)
|
|
539
|
+
|
|
540
|
+
if shutil.which("gh"):
|
|
541
|
+
try:
|
|
542
|
+
logger.info(f"Fetching scaffold from github.com/{repo}...")
|
|
543
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
544
|
+
result = subprocess.run(
|
|
545
|
+
["gh", "repo", "clone", repo, str(target), "--", "--depth=1"],
|
|
546
|
+
capture_output=True,
|
|
547
|
+
text=True,
|
|
548
|
+
timeout=60,
|
|
549
|
+
)
|
|
550
|
+
if result.returncode == 0:
|
|
551
|
+
logger.info(f"Scaffold cached at {target}")
|
|
552
|
+
return target
|
|
553
|
+
else:
|
|
554
|
+
logger.warning(f"Failed to fetch scaffold: {result.stderr[:200]}")
|
|
555
|
+
except Exception as e:
|
|
556
|
+
logger.warning(f"Scaffold fetch failed: {e}")
|
|
557
|
+
|
|
558
|
+
return target
|
|
559
|
+
|
|
560
|
+
@staticmethod
|
|
561
|
+
def _default_composition_rules() -> str:
|
|
562
|
+
"""Fallback composition rules when no scaffold is available."""
|
|
563
|
+
return (
|
|
564
|
+
"COMPOSITION RULES:\n"
|
|
565
|
+
"- Generate ONLY: main.tf, variables.tf, outputs.tf (flat paths)\n"
|
|
566
|
+
"- main.tf must contain ONLY resources/modules/data — "
|
|
567
|
+
"NO terraform{}, provider{}, or backend{} blocks\n"
|
|
568
|
+
"- Provider and backend are managed by root.hcl (terragrunt generates them)\n"
|
|
569
|
+
"- Use var.tags for tags (passed from terragrunt inputs)\n"
|
|
570
|
+
"- Use var.project and var.environment for naming\n"
|
|
571
|
+
)
|
|
572
|
+
|
|
573
|
+
@staticmethod
|
|
574
|
+
def _strip_terraform_block(content: str) -> str:
|
|
575
|
+
"""Remove terraform {}, provider {}, and backend blocks from generated code.
|
|
576
|
+
|
|
577
|
+
In terragrunt projects, root.hcl handles provider and backend config.
|
|
578
|
+
Per-stack .tf files should only contain resources, data sources, and locals.
|
|
579
|
+
"""
|
|
580
|
+
import re
|
|
581
|
+
|
|
582
|
+
# Remove terraform { ... } block (multi-line, handles nested braces)
|
|
583
|
+
content = re.sub(
|
|
584
|
+
r"terraform\s*\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}\s*\n?",
|
|
585
|
+
"",
|
|
586
|
+
content,
|
|
587
|
+
flags=re.DOTALL,
|
|
588
|
+
)
|
|
589
|
+
|
|
590
|
+
# Remove provider "aws" { ... } block
|
|
591
|
+
content = re.sub(
|
|
592
|
+
r'provider\s+"[^"]+"\s*\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}\s*\n?',
|
|
593
|
+
"",
|
|
594
|
+
content,
|
|
595
|
+
flags=re.DOTALL,
|
|
596
|
+
)
|
|
597
|
+
|
|
598
|
+
# Clean up excessive blank lines left behind
|
|
599
|
+
content = re.sub(r"\n{3,}", "\n\n", content)
|
|
600
|
+
|
|
601
|
+
return content.strip() + "\n"
|
|
602
|
+
|
|
427
603
|
# ------------------------------------------------------------------
|
|
428
604
|
# Composition generation (multi-stack)
|
|
429
605
|
# ------------------------------------------------------------------
|
|
@@ -443,27 +619,41 @@ class IntentToIaCService:
|
|
|
443
619
|
) -> IntentResult:
|
|
444
620
|
"""Generate a full multi-stack project from a complex intent.
|
|
445
621
|
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
622
|
+
Uses scaffold-driven generation:
|
|
623
|
+
1. Load scaffold structure (deterministic skeleton)
|
|
624
|
+
2. Build context
|
|
625
|
+
3. Decompose intent into stacks (AI call)
|
|
626
|
+
4. Assemble project structure using scaffold boilerplate (deterministic)
|
|
627
|
+
5. Generate code per stack using scaffold examples as context (AI per stack)
|
|
628
|
+
6. Post-process: validate completeness against scaffold rules
|
|
629
|
+
7. Validate + write
|
|
451
630
|
"""
|
|
452
|
-
from .composition_models import CompositionPlan
|
|
453
631
|
from .intent_decomposer import IntentDecomposer
|
|
454
632
|
from .project_assembler import ProjectAssembler
|
|
633
|
+
from .scaffold_loader import ScaffoldLoader
|
|
455
634
|
|
|
456
635
|
logger.info(
|
|
457
636
|
f"Composition generation: '{intent[:80]}' "
|
|
458
637
|
f"(type={project_type}, mode={'incremental' if incremental else 'full'})"
|
|
459
638
|
)
|
|
460
639
|
|
|
461
|
-
# Step 1:
|
|
640
|
+
# Step 1: Load scaffold structure (deterministic skeleton)
|
|
641
|
+
# The scaffold defines the project skeleton — AI only fills resource content.
|
|
642
|
+
scaffold_loader = ScaffoldLoader(project_type=project_type)
|
|
643
|
+
scaffold = scaffold_loader.load()
|
|
644
|
+
logger.info(
|
|
645
|
+
f"Scaffold loaded: {scaffold.project_type} "
|
|
646
|
+
f"(root_files={len(scaffold.root_files)}, "
|
|
647
|
+
f"boilerplate={len(scaffold.boilerplate)}, "
|
|
648
|
+
f"examples={len(scaffold.examples)})"
|
|
649
|
+
)
|
|
650
|
+
|
|
651
|
+
# Step 2: Build context
|
|
462
652
|
context_payload = self.context_builder.build_context(directory, project_type)
|
|
463
653
|
context_text = context_payload.compile()
|
|
464
654
|
resolved_type = context_payload.project_type
|
|
465
655
|
|
|
466
|
-
# Step
|
|
656
|
+
# Step 3: Decompose intent into stacks
|
|
467
657
|
decomposer = IntentDecomposer(provider=self.provider, model=self.model)
|
|
468
658
|
plan = decomposer.decompose(intent, resolved_type, context_text)
|
|
469
659
|
|
|
@@ -488,33 +678,50 @@ class IntentToIaCService:
|
|
|
488
678
|
plan.needs_root_config = False
|
|
489
679
|
plan.needs_common = False
|
|
490
680
|
|
|
491
|
-
# Step
|
|
681
|
+
# Step 4: Assemble project structure using scaffold boilerplate
|
|
492
682
|
assembler = ProjectAssembler(project_type=resolved_type)
|
|
493
683
|
structure_files = assembler.assemble(
|
|
494
|
-
plan, target_dir, existing_project=incremental
|
|
684
|
+
plan, target_dir, existing_project=incremental, scaffold=scaffold
|
|
495
685
|
)
|
|
496
686
|
|
|
497
|
-
# Step
|
|
687
|
+
# Step 5: Generate code per stack using scaffold examples as context
|
|
498
688
|
all_files = list(structure_files)
|
|
499
689
|
ordered_stacks = plan.topological_order()
|
|
500
690
|
|
|
501
691
|
for stack in ordered_stacks:
|
|
502
692
|
logger.info(f"Generating stack: {stack.path} ({stack.intent[:50]})")
|
|
503
693
|
|
|
694
|
+
# Build scaffold context for this stack from loaded scaffold
|
|
695
|
+
scaffold_context = self._build_scaffold_context(scaffold, stack)
|
|
696
|
+
stack_intent = f"{stack.intent}\n\n{scaffold_context}"
|
|
697
|
+
|
|
504
698
|
# Generate the Terraform code for this stack
|
|
505
699
|
stack_generation = self.code_generator.generate(
|
|
506
|
-
intent=
|
|
700
|
+
intent=stack_intent,
|
|
507
701
|
context=context_text,
|
|
508
|
-
project_type=
|
|
702
|
+
project_type="terraform", # Generate pure TF resources
|
|
509
703
|
)
|
|
510
704
|
|
|
511
705
|
if stack_generation.files:
|
|
512
706
|
# Prefix file paths with stack path
|
|
707
|
+
# Strip any nested path from AI output — keep only filename
|
|
513
708
|
for f in stack_generation.files:
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
709
|
+
# AI sometimes returns full paths or nested structures
|
|
710
|
+
# We only want the filename (main.tf, variables.tf, etc.)
|
|
711
|
+
filename = Path(f.path).name
|
|
712
|
+
# Skip files that aren't Terraform files
|
|
713
|
+
if not filename.endswith((".tf", ".tfvars", ".hcl", ".md")):
|
|
714
|
+
continue
|
|
715
|
+
# Skip if AI regenerated a terragrunt.hcl (assembler already made one)
|
|
716
|
+
if filename == "terragrunt.hcl":
|
|
717
|
+
continue
|
|
718
|
+
# Strip terraform/provider/backend blocks from .tf files
|
|
719
|
+
# (root.hcl handles these in terragrunt projects)
|
|
720
|
+
content = f.content
|
|
721
|
+
if resolved_type in ("terraform-terragrunt", "terragrunt"):
|
|
722
|
+
content = self._strip_terraform_block(content)
|
|
723
|
+
prefixed_path = f"{stack.path}/{filename}"
|
|
724
|
+
all_files.append(GeneratedFile(path=prefixed_path, content=content))
|
|
518
725
|
|
|
519
726
|
if not all_files:
|
|
520
727
|
return IntentResult(
|
|
@@ -523,7 +730,12 @@ class IntentToIaCService:
|
|
|
523
730
|
context_tokens=context_payload.total_tokens_estimate,
|
|
524
731
|
)
|
|
525
732
|
|
|
526
|
-
# Step
|
|
733
|
+
# Step 6: Post-process — ensure completeness against scaffold rules
|
|
734
|
+
all_files = self._ensure_scaffold_completeness(
|
|
735
|
+
all_files, scaffold, ordered_stacks
|
|
736
|
+
)
|
|
737
|
+
|
|
738
|
+
# Step 7: Validate (optional)
|
|
527
739
|
validation = ValidationResult(passed=True)
|
|
528
740
|
if not skip_validation:
|
|
529
741
|
org_policy_dir = self._resolve_org_policy_dir(directory)
|
|
@@ -535,12 +747,12 @@ class IntentToIaCService:
|
|
|
535
747
|
skip_framework_validate=True, # Can't run terraform validate on partial project
|
|
536
748
|
)
|
|
537
749
|
|
|
538
|
-
# Step
|
|
750
|
+
# Step 8: Write to disk if --apply
|
|
539
751
|
if apply and all_files:
|
|
540
752
|
self._write_files(all_files, target_dir)
|
|
541
753
|
logger.info(f"Project written to: {target_dir}")
|
|
542
754
|
|
|
543
|
-
# Step
|
|
755
|
+
# Step 9: Generate diagram
|
|
544
756
|
diagram = None
|
|
545
757
|
if include_diagram and all_files:
|
|
546
758
|
resources = []
|
|
@@ -560,5 +772,171 @@ class IntentToIaCService:
|
|
|
560
772
|
modules_used=[s.module_source for s in plan.stacks if s.module_source],
|
|
561
773
|
estimated_resources=[s.name for s in plan.stacks],
|
|
562
774
|
context_tokens=context_payload.total_tokens_estimate,
|
|
775
|
+
generation_tokens=sum(len(f.content) // 4 for f in all_files),
|
|
563
776
|
diagram=diagram,
|
|
564
777
|
)
|
|
778
|
+
|
|
779
|
+
# ------------------------------------------------------------------
|
|
780
|
+
# Scaffold-driven helpers (Tasks 3-6)
|
|
781
|
+
# ------------------------------------------------------------------
|
|
782
|
+
|
|
783
|
+
def _build_scaffold_context(self, scaffold, stack) -> str:
|
|
784
|
+
"""Build scaffold context for per-stack generation from ScaffoldStructure.
|
|
785
|
+
|
|
786
|
+
Uses scaffold.examples to find the best matching few-shot pattern for
|
|
787
|
+
the current stack (by domain/layer/name similarity). Falls back to
|
|
788
|
+
composition rules if no example matches.
|
|
789
|
+
|
|
790
|
+
Args:
|
|
791
|
+
scaffold: ScaffoldStructure with examples and rules.
|
|
792
|
+
stack: StackPlan being generated.
|
|
793
|
+
|
|
794
|
+
Returns:
|
|
795
|
+
Prompt section with scaffold examples and rules.
|
|
796
|
+
"""
|
|
797
|
+
|
|
798
|
+
example_parts = []
|
|
799
|
+
|
|
800
|
+
if scaffold.examples:
|
|
801
|
+
# Find best matching examples: prefer same domain, then same layer
|
|
802
|
+
scored_examples = []
|
|
803
|
+
for rel_path, content in scaffold.examples.items():
|
|
804
|
+
score = 0
|
|
805
|
+
path_lower = rel_path.lower()
|
|
806
|
+
if stack.domain and stack.domain in path_lower:
|
|
807
|
+
score += 3
|
|
808
|
+
if stack.name and stack.name in path_lower:
|
|
809
|
+
score += 5
|
|
810
|
+
if stack.layer and stack.layer in path_lower:
|
|
811
|
+
score += 2
|
|
812
|
+
scored_examples.append((score, rel_path, content))
|
|
813
|
+
|
|
814
|
+
# Sort by score descending, take top 3
|
|
815
|
+
scored_examples.sort(key=lambda x: x[0], reverse=True)
|
|
816
|
+
for _score, rel_path, content in scored_examples[:3]:
|
|
817
|
+
example_parts.append(
|
|
818
|
+
f"### Scaffold example: {rel_path}\n```hcl\n{content.strip()}\n```"
|
|
819
|
+
)
|
|
820
|
+
|
|
821
|
+
# Build composition rules from scaffold metadata
|
|
822
|
+
required_files = ", ".join(scaffold.stack_required_files) or (
|
|
823
|
+
"main.tf, variables.tf, outputs.tf"
|
|
824
|
+
)
|
|
825
|
+
rules = (
|
|
826
|
+
f"COMPOSITION RULES (from scaffold):\n"
|
|
827
|
+
f"- Generate ONLY these files: {required_files}\n"
|
|
828
|
+
f"- main.tf must contain ONLY resources/modules/data — "
|
|
829
|
+
f"NO terraform{{}}, provider{{}}, or backend{{}} blocks\n"
|
|
830
|
+
f"- Provider and backend are managed by root.hcl (terragrunt generates them)\n"
|
|
831
|
+
f"- Use var.tags for tags (passed from terragrunt inputs)\n"
|
|
832
|
+
f"- Use var.project and var.environment for naming\n"
|
|
833
|
+
)
|
|
834
|
+
|
|
835
|
+
if example_parts:
|
|
836
|
+
return (
|
|
837
|
+
"FOLLOW THIS SCAFFOLD PATTERN (from your org's official scaffold):\n\n"
|
|
838
|
+
+ "\n\n".join(example_parts)
|
|
839
|
+
+ f"\n\n{rules}"
|
|
840
|
+
)
|
|
841
|
+
else:
|
|
842
|
+
return rules
|
|
843
|
+
|
|
844
|
+
def _ensure_scaffold_completeness(
|
|
845
|
+
self, files: List[GeneratedFile], scaffold, ordered_stacks
|
|
846
|
+
) -> List[GeneratedFile]:
|
|
847
|
+
"""Ensure all stacks have the required files per scaffold rules.
|
|
848
|
+
|
|
849
|
+
If the AI missed generating a required file (e.g., outputs.tf),
|
|
850
|
+
add a placeholder so the project structure is complete.
|
|
851
|
+
|
|
852
|
+
Args:
|
|
853
|
+
files: All generated files so far.
|
|
854
|
+
scaffold: ScaffoldStructure with stack_required_files.
|
|
855
|
+
ordered_stacks: Stacks in the plan.
|
|
856
|
+
|
|
857
|
+
Returns:
|
|
858
|
+
Updated file list with any missing required files added.
|
|
859
|
+
"""
|
|
860
|
+
if not scaffold.stack_required_files:
|
|
861
|
+
return files
|
|
862
|
+
|
|
863
|
+
# Build a set of existing file paths
|
|
864
|
+
existing_paths = {f.path for f in files}
|
|
865
|
+
added = []
|
|
866
|
+
|
|
867
|
+
for stack in ordered_stacks:
|
|
868
|
+
for required_file in scaffold.stack_required_files:
|
|
869
|
+
# terragrunt.hcl is handled by the assembler
|
|
870
|
+
if required_file == "terragrunt.hcl":
|
|
871
|
+
continue
|
|
872
|
+
|
|
873
|
+
expected_path = f"{stack.path}/{required_file}"
|
|
874
|
+
if expected_path not in existing_paths:
|
|
875
|
+
# Generate a minimal placeholder
|
|
876
|
+
placeholder = self._placeholder_for_file(
|
|
877
|
+
required_file, stack.name, stack.domain
|
|
878
|
+
)
|
|
879
|
+
added.append(GeneratedFile(path=expected_path, content=placeholder))
|
|
880
|
+
logger.info(
|
|
881
|
+
f"Scaffold completeness: added missing {expected_path}"
|
|
882
|
+
)
|
|
883
|
+
|
|
884
|
+
if added:
|
|
885
|
+
logger.info(
|
|
886
|
+
f"Post-processing added {len(added)} missing required files"
|
|
887
|
+
)
|
|
888
|
+
|
|
889
|
+
return files + added
|
|
890
|
+
|
|
891
|
+
@staticmethod
|
|
892
|
+
def _placeholder_for_file(filename: str, stack_name: str, domain: str) -> str:
|
|
893
|
+
"""Generate a minimal placeholder for a missing required file.
|
|
894
|
+
|
|
895
|
+
Args:
|
|
896
|
+
filename: The required filename (e.g., "variables.tf", "outputs.tf").
|
|
897
|
+
stack_name: Stack name for contextual comments.
|
|
898
|
+
domain: Stack domain for contextual comments.
|
|
899
|
+
|
|
900
|
+
Returns:
|
|
901
|
+
Minimal valid HCL content for the file.
|
|
902
|
+
"""
|
|
903
|
+
if filename == "variables.tf":
|
|
904
|
+
return (
|
|
905
|
+
f"# Variables for {stack_name} ({domain})\n"
|
|
906
|
+
f"# Generated placeholder — populate with required inputs\n\n"
|
|
907
|
+
f'variable "project" {{\n'
|
|
908
|
+
f' description = "Project name"\n'
|
|
909
|
+
f' type = string\n'
|
|
910
|
+
f"}}\n\n"
|
|
911
|
+
f'variable "environment" {{\n'
|
|
912
|
+
f' description = "Environment name"\n'
|
|
913
|
+
f' type = string\n'
|
|
914
|
+
f"}}\n\n"
|
|
915
|
+
f'variable "tags" {{\n'
|
|
916
|
+
f' description = "Common tags for all resources"\n'
|
|
917
|
+
f' type = map(string)\n'
|
|
918
|
+
f" default = {{}}\n"
|
|
919
|
+
f"}}\n"
|
|
920
|
+
)
|
|
921
|
+
elif filename == "outputs.tf":
|
|
922
|
+
return (
|
|
923
|
+
f"# Outputs for {stack_name} ({domain})\n"
|
|
924
|
+
f"# Generated placeholder — add outputs consumed by dependent stacks\n"
|
|
925
|
+
)
|
|
926
|
+
elif filename == "main.tf":
|
|
927
|
+
return (
|
|
928
|
+
f"# Main resources for {stack_name} ({domain})\n"
|
|
929
|
+
f"# Generated placeholder — add resource definitions\n"
|
|
930
|
+
)
|
|
931
|
+
elif filename == "README.md":
|
|
932
|
+
return (
|
|
933
|
+
f"# {stack_name}\n\n"
|
|
934
|
+
f"Stack for {domain} resources.\n\n"
|
|
935
|
+
f"## Usage\n\n"
|
|
936
|
+
f"```bash\n"
|
|
937
|
+
f"terragrunt plan\n"
|
|
938
|
+
f"terragrunt apply\n"
|
|
939
|
+
f"```\n"
|
|
940
|
+
)
|
|
941
|
+
else:
|
|
942
|
+
return f"# {filename} for {stack_name} ({domain})\n"
|