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,1234 @@
|
|
|
1
|
+
# Performance Optimization with Real-time Profiling
|
|
2
|
+
|
|
3
|
+
> Module: Real-time performance profiling, bottleneck detection, and optimization strategies
|
|
4
|
+
> Complexity: Advanced
|
|
5
|
+
> Time: 30+ minutes
|
|
6
|
+
> Dependencies: Python 3.8+, cProfile, memory_profiler, psutil, Context7 MCP, asyncio
|
|
7
|
+
|
|
8
|
+
## Core Implementation
|
|
9
|
+
|
|
10
|
+
### PerformanceProfiler Class
|
|
11
|
+
|
|
12
|
+
```python
|
|
13
|
+
import cProfile
|
|
14
|
+
import pstats
|
|
15
|
+
import io
|
|
16
|
+
import time
|
|
17
|
+
import threading
|
|
18
|
+
import asyncio
|
|
19
|
+
from typing import Dict, List, Optional, Any, Union, Callable
|
|
20
|
+
from dataclasses import dataclass, field
|
|
21
|
+
from enum import Enum
|
|
22
|
+
import psutil
|
|
23
|
+
import memory_profiler
|
|
24
|
+
import line_profiler
|
|
25
|
+
from collections import defaultdict, deque
|
|
26
|
+
import json
|
|
27
|
+
import sys
|
|
28
|
+
import tracemalloc
|
|
29
|
+
import resource
|
|
30
|
+
|
|
31
|
+
class PerformanceMetric(Enum):
|
|
32
|
+
"""Types of performance metrics to track."""
|
|
33
|
+
CPU_TIME = "cpu_time"
|
|
34
|
+
WALL_TIME = "wall_time"
|
|
35
|
+
MEMORY_USAGE = "memory_usage"
|
|
36
|
+
MEMORY_PEAK = "memory_peak"
|
|
37
|
+
FUNCTION_CALLS = "function_calls"
|
|
38
|
+
EXECUTION_COUNT = "execution_count"
|
|
39
|
+
AVERAGE_TIME = "average_time"
|
|
40
|
+
MAX_TIME = "max_time"
|
|
41
|
+
MIN_TIME = "min_time"
|
|
42
|
+
|
|
43
|
+
class OptimizationType(Enum):
|
|
44
|
+
"""Types of performance optimizations."""
|
|
45
|
+
ALGORITHM_IMPROVEMENT = "algorithm_improvement"
|
|
46
|
+
CACHING = "caching"
|
|
47
|
+
CONCURRENCY = "concurrency"
|
|
48
|
+
MEMORY_OPTIMIZATION = "memory_optimization"
|
|
49
|
+
I/O_OPTIMIZATION = "io_optimization"
|
|
50
|
+
DATABASE_OPTIMIZATION = "database_optimization"
|
|
51
|
+
DATA_STRUCTURE_CHANGE = "data_structure_change"
|
|
52
|
+
|
|
53
|
+
@dataclass
|
|
54
|
+
class PerformanceSnapshot:
|
|
55
|
+
"""Snapshot of performance metrics at a point in time."""
|
|
56
|
+
timestamp: float
|
|
57
|
+
cpu_percent: float
|
|
58
|
+
memory_mb: float
|
|
59
|
+
memory_percent: float
|
|
60
|
+
open_files: int
|
|
61
|
+
threads: int
|
|
62
|
+
context_switches: int
|
|
63
|
+
custom_metrics: Dict[str, float] = field(default_factory=dict)
|
|
64
|
+
|
|
65
|
+
@dataclass
|
|
66
|
+
class FunctionProfile:
|
|
67
|
+
"""Detailed profile information for a function."""
|
|
68
|
+
name: str
|
|
69
|
+
file_path: str
|
|
70
|
+
line_number: int
|
|
71
|
+
total_time: float
|
|
72
|
+
cumulative_time: float
|
|
73
|
+
call_count: int
|
|
74
|
+
per_call_time: float
|
|
75
|
+
cummulative_per_call_time: float
|
|
76
|
+
memory_before: float
|
|
77
|
+
memory_after: float
|
|
78
|
+
memory_delta: float
|
|
79
|
+
optimization_suggestions: List[str] = field(default_factory=list)
|
|
80
|
+
|
|
81
|
+
@dataclass
|
|
82
|
+
class PerformanceBottleneck:
|
|
83
|
+
"""Identified performance bottleneck with analysis."""
|
|
84
|
+
function_name: str
|
|
85
|
+
file_path: str
|
|
86
|
+
line_number: int
|
|
87
|
+
bottleneck_type: str # "cpu", "memory", "io", "algorithm"
|
|
88
|
+
severity: str # "low", "medium", "high", "critical"
|
|
89
|
+
impact_score: float # 0.0 to 1.0
|
|
90
|
+
description: str
|
|
91
|
+
metrics: Dict[str, float]
|
|
92
|
+
optimization_type: OptimizationType
|
|
93
|
+
suggested_fixes: List[str]
|
|
94
|
+
estimated_improvement: str
|
|
95
|
+
code_snippet: str
|
|
96
|
+
|
|
97
|
+
@dataclass
|
|
98
|
+
class OptimizationPlan:
|
|
99
|
+
"""Comprehensive optimization plan with prioritized actions."""
|
|
100
|
+
bottlenecks: List[PerformanceBottleneck]
|
|
101
|
+
execution_order: List[int]
|
|
102
|
+
estimated_total_improvement: str
|
|
103
|
+
implementation_complexity: str
|
|
104
|
+
risk_level: str
|
|
105
|
+
prerequisites: List[str]
|
|
106
|
+
validation_strategy: str
|
|
107
|
+
|
|
108
|
+
class RealTimeMonitor:
|
|
109
|
+
"""Real-time performance monitoring system."""
|
|
110
|
+
|
|
111
|
+
def __init__(self, sampling_interval: float = 1.0):
|
|
112
|
+
self.sampling_interval = sampling_interval
|
|
113
|
+
self.is_monitoring = False
|
|
114
|
+
self.monitor_thread = None
|
|
115
|
+
self.snapshots = deque(maxlen=1000) # Keep last 1000 snapshots
|
|
116
|
+
self.callbacks = []
|
|
117
|
+
self.alerts = []
|
|
118
|
+
|
|
119
|
+
def start_monitoring(self):
|
|
120
|
+
"""Start real-time performance monitoring."""
|
|
121
|
+
if self.is_monitoring:
|
|
122
|
+
return
|
|
123
|
+
|
|
124
|
+
self.is_monitoring = True
|
|
125
|
+
self.monitor_thread = threading.Thread(target=self._monitor_loop, daemon=True)
|
|
126
|
+
self.monitor_thread.start()
|
|
127
|
+
|
|
128
|
+
def stop_monitoring(self):
|
|
129
|
+
"""Stop real-time performance monitoring."""
|
|
130
|
+
self.is_monitoring = False
|
|
131
|
+
if self.monitor_thread:
|
|
132
|
+
self.monitor_thread.join(timeout=2.0)
|
|
133
|
+
|
|
134
|
+
def _monitor_loop(self):
|
|
135
|
+
"""Main monitoring loop."""
|
|
136
|
+
process = psutil.Process()
|
|
137
|
+
|
|
138
|
+
while self.is_monitoring:
|
|
139
|
+
try:
|
|
140
|
+
# Collect system metrics
|
|
141
|
+
snapshot = PerformanceSnapshot(
|
|
142
|
+
timestamp=time.time(),
|
|
143
|
+
cpu_percent=process.cpu_percent(),
|
|
144
|
+
memory_mb=process.memory_info().rss / 1024 / 1024,
|
|
145
|
+
memory_percent=process.memory_percent(),
|
|
146
|
+
open_files=len(process.open_files()),
|
|
147
|
+
threads=process.num_threads(),
|
|
148
|
+
context_switches=process.num_ctx_switches().voluntary + process.num_ctx_switches().involuntary
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
# Check for custom metrics callbacks
|
|
152
|
+
for callback in self.callbacks:
|
|
153
|
+
try:
|
|
154
|
+
custom_metrics = callback()
|
|
155
|
+
snapshot.custom_metrics.update(custom_metrics)
|
|
156
|
+
except Exception as e:
|
|
157
|
+
print(f"Custom metric callback error: {e}")
|
|
158
|
+
|
|
159
|
+
self.snapshots.append(snapshot)
|
|
160
|
+
|
|
161
|
+
# Check for alerts
|
|
162
|
+
self._check_alerts(snapshot)
|
|
163
|
+
|
|
164
|
+
time.sleep(self.sampling_interval)
|
|
165
|
+
|
|
166
|
+
except Exception as e:
|
|
167
|
+
print(f"Monitoring error: {e}")
|
|
168
|
+
time.sleep(self.sampling_interval)
|
|
169
|
+
|
|
170
|
+
def add_callback(self, callback: Callable[[], Dict[str, float]]):
|
|
171
|
+
"""Add custom metric collection callback."""
|
|
172
|
+
self.callbacks.append(callback)
|
|
173
|
+
|
|
174
|
+
def _check_alerts(self, snapshot: PerformanceSnapshot):
|
|
175
|
+
"""Check for performance alerts."""
|
|
176
|
+
alerts = []
|
|
177
|
+
|
|
178
|
+
# CPU usage alert
|
|
179
|
+
if snapshot.cpu_percent > 90:
|
|
180
|
+
alerts.append({
|
|
181
|
+
'type': 'high_cpu',
|
|
182
|
+
'message': f"High CPU usage: {snapshot.cpu_percent:.1f}%",
|
|
183
|
+
'timestamp': snapshot.timestamp
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
# Memory usage alert
|
|
187
|
+
if snapshot.memory_percent > 85:
|
|
188
|
+
alerts.append({
|
|
189
|
+
'type': 'high_memory',
|
|
190
|
+
'message': f"High memory usage: {snapshot.memory_percent:.1f}%",
|
|
191
|
+
'timestamp': snapshot.timestamp
|
|
192
|
+
})
|
|
193
|
+
|
|
194
|
+
# File handle alert
|
|
195
|
+
if snapshot.open_files > 1000:
|
|
196
|
+
alerts.append({
|
|
197
|
+
'type': 'file_handle_leak',
|
|
198
|
+
'message': f"High number of open files: {snapshot.open_files}",
|
|
199
|
+
'timestamp': snapshot.timestamp
|
|
200
|
+
})
|
|
201
|
+
|
|
202
|
+
self.alerts.extend(alerts)
|
|
203
|
+
|
|
204
|
+
def get_recent_snapshots(self, count: int = 100) -> List[PerformanceSnapshot]:
|
|
205
|
+
"""Get recent performance snapshots."""
|
|
206
|
+
return list(self.snapshots)[-count:]
|
|
207
|
+
|
|
208
|
+
def get_average_metrics(self, duration_minutes: int = 5) -> Dict[str, float]:
|
|
209
|
+
"""Get average metrics over specified duration."""
|
|
210
|
+
cutoff_time = time.time() - (duration_minutes * 60)
|
|
211
|
+
recent_snapshots = [s for s in self.snapshots if s.timestamp >= cutoff_time]
|
|
212
|
+
|
|
213
|
+
if not recent_snapshots:
|
|
214
|
+
return {}
|
|
215
|
+
|
|
216
|
+
return {
|
|
217
|
+
'avg_cpu_percent': sum(s.cpu_percent for s in recent_snapshots) / len(recent_snapshots),
|
|
218
|
+
'avg_memory_mb': sum(s.memory_mb for s in recent_snapshots) / len(recent_snapshots),
|
|
219
|
+
'avg_memory_percent': sum(s.memory_percent for s in recent_snapshots) / len(recent_snapshots),
|
|
220
|
+
'avg_open_files': sum(s.open_files for s in recent_snapshots) / len(recent_snapshots),
|
|
221
|
+
'avg_threads': sum(s.threads for s in recent_snapshots) / len(recent_snapshots),
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
class PerformanceProfiler:
|
|
225
|
+
"""Advanced performance profiler with bottleneck detection."""
|
|
226
|
+
|
|
227
|
+
def __init__(self, context7_client=None):
|
|
228
|
+
self.context7 = context7_client
|
|
229
|
+
self.profiler = None
|
|
230
|
+
self.memory_profiler = None
|
|
231
|
+
self.line_profiler = None
|
|
232
|
+
self.realtime_monitor = RealTimeMonitor()
|
|
233
|
+
self.profiles = {}
|
|
234
|
+
self.bottlenecks = []
|
|
235
|
+
|
|
236
|
+
def start_profiling(self, profile_types: List[str] = None):
|
|
237
|
+
"""Start performance profiling with specified types."""
|
|
238
|
+
if profile_types is None:
|
|
239
|
+
profile_types = ['cpu', 'memory']
|
|
240
|
+
|
|
241
|
+
# Start CPU profiling
|
|
242
|
+
if 'cpu' in profile_types:
|
|
243
|
+
self.profiler = cProfile.Profile()
|
|
244
|
+
self.profiler.enable()
|
|
245
|
+
|
|
246
|
+
# Start memory profiling
|
|
247
|
+
if 'memory' in profile_types:
|
|
248
|
+
tracemalloc.start()
|
|
249
|
+
self.memory_profiler = memory_profiler.Profile()
|
|
250
|
+
|
|
251
|
+
# Start line profiling for specific functions
|
|
252
|
+
if 'line' in profile_types:
|
|
253
|
+
self.line_profiler = line_profiler.LineProfiler()
|
|
254
|
+
self.line_profiler.enable_by_count()
|
|
255
|
+
|
|
256
|
+
# Start real-time monitoring
|
|
257
|
+
self.realtime_monitor.start_monitoring()
|
|
258
|
+
|
|
259
|
+
def stop_profiling(self) -> Dict[str, Any]:
|
|
260
|
+
"""Stop profiling and collect results."""
|
|
261
|
+
results = {}
|
|
262
|
+
|
|
263
|
+
# Stop CPU profiling
|
|
264
|
+
if self.profiler:
|
|
265
|
+
self.profiler.disable()
|
|
266
|
+
results['cpu_profile'] = self._analyze_cpu_profile()
|
|
267
|
+
|
|
268
|
+
# Stop memory profiling
|
|
269
|
+
if tracemalloc.is_tracing():
|
|
270
|
+
current, peak = tracemalloc.get_traced_memory()
|
|
271
|
+
tracemalloc.stop()
|
|
272
|
+
results['memory_profile'] = {
|
|
273
|
+
'current_mb': current / 1024 / 1024,
|
|
274
|
+
'peak_mb': peak / 1024 / 1024
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
if self.memory_profiler:
|
|
278
|
+
self.memory_profiler.disable()
|
|
279
|
+
results['memory_line_profile'] = self._analyze_memory_profile()
|
|
280
|
+
|
|
281
|
+
# Stop line profiling
|
|
282
|
+
if self.line_profiler:
|
|
283
|
+
self.line_profiler.disable()
|
|
284
|
+
results['line_profile'] = self._analyze_line_profile()
|
|
285
|
+
|
|
286
|
+
# Stop real-time monitoring
|
|
287
|
+
self.realtime_monitor.stop_monitoring()
|
|
288
|
+
results['realtime_metrics'] = self.realtime_monitor.get_average_metrics()
|
|
289
|
+
|
|
290
|
+
return results
|
|
291
|
+
|
|
292
|
+
def _analyze_cpu_profile(self) -> List[FunctionProfile]:
|
|
293
|
+
"""Analyze CPU profiling results."""
|
|
294
|
+
if not self.profiler:
|
|
295
|
+
return []
|
|
296
|
+
|
|
297
|
+
# Create stats object
|
|
298
|
+
s = io.StringIO()
|
|
299
|
+
ps = pstats.Stats(self.profiler, stream=s)
|
|
300
|
+
ps.sort_stats('cumulative')
|
|
301
|
+
ps.print_stats()
|
|
302
|
+
|
|
303
|
+
# Parse the stats
|
|
304
|
+
function_profiles = []
|
|
305
|
+
lines = s.getvalue().split('\n')
|
|
306
|
+
|
|
307
|
+
# Skip header lines
|
|
308
|
+
for line in lines[6:]:
|
|
309
|
+
if line.strip() and not line.startswith('ncalls'):
|
|
310
|
+
try:
|
|
311
|
+
parts = line.split()
|
|
312
|
+
if len(parts) >= 6:
|
|
313
|
+
ncalls = parts[0]
|
|
314
|
+
tottime = float(parts[1])
|
|
315
|
+
cumtime = float(parts[3])
|
|
316
|
+
|
|
317
|
+
# Extract function name and location
|
|
318
|
+
filename_func = ' '.join(parts[5:])
|
|
319
|
+
if '{' in filename_func:
|
|
320
|
+
filename, line_num, func_name = self._parse_function_line(filename_func)
|
|
321
|
+
else:
|
|
322
|
+
continue
|
|
323
|
+
|
|
324
|
+
# Convert ncalls to integer (handle format like "1000/1000")
|
|
325
|
+
if '/' in ncalls:
|
|
326
|
+
ncalls = int(ncalls.split('/')[0])
|
|
327
|
+
else:
|
|
328
|
+
ncalls = int(ncalls)
|
|
329
|
+
|
|
330
|
+
profile = FunctionProfile(
|
|
331
|
+
name=func_name,
|
|
332
|
+
file_path=filename,
|
|
333
|
+
line_number=int(line_num),
|
|
334
|
+
total_time=tottime,
|
|
335
|
+
cumulative_time=cumtime,
|
|
336
|
+
call_count=ncalls,
|
|
337
|
+
per_call_time=tottime / max(ncalls, 1),
|
|
338
|
+
cummulative_per_call_time=cumtime / max(ncalls, 1),
|
|
339
|
+
memory_before=0.0, # Will be filled by memory profiler
|
|
340
|
+
memory_after=0.0,
|
|
341
|
+
memory_delta=0.0
|
|
342
|
+
)
|
|
343
|
+
function_profiles.append(profile)
|
|
344
|
+
|
|
345
|
+
except (ValueError, IndexError) as e:
|
|
346
|
+
continue
|
|
347
|
+
|
|
348
|
+
return function_profiles
|
|
349
|
+
|
|
350
|
+
def _parse_function_line(self, line: str) -> tuple:
|
|
351
|
+
"""Parse function line from pstats output."""
|
|
352
|
+
# Format: "filename(line_number)function_name"
|
|
353
|
+
try:
|
|
354
|
+
paren_idx = line.rfind('(')
|
|
355
|
+
if paren_idx == -1:
|
|
356
|
+
return line, "0", "unknown"
|
|
357
|
+
|
|
358
|
+
filename = line[:paren_idx]
|
|
359
|
+
rest = line[paren_idx:]
|
|
360
|
+
|
|
361
|
+
closing_idx = rest.find(')')
|
|
362
|
+
if closing_idx == -1:
|
|
363
|
+
return filename, "0", "unknown"
|
|
364
|
+
|
|
365
|
+
line_num = rest[1:closing_idx]
|
|
366
|
+
func_name = rest[closing_idx + 1:]
|
|
367
|
+
|
|
368
|
+
return filename, line_num, func_name
|
|
369
|
+
except Exception:
|
|
370
|
+
return line, "0", "unknown"
|
|
371
|
+
|
|
372
|
+
def _analyze_memory_profile(self) -> Dict[str, Any]:
|
|
373
|
+
"""Analyze memory profiling results."""
|
|
374
|
+
if not self.memory_profiler:
|
|
375
|
+
return {}
|
|
376
|
+
|
|
377
|
+
# Get memory profile statistics
|
|
378
|
+
stats = self.memory_profiler.get_stats()
|
|
379
|
+
|
|
380
|
+
return {
|
|
381
|
+
'total_samples': len(stats),
|
|
382
|
+
'max_memory_usage': max((stat[2] for stat in stats), default=0),
|
|
383
|
+
'memory_by_function': self._group_memory_by_function(stats)
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
def _group_memory_by_function(self, stats: List) -> Dict[str, float]:
|
|
387
|
+
"""Group memory usage by function."""
|
|
388
|
+
memory_by_function = defaultdict(float)
|
|
389
|
+
|
|
390
|
+
for stat in stats:
|
|
391
|
+
filename, line_no, mem_usage = stat
|
|
392
|
+
# Extract function name from filename and line
|
|
393
|
+
func_key = f"{filename}:{line_no}"
|
|
394
|
+
memory_by_function[func_key] += mem_usage
|
|
395
|
+
|
|
396
|
+
return dict(memory_by_function)
|
|
397
|
+
|
|
398
|
+
def _analyze_line_profile(self) -> Dict[str, Any]:
|
|
399
|
+
"""Analyze line profiling results."""
|
|
400
|
+
if not self.line_profiler:
|
|
401
|
+
return {}
|
|
402
|
+
|
|
403
|
+
# Get line profiler statistics
|
|
404
|
+
stats = self.line_profiler.get_stats()
|
|
405
|
+
|
|
406
|
+
return {
|
|
407
|
+
'timings': stats.timings,
|
|
408
|
+
'unit': stats.unit
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
async def detect_bottlenecks(
|
|
412
|
+
self, profile_results: Dict[str, Any],
|
|
413
|
+
context7_patterns: Dict[str, Any] = None
|
|
414
|
+
) -> List[PerformanceBottleneck]:
|
|
415
|
+
"""Detect performance bottlenecks from profiling results."""
|
|
416
|
+
|
|
417
|
+
bottlenecks = []
|
|
418
|
+
|
|
419
|
+
# Analyze CPU bottlenecks
|
|
420
|
+
if 'cpu_profile' in profile_results:
|
|
421
|
+
cpu_bottlenecks = await self._detect_cpu_bottlenecks(
|
|
422
|
+
profile_results['cpu_profile'], context7_patterns
|
|
423
|
+
)
|
|
424
|
+
bottlenecks.extend(cpu_bottlenecks)
|
|
425
|
+
|
|
426
|
+
# Analyze memory bottlenecks
|
|
427
|
+
if 'memory_profile' in profile_results:
|
|
428
|
+
memory_bottlenecks = await self._detect_memory_bottlenecks(
|
|
429
|
+
profile_results['memory_profile'], context7_patterns
|
|
430
|
+
)
|
|
431
|
+
bottlenecks.extend(memory_bottlenecks)
|
|
432
|
+
|
|
433
|
+
# Analyze real-time metrics
|
|
434
|
+
if 'realtime_metrics' in profile_results:
|
|
435
|
+
realtime_bottlenecks = await self._detect_realtime_bottlenecks(
|
|
436
|
+
profile_results['realtime_metrics'], context7_patterns
|
|
437
|
+
)
|
|
438
|
+
bottlenecks.extend(realtime_bottlenecks)
|
|
439
|
+
|
|
440
|
+
# Sort by impact score
|
|
441
|
+
bottlenecks.sort(key=lambda x: x.impact_score, reverse=True)
|
|
442
|
+
return bottlenecks
|
|
443
|
+
|
|
444
|
+
async def _detect_cpu_bottlenecks(
|
|
445
|
+
self, cpu_profiles: List[FunctionProfile],
|
|
446
|
+
context7_patterns: Dict[str, Any] = None
|
|
447
|
+
) -> List[PerformanceBottleneck]:
|
|
448
|
+
"""Detect CPU-related bottlenecks."""
|
|
449
|
+
|
|
450
|
+
bottlenecks = []
|
|
451
|
+
total_cpu_time = sum(p.cumulative_time for p in cpu_profiles)
|
|
452
|
+
|
|
453
|
+
for profile in cpu_profiles:
|
|
454
|
+
# Skip functions with very low total time
|
|
455
|
+
if profile.cumulative_time < 0.01:
|
|
456
|
+
continue
|
|
457
|
+
|
|
458
|
+
# Calculate impact score
|
|
459
|
+
impact_score = profile.cumulative_time / max(total_cpu_time, 0.001)
|
|
460
|
+
|
|
461
|
+
# Determine severity
|
|
462
|
+
if impact_score > 0.5:
|
|
463
|
+
severity = "critical"
|
|
464
|
+
elif impact_score > 0.2:
|
|
465
|
+
severity = "high"
|
|
466
|
+
elif impact_score > 0.1:
|
|
467
|
+
severity = "medium"
|
|
468
|
+
else:
|
|
469
|
+
severity = "low"
|
|
470
|
+
|
|
471
|
+
# Get code snippet
|
|
472
|
+
code_snippet = self._get_code_snippet(profile.file_path, profile.line_number)
|
|
473
|
+
|
|
474
|
+
# Generate optimization suggestions
|
|
475
|
+
optimization_type, suggestions, estimated_improvement = await self._generate_cpu_optimization_suggestions(
|
|
476
|
+
profile, context7_patterns
|
|
477
|
+
)
|
|
478
|
+
|
|
479
|
+
bottleneck = PerformanceBottleneck(
|
|
480
|
+
function_name=profile.name,
|
|
481
|
+
file_path=profile.file_path,
|
|
482
|
+
line_number=profile.line_number,
|
|
483
|
+
bottleneck_type="cpu",
|
|
484
|
+
severity=severity,
|
|
485
|
+
impact_score=impact_score,
|
|
486
|
+
description=f"Function '{profile.name}' consumes {impact_score:.1%} of total CPU time",
|
|
487
|
+
metrics={
|
|
488
|
+
'cumulative_time': profile.cumulative_time,
|
|
489
|
+
'total_time': profile.total_time,
|
|
490
|
+
'call_count': profile.call_count,
|
|
491
|
+
'per_call_time': profile.per_call_time
|
|
492
|
+
},
|
|
493
|
+
optimization_type=optimization_type,
|
|
494
|
+
suggested_fixes=suggestions,
|
|
495
|
+
estimated_improvement=estimated_improvement,
|
|
496
|
+
code_snippet=code_snippet
|
|
497
|
+
)
|
|
498
|
+
bottlenecks.append(bottleneck)
|
|
499
|
+
|
|
500
|
+
return bottlenecks
|
|
501
|
+
|
|
502
|
+
async def _detect_memory_bottlenecks(
|
|
503
|
+
self, memory_profile: Dict[str, Any],
|
|
504
|
+
context7_patterns: Dict[str, Any] = None
|
|
505
|
+
) -> List[PerformanceBottleneck]:
|
|
506
|
+
"""Detect memory-related bottlenecks."""
|
|
507
|
+
|
|
508
|
+
bottlenecks = []
|
|
509
|
+
|
|
510
|
+
if 'memory_line_profile' in memory_profile:
|
|
511
|
+
memory_by_function = memory_profile['memory_line_profile'].get('memory_by_function', {})
|
|
512
|
+
|
|
513
|
+
if memory_by_function:
|
|
514
|
+
max_memory = max(memory_by_function.values())
|
|
515
|
+
|
|
516
|
+
for func_key, memory_usage in memory_by_function.items():
|
|
517
|
+
# Skip very small memory usage
|
|
518
|
+
if memory_usage < 1024 * 1024: # 1MB
|
|
519
|
+
continue
|
|
520
|
+
|
|
521
|
+
# Calculate impact score
|
|
522
|
+
impact_score = memory_usage / max(max_memory, 1)
|
|
523
|
+
|
|
524
|
+
# Determine severity
|
|
525
|
+
if impact_score > 0.7:
|
|
526
|
+
severity = "critical"
|
|
527
|
+
elif impact_score > 0.4:
|
|
528
|
+
severity = "high"
|
|
529
|
+
elif impact_score > 0.2:
|
|
530
|
+
severity = "medium"
|
|
531
|
+
else:
|
|
532
|
+
severity = "low"
|
|
533
|
+
|
|
534
|
+
# Extract file path and line number
|
|
535
|
+
if ':' in func_key:
|
|
536
|
+
file_path, line_num = func_key.split(':', 1)
|
|
537
|
+
line_number = int(line_num)
|
|
538
|
+
else:
|
|
539
|
+
continue
|
|
540
|
+
|
|
541
|
+
# Get code snippet
|
|
542
|
+
code_snippet = self._get_code_snippet(file_path, line_number)
|
|
543
|
+
|
|
544
|
+
# Generate optimization suggestions
|
|
545
|
+
optimization_type, suggestions, estimated_improvement = await self._generate_memory_optimization_suggestions(
|
|
546
|
+
memory_usage, context7_patterns
|
|
547
|
+
)
|
|
548
|
+
|
|
549
|
+
bottleneck = PerformanceBottleneck(
|
|
550
|
+
function_name=f"Function at {func_key}",
|
|
551
|
+
file_path=file_path,
|
|
552
|
+
line_number=line_number,
|
|
553
|
+
bottleneck_type="memory",
|
|
554
|
+
severity=severity,
|
|
555
|
+
impact_score=impact_score,
|
|
556
|
+
description=f"High memory usage: {memory_usage / 1024 / 1024:.1f}MB",
|
|
557
|
+
metrics={
|
|
558
|
+
'memory_usage_mb': memory_usage / 1024 / 1024,
|
|
559
|
+
'impact_score': impact_score
|
|
560
|
+
},
|
|
561
|
+
optimization_type=optimization_type,
|
|
562
|
+
suggested_fixes=suggestions,
|
|
563
|
+
estimated_improvement=estimated_improvement,
|
|
564
|
+
code_snippet=code_snippet
|
|
565
|
+
)
|
|
566
|
+
bottlenecks.append(bottleneck)
|
|
567
|
+
|
|
568
|
+
return bottlenecks
|
|
569
|
+
|
|
570
|
+
async def _detect_realtime_bottlenecks(
|
|
571
|
+
self, realtime_metrics: Dict[str, Any],
|
|
572
|
+
context7_patterns: Dict[str, Any] = None
|
|
573
|
+
) -> List[PerformanceBottleneck]:
|
|
574
|
+
"""Detect bottlenecks from real-time monitoring."""
|
|
575
|
+
|
|
576
|
+
bottlenecks = []
|
|
577
|
+
|
|
578
|
+
# Check CPU usage
|
|
579
|
+
avg_cpu = realtime_metrics.get('avg_cpu_percent', 0)
|
|
580
|
+
if avg_cpu > 80:
|
|
581
|
+
bottleneck = PerformanceBottleneck(
|
|
582
|
+
function_name="System CPU Usage",
|
|
583
|
+
file_path="system",
|
|
584
|
+
line_number=0,
|
|
585
|
+
bottleneck_type="cpu",
|
|
586
|
+
severity="high" if avg_cpu > 90 else "medium",
|
|
587
|
+
impact_score=avg_cpu / 100.0,
|
|
588
|
+
description=f"High average CPU usage: {avg_cpu:.1f}%",
|
|
589
|
+
metrics={'avg_cpu_percent': avg_cpu},
|
|
590
|
+
optimization_type=OptimizationType.CONCURRENCY,
|
|
591
|
+
suggested_fixes=[
|
|
592
|
+
"Implement parallel processing",
|
|
593
|
+
"Optimize algorithms",
|
|
594
|
+
"Add caching for expensive operations"
|
|
595
|
+
],
|
|
596
|
+
estimated_improvement="20-50% reduction in CPU usage",
|
|
597
|
+
code_snippet="# System-wide optimization required"
|
|
598
|
+
)
|
|
599
|
+
bottlenecks.append(bottleneck)
|
|
600
|
+
|
|
601
|
+
# Check memory usage
|
|
602
|
+
avg_memory = realtime_metrics.get('avg_memory_percent', 0)
|
|
603
|
+
if avg_memory > 75:
|
|
604
|
+
bottleneck = PerformanceBottleneck(
|
|
605
|
+
function_name="System Memory Usage",
|
|
606
|
+
file_path="system",
|
|
607
|
+
line_number=0,
|
|
608
|
+
bottleneck_type="memory",
|
|
609
|
+
severity="high" if avg_memory > 85 else "medium",
|
|
610
|
+
impact_score=avg_memory / 100.0,
|
|
611
|
+
description=f"High average memory usage: {avg_memory:.1f}%",
|
|
612
|
+
metrics={'avg_memory_percent': avg_memory},
|
|
613
|
+
optimization_type=OptimizationType.MEMORY_OPTIMIZATION,
|
|
614
|
+
suggested_fixes=[
|
|
615
|
+
"Implement memory pooling",
|
|
616
|
+
"Use generators instead of lists",
|
|
617
|
+
"Optimize data structures",
|
|
618
|
+
"Implement object caching with size limits"
|
|
619
|
+
],
|
|
620
|
+
estimated_improvement="30-60% reduction in memory usage",
|
|
621
|
+
code_snippet="# System-wide memory optimization required"
|
|
622
|
+
)
|
|
623
|
+
bottlenecks.append(bottleneck)
|
|
624
|
+
|
|
625
|
+
return bottlenecks
|
|
626
|
+
|
|
627
|
+
async def _generate_cpu_optimization_suggestions(
|
|
628
|
+
self, profile: FunctionProfile,
|
|
629
|
+
context7_patterns: Dict[str, Any] = None
|
|
630
|
+
) -> tuple:
|
|
631
|
+
"""Generate CPU optimization suggestions for a function."""
|
|
632
|
+
|
|
633
|
+
suggestions = []
|
|
634
|
+
optimization_type = OptimizationType.ALGORITHM_IMPROVEMENT
|
|
635
|
+
|
|
636
|
+
# Analyze function characteristics
|
|
637
|
+
if profile.call_count > 10000 and profile.per_call_time > 0.001:
|
|
638
|
+
optimization_type = OptimizationType.CACHING
|
|
639
|
+
suggestions.extend([
|
|
640
|
+
"Implement memoization for expensive function calls",
|
|
641
|
+
"Add LRU cache for frequently called functions",
|
|
642
|
+
"Consider using functools.lru_cache"
|
|
643
|
+
])
|
|
644
|
+
estimated_improvement = "50-90% for repeated calls"
|
|
645
|
+
|
|
646
|
+
elif profile.cumulative_time > 1.0 and profile.call_count > 100:
|
|
647
|
+
suggestions.extend([
|
|
648
|
+
"Analyze algorithm complexity",
|
|
649
|
+
"Look for O(n²) or worse operations",
|
|
650
|
+
"Consider using more efficient data structures"
|
|
651
|
+
])
|
|
652
|
+
estimated_improvement = "20-80% depending on algorithm"
|
|
653
|
+
|
|
654
|
+
elif profile.call_count < 10 and profile.cumulative_time > 0.5:
|
|
655
|
+
suggestions.extend([
|
|
656
|
+
"Consider parallel processing for long-running operations",
|
|
657
|
+
"Implement asynchronous processing",
|
|
658
|
+
"Use multiprocessing for CPU-bound tasks"
|
|
659
|
+
])
|
|
660
|
+
optimization_type = OptimizationType.CONCURRENCY
|
|
661
|
+
estimated_improvement = "30-70% with proper concurrency"
|
|
662
|
+
|
|
663
|
+
else:
|
|
664
|
+
suggestions.extend([
|
|
665
|
+
"Profile line-by-line to identify slow operations",
|
|
666
|
+
"Check for unnecessary loops or computations",
|
|
667
|
+
"Optimize string operations and regular expressions"
|
|
668
|
+
])
|
|
669
|
+
estimated_improvement = "10-40% with micro-optimizations"
|
|
670
|
+
|
|
671
|
+
return optimization_type, suggestions, estimated_improvement
|
|
672
|
+
|
|
673
|
+
async def _generate_memory_optimization_suggestions(
|
|
674
|
+
self, memory_usage: int,
|
|
675
|
+
context7_patterns: Dict[str, Any] = None
|
|
676
|
+
) -> tuple:
|
|
677
|
+
"""Generate memory optimization suggestions."""
|
|
678
|
+
|
|
679
|
+
suggestions = []
|
|
680
|
+
optimization_type = OptimizationType.MEMORY_OPTIMIZATION
|
|
681
|
+
|
|
682
|
+
if memory_usage > 100 * 1024 * 1024: # 100MB
|
|
683
|
+
suggestions.extend([
|
|
684
|
+
"Implement streaming processing for large datasets",
|
|
685
|
+
"Use generators instead of creating large lists",
|
|
686
|
+
"Process data in chunks to reduce memory footprint"
|
|
687
|
+
])
|
|
688
|
+
estimated_improvement = "60-90% memory reduction"
|
|
689
|
+
|
|
690
|
+
elif memory_usage > 10 * 1024 * 1024: # 10MB
|
|
691
|
+
suggestions.extend([
|
|
692
|
+
"Use memory-efficient data structures",
|
|
693
|
+
"Implement object pooling for frequently allocated objects",
|
|
694
|
+
"Consider using numpy arrays for numerical data"
|
|
695
|
+
])
|
|
696
|
+
estimated_improvement = "30-60% memory reduction"
|
|
697
|
+
|
|
698
|
+
else:
|
|
699
|
+
suggestions.extend([
|
|
700
|
+
"Release unused objects explicitly",
|
|
701
|
+
"Use weak references for caching",
|
|
702
|
+
"Avoid circular references"
|
|
703
|
+
])
|
|
704
|
+
estimated_improvement = "10-30% memory reduction"
|
|
705
|
+
|
|
706
|
+
return optimization_type, suggestions, estimated_improvement
|
|
707
|
+
|
|
708
|
+
def _get_code_snippet(self, file_path: str, line_number: int, context_lines: int = 5) -> str:
|
|
709
|
+
"""Get code snippet around the specified line."""
|
|
710
|
+
try:
|
|
711
|
+
with open(file_path, 'r', encoding='utf-8') as f:
|
|
712
|
+
lines = f.readlines()
|
|
713
|
+
|
|
714
|
+
start_line = max(0, line_number - context_lines - 1)
|
|
715
|
+
end_line = min(len(lines), line_number + context_lines)
|
|
716
|
+
|
|
717
|
+
snippet_lines = []
|
|
718
|
+
for i in range(start_line, end_line):
|
|
719
|
+
marker = ">>> " if i == line_number - 1 else " "
|
|
720
|
+
snippet_lines.append(f"{marker}{i+1:4d}: {lines[i].rstrip()}")
|
|
721
|
+
|
|
722
|
+
return '\n'.join(snippet_lines)
|
|
723
|
+
|
|
724
|
+
except Exception:
|
|
725
|
+
return f"// Code not available for {file_path}:{line_number}"
|
|
726
|
+
|
|
727
|
+
async def create_optimization_plan(
|
|
728
|
+
self, bottlenecks: List[PerformanceBottleneck],
|
|
729
|
+
context7_patterns: Dict[str, Any] = None
|
|
730
|
+
) -> OptimizationPlan:
|
|
731
|
+
"""Create comprehensive optimization plan."""
|
|
732
|
+
|
|
733
|
+
# Prioritize bottlenecks by impact and severity
|
|
734
|
+
prioritized_bottlenecks = self._prioritize_bottlenecks(bottlenecks)
|
|
735
|
+
|
|
736
|
+
# Create execution order
|
|
737
|
+
execution_order = self._create_optimization_execution_order(prioritized_bottlenecks)
|
|
738
|
+
|
|
739
|
+
# Estimate total improvement
|
|
740
|
+
total_improvement = self._estimate_total_improvement(prioritized_bottlenecks)
|
|
741
|
+
|
|
742
|
+
# Assess implementation complexity
|
|
743
|
+
complexity = self._assess_implementation_complexity(prioritized_bottlenecks)
|
|
744
|
+
|
|
745
|
+
# Assess risk level
|
|
746
|
+
risk_level = self._assess_optimization_risk(prioritized_bottlenecks)
|
|
747
|
+
|
|
748
|
+
# Identify prerequisites
|
|
749
|
+
prerequisites = self._identify_optimization_prerequisites(prioritized_bottlenecks)
|
|
750
|
+
|
|
751
|
+
# Create validation strategy
|
|
752
|
+
validation_strategy = self._create_validation_strategy(prioritized_bottlenecks)
|
|
753
|
+
|
|
754
|
+
return OptimizationPlan(
|
|
755
|
+
bottlenecks=prioritized_bottlenecks,
|
|
756
|
+
execution_order=execution_order,
|
|
757
|
+
estimated_total_improvement=total_improvement,
|
|
758
|
+
implementation_complexity=complexity,
|
|
759
|
+
risk_level=risk_level,
|
|
760
|
+
prerequisites=prerequisites,
|
|
761
|
+
validation_strategy=validation_strategy
|
|
762
|
+
)
|
|
763
|
+
|
|
764
|
+
def _prioritize_bottlenecks(
|
|
765
|
+
self, bottlenecks: List[PerformanceBottleneck]
|
|
766
|
+
) -> List[PerformanceBottleneck]:
|
|
767
|
+
"""Prioritize bottlenecks by impact and implementation complexity."""
|
|
768
|
+
|
|
769
|
+
# Sort by severity, impact score, and optimization type
|
|
770
|
+
severity_order = {'critical': 4, 'high': 3, 'medium': 2, 'low': 1}
|
|
771
|
+
|
|
772
|
+
return sorted(
|
|
773
|
+
bottlenecks,
|
|
774
|
+
key=lambda x: (
|
|
775
|
+
severity_order.get(x.severity, 0),
|
|
776
|
+
x.impact_score,
|
|
777
|
+
self._get_optimization_priority(x.optimization_type)
|
|
778
|
+
),
|
|
779
|
+
reverse=True
|
|
780
|
+
)
|
|
781
|
+
|
|
782
|
+
def _get_optimization_priority(self, opt_type: OptimizationType) -> int:
|
|
783
|
+
"""Get priority weight for optimization type."""
|
|
784
|
+
priorities = {
|
|
785
|
+
OptimizationType.ALGORITHM_IMPROVEMENT: 4,
|
|
786
|
+
OptimizationType.CACHING: 3,
|
|
787
|
+
OptimizationType.CONCURRENCY: 3,
|
|
788
|
+
OptimizationType.MEMORY_OPTIMIZATION: 2,
|
|
789
|
+
OptimizationType.DATA_STRUCTURE_CHANGE: 2,
|
|
790
|
+
OptimizationType.I/O_OPTIMIZATION: 2,
|
|
791
|
+
OptimizationType.DATABASE_OPTIMIZATION: 1
|
|
792
|
+
}
|
|
793
|
+
return priorities.get(opt_type, 1)
|
|
794
|
+
|
|
795
|
+
def _create_optimization_execution_order(
|
|
796
|
+
self, bottlenecks: List[PerformanceBottleneck]
|
|
797
|
+
) -> List[int]:
|
|
798
|
+
"""Create optimal execution order for optimizations."""
|
|
799
|
+
|
|
800
|
+
# Group by optimization type
|
|
801
|
+
type_groups = defaultdict(list)
|
|
802
|
+
for i, bottleneck in enumerate(bottlenecks):
|
|
803
|
+
type_groups[bottleneck.optimization_type].append(i)
|
|
804
|
+
|
|
805
|
+
# Define execution order by type
|
|
806
|
+
execution_order = []
|
|
807
|
+
type_order = [
|
|
808
|
+
OptimizationType.ALGORITHM_IMPROVEMENT,
|
|
809
|
+
OptimizationType.DATA_STRUCTURE_CHANGE,
|
|
810
|
+
OptimizationType.CACHING,
|
|
811
|
+
OptimizationType.MEMORY_OPTIMIZATION,
|
|
812
|
+
OptimizationType.CONCURRENCY,
|
|
813
|
+
OptimizationType.I_IO_OPTIMIZATION,
|
|
814
|
+
OptimizationType.DATABASE_OPTIMIZATION
|
|
815
|
+
]
|
|
816
|
+
|
|
817
|
+
for opt_type in type_order:
|
|
818
|
+
if opt_type in type_groups:
|
|
819
|
+
execution_order.extend(type_groups[opt_type])
|
|
820
|
+
|
|
821
|
+
return execution_order
|
|
822
|
+
|
|
823
|
+
def _estimate_total_improvement(
|
|
824
|
+
self, bottlenecks: List[PerformanceBottleneck]
|
|
825
|
+
) -> str:
|
|
826
|
+
"""Estimate total performance improvement."""
|
|
827
|
+
|
|
828
|
+
if not bottlenecks:
|
|
829
|
+
return "No significant improvement expected"
|
|
830
|
+
|
|
831
|
+
# Calculate weighted improvement
|
|
832
|
+
total_weighted_improvement = 0
|
|
833
|
+
total_weight = 0
|
|
834
|
+
|
|
835
|
+
for bottleneck in bottlenecks:
|
|
836
|
+
# Extract improvement percentage from description
|
|
837
|
+
improvement_range = self._parse_improvement_estimate(bottleneck.estimated_improvement)
|
|
838
|
+
if improvement_range:
|
|
839
|
+
avg_improvement = (improvement_range[0] + improvement_range[1]) / 2
|
|
840
|
+
weight = bottleneck.impact_score
|
|
841
|
+
total_weighted_improvement += avg_improvement * weight
|
|
842
|
+
total_weight += weight
|
|
843
|
+
|
|
844
|
+
if total_weight > 0:
|
|
845
|
+
avg_improvement = total_weighted_improvement / total_weight
|
|
846
|
+
return f"{avg_improvement:.0f}% average performance improvement"
|
|
847
|
+
|
|
848
|
+
return "Performance improvement depends on implementation"
|
|
849
|
+
|
|
850
|
+
def _parse_improvement_estimate(self, estimate: str) -> tuple:
|
|
851
|
+
"""Parse improvement percentage from estimate string."""
|
|
852
|
+
import re
|
|
853
|
+
|
|
854
|
+
# Look for percentage ranges like "20-50%" or "30%"
|
|
855
|
+
match = re.search(r'(\d+)-?(\d+)?%', estimate)
|
|
856
|
+
if match:
|
|
857
|
+
start = int(match.group(1))
|
|
858
|
+
end = int(match.group(2)) if match.group(2) else start
|
|
859
|
+
return (start, end)
|
|
860
|
+
|
|
861
|
+
return None
|
|
862
|
+
|
|
863
|
+
def _assess_implementation_complexity(
|
|
864
|
+
self, bottlenecks: List[PerformanceBottleneck]
|
|
865
|
+
) -> str:
|
|
866
|
+
"""Assess overall implementation complexity."""
|
|
867
|
+
|
|
868
|
+
complexity_scores = {
|
|
869
|
+
OptimizationType.ALGORITHM_IMPROVEMENT: 3,
|
|
870
|
+
OptimizationType.DATA_STRUCTURE_CHANGE: 3,
|
|
871
|
+
OptimizationType.CONCURRENCY: 4,
|
|
872
|
+
OptimizationType.DATABASE_OPTIMIZATION: 3,
|
|
873
|
+
OptimizationType.CACHING: 2,
|
|
874
|
+
OptimizationType.MEMORY_OPTIMIZATION: 2,
|
|
875
|
+
OptimizationType.I_O_OPTIMIZATION: 2
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
if not bottlenecks:
|
|
879
|
+
return "low"
|
|
880
|
+
|
|
881
|
+
avg_complexity = sum(
|
|
882
|
+
complexity_scores.get(b.optimization_type, 2) * b.impact_score
|
|
883
|
+
for b in bottlenecks
|
|
884
|
+
) / sum(b.impact_score for b in bottlenecks)
|
|
885
|
+
|
|
886
|
+
if avg_complexity > 3.5:
|
|
887
|
+
return "high"
|
|
888
|
+
elif avg_complexity > 2.5:
|
|
889
|
+
return "medium"
|
|
890
|
+
else:
|
|
891
|
+
return "low"
|
|
892
|
+
|
|
893
|
+
def _assess_optimization_risk(
|
|
894
|
+
self, bottlenecks: List[PerformanceBottleneck]
|
|
895
|
+
) -> str:
|
|
896
|
+
"""Assess risk level of optimizations."""
|
|
897
|
+
|
|
898
|
+
high_risk_types = {
|
|
899
|
+
OptimizationType.ALGORITHM_IMPROVEMENT,
|
|
900
|
+
OptimizationType.DATA_STRUCTURE_CHANGE,
|
|
901
|
+
OptimizationType.CONCURRENCY
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
high_risk_count = sum(
|
|
905
|
+
1 for b in bottlenecks
|
|
906
|
+
if b.optimization_type in high_risk_types and b.impact_score > 0.3
|
|
907
|
+
)
|
|
908
|
+
|
|
909
|
+
if high_risk_count > 3:
|
|
910
|
+
return "high"
|
|
911
|
+
elif high_risk_count > 1:
|
|
912
|
+
return "medium"
|
|
913
|
+
else:
|
|
914
|
+
return "low"
|
|
915
|
+
|
|
916
|
+
def _identify_optimization_prerequisites(
|
|
917
|
+
self, bottlenecks: List[PerformanceBottleneck]
|
|
918
|
+
) -> List[str]:
|
|
919
|
+
"""Identify prerequisites for safe optimization."""
|
|
920
|
+
|
|
921
|
+
prerequisites = [
|
|
922
|
+
"Create comprehensive performance benchmarks",
|
|
923
|
+
"Ensure version control with current implementation",
|
|
924
|
+
"Set up performance testing environment"
|
|
925
|
+
]
|
|
926
|
+
|
|
927
|
+
# Add specific prerequisites based on bottleneck types
|
|
928
|
+
optimization_types = set(b.optimization_type for b in bottlenecks)
|
|
929
|
+
|
|
930
|
+
if OptimizationType.CONCURRENCY in optimization_types:
|
|
931
|
+
prerequisites.extend([
|
|
932
|
+
"Review thread safety and shared resource access",
|
|
933
|
+
"Implement proper synchronization mechanisms"
|
|
934
|
+
])
|
|
935
|
+
|
|
936
|
+
if OptimizationType.DATABASE_OPTIMIZATION in optimization_types:
|
|
937
|
+
prerequisites.extend([
|
|
938
|
+
"Create database backup before optimization",
|
|
939
|
+
"Set up database performance monitoring"
|
|
940
|
+
])
|
|
941
|
+
|
|
942
|
+
if OptimizationType.ALGORITHM_IMPROVEMENT in optimization_types:
|
|
943
|
+
prerequisites.extend([
|
|
944
|
+
"Verify algorithm correctness with test suite",
|
|
945
|
+
"Compare against known reference implementations"
|
|
946
|
+
])
|
|
947
|
+
|
|
948
|
+
return prerequisites
|
|
949
|
+
|
|
950
|
+
def _create_validation_strategy(
|
|
951
|
+
self, bottlenecks: List[PerformanceBottleneck]
|
|
952
|
+
) -> str:
|
|
953
|
+
"""Create validation strategy for optimizations."""
|
|
954
|
+
|
|
955
|
+
strategy = """
|
|
956
|
+
Validation Strategy:
|
|
957
|
+
1. Baseline Performance Measurement
|
|
958
|
+
- Record current performance metrics
|
|
959
|
+
- Establish performance regression thresholds
|
|
960
|
+
|
|
961
|
+
2. Incremental Testing
|
|
962
|
+
- Apply optimizations one at a time
|
|
963
|
+
- Measure performance impact after each change
|
|
964
|
+
|
|
965
|
+
3. Automated Performance Testing
|
|
966
|
+
- Implement performance regression tests
|
|
967
|
+
- Set up continuous performance monitoring
|
|
968
|
+
|
|
969
|
+
4. Functional Validation
|
|
970
|
+
- Run complete test suite after each optimization
|
|
971
|
+
- Verify no functional regressions introduced
|
|
972
|
+
|
|
973
|
+
5. Production Monitoring
|
|
974
|
+
- Monitor performance in staging environment
|
|
975
|
+
- Gradual rollout with performance validation
|
|
976
|
+
"""
|
|
977
|
+
|
|
978
|
+
return strategy
|
|
979
|
+
|
|
980
|
+
# Usage Examples
|
|
981
|
+
"""
|
|
982
|
+
# Initialize performance profiler
|
|
983
|
+
profiler = PerformanceProfiler(context7_client=context7)
|
|
984
|
+
|
|
985
|
+
# Example function to profile
|
|
986
|
+
def expensive_function(n):
|
|
987
|
+
result = []
|
|
988
|
+
for i in range(n):
|
|
989
|
+
# Simulate expensive computation
|
|
990
|
+
temp = []
|
|
991
|
+
for j in range(i):
|
|
992
|
+
temp.append(j * j)
|
|
993
|
+
result.extend(temp)
|
|
994
|
+
return result
|
|
995
|
+
|
|
996
|
+
# Start profiling
|
|
997
|
+
profiler.start_profiling(['cpu', 'memory', 'line'])
|
|
998
|
+
|
|
999
|
+
# Add line profiler for specific function
|
|
1000
|
+
if profiler.line_profiler:
|
|
1001
|
+
profiler.line_profiler.add_function(expensive_function)
|
|
1002
|
+
|
|
1003
|
+
# Run the code to be profiled
|
|
1004
|
+
result = expensive_function(1000)
|
|
1005
|
+
|
|
1006
|
+
# Stop profiling and get results
|
|
1007
|
+
profile_results = profiler.stop_profiling()
|
|
1008
|
+
|
|
1009
|
+
# Detect bottlenecks
|
|
1010
|
+
bottlenecks = await profiler.detect_bottlenecks(profile_results)
|
|
1011
|
+
|
|
1012
|
+
print(f"Found {len(bottlenecks)} performance bottlenecks:")
|
|
1013
|
+
for bottleneck in bottlenecks[:5]: # Show top 5
|
|
1014
|
+
print(f"\nBottleneck: {bottleneck.function_name}")
|
|
1015
|
+
print(f" Type: {bottleneck.bottleneck_type}")
|
|
1016
|
+
print(f" Severity: {bottleneck.severity}")
|
|
1017
|
+
print(f" Impact: {bottleneck.impact_score:.2f}")
|
|
1018
|
+
print(f" Description: {bottleneck.description}")
|
|
1019
|
+
print(f" Optimization type: {bottleneck.optimization_type.value}")
|
|
1020
|
+
print(f" Suggested fixes:")
|
|
1021
|
+
for fix in bottleneck.suggested_fixes:
|
|
1022
|
+
print(f" - {fix}")
|
|
1023
|
+
|
|
1024
|
+
# Create optimization plan
|
|
1025
|
+
optimization_plan = await profiler.create_optimization_plan(bottlenecks)
|
|
1026
|
+
|
|
1027
|
+
print(f"\nOptimization Plan:")
|
|
1028
|
+
print(f" Estimated improvement: {optimization_plan.estimated_total_improvement}")
|
|
1029
|
+
print(f" Implementation complexity: {optimization_plan.implementation_complexity}")
|
|
1030
|
+
print(f" Risk level: {optimization_plan.risk_level}")
|
|
1031
|
+
print(f" Prerequisites: {len(optimization_plan.prerequisites)} items")
|
|
1032
|
+
|
|
1033
|
+
# Real-time monitoring example
|
|
1034
|
+
monitor = RealTimeMonitor(sampling_interval=0.5)
|
|
1035
|
+
monitor.start_monitoring()
|
|
1036
|
+
|
|
1037
|
+
# Add custom metrics callback
|
|
1038
|
+
def custom_metrics():
|
|
1039
|
+
return {
|
|
1040
|
+
'custom_counter': some_global_counter,
|
|
1041
|
+
'queue_size': len(some_queue)
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
monitor.add_callback(custom_metrics)
|
|
1045
|
+
|
|
1046
|
+
# Run application while monitoring
|
|
1047
|
+
# ... your application code ...
|
|
1048
|
+
|
|
1049
|
+
# Stop monitoring and get results
|
|
1050
|
+
monitor.stop_monitoring()
|
|
1051
|
+
recent_snapshots = monitor.get_recent_snapshots(10)
|
|
1052
|
+
avg_metrics = monitor.get_average_metrics(5)
|
|
1053
|
+
|
|
1054
|
+
print(f"Average CPU: {avg_metrics.get('avg_cpu_percent', 0):.1f}%")
|
|
1055
|
+
print(f"Average Memory: {avg_metrics.get('avg_memory_mb', 0):.1f}MB")
|
|
1056
|
+
"""
|
|
1057
|
+
```
|
|
1058
|
+
|
|
1059
|
+
## Advanced Features
|
|
1060
|
+
|
|
1061
|
+
### Intelligent Performance Optimization
|
|
1062
|
+
|
|
1063
|
+
AI-Powered Optimization Suggestions:
|
|
1064
|
+
```python
|
|
1065
|
+
class IntelligentOptimizer(PerformanceProfiler):
|
|
1066
|
+
"""Optimizer that uses AI to suggest the best optimizations."""
|
|
1067
|
+
|
|
1068
|
+
def __init__(self, context7_client=None):
|
|
1069
|
+
super().__init__(context7_client)
|
|
1070
|
+
self.optimization_history = []
|
|
1071
|
+
self.performance_models = {}
|
|
1072
|
+
|
|
1073
|
+
async def get_ai_optimization_suggestions(
|
|
1074
|
+
self, bottlenecks: List[PerformanceBottleneck],
|
|
1075
|
+
codebase_context: Dict[str, Any]
|
|
1076
|
+
) -> Dict[str, Any]:
|
|
1077
|
+
"""Get AI-powered optimization suggestions using Context7."""
|
|
1078
|
+
|
|
1079
|
+
if not self.context7:
|
|
1080
|
+
return self._get_rule_based_suggestions(bottlenecks)
|
|
1081
|
+
|
|
1082
|
+
# Get latest performance optimization patterns
|
|
1083
|
+
try:
|
|
1084
|
+
optimization_patterns = await self.context7.get_library_docs(
|
|
1085
|
+
context7_library_id="/performance/python-profiling",
|
|
1086
|
+
topic="advanced performance optimization patterns 2025",
|
|
1087
|
+
tokens=5000
|
|
1088
|
+
)
|
|
1089
|
+
|
|
1090
|
+
# Get algorithm complexity patterns
|
|
1091
|
+
algorithm_patterns = await self.context7.get_library_docs(
|
|
1092
|
+
context7_library_id="/algorithms/python",
|
|
1093
|
+
topic="algorithm optimization big-O complexity reduction",
|
|
1094
|
+
tokens=3000
|
|
1095
|
+
)
|
|
1096
|
+
|
|
1097
|
+
# Generate AI suggestions
|
|
1098
|
+
ai_suggestions = await self._generate_ai_suggestions(
|
|
1099
|
+
bottlenecks, optimization_patterns, algorithm_patterns, codebase_context
|
|
1100
|
+
)
|
|
1101
|
+
|
|
1102
|
+
return ai_suggestions
|
|
1103
|
+
|
|
1104
|
+
except Exception as e:
|
|
1105
|
+
print(f"AI optimization failed: {e}")
|
|
1106
|
+
return self._get_rule_based_suggestions(bottlenecks)
|
|
1107
|
+
|
|
1108
|
+
async def _generate_ai_suggestions(
|
|
1109
|
+
self, bottlenecks: List[PerformanceBottleneck],
|
|
1110
|
+
opt_patterns: Dict, algo_patterns: Dict, context: Dict
|
|
1111
|
+
) -> Dict[str, Any]:
|
|
1112
|
+
"""Generate AI-powered optimization suggestions."""
|
|
1113
|
+
|
|
1114
|
+
suggestions = {
|
|
1115
|
+
'algorithm_improvements': [],
|
|
1116
|
+
'data_structure_optimizations': [],
|
|
1117
|
+
'concurrency_improvements': [],
|
|
1118
|
+
'caching_strategies': [],
|
|
1119
|
+
'io_optimizations': []
|
|
1120
|
+
}
|
|
1121
|
+
|
|
1122
|
+
for bottleneck in bottlenecks:
|
|
1123
|
+
# Analyze bottleneck characteristics
|
|
1124
|
+
if bottleneck.bottleneck_type == "cpu":
|
|
1125
|
+
# Check for algorithmic improvements
|
|
1126
|
+
if "O(" in bottleneck.description or any(
|
|
1127
|
+
keyword in bottleneck.description.lower()
|
|
1128
|
+
for keyword in ["loop", "iteration", "search", "sort"]
|
|
1129
|
+
):
|
|
1130
|
+
improvement = self._suggest_algorithm_improvement(
|
|
1131
|
+
bottleneck, algo_patterns
|
|
1132
|
+
)
|
|
1133
|
+
suggestions['algorithm_improvements'].append(improvement)
|
|
1134
|
+
|
|
1135
|
+
# Check for concurrency opportunities
|
|
1136
|
+
if bottleneck.call_count > 1000:
|
|
1137
|
+
concurrency = self._suggest_concurrency_improvement(bottleneck)
|
|
1138
|
+
suggestions['concurrency_improvements'].append(concurrency)
|
|
1139
|
+
|
|
1140
|
+
elif bottleneck.bottleneck_type == "memory":
|
|
1141
|
+
# Suggest data structure optimizations
|
|
1142
|
+
data_structure = self._suggest_data_structure_improvement(
|
|
1143
|
+
bottleneck, opt_patterns
|
|
1144
|
+
)
|
|
1145
|
+
suggestions['data_structure_optimizations'].append(data_structure)
|
|
1146
|
+
|
|
1147
|
+
return suggestions
|
|
1148
|
+
|
|
1149
|
+
def _suggest_algorithm_improvement(
|
|
1150
|
+
self, bottleneck: PerformanceBottleneck, algo_patterns: Dict
|
|
1151
|
+
) -> Dict[str, Any]:
|
|
1152
|
+
"""Suggest algorithmic improvements based on Context7 patterns."""
|
|
1153
|
+
|
|
1154
|
+
# Analyze function name and code to identify algorithm type
|
|
1155
|
+
function_name = bottleneck.function_name.lower()
|
|
1156
|
+
|
|
1157
|
+
suggestions = []
|
|
1158
|
+
|
|
1159
|
+
if any(keyword in function_name for keyword in ["search", "find"]):
|
|
1160
|
+
suggestions.extend([
|
|
1161
|
+
"Consider using binary search for sorted data",
|
|
1162
|
+
"Implement hash-based lookup for O(1) average case",
|
|
1163
|
+
"Use trie structures for prefix searches"
|
|
1164
|
+
])
|
|
1165
|
+
|
|
1166
|
+
elif any(keyword in function_name for keyword in ["sort", "order"]):
|
|
1167
|
+
suggestions.extend([
|
|
1168
|
+
"Consider using Timsort (Python's built-in sort)",
|
|
1169
|
+
"Use radix sort for uniform integer data",
|
|
1170
|
+
"Implement bucket sort for uniformly distributed data"
|
|
1171
|
+
])
|
|
1172
|
+
|
|
1173
|
+
elif "nested" in function_name or bottleneck.metrics.get('per_call_time', 0) > 0.1:
|
|
1174
|
+
suggestions.extend([
|
|
1175
|
+
"Look for O(n²) nested loops to optimize",
|
|
1176
|
+
"Consider dynamic programming for overlapping subproblems",
|
|
1177
|
+
"Use memoization to avoid repeated calculations"
|
|
1178
|
+
])
|
|
1179
|
+
|
|
1180
|
+
return {
|
|
1181
|
+
'bottleneck': bottleneck.function_name,
|
|
1182
|
+
'suggestions': suggestions,
|
|
1183
|
+
'estimated_improvement': "30-90% depending on algorithm",
|
|
1184
|
+
'implementation_complexity': "medium to high"
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
def _suggest_concurrency_improvement(
|
|
1188
|
+
self, bottleneck: PerformanceBottleneck
|
|
1189
|
+
) -> Dict[str, Any]:
|
|
1190
|
+
"""Suggest concurrency improvements."""
|
|
1191
|
+
|
|
1192
|
+
return {
|
|
1193
|
+
'bottleneck': bottleneck.function_name,
|
|
1194
|
+
'suggestions': [
|
|
1195
|
+
"Implement multiprocessing for CPU-bound tasks",
|
|
1196
|
+
"Use threading for I/O-bound operations",
|
|
1197
|
+
"Consider asyncio for concurrent I/O operations",
|
|
1198
|
+
"Use concurrent.futures for thread/process pool execution"
|
|
1199
|
+
],
|
|
1200
|
+
'estimated_improvement': "2-8x speedup on multi-core systems",
|
|
1201
|
+
'implementation_complexity': "medium"
|
|
1202
|
+
}
|
|
1203
|
+
|
|
1204
|
+
def _suggest_data_structure_improvement(
|
|
1205
|
+
self, bottleneck: PerformanceBottleneck, opt_patterns: Dict
|
|
1206
|
+
) -> Dict[str, Any]:
|
|
1207
|
+
"""Suggest data structure optimizations."""
|
|
1208
|
+
|
|
1209
|
+
return {
|
|
1210
|
+
'bottleneck': bottleneck.function_name,
|
|
1211
|
+
'suggestions': [
|
|
1212
|
+
"Use generators instead of lists for large datasets",
|
|
1213
|
+
"Implement lazy loading for expensive data structures",
|
|
1214
|
+
"Use memoryviews or numpy arrays for numerical data",
|
|
1215
|
+
"Consider using collections.deque for queue operations",
|
|
1216
|
+
"Use set/dict for O(1) lookups instead of list searches"
|
|
1217
|
+
],
|
|
1218
|
+
'estimated_improvement': "30-80% memory reduction",
|
|
1219
|
+
'implementation_complexity': "low to medium"
|
|
1220
|
+
}
|
|
1221
|
+
```
|
|
1222
|
+
|
|
1223
|
+
## Best Practices
|
|
1224
|
+
|
|
1225
|
+
1. Baseline Measurement: Always establish performance baseline before optimization
|
|
1226
|
+
2. Incremental Changes: Apply one optimization at a time to measure impact
|
|
1227
|
+
3. Comprehensive Testing: Ensure functionality is preserved during optimization
|
|
1228
|
+
4. Real-world Workloads: Profile with realistic data and usage patterns
|
|
1229
|
+
5. Continuous Monitoring: Implement ongoing performance monitoring in production
|
|
1230
|
+
|
|
1231
|
+
---
|
|
1232
|
+
|
|
1233
|
+
Module: `modules/performance-optimization.md`
|
|
1234
|
+
Related: [AI Debugging](./ai-debugging.md) | [Smart Refactoring](./smart-refactoring.md)
|