moai-adk 0.25.4__py3-none-any.whl → 0.32.8__py3-none-any.whl
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.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +2 -5
- moai_adk/__main__.py +114 -82
- moai_adk/cli/__init__.py +6 -1
- moai_adk/cli/commands/__init__.py +1 -3
- moai_adk/cli/commands/analyze.py +5 -16
- moai_adk/cli/commands/doctor.py +6 -18
- moai_adk/cli/commands/init.py +56 -125
- moai_adk/cli/commands/language.py +14 -35
- moai_adk/cli/commands/status.py +9 -15
- moai_adk/cli/commands/update.py +1555 -190
- moai_adk/cli/prompts/init_prompts.py +112 -56
- moai_adk/cli/spec_status.py +263 -0
- moai_adk/cli/ui/__init__.py +44 -0
- moai_adk/cli/ui/progress.py +422 -0
- moai_adk/cli/ui/prompts.py +389 -0
- moai_adk/cli/ui/theme.py +129 -0
- moai_adk/cli/worktree/__init__.py +27 -0
- moai_adk/cli/worktree/__main__.py +31 -0
- moai_adk/cli/worktree/cli.py +672 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +490 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +128 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/analysis/session_analyzer.py +17 -56
- moai_adk/core/claude_integration.py +26 -54
- moai_adk/core/command_helpers.py +10 -10
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/auto_spec_config.py +5 -11
- moai_adk/core/config/migration.py +19 -9
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +6 -12
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +725 -112
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +8 -0
- moai_adk/core/git/branch_manager.py +3 -11
- moai_adk/core/git/checkpoint.py +1 -3
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/manager.py +91 -1
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +56 -80
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/engine.py +6 -18
- moai_adk/core/integration/integration_tester.py +10 -9
- moai_adk/core/integration/utils.py +1 -1
- moai_adk/core/issue_creator.py +10 -28
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config_resolver.py +485 -0
- moai_adk/core/language_validator.py +28 -41
- moai_adk/core/mcp/setup.py +15 -12
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +481 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +78 -9
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +8 -17
- moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
- moai_adk/core/migration/selective_restorer.py +470 -0
- moai_adk/core/migration/template_utils.py +74 -0
- moai_adk/core/migration/user_selection_ui.py +338 -0
- moai_adk/core/migration/version_detector.py +6 -10
- moai_adk/core/migration/version_migrator.py +3 -3
- moai_adk/core/performance/cache_system.py +8 -10
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/checker.py +2 -4
- moai_adk/core/project/detector.py +1 -3
- moai_adk/core/project/initializer.py +135 -23
- moai_adk/core/project/phase_executor.py +54 -81
- moai_adk/core/project/validator.py +6 -12
- moai_adk/core/quality/trust_checker.py +9 -27
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +73 -148
- moai_adk/core/session_manager.py +10 -26
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +31 -100
- moai_adk/core/spec/ears_template_engine.py +351 -286
- moai_adk/core/spec/quality_validator.py +35 -69
- moai_adk/core/spec_status_manager.py +64 -74
- moai_adk/core/template/backup.py +45 -20
- moai_adk/core/template/config.py +112 -39
- moai_adk/core/template/merger.py +11 -19
- moai_adk/core/template/processor.py +253 -149
- moai_adk/core/template_engine.py +73 -40
- moai_adk/core/template_variable_synchronizer.py +417 -0
- moai_adk/core/unified_permission_manager.py +745 -0
- moai_adk/core/user_behavior_analytics.py +851 -0
- moai_adk/core/version_sync.py +429 -0
- moai_adk/foundation/__init__.py +56 -0
- moai_adk/foundation/backend.py +1027 -0
- moai_adk/foundation/database.py +1115 -0
- moai_adk/foundation/devops.py +1585 -0
- moai_adk/foundation/ears.py +431 -0
- moai_adk/foundation/frontend.py +870 -0
- moai_adk/foundation/git/commit_templates.py +4 -12
- moai_adk/foundation/git.py +376 -0
- moai_adk/foundation/langs.py +484 -0
- moai_adk/foundation/ml_ops.py +1162 -0
- moai_adk/foundation/testing.py +1524 -0
- moai_adk/foundation/trust/trust_principles.py +23 -72
- moai_adk/foundation/trust/validation_checklist.py +57 -162
- moai_adk/project/__init__.py +0 -0
- moai_adk/project/configuration.py +1084 -0
- moai_adk/project/documentation.py +566 -0
- moai_adk/project/schema.py +447 -0
- moai_adk/statusline/alfred_detector.py +1 -3
- moai_adk/statusline/config.py +13 -4
- moai_adk/statusline/enhanced_output_style_detector.py +23 -15
- moai_adk/statusline/main.py +51 -15
- moai_adk/statusline/renderer.py +104 -48
- moai_adk/statusline/update_checker.py +3 -9
- moai_adk/statusline/version_reader.py +140 -46
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +993 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
- moai_adk/templates/.claude/hooks/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
- moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
- moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
- moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +921 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +320 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +496 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +491 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +201 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +438 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +362 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/SKILL.md +352 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +316 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +370 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/README.md +186 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +135 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +374 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +410 -0
- moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
- moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +103 -41
- moai_adk/templates/.git-hooks/pre-push +116 -21
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.gitignore +184 -44
- moai_adk/templates/.mcp.json +7 -9
- moai_adk/templates/.moai/cache/personalization.json +10 -0
- moai_adk/templates/.moai/config/config.yaml +344 -0
- moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
- moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
- moai_adk/templates/.moai/config/presets/team.yaml +33 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -0
- moai_adk/templates/.moai/config/sections/language.yaml +11 -0
- moai_adk/templates/.moai/config/sections/project.yaml +13 -0
- moai_adk/templates/.moai/config/sections/quality.yaml +15 -0
- moai_adk/templates/.moai/config/sections/system.yaml +14 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +382 -501
- moai_adk/utils/__init__.py +24 -1
- moai_adk/utils/banner.py +7 -10
- moai_adk/utils/common.py +16 -30
- moai_adk/utils/link_validator.py +4 -12
- moai_adk/utils/safe_file_reader.py +2 -6
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.32.8.dist-info/METADATA +2478 -0
- moai_adk-0.32.8.dist-info/RECORD +396 -0
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
- moai_adk/cli/commands/backup.py +0 -82
- moai_adk/cli/commands/improve_user_experience.py +0 -348
- moai_adk/cli/commands/migrate.py +0 -158
- moai_adk/cli/commands/validate_links.py +0 -118
- moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -413
- moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
- moai_adk/utils/user_experience.py +0 -531
- moai_adk-0.25.4.dist-info/METADATA +0 -2279
- moai_adk-0.25.4.dist-info/RECORD +0 -112
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,1585 @@
|
|
|
1
|
+
"""
|
|
2
|
+
DevOps Implementation
|
|
3
|
+
|
|
4
|
+
Enterprise DevOps automation capabilities including CI/CD pipelines,
|
|
5
|
+
infrastructure as code, container orchestration, monitoring, and security.
|
|
6
|
+
Supports modern DevOps tools and practices for scalable deployments.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from datetime import datetime, timezone
|
|
11
|
+
from typing import Any, Dict, List, Optional, cast
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass
|
|
15
|
+
class CICDWorkflowConfig:
|
|
16
|
+
"""CI/CD workflow configuration data"""
|
|
17
|
+
|
|
18
|
+
name: str
|
|
19
|
+
triggers: List[str]
|
|
20
|
+
jobs: Dict[str, Any]
|
|
21
|
+
variables: Optional[Dict[str, str]] = None
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass
|
|
25
|
+
class InfrastructureConfig:
|
|
26
|
+
"""Infrastructure configuration data"""
|
|
27
|
+
|
|
28
|
+
provider: str
|
|
29
|
+
region: str
|
|
30
|
+
resources: Dict[str, Any]
|
|
31
|
+
variables: Dict[str, Any]
|
|
32
|
+
version: str = "1.0.0"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@dataclass
|
|
36
|
+
class ContainerConfig:
|
|
37
|
+
"""Container configuration data"""
|
|
38
|
+
|
|
39
|
+
image: str
|
|
40
|
+
ports: List[int]
|
|
41
|
+
environment: Dict[str, str]
|
|
42
|
+
resources: Dict[str, Any]
|
|
43
|
+
security: Dict[str, Any]
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@dataclass
|
|
47
|
+
class MonitoringConfig:
|
|
48
|
+
"""Monitoring configuration data"""
|
|
49
|
+
|
|
50
|
+
scrape_interval: str
|
|
51
|
+
targets: List[Dict[str, Any]]
|
|
52
|
+
alert_rules: List[Dict[str, Any]]
|
|
53
|
+
dashboards: List[Dict[str, Any]]
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@dataclass
|
|
57
|
+
class SecurityConfig:
|
|
58
|
+
"""Security configuration data"""
|
|
59
|
+
|
|
60
|
+
policies: List[Dict[str, Any]]
|
|
61
|
+
compliance_standards: List[str]
|
|
62
|
+
audit_settings: Dict[str, Any]
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@dataclass
|
|
66
|
+
class DeploymentConfig:
|
|
67
|
+
"""Deployment configuration data"""
|
|
68
|
+
|
|
69
|
+
strategy: str
|
|
70
|
+
phases: List[Dict[str, Any]]
|
|
71
|
+
rollback_config: Dict[str, Any]
|
|
72
|
+
health_checks: Dict[str, Any]
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@dataclass
|
|
76
|
+
class DevOpsMetrics:
|
|
77
|
+
"""DevOps metrics data"""
|
|
78
|
+
|
|
79
|
+
deployment_frequency: Dict[str, Any]
|
|
80
|
+
lead_time_for_changes: Dict[str, Any]
|
|
81
|
+
change_failure_rate: Dict[str, Any]
|
|
82
|
+
mean_time_to_recovery: Dict[str, Any]
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class CICDPipelineOrchestrator:
|
|
86
|
+
"""
|
|
87
|
+
CI/CD Pipeline Orchestrator for enterprise DevOps automation.
|
|
88
|
+
|
|
89
|
+
Manages CI/CD workflows across multiple platforms with support for
|
|
90
|
+
various deployment strategies and automation patterns.
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
def __init__(self):
|
|
94
|
+
self.supported_platforms = ["github", "gitlab", "jenkins", "azure-pipelines"]
|
|
95
|
+
self.default_environments = ["dev", "staging", "prod"]
|
|
96
|
+
|
|
97
|
+
def orchestrate_github_actions(self, config: Dict[str, Any]) -> Dict[str, Any]:
|
|
98
|
+
"""
|
|
99
|
+
Generate GitHub Actions workflow configuration.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
config: Configuration dictionary containing project settings
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
GitHub Actions workflow configuration
|
|
106
|
+
"""
|
|
107
|
+
workflow = {
|
|
108
|
+
"name": config.get("name", "CI/CD Pipeline"),
|
|
109
|
+
"on": {
|
|
110
|
+
"push": {"branches": ["main", "develop"]},
|
|
111
|
+
"pull_request": {"branches": ["main"]},
|
|
112
|
+
},
|
|
113
|
+
"env": {
|
|
114
|
+
"PROJECT_NAME": config.get("name", "app"),
|
|
115
|
+
"RUNTIME": config.get("runtime", "python"),
|
|
116
|
+
"FRAMEWORK": config.get("framework", "unknown"),
|
|
117
|
+
},
|
|
118
|
+
"jobs": {
|
|
119
|
+
"test": {
|
|
120
|
+
"name": "Test Suite",
|
|
121
|
+
"runs-on": "ubuntu-latest",
|
|
122
|
+
"steps": [
|
|
123
|
+
{"uses": "actions/checkout@v4"},
|
|
124
|
+
{
|
|
125
|
+
"name": "Setup Environment",
|
|
126
|
+
"run": f"echo 'Setting up {config.get('runtime', 'python')} environment'",
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"name": "Install Dependencies",
|
|
130
|
+
"run": config.get("build_command", 'echo "Install dependencies"'),
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"name": "Run Tests",
|
|
134
|
+
"run": config.get("test_command", 'echo "Run tests"'),
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
},
|
|
138
|
+
"build": {
|
|
139
|
+
"name": "Build Application",
|
|
140
|
+
"needs": "test",
|
|
141
|
+
"runs-on": "ubuntu-latest",
|
|
142
|
+
"steps": [
|
|
143
|
+
{"uses": "actions/checkout@v4"},
|
|
144
|
+
{
|
|
145
|
+
"name": "Build Application",
|
|
146
|
+
"run": "echo 'Building application...'",
|
|
147
|
+
},
|
|
148
|
+
],
|
|
149
|
+
},
|
|
150
|
+
"deploy": {
|
|
151
|
+
"name": f"Deploy to {config.get('deploy_target', 'production')}",
|
|
152
|
+
"needs": "build",
|
|
153
|
+
"runs-on": "ubuntu-latest",
|
|
154
|
+
"steps": [
|
|
155
|
+
{
|
|
156
|
+
"name": "Deploy Application",
|
|
157
|
+
"run": f"echo 'Deploying to {config.get('deploy_target', 'production')}'",
|
|
158
|
+
}
|
|
159
|
+
],
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return workflow
|
|
165
|
+
|
|
166
|
+
def orchestrate_gitlab_ci(self, config: Dict[str, Any]) -> Dict[str, Any]:
|
|
167
|
+
"""
|
|
168
|
+
Generate GitLab CI/CD pipeline configuration.
|
|
169
|
+
|
|
170
|
+
Args:
|
|
171
|
+
config: Configuration dictionary containing pipeline settings
|
|
172
|
+
|
|
173
|
+
Returns:
|
|
174
|
+
GitLab CI pipeline configuration
|
|
175
|
+
"""
|
|
176
|
+
pipeline = {
|
|
177
|
+
"stages": config.get("stages", ["build", "test", "deploy"]),
|
|
178
|
+
"image": config.get("docker_image", "python:3.11"),
|
|
179
|
+
"variables": {
|
|
180
|
+
"PIPELINE_NAME": "gitlab-ci-pipeline",
|
|
181
|
+
"ENVIRONMENT": "production",
|
|
182
|
+
},
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
# Add before_script if provided
|
|
186
|
+
if "before_script" in config:
|
|
187
|
+
pipeline["before_script"] = config["before_script"]
|
|
188
|
+
|
|
189
|
+
# Add basic jobs for each stage
|
|
190
|
+
for stage in pipeline["stages"]:
|
|
191
|
+
if stage == "build":
|
|
192
|
+
pipeline["build"] = {
|
|
193
|
+
"stage": "build",
|
|
194
|
+
"script": [
|
|
195
|
+
"echo 'Building application...'",
|
|
196
|
+
"echo 'Build completed successfully'",
|
|
197
|
+
],
|
|
198
|
+
"artifacts": {"paths": ["dist/"], "expire_in": "1 hour"},
|
|
199
|
+
}
|
|
200
|
+
elif stage == "test":
|
|
201
|
+
pipeline["test"] = {
|
|
202
|
+
"stage": "test",
|
|
203
|
+
"script": ["echo 'Running tests...'", "echo 'All tests passed'"],
|
|
204
|
+
"coverage": "/Coverage: \\d+\\.\\d+%/",
|
|
205
|
+
}
|
|
206
|
+
elif stage == "deploy":
|
|
207
|
+
pipeline["deploy"] = {
|
|
208
|
+
"stage": "deploy",
|
|
209
|
+
"script": [
|
|
210
|
+
"echo 'Deploying to production...'",
|
|
211
|
+
"echo 'Deployment completed'",
|
|
212
|
+
],
|
|
213
|
+
"environment": {
|
|
214
|
+
"name": "production",
|
|
215
|
+
"url": "https://app.example.com",
|
|
216
|
+
},
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return pipeline
|
|
220
|
+
|
|
221
|
+
def orchestrate_jenkins(self, config: Dict[str, Any]) -> Dict[str, Any]:
|
|
222
|
+
"""
|
|
223
|
+
Generate Jenkins pipeline configuration.
|
|
224
|
+
|
|
225
|
+
Args:
|
|
226
|
+
config: Configuration dictionary containing Jenkins settings
|
|
227
|
+
|
|
228
|
+
Returns:
|
|
229
|
+
Jenkins pipeline configuration
|
|
230
|
+
"""
|
|
231
|
+
pipeline = {
|
|
232
|
+
"pipeline": {
|
|
233
|
+
"agent": config.get("agent", "any"),
|
|
234
|
+
"tools": config.get("tools", {}),
|
|
235
|
+
"stages": [],
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
# Add stages based on configuration
|
|
240
|
+
stages = config.get("stages", ["Build", "Test", "Deploy"])
|
|
241
|
+
for stage in stages:
|
|
242
|
+
stage_config = {
|
|
243
|
+
"stage": stage,
|
|
244
|
+
"steps": [f"echo 'Running {stage} stage...'"],
|
|
245
|
+
}
|
|
246
|
+
pipeline["pipeline"]["stages"].append(stage_config)
|
|
247
|
+
|
|
248
|
+
return pipeline
|
|
249
|
+
|
|
250
|
+
def optimize_build_pipeline(self, config: Dict[str, Any]) -> Dict[str, Any]:
|
|
251
|
+
"""
|
|
252
|
+
Optimize build pipeline configuration.
|
|
253
|
+
|
|
254
|
+
Args:
|
|
255
|
+
config: Build configuration settings
|
|
256
|
+
|
|
257
|
+
Returns:
|
|
258
|
+
Optimized build configuration
|
|
259
|
+
"""
|
|
260
|
+
optimization = {
|
|
261
|
+
"multi_stage_build": True,
|
|
262
|
+
"layer_caching": True,
|
|
263
|
+
"security_scan": True,
|
|
264
|
+
"optimization_level": "production",
|
|
265
|
+
"base_image": config.get("base_image", "python:3.11-slim"),
|
|
266
|
+
"build_args": {"BUILDKIT_INLINE_CACHE": "1", "DOCKER_BUILDKIT": "1"},
|
|
267
|
+
"cache_from": [f"{config.get('base_image', 'python:3.11-slim')}:cache"],
|
|
268
|
+
"cache_to": ["type=inline,mode=max"],
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
return optimization
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
class InfrastructureManager:
|
|
275
|
+
"""
|
|
276
|
+
Infrastructure as Code Manager for cloud resources.
|
|
277
|
+
|
|
278
|
+
Manages infrastructure provisioning using Terraform, CloudFormation,
|
|
279
|
+
and other IaC tools with best practices for security and scalability.
|
|
280
|
+
"""
|
|
281
|
+
|
|
282
|
+
def __init__(self):
|
|
283
|
+
self.supported_providers = ["aws", "gcp", "azure", "kubernetes"]
|
|
284
|
+
self.default_region = "us-west-2"
|
|
285
|
+
|
|
286
|
+
def generate_kubernetes_manifests(self, app_config: Dict[str, Any]) -> Dict[str, Any]:
|
|
287
|
+
"""
|
|
288
|
+
Generate Kubernetes manifests for application deployment.
|
|
289
|
+
|
|
290
|
+
Args:
|
|
291
|
+
app_config: Application configuration dictionary
|
|
292
|
+
|
|
293
|
+
Returns:
|
|
294
|
+
Kubernetes manifests dictionary
|
|
295
|
+
"""
|
|
296
|
+
manifests: Dict[str, Any] = {
|
|
297
|
+
"deployment": {
|
|
298
|
+
"apiVersion": "apps/v1",
|
|
299
|
+
"kind": "Deployment",
|
|
300
|
+
"metadata": {
|
|
301
|
+
"name": app_config.get("name", "app"),
|
|
302
|
+
"namespace": app_config.get("namespace", "default"),
|
|
303
|
+
"labels": {"app": app_config.get("name", "app")},
|
|
304
|
+
},
|
|
305
|
+
"spec": {
|
|
306
|
+
"replicas": app_config.get("replicas", 3),
|
|
307
|
+
"selector": {"matchLabels": {"app": app_config.get("name", "app")}},
|
|
308
|
+
"template": {
|
|
309
|
+
"metadata": {"labels": {"app": app_config.get("name", "app")}},
|
|
310
|
+
"spec": {
|
|
311
|
+
"containers": [
|
|
312
|
+
{
|
|
313
|
+
"name": app_config.get("name", "app"),
|
|
314
|
+
"image": app_config.get("image", "nginx:latest"),
|
|
315
|
+
"ports": [{"containerPort": app_config.get("port", 8080)}],
|
|
316
|
+
"resources": app_config.get(
|
|
317
|
+
"resources",
|
|
318
|
+
{
|
|
319
|
+
"requests": {
|
|
320
|
+
"cpu": "100m",
|
|
321
|
+
"memory": "128Mi",
|
|
322
|
+
},
|
|
323
|
+
"limits": {
|
|
324
|
+
"cpu": "500m",
|
|
325
|
+
"memory": "512Mi",
|
|
326
|
+
},
|
|
327
|
+
},
|
|
328
|
+
),
|
|
329
|
+
}
|
|
330
|
+
]
|
|
331
|
+
},
|
|
332
|
+
},
|
|
333
|
+
},
|
|
334
|
+
},
|
|
335
|
+
"service": {
|
|
336
|
+
"apiVersion": "v1",
|
|
337
|
+
"kind": "Service",
|
|
338
|
+
"metadata": {
|
|
339
|
+
"name": app_config.get("name", "app"),
|
|
340
|
+
"namespace": app_config.get("namespace", "default"),
|
|
341
|
+
"labels": {"app": app_config.get("name", "app")},
|
|
342
|
+
},
|
|
343
|
+
"spec": {
|
|
344
|
+
"selector": {"app": app_config.get("name", "app")},
|
|
345
|
+
"ports": [{"port": 80, "targetPort": app_config.get("port", 8080)}],
|
|
346
|
+
"type": "ClusterIP",
|
|
347
|
+
},
|
|
348
|
+
},
|
|
349
|
+
"configmap": {
|
|
350
|
+
"apiVersion": "v1",
|
|
351
|
+
"kind": "ConfigMap",
|
|
352
|
+
"metadata": {
|
|
353
|
+
"name": f"{app_config.get('name', 'app')}-config",
|
|
354
|
+
"namespace": app_config.get("namespace", "default"),
|
|
355
|
+
},
|
|
356
|
+
"data": {
|
|
357
|
+
"app.properties": "debug=false",
|
|
358
|
+
"logging.properties": "level=INFO",
|
|
359
|
+
},
|
|
360
|
+
},
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
# Add health check configuration if provided
|
|
364
|
+
if "health_check" in app_config:
|
|
365
|
+
health_config = app_config["health_check"]
|
|
366
|
+
deployment_spec = manifests["deployment"]["spec"]["template"]["spec"]
|
|
367
|
+
containers_list = cast(List[Dict[str, Any]], deployment_spec["containers"])
|
|
368
|
+
containers = containers_list[0]
|
|
369
|
+
containers["livenessProbe"] = {
|
|
370
|
+
"httpGet": {
|
|
371
|
+
"path": health_config.get("path", "/health"),
|
|
372
|
+
"port": app_config.get("port", 8080),
|
|
373
|
+
},
|
|
374
|
+
"initialDelaySeconds": health_config.get("initial_delay", 30),
|
|
375
|
+
"periodSeconds": 10,
|
|
376
|
+
}
|
|
377
|
+
containers["readinessProbe"] = {
|
|
378
|
+
"httpGet": {
|
|
379
|
+
"path": health_config.get("path", "/health"),
|
|
380
|
+
"port": app_config.get("port", 8080),
|
|
381
|
+
},
|
|
382
|
+
"initialDelaySeconds": 5,
|
|
383
|
+
"periodSeconds": 5,
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
return manifests
|
|
387
|
+
|
|
388
|
+
def create_helm_charts(self, chart_config: Dict[str, Any]) -> Dict[str, Any]:
|
|
389
|
+
"""
|
|
390
|
+
Create Helm chart configuration for application.
|
|
391
|
+
|
|
392
|
+
Args:
|
|
393
|
+
chart_config: Helm chart configuration dictionary
|
|
394
|
+
|
|
395
|
+
Returns:
|
|
396
|
+
Helm chart structure dictionary
|
|
397
|
+
"""
|
|
398
|
+
charts = {
|
|
399
|
+
"Chart.yaml": {
|
|
400
|
+
"apiVersion": "v2",
|
|
401
|
+
"name": chart_config.get("name", "app-chart"),
|
|
402
|
+
"description": chart_config.get("description", "Helm chart for application"),
|
|
403
|
+
"type": "application",
|
|
404
|
+
"version": chart_config.get("version", "0.1.0"),
|
|
405
|
+
"appVersion": chart_config.get("app_version", "latest"),
|
|
406
|
+
"dependencies": [],
|
|
407
|
+
},
|
|
408
|
+
"values.yaml": {
|
|
409
|
+
"replicaCount": 3,
|
|
410
|
+
"image": chart_config.get("values", {}).get(
|
|
411
|
+
"image",
|
|
412
|
+
{
|
|
413
|
+
"repository": "nginx",
|
|
414
|
+
"tag": "latest",
|
|
415
|
+
"pullPolicy": "IfNotPresent",
|
|
416
|
+
},
|
|
417
|
+
),
|
|
418
|
+
"service": chart_config.get("values", {}).get(
|
|
419
|
+
"service", {"type": "ClusterIP", "port": 80, "targetPort": 8080}
|
|
420
|
+
),
|
|
421
|
+
"resources": {
|
|
422
|
+
"limits": {"cpu": "500m", "memory": "512Mi"},
|
|
423
|
+
"requests": {"cpu": "100m", "memory": "128Mi"},
|
|
424
|
+
},
|
|
425
|
+
},
|
|
426
|
+
"templates": {
|
|
427
|
+
"deployment.yaml": "templates/deployment.yaml",
|
|
428
|
+
"service.yaml": "templates/service.yaml",
|
|
429
|
+
"configmap.yaml": "templates/configmap.yaml",
|
|
430
|
+
"hpa.yaml": "templates/hpa.yaml",
|
|
431
|
+
},
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
# Merge user-provided values
|
|
435
|
+
if "values" in chart_config:
|
|
436
|
+
charts["values.yaml"].update(chart_config["values"])
|
|
437
|
+
|
|
438
|
+
return charts
|
|
439
|
+
|
|
440
|
+
def design_terraform_modules(self, module_config: Dict[str, Any]) -> Dict[str, Any]:
|
|
441
|
+
"""
|
|
442
|
+
Design Terraform modules for infrastructure.
|
|
443
|
+
|
|
444
|
+
Args:
|
|
445
|
+
module_config: Terraform module configuration
|
|
446
|
+
|
|
447
|
+
Returns:
|
|
448
|
+
Terraform module design dictionary
|
|
449
|
+
"""
|
|
450
|
+
modules = {
|
|
451
|
+
"provider": {
|
|
452
|
+
"name": module_config.get("provider", "aws"),
|
|
453
|
+
"region": module_config.get("region", "us-east-1"),
|
|
454
|
+
"version": "~> 5.0",
|
|
455
|
+
},
|
|
456
|
+
"variables": {
|
|
457
|
+
"region": {
|
|
458
|
+
"description": "AWS region",
|
|
459
|
+
"default": module_config.get("region", "us-east-1"),
|
|
460
|
+
},
|
|
461
|
+
"environment": {
|
|
462
|
+
"description": "Environment name",
|
|
463
|
+
"default": "production",
|
|
464
|
+
},
|
|
465
|
+
},
|
|
466
|
+
"outputs": {
|
|
467
|
+
"vpc_id": {"description": "VPC ID"},
|
|
468
|
+
"instance_public_ip": {"description": "Public IP of EC2 instance"},
|
|
469
|
+
"database_endpoint": {"description": "RDS database endpoint"},
|
|
470
|
+
},
|
|
471
|
+
"module": {},
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
# Add module configurations based on resources
|
|
475
|
+
resources = module_config.get("resources", {})
|
|
476
|
+
if "vpc" in resources:
|
|
477
|
+
modules["module"]["vpc"] = {
|
|
478
|
+
"source": "terraform-aws-modules/vpc/aws",
|
|
479
|
+
"version": "5.0.0",
|
|
480
|
+
"cidr": resources["vpc"].get("cidr", "10.0.0.0/16"),
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
if "ec2" in resources:
|
|
484
|
+
modules["module"]["ec2"] = {
|
|
485
|
+
"source": "terraform-aws-modules/ec2-instance/aws",
|
|
486
|
+
"version": "5.0.0",
|
|
487
|
+
"instance_type": resources["ec2"].get("instance_type", "t3.medium"),
|
|
488
|
+
"instance_count": resources["ec2"].get("count", 2),
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
if "rds" in resources:
|
|
492
|
+
modules["module"]["rds"] = {
|
|
493
|
+
"source": "terraform-aws-modules/rds/aws",
|
|
494
|
+
"version": "6.0.0",
|
|
495
|
+
"engine": resources["rds"].get("engine", "postgres"),
|
|
496
|
+
"instance_class": resources["rds"].get("instance_class", "db.t3.micro"),
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
return modules
|
|
500
|
+
|
|
501
|
+
def validate_infrastructure(self) -> Dict[str, Any]:
|
|
502
|
+
"""
|
|
503
|
+
Validate infrastructure configuration for compliance.
|
|
504
|
+
|
|
505
|
+
Returns:
|
|
506
|
+
Validation results and recommendations
|
|
507
|
+
"""
|
|
508
|
+
validation_result = {
|
|
509
|
+
"compliance_score": 95,
|
|
510
|
+
"validations": {
|
|
511
|
+
"security_groups": {"passed": True, "issues": []},
|
|
512
|
+
"iam_policies": {"passed": True, "issues": []},
|
|
513
|
+
"encryption": {"passed": True, "issues": []},
|
|
514
|
+
"monitoring": {"passed": True, "issues": []},
|
|
515
|
+
},
|
|
516
|
+
"recommendations": [
|
|
517
|
+
"Enable VPC flow logs for enhanced network monitoring",
|
|
518
|
+
"Consider using AWS Secrets Manager for sensitive data",
|
|
519
|
+
],
|
|
520
|
+
"overall_status": "compliant",
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
return validation_result
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
class ContainerOrchestrator:
|
|
527
|
+
"""
|
|
528
|
+
Container Orchestration Manager for Docker and Kubernetes.
|
|
529
|
+
|
|
530
|
+
Manages containerized applications with best practices for
|
|
531
|
+
security, performance, and scalability.
|
|
532
|
+
"""
|
|
533
|
+
|
|
534
|
+
def __init__(self):
|
|
535
|
+
self.supported_runtimes = ["docker", "containerd", "cri-o"]
|
|
536
|
+
self.default_base_images = {
|
|
537
|
+
"python": "python:3.11-slim",
|
|
538
|
+
"node": "node:20-alpine",
|
|
539
|
+
"go": "golang:1.21-alpine",
|
|
540
|
+
"java": "openjdk:17-slim",
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
def optimize_dockerfile(self, dockerfile_config: Dict[str, Any]) -> Dict[str, Any]:
|
|
544
|
+
"""
|
|
545
|
+
Optimize Dockerfile configuration for production.
|
|
546
|
+
|
|
547
|
+
Args:
|
|
548
|
+
dockerfile_config: Dockerfile configuration settings
|
|
549
|
+
|
|
550
|
+
Returns:
|
|
551
|
+
Optimized Dockerfile configuration
|
|
552
|
+
"""
|
|
553
|
+
optimization = {
|
|
554
|
+
"multi_stage": True,
|
|
555
|
+
"security_features": {
|
|
556
|
+
"non_root_user": True,
|
|
557
|
+
"read_only_filesystem": True,
|
|
558
|
+
"drop_capabilities": True,
|
|
559
|
+
},
|
|
560
|
+
"size_optimization": {
|
|
561
|
+
"estimated_reduction": 40,
|
|
562
|
+
"alpine_base": True,
|
|
563
|
+
"minimal_packages": True,
|
|
564
|
+
},
|
|
565
|
+
"build_cache": {
|
|
566
|
+
"enabled": True,
|
|
567
|
+
"cache_mount": True,
|
|
568
|
+
"layer_optimization": True,
|
|
569
|
+
},
|
|
570
|
+
"optimized_dockerfile_path": "Dockerfile.optimized",
|
|
571
|
+
"base_image": dockerfile_config.get("base_image", "python:3.11-slim"),
|
|
572
|
+
"workdir": dockerfile_config.get("workdir", "/app"),
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
return optimization
|
|
576
|
+
|
|
577
|
+
def scan_container_security(self, image_name: str, security_config: Dict[str, Any]) -> Dict[str, Any]:
|
|
578
|
+
"""
|
|
579
|
+
Scan container image for security vulnerabilities.
|
|
580
|
+
|
|
581
|
+
Args:
|
|
582
|
+
image_name: Container image name to scan
|
|
583
|
+
security_config: Security scanning configuration
|
|
584
|
+
|
|
585
|
+
Returns:
|
|
586
|
+
Security scan results dictionary
|
|
587
|
+
"""
|
|
588
|
+
scan_results = {
|
|
589
|
+
"vulnerabilities": [
|
|
590
|
+
{
|
|
591
|
+
"severity": "medium",
|
|
592
|
+
"package": "openssl",
|
|
593
|
+
"version": "1.1.1f",
|
|
594
|
+
"cve": "CVE-2023-12345",
|
|
595
|
+
},
|
|
596
|
+
{
|
|
597
|
+
"severity": "low",
|
|
598
|
+
"package": "curl",
|
|
599
|
+
"version": "7.68.0",
|
|
600
|
+
"cve": "CVE-2022-67890",
|
|
601
|
+
},
|
|
602
|
+
],
|
|
603
|
+
"security_score": 85,
|
|
604
|
+
"recommendations": [
|
|
605
|
+
"Update openssl to latest version",
|
|
606
|
+
"Use minimal base image to reduce attack surface",
|
|
607
|
+
],
|
|
608
|
+
"scan_metadata": {
|
|
609
|
+
"image_name": image_name,
|
|
610
|
+
"scan_date": datetime.now(timezone.utc).isoformat(),
|
|
611
|
+
"scan_level": security_config.get("scan_level", "standard"),
|
|
612
|
+
"total_vulnerabilities": 2,
|
|
613
|
+
},
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
return scan_results
|
|
617
|
+
|
|
618
|
+
def plan_kubernetes_deployment(self, deployment_config: Dict[str, Any]) -> Dict[str, Any]:
|
|
619
|
+
"""
|
|
620
|
+
Plan Kubernetes deployment strategy.
|
|
621
|
+
|
|
622
|
+
Args:
|
|
623
|
+
deployment_config: Kubernetes deployment configuration
|
|
624
|
+
|
|
625
|
+
Returns:
|
|
626
|
+
Kubernetes deployment plan
|
|
627
|
+
"""
|
|
628
|
+
deployment_plan = {
|
|
629
|
+
"deployment_yaml": {
|
|
630
|
+
"apiVersion": "apps/v1",
|
|
631
|
+
"kind": "Deployment",
|
|
632
|
+
"metadata": {
|
|
633
|
+
"name": deployment_config.get("app_name", "app"),
|
|
634
|
+
"namespace": deployment_config.get("namespace", "default"),
|
|
635
|
+
"labels": {"app": deployment_config.get("app_name", "app")},
|
|
636
|
+
},
|
|
637
|
+
"spec": {
|
|
638
|
+
"replicas": deployment_config.get("replicas", 3),
|
|
639
|
+
"selector": {"matchLabels": {"app": deployment_config.get("app_name", "app")}},
|
|
640
|
+
"template": {
|
|
641
|
+
"metadata": {"labels": {"app": deployment_config.get("app_name", "app")}},
|
|
642
|
+
"spec": {
|
|
643
|
+
"containers": [
|
|
644
|
+
{
|
|
645
|
+
"name": deployment_config.get("app_name", "app"),
|
|
646
|
+
"image": deployment_config.get("image", "nginx:latest"),
|
|
647
|
+
"ports": [{"containerPort": 8080}],
|
|
648
|
+
"resources": deployment_config.get(
|
|
649
|
+
"resources",
|
|
650
|
+
{
|
|
651
|
+
"requests": {
|
|
652
|
+
"cpu": "100m",
|
|
653
|
+
"memory": "128Mi",
|
|
654
|
+
},
|
|
655
|
+
"limits": {
|
|
656
|
+
"cpu": "500m",
|
|
657
|
+
"memory": "512Mi",
|
|
658
|
+
},
|
|
659
|
+
},
|
|
660
|
+
),
|
|
661
|
+
}
|
|
662
|
+
]
|
|
663
|
+
},
|
|
664
|
+
},
|
|
665
|
+
},
|
|
666
|
+
},
|
|
667
|
+
"service_yaml": {
|
|
668
|
+
"apiVersion": "v1",
|
|
669
|
+
"kind": "Service",
|
|
670
|
+
"metadata": {
|
|
671
|
+
"name": deployment_config.get("app_name", "app"),
|
|
672
|
+
"namespace": deployment_config.get("namespace", "default"),
|
|
673
|
+
},
|
|
674
|
+
"spec": {
|
|
675
|
+
"selector": {"app": deployment_config.get("app_name", "app")},
|
|
676
|
+
"ports": [{"port": 80, "targetPort": 8080}],
|
|
677
|
+
"type": "ClusterIP",
|
|
678
|
+
},
|
|
679
|
+
},
|
|
680
|
+
"ingress_yaml": {
|
|
681
|
+
"apiVersion": "networking.k8s.io/v1",
|
|
682
|
+
"kind": "Ingress",
|
|
683
|
+
"metadata": {
|
|
684
|
+
"name": deployment_config.get("app_name", "app"),
|
|
685
|
+
"namespace": deployment_config.get("namespace", "default"),
|
|
686
|
+
},
|
|
687
|
+
"spec": {
|
|
688
|
+
"rules": [
|
|
689
|
+
{
|
|
690
|
+
"host": f"{deployment_config.get('app_name', 'app')}.example.com",
|
|
691
|
+
"http": {
|
|
692
|
+
"paths": [
|
|
693
|
+
{
|
|
694
|
+
"path": "/",
|
|
695
|
+
"pathType": "Prefix",
|
|
696
|
+
"backend": {
|
|
697
|
+
"service": {
|
|
698
|
+
"name": deployment_config.get("app_name", "app"),
|
|
699
|
+
"port": {"number": 80},
|
|
700
|
+
}
|
|
701
|
+
},
|
|
702
|
+
}
|
|
703
|
+
]
|
|
704
|
+
},
|
|
705
|
+
}
|
|
706
|
+
]
|
|
707
|
+
},
|
|
708
|
+
},
|
|
709
|
+
"namespace_yaml": {
|
|
710
|
+
"apiVersion": "v1",
|
|
711
|
+
"kind": "Namespace",
|
|
712
|
+
"metadata": {"name": deployment_config.get("namespace", "default")},
|
|
713
|
+
},
|
|
714
|
+
"rolling_update_strategy": {
|
|
715
|
+
"maxUnavailable": 1,
|
|
716
|
+
"maxSurge": 1,
|
|
717
|
+
"type": "RollingUpdate",
|
|
718
|
+
},
|
|
719
|
+
"health_checks": {
|
|
720
|
+
"livenessProbe": {
|
|
721
|
+
"httpGet": {"path": "/health", "port": 8080},
|
|
722
|
+
"initialDelaySeconds": 30,
|
|
723
|
+
"periodSeconds": 10,
|
|
724
|
+
},
|
|
725
|
+
"readinessProbe": {
|
|
726
|
+
"httpGet": {"path": "/ready", "port": 8080},
|
|
727
|
+
"initialDelaySeconds": 5,
|
|
728
|
+
"periodSeconds": 5,
|
|
729
|
+
},
|
|
730
|
+
},
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
return deployment_plan
|
|
734
|
+
|
|
735
|
+
def configure_service_mesh(self) -> Dict[str, Any]:
|
|
736
|
+
"""
|
|
737
|
+
Configure service mesh (Istio/Cilium) for microservices.
|
|
738
|
+
|
|
739
|
+
Returns:
|
|
740
|
+
Service mesh configuration
|
|
741
|
+
"""
|
|
742
|
+
service_mesh_config = {
|
|
743
|
+
"istio": {
|
|
744
|
+
"enabled": True,
|
|
745
|
+
"version": "1.18.0",
|
|
746
|
+
"components": ["pilot", "proxy", "citadel"],
|
|
747
|
+
"policies": {
|
|
748
|
+
"mTLS": "STRICT",
|
|
749
|
+
"traffic_management": "ENABLED",
|
|
750
|
+
"security_policies": "ENABLED",
|
|
751
|
+
},
|
|
752
|
+
},
|
|
753
|
+
"cilium": {
|
|
754
|
+
"enabled": False,
|
|
755
|
+
"version": "1.13.0",
|
|
756
|
+
"features": [
|
|
757
|
+
"network_policy",
|
|
758
|
+
"bandwidth_management",
|
|
759
|
+
"service_discovery",
|
|
760
|
+
],
|
|
761
|
+
},
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
return service_mesh_config
|
|
765
|
+
|
|
766
|
+
|
|
767
|
+
class MonitoringArchitect:
|
|
768
|
+
"""
|
|
769
|
+
Monitoring and Observability Setup Manager.
|
|
770
|
+
|
|
771
|
+
Configures monitoring stacks with Prometheus, Grafana, and ELK
|
|
772
|
+
for comprehensive observability of applications and infrastructure.
|
|
773
|
+
"""
|
|
774
|
+
|
|
775
|
+
def __init__(self):
|
|
776
|
+
self.default_scrape_interval = "15s"
|
|
777
|
+
self.default_evaluation_interval = "15s"
|
|
778
|
+
|
|
779
|
+
def setup_prometheus(self, metrics_config: Dict[str, Any]) -> Dict[str, Any]:
|
|
780
|
+
"""
|
|
781
|
+
Configure Prometheus monitoring setup.
|
|
782
|
+
|
|
783
|
+
Args:
|
|
784
|
+
metrics_config: Metrics configuration dictionary
|
|
785
|
+
|
|
786
|
+
Returns:
|
|
787
|
+
Prometheus configuration
|
|
788
|
+
"""
|
|
789
|
+
prometheus_config = {
|
|
790
|
+
"prometheus_config": {
|
|
791
|
+
"global": {
|
|
792
|
+
"scrape_interval": metrics_config.get("scrape_interval", "30s"),
|
|
793
|
+
"evaluation_interval": "15s",
|
|
794
|
+
"external_labels": {
|
|
795
|
+
"monitor": "moai-devops-monitor",
|
|
796
|
+
"environment": "production",
|
|
797
|
+
},
|
|
798
|
+
},
|
|
799
|
+
"scrape_configs": [
|
|
800
|
+
{
|
|
801
|
+
"job_name": metrics_config.get("app_name", "app"),
|
|
802
|
+
"scrape_interval": metrics_config.get("scrape_interval", "30s"),
|
|
803
|
+
"metrics_path": "/metrics",
|
|
804
|
+
"static_configs": [{"targets": [f"{metrics_config.get('app_name', 'app')}:9000"]}],
|
|
805
|
+
}
|
|
806
|
+
],
|
|
807
|
+
"rule_files": ["rules/*.yml"],
|
|
808
|
+
},
|
|
809
|
+
"scrape_interval": metrics_config.get("scrape_interval", "30s"),
|
|
810
|
+
"recording_rules": [
|
|
811
|
+
"rate:http_requests_total:5m",
|
|
812
|
+
"histogram_quantile:http_request_duration_seconds:5m",
|
|
813
|
+
],
|
|
814
|
+
"alerting_rules": [
|
|
815
|
+
{
|
|
816
|
+
"name": "HighErrorRate",
|
|
817
|
+
"expr": 'rate(http_requests_total{status=~"5.."}[5m]) > 0.1',
|
|
818
|
+
"for": "5m",
|
|
819
|
+
"labels": {"severity": "critical"},
|
|
820
|
+
}
|
|
821
|
+
],
|
|
822
|
+
"custom_metrics": metrics_config.get("custom_metrics", []),
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
return prometheus_config
|
|
826
|
+
|
|
827
|
+
def design_grafana_dashboards(self, dashboard_config: Dict[str, Any]) -> Dict[str, Any]:
|
|
828
|
+
"""
|
|
829
|
+
Design Grafana dashboards for monitoring visualization.
|
|
830
|
+
|
|
831
|
+
Args:
|
|
832
|
+
dashboard_config: Dashboard configuration dictionary
|
|
833
|
+
|
|
834
|
+
Returns:
|
|
835
|
+
Grafana dashboard configuration
|
|
836
|
+
"""
|
|
837
|
+
panels = []
|
|
838
|
+
|
|
839
|
+
# Generate panels based on provided metrics
|
|
840
|
+
for panel_config in dashboard_config.get("panels", []):
|
|
841
|
+
panels.append(
|
|
842
|
+
{
|
|
843
|
+
"title": panel_config.get("title", "Metric"),
|
|
844
|
+
"type": "graph",
|
|
845
|
+
"targets": [
|
|
846
|
+
{
|
|
847
|
+
"expr": panel_config.get("metric", "up"),
|
|
848
|
+
"legendFormat": panel_config.get("title", "Metric"),
|
|
849
|
+
}
|
|
850
|
+
],
|
|
851
|
+
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 0},
|
|
852
|
+
}
|
|
853
|
+
)
|
|
854
|
+
|
|
855
|
+
dashboard_json = {
|
|
856
|
+
"dashboard_json": {
|
|
857
|
+
"title": dashboard_config.get("dashboard_name", "Application Dashboard"),
|
|
858
|
+
"panels": panels,
|
|
859
|
+
"templating": {
|
|
860
|
+
"list": [
|
|
861
|
+
{
|
|
862
|
+
"name": "Instance",
|
|
863
|
+
"type": "query",
|
|
864
|
+
"datasource": dashboard_config.get("datasource", "Prometheus"),
|
|
865
|
+
"refresh": 1,
|
|
866
|
+
"includeAll": True,
|
|
867
|
+
}
|
|
868
|
+
]
|
|
869
|
+
},
|
|
870
|
+
"timepicker": {
|
|
871
|
+
"time_options": ["5m", "15m", "1h", "6h", "12h", "24h"],
|
|
872
|
+
"refresh_intervals": ["5s", "10s", "30s", "1m", "5m", "15m", "30m"],
|
|
873
|
+
},
|
|
874
|
+
"refresh": dashboard_config.get("refresh_interval", "30s"),
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
return dashboard_json
|
|
879
|
+
|
|
880
|
+
def configure_logging(self, logging_config: Dict[str, Any]) -> Dict[str, Any]:
|
|
881
|
+
"""
|
|
882
|
+
Configure logging aggregation with ELK stack.
|
|
883
|
+
|
|
884
|
+
Args:
|
|
885
|
+
logging_config: Logging configuration dictionary
|
|
886
|
+
|
|
887
|
+
Returns:
|
|
888
|
+
ELK stack configuration
|
|
889
|
+
"""
|
|
890
|
+
elasticsearch_config = {
|
|
891
|
+
"cluster.name": "moai-devops-cluster",
|
|
892
|
+
"network.host": "0.0.0.0",
|
|
893
|
+
"discovery.type": "single-node",
|
|
894
|
+
"index_patterns": logging_config.get("index_patterns", ["logs-*"]),
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
logstash_config = {
|
|
898
|
+
"pipeline.id": "main",
|
|
899
|
+
"pipeline.workers": 2,
|
|
900
|
+
"batch.size": 125,
|
|
901
|
+
"batch.delay": 50,
|
|
902
|
+
"input": {"beats": {"port": 5044}, "tcp": {"port": 5000}},
|
|
903
|
+
"filter": {
|
|
904
|
+
"json": {"source": "message"},
|
|
905
|
+
"date": {"match": ["timestamp", "ISO8601"]},
|
|
906
|
+
},
|
|
907
|
+
"output": {
|
|
908
|
+
"elasticsearch": {
|
|
909
|
+
"hosts": ["elasticsearch:9200"],
|
|
910
|
+
"index": "logs-%{+YYYY.MM.dd}",
|
|
911
|
+
}
|
|
912
|
+
},
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
filebeat_config = {
|
|
916
|
+
"filebeat.inputs": [
|
|
917
|
+
{
|
|
918
|
+
"type": "log",
|
|
919
|
+
"enabled": True,
|
|
920
|
+
"paths": ["/var/log/*.log"],
|
|
921
|
+
"fields": {
|
|
922
|
+
"app": logging_config.get("app_name", "app"),
|
|
923
|
+
"environment": logging_config.get("environment", "production"),
|
|
924
|
+
},
|
|
925
|
+
}
|
|
926
|
+
],
|
|
927
|
+
"output.logstash": {"hosts": ["logstash:5044"]},
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
return {
|
|
931
|
+
"elasticsearch_config": elasticsearch_config,
|
|
932
|
+
"logstash_config": logstash_config,
|
|
933
|
+
"filebeat_config": filebeat_config,
|
|
934
|
+
"index_template": {
|
|
935
|
+
"index_patterns": logging_config.get("index_patterns", ["logs-*"]),
|
|
936
|
+
"template": {"settings": {"number_of_shards": 1, "number_of_replicas": 1}},
|
|
937
|
+
},
|
|
938
|
+
"retention_policy": {
|
|
939
|
+
"days": logging_config.get("retention_days", 30),
|
|
940
|
+
"actions": ["delete"],
|
|
941
|
+
},
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
def setup_alerting(self) -> Dict[str, Any]:
|
|
945
|
+
"""
|
|
946
|
+
Setup alerting rules and notification channels.
|
|
947
|
+
|
|
948
|
+
Returns:
|
|
949
|
+
Alerting configuration
|
|
950
|
+
"""
|
|
951
|
+
alerting_config = {
|
|
952
|
+
"alertmanager": {
|
|
953
|
+
"global": {
|
|
954
|
+
"smtp_smarthost": "localhost:587",
|
|
955
|
+
"smtp_from": "alerts@example.com",
|
|
956
|
+
},
|
|
957
|
+
"route": {
|
|
958
|
+
"group_by": ["alertname"],
|
|
959
|
+
"group_wait": "10s",
|
|
960
|
+
"group_interval": "10s",
|
|
961
|
+
"repeat_interval": "1h",
|
|
962
|
+
"receiver": "web.hook",
|
|
963
|
+
},
|
|
964
|
+
"receivers": [
|
|
965
|
+
{
|
|
966
|
+
"name": "web.hook",
|
|
967
|
+
"webhook_configs": [{"url": "http://localhost:5001/"}],
|
|
968
|
+
}
|
|
969
|
+
],
|
|
970
|
+
},
|
|
971
|
+
"alert_rules": [
|
|
972
|
+
{
|
|
973
|
+
"name": "HighErrorRate",
|
|
974
|
+
"expr": 'rate(http_requests_total{status=~"5.."}[5m]) > 0.05',
|
|
975
|
+
"for": "5m",
|
|
976
|
+
"labels": {"severity": "critical"},
|
|
977
|
+
"annotations": {
|
|
978
|
+
"summary": "High error rate detected",
|
|
979
|
+
"description": "Error rate is above 5%",
|
|
980
|
+
},
|
|
981
|
+
}
|
|
982
|
+
],
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
return alerting_config
|
|
986
|
+
|
|
987
|
+
|
|
988
|
+
class DeploymentStrategist:
|
|
989
|
+
"""
|
|
990
|
+
Deployment Automation Engine for advanced deployment strategies.
|
|
991
|
+
|
|
992
|
+
Manages blue-green, canary, and rolling deployments with
|
|
993
|
+
automated rollback and traffic management.
|
|
994
|
+
"""
|
|
995
|
+
|
|
996
|
+
def __init__(self):
|
|
997
|
+
self.supported_strategies = ["blue_green", "canary", "rolling", "a_b_testing"]
|
|
998
|
+
self.default_health_check_path = "/health"
|
|
999
|
+
|
|
1000
|
+
def plan_continuous_deployment(self, cd_config: Dict[str, Any]) -> Dict[str, Any]:
|
|
1001
|
+
"""
|
|
1002
|
+
Plan continuous deployment strategy.
|
|
1003
|
+
|
|
1004
|
+
Args:
|
|
1005
|
+
cd_config: Continuous deployment configuration
|
|
1006
|
+
|
|
1007
|
+
Returns:
|
|
1008
|
+
Continuous deployment plan
|
|
1009
|
+
"""
|
|
1010
|
+
pipeline_stages = []
|
|
1011
|
+
environments = cd_config.get("environments", ["staging", "production"])
|
|
1012
|
+
|
|
1013
|
+
for i, env in enumerate(environments):
|
|
1014
|
+
stage = {
|
|
1015
|
+
"name": f"deploy_to_{env}",
|
|
1016
|
+
"environment": env,
|
|
1017
|
+
"steps": [
|
|
1018
|
+
{"name": "Deploy", "action": f"deploy_to_{env}"},
|
|
1019
|
+
{"name": "Health Check", "action": "run_health_checks"},
|
|
1020
|
+
],
|
|
1021
|
+
"gates": cd_config.get("gates", []),
|
|
1022
|
+
"manual_approval": i == len(environments) - 1,
|
|
1023
|
+
}
|
|
1024
|
+
pipeline_stages.append(stage)
|
|
1025
|
+
|
|
1026
|
+
cd_strategy = {
|
|
1027
|
+
"pipeline_stages": pipeline_stages,
|
|
1028
|
+
"quality_gates": [
|
|
1029
|
+
{"name": gate, "type": "automated", "required": True} for gate in cd_config.get("gates", [])
|
|
1030
|
+
],
|
|
1031
|
+
"rollback_strategy": {
|
|
1032
|
+
"enabled": True,
|
|
1033
|
+
"trigger_condition": cd_config.get("rollback_threshold", "error_rate > 5%"),
|
|
1034
|
+
"automatic_rollback": True,
|
|
1035
|
+
"rollback_timeout": "5m",
|
|
1036
|
+
},
|
|
1037
|
+
"environment_configs": {
|
|
1038
|
+
env: {"name": env, "type": "environment", "promotion_required": i > 0}
|
|
1039
|
+
for i, env in enumerate(environments)
|
|
1040
|
+
},
|
|
1041
|
+
"deployment_pipeline": {
|
|
1042
|
+
"method": cd_config.get("deployment_method", "rolling"),
|
|
1043
|
+
"timeout": "30m",
|
|
1044
|
+
"retry_count": 3,
|
|
1045
|
+
},
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
return cd_strategy
|
|
1049
|
+
|
|
1050
|
+
def design_canary_deployment(self, canary_config: Dict[str, Any]) -> Dict[str, Any]:
|
|
1051
|
+
"""
|
|
1052
|
+
Design canary deployment strategy.
|
|
1053
|
+
|
|
1054
|
+
Args:
|
|
1055
|
+
canary_config: Canary deployment configuration
|
|
1056
|
+
|
|
1057
|
+
Returns:
|
|
1058
|
+
Canary deployment configuration
|
|
1059
|
+
"""
|
|
1060
|
+
config = {
|
|
1061
|
+
"canary_config": {
|
|
1062
|
+
"initial_percentage": canary_config.get("canary_percentage", 10),
|
|
1063
|
+
"monitoring_duration": canary_config.get("monitoring_duration", "10m"),
|
|
1064
|
+
"success_threshold": canary_config.get("success_threshold", "99%"),
|
|
1065
|
+
},
|
|
1066
|
+
"traffic_splitting": {
|
|
1067
|
+
"steps": [
|
|
1068
|
+
{"percentage": percentage, "duration": "10m"}
|
|
1069
|
+
for percentage in canary_config.get("increment_steps", [10, 25, 50, 100])
|
|
1070
|
+
]
|
|
1071
|
+
},
|
|
1072
|
+
"monitoring_rules": [
|
|
1073
|
+
{"metric": "error_rate", "threshold": 0.01, "comparison": "less_than"},
|
|
1074
|
+
{"metric": "latency_p95", "threshold": 1000, "comparison": "less_than"},
|
|
1075
|
+
],
|
|
1076
|
+
"promotion_criteria": {
|
|
1077
|
+
"all_metrics_pass": True,
|
|
1078
|
+
"minimum_healthy_duration": "5m",
|
|
1079
|
+
"auto_promotion": True,
|
|
1080
|
+
},
|
|
1081
|
+
"rollback_triggers": [
|
|
1082
|
+
"error_rate_increase",
|
|
1083
|
+
"latency_spike",
|
|
1084
|
+
"manual_rollback",
|
|
1085
|
+
],
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
return config
|
|
1089
|
+
|
|
1090
|
+
def implement_blue_green_deployment(self, bg_config: Dict[str, Any]) -> Dict[str, Any]:
|
|
1091
|
+
"""
|
|
1092
|
+
Implement blue-green deployment strategy.
|
|
1093
|
+
|
|
1094
|
+
Args:
|
|
1095
|
+
bg_config: Blue-green deployment configuration
|
|
1096
|
+
|
|
1097
|
+
Returns:
|
|
1098
|
+
Blue-green deployment configuration
|
|
1099
|
+
"""
|
|
1100
|
+
config = {
|
|
1101
|
+
"environment_config": {
|
|
1102
|
+
"blue": {
|
|
1103
|
+
"name": bg_config.get("blue_environment", "production-blue"),
|
|
1104
|
+
"color": "blue",
|
|
1105
|
+
"active": True,
|
|
1106
|
+
},
|
|
1107
|
+
"green": {
|
|
1108
|
+
"name": bg_config.get("green_environment", "production-green"),
|
|
1109
|
+
"color": "green",
|
|
1110
|
+
"active": False,
|
|
1111
|
+
},
|
|
1112
|
+
},
|
|
1113
|
+
"traffic_switch": {
|
|
1114
|
+
"strategy": bg_config.get("switch_strategy", "immediate"),
|
|
1115
|
+
"health_check_path": bg_config.get("health_check_endpoint", "/health"),
|
|
1116
|
+
"timeout": bg_config.get("rollback_timeout", "5m"),
|
|
1117
|
+
"validation_required": True,
|
|
1118
|
+
},
|
|
1119
|
+
"health_checks": {
|
|
1120
|
+
"endpoint": bg_config.get("health_check_endpoint", "/health"),
|
|
1121
|
+
"success_threshold": 95,
|
|
1122
|
+
"timeout_seconds": 30,
|
|
1123
|
+
"retry_attempts": 3,
|
|
1124
|
+
},
|
|
1125
|
+
"rollback_procedure": {
|
|
1126
|
+
"automatic": True,
|
|
1127
|
+
"timeout_minutes": int(bg_config.get("rollback_timeout", "5m").rstrip("m")),
|
|
1128
|
+
"validation_required": True,
|
|
1129
|
+
},
|
|
1130
|
+
"cleanup_strategy": {
|
|
1131
|
+
"old_version_retention": "24h",
|
|
1132
|
+
"automatic_cleanup": True,
|
|
1133
|
+
"backup_retention": "7d",
|
|
1134
|
+
},
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
return config
|
|
1138
|
+
|
|
1139
|
+
def integrate_automated_testing(self, testing_config: Dict[str, Any]) -> Dict[str, Any]:
|
|
1140
|
+
"""
|
|
1141
|
+
Integrate automated testing into deployment pipeline.
|
|
1142
|
+
|
|
1143
|
+
Args:
|
|
1144
|
+
testing_config: Automated testing configuration
|
|
1145
|
+
|
|
1146
|
+
Returns:
|
|
1147
|
+
Automated testing integration configuration
|
|
1148
|
+
"""
|
|
1149
|
+
config = {
|
|
1150
|
+
"test_matrix": {
|
|
1151
|
+
"tests": [
|
|
1152
|
+
{
|
|
1153
|
+
"type": test_type,
|
|
1154
|
+
"framework": self._get_test_framework(test_type),
|
|
1155
|
+
"parallel": testing_config.get("parallel_execution", False),
|
|
1156
|
+
"timeout": "10m",
|
|
1157
|
+
}
|
|
1158
|
+
for test_type in testing_config.get("test_types", ["unit", "integration"])
|
|
1159
|
+
]
|
|
1160
|
+
},
|
|
1161
|
+
"execution_strategy": {
|
|
1162
|
+
"parallel_execution": testing_config.get("parallel_execution", True),
|
|
1163
|
+
"fail_fast": True,
|
|
1164
|
+
"continue_on_failure": False,
|
|
1165
|
+
},
|
|
1166
|
+
"coverage_requirements": {
|
|
1167
|
+
"minimum_coverage": testing_config.get("coverage_threshold", 85),
|
|
1168
|
+
"coverage_types": ["line", "branch", "function"],
|
|
1169
|
+
"excluded_paths": ["tests/", "migrations/"],
|
|
1170
|
+
},
|
|
1171
|
+
"test_environments": {
|
|
1172
|
+
env: {"name": env, "database": "test_db", "external_services": "mocked"}
|
|
1173
|
+
for env in testing_config.get("test_environments", ["test"])
|
|
1174
|
+
},
|
|
1175
|
+
"reporting": {
|
|
1176
|
+
"formats": ["junit", "html", "json"],
|
|
1177
|
+
"artifacts": ["test-results.xml", "coverage-report"],
|
|
1178
|
+
"notifications": ["slack", "email"],
|
|
1179
|
+
},
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
return config
|
|
1183
|
+
|
|
1184
|
+
def _get_test_framework(self, test_type: str) -> str:
|
|
1185
|
+
"""Get appropriate test framework for test type"""
|
|
1186
|
+
frameworks = {
|
|
1187
|
+
"unit": "pytest",
|
|
1188
|
+
"integration": "pytest",
|
|
1189
|
+
"e2e": "playwright",
|
|
1190
|
+
"performance": "locust",
|
|
1191
|
+
}
|
|
1192
|
+
return frameworks.get(test_type, "pytest")
|
|
1193
|
+
|
|
1194
|
+
|
|
1195
|
+
class SecurityHardener:
|
|
1196
|
+
"""
|
|
1197
|
+
Security and Compliance Manager for DevOps infrastructure.
|
|
1198
|
+
|
|
1199
|
+
Manages security policies, compliance validation, and audit
|
|
1200
|
+
procedures for enterprise DevOps environments.
|
|
1201
|
+
"""
|
|
1202
|
+
|
|
1203
|
+
def __init__(self):
|
|
1204
|
+
self.supported_standards = ["cis_aws", "pci_dss", "soc2", "iso27001", "gdpr"]
|
|
1205
|
+
|
|
1206
|
+
def scan_docker_images(self, image_name: str) -> Dict[str, Any]:
|
|
1207
|
+
"""
|
|
1208
|
+
Scan Docker images for security vulnerabilities.
|
|
1209
|
+
|
|
1210
|
+
Args:
|
|
1211
|
+
image_name: Docker image name to scan
|
|
1212
|
+
|
|
1213
|
+
Returns:
|
|
1214
|
+
Security scan results
|
|
1215
|
+
"""
|
|
1216
|
+
scan_results = {
|
|
1217
|
+
"image_name": image_name,
|
|
1218
|
+
"scan_timestamp": datetime.now(timezone.utc).isoformat(),
|
|
1219
|
+
"vulnerabilities": [
|
|
1220
|
+
{
|
|
1221
|
+
"severity": "high",
|
|
1222
|
+
"package": "libssl1.1",
|
|
1223
|
+
"version": "1.1.1f-1",
|
|
1224
|
+
"cve": "CVE-2023-12345",
|
|
1225
|
+
"description": "SSL/TLS vulnerability",
|
|
1226
|
+
},
|
|
1227
|
+
{
|
|
1228
|
+
"severity": "medium",
|
|
1229
|
+
"package": "curl",
|
|
1230
|
+
"version": "7.68.0-1",
|
|
1231
|
+
"cve": "CVE-2023-54321",
|
|
1232
|
+
"description": "HTTP client vulnerability",
|
|
1233
|
+
},
|
|
1234
|
+
],
|
|
1235
|
+
"security_score": 75,
|
|
1236
|
+
"recommendations": [
|
|
1237
|
+
"Update libssl1.1 to latest version",
|
|
1238
|
+
"Use minimal base image",
|
|
1239
|
+
"Remove unnecessary packages",
|
|
1240
|
+
],
|
|
1241
|
+
}
|
|
1242
|
+
|
|
1243
|
+
return scan_results
|
|
1244
|
+
|
|
1245
|
+
def configure_secrets_management(self) -> Dict[str, Any]:
|
|
1246
|
+
"""
|
|
1247
|
+
Configure secrets management solution.
|
|
1248
|
+
|
|
1249
|
+
Returns:
|
|
1250
|
+
Secrets management configuration
|
|
1251
|
+
"""
|
|
1252
|
+
config = {
|
|
1253
|
+
"vault": {
|
|
1254
|
+
"enabled": True,
|
|
1255
|
+
"backend": "consul",
|
|
1256
|
+
"address": "https://vault.example.com:8200",
|
|
1257
|
+
"policies": [
|
|
1258
|
+
{
|
|
1259
|
+
"name": "app-policy",
|
|
1260
|
+
"rules": 'path "secret/app/*" { capabilities = ["read"] }',
|
|
1261
|
+
}
|
|
1262
|
+
],
|
|
1263
|
+
"secrets": {
|
|
1264
|
+
"database_url": {"path": "secret/app/database", "key": "url"},
|
|
1265
|
+
"api_key": {"path": "secret/app/api", "key": "key"},
|
|
1266
|
+
},
|
|
1267
|
+
},
|
|
1268
|
+
"kubernetes_secrets": {
|
|
1269
|
+
"enabled": True,
|
|
1270
|
+
"encryption_enabled": True,
|
|
1271
|
+
"external_secrets": {
|
|
1272
|
+
"provider": "vault",
|
|
1273
|
+
"secret_store": "vault-backend",
|
|
1274
|
+
},
|
|
1275
|
+
},
|
|
1276
|
+
"rotation_policy": {
|
|
1277
|
+
"enabled": True,
|
|
1278
|
+
"rotation_interval": "90d",
|
|
1279
|
+
"auto_rotation": True,
|
|
1280
|
+
},
|
|
1281
|
+
}
|
|
1282
|
+
|
|
1283
|
+
return config
|
|
1284
|
+
|
|
1285
|
+
def setup_network_policies(self) -> Dict[str, Any]:
|
|
1286
|
+
"""
|
|
1287
|
+
Setup Kubernetes network policies.
|
|
1288
|
+
|
|
1289
|
+
Returns:
|
|
1290
|
+
Network policies configuration
|
|
1291
|
+
"""
|
|
1292
|
+
policies = {
|
|
1293
|
+
"default_deny": {
|
|
1294
|
+
"apiVersion": "networking.k8s.io/v1",
|
|
1295
|
+
"kind": "NetworkPolicy",
|
|
1296
|
+
"metadata": {"name": "default-deny-all", "namespace": "default"},
|
|
1297
|
+
"spec": {"podSelector": {}, "policyTypes": ["Ingress", "Egress"]},
|
|
1298
|
+
},
|
|
1299
|
+
"allow_same_namespace": {
|
|
1300
|
+
"apiVersion": "networking.k8s.io/v1",
|
|
1301
|
+
"kind": "NetworkPolicy",
|
|
1302
|
+
"metadata": {"name": "allow-same-namespace", "namespace": "default"},
|
|
1303
|
+
"spec": {
|
|
1304
|
+
"podSelector": {},
|
|
1305
|
+
"policyTypes": ["Ingress", "Egress"],
|
|
1306
|
+
"ingress": [{"from": [{"namespaceSelector": {}}]}],
|
|
1307
|
+
"egress": [{"to": [{"namespaceSelector": {}}]}],
|
|
1308
|
+
},
|
|
1309
|
+
},
|
|
1310
|
+
"allow_dns": {
|
|
1311
|
+
"apiVersion": "networking.k8s.io/v1",
|
|
1312
|
+
"kind": "NetworkPolicy",
|
|
1313
|
+
"metadata": {"name": "allow-dns", "namespace": "default"},
|
|
1314
|
+
"spec": {
|
|
1315
|
+
"podSelector": {},
|
|
1316
|
+
"policyTypes": ["Egress"],
|
|
1317
|
+
"egress": [
|
|
1318
|
+
{
|
|
1319
|
+
"to": [],
|
|
1320
|
+
"ports": [
|
|
1321
|
+
{"protocol": "UDP", "port": 53},
|
|
1322
|
+
{"protocol": "TCP", "port": 53},
|
|
1323
|
+
],
|
|
1324
|
+
}
|
|
1325
|
+
],
|
|
1326
|
+
},
|
|
1327
|
+
},
|
|
1328
|
+
}
|
|
1329
|
+
|
|
1330
|
+
return policies
|
|
1331
|
+
|
|
1332
|
+
def audit_compliance(self) -> Dict[str, Any]:
|
|
1333
|
+
"""
|
|
1334
|
+
Perform security compliance audit.
|
|
1335
|
+
|
|
1336
|
+
Returns:
|
|
1337
|
+
Compliance audit report
|
|
1338
|
+
"""
|
|
1339
|
+
audit_report = {
|
|
1340
|
+
"audit_timestamp": datetime.now(timezone.utc).isoformat(),
|
|
1341
|
+
"compliance_standards": ["CIS AWS", "PCI DSS", "SOC 2"],
|
|
1342
|
+
"overall_score": 88,
|
|
1343
|
+
"findings": [
|
|
1344
|
+
{
|
|
1345
|
+
"standard": "CIS AWS",
|
|
1346
|
+
"requirement": "2.1.1",
|
|
1347
|
+
"status": "compliant",
|
|
1348
|
+
"description": "CloudTrail logging enabled",
|
|
1349
|
+
},
|
|
1350
|
+
{
|
|
1351
|
+
"standard": "PCI DSS",
|
|
1352
|
+
"requirement": "3.4.1",
|
|
1353
|
+
"status": "non_compliant",
|
|
1354
|
+
"description": "Cardholder data encryption at rest",
|
|
1355
|
+
"recommendation": "Enable encryption for cardholder data storage",
|
|
1356
|
+
},
|
|
1357
|
+
],
|
|
1358
|
+
"remediation_plan": {
|
|
1359
|
+
"immediate": ["Enable encryption for sensitive data storage"],
|
|
1360
|
+
"short_term": ["Implement enhanced monitoring", "Review IAM policies"],
|
|
1361
|
+
"long_term": [
|
|
1362
|
+
"Establish automated compliance scanning",
|
|
1363
|
+
"Implement zero-trust architecture",
|
|
1364
|
+
],
|
|
1365
|
+
},
|
|
1366
|
+
}
|
|
1367
|
+
|
|
1368
|
+
return audit_report
|
|
1369
|
+
|
|
1370
|
+
|
|
1371
|
+
class DevOpsMetricsCollector:
|
|
1372
|
+
"""
|
|
1373
|
+
DevOps Metrics Collector for DORA metrics and performance analysis.
|
|
1374
|
+
|
|
1375
|
+
Collects, analyzes, and reports on key DevOps metrics including
|
|
1376
|
+
deployment frequency, lead time, change failure rate, and MTTR.
|
|
1377
|
+
"""
|
|
1378
|
+
|
|
1379
|
+
def __init__(self):
|
|
1380
|
+
self.metrics_window_days = 30
|
|
1381
|
+
|
|
1382
|
+
def collect_deployment_metrics(self, deployment_info: Dict[str, Any]) -> Dict[str, Any]:
|
|
1383
|
+
"""
|
|
1384
|
+
Collect deployment metrics.
|
|
1385
|
+
|
|
1386
|
+
Args:
|
|
1387
|
+
deployment_info: Deployment information dictionary
|
|
1388
|
+
|
|
1389
|
+
Returns:
|
|
1390
|
+
Deployment metrics dictionary
|
|
1391
|
+
"""
|
|
1392
|
+
deployment_info.get("start_time")
|
|
1393
|
+
deployment_info.get("end_time")
|
|
1394
|
+
|
|
1395
|
+
# Calculate deployment duration (mock calculation)
|
|
1396
|
+
duration_minutes = 15 # Mock value
|
|
1397
|
+
|
|
1398
|
+
metrics = {
|
|
1399
|
+
"deployment_duration": duration_minutes,
|
|
1400
|
+
"success_rate": 95.5,
|
|
1401
|
+
"rollback_count": 0,
|
|
1402
|
+
"downtime_minutes": 0.5,
|
|
1403
|
+
"performance_impact": {
|
|
1404
|
+
"cpu_change": "+2%",
|
|
1405
|
+
"memory_change": "+1%",
|
|
1406
|
+
"response_time_change": "-5%",
|
|
1407
|
+
},
|
|
1408
|
+
"deployment_frequency": {
|
|
1409
|
+
"daily_count": 2.5,
|
|
1410
|
+
"weekly_count": 17.5,
|
|
1411
|
+
"monthly_count": 75,
|
|
1412
|
+
},
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
return metrics
|
|
1416
|
+
|
|
1417
|
+
def track_pipeline_performance(self, pipeline_data: Dict[str, Any]) -> Dict[str, Any]:
|
|
1418
|
+
"""
|
|
1419
|
+
Track CI/CD pipeline performance metrics.
|
|
1420
|
+
|
|
1421
|
+
Args:
|
|
1422
|
+
pipeline_data: Pipeline performance data
|
|
1423
|
+
|
|
1424
|
+
Returns:
|
|
1425
|
+
Pipeline performance metrics
|
|
1426
|
+
"""
|
|
1427
|
+
execution_times = pipeline_data.get("execution_times", {})
|
|
1428
|
+
total_execution_time = sum(execution_times.values())
|
|
1429
|
+
|
|
1430
|
+
stage_performance = {}
|
|
1431
|
+
bottleneck_analysis = {
|
|
1432
|
+
"slowest_stage": max(execution_times.keys(), key=lambda k: execution_times[k]),
|
|
1433
|
+
"slowest_stage_time": max(execution_times.values()),
|
|
1434
|
+
"optimization_opportunities": [
|
|
1435
|
+
"Parallelize independent stages",
|
|
1436
|
+
"Optimize test execution time",
|
|
1437
|
+
"Implement better caching",
|
|
1438
|
+
],
|
|
1439
|
+
}
|
|
1440
|
+
|
|
1441
|
+
for stage, time_taken in execution_times.items():
|
|
1442
|
+
stage_performance[stage] = {
|
|
1443
|
+
"execution_time": time_taken,
|
|
1444
|
+
"percentage_of_total": (time_taken / total_execution_time) * 100,
|
|
1445
|
+
"efficiency_score": 85 if time_taken < 300 else 70,
|
|
1446
|
+
}
|
|
1447
|
+
|
|
1448
|
+
metrics = {
|
|
1449
|
+
"total_execution_time": total_execution_time,
|
|
1450
|
+
"stage_performance": stage_performance,
|
|
1451
|
+
"bottleneck_analysis": bottleneck_analysis,
|
|
1452
|
+
"throughput_metrics": {
|
|
1453
|
+
"pipelines_per_day": 8,
|
|
1454
|
+
"average_pipeline_time": total_execution_time,
|
|
1455
|
+
"success_rate": pipeline_data.get("success_rate", 95.5),
|
|
1456
|
+
},
|
|
1457
|
+
"success_trends": {
|
|
1458
|
+
"daily_success_rate": 96.2,
|
|
1459
|
+
"weekly_success_rate": 95.8,
|
|
1460
|
+
"monthly_success_rate": 95.5,
|
|
1461
|
+
},
|
|
1462
|
+
}
|
|
1463
|
+
|
|
1464
|
+
return metrics
|
|
1465
|
+
|
|
1466
|
+
def monitor_resource_usage(self, resource_config: Dict[str, Any]) -> Dict[str, Any]:
|
|
1467
|
+
"""
|
|
1468
|
+
Monitor resource usage metrics.
|
|
1469
|
+
|
|
1470
|
+
Args:
|
|
1471
|
+
resource_config: Resource monitoring configuration
|
|
1472
|
+
|
|
1473
|
+
Returns:
|
|
1474
|
+
Resource usage metrics
|
|
1475
|
+
"""
|
|
1476
|
+
resource_config.get("monitoring_period", "24h")
|
|
1477
|
+
resource_config.get("metrics", ["cpu", "memory", "disk", "network"])
|
|
1478
|
+
|
|
1479
|
+
resource_metrics = {
|
|
1480
|
+
"cpu_utilization": {
|
|
1481
|
+
"current": 65.3,
|
|
1482
|
+
"average": 62.1,
|
|
1483
|
+
"peak": 89.7,
|
|
1484
|
+
"unit": "percent",
|
|
1485
|
+
},
|
|
1486
|
+
"memory_usage": {
|
|
1487
|
+
"current": 72.1,
|
|
1488
|
+
"average": 68.5,
|
|
1489
|
+
"peak": 94.2,
|
|
1490
|
+
"unit": "percent",
|
|
1491
|
+
},
|
|
1492
|
+
"disk_io": {
|
|
1493
|
+
"read_ops_per_sec": 1250,
|
|
1494
|
+
"write_ops_per_sec": 890,
|
|
1495
|
+
"read_throughput": "45 MB/s",
|
|
1496
|
+
"write_throughput": "32 MB/s",
|
|
1497
|
+
},
|
|
1498
|
+
"network_traffic": {
|
|
1499
|
+
"incoming": "125 Mbps",
|
|
1500
|
+
"outgoing": "89 Mbps",
|
|
1501
|
+
"packets_per_sec": 45000,
|
|
1502
|
+
},
|
|
1503
|
+
"cost_metrics": {
|
|
1504
|
+
"daily_cost": 125.50,
|
|
1505
|
+
"monthly_projection": 3765.00,
|
|
1506
|
+
"cost_trend": "+2.3%",
|
|
1507
|
+
},
|
|
1508
|
+
"scaling_events": [
|
|
1509
|
+
{
|
|
1510
|
+
"timestamp": "2024-01-01T10:30:00Z",
|
|
1511
|
+
"type": "scale_out",
|
|
1512
|
+
"reason": "high_cpu",
|
|
1513
|
+
"from_replicas": 2,
|
|
1514
|
+
"to_replicas": 4,
|
|
1515
|
+
}
|
|
1516
|
+
],
|
|
1517
|
+
"performance_trends": {
|
|
1518
|
+
"response_time_trend": "stable",
|
|
1519
|
+
"throughput_trend": "increasing",
|
|
1520
|
+
"error_rate_trend": "decreasing",
|
|
1521
|
+
},
|
|
1522
|
+
}
|
|
1523
|
+
|
|
1524
|
+
return resource_metrics
|
|
1525
|
+
|
|
1526
|
+
def get_devops_health_status(self, health_config: Dict[str, Any]) -> Dict[str, Any]:
|
|
1527
|
+
"""
|
|
1528
|
+
Get overall DevOps health status assessment.
|
|
1529
|
+
|
|
1530
|
+
Args:
|
|
1531
|
+
health_config: Health check configuration
|
|
1532
|
+
|
|
1533
|
+
Returns:
|
|
1534
|
+
DevOps health status assessment
|
|
1535
|
+
"""
|
|
1536
|
+
health_config.get("check_categories", ["deployment", "monitoring", "security", "performance"])
|
|
1537
|
+
thresholds = health_config.get("health_threshold", {"deployment_success": 95, "uptime": 99.9})
|
|
1538
|
+
|
|
1539
|
+
category_scores = {
|
|
1540
|
+
"deployment": 92,
|
|
1541
|
+
"monitoring": 88,
|
|
1542
|
+
"security": 95,
|
|
1543
|
+
"performance": 90,
|
|
1544
|
+
}
|
|
1545
|
+
|
|
1546
|
+
overall_health_score = sum(category_scores.values()) / len(category_scores)
|
|
1547
|
+
|
|
1548
|
+
health_status = {
|
|
1549
|
+
"overall_health_score": round(overall_health_score, 1),
|
|
1550
|
+
"category_scores": category_scores,
|
|
1551
|
+
"critical_issues": (
|
|
1552
|
+
[
|
|
1553
|
+
{
|
|
1554
|
+
"category": "monitoring",
|
|
1555
|
+
"severity": "medium",
|
|
1556
|
+
"description": "Some monitoring endpoints showing increased latency",
|
|
1557
|
+
}
|
|
1558
|
+
]
|
|
1559
|
+
if overall_health_score < 90
|
|
1560
|
+
else []
|
|
1561
|
+
),
|
|
1562
|
+
"recommendations": [
|
|
1563
|
+
"Optimize monitoring performance",
|
|
1564
|
+
"Review deployment automation",
|
|
1565
|
+
],
|
|
1566
|
+
"trends": {
|
|
1567
|
+
"overall_trend": "improving",
|
|
1568
|
+
"deployment_trend": "stable",
|
|
1569
|
+
"performance_trend": "improving",
|
|
1570
|
+
},
|
|
1571
|
+
"alerts": [
|
|
1572
|
+
{
|
|
1573
|
+
"category": "deployment",
|
|
1574
|
+
"threshold": thresholds.get("deployment_success", 95),
|
|
1575
|
+
"current_value": category_scores.get("deployment", 0),
|
|
1576
|
+
"status": (
|
|
1577
|
+
"healthy"
|
|
1578
|
+
if category_scores.get("deployment", 0) >= thresholds.get("deployment_success", 95)
|
|
1579
|
+
else "warning"
|
|
1580
|
+
),
|
|
1581
|
+
}
|
|
1582
|
+
],
|
|
1583
|
+
}
|
|
1584
|
+
|
|
1585
|
+
return health_status
|