thothctl 0.18.8__tar.gz → 0.19.0__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.18.8 → thothctl-0.19.0}/PKG-INFO +1 -1
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/dashboard/dashboard_service.py +53 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/dashboard/data_loader.py +207 -8
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/inventory/inventory_service.py +20 -19
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/inventory/report_service.py +205 -33
- thothctl-0.19.0/src/thothctl/utils/common/templates/dashboard.html +828 -0
- thothctl-0.19.0/src/thothctl/version.py +2 -0
- thothctl-0.18.8/src/thothctl/utils/common/templates/dashboard.html +0 -254
- thothctl-0.18.8/src/thothctl/version.py +0 -2
- {thothctl-0.18.8 → thothctl-0.19.0}/.devcontainer/Dockerfile +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/.devcontainer/README.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/.devcontainer/devcontainer.json +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/.github/workflows/docs.yml +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/.github/workflows/python-publish.yml +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/.gitignore +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/.pre-commit-config.yaml +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/.readthedocs.yaml +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/Dockerfile +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/LICENSE +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/README.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/catalog/catalog-info.yaml +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/dashboard/README.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/ai-review/README.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/ai-review/agent_specifications.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/ai-review/agentcore.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/check/blast-radius.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/check/check_environment.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/check/check_iac.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/check/check_overview.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/check/check_project_iac.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/check/check_space.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/check/cost-analysis-quick-reference.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/check/cost-analysis.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/check/customizing_rules.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/check/deps-advanced.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/check/deps.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/check/drift-detection.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/check/plan.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/document/customizing_docs.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/document/document_iac.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/document/document_overview.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/document/iac.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/document/use_cases.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/generate/generate_components.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/generate/generate_stacks.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/init/init.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/init/init_space.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/inventory/CHANGELOG.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/inventory/frameworks/terraform.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/inventory/frameworks/terragrunt.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/inventory/iac.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/inventory/inventory_iac.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/inventory/inventory_overview.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/list/list_overview.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/list/list_projects.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/list/list_spaces.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/mcp/mcp.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/project/iac.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/project/project_cleanup.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/project/project_convert.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/project/project_overview.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/project/project_upgrade.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/project/use_cases.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/remove/remove_overview.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/remove/remove_project.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/remove/remove_space.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/scan/iac.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/scan/scan_iac.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/scan/scan_overview.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/scan/use_cases.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/commands/upgrade/upgrade_overview.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/concepts.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/cross_platform_support.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/framework_architecture.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/infrasctructure_composition.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/policy_as_code.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/roadmap_fdi.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/software_architecture.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/space_configuration.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/use_cases/README.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/use_cases/ai_dlc.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/use_cases/check_command.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/use_cases/devsecops_quickstart.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/use_cases/devsecops_sdlc.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/use_cases/inventory_command.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/use_cases/platform_engineering_templates.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/use_cases/space_management.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/framework/use_cases/tasks/create_template.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/iac_devsecops_use_case.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/automate_tasks_command.png +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/commnad_init.png +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/create_component.gif +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/create_inventory.gif +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/doc_command.png +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/document_project_code.gif +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/framework/thothforge-framework.svg +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/framework/thothfr.png +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/iacpeerbot_summary.png +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/icon-light.png +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/icon.png +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/init_project.gif +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/inventory_command.png +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/notification_img.png +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/report_dependencies.png +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/report_dependencies_summary.png +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/restore_inventory_version.gif +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/reuse_project_pattern.gif +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/scan_code.gif +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/scan_command.png +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/stable/scan_report_example.png +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/sync_wk_command.png +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/transform_command.png +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/update_inventory_version.gif +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/validate_command.png +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/validate_environment.gif +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/img/validate_project.gif +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/includes/abbreviations.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/index.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/installation/devcontainer_setup.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/installation/linux_installation.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/installation/windows_installation.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/javascripts/tablesort.js +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/mcp.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/navigation.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/quick_start.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/requirements.txt +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/stylesheets/extra-enhanced.css +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/stylesheets/extra.css +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/telemetry.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/template_engine/cli_commands_audit.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/template_engine/for_developers.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/template_engine/for_platform_engineers.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/template_engine/github_templates.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/template_engine/template_engine.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/troubleshooting/linux_troubleshooting.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/troubleshooting/macos_troubleshooting.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/troubleshooting/troubleshooting.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/docs/troubleshooting/windows_troubleshooting.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/mkdocs.yaml +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/pyproject.toml +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/scripts/run_mcp_server.sh +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/application/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/autocomplete.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/cli.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/ai_review/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/ai_review/cli.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/ai_review/commands/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/ai_review/commands/analyze.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/ai_review/commands/apply_fix.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/ai_review/commands/configure.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/ai_review/commands/configure_decisions.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/ai_review/commands/decide.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/ai_review/commands/history.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/ai_review/commands/improve.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/ai_review/commands/orchestrate.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/ai_review/commands/override.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/ai_review/commands/report.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/ai_review/commands/serve.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/check/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/check/cli.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/check/commands/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/check/commands/environment.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/check/commands/iac.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/check/commands/project/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/check/commands/project/iac.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/check/commands/project.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/dashboard/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/dashboard/cli.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/dashboard/commands/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/dashboard/commands/launch.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/document/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/document/cli.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/document/commands/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/document/commands/iac.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/generate/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/generate/cli.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/generate/commands/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/generate/commands/component.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/generate/commands/stacks.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/init/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/init/cli.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/init/commands/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/init/commands/env.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/init/commands/project.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/init/commands/space.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/init/commands/template.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/inventory/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/inventory/cli.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/inventory/commands/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/inventory/commands/check.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/inventory/commands/iac.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/list/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/list/cli.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/list/commands/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/list/commands/projects.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/list/commands/spaces.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/mcp/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/mcp/cli.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/mcp/commands/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/mcp/commands/register.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/mcp/commands/server.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/mcp/commands/status.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/mcp/commands/stop.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/project/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/project/cli.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/project/commands/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/project/commands/bootstrap.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/project/commands/cleanup.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/project/commands/convert.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/project/commands/upgrade.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/remove/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/remove/cli.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/remove/project.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/remove/space.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/scan/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/scan/cli.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/scan/commands/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/scan/commands/iac.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/space/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/space/cli.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/space/commands/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/space/commands/activate.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/space/commands/show.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/space/commands/update.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/commands/upgrade/cli.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/common/.thothcf.setup.toml +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/common/.thothcf_home.toml +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/common/.thothcf_module.toml +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/common/.thothcf_project.toml +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/common/.thothcf_template_parameters.toml +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/common/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/common/common.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/common/terragrunt/.thothcf_project.toml +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/config/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/config/constants.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/config/default_values.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/config/defaults.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/config/models.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/config/settings.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/config/template_config.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/config/template_configs.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/config/templates.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/config/validation.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/core/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/core/cli_ui.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/core/commands.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/core/config.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/core/integrations/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/core/integrations/azure_devops/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/core/integrations/azure_devops/get_azure_devops.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/core/integrations/azure_devops/pull_request_comments.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/core/integrations/github/get_github.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/core/integrations/github/pull_request_comments.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/core/integrations/integrate_messages_services/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/core/integrations/integrate_messages_services/microsoft_teams.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/core/integrations/integrate_messages_services/sent_message_teams.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/core/integrations/pattern_names.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/core/integrations/pr_comments/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/core/integrations/pr_comments/pr_comment_publisher.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/core/logger.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/core/telemetry.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/core/version_tools.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/domain/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/domain/interfaces/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/domain/models/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/mcp/README.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/mcp/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/mcp/server.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/agentcore/agentcore.json +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/ai_agent.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/analyzers/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/analyzers/code_reviewer.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/analyzers/context_builder.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/analyzers/report_analyzer.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/analyzers/risk_assessor.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/bedrock_agent_api.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/config/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/config/ai_settings.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/config/decision_rules.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/decision_engine.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/main.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/memory.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/orchestrator.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/pr_decision_publisher.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/providers/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/providers/azure_provider.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/providers/bedrock_agent_provider.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/providers/bedrock_provider.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/providers/ollama_provider.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/providers/openai_provider.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/safety/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/safety/safety_guard.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/strands_agent.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/tracing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/utils/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/utils/cost_tracker.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/utils/fix_patterns.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/utils/fix_prompts.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/utils/formatters.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/ai_review/utils/prompts.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/environment/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/environment/check_environment.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/org_policy_loader.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/blast_radius_service.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/check_origin_version.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/check_project_structure.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/cost_analyzer.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/models/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/models/cloudformation_mapper.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/models/cost_models.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/aws_pricing_client.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/base_pricing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/providers/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/providers/apigateway_pricing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/providers/bedrock_pricing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/providers/cloudwatch_pricing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/providers/dynamodb_pricing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/providers/ebs_pricing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/providers/ec2_pricing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/providers/ecs_pricing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/providers/eip_pricing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/providers/eks_pricing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/providers/elb_pricing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/providers/free_resources_pricing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/providers/kms_pricing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/providers/lambda_pricing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/providers/msk_pricing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/providers/rds_pricing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/providers/s3_pricing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/providers/secrets_manager_pricing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/pricing/providers/vpc_pricing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/cost/unified_cost_report.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/drift/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/drift/drift_ai.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/drift/drift_history.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/drift/drift_policy.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/drift/drift_report.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/drift/drift_service.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/drift/models.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/risk_assessment.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/project/validate_project_structure.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/rule_merger.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/check/stack_optimizer/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/dashboard/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/document/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/document/create_documentation.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/document/files_content.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/document/files_scan.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/document/iac_documentation.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/document/iac_grunt_graph.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/document/iac_grunt_info.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/generate/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/generate/create_stacks/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/generate/create_stacks/config_generator.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/generate/create_stacks/remote_config_generation.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/generate/create_stacks/stack_service.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/generate/create_stacks/templates/terragrunt.hcl.j2 +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/generate/create_template/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/generate/create_template/config.yaml +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/generate/create_template/create_code.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/generate/create_template/create_component.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/generate/create_template/create_component_service.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/generate/create_template/create_stacks.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/generate/create_template/create_template.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/generate/create_template/files_content.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/generate/create_template/github_template_loader.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/generate/create_template/project_templates.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/init/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/init/environment/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/init/environment/install_tools.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/init/project/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/init/project/project.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/init/space/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/init/space/example_space.toml +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/init/space/local_registry.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/init/space/space.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/inventory/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/inventory/changelog_parser.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/inventory/models.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/inventory/module_compatibility_service.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/inventory/schema_compatibility_service.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/inventory/terragrunt_parser.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/inventory/update_versions.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/inventory/version_service.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/mcp/README.md +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/mcp/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/mcp/simple_http_server.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/mcp/stdio_server.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/project/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/project/bootstrap/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/project/bootstrap/bootstrap_service.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/project/cleanup/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/project/cleanup/clean_project.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/project/cleanup/clean_space.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/project/convert/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/project/convert/conversion_service.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/project/convert/get_project_data.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/project/convert/post_init.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/project/convert/project_converter.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/project/convert/project_defaults.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/project/convert/set_project_parameters.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/project/create_terramate/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/project/create_terramate/create_terramate_stacks.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/project/create_terramate/detect_changes_stacks.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/project/create_terramate/manage_terramate_stacks.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/project/upgrade/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/project/upgrade/upgrade_service.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/scan/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/scan/compliance_review.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/scan/import_reports.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/scan/models.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/scan/report_parser.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/scan/sarif_output.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/scan/scan_history.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/scan/scan_service.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/scan/scanners/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/scan/scanners/checkov.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/scan/scanners/kics.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/scan/scanners/opa.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/scan/scanners/scan_reports.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/scan/scanners/scanners.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/scan/scanners/terraform_compliance.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/scan/scanners/tfsec.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/services/scan/scanners/trivy.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/templates/reports/inventory_report.html +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/templates/reports/inventory_report.js +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/templates/unified_report_styles.css +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/banner.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/common/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/common/create_compliance_html_reports.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/common/create_html_reports.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/common/delete_directory.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/common/fix_report_styling.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/common/render_scan_report.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/common/report_html_utils.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/common/templates/index_report.html +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/common/templates/individual_report.html +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/common/templates/simple_report.html +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/common/templates/unified_report_styles.css +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/common/templates/unified_scan_report.html +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/common/templates/unified_simple_report.html +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/common/templates/xunit_report.html +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/crypto.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/manage_backend_resources/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/manage_backend_resources/manage_backend_resources.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/modules_ops/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/modules_ops/terraform_module_details.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/modules_ops/terraform_modules_fetcher.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/platform_utils.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/process_hcl/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/process_hcl/analyze_terraform_plan.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/process_hcl/graph_manager.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/process_hcl/graph_terragrunt_dependencies.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/process_hcl/process_terraform_file.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/process_hcl/risk_analyzing_terraform_plan.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/sync_workspaces/__init__.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/sync_workspaces/sync_terraform_workspaces.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/sync_workspaces/sync_terragrunt_workspaces.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/template_loader.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/utils/thoth_colors.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/src/thothctl/wellcome_banner.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/conftest.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_agentcore_entrypoint.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_aws_pricing_client.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_azure_devops_pr_comments.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_bedrock_pricing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_cdk_language_selection.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_context_steering.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_cost_analyzer.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_cost_models.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_cost_pr_comments.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_dashboard_loading_fix.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_dashboard_service.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_drift.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_drift_detection.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_ec2_pricing.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_github_pr_comments.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_iac_cost_integration.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_inventory_pr_comments.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_kics_scanner.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_mermaid_edge_labels.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_new_cost_providers.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_parallel_scan.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_platform_utils.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_pr_comment_publisher.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_provider_source_url_fix.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_provider_versions.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_scan_pr_comments.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_space_command.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_space_management.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_stack_optimizer.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_template_url_fix.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tests/test_terragrunt_parser.py +0 -0
- {thothctl-0.18.8 → thothctl-0.19.0}/tox.ini +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: thothctl
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.19.0
|
|
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
|
|
@@ -47,6 +47,16 @@ class DashboardService:
|
|
|
47
47
|
except Exception as e:
|
|
48
48
|
logger.error(f"Inventory API error: {e}")
|
|
49
49
|
raise HTTPException(status_code=500, detail=str(e))
|
|
50
|
+
|
|
51
|
+
@self.app.get("/api/sbom")
|
|
52
|
+
async def api_sbom():
|
|
53
|
+
"""API endpoint for CycloneDX SBOM data."""
|
|
54
|
+
try:
|
|
55
|
+
result = self.data_loader.get_sbom_data()
|
|
56
|
+
return result
|
|
57
|
+
except Exception as e:
|
|
58
|
+
logger.error(f"SBOM API error: {e}")
|
|
59
|
+
raise HTTPException(status_code=500, detail=str(e))
|
|
50
60
|
|
|
51
61
|
@self.app.get("/api/scan-results")
|
|
52
62
|
async def api_scan_results():
|
|
@@ -59,6 +69,49 @@ class DashboardService:
|
|
|
59
69
|
except Exception as e:
|
|
60
70
|
logger.error(f"Scan results API error: {e}")
|
|
61
71
|
raise HTTPException(status_code=500, detail=str(e))
|
|
72
|
+
|
|
73
|
+
@self.app.get("/api/findings")
|
|
74
|
+
async def api_findings(
|
|
75
|
+
tool: str = None,
|
|
76
|
+
severity: str = None,
|
|
77
|
+
search: str = None,
|
|
78
|
+
limit: int = 100,
|
|
79
|
+
offset: int = 0,
|
|
80
|
+
):
|
|
81
|
+
"""API endpoint for individual findings with filtering."""
|
|
82
|
+
try:
|
|
83
|
+
result = self.data_loader.get_findings(
|
|
84
|
+
tool=tool, severity=severity, search=search,
|
|
85
|
+
limit=limit, offset=offset,
|
|
86
|
+
)
|
|
87
|
+
return result
|
|
88
|
+
except Exception as e:
|
|
89
|
+
logger.error(f"Findings API error: {e}")
|
|
90
|
+
raise HTTPException(status_code=500, detail=str(e))
|
|
91
|
+
|
|
92
|
+
@self.app.get("/api/reports/{report_path:path}")
|
|
93
|
+
async def api_serve_report(report_path: str):
|
|
94
|
+
"""Serve individual HTML report files for iframe viewing."""
|
|
95
|
+
from fastapi.responses import FileResponse
|
|
96
|
+
import os
|
|
97
|
+
|
|
98
|
+
# Resolve path safely within the project directory
|
|
99
|
+
full_path = Path(os.getcwd()) / report_path
|
|
100
|
+
# Security: ensure the resolved path is within the project
|
|
101
|
+
try:
|
|
102
|
+
full_path = full_path.resolve()
|
|
103
|
+
cwd = Path(os.getcwd()).resolve()
|
|
104
|
+
if not str(full_path).startswith(str(cwd)):
|
|
105
|
+
raise HTTPException(status_code=403, detail="Access denied")
|
|
106
|
+
except Exception:
|
|
107
|
+
raise HTTPException(status_code=403, detail="Invalid path")
|
|
108
|
+
|
|
109
|
+
if not full_path.exists() or not full_path.is_file():
|
|
110
|
+
raise HTTPException(status_code=404, detail="Report not found")
|
|
111
|
+
if full_path.suffix not in (".html", ".json", ".xml", ".sarif"):
|
|
112
|
+
raise HTTPException(status_code=403, detail="File type not allowed")
|
|
113
|
+
|
|
114
|
+
return FileResponse(str(full_path), media_type="text/html" if full_path.suffix == ".html" else "application/json")
|
|
62
115
|
|
|
63
116
|
@self.app.get("/api/cost-analysis")
|
|
64
117
|
async def api_cost_analysis():
|
|
@@ -55,6 +55,31 @@ class DashboardDataLoader:
|
|
|
55
55
|
"command": "ls -la Reports/"
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
def get_sbom_data(self) -> Dict[str, Any]:
|
|
59
|
+
"""Load CycloneDX SBOM JSON for detailed component browsing."""
|
|
60
|
+
cache_key = "sbom"
|
|
61
|
+
if self._is_cache_valid(cache_key):
|
|
62
|
+
return self.cache[cache_key]["data"]
|
|
63
|
+
|
|
64
|
+
try:
|
|
65
|
+
sbom_files = list(self.reports_dir.glob("**/InventoryIaC_cyclonedx_*.json"))
|
|
66
|
+
if not sbom_files:
|
|
67
|
+
return {
|
|
68
|
+
"error": "No SBOM data found",
|
|
69
|
+
"action": "Run inventory to generate CycloneDX SBOM",
|
|
70
|
+
"command": "thothctl inventory iac --check-versions"
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
latest_file = max(sbom_files, key=lambda f: f.stat().st_mtime)
|
|
74
|
+
with open(latest_file, "r", encoding="utf-8") as f:
|
|
75
|
+
data = json.load(f)
|
|
76
|
+
|
|
77
|
+
self._cache_data(cache_key, data)
|
|
78
|
+
return data
|
|
79
|
+
|
|
80
|
+
except Exception as e:
|
|
81
|
+
return {"error": f"Error loading SBOM: {str(e)}"}
|
|
82
|
+
|
|
58
83
|
def get_scan_results(self) -> Dict[str, Any]:
|
|
59
84
|
"""Load from existing scan report files."""
|
|
60
85
|
cache_key = "scan_results"
|
|
@@ -62,19 +87,31 @@ class DashboardDataLoader:
|
|
|
62
87
|
return self.cache[cache_key]["data"]
|
|
63
88
|
|
|
64
89
|
try:
|
|
65
|
-
results = {"reports": [], "summary": {"total_issues": 0}}
|
|
90
|
+
results = {"reports": [], "summary": {"total_issues": 0}, "tools": []}
|
|
66
91
|
|
|
67
92
|
html_reports = list(self.reports_dir.rglob("*.html"))
|
|
68
93
|
xml_reports = list(self.reports_dir.rglob("*.xml"))
|
|
69
94
|
|
|
95
|
+
# Track which tools have reports
|
|
96
|
+
tools_found = set()
|
|
97
|
+
|
|
70
98
|
for html_file in html_reports:
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
99
|
+
rel_path = str(html_file.relative_to(self.base_dir))
|
|
100
|
+
# Determine tool from path
|
|
101
|
+
tool = "other"
|
|
102
|
+
for t in ("checkov", "trivy", "kics", "opa", "terraform-compliance"):
|
|
103
|
+
if t in rel_path:
|
|
104
|
+
tool = t
|
|
105
|
+
tools_found.add(t)
|
|
106
|
+
break
|
|
107
|
+
|
|
108
|
+
results["reports"].append({
|
|
109
|
+
"file": rel_path,
|
|
110
|
+
"type": "html",
|
|
111
|
+
"tool": tool,
|
|
112
|
+
"timestamp": datetime.fromtimestamp(html_file.stat().st_mtime).isoformat(),
|
|
113
|
+
"size": html_file.stat().st_size
|
|
114
|
+
})
|
|
78
115
|
|
|
79
116
|
for xml_file in xml_reports:
|
|
80
117
|
try:
|
|
@@ -86,6 +123,8 @@ class DashboardDataLoader:
|
|
|
86
123
|
except:
|
|
87
124
|
pass
|
|
88
125
|
|
|
126
|
+
results["tools"] = sorted(tools_found)
|
|
127
|
+
|
|
89
128
|
if not results["reports"]:
|
|
90
129
|
return {
|
|
91
130
|
"error": "No scan results found",
|
|
@@ -102,6 +141,166 @@ class DashboardDataLoader:
|
|
|
102
141
|
"action": "Check file permissions and try again",
|
|
103
142
|
"command": "ls -la Reports/"
|
|
104
143
|
}
|
|
144
|
+
|
|
145
|
+
def get_findings(self, tool: str = None, severity: str = None, search: str = None, limit: int = 100, offset: int = 0) -> Dict[str, Any]:
|
|
146
|
+
"""Load individual findings from JSON reports with filtering."""
|
|
147
|
+
cache_key = "findings_all"
|
|
148
|
+
if not self._is_cache_valid(cache_key):
|
|
149
|
+
all_findings = []
|
|
150
|
+
|
|
151
|
+
# Parse Checkov JSON reports
|
|
152
|
+
checkov_dir = self.reports_dir / "checkov" / "security-scan"
|
|
153
|
+
if checkov_dir.exists():
|
|
154
|
+
for json_file in checkov_dir.rglob("results_json.json"):
|
|
155
|
+
try:
|
|
156
|
+
with open(json_file, "r") as f:
|
|
157
|
+
data = json.load(f)
|
|
158
|
+
results = data.get("results", {})
|
|
159
|
+
# Handle both formats
|
|
160
|
+
failed_checks = results.get("failed_checks", [])
|
|
161
|
+
if not failed_checks:
|
|
162
|
+
for check_type_data in results.values():
|
|
163
|
+
if isinstance(check_type_data, dict):
|
|
164
|
+
failed_checks.extend(check_type_data.get("failed_checks", []))
|
|
165
|
+
for check in failed_checks:
|
|
166
|
+
all_findings.append({
|
|
167
|
+
"tool": "checkov",
|
|
168
|
+
"id": check.get("check_id", ""),
|
|
169
|
+
"severity": check.get("severity", "MEDIUM") or "MEDIUM",
|
|
170
|
+
"title": check.get("check_result", {}).get("name", check.get("name", "")),
|
|
171
|
+
"name": check.get("name", ""),
|
|
172
|
+
"file": check.get("file_path", ""),
|
|
173
|
+
"line": check.get("file_line_range", [0, 0])[0],
|
|
174
|
+
"resource": check.get("resource", ""),
|
|
175
|
+
"guideline": check.get("guideline", ""),
|
|
176
|
+
})
|
|
177
|
+
except (json.JSONDecodeError, KeyError):
|
|
178
|
+
continue
|
|
179
|
+
|
|
180
|
+
# Parse OPA/Conftest JSON reports
|
|
181
|
+
opa_report = self.reports_dir / "opa" / "conftest_results.json"
|
|
182
|
+
if opa_report.exists():
|
|
183
|
+
try:
|
|
184
|
+
with open(opa_report, "r") as f:
|
|
185
|
+
data = json.load(f)
|
|
186
|
+
if isinstance(data, list):
|
|
187
|
+
for result in data:
|
|
188
|
+
filename = result.get("filename", "")
|
|
189
|
+
for failure in result.get("failures", []):
|
|
190
|
+
all_findings.append({
|
|
191
|
+
"tool": "opa",
|
|
192
|
+
"id": "OPA",
|
|
193
|
+
"severity": "HIGH",
|
|
194
|
+
"title": failure.get("msg", ""),
|
|
195
|
+
"name": failure.get("msg", ""),
|
|
196
|
+
"file": filename,
|
|
197
|
+
"line": 0,
|
|
198
|
+
"resource": "",
|
|
199
|
+
"guideline": "",
|
|
200
|
+
})
|
|
201
|
+
for warning in result.get("warnings", []):
|
|
202
|
+
all_findings.append({
|
|
203
|
+
"tool": "opa",
|
|
204
|
+
"id": "OPA",
|
|
205
|
+
"severity": "MEDIUM",
|
|
206
|
+
"title": warning.get("msg", ""),
|
|
207
|
+
"name": warning.get("msg", ""),
|
|
208
|
+
"file": filename,
|
|
209
|
+
"line": 0,
|
|
210
|
+
"resource": "",
|
|
211
|
+
"guideline": "",
|
|
212
|
+
})
|
|
213
|
+
except (json.JSONDecodeError, KeyError):
|
|
214
|
+
pass
|
|
215
|
+
|
|
216
|
+
# Parse Trivy JSON reports
|
|
217
|
+
trivy_dir = self.reports_dir / "trivy"
|
|
218
|
+
if trivy_dir.exists():
|
|
219
|
+
for json_file in trivy_dir.rglob("results.json"):
|
|
220
|
+
try:
|
|
221
|
+
with open(json_file, "r") as f:
|
|
222
|
+
data = json.load(f)
|
|
223
|
+
for result in data.get("Results", []):
|
|
224
|
+
for misconf in result.get("Misconfigurations", []):
|
|
225
|
+
all_findings.append({
|
|
226
|
+
"tool": "trivy",
|
|
227
|
+
"id": misconf.get("ID", ""),
|
|
228
|
+
"severity": misconf.get("Severity", "MEDIUM"),
|
|
229
|
+
"title": misconf.get("Title", ""),
|
|
230
|
+
"name": misconf.get("Message", misconf.get("Title", "")),
|
|
231
|
+
"file": result.get("Target", ""),
|
|
232
|
+
"line": 0,
|
|
233
|
+
"resource": misconf.get("CauseMetadata", {}).get("Resource", ""),
|
|
234
|
+
"guideline": misconf.get("PrimaryURL", ""),
|
|
235
|
+
})
|
|
236
|
+
except (json.JSONDecodeError, KeyError):
|
|
237
|
+
continue
|
|
238
|
+
|
|
239
|
+
# Parse KICS JSON reports
|
|
240
|
+
kics_report = self.reports_dir / "kics-results.json"
|
|
241
|
+
if kics_report.exists():
|
|
242
|
+
try:
|
|
243
|
+
with open(kics_report, "r") as f:
|
|
244
|
+
data = json.load(f)
|
|
245
|
+
for query in data.get("queries", []):
|
|
246
|
+
sev = (query.get("severity") or "MEDIUM").upper()
|
|
247
|
+
for file_entry in query.get("files", []):
|
|
248
|
+
all_findings.append({
|
|
249
|
+
"tool": "kics",
|
|
250
|
+
"id": query.get("query_id", "")[:12],
|
|
251
|
+
"severity": sev,
|
|
252
|
+
"title": query.get("query_name", ""),
|
|
253
|
+
"name": query.get("query_name", ""),
|
|
254
|
+
"file": file_entry.get("file_name", ""),
|
|
255
|
+
"line": file_entry.get("line", 0),
|
|
256
|
+
"resource": file_entry.get("resource_type", ""),
|
|
257
|
+
"guideline": query.get("query_url", ""),
|
|
258
|
+
})
|
|
259
|
+
except (json.JSONDecodeError, KeyError):
|
|
260
|
+
pass
|
|
261
|
+
|
|
262
|
+
self._cache_data(cache_key, all_findings)
|
|
263
|
+
else:
|
|
264
|
+
all_findings = self.cache[cache_key]["data"]
|
|
265
|
+
|
|
266
|
+
# Apply filters
|
|
267
|
+
filtered = all_findings
|
|
268
|
+
if tool:
|
|
269
|
+
filtered = [f for f in filtered if f["tool"] == tool]
|
|
270
|
+
if severity:
|
|
271
|
+
filtered = [f for f in filtered if f["severity"].upper() == severity.upper()]
|
|
272
|
+
if search:
|
|
273
|
+
search_lower = search.lower()
|
|
274
|
+
filtered = [f for f in filtered if (
|
|
275
|
+
search_lower in f.get("title", "").lower() or
|
|
276
|
+
search_lower in f.get("file", "").lower() or
|
|
277
|
+
search_lower in f.get("resource", "").lower() or
|
|
278
|
+
search_lower in f.get("id", "").lower()
|
|
279
|
+
)]
|
|
280
|
+
|
|
281
|
+
# Severity counts for the filtered set
|
|
282
|
+
sev_counts = {}
|
|
283
|
+
for f in filtered:
|
|
284
|
+
s = f.get("severity", "UNKNOWN").upper()
|
|
285
|
+
sev_counts[s] = sev_counts.get(s, 0) + 1
|
|
286
|
+
|
|
287
|
+
# Tool counts
|
|
288
|
+
tool_counts = {}
|
|
289
|
+
for f in filtered:
|
|
290
|
+
t = f.get("tool", "unknown")
|
|
291
|
+
tool_counts[t] = tool_counts.get(t, 0) + 1
|
|
292
|
+
|
|
293
|
+
total = len(filtered)
|
|
294
|
+
page = filtered[offset:offset + limit]
|
|
295
|
+
|
|
296
|
+
return {
|
|
297
|
+
"findings": page,
|
|
298
|
+
"total": total,
|
|
299
|
+
"offset": offset,
|
|
300
|
+
"limit": limit,
|
|
301
|
+
"severity_counts": sev_counts,
|
|
302
|
+
"tool_counts": tool_counts,
|
|
303
|
+
}
|
|
105
304
|
|
|
106
305
|
def get_cost_analysis(self) -> Dict[str, Any]:
|
|
107
306
|
"""Load from terraform plan files or cost analysis cache."""
|
|
@@ -611,6 +611,12 @@ class InventoryService:
|
|
|
611
611
|
reports_path = source_path / reports_path
|
|
612
612
|
|
|
613
613
|
reports_path.mkdir(exist_ok=True, parents=True)
|
|
614
|
+
|
|
615
|
+
# Always produce JSON (required by dashboard and API consumers)
|
|
616
|
+
self.report_service.create_json_report(
|
|
617
|
+
inventory_dict,
|
|
618
|
+
reports_directory=str(reports_path)
|
|
619
|
+
)
|
|
614
620
|
|
|
615
621
|
if report_type in ("html", "all"):
|
|
616
622
|
html_reports_path = reports_path / "html_reports"
|
|
@@ -620,17 +626,11 @@ class InventoryService:
|
|
|
620
626
|
reports_directory=str(html_reports_path)
|
|
621
627
|
)
|
|
622
628
|
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
if report_type in ("cyclonedx", "all"):
|
|
630
|
-
self.report_service.create_cyclonedx_report(
|
|
631
|
-
inventory_dict,
|
|
632
|
-
reports_directory=str(reports_path)
|
|
633
|
-
)
|
|
629
|
+
# Always produce CycloneDX SBOM (required by dashboard SBOM viewer)
|
|
630
|
+
self.report_service.create_cyclonedx_report(
|
|
631
|
+
inventory_dict,
|
|
632
|
+
reports_directory=str(reports_path)
|
|
633
|
+
)
|
|
634
634
|
|
|
635
635
|
# Print to console if requested
|
|
636
636
|
if print_console:
|
|
@@ -1071,12 +1071,13 @@ class InventoryService:
|
|
|
1071
1071
|
reports_path = Path(reports_directory) / "inventory"
|
|
1072
1072
|
reports_path.mkdir(parents=True, exist_ok=True)
|
|
1073
1073
|
|
|
1074
|
+
# Always produce JSON (required by dashboard)
|
|
1075
|
+
self.report_service.create_json_report(inventory_dict, reports_directory=str(reports_path))
|
|
1076
|
+
|
|
1074
1077
|
if report_type in ("html", "all"):
|
|
1075
1078
|
html_reports_path = reports_path / "html_reports"
|
|
1076
1079
|
html_reports_path.mkdir(parents=True, exist_ok=True)
|
|
1077
1080
|
self.report_service.create_html_report(inventory_dict, reports_directory=str(html_reports_path))
|
|
1078
|
-
if report_type in ("json", "all"):
|
|
1079
|
-
self.report_service.create_json_report(inventory_dict, reports_directory=str(reports_path))
|
|
1080
1081
|
if print_console:
|
|
1081
1082
|
self.report_service.print_inventory_console(inventory_dict)
|
|
1082
1083
|
|
|
@@ -1410,6 +1411,12 @@ class InventoryService:
|
|
|
1410
1411
|
try:
|
|
1411
1412
|
reports_path = Path(reports_directory) / "inventory"
|
|
1412
1413
|
reports_path.mkdir(exist_ok=True, parents=True)
|
|
1414
|
+
|
|
1415
|
+
# Always produce JSON (required by dashboard)
|
|
1416
|
+
self.report_service.create_json_report(
|
|
1417
|
+
inventory_dict,
|
|
1418
|
+
reports_directory=str(reports_path)
|
|
1419
|
+
)
|
|
1413
1420
|
|
|
1414
1421
|
if report_type in ("html", "all"):
|
|
1415
1422
|
html_reports_path = reports_path / "html_reports"
|
|
@@ -1418,12 +1425,6 @@ class InventoryService:
|
|
|
1418
1425
|
inventory_dict,
|
|
1419
1426
|
reports_directory=str(html_reports_path)
|
|
1420
1427
|
)
|
|
1421
|
-
|
|
1422
|
-
if report_type in ("json", "all"):
|
|
1423
|
-
self.report_service.create_json_report(
|
|
1424
|
-
inventory_dict,
|
|
1425
|
-
reports_directory=str(reports_path)
|
|
1426
|
-
)
|
|
1427
1428
|
|
|
1428
1429
|
except Exception as e:
|
|
1429
1430
|
logger.error(f"Error generating reports: {e}")
|