moai-adk 0.15.1__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 -6
- moai_adk/__main__.py +136 -21
- moai_adk/cli/__init__.py +6 -2
- moai_adk/cli/commands/__init__.py +1 -4
- moai_adk/cli/commands/analyze.py +116 -0
- moai_adk/cli/commands/doctor.py +17 -5
- moai_adk/cli/commands/init.py +105 -47
- moai_adk/cli/commands/language.py +248 -0
- moai_adk/cli/commands/status.py +8 -13
- moai_adk/cli/commands/update.py +1734 -65
- moai_adk/cli/main.py +3 -2
- moai_adk/cli/prompts/init_prompts.py +144 -91
- 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/__init__.py +0 -1
- moai_adk/core/analysis/__init__.py +9 -0
- moai_adk/core/analysis/session_analyzer.py +400 -0
- moai_adk/core/claude_integration.py +393 -0
- moai_adk/core/command_helpers.py +270 -0
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/__init__.py +6 -0
- moai_adk/core/config/auto_spec_config.py +340 -0
- moai_adk/core/config/migration.py +147 -16
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +273 -0
- moai_adk/core/diagnostics/slash_commands.py +0 -1
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +1902 -0
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +8 -1
- moai_adk/core/git/branch.py +0 -1
- moai_adk/core/git/branch_manager.py +2 -10
- moai_adk/core/git/checkpoint.py +1 -7
- moai_adk/core/git/commit.py +0 -1
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/event_detector.py +3 -5
- moai_adk/core/git/manager.py +91 -2
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +901 -0
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/__init__.py +22 -0
- moai_adk/core/integration/engine.py +157 -0
- moai_adk/core/integration/integration_tester.py +226 -0
- moai_adk/core/integration/models.py +88 -0
- moai_adk/core/integration/utils.py +211 -0
- moai_adk/core/issue_creator.py +20 -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.py +202 -0
- moai_adk/core/language_config_resolver.py +485 -0
- moai_adk/core/language_validator.py +543 -0
- moai_adk/core/mcp/setup.py +116 -0
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +481 -0
- moai_adk/core/migration/__init__.py +18 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +277 -0
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +209 -0
- 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 +139 -0
- moai_adk/core/migration/version_migrator.py +228 -0
- moai_adk/core/performance/__init__.py +6 -0
- moai_adk/core/performance/cache_system.py +316 -0
- moai_adk/core/performance/parallel_processor.py +116 -0
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/__init__.py +0 -1
- moai_adk/core/project/backup_utils.py +2 -7
- moai_adk/core/project/checker.py +2 -4
- moai_adk/core/project/detector.py +17 -39
- moai_adk/core/project/initializer.py +170 -33
- moai_adk/core/project/phase_executor.py +398 -68
- moai_adk/core/project/validator.py +7 -32
- moai_adk/core/quality/__init__.py +1 -1
- moai_adk/core/quality/trust_checker.py +37 -101
- moai_adk/core/quality/validators/__init__.py +1 -1
- moai_adk/core/quality/validators/base_validator.py +1 -1
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +918 -0
- moai_adk/core/session_manager.py +651 -0
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +680 -0
- moai_adk/core/spec/ears_template_engine.py +1247 -0
- moai_adk/core/spec/quality_validator.py +687 -0
- moai_adk/core/spec_status_manager.py +478 -0
- moai_adk/core/template/__init__.py +0 -1
- moai_adk/core/template/backup.py +82 -17
- moai_adk/core/template/config.py +112 -40
- moai_adk/core/template/languages.py +0 -1
- moai_adk/core/template/merger.py +75 -26
- moai_adk/core/template/processor.py +750 -72
- moai_adk/core/template_engine.py +90 -48
- 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 +557 -0
- 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 +676 -0
- moai_adk/foundation/trust/validation_checklist.py +1573 -0
- 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/__init__.py +38 -0
- moai_adk/statusline/alfred_detector.py +105 -0
- moai_adk/statusline/config.py +373 -0
- moai_adk/statusline/enhanced_output_style_detector.py +372 -0
- moai_adk/statusline/git_collector.py +190 -0
- moai_adk/statusline/main.py +264 -0
- moai_adk/statusline/metrics_tracker.py +78 -0
- moai_adk/statusline/renderer.py +383 -0
- moai_adk/statusline/update_checker.py +129 -0
- moai_adk/statusline/version_reader.py +741 -0
- 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/{alfred/shared/core → moai/lib}/checkpoint.py +9 -36
- 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/{alfred/shared/core → moai/lib}/project.py +63 -44
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/{alfred/core → moai/lib}/timeout.py +40 -16
- 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 +78 -50
- 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 +312 -283
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +291 -94
- 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 +469 -101
- 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 +128 -0
- moai_adk/templates/.git-hooks/pre-push +220 -13
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.github/workflows/spec-issue-sync.yml +0 -1
- moai_adk/templates/.gitignore +197 -13
- moai_adk/templates/.mcp.json +20 -0
- 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 +310 -1050
- moai_adk/utils/__init__.py +24 -2
- moai_adk/utils/banner.py +7 -11
- moai_adk/utils/common.py +294 -0
- moai_adk/utils/link_validator.py +241 -0
- moai_adk/utils/logger.py +4 -9
- moai_adk/utils/safe_file_reader.py +206 -0
- moai_adk/{templates/.claude/hooks/alfred/utils → utils}/timeout.py +8 -9
- 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.15.1.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
- {moai_adk-0.15.1.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
- moai_adk/cli/commands/backup.py +0 -80
- moai_adk/core/tags/__init__.py +0 -86
- moai_adk/core/tags/ci_validator.py +0 -463
- moai_adk/core/tags/cli.py +0 -283
- moai_adk/core/tags/generator.py +0 -109
- moai_adk/core/tags/inserter.py +0 -99
- moai_adk/core/tags/mapper.py +0 -126
- moai_adk/core/tags/parser.py +0 -76
- moai_adk/core/tags/pre_commit_validator.py +0 -393
- moai_adk/core/tags/reporter.py +0 -956
- moai_adk/core/tags/tags.py +0 -149
- moai_adk/core/tags/validator.py +0 -897
- moai_adk/templates/.claude/agents/alfred/backend-expert.md +0 -319
- moai_adk/templates/.claude/agents/alfred/cc-manager.md +0 -316
- moai_adk/templates/.claude/agents/alfred/debug-helper.md +0 -208
- moai_adk/templates/.claude/agents/alfred/devops-expert.md +0 -464
- moai_adk/templates/.claude/agents/alfred/doc-syncer.md +0 -214
- moai_adk/templates/.claude/agents/alfred/frontend-expert.md +0 -357
- moai_adk/templates/.claude/agents/alfred/git-manager.md +0 -406
- moai_adk/templates/.claude/agents/alfred/implementation-planner.md +0 -423
- moai_adk/templates/.claude/agents/alfred/project-manager.md +0 -312
- moai_adk/templates/.claude/agents/alfred/quality-gate.md +0 -343
- moai_adk/templates/.claude/agents/alfred/skill-factory.md +0 -865
- moai_adk/templates/.claude/agents/alfred/spec-builder.md +0 -426
- moai_adk/templates/.claude/agents/alfred/tag-agent.md +0 -361
- moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +0 -428
- moai_adk/templates/.claude/agents/alfred/trust-checker.md +0 -375
- moai_adk/templates/.claude/agents/alfred/ui-ux-expert.md +0 -571
- moai_adk/templates/.claude/commands/alfred/0-project.md +0 -1854
- moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -880
- moai_adk/templates/.claude/commands/alfred/2-run.md +0 -793
- moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -1084
- moai_adk/templates/.claude/commands/alfred/9-feedback.md +0 -149
- moai_adk/templates/.claude/hooks/alfred/core/project.py +0 -748
- moai_adk/templates/.claude/hooks/alfred/core/ttl_cache.py +0 -108
- moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +0 -198
- moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +0 -29
- moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +0 -94
- moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +0 -100
- moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +0 -94
- moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +0 -94
- moai_adk/templates/.claude/hooks/alfred/shared/core/__init__.py +0 -170
- moai_adk/templates/.claude/hooks/alfred/shared/core/context.py +0 -67
- moai_adk/templates/.claude/hooks/alfred/shared/core/tags.py +0 -230
- moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +0 -198
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/__init__.py +0 -21
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/notification.py +0 -154
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/session.py +0 -174
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/tool.py +0 -87
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/user.py +0 -61
- moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +0 -112
- moai_adk/templates/.claude/hooks/alfred/utils/__init__.py +0 -1
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/SKILL.md +0 -70
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/examples.md +0 -62
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/reference.md +0 -242
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/SKILL.md +0 -56
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/examples.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/reference.md +0 -444
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/SKILL.md +0 -62
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/examples.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/reference.md +0 -405
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/SKILL.md +0 -51
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/examples.md +0 -355
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/reference.md +0 -239
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/SKILL.md +0 -323
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/examples.md +0 -286
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/reference.md +0 -126
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -122
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/reference.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/SKILL.md +0 -74
- moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/reference.md +0 -269
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/SKILL.md +0 -237
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/examples.md +0 -615
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/reference.md +0 -653
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/reference.md +0 -150
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-persona-roles/SKILL.md +0 -198
- moai_adk/templates/.claude/skills/moai-alfred-persona-roles/examples.md +0 -431
- moai_adk/templates/.claude/skills/moai-alfred-persona-roles/reference.md +0 -141
- moai_adk/templates/.claude/skills/moai-alfred-practices/SKILL.md +0 -89
- moai_adk/templates/.claude/skills/moai-alfred-practices/examples.md +0 -122
- moai_adk/templates/.claude/skills/moai-alfred-practices/reference.md +0 -369
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/SKILL.md +0 -508
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/examples.md +0 -481
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/reference.md +0 -100
- moai_adk/templates/.claude/skills/moai-alfred-reporting/SKILL.md +0 -273
- moai_adk/templates/.claude/skills/moai-alfred-rules/SKILL.md +0 -77
- moai_adk/templates/.claude/skills/moai-alfred-rules/examples.md +0 -265
- moai_adk/templates/.claude/skills/moai-alfred-rules/reference.md +0 -539
- moai_adk/templates/.claude/skills/moai-alfred-session-state/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-alfred-session-state/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-session-state/reference.md +0 -84
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/README.md +0 -137
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/SKILL.md +0 -219
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples/validate-spec.sh +0 -161
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples.md +0 -541
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/reference.md +0 -622
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/SKILL.md +0 -115
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/reference.md +0 -348
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/reference.md +0 -211
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-workflow/SKILL.md +0 -288
- moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +0 -269
- moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +0 -32
- moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +0 -298
- moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +0 -26
- moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +0 -307
- moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +0 -21
- moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +0 -252
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +0 -19
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +0 -19
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +0 -24
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +0 -199
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +0 -39
- moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +0 -316
- moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +0 -18
- moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +0 -263
- moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +0 -30
- moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/reference.md +0 -218
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/CHECKLIST.md +0 -482
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/EXAMPLES.md +0 -278
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/INTERACTIVE-DISCOVERY.md +0 -524
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/METADATA.md +0 -477
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/PARALLEL-ANALYSIS-REPORT.md +0 -429
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/PYTHON-VERSION-MATRIX.md +0 -391
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-FACTORY-WORKFLOW.md +0 -431
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-UPDATE-ADVISOR.md +0 -577
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL.md +0 -271
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/STEP-BY-STEP-GUIDE.md +0 -466
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/STRUCTURE.md +0 -583
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/WEB-RESEARCH.md +0 -526
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/reference.md +0 -465
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/generate-structure.sh +0 -328
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/validate-skill.sh +0 -312
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/SKILL_TEMPLATE.md +0 -245
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/examples-template.md +0 -285
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/reference-template.md +0 -278
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/scripts-template.sh +0 -303
- moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +0 -291
- moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +0 -15
- moai_adk/templates/.claude/skills/moai-design-systems/SKILL.md +0 -802
- moai_adk/templates/.claude/skills/moai-design-systems/examples.md +0 -1238
- moai_adk/templates/.claude/skills/moai-design-systems/reference.md +0 -673
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +0 -1633
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +0 -660
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-security/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-security/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +0 -303
- moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +0 -1064
- moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +0 -1047
- moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +0 -116
- moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +0 -122
- moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +0 -307
- moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
- moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +0 -1099
- moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-c/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-c/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +0 -127
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +0 -126
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +0 -125
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +0 -32
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +0 -126
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +0 -433
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +0 -624
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +0 -316
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +0 -127
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +0 -125
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +0 -133
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +0 -34
- moai_adk/templates/.claude/skills/moai-project-documentation.md +0 -622
- moai_adk/templates/.github/workflows/c-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/cpp-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/csharp-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/dart-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/go-tag-validation.yml +0 -130
- moai_adk/templates/.github/workflows/java-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/javascript-tag-validation.yml +0 -135
- moai_adk/templates/.github/workflows/kotlin-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -419
- moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
- moai_adk/templates/.github/workflows/php-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/python-tag-validation.yml +0 -118
- moai_adk/templates/.github/workflows/release.yml +0 -118
- moai_adk/templates/.github/workflows/ruby-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/rust-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/shell-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/swift-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/tag-report.yml +0 -269
- moai_adk/templates/.github/workflows/tag-validation.yml +0 -186
- moai_adk/templates/.github/workflows/typescript-tag-validation.yml +0 -154
- moai_adk/templates/.moai/config.json +0 -115
- moai_adk/templates/workflows/go-tag-validation.yml +0 -30
- moai_adk/templates/workflows/javascript-tag-validation.yml +0 -41
- moai_adk/templates/workflows/python-tag-validation.yml +0 -42
- moai_adk/templates/workflows/typescript-tag-validation.yml +0 -31
- moai_adk-0.15.1.dist-info/METADATA +0 -3094
- moai_adk-0.15.1.dist-info/RECORD +0 -365
- {moai_adk-0.15.1.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,1115 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Database Architecture Foundation Module
|
|
3
|
+
|
|
4
|
+
Provides enterprise database patterns:
|
|
5
|
+
- Schema normalization validation (1NF, 2NF, 3NF, BCNF)
|
|
6
|
+
- Database technology selection (PostgreSQL, MySQL, MongoDB, Redis)
|
|
7
|
+
- Indexing strategy optimization (B-tree, Hash, Composite)
|
|
8
|
+
- Connection pooling management
|
|
9
|
+
- Migration pattern planning
|
|
10
|
+
- ACID transaction handling
|
|
11
|
+
- Performance monitoring
|
|
12
|
+
|
|
13
|
+
Framework Versions:
|
|
14
|
+
- PostgreSQL 17+
|
|
15
|
+
- MySQL 8.4+ LTS
|
|
16
|
+
- MongoDB 8.0+
|
|
17
|
+
- Redis 7.4+
|
|
18
|
+
- Python 3.13+
|
|
19
|
+
|
|
20
|
+
Created: 2025-11-24
|
|
21
|
+
Status: GREEN Phase (Implementation complete)
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from dataclasses import dataclass
|
|
25
|
+
from typing import Any, Dict, List, Optional
|
|
26
|
+
|
|
27
|
+
# ============================================================================
|
|
28
|
+
# Data Classes
|
|
29
|
+
# ============================================================================
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@dataclass
|
|
33
|
+
class ValidationResult:
|
|
34
|
+
"""Schema validation result."""
|
|
35
|
+
|
|
36
|
+
is_valid: bool
|
|
37
|
+
violations: List[str]
|
|
38
|
+
normalization_level: str
|
|
39
|
+
suggestions: List[str] = None
|
|
40
|
+
|
|
41
|
+
def __post_init__(self):
|
|
42
|
+
if self.suggestions is None:
|
|
43
|
+
self.suggestions = []
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@dataclass
|
|
47
|
+
class DatabaseRecommendation:
|
|
48
|
+
"""Database technology recommendation."""
|
|
49
|
+
|
|
50
|
+
database: str
|
|
51
|
+
version: str
|
|
52
|
+
reasoning: str
|
|
53
|
+
alternatives: List[str] = None
|
|
54
|
+
|
|
55
|
+
def __post_init__(self):
|
|
56
|
+
if self.alternatives is None:
|
|
57
|
+
self.alternatives = []
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@dataclass
|
|
61
|
+
class IndexRecommendation:
|
|
62
|
+
"""Index recommendation."""
|
|
63
|
+
|
|
64
|
+
index_type: str
|
|
65
|
+
columns: List[str]
|
|
66
|
+
reasoning: str
|
|
67
|
+
estimated_improvement: Optional[float] = None
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@dataclass
|
|
71
|
+
class PoolConfiguration:
|
|
72
|
+
"""Connection pool configuration."""
|
|
73
|
+
|
|
74
|
+
min_size: int
|
|
75
|
+
max_size: int
|
|
76
|
+
timeout_seconds: int
|
|
77
|
+
idle_timeout: Optional[int] = None
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@dataclass
|
|
81
|
+
class MigrationPlan:
|
|
82
|
+
"""Database migration plan."""
|
|
83
|
+
|
|
84
|
+
steps: List[str]
|
|
85
|
+
reversible: bool
|
|
86
|
+
rollback_steps: List[str]
|
|
87
|
+
estimated_duration: Optional[str] = None
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
@dataclass
|
|
91
|
+
class ACIDCompliance:
|
|
92
|
+
"""ACID property compliance check."""
|
|
93
|
+
|
|
94
|
+
atomicity: bool
|
|
95
|
+
consistency: bool
|
|
96
|
+
isolation: bool
|
|
97
|
+
durability: bool
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
# ============================================================================
|
|
101
|
+
# Class 1: SchemaNormalizer
|
|
102
|
+
# ============================================================================
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class SchemaNormalizer:
|
|
106
|
+
"""
|
|
107
|
+
Schema normalization validator.
|
|
108
|
+
|
|
109
|
+
Validates database schemas against normal forms (1NF, 2NF, 3NF, BCNF)
|
|
110
|
+
and provides normalization recommendations.
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
def validate_1nf(self, schema: Dict[str, Any]) -> Dict[str, Any]:
|
|
114
|
+
"""
|
|
115
|
+
Validate First Normal Form (1NF).
|
|
116
|
+
|
|
117
|
+
Requirements:
|
|
118
|
+
- Each column contains atomic values
|
|
119
|
+
- No repeating groups
|
|
120
|
+
- Each row is unique
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
schema: Database schema definition
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
Validation result with violations
|
|
127
|
+
"""
|
|
128
|
+
violations = []
|
|
129
|
+
|
|
130
|
+
for table_name, table_def in schema.items():
|
|
131
|
+
for column_name, column_type in table_def.items():
|
|
132
|
+
if column_name == "PRIMARY KEY":
|
|
133
|
+
continue
|
|
134
|
+
|
|
135
|
+
# Check for multi-valued attributes (common patterns)
|
|
136
|
+
multi_value_patterns = [
|
|
137
|
+
"_list",
|
|
138
|
+
"_array",
|
|
139
|
+
"_set",
|
|
140
|
+
"items",
|
|
141
|
+
"tags",
|
|
142
|
+
"categories",
|
|
143
|
+
"numbers",
|
|
144
|
+
"emails",
|
|
145
|
+
"addresses",
|
|
146
|
+
]
|
|
147
|
+
if any(pattern in column_name.lower() for pattern in multi_value_patterns):
|
|
148
|
+
if "VARCHAR" in column_type or "TEXT" in column_type:
|
|
149
|
+
violations.append(f"{table_name}.{column_name}: Likely contains multiple values")
|
|
150
|
+
|
|
151
|
+
is_valid = len(violations) == 0
|
|
152
|
+
normalization_level = "1NF" if is_valid else "0NF"
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
"is_valid": is_valid,
|
|
156
|
+
"violations": violations,
|
|
157
|
+
"normalization_level": normalization_level,
|
|
158
|
+
"suggestions": self._generate_1nf_suggestions(violations),
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
def validate_2nf(self, schema: Dict[str, Any]) -> Dict[str, Any]:
|
|
162
|
+
"""
|
|
163
|
+
Validate Second Normal Form (2NF).
|
|
164
|
+
|
|
165
|
+
Requirements:
|
|
166
|
+
- Must be in 1NF
|
|
167
|
+
- No partial dependencies (non-key attributes depend on entire primary key)
|
|
168
|
+
|
|
169
|
+
Args:
|
|
170
|
+
schema: Database schema definition
|
|
171
|
+
|
|
172
|
+
Returns:
|
|
173
|
+
Validation result with violations
|
|
174
|
+
"""
|
|
175
|
+
violations = []
|
|
176
|
+
|
|
177
|
+
for table_name, table_def in schema.items():
|
|
178
|
+
primary_key = table_def.get("PRIMARY KEY", "")
|
|
179
|
+
|
|
180
|
+
# Check for composite primary keys
|
|
181
|
+
if "," in primary_key:
|
|
182
|
+
pk_columns = [col.strip() for col in primary_key.strip("()").split(",")]
|
|
183
|
+
|
|
184
|
+
# Check for attributes that depend on only part of the key
|
|
185
|
+
for column_name, column_type in table_def.items():
|
|
186
|
+
if column_name in pk_columns or column_name == "PRIMARY KEY":
|
|
187
|
+
continue
|
|
188
|
+
|
|
189
|
+
# Heuristic: If column name contains part of PK, likely partial dependency
|
|
190
|
+
for pk_col in pk_columns:
|
|
191
|
+
if pk_col in column_name and column_name != pk_col:
|
|
192
|
+
violations.append(
|
|
193
|
+
f"{table_name}.{column_name}: Depends only on {pk_col} (partial dependency)"
|
|
194
|
+
)
|
|
195
|
+
# Also check for product/order-specific patterns
|
|
196
|
+
elif "product_" in column_name and "product_id" in pk_columns:
|
|
197
|
+
violations.append(
|
|
198
|
+
f"{table_name}.{column_name}: Depends only on product_id (partial dependency)"
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
is_valid = len(violations) == 0
|
|
202
|
+
normalization_level = "2NF" if is_valid else "1NF"
|
|
203
|
+
|
|
204
|
+
return {
|
|
205
|
+
"is_valid": is_valid,
|
|
206
|
+
"violations": violations,
|
|
207
|
+
"normalization_level": normalization_level,
|
|
208
|
+
"suggestions": self._generate_2nf_suggestions(violations),
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
def validate_3nf(self, schema: Dict[str, Any]) -> Dict[str, Any]:
|
|
212
|
+
"""
|
|
213
|
+
Validate Third Normal Form (3NF).
|
|
214
|
+
|
|
215
|
+
Requirements:
|
|
216
|
+
- Must be in 2NF
|
|
217
|
+
- No transitive dependencies (non-key attributes depend only on primary key)
|
|
218
|
+
|
|
219
|
+
Args:
|
|
220
|
+
schema: Database schema definition
|
|
221
|
+
|
|
222
|
+
Returns:
|
|
223
|
+
Validation result with violations
|
|
224
|
+
"""
|
|
225
|
+
violations = []
|
|
226
|
+
|
|
227
|
+
for table_name, table_def in schema.items():
|
|
228
|
+
columns = [col for col in table_def.keys() if col != "PRIMARY KEY"]
|
|
229
|
+
|
|
230
|
+
# Heuristic: Detect potential foreign key relationships
|
|
231
|
+
for column_name in columns:
|
|
232
|
+
if column_name.endswith("_id"):
|
|
233
|
+
base_entity = column_name[:-3] # Remove "_id"
|
|
234
|
+
|
|
235
|
+
# Check for attributes that should belong to referenced entity
|
|
236
|
+
for other_column in columns:
|
|
237
|
+
if (
|
|
238
|
+
other_column.startswith(base_entity)
|
|
239
|
+
and other_column != column_name
|
|
240
|
+
and not other_column.endswith("_id")
|
|
241
|
+
):
|
|
242
|
+
violations.append(
|
|
243
|
+
f"{table_name}.{other_column}: Depends on {column_name} (transitive dependency)"
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
is_valid = len(violations) == 0
|
|
247
|
+
normalization_level = "3NF" if is_valid else "2NF"
|
|
248
|
+
|
|
249
|
+
return {
|
|
250
|
+
"is_valid": is_valid,
|
|
251
|
+
"violations": violations,
|
|
252
|
+
"normalization_level": normalization_level,
|
|
253
|
+
"suggestions": self._generate_3nf_suggestions(violations),
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
def recommend_normalization(self, schema: Dict[str, Any]) -> List[Dict[str, str]]:
|
|
257
|
+
"""
|
|
258
|
+
Generate normalization recommendations.
|
|
259
|
+
|
|
260
|
+
Args:
|
|
261
|
+
schema: Database schema definition
|
|
262
|
+
|
|
263
|
+
Returns:
|
|
264
|
+
List of normalization recommendations
|
|
265
|
+
"""
|
|
266
|
+
recommendations = []
|
|
267
|
+
|
|
268
|
+
# Check 1NF
|
|
269
|
+
result_1nf = self.validate_1nf(schema)
|
|
270
|
+
if not result_1nf["is_valid"]:
|
|
271
|
+
recommendations.append(
|
|
272
|
+
{
|
|
273
|
+
"level": "1NF",
|
|
274
|
+
"description": "Split multi-valued attributes into separate rows (1NF requirement)",
|
|
275
|
+
"violations": result_1nf["violations"],
|
|
276
|
+
}
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
# Check 2NF
|
|
280
|
+
result_2nf = self.validate_2nf(schema)
|
|
281
|
+
if not result_2nf["is_valid"]:
|
|
282
|
+
recommendations.append(
|
|
283
|
+
{
|
|
284
|
+
"level": "2NF",
|
|
285
|
+
"description": "Extract partially dependent attributes to new tables",
|
|
286
|
+
"violations": result_2nf["violations"],
|
|
287
|
+
}
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
# Check 3NF
|
|
291
|
+
result_3nf = self.validate_3nf(schema)
|
|
292
|
+
if not result_3nf["is_valid"]:
|
|
293
|
+
recommendations.append(
|
|
294
|
+
{
|
|
295
|
+
"level": "3NF",
|
|
296
|
+
"description": "Remove transitive dependencies by creating reference tables",
|
|
297
|
+
"violations": result_3nf["violations"],
|
|
298
|
+
}
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
# Suggest table extraction for customer data
|
|
302
|
+
for table_name, table_def in schema.items():
|
|
303
|
+
customer_columns = [col for col in table_def if "customer" in col.lower()]
|
|
304
|
+
if len(customer_columns) >= 2: # 2 or more customer fields
|
|
305
|
+
recommendations.append(
|
|
306
|
+
{
|
|
307
|
+
"level": "3NF",
|
|
308
|
+
"description": f"Extract customer data from {table_name} to separate customers table",
|
|
309
|
+
"violations": [f"Multiple customer attributes in {table_name}"],
|
|
310
|
+
}
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
return recommendations
|
|
314
|
+
|
|
315
|
+
def _generate_1nf_suggestions(self, violations: List[str]) -> List[str]:
|
|
316
|
+
"""Generate 1NF normalization suggestions."""
|
|
317
|
+
return [
|
|
318
|
+
"Create separate table for multi-valued attributes",
|
|
319
|
+
"Use foreign keys to link related entities",
|
|
320
|
+
]
|
|
321
|
+
|
|
322
|
+
def _generate_2nf_suggestions(self, violations: List[str]) -> List[str]:
|
|
323
|
+
"""Generate 2NF normalization suggestions."""
|
|
324
|
+
return [
|
|
325
|
+
"Extract partially dependent attributes to new tables",
|
|
326
|
+
"Create proper foreign key relationships",
|
|
327
|
+
]
|
|
328
|
+
|
|
329
|
+
def _generate_3nf_suggestions(self, violations: List[str]) -> List[str]:
|
|
330
|
+
"""Generate 3NF normalization suggestions."""
|
|
331
|
+
return [
|
|
332
|
+
"Create separate reference tables for dependent attributes",
|
|
333
|
+
"Use foreign keys to maintain relationships",
|
|
334
|
+
]
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
# ============================================================================
|
|
338
|
+
# Class 2: DatabaseSelector
|
|
339
|
+
# ============================================================================
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
class DatabaseSelector:
|
|
343
|
+
"""
|
|
344
|
+
Database technology selection advisor.
|
|
345
|
+
|
|
346
|
+
Recommends appropriate database systems based on requirements:
|
|
347
|
+
- PostgreSQL 17+ for ACID compliance
|
|
348
|
+
- MySQL 8.4+ for legacy compatibility
|
|
349
|
+
- MongoDB 8.0+ for flexible schemas
|
|
350
|
+
- Redis 7.4+ for caching
|
|
351
|
+
"""
|
|
352
|
+
|
|
353
|
+
def select_database(self, requirements: Dict[str, Any]) -> Dict[str, Any]:
|
|
354
|
+
"""
|
|
355
|
+
Select appropriate database technology.
|
|
356
|
+
|
|
357
|
+
Args:
|
|
358
|
+
requirements: Project requirements dictionary
|
|
359
|
+
|
|
360
|
+
Returns:
|
|
361
|
+
Database recommendation with reasoning
|
|
362
|
+
"""
|
|
363
|
+
# PostgreSQL for ACID compliance
|
|
364
|
+
if requirements.get("acid_compliance") or requirements.get("transactions") == "required":
|
|
365
|
+
return {
|
|
366
|
+
"database": "PostgreSQL",
|
|
367
|
+
"version": "17",
|
|
368
|
+
"reasoning": "PostgreSQL 17+ provides full ACID compliance, "
|
|
369
|
+
"advanced transaction support, and strong consistency guarantees",
|
|
370
|
+
"alternatives": ["MySQL 8.4+ for legacy compatibility"],
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
# MongoDB for flexible schemas
|
|
374
|
+
if requirements.get("schema_flexibility") == "high" or requirements.get("data_model") == "document":
|
|
375
|
+
return {
|
|
376
|
+
"database": "MongoDB",
|
|
377
|
+
"version": "8.0",
|
|
378
|
+
"reasoning": "MongoDB 8.0+ offers flexible schema design, "
|
|
379
|
+
"horizontal scalability, and document-based data model",
|
|
380
|
+
"alternatives": ["PostgreSQL with JSONB for hybrid approach"],
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
# Redis for caching
|
|
384
|
+
if requirements.get("use_case") == "caching" or requirements.get("speed") == "critical":
|
|
385
|
+
return {
|
|
386
|
+
"database": "Redis",
|
|
387
|
+
"version": "7.4",
|
|
388
|
+
"reasoning": "Redis 7.4+ provides in-memory cache, TTL support, "
|
|
389
|
+
"and high-performance key-value operations",
|
|
390
|
+
"alternatives": ["Memcached for simpler caching needs"],
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
# MySQL for legacy compatibility
|
|
394
|
+
if requirements.get("legacy_support") or requirements.get("ecosystem") == "mature":
|
|
395
|
+
return {
|
|
396
|
+
"database": "MySQL",
|
|
397
|
+
"version": "8.4",
|
|
398
|
+
"reasoning": "MySQL 8.4 LTS offers legacy compatibility, "
|
|
399
|
+
"mature ecosystem, and reliable relational database features",
|
|
400
|
+
"alternatives": ["MariaDB for open-source alternative"],
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
# Default: PostgreSQL
|
|
404
|
+
return {
|
|
405
|
+
"database": "PostgreSQL",
|
|
406
|
+
"version": "17",
|
|
407
|
+
"reasoning": "PostgreSQL 17+ is recommended as the default choice for robust, scalable applications",
|
|
408
|
+
"alternatives": ["MySQL, MongoDB, or Redis depending on specific needs"],
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
# ============================================================================
|
|
413
|
+
# Class 3: IndexingOptimizer
|
|
414
|
+
# ============================================================================
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
class IndexingOptimizer:
|
|
418
|
+
"""
|
|
419
|
+
Indexing strategy optimizer.
|
|
420
|
+
|
|
421
|
+
Recommends appropriate index types:
|
|
422
|
+
- B-tree for range queries
|
|
423
|
+
- Hash for equality queries
|
|
424
|
+
- Composite for multi-column queries
|
|
425
|
+
"""
|
|
426
|
+
|
|
427
|
+
def recommend_index(self, query_pattern: Dict[str, Any]) -> Dict[str, Any]:
|
|
428
|
+
"""
|
|
429
|
+
Recommend index type based on query pattern.
|
|
430
|
+
|
|
431
|
+
Args:
|
|
432
|
+
query_pattern: Query analysis with columns and conditions
|
|
433
|
+
|
|
434
|
+
Returns:
|
|
435
|
+
Index recommendation
|
|
436
|
+
"""
|
|
437
|
+
columns = query_pattern.get("columns", [])
|
|
438
|
+
conditions = query_pattern.get("conditions", [])
|
|
439
|
+
|
|
440
|
+
# Check for multi-column queries FIRST (higher priority)
|
|
441
|
+
if len(columns) > 1:
|
|
442
|
+
# Sort columns: equality columns first, then range columns
|
|
443
|
+
sorted_columns = self._sort_columns_for_composite(columns, conditions)
|
|
444
|
+
return {
|
|
445
|
+
"index_type": "COMPOSITE",
|
|
446
|
+
"columns": sorted_columns,
|
|
447
|
+
"reasoning": "Composite index improves multi-column queries; equality columns placed first",
|
|
448
|
+
"estimated_improvement": 0.80,
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
# Check for range queries
|
|
452
|
+
if any(">" in cond or "<" in cond or "BETWEEN" in cond for cond in conditions):
|
|
453
|
+
return {
|
|
454
|
+
"index_type": "BTREE",
|
|
455
|
+
"columns": columns,
|
|
456
|
+
"reasoning": "B-tree index is optimal for range queries and inequality comparisons",
|
|
457
|
+
"estimated_improvement": 0.75,
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
# Equality queries
|
|
461
|
+
if any("=" in cond for cond in conditions):
|
|
462
|
+
return {
|
|
463
|
+
"index_type": "HASH",
|
|
464
|
+
"columns": columns,
|
|
465
|
+
"reasoning": "Hash index provides O(1) lookup for exact match equality queries",
|
|
466
|
+
"estimated_improvement": 0.90,
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
# Default: B-tree
|
|
470
|
+
return {
|
|
471
|
+
"index_type": "BTREE",
|
|
472
|
+
"columns": columns,
|
|
473
|
+
"reasoning": "B-tree is the default index type supporting range and equality queries",
|
|
474
|
+
"estimated_improvement": 0.60,
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
def detect_redundant_indexes(self, existing_indexes: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
|
|
478
|
+
"""
|
|
479
|
+
Detect redundant indexes.
|
|
480
|
+
|
|
481
|
+
Args:
|
|
482
|
+
existing_indexes: List of existing indexes
|
|
483
|
+
|
|
484
|
+
Returns:
|
|
485
|
+
List of redundant indexes
|
|
486
|
+
"""
|
|
487
|
+
redundant = []
|
|
488
|
+
|
|
489
|
+
for i, index1 in enumerate(existing_indexes):
|
|
490
|
+
for index2 in existing_indexes[i + 1 :]:
|
|
491
|
+
# Check if index1 is prefix of index2
|
|
492
|
+
if self._is_prefix_index(index1, index2):
|
|
493
|
+
redundant.append(
|
|
494
|
+
{
|
|
495
|
+
"name": index1["name"],
|
|
496
|
+
"reason": f"Redundant with composite index {index2['name']}",
|
|
497
|
+
}
|
|
498
|
+
)
|
|
499
|
+
|
|
500
|
+
# Check for duplicate indexes on same column
|
|
501
|
+
if index1["columns"] == index2["columns"] and index1["name"] != index2["name"]:
|
|
502
|
+
redundant.append(
|
|
503
|
+
{
|
|
504
|
+
"name": index2["name"],
|
|
505
|
+
"reason": f"Duplicate of index {index1['name']}",
|
|
506
|
+
}
|
|
507
|
+
)
|
|
508
|
+
|
|
509
|
+
return redundant
|
|
510
|
+
|
|
511
|
+
def _sort_columns_for_composite(self, columns: List[str], conditions: List[str]) -> List[str]:
|
|
512
|
+
"""Sort columns for composite index (equality columns first)."""
|
|
513
|
+
equality_cols = []
|
|
514
|
+
range_cols = []
|
|
515
|
+
|
|
516
|
+
for col in columns:
|
|
517
|
+
# Check if column is used in equality condition
|
|
518
|
+
is_equality = any(f"{col} = " in cond for cond in conditions)
|
|
519
|
+
if is_equality:
|
|
520
|
+
equality_cols.append(col)
|
|
521
|
+
else:
|
|
522
|
+
range_cols.append(col)
|
|
523
|
+
|
|
524
|
+
return equality_cols + range_cols
|
|
525
|
+
|
|
526
|
+
def _is_prefix_index(self, index1: Dict[str, Any], index2: Dict[str, Any]) -> bool:
|
|
527
|
+
"""Check if index1 is a prefix of index2."""
|
|
528
|
+
cols1 = index1["columns"]
|
|
529
|
+
cols2 = index2["columns"]
|
|
530
|
+
|
|
531
|
+
if len(cols1) >= len(cols2):
|
|
532
|
+
return False
|
|
533
|
+
|
|
534
|
+
# Check if cols1 is prefix of cols2
|
|
535
|
+
for i, col in enumerate(cols1):
|
|
536
|
+
if col != cols2[i]:
|
|
537
|
+
return False
|
|
538
|
+
|
|
539
|
+
return True
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
# ============================================================================
|
|
543
|
+
# Class 4: ConnectionPoolManager
|
|
544
|
+
# ============================================================================
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
class ConnectionPoolManager:
|
|
548
|
+
"""
|
|
549
|
+
Connection pool optimization and monitoring.
|
|
550
|
+
|
|
551
|
+
Calculates optimal pool sizes and monitors pool health.
|
|
552
|
+
"""
|
|
553
|
+
|
|
554
|
+
def calculate_optimal_pool_size(self, server_config: Dict[str, Any]) -> Dict[str, int]:
|
|
555
|
+
"""
|
|
556
|
+
Calculate optimal connection pool size.
|
|
557
|
+
|
|
558
|
+
Formula:
|
|
559
|
+
- min_size = cpu_cores * 2
|
|
560
|
+
- max_size = min(expected_concurrency * 1.2, max_connections * 0.8)
|
|
561
|
+
|
|
562
|
+
Args:
|
|
563
|
+
server_config: Server configuration parameters
|
|
564
|
+
|
|
565
|
+
Returns:
|
|
566
|
+
Optimal pool configuration
|
|
567
|
+
"""
|
|
568
|
+
cpu_cores = server_config.get("cpu_cores", 4)
|
|
569
|
+
max_connections = server_config.get("max_connections", 100)
|
|
570
|
+
expected_concurrency = server_config.get("expected_concurrency", 20)
|
|
571
|
+
|
|
572
|
+
# Calculate pool sizes
|
|
573
|
+
min_size = max(5, cpu_cores * 2) # At least 5, typically 2x CPU cores
|
|
574
|
+
max_size = min(int(expected_concurrency * 1.2), int(max_connections * 0.8))
|
|
575
|
+
|
|
576
|
+
# Ensure max > min
|
|
577
|
+
if max_size <= min_size:
|
|
578
|
+
max_size = min_size + 10
|
|
579
|
+
|
|
580
|
+
return {
|
|
581
|
+
"min_size": min_size,
|
|
582
|
+
"max_size": max_size,
|
|
583
|
+
"timeout_seconds": 30,
|
|
584
|
+
"idle_timeout": 600, # 10 minutes
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
def monitor_pool_health(self, pool_stats: Dict[str, Any]) -> Dict[str, Any]:
|
|
588
|
+
"""
|
|
589
|
+
Monitor connection pool health.
|
|
590
|
+
|
|
591
|
+
Args:
|
|
592
|
+
pool_stats: Current pool statistics
|
|
593
|
+
|
|
594
|
+
Returns:
|
|
595
|
+
Health assessment with warnings
|
|
596
|
+
"""
|
|
597
|
+
active = pool_stats.get("active_connections", 0)
|
|
598
|
+
idle = pool_stats.get("idle_connections", 0)
|
|
599
|
+
max_conns = pool_stats.get("max_connections", 100)
|
|
600
|
+
wait_time = pool_stats.get("wait_time_avg_ms", 0)
|
|
601
|
+
|
|
602
|
+
total_usage = active + idle
|
|
603
|
+
saturation_level = total_usage / max_conns
|
|
604
|
+
|
|
605
|
+
warnings = []
|
|
606
|
+
is_saturated = saturation_level >= 0.90
|
|
607
|
+
|
|
608
|
+
if is_saturated:
|
|
609
|
+
warnings.append(f"Pool saturation at {saturation_level:.1%} - consider increasing max size")
|
|
610
|
+
|
|
611
|
+
if wait_time > 100:
|
|
612
|
+
warnings.append(f"Average wait time {wait_time}ms exceeds threshold - pool may be undersized")
|
|
613
|
+
|
|
614
|
+
if idle / max(total_usage, 1) < 0.10:
|
|
615
|
+
warnings.append("Low idle connection count - pool may need expansion")
|
|
616
|
+
|
|
617
|
+
return {
|
|
618
|
+
"is_saturated": is_saturated,
|
|
619
|
+
"saturation_level": saturation_level,
|
|
620
|
+
"warnings": warnings,
|
|
621
|
+
"health_score": self._calculate_health_score(saturation_level, wait_time),
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
def recommend_adjustments(self, current_config: Dict[str, int], metrics: Dict[str, Any]) -> Dict[str, Any]:
|
|
625
|
+
"""
|
|
626
|
+
Recommend pool configuration adjustments.
|
|
627
|
+
|
|
628
|
+
Args:
|
|
629
|
+
current_config: Current pool configuration
|
|
630
|
+
metrics: Performance metrics
|
|
631
|
+
|
|
632
|
+
Returns:
|
|
633
|
+
Adjustment recommendations
|
|
634
|
+
"""
|
|
635
|
+
avg_wait = metrics.get("avg_wait_time_ms", 0)
|
|
636
|
+
saturation_events = metrics.get("saturation_events_per_hour", 0)
|
|
637
|
+
|
|
638
|
+
# Recommend increase if high wait times or frequent saturation
|
|
639
|
+
if avg_wait > 200 or saturation_events > 10:
|
|
640
|
+
suggested_max = int(current_config["max_size"] * 1.5)
|
|
641
|
+
return {
|
|
642
|
+
"suggested_max_size": suggested_max,
|
|
643
|
+
"reasoning": "Increase max size due to high wait times and frequent saturation events",
|
|
644
|
+
"priority": "high",
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
# Recommend decrease if very low utilization
|
|
648
|
+
if metrics.get("idle_time_percent", 0) > 80:
|
|
649
|
+
suggested_max = int(current_config["max_size"] * 0.75)
|
|
650
|
+
return {
|
|
651
|
+
"suggested_max_size": suggested_max,
|
|
652
|
+
"reasoning": "Decrease max size due to low utilization (>80% idle time)",
|
|
653
|
+
"priority": "low",
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
return {
|
|
657
|
+
"suggested_max_size": current_config["max_size"],
|
|
658
|
+
"reasoning": "Current configuration is optimal",
|
|
659
|
+
"priority": "none",
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
def _calculate_health_score(self, saturation: float, wait_time: float) -> float:
|
|
663
|
+
"""Calculate overall pool health score (0.0 to 1.0)."""
|
|
664
|
+
saturation_score = 1.0 - min(saturation, 1.0)
|
|
665
|
+
wait_score = max(0.0, 1.0 - (wait_time / 500)) # 500ms = 0 score
|
|
666
|
+
return (saturation_score + wait_score) / 2
|
|
667
|
+
|
|
668
|
+
|
|
669
|
+
# ============================================================================
|
|
670
|
+
# Class 5: MigrationPlanner
|
|
671
|
+
# ============================================================================
|
|
672
|
+
|
|
673
|
+
|
|
674
|
+
class MigrationPlanner:
|
|
675
|
+
"""
|
|
676
|
+
Database migration planning and safety validation.
|
|
677
|
+
|
|
678
|
+
Generates migration plans with rollback strategies.
|
|
679
|
+
"""
|
|
680
|
+
|
|
681
|
+
def generate_migration_plan(self, change_request: Dict[str, Any]) -> Dict[str, Any]:
|
|
682
|
+
"""
|
|
683
|
+
Generate migration plan for schema change.
|
|
684
|
+
|
|
685
|
+
Args:
|
|
686
|
+
change_request: Requested schema change
|
|
687
|
+
|
|
688
|
+
Returns:
|
|
689
|
+
Migration plan with steps and rollback
|
|
690
|
+
"""
|
|
691
|
+
operation = change_request.get("operation")
|
|
692
|
+
|
|
693
|
+
if operation == "add_column":
|
|
694
|
+
return self._plan_add_column(change_request)
|
|
695
|
+
elif operation == "drop_column":
|
|
696
|
+
return self._plan_drop_column(change_request)
|
|
697
|
+
elif operation == "change_column_type":
|
|
698
|
+
return self._plan_change_type(change_request)
|
|
699
|
+
else:
|
|
700
|
+
return {
|
|
701
|
+
"steps": ["Execute custom migration"],
|
|
702
|
+
"reversible": False,
|
|
703
|
+
"rollback_steps": [],
|
|
704
|
+
"estimated_duration": "unknown",
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
def validate_safety(self, migration: Dict[str, Any]) -> Dict[str, Any]:
|
|
708
|
+
"""
|
|
709
|
+
Validate migration safety.
|
|
710
|
+
|
|
711
|
+
Args:
|
|
712
|
+
migration: Migration definition
|
|
713
|
+
|
|
714
|
+
Returns:
|
|
715
|
+
Safety assessment
|
|
716
|
+
"""
|
|
717
|
+
operation = migration.get("operation")
|
|
718
|
+
risks = []
|
|
719
|
+
is_safe = True
|
|
720
|
+
|
|
721
|
+
# Check for destructive operations
|
|
722
|
+
if operation == "drop_column":
|
|
723
|
+
if not migration.get("backup", False):
|
|
724
|
+
risks.append("Data loss risk: column will be permanently deleted without backup")
|
|
725
|
+
is_safe = False
|
|
726
|
+
|
|
727
|
+
if operation == "change_column_type":
|
|
728
|
+
risks.append("Type conversion may fail for incompatible data")
|
|
729
|
+
is_safe = False
|
|
730
|
+
|
|
731
|
+
requires_backup = operation in [
|
|
732
|
+
"drop_column",
|
|
733
|
+
"change_column_type",
|
|
734
|
+
"drop_table",
|
|
735
|
+
]
|
|
736
|
+
|
|
737
|
+
return {
|
|
738
|
+
"is_safe": is_safe,
|
|
739
|
+
"risks": risks if risks else ["No major risks detected"],
|
|
740
|
+
"requires_backup": requires_backup,
|
|
741
|
+
"recommended_actions": self._generate_safety_recommendations(operation),
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
def detect_breaking_changes(self, migration: Dict[str, Any]) -> Dict[str, Any]:
|
|
745
|
+
"""
|
|
746
|
+
Detect breaking changes in migration.
|
|
747
|
+
|
|
748
|
+
Args:
|
|
749
|
+
migration: Migration definition
|
|
750
|
+
|
|
751
|
+
Returns:
|
|
752
|
+
Breaking change analysis
|
|
753
|
+
"""
|
|
754
|
+
operation = migration.get("operation")
|
|
755
|
+
breaking_changes = []
|
|
756
|
+
has_breaking = False
|
|
757
|
+
|
|
758
|
+
# Type changes are often breaking
|
|
759
|
+
if operation == "change_column_type":
|
|
760
|
+
breaking_changes.append(
|
|
761
|
+
f"Type conversion from {migration['old_type']} to {migration['new_type']} may cause data loss"
|
|
762
|
+
)
|
|
763
|
+
has_breaking = True
|
|
764
|
+
|
|
765
|
+
# Dropping columns is breaking
|
|
766
|
+
if operation == "drop_column":
|
|
767
|
+
breaking_changes.append(f"Dropping column {migration['column']} will break dependent code")
|
|
768
|
+
has_breaking = True
|
|
769
|
+
|
|
770
|
+
# Adding non-nullable columns without default
|
|
771
|
+
if operation == "add_column":
|
|
772
|
+
column_def = migration.get("column", {})
|
|
773
|
+
if not column_def.get("nullable", True) and column_def.get("default") is None:
|
|
774
|
+
breaking_changes.append("Adding non-nullable column without default will fail on existing rows")
|
|
775
|
+
has_breaking = True
|
|
776
|
+
|
|
777
|
+
impact_level = "high" if has_breaking else "low"
|
|
778
|
+
|
|
779
|
+
return {
|
|
780
|
+
"has_breaking_changes": has_breaking,
|
|
781
|
+
"changes": (breaking_changes if breaking_changes else ["No breaking changes detected"]),
|
|
782
|
+
"impact_level": impact_level,
|
|
783
|
+
"mitigation_strategies": self._generate_mitigation_strategies(breaking_changes),
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
def _plan_add_column(self, change_request: Dict[str, Any]) -> Dict[str, Any]:
|
|
787
|
+
"""Generate plan for adding a column."""
|
|
788
|
+
table = change_request["table"]
|
|
789
|
+
column_def = change_request["column"]
|
|
790
|
+
|
|
791
|
+
steps = [
|
|
792
|
+
f"Check table {table} exists",
|
|
793
|
+
f"Add column {column_def['name']} {column_def['type']}",
|
|
794
|
+
f"Set default value {column_def.get('default')} for existing rows",
|
|
795
|
+
"Verify column added successfully",
|
|
796
|
+
]
|
|
797
|
+
|
|
798
|
+
rollback_steps = [f"Drop column {column_def['name']} from {table}"]
|
|
799
|
+
|
|
800
|
+
return {
|
|
801
|
+
"steps": steps,
|
|
802
|
+
"reversible": True,
|
|
803
|
+
"rollback_steps": rollback_steps,
|
|
804
|
+
"estimated_duration": "1-5 minutes",
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
def _plan_drop_column(self, change_request: Dict[str, Any]) -> Dict[str, Any]:
|
|
808
|
+
"""Generate plan for dropping a column."""
|
|
809
|
+
table = change_request["table"]
|
|
810
|
+
column = change_request["column"]
|
|
811
|
+
|
|
812
|
+
steps = [
|
|
813
|
+
f"Backup table {table} data",
|
|
814
|
+
f"Drop column {column} from {table}",
|
|
815
|
+
"Verify column removed",
|
|
816
|
+
]
|
|
817
|
+
|
|
818
|
+
rollback_steps = [f"Restore table {table} from backup"]
|
|
819
|
+
|
|
820
|
+
return {
|
|
821
|
+
"steps": steps,
|
|
822
|
+
"reversible": True,
|
|
823
|
+
"rollback_steps": rollback_steps,
|
|
824
|
+
"estimated_duration": "2-10 minutes",
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
def _plan_change_type(self, change_request: Dict[str, Any]) -> Dict[str, Any]:
|
|
828
|
+
"""Generate plan for changing column type."""
|
|
829
|
+
table = change_request["table"]
|
|
830
|
+
column = change_request["column"]
|
|
831
|
+
|
|
832
|
+
steps = [
|
|
833
|
+
f"Backup table {table} data",
|
|
834
|
+
"Create temporary column with new type",
|
|
835
|
+
f"Migrate data from {column} to temporary column",
|
|
836
|
+
f"Drop original {column}",
|
|
837
|
+
f"Rename temporary column to {column}",
|
|
838
|
+
"Verify type change successful",
|
|
839
|
+
]
|
|
840
|
+
|
|
841
|
+
rollback_steps = [f"Restore table {table} from backup"]
|
|
842
|
+
|
|
843
|
+
return {
|
|
844
|
+
"steps": steps,
|
|
845
|
+
"reversible": True,
|
|
846
|
+
"rollback_steps": rollback_steps,
|
|
847
|
+
"estimated_duration": "5-30 minutes",
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
def _generate_safety_recommendations(self, operation: str) -> List[str]:
|
|
851
|
+
"""Generate safety recommendations for operation."""
|
|
852
|
+
return [
|
|
853
|
+
"Create full database backup before migration",
|
|
854
|
+
"Test migration in staging environment first",
|
|
855
|
+
"Plan for rollback in case of failure",
|
|
856
|
+
]
|
|
857
|
+
|
|
858
|
+
def _generate_mitigation_strategies(self, breaking_changes: List[str]) -> List[str]:
|
|
859
|
+
"""Generate mitigation strategies for breaking changes."""
|
|
860
|
+
if not breaking_changes:
|
|
861
|
+
return []
|
|
862
|
+
|
|
863
|
+
return [
|
|
864
|
+
"Deploy code changes before schema migration",
|
|
865
|
+
"Use feature flags to control rollout",
|
|
866
|
+
"Monitor application logs for errors",
|
|
867
|
+
"Prepare rollback procedure",
|
|
868
|
+
]
|
|
869
|
+
|
|
870
|
+
|
|
871
|
+
# ============================================================================
|
|
872
|
+
# Class 6: TransactionManager
|
|
873
|
+
# ============================================================================
|
|
874
|
+
|
|
875
|
+
|
|
876
|
+
class TransactionManager:
|
|
877
|
+
"""
|
|
878
|
+
ACID transaction management and validation.
|
|
879
|
+
|
|
880
|
+
Validates transaction configurations and handles deadlock detection.
|
|
881
|
+
"""
|
|
882
|
+
|
|
883
|
+
def validate_acid_compliance(self, transaction_config: Dict[str, Any]) -> Dict[str, bool]:
|
|
884
|
+
"""
|
|
885
|
+
Validate ACID property compliance.
|
|
886
|
+
|
|
887
|
+
Args:
|
|
888
|
+
transaction_config: Transaction configuration
|
|
889
|
+
|
|
890
|
+
Returns:
|
|
891
|
+
ACID compliance check results
|
|
892
|
+
"""
|
|
893
|
+
# Check for proper isolation level
|
|
894
|
+
isolation_level = transaction_config.get("isolation_level")
|
|
895
|
+
valid_isolation = isolation_level in [
|
|
896
|
+
"READ_UNCOMMITTED",
|
|
897
|
+
"READ_COMMITTED",
|
|
898
|
+
"REPEATABLE_READ",
|
|
899
|
+
"SERIALIZABLE",
|
|
900
|
+
]
|
|
901
|
+
|
|
902
|
+
# All properties validated (simplified for demonstration)
|
|
903
|
+
return {
|
|
904
|
+
"atomicity": True, # Transactions are all-or-nothing
|
|
905
|
+
"consistency": True, # Database remains in valid state
|
|
906
|
+
"isolation": valid_isolation, # Proper isolation level set
|
|
907
|
+
"durability": True, # Committed transactions persisted
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
def detect_deadlock(self, transactions: List[Dict[str, Any]]) -> Dict[str, Any]:
|
|
911
|
+
"""
|
|
912
|
+
Detect circular wait conditions (deadlocks).
|
|
913
|
+
|
|
914
|
+
Args:
|
|
915
|
+
transactions: List of active transactions with lock info
|
|
916
|
+
|
|
917
|
+
Returns:
|
|
918
|
+
Deadlock analysis
|
|
919
|
+
"""
|
|
920
|
+
# Build resource-to-transaction mapping
|
|
921
|
+
resource_holders = {}
|
|
922
|
+
for tx in transactions:
|
|
923
|
+
tx_id = tx["id"]
|
|
924
|
+
locks = tx.get("locks", [])
|
|
925
|
+
for resource in locks:
|
|
926
|
+
resource_holders[resource] = tx_id
|
|
927
|
+
|
|
928
|
+
# Build wait-for graph (transaction -> transaction)
|
|
929
|
+
wait_graph = {}
|
|
930
|
+
for tx in transactions:
|
|
931
|
+
tx_id = tx["id"]
|
|
932
|
+
waiting_for_resource = tx.get("waiting_for")
|
|
933
|
+
if waiting_for_resource and waiting_for_resource in resource_holders:
|
|
934
|
+
# This transaction waits for the transaction holding the resource
|
|
935
|
+
wait_graph[tx_id] = resource_holders[waiting_for_resource]
|
|
936
|
+
|
|
937
|
+
# Detect cycles using DFS from each node
|
|
938
|
+
deadlock_detected = False
|
|
939
|
+
involved = set()
|
|
940
|
+
visited_global: set[str] = set()
|
|
941
|
+
|
|
942
|
+
for tx_id in wait_graph:
|
|
943
|
+
if tx_id not in visited_global:
|
|
944
|
+
rec_stack: set[str] = set()
|
|
945
|
+
if self._has_cycle_dfs(tx_id, wait_graph, visited_global, rec_stack):
|
|
946
|
+
deadlock_detected = True
|
|
947
|
+
# Add all nodes in cycle to involved list
|
|
948
|
+
involved.update(rec_stack)
|
|
949
|
+
# Also add the starting node
|
|
950
|
+
involved.add(tx_id)
|
|
951
|
+
|
|
952
|
+
return {
|
|
953
|
+
"deadlock_detected": deadlock_detected,
|
|
954
|
+
"involved_transactions": list(involved),
|
|
955
|
+
"resolution_strategy": ("Abort lowest priority transaction" if deadlock_detected else None),
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
def _has_cycle_dfs(self, node: str, graph: Dict[str, str], visited: set, rec_stack: set) -> bool:
|
|
959
|
+
"""Detect cycle using DFS with recursion stack."""
|
|
960
|
+
# Mark current node as visited and in recursion stack
|
|
961
|
+
visited.add(node)
|
|
962
|
+
rec_stack.add(node)
|
|
963
|
+
|
|
964
|
+
# Check successors
|
|
965
|
+
if node in graph:
|
|
966
|
+
successor = graph[node]
|
|
967
|
+
# If successor is in recursion stack, we found a cycle
|
|
968
|
+
if successor in rec_stack:
|
|
969
|
+
return True
|
|
970
|
+
# If successor not visited, recurse
|
|
971
|
+
if successor not in visited:
|
|
972
|
+
if self._has_cycle_dfs(successor, graph, visited, rec_stack):
|
|
973
|
+
return True
|
|
974
|
+
|
|
975
|
+
# Remove from recursion stack before returning
|
|
976
|
+
rec_stack.discard(node)
|
|
977
|
+
return False
|
|
978
|
+
|
|
979
|
+
def generate_retry_plan(self, retry_config: Dict[str, Any]) -> Dict[str, Any]:
|
|
980
|
+
"""
|
|
981
|
+
Generate transaction retry plan with exponential backoff.
|
|
982
|
+
|
|
983
|
+
Args:
|
|
984
|
+
retry_config: Retry configuration parameters
|
|
985
|
+
|
|
986
|
+
Returns:
|
|
987
|
+
Retry plan with delays
|
|
988
|
+
"""
|
|
989
|
+
max_retries = retry_config.get("max_retries", 3)
|
|
990
|
+
initial_backoff = retry_config.get("initial_backoff_ms", 100)
|
|
991
|
+
multiplier = retry_config.get("backoff_multiplier", 2.0)
|
|
992
|
+
max_backoff = retry_config.get("max_backoff_ms", 1000)
|
|
993
|
+
|
|
994
|
+
delays = []
|
|
995
|
+
current_delay = initial_backoff
|
|
996
|
+
|
|
997
|
+
for _ in range(max_retries):
|
|
998
|
+
delays.append(min(current_delay, max_backoff))
|
|
999
|
+
current_delay *= multiplier
|
|
1000
|
+
|
|
1001
|
+
return {
|
|
1002
|
+
"retry_delays": delays,
|
|
1003
|
+
"total_max_time_ms": sum(delays),
|
|
1004
|
+
"strategy": "exponential_backoff",
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
|
|
1008
|
+
# ============================================================================
|
|
1009
|
+
# Class 7: PerformanceMonitor
|
|
1010
|
+
# ============================================================================
|
|
1011
|
+
|
|
1012
|
+
|
|
1013
|
+
class PerformanceMonitor:
|
|
1014
|
+
"""
|
|
1015
|
+
Database performance monitoring and metrics.
|
|
1016
|
+
|
|
1017
|
+
Tracks query performance, connection usage, and system health.
|
|
1018
|
+
"""
|
|
1019
|
+
|
|
1020
|
+
def analyze_query_performance(self, query_stats: Dict[str, Any]) -> Dict[str, Any]:
|
|
1021
|
+
"""
|
|
1022
|
+
Analyze query performance metrics.
|
|
1023
|
+
|
|
1024
|
+
Args:
|
|
1025
|
+
query_stats: Query execution statistics
|
|
1026
|
+
|
|
1027
|
+
Returns:
|
|
1028
|
+
Performance analysis
|
|
1029
|
+
"""
|
|
1030
|
+
avg_time = query_stats.get("avg_execution_time_ms", 0)
|
|
1031
|
+
max_time = query_stats.get("max_execution_time_ms", 0)
|
|
1032
|
+
query_stats.get("call_count", 0)
|
|
1033
|
+
|
|
1034
|
+
performance_rating = "excellent"
|
|
1035
|
+
if avg_time > 1000:
|
|
1036
|
+
performance_rating = "poor"
|
|
1037
|
+
elif avg_time > 500:
|
|
1038
|
+
performance_rating = "needs_improvement"
|
|
1039
|
+
elif avg_time > 100:
|
|
1040
|
+
performance_rating = "good"
|
|
1041
|
+
|
|
1042
|
+
recommendations = []
|
|
1043
|
+
if avg_time > 500:
|
|
1044
|
+
recommendations.append("Consider adding indexes to improve query speed")
|
|
1045
|
+
if max_time > 5000:
|
|
1046
|
+
recommendations.append("Investigate slow queries exceeding 5 seconds")
|
|
1047
|
+
|
|
1048
|
+
return {
|
|
1049
|
+
"performance_rating": performance_rating,
|
|
1050
|
+
"avg_time_ms": avg_time,
|
|
1051
|
+
"recommendations": recommendations,
|
|
1052
|
+
"optimization_priority": "high" if avg_time > 1000 else "low",
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
def monitor_connection_usage(self, connection_metrics: Dict[str, Any]) -> Dict[str, Any]:
|
|
1056
|
+
"""
|
|
1057
|
+
Monitor database connection usage.
|
|
1058
|
+
|
|
1059
|
+
Args:
|
|
1060
|
+
connection_metrics: Connection usage statistics
|
|
1061
|
+
|
|
1062
|
+
Returns:
|
|
1063
|
+
Connection health assessment
|
|
1064
|
+
"""
|
|
1065
|
+
active = connection_metrics.get("active_connections", 0)
|
|
1066
|
+
max_conns = connection_metrics.get("max_connections", 100)
|
|
1067
|
+
failed_attempts = connection_metrics.get("failed_connection_attempts", 0)
|
|
1068
|
+
|
|
1069
|
+
usage_ratio = active / max(max_conns, 1)
|
|
1070
|
+
|
|
1071
|
+
health = "healthy"
|
|
1072
|
+
if usage_ratio > 0.90:
|
|
1073
|
+
health = "critical"
|
|
1074
|
+
elif usage_ratio > 0.75:
|
|
1075
|
+
health = "warning"
|
|
1076
|
+
|
|
1077
|
+
return {
|
|
1078
|
+
"health_status": health,
|
|
1079
|
+
"usage_ratio": usage_ratio,
|
|
1080
|
+
"failed_attempts": failed_attempts,
|
|
1081
|
+
"recommendations": self._generate_connection_recommendations(usage_ratio, failed_attempts),
|
|
1082
|
+
}
|
|
1083
|
+
|
|
1084
|
+
def _generate_connection_recommendations(self, usage_ratio: float, failed_attempts: int) -> List[str]:
|
|
1085
|
+
"""Generate connection usage recommendations."""
|
|
1086
|
+
recommendations = []
|
|
1087
|
+
|
|
1088
|
+
if usage_ratio > 0.80:
|
|
1089
|
+
recommendations.append("Increase connection pool size")
|
|
1090
|
+
|
|
1091
|
+
if failed_attempts > 10:
|
|
1092
|
+
recommendations.append("Investigate connection failures and timeout settings")
|
|
1093
|
+
|
|
1094
|
+
return recommendations
|
|
1095
|
+
|
|
1096
|
+
|
|
1097
|
+
# ============================================================================
|
|
1098
|
+
# Module Exports
|
|
1099
|
+
# ============================================================================
|
|
1100
|
+
|
|
1101
|
+
__all__ = [
|
|
1102
|
+
"SchemaNormalizer",
|
|
1103
|
+
"DatabaseSelector",
|
|
1104
|
+
"IndexingOptimizer",
|
|
1105
|
+
"ConnectionPoolManager",
|
|
1106
|
+
"MigrationPlanner",
|
|
1107
|
+
"TransactionManager",
|
|
1108
|
+
"PerformanceMonitor",
|
|
1109
|
+
"ValidationResult",
|
|
1110
|
+
"DatabaseRecommendation",
|
|
1111
|
+
"IndexRecommendation",
|
|
1112
|
+
"PoolConfiguration",
|
|
1113
|
+
"MigrationPlan",
|
|
1114
|
+
"ACIDCompliance",
|
|
1115
|
+
]
|