thothctl 0.16.4__tar.gz → 0.16.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {thothctl-0.16.4 → thothctl-0.16.7}/PKG-INFO +19 -2
- {thothctl-0.16.4 → thothctl-0.16.7}/README.md +18 -1
- thothctl-0.16.7/docs/framework/commands/check/deps.md +145 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/check/commands/iac.py +150 -20
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/ai_agent.py +83 -21
- thothctl-0.16.7/src/thothctl/version.py +2 -0
- thothctl-0.16.4/docs/framework/commands/check/deps.md +0 -50
- thothctl-0.16.4/src/thothctl/version.py +0 -2
- {thothctl-0.16.4 → thothctl-0.16.7}/.devcontainer/Dockerfile +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/.devcontainer/README.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/.devcontainer/devcontainer.json +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/.github/workflows/docs.yml +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/.github/workflows/python-publish.yml +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/.gitignore +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/.pre-commit-config.yaml +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/.readthedocs.yaml +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/AWS_PRICING_API_FINAL_REPORT.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/AWS_PRICING_API_IMPLEMENTATION_PLAN.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/AWS_PRICING_REFACTOR_REPORT.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/Dockerfile +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/LICENSE +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/TECHNICAL_DEBT_METRICS.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/catalog/catalog-info.yaml +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/dashboard/README.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/ai-review/README.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/ai-review/agent_specifications.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/ai-review/agentcore.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/blast-radius.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/check_environment.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/check_iac.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/check_overview.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/check_project_iac.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/check_space.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/cost-analysis-quick-reference.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/cost-analysis.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/customizing_rules.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/deps-advanced.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/drift-detection.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/check/plan.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/document/customizing_docs.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/document/document_iac.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/document/document_overview.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/document/iac.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/document/use_cases.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/generate/generate_components.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/generate/generate_stacks.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/init/init.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/init/init_space.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/inventory/CHANGELOG.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/inventory/frameworks/terraform.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/inventory/frameworks/terragrunt.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/inventory/iac.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/inventory/inventory_iac.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/inventory/inventory_overview.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/list/list_overview.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/list/list_projects.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/list/list_spaces.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/mcp/mcp.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/project/iac.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/project/project_cleanup.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/project/project_convert.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/project/project_overview.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/project/project_upgrade.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/project/use_cases.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/remove/remove_overview.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/remove/remove_project.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/remove/remove_space.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/scan/iac.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/scan/scan_iac.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/scan/scan_overview.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/scan/use_cases.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/commands/upgrade/upgrade_overview.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/concepts.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/cross_platform_support.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/framework_architecture.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/infrasctructure_composition.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/policy_as_code.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/roadmap_fdi.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/software_architecture.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/space_configuration.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/use_cases/README.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/use_cases/ai_dlc.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/use_cases/check_command.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/use_cases/devsecops_quickstart.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/use_cases/devsecops_sdlc.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/use_cases/inventory_command.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/use_cases/platform_engineering_templates.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/use_cases/space_management.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/framework/use_cases/tasks/create_template.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/iac_devsecops_use_case.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/automate_tasks_command.png +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/commnad_init.png +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/create_component.gif +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/create_inventory.gif +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/doc_command.png +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/document_project_code.gif +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/framework/thothforge-framework.svg +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/framework/thothfr.png +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/iacpeerbot_summary.png +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/icon-light.png +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/icon.png +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/init_project.gif +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/inventory_command.png +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/notification_img.png +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/report_dependencies.png +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/report_dependencies_summary.png +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/restore_inventory_version.gif +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/reuse_project_pattern.gif +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/scan_code.gif +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/scan_command.png +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/sync_wk_command.png +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/transform_command.png +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/update_inventory_version.gif +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/validate_command.png +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/validate_environment.gif +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/img/validate_project.gif +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/includes/abbreviations.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/index.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/installation/linux_installation.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/installation/windows_installation.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/javascripts/tablesort.js +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/mcp.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/navigation.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/quick_start.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/requirements.txt +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/stylesheets/extra-enhanced.css +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/stylesheets/extra.css +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/telemetry.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/template_engine/cli_commands_audit.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/template_engine/for_developers.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/template_engine/for_platform_engineers.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/template_engine/github_templates.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/template_engine/template_engine.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/troubleshooting/linux_troubleshooting.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/troubleshooting/macos_troubleshooting.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/troubleshooting/troubleshooting.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/docs/troubleshooting/windows_troubleshooting.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/mkdocs.yaml +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/pyproject.toml +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/scripts/run_mcp_server.sh +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/application/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/autocomplete.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/cli.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/cli.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/analyze.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/apply_fix.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/configure.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/configure_decisions.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/decide.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/history.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/improve.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/orchestrate.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/override.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/report.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/ai_review/commands/serve.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/check/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/check/cli.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/check/commands/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/check/commands/environment.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/check/commands/project/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/check/commands/project/iac.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/check/commands/project.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/dashboard/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/dashboard/cli.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/dashboard/commands/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/dashboard/commands/launch.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/document/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/document/cli.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/document/commands/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/document/commands/iac.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/generate/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/generate/cli.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/generate/commands/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/generate/commands/component.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/generate/commands/stacks.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/init/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/init/cli.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/init/commands/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/init/commands/env.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/init/commands/project.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/init/commands/space.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/init/commands/template.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/inventory/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/inventory/cli.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/inventory/commands/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/inventory/commands/check.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/inventory/commands/iac.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/list/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/list/cli.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/list/commands/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/list/commands/projects.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/list/commands/spaces.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/mcp/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/mcp/cli.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/mcp/commands/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/mcp/commands/register.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/mcp/commands/server.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/mcp/commands/status.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/mcp/commands/stop.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/project/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/project/cli.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/project/commands/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/project/commands/bootstrap.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/project/commands/cleanup.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/project/commands/convert.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/project/commands/upgrade.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/remove/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/remove/cli.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/remove/project.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/remove/space.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/scan/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/scan/cli.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/scan/commands/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/scan/commands/iac.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/space/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/space/cli.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/space/commands/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/space/commands/activate.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/space/commands/update.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/commands/upgrade/cli.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/common/.thothcf.setup.toml +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/common/.thothcf_home.toml +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/common/.thothcf_module.toml +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/common/.thothcf_project.toml +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/common/.thothcf_template_parameters.toml +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/common/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/common/common.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/common/terragrunt/.thothcf_project.toml +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/config/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/config/constants.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/config/default_values.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/config/defaults.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/config/models.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/config/settings.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/config/template_config.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/config/template_configs.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/config/templates.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/config/validation.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/cli_ui.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/commands.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/config.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/azure_devops/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/azure_devops/get_azure_devops.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/azure_devops/pull_request_comments.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/github/get_github.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/github/pull_request_comments.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/integrate_messages_services/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/integrate_messages_services/microsoft_teams.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/integrate_messages_services/sent_message_teams.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/pattern_names.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/pr_comments/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/integrations/pr_comments/pr_comment_publisher.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/logger.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/telemetry.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/core/version_tools.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/domain/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/domain/interfaces/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/domain/models/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/mcp/README.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/mcp/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/mcp/server.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/agentcore/agentcore.json +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/analyzers/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/analyzers/code_reviewer.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/analyzers/context_builder.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/analyzers/report_analyzer.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/analyzers/risk_assessor.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/bedrock_agent_api.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/config/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/config/ai_settings.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/config/decision_rules.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/decision_engine.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/main.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/memory.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/orchestrator.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/pr_decision_publisher.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/providers/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/providers/azure_provider.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/providers/bedrock_agent_provider.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/providers/bedrock_provider.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/providers/ollama_provider.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/providers/openai_provider.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/safety/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/safety/safety_guard.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/strands_agent.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/tracing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/utils/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/utils/cost_tracker.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/utils/fix_patterns.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/utils/fix_prompts.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/utils/formatters.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/ai_review/utils/prompts.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/environment/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/environment/check_environment.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/org_policy_loader.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/blast_radius_service.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/check_origin_version.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/check_project_structure.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/cost_analyzer.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/models/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/models/cloudformation_mapper.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/models/cost_models.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/aws_pricing_client.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/base_pricing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/apigateway_pricing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/bedrock_pricing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/cloudwatch_pricing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/dynamodb_pricing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/ebs_pricing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/ec2_pricing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/ecs_pricing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/eip_pricing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/eks_pricing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/elb_pricing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/free_resources_pricing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/kms_pricing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/lambda_pricing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/msk_pricing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/rds_pricing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/s3_pricing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/secrets_manager_pricing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/pricing/providers/vpc_pricing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/cost/unified_cost_report.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/drift/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/drift/drift_ai.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/drift/drift_history.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/drift/drift_policy.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/drift/drift_report.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/drift/drift_service.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/drift/models.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/risk_assessment.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/project/validate_project_structure.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/check/rule_merger.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/dashboard/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/dashboard/dashboard_service.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/dashboard/data_loader.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/document/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/document/create_documentation.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/document/files_content.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/document/files_scan.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/document/iac_documentation.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/document/iac_grunt_graph.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/document/iac_grunt_info.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_stacks/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_stacks/config_generator.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_stacks/remote_config_generation.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_stacks/stack_service.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_stacks/templates/terragrunt.hcl.j2 +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_template/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_template/config.yaml +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_template/create_code.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_template/create_component.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_template/create_component_service.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_template/create_stacks.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_template/create_template.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_template/files_content.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_template/github_template_loader.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/generate/create_template/project_templates.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/init/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/init/environment/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/init/environment/install_tools.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/init/project/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/init/project/project.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/init/space/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/init/space/example_space.toml +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/init/space/local_registry.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/init/space/space.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/inventory/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/inventory/changelog_parser.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/inventory/inventory_service.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/inventory/models.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/inventory/module_compatibility_service.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/inventory/report_service.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/inventory/schema_compatibility_service.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/inventory/terragrunt_parser.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/inventory/update_versions.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/inventory/version_service.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/mcp/README.md +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/mcp/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/mcp/amazon_q_server.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/mcp/example.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/mcp/service.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/mcp/simple_http_server.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/bootstrap/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/bootstrap/bootstrap_service.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/cleanup/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/cleanup/clean_project.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/cleanup/clean_space.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/convert/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/convert/conversion_service.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/convert/get_project_data.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/convert/post_init.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/convert/project_converter.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/convert/project_defaults.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/convert/set_project_parameters.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/create_terramate/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/create_terramate/create_terramate_stacks.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/create_terramate/detect_changes_stacks.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/create_terramate/manage_terramate_stacks.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/upgrade/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/project/upgrade/upgrade_service.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/compliance_review.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/import_reports.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/models.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/report_parser.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/sarif_output.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scan_history.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scan_service.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scanners/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scanners/checkov.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scanners/kics.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scanners/opa.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scanners/scan_reports.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scanners/scanners.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scanners/terraform_compliance.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scanners/tfsec.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/services/scan/scanners/trivy.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/templates/reports/inventory_report.html +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/templates/reports/inventory_report.js +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/templates/unified_report_styles.css +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/banner.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/create_compliance_html_reports.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/create_html_reports.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/delete_directory.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/fix_report_styling.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/render_scan_report.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/report_html_utils.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/templates/dashboard.html +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/templates/index_report.html +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/templates/individual_report.html +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/templates/simple_report.html +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/templates/unified_report_styles.css +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/templates/unified_scan_report.html +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/templates/unified_simple_report.html +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/common/templates/xunit_report.html +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/crypto.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/manage_backend_resources/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/manage_backend_resources/manage_backend_resources.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/modules_ops/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/modules_ops/terraform_module_details.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/modules_ops/terraform_modules_fetcher.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/platform_utils.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/process_hcl/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/process_hcl/analyze_terraform_plan.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/process_hcl/graph_manager.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/process_hcl/graph_terragrunt_dependencies.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/process_hcl/process_terraform_file.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/process_hcl/risk_analyzing_terraform_plan.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/sync_workspaces/__init__.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/sync_workspaces/sync_terraform_workspaces.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/sync_workspaces/sync_terragrunt_workspaces.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/template_loader.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/utils/thoth_colors.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/src/thothctl/wellcome_banner.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/conftest.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_agentcore_entrypoint.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_aws_pricing_client.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_azure_devops_pr_comments.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_bedrock_pricing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_cdk_language_selection.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_context_steering.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_cost_analyzer.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_cost_models.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_cost_pr_comments.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_dashboard_loading_fix.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_dashboard_service.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_drift.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_drift_detection.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_ec2_pricing.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_github_pr_comments.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_iac_cost_integration.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_inventory_pr_comments.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_kics_scanner.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_mermaid_edge_labels.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_new_cost_providers.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_parallel_scan.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_platform_utils.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_pr_comment_publisher.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_provider_source_url_fix.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_provider_versions.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_scan_pr_comments.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_space_command.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_space_management.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_template_url_fix.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tests/test_terragrunt_parser.py +0 -0
- {thothctl-0.16.4 → thothctl-0.16.7}/tox.ini +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: thothctl
|
|
3
|
-
Version: 0.16.
|
|
3
|
+
Version: 0.16.7
|
|
4
4
|
Summary: A CLI for Developer Control Plane. Accelerate your cloud IaC deployments.
|
|
5
5
|
Project-URL: SourceCode, https://github.com/thothforge/thothctl
|
|
6
6
|
Project-URL: HomePage, https://github.com/thothforge/thothctl
|
|
@@ -441,6 +441,7 @@ Use Trivy to find vulnerabilities (CVE) & misconfigurations (IaC) across code re
|
|
|
441
441
|
## OS Packages
|
|
442
442
|
|
|
443
443
|
- dot or graphviz
|
|
444
|
+
- graph-easy (optional, for `--format boxart` topology view)
|
|
444
445
|
|
|
445
446
|
You can install them with:
|
|
446
447
|
|
|
@@ -448,11 +449,19 @@ You can install them with:
|
|
|
448
449
|
Chocolatey packages Graphviz for **Windows**.
|
|
449
450
|
|
|
450
451
|
`choco install graphviz`
|
|
452
|
+
|
|
453
|
+
> For `graph-easy` on Windows, use WSL: `sudo apt install libgraph-easy-perl`
|
|
454
|
+
|
|
451
455
|
### Linux
|
|
452
456
|
Install packages with apt for Linux/Debian
|
|
453
457
|
-
|
|
454
458
|
```bash
|
|
455
|
-
sudo apt install graphviz -y
|
|
459
|
+
sudo apt install graphviz libgraph-easy-perl -y
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
### macOS
|
|
463
|
+
```bash
|
|
464
|
+
brew install graphviz graph-easy
|
|
456
465
|
```
|
|
457
466
|
- python >= 3.8
|
|
458
467
|
- check: `python --version`
|
|
@@ -483,3 +492,11 @@ pip install --upgrade thothctl
|
|
|
483
492
|
- ~~AI Agent for IaC Security — multi-agent orchestrator, auto-decisions, code fixes, adaptive memory~~
|
|
484
493
|
- Create Stacks and Infrastructure composition engine
|
|
485
494
|
- Strands Agents SDK integration for advanced memory and session management
|
|
495
|
+
- **Intent-to-IaC Generation** — Natural language → governed Terraform/Tofu code, grounded in organizational templates and rules
|
|
496
|
+
- **Organizational Rulesets / Policy Engine** — Custom naming, tagging, security, and architecture rules enforced at generation and CI/CD time (OPA/Rego support)
|
|
497
|
+
- **Compliance Scoring with Evidence** — Scored findings mapped to SOC2/ISO27001/CIS/NIST, code citations, auditor-ready evidence export
|
|
498
|
+
- **Composable Workflow Engine** — Declarative YAML workflows with DAG dependencies for multi-step IaC operations (scan → review → fix → validate → deploy)
|
|
499
|
+
- **Graph-Aware State Visibility** — Parse tfstate into queryable resource graph (SQLite), blast radius analysis, SQL queries across all infrastructure
|
|
500
|
+
- **Architecture Diagram Generation** — Auto-generate Mermaid/Graphviz topology diagrams from IaC, synced with code changes
|
|
501
|
+
|
|
502
|
+
📖 **Full roadmap**: [ThothCTL Roadmap 2026 — Competitive Analysis & Plan](../thothctl_roadmap_2026.md)
|
|
@@ -392,6 +392,7 @@ Use Trivy to find vulnerabilities (CVE) & misconfigurations (IaC) across code re
|
|
|
392
392
|
## OS Packages
|
|
393
393
|
|
|
394
394
|
- dot or graphviz
|
|
395
|
+
- graph-easy (optional, for `--format boxart` topology view)
|
|
395
396
|
|
|
396
397
|
You can install them with:
|
|
397
398
|
|
|
@@ -399,11 +400,19 @@ You can install them with:
|
|
|
399
400
|
Chocolatey packages Graphviz for **Windows**.
|
|
400
401
|
|
|
401
402
|
`choco install graphviz`
|
|
403
|
+
|
|
404
|
+
> For `graph-easy` on Windows, use WSL: `sudo apt install libgraph-easy-perl`
|
|
405
|
+
|
|
402
406
|
### Linux
|
|
403
407
|
Install packages with apt for Linux/Debian
|
|
404
408
|
-
|
|
405
409
|
```bash
|
|
406
|
-
sudo apt install graphviz -y
|
|
410
|
+
sudo apt install graphviz libgraph-easy-perl -y
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
### macOS
|
|
414
|
+
```bash
|
|
415
|
+
brew install graphviz graph-easy
|
|
407
416
|
```
|
|
408
417
|
- python >= 3.8
|
|
409
418
|
- check: `python --version`
|
|
@@ -434,3 +443,11 @@ pip install --upgrade thothctl
|
|
|
434
443
|
- ~~AI Agent for IaC Security — multi-agent orchestrator, auto-decisions, code fixes, adaptive memory~~
|
|
435
444
|
- Create Stacks and Infrastructure composition engine
|
|
436
445
|
- Strands Agents SDK integration for advanced memory and session management
|
|
446
|
+
- **Intent-to-IaC Generation** — Natural language → governed Terraform/Tofu code, grounded in organizational templates and rules
|
|
447
|
+
- **Organizational Rulesets / Policy Engine** — Custom naming, tagging, security, and architecture rules enforced at generation and CI/CD time (OPA/Rego support)
|
|
448
|
+
- **Compliance Scoring with Evidence** — Scored findings mapped to SOC2/ISO27001/CIS/NIST, code citations, auditor-ready evidence export
|
|
449
|
+
- **Composable Workflow Engine** — Declarative YAML workflows with DAG dependencies for multi-step IaC operations (scan → review → fix → validate → deploy)
|
|
450
|
+
- **Graph-Aware State Visibility** — Parse tfstate into queryable resource graph (SQLite), blast radius analysis, SQL queries across all infrastructure
|
|
451
|
+
- **Architecture Diagram Generation** — Auto-generate Mermaid/Graphviz topology diagrams from IaC, synced with code changes
|
|
452
|
+
|
|
453
|
+
📖 **Full roadmap**: [ThothCTL Roadmap 2026 — Competitive Analysis & Plan](../thothctl_roadmap_2026.md)
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# Check Dependencies Command
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The `check deps` command visualizes and analyzes infrastructure dependencies in your Terragrunt projects. It parses the DAG (Directed Acyclic Graph) from `terragrunt dag graph`, calculates component risk scores, and renders the topology in multiple formats.
|
|
6
|
+
|
|
7
|
+
## Usage
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Default: Rich tree with risk percentages
|
|
11
|
+
thothctl check iac -type deps
|
|
12
|
+
|
|
13
|
+
# ASCII box topology (best for terminal sharing)
|
|
14
|
+
thothctl check iac -type deps --format boxart
|
|
15
|
+
|
|
16
|
+
# Interactive HTML in browser (vis.js graph)
|
|
17
|
+
thothctl check iac -type deps --format html
|
|
18
|
+
|
|
19
|
+
# Raw DOT output (pipe to graphviz or other tools)
|
|
20
|
+
thothctl check iac -type deps --format dot
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Output Formats
|
|
24
|
+
|
|
25
|
+
| Format | Description | Use Case |
|
|
26
|
+
|--------|-------------|----------|
|
|
27
|
+
| `tree` | Rich tree with color-coded risk | Default terminal view |
|
|
28
|
+
| `boxart` | ASCII box drawing topology | Copy/paste into docs, Slack, PRs |
|
|
29
|
+
| `html` | Interactive vis.js graph in browser | Presentations, exploration |
|
|
30
|
+
| `dot` | Raw GraphViz DOT | Pipe to `dot`, `neato`, custom tools |
|
|
31
|
+
|
|
32
|
+
### Tree (default)
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
Infrastructure Modules
|
|
36
|
+
└── stacks/observability/network/reachability-analyzer (31.0% risk)
|
|
37
|
+
├── stacks/foundation/network/security-groups (38.5% risk)
|
|
38
|
+
│ └── stacks/foundation/network/vpc (46.5% risk)
|
|
39
|
+
└── stacks/platform/data/rds (42.5% risk)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Boxart
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
┌───────────────┐ ┌──────────────────┐
|
|
46
|
+
│ vpc 47% │ │ security-groups 39% │
|
|
47
|
+
└───────────────┘ └──────────────────┘
|
|
48
|
+
│ │
|
|
49
|
+
▼ ▼
|
|
50
|
+
┌───────────────┐ ┌──────────────────┐
|
|
51
|
+
│ rds 43% │ │ vpc-lattice 34% │
|
|
52
|
+
└───────────────┘ └──────────────────┘
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
For best quality boxart, install `graph-easy`:
|
|
56
|
+
|
|
57
|
+
| OS | Install Command |
|
|
58
|
+
|----|----------------|
|
|
59
|
+
| **Linux (Debian/Ubuntu)** | `sudo apt install libgraph-easy-perl` |
|
|
60
|
+
| **macOS** | `brew install graph-easy` |
|
|
61
|
+
| **Windows** | `choco install graphviz` then use `--format dot \| dot -Tpng -o graph.png` |
|
|
62
|
+
|
|
63
|
+
> **Note**: Without `graph-easy`, ThothCTL uses a built-in Python fallback renderer.
|
|
64
|
+
|
|
65
|
+
### HTML
|
|
66
|
+
|
|
67
|
+
Opens an interactive topology in your default browser with:
|
|
68
|
+
- Hierarchical top-down layout
|
|
69
|
+
- Color-coded nodes (green < 30% risk, orange 30-50%, red > 50%)
|
|
70
|
+
- Hover for full stack path
|
|
71
|
+
- Saved to `Reports/dependency_topology.html`
|
|
72
|
+
|
|
73
|
+
### DOT
|
|
74
|
+
|
|
75
|
+
Outputs raw DOT graph for piping:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# Generate PNG image
|
|
79
|
+
thothctl check iac -type deps --format dot | dot -Tpng -o topology.png
|
|
80
|
+
|
|
81
|
+
# Generate SVG
|
|
82
|
+
thothctl check iac -type deps --format dot | dot -Tsvg -o topology.svg
|
|
83
|
+
|
|
84
|
+
# Open in xdot viewer
|
|
85
|
+
thothctl check iac -type deps --format dot | xdot -
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Prerequisites
|
|
89
|
+
|
|
90
|
+
| Tool | Required | Install |
|
|
91
|
+
|------|----------|---------|
|
|
92
|
+
| `terragrunt` | ✅ Required | [terragrunt.gruntwork.io](https://terragrunt.gruntwork.io/) |
|
|
93
|
+
| `graphviz` | Optional (for `--format dot` piping) | See below |
|
|
94
|
+
| `graph-easy` | Optional (for `--format boxart` enhanced output) | See below |
|
|
95
|
+
|
|
96
|
+
### Installing Graphviz
|
|
97
|
+
|
|
98
|
+
| OS | Command |
|
|
99
|
+
|----|---------|
|
|
100
|
+
| Linux (Debian/Ubuntu) | `sudo apt install graphviz` |
|
|
101
|
+
| macOS | `brew install graphviz` |
|
|
102
|
+
| Windows | `choco install graphviz` |
|
|
103
|
+
|
|
104
|
+
### Installing graph-easy
|
|
105
|
+
|
|
106
|
+
| OS | Command |
|
|
107
|
+
|----|---------|
|
|
108
|
+
| Linux (Debian/Ubuntu) | `sudo apt install libgraph-easy-perl` |
|
|
109
|
+
| macOS | `brew install graph-easy` |
|
|
110
|
+
| Windows (WSL) | `sudo apt install libgraph-easy-perl` |
|
|
111
|
+
|
|
112
|
+
> **Windows native**: `graph-easy` is a Perl tool. On native Windows, use WSL or the `--format html` alternative.
|
|
113
|
+
|
|
114
|
+
## Features
|
|
115
|
+
|
|
116
|
+
- **Risk Assessment**: Each component gets a risk percentage based on fan-in/fan-out degree and dependency depth
|
|
117
|
+
- **Terragrunt Details**: Shows mock_outputs and config_path from `dependency` blocks
|
|
118
|
+
- **Multiple Renderers**: Terminal, ASCII art, browser, and raw DOT
|
|
119
|
+
- **CI/CD Friendly**: `--format dot` for pipeline image generation, `--format boxart` for PR comments
|
|
120
|
+
|
|
121
|
+
## Examples
|
|
122
|
+
|
|
123
|
+
### CI/CD Pipeline — Post topology to PR
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
# Generate boxart for PR comment
|
|
127
|
+
echo '```' > /tmp/deps.md
|
|
128
|
+
thothctl check iac -type deps --format boxart >> /tmp/deps.md
|
|
129
|
+
echo '```' >> /tmp/deps.md
|
|
130
|
+
gh pr comment --body-file /tmp/deps.md
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Generate documentation artifact
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
thothctl check iac -type deps --format html
|
|
137
|
+
# → Opens browser + saves Reports/dependency_topology.html
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Related Commands
|
|
141
|
+
|
|
142
|
+
- [`check blast-radius`](blast-radius.md) — Assess change impact analysis
|
|
143
|
+
- [`check tfplan`](plan.md) — Analyze Terraform plans
|
|
144
|
+
- [`inventory iac`](../inventory/iac.md) — Create dependency inventory
|
|
145
|
+
- [`document iac`](../document/iac.md) — Generate documentation with graphs
|
|
@@ -70,7 +70,8 @@ class CheckIaCCommand(ClickCommand):
|
|
|
70
70
|
elif kwargs['check_type'] == "deps":
|
|
71
71
|
result = self._visualize_dependencies(
|
|
72
72
|
directory=directory,
|
|
73
|
-
dagtool='terragrunt'
|
|
73
|
+
dagtool='terragrunt',
|
|
74
|
+
output_format=kwargs.get('format', 'tree'),
|
|
74
75
|
)
|
|
75
76
|
return result
|
|
76
77
|
elif kwargs['check_type'] == "blast-radius":
|
|
@@ -593,7 +594,7 @@ class CheckIaCCommand(ClickCommand):
|
|
|
593
594
|
|
|
594
595
|
f.write("\n")
|
|
595
596
|
|
|
596
|
-
def _visualize_dependencies(self, directory: str, dagtool: str = 'terragrunt') -> bool:
|
|
597
|
+
def _visualize_dependencies(self, directory: str, dagtool: str = 'terragrunt', output_format: str = 'tree') -> bool:
|
|
597
598
|
"""Visualize infrastructure dependencies using terragrunt graph commands"""
|
|
598
599
|
self.logger.info(f"Visualizing dependencies in {directory} using {dagtool}")
|
|
599
600
|
|
|
@@ -620,21 +621,22 @@ class CheckIaCCommand(ClickCommand):
|
|
|
620
621
|
self.console.print(result.stderr)
|
|
621
622
|
return False
|
|
622
623
|
|
|
623
|
-
# Parse and visualize the DOT graph
|
|
624
624
|
dot_graph = result.stdout
|
|
625
|
-
|
|
626
|
-
#
|
|
625
|
+
|
|
626
|
+
# Route to the appropriate renderer
|
|
627
|
+
if output_format == "dot":
|
|
628
|
+
click.echo(dot_graph)
|
|
629
|
+
return True
|
|
630
|
+
elif output_format == "boxart":
|
|
631
|
+
return self._render_boxart(dot_graph, directory)
|
|
632
|
+
elif output_format == "html":
|
|
633
|
+
return self._render_html_topology(dot_graph, directory)
|
|
634
|
+
|
|
635
|
+
# Default: tree format
|
|
627
636
|
nodes, edges = self._parse_dot_graph(dot_graph)
|
|
628
|
-
|
|
629
|
-
# Calculate risk percentages for each component
|
|
630
637
|
risks = calculate_component_risks(nodes, edges, directory)
|
|
631
|
-
|
|
632
|
-
# Parse terragrunt.hcl files to get dependency details
|
|
633
638
|
dep_info = self._parse_terragrunt_dependencies(directory)
|
|
634
|
-
|
|
635
|
-
# Display the enhanced visualization with risk percentages and dependency info
|
|
636
639
|
self._display_dependency_graph(dot_graph, risks, dep_info)
|
|
637
|
-
|
|
638
640
|
return True
|
|
639
641
|
|
|
640
642
|
except Exception as e:
|
|
@@ -642,6 +644,129 @@ class CheckIaCCommand(ClickCommand):
|
|
|
642
644
|
self.console.print(f"[red]Error: {str(e)}[/red]")
|
|
643
645
|
return False
|
|
644
646
|
|
|
647
|
+
|
|
648
|
+
def _render_boxart(self, dot_graph: str, directory: str) -> bool:
|
|
649
|
+
"""Render dependency graph as ASCII box art using graph-easy or fallback."""
|
|
650
|
+
# Try graph-easy first (best output)
|
|
651
|
+
try:
|
|
652
|
+
result = subprocess.run(
|
|
653
|
+
['graph-easy', '--from=dot', '--as=boxart'],
|
|
654
|
+
input=dot_graph, capture_output=True, text=True, check=True
|
|
655
|
+
)
|
|
656
|
+
self.console.print(Panel("[bold blue]🔄 Dependency Topology[/bold blue]", box=box.ROUNDED))
|
|
657
|
+
click.echo(result.stdout)
|
|
658
|
+
return True
|
|
659
|
+
except (FileNotFoundError, subprocess.CalledProcessError):
|
|
660
|
+
pass
|
|
661
|
+
|
|
662
|
+
# Fallback: pure Python box rendering
|
|
663
|
+
nodes, edges = self._parse_dot_graph(dot_graph)
|
|
664
|
+
risks = calculate_component_risks(nodes, edges, directory)
|
|
665
|
+
|
|
666
|
+
self.console.print(Panel("[bold blue]🔄 Dependency Topology (boxart)[/bold blue]", box=box.ROUNDED))
|
|
667
|
+
self.console.print("[dim]Install graph-easy for better rendering: sudo apt install libgraph-easy-perl[/dim]\n")
|
|
668
|
+
|
|
669
|
+
# Simple layered box drawing
|
|
670
|
+
# Build adjacency: who depends on whom
|
|
671
|
+
dependents = {n: set() for n in nodes}
|
|
672
|
+
for src, tgt in edges:
|
|
673
|
+
if src in dependents:
|
|
674
|
+
dependents[src].add(tgt)
|
|
675
|
+
|
|
676
|
+
# Find layers (topological sort by depth)
|
|
677
|
+
depth = {n: 0 for n in nodes}
|
|
678
|
+
changed = True
|
|
679
|
+
while changed:
|
|
680
|
+
changed = False
|
|
681
|
+
for src, tgt in edges:
|
|
682
|
+
if depth.get(src, 0) <= depth.get(tgt, 0):
|
|
683
|
+
depth[src] = depth[tgt] + 1
|
|
684
|
+
changed = True
|
|
685
|
+
|
|
686
|
+
max_depth = max(depth.values()) if depth else 0
|
|
687
|
+
layers = [[] for _ in range(max_depth + 1)]
|
|
688
|
+
for n, d in depth.items():
|
|
689
|
+
layers[max_depth - d].append(n)
|
|
690
|
+
|
|
691
|
+
# Render boxes per layer
|
|
692
|
+
for i, layer in enumerate(layers):
|
|
693
|
+
if not layer:
|
|
694
|
+
continue
|
|
695
|
+
boxes = []
|
|
696
|
+
for node in layer:
|
|
697
|
+
short = node.split("/")[-1] if "/" in node else node
|
|
698
|
+
risk = risks.get(node, 0)
|
|
699
|
+
boxes.append(f"┌{'─' * (len(short) + 6)}┐")
|
|
700
|
+
boxes.append(f"│ {short} {risk:.0f}% │")
|
|
701
|
+
boxes.append(f"└{'─' * (len(short) + 6)}┘")
|
|
702
|
+
|
|
703
|
+
# Print boxes side by side
|
|
704
|
+
lines_per_box = 3
|
|
705
|
+
row_boxes = [boxes[j:j+lines_per_box] for j in range(0, len(boxes), lines_per_box)]
|
|
706
|
+
for line_idx in range(lines_per_box):
|
|
707
|
+
click.echo(" ".join(b[line_idx] for b in row_boxes))
|
|
708
|
+
|
|
709
|
+
# Print arrows between layers
|
|
710
|
+
if i < len(layers) - 1:
|
|
711
|
+
click.echo(" │")
|
|
712
|
+
click.echo(" ▼")
|
|
713
|
+
|
|
714
|
+
return True
|
|
715
|
+
|
|
716
|
+
def _render_html_topology(self, dot_graph: str, directory: str) -> bool:
|
|
717
|
+
"""Render interactive HTML topology and open in browser."""
|
|
718
|
+
import webbrowser
|
|
719
|
+
from pathlib import Path
|
|
720
|
+
|
|
721
|
+
nodes, edges = self._parse_dot_graph(dot_graph)
|
|
722
|
+
risks = calculate_component_risks(nodes, edges, directory)
|
|
723
|
+
|
|
724
|
+
# Build nodes/edges JSON for vis.js
|
|
725
|
+
vis_nodes = []
|
|
726
|
+
for i, node in enumerate(nodes):
|
|
727
|
+
short = node.split("/")[-1] if "/" in node else node
|
|
728
|
+
risk = risks.get(node, 0)
|
|
729
|
+
color = "#4caf50" if risk < 30 else "#ff9800" if risk < 50 else "#f44336"
|
|
730
|
+
vis_nodes.append(f'{{id: {i}, label: "{short}\\n{risk:.0f}% risk", color: "{color}", title: "{node}"}}')
|
|
731
|
+
|
|
732
|
+
node_idx = {n: i for i, n in enumerate(nodes)}
|
|
733
|
+
vis_edges = []
|
|
734
|
+
for src, tgt in edges:
|
|
735
|
+
if src in node_idx and tgt in node_idx:
|
|
736
|
+
vis_edges.append(f'{{from: {node_idx[src]}, to: {node_idx[tgt]}, arrows: "to"}}')
|
|
737
|
+
|
|
738
|
+
html = f"""<!DOCTYPE html>
|
|
739
|
+
<html><head><title>ThothCTL - Dependency Topology</title>
|
|
740
|
+
<script src="https://unpkg.com/vis-network/standalone/umd/vis-network.min.js"></script>
|
|
741
|
+
<style>
|
|
742
|
+
body {{ margin: 0; font-family: Inter, sans-serif; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); }}
|
|
743
|
+
#graph {{ width: 100vw; height: 100vh; }}
|
|
744
|
+
h1 {{ position: absolute; top: 10px; left: 20px; color: white; font-size: 1.2em; z-index: 10; }}
|
|
745
|
+
</style></head><body>
|
|
746
|
+
<h1>🔄 ThothCTL Dependency Topology</h1>
|
|
747
|
+
<div id="graph"></div>
|
|
748
|
+
<script>
|
|
749
|
+
var nodes = new vis.DataSet([{', '.join(vis_nodes)}]);
|
|
750
|
+
var edges = new vis.DataSet([{', '.join(vis_edges)}]);
|
|
751
|
+
var container = document.getElementById('graph');
|
|
752
|
+
var data = {{ nodes: nodes, edges: edges }};
|
|
753
|
+
var options = {{
|
|
754
|
+
layout: {{ hierarchical: {{ direction: "UD", sortMethod: "directed" }} }},
|
|
755
|
+
physics: false,
|
|
756
|
+
nodes: {{ shape: "box", font: {{ size: 14 }}, margin: 10 }},
|
|
757
|
+
edges: {{ color: "#ffffff80", width: 2 }}
|
|
758
|
+
}};
|
|
759
|
+
new vis.Network(container, data, options);
|
|
760
|
+
</script></body></html>"""
|
|
761
|
+
|
|
762
|
+
out_path = Path(directory) / "Reports" / "dependency_topology.html"
|
|
763
|
+
out_path.parent.mkdir(parents=True, exist_ok=True)
|
|
764
|
+
out_path.write_text(html)
|
|
765
|
+
|
|
766
|
+
self.console.print(f"[green]✅ HTML topology saved to {out_path}[/green]")
|
|
767
|
+
webbrowser.open(f"file://{out_path.resolve()}")
|
|
768
|
+
return True
|
|
769
|
+
|
|
645
770
|
def _parse_terragrunt_dependencies(self, directory: str) -> Dict[str, Dict]:
|
|
646
771
|
"""Parse terragrunt.hcl files to extract dependency and mock_outputs information.
|
|
647
772
|
|
|
@@ -721,6 +846,13 @@ class CheckIaCCommand(ClickCommand):
|
|
|
721
846
|
# Display dependency details if available
|
|
722
847
|
if dep_info:
|
|
723
848
|
self._display_dependency_details(dep_info)
|
|
849
|
+
|
|
850
|
+
# Display summary
|
|
851
|
+
self.console.print(f"\n[green]✅ Found {len(nodes)} modules with {len(edges)} dependencies[/green]")
|
|
852
|
+
|
|
853
|
+
# Display risk legend
|
|
854
|
+
if risks:
|
|
855
|
+
self._display_risk_legend()
|
|
724
856
|
|
|
725
857
|
def _display_dependency_details(self, dep_info: Dict) -> None:
|
|
726
858
|
"""Display detailed dependency information from terragrunt.hcl files.
|
|
@@ -749,14 +881,6 @@ class CheckIaCCommand(ClickCommand):
|
|
|
749
881
|
value_str = value_str[:47] + "..."
|
|
750
882
|
self.console.print(f" • {key} = [green]{value_str}[/green]")
|
|
751
883
|
|
|
752
|
-
|
|
753
|
-
# Display summary
|
|
754
|
-
self.console.print(f"\n[green]✅ Found {len(nodes)} modules with {len(edges)} dependencies[/green]")
|
|
755
|
-
|
|
756
|
-
# Display risk legend
|
|
757
|
-
if risks:
|
|
758
|
-
self._display_risk_legend()
|
|
759
|
-
|
|
760
884
|
def _display_risk_legend(self) -> None:
|
|
761
885
|
"""Display a legend for risk levels"""
|
|
762
886
|
legend = Table(show_header=False, box=box.SIMPLE)
|
|
@@ -1428,6 +1552,12 @@ cli = CheckIaCCommand.as_click_command(
|
|
|
1428
1552
|
type=click.Choice(["tfplan", "deps", "blast-radius", "cost-analysis", "drift"], case_sensitive=True),
|
|
1429
1553
|
default="tfplan",
|
|
1430
1554
|
),
|
|
1555
|
+
click.option(
|
|
1556
|
+
'--format',
|
|
1557
|
+
type=click.Choice(['tree', 'boxart', 'html', 'dot'], case_sensitive=True),
|
|
1558
|
+
default='tree',
|
|
1559
|
+
help='Output format for deps visualization (tree: Rich tree, boxart: ASCII boxes, html: interactive browser, dot: raw DOT)'
|
|
1560
|
+
),
|
|
1431
1561
|
click.option(
|
|
1432
1562
|
'--plan-file',
|
|
1433
1563
|
help="Path to terraform plan JSON file (for blast-radius)",
|
|
@@ -106,19 +106,23 @@ class AIReviewAgent:
|
|
|
106
106
|
|
|
107
107
|
# Use compact prompt for local models (Ollama) to fit VRAM constraints
|
|
108
108
|
if self._provider.name == "ollama":
|
|
109
|
-
#
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
109
|
+
# qwen models handle JSON well — use direct approach
|
|
110
|
+
if "qwen" in self._provider.model.lower():
|
|
111
|
+
fallback = (lambda: self._basic_analysis(ctx.scan_results, basic_risk)) if basic_risk else self._empty_result
|
|
112
|
+
result = self._call_ai(SYSTEM_COMPACT, formatted, "analyze_directory", fallback=fallback)
|
|
113
|
+
else:
|
|
114
|
+
# Other models (mistral, gemma): hybrid scan data + LLM recommendations
|
|
115
|
+
base_result = self._basic_analysis(ctx.scan_results, basic_risk) if basic_risk else self._empty_result()
|
|
116
|
+
try:
|
|
117
|
+
ai_response = self._provider.analyze(SYSTEM_COMPACT, formatted)
|
|
118
|
+
if isinstance(ai_response, dict) and ai_response.get("recommendations"):
|
|
119
|
+
base_result["recommendations"] = ai_response["recommendations"]
|
|
120
|
+
base_result["architecture_assessment"] = ai_response.get("architecture_assessment", "")
|
|
121
|
+
elif isinstance(ai_response, dict) and ai_response.get("_raw_text"):
|
|
122
|
+
base_result["recommendations"] = [ai_response["_raw_text"][:2000]]
|
|
123
|
+
except Exception as e:
|
|
124
|
+
logger.debug(f"LLM recommendations failed: {e}")
|
|
125
|
+
result = base_result
|
|
122
126
|
else:
|
|
123
127
|
system_prompt = SYSTEM_FULL_ANALYSIS
|
|
124
128
|
fallback = (lambda: self._basic_analysis(ctx.scan_results, basic_risk)) if basic_risk else self._empty_result
|
|
@@ -175,31 +179,63 @@ class AIReviewAgent:
|
|
|
175
179
|
return self._pattern_fixes(scan_results, code_files, severity_filter)
|
|
176
180
|
|
|
177
181
|
content = self._format_fix_request(scan_results, code_files, severity_filter)
|
|
178
|
-
|
|
182
|
+
|
|
183
|
+
# Use compact fix prompt for Ollama
|
|
184
|
+
if self._provider.name == "ollama":
|
|
185
|
+
fix_prompt = (
|
|
186
|
+
"IaC fix generator. Generate fixes for the STACK files (where modules are called), "
|
|
187
|
+
"NOT inside .terraform/modules/. Add missing parameters to module blocks.\n"
|
|
188
|
+
"Respond with JSON: {\"fixes\":[{\"fix_id\":\"fix_001\",\"finding_id\":\"check_id\","
|
|
189
|
+
"\"file\":\"stack main.tf path\",\"severity\":\"HIGH\",\"description\":\"what\","
|
|
190
|
+
"\"original\":\"exact module block code\",\"replacement\":\"fixed module block with new params\"}],"
|
|
191
|
+
"\"summary\":{\"total_findings\":N,\"fixes_generated\":N,\"skipped\":N}}"
|
|
192
|
+
)
|
|
193
|
+
else:
|
|
194
|
+
fix_prompt = SYSTEM_FIX_GENERATOR
|
|
195
|
+
|
|
196
|
+
result = self._call_ai(fix_prompt, content, "generate_fixes",
|
|
179
197
|
fallback=lambda: self._pattern_fixes(scan_results, code_files, severity_filter))
|
|
180
198
|
s.set_attribute("fixes_generated", len(result.get("fixes", [])))
|
|
181
199
|
return result
|
|
182
200
|
|
|
183
201
|
def _format_fix_request(self, scan_results: Dict, code_files: Dict,
|
|
184
202
|
severity_filter: str = None) -> str:
|
|
185
|
-
"""Format findings + code into a fix request for the AI."""
|
|
203
|
+
"""Format findings + code + org policy into a fix request for the AI."""
|
|
186
204
|
severity_order = {"CRITICAL": 0, "HIGH": 1, "MEDIUM": 2, "LOW": 3}
|
|
187
205
|
min_sev = severity_order.get((severity_filter or "LOW").upper(), 3)
|
|
188
206
|
|
|
189
|
-
sections = [
|
|
207
|
+
sections = []
|
|
208
|
+
|
|
209
|
+
# Add org policy context if available
|
|
210
|
+
org_rules = self._load_org_policy_context()
|
|
211
|
+
if org_rules:
|
|
212
|
+
sections.append("# Organization Rules (fixes MUST comply)\n")
|
|
213
|
+
sections.append(org_rules)
|
|
214
|
+
sections.append("")
|
|
215
|
+
|
|
216
|
+
sections.append("# Findings to Fix\n")
|
|
190
217
|
for tool, data in scan_results.get("tools", {}).items():
|
|
191
218
|
for f in data.get("findings", []):
|
|
192
219
|
sev = f.get("severity", "MEDIUM").upper()
|
|
193
220
|
if severity_order.get(sev, 2) <= min_sev:
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
221
|
+
file_path = f.get("file", "")
|
|
222
|
+
# Map .terraform/modules/ findings to the stack module call
|
|
223
|
+
if ".terraform/modules/" in file_path or ".terraform\\modules\\" in file_path:
|
|
224
|
+
resource = f.get("resource", "")
|
|
225
|
+
sections.append(
|
|
226
|
+
f"- [{sev}] {f.get('check_id', '')}: {f.get('check_name', '')} "
|
|
227
|
+
f"resource={resource} (fix in the MODULE CALL, not module source)"
|
|
228
|
+
)
|
|
229
|
+
else:
|
|
230
|
+
sections.append(
|
|
231
|
+
f"- [{sev}] {f.get('check_id', '')}: {f.get('check_name', '')} "
|
|
232
|
+
f"in {file_path} resource={f.get('resource', '')}"
|
|
233
|
+
)
|
|
198
234
|
if f.get("guideline"):
|
|
199
235
|
sections.append(f" Guideline: {f['guideline']}")
|
|
200
236
|
|
|
201
237
|
sections.append("\n# Affected Code Files\n")
|
|
202
|
-
char_budget = 25000
|
|
238
|
+
char_budget = 25000 if self._provider.name != "ollama" else 8000
|
|
203
239
|
used = 0
|
|
204
240
|
for path, content in sorted(code_files.items()):
|
|
205
241
|
entry = f"\n--- {path} ---\n{content}\n"
|
|
@@ -211,6 +247,32 @@ class AIReviewAgent:
|
|
|
211
247
|
|
|
212
248
|
return "\n".join(sections)
|
|
213
249
|
|
|
250
|
+
|
|
251
|
+
def _load_org_policy_context(self) -> str:
|
|
252
|
+
"""Load org policy rules as context for fix generation."""
|
|
253
|
+
from ..check.org_policy_loader import get_org_policy_path
|
|
254
|
+
org_path = get_org_policy_path()
|
|
255
|
+
if not org_path:
|
|
256
|
+
return ""
|
|
257
|
+
|
|
258
|
+
parts = []
|
|
259
|
+
rules_file = Path(org_path) / "rules" / "base.toml"
|
|
260
|
+
if rules_file.exists():
|
|
261
|
+
content = rules_file.read_text()
|
|
262
|
+
# Extract key rules compactly
|
|
263
|
+
for line in content.splitlines():
|
|
264
|
+
if any(k in line for k in ["required_tags", "pattern", "public_ingress", "enforcement"]):
|
|
265
|
+
parts.append(line.strip())
|
|
266
|
+
|
|
267
|
+
# Add naming/tagging rego summaries
|
|
268
|
+
for rego in (Path(org_path) / "shared" / "policy").glob("*.rego"):
|
|
269
|
+
text = rego.read_text()
|
|
270
|
+
for line in text.splitlines():
|
|
271
|
+
if line.startswith(("required_tags", "naming_pattern", "deny[", "warn[")):
|
|
272
|
+
parts.append(line.strip())
|
|
273
|
+
|
|
274
|
+
return "\n".join(parts[:15]) # Cap at 15 lines to save tokens
|
|
275
|
+
|
|
214
276
|
def _fixes_from_analysis(self, analysis: Dict, directory: str) -> Dict:
|
|
215
277
|
"""Extract fix suggestions from an existing AI analysis."""
|
|
216
278
|
fixes = []
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
# Check Dependencies Command
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
The `check deps` command visualizes and analyzes dependencies in your Infrastructure as Code projects.
|
|
6
|
-
|
|
7
|
-
## Usage
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
# Basic dependency check
|
|
11
|
-
thothctl check iac -type deps
|
|
12
|
-
|
|
13
|
-
# With recursive search
|
|
14
|
-
thothctl check iac --recursive -type deps
|
|
15
|
-
|
|
16
|
-
# Generate dependency graph
|
|
17
|
-
thothctl check iac -type deps --dependencies
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
## Features
|
|
21
|
-
|
|
22
|
-
- **Dependency Visualization**: Generate ASCII and SVG dependency graphs
|
|
23
|
-
- **Terragrunt Integration**: Analyze terragrunt.hcl dependencies
|
|
24
|
-
- **Recursive Analysis**: Process multiple directories
|
|
25
|
-
- **Graph Generation**: Create visual dependency maps
|
|
26
|
-
|
|
27
|
-
## Output
|
|
28
|
-
|
|
29
|
-
The command generates:
|
|
30
|
-
- ASCII dependency tree in terminal
|
|
31
|
-
- SVG graph files for visual representation
|
|
32
|
-
- Dependency analysis reports
|
|
33
|
-
|
|
34
|
-
## Examples
|
|
35
|
-
|
|
36
|
-
### Basic Dependency Analysis
|
|
37
|
-
```bash
|
|
38
|
-
thothctl check iac -type deps
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### Generate Visual Graph
|
|
42
|
-
```bash
|
|
43
|
-
thothctl check iac -type deps --dependencies
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
## Related Commands
|
|
47
|
-
|
|
48
|
-
- [`check tfplan`](plan.md) - Analyze Terraform plans
|
|
49
|
-
- [`check blast-radius`](blast-radius.md) - Assess change impact
|
|
50
|
-
- [`inventory iac`](../inventory/iac.md) - Create dependency inventory
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|