moai-adk 0.25.4__py3-none-any.whl → 0.32.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +2 -5
- moai_adk/__main__.py +114 -82
- moai_adk/cli/__init__.py +6 -1
- moai_adk/cli/commands/__init__.py +1 -3
- moai_adk/cli/commands/analyze.py +5 -16
- moai_adk/cli/commands/doctor.py +6 -18
- moai_adk/cli/commands/init.py +56 -125
- moai_adk/cli/commands/language.py +14 -35
- moai_adk/cli/commands/status.py +9 -15
- moai_adk/cli/commands/update.py +1555 -190
- moai_adk/cli/prompts/init_prompts.py +112 -56
- moai_adk/cli/spec_status.py +263 -0
- moai_adk/cli/ui/__init__.py +44 -0
- moai_adk/cli/ui/progress.py +422 -0
- moai_adk/cli/ui/prompts.py +389 -0
- moai_adk/cli/ui/theme.py +129 -0
- moai_adk/cli/worktree/__init__.py +27 -0
- moai_adk/cli/worktree/__main__.py +31 -0
- moai_adk/cli/worktree/cli.py +672 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +490 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +128 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/analysis/session_analyzer.py +17 -56
- moai_adk/core/claude_integration.py +26 -54
- moai_adk/core/command_helpers.py +10 -10
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/auto_spec_config.py +5 -11
- moai_adk/core/config/migration.py +19 -9
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +6 -12
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +725 -112
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +8 -0
- moai_adk/core/git/branch_manager.py +3 -11
- moai_adk/core/git/checkpoint.py +1 -3
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/manager.py +91 -1
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +56 -80
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/engine.py +6 -18
- moai_adk/core/integration/integration_tester.py +10 -9
- moai_adk/core/integration/utils.py +1 -1
- moai_adk/core/issue_creator.py +10 -28
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config_resolver.py +485 -0
- moai_adk/core/language_validator.py +28 -41
- moai_adk/core/mcp/setup.py +15 -12
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +481 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +78 -9
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +8 -17
- moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
- moai_adk/core/migration/selective_restorer.py +470 -0
- moai_adk/core/migration/template_utils.py +74 -0
- moai_adk/core/migration/user_selection_ui.py +338 -0
- moai_adk/core/migration/version_detector.py +6 -10
- moai_adk/core/migration/version_migrator.py +3 -3
- moai_adk/core/performance/cache_system.py +8 -10
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/checker.py +2 -4
- moai_adk/core/project/detector.py +1 -3
- moai_adk/core/project/initializer.py +135 -23
- moai_adk/core/project/phase_executor.py +54 -81
- moai_adk/core/project/validator.py +6 -12
- moai_adk/core/quality/trust_checker.py +9 -27
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +73 -148
- moai_adk/core/session_manager.py +10 -26
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +31 -100
- moai_adk/core/spec/ears_template_engine.py +351 -286
- moai_adk/core/spec/quality_validator.py +35 -69
- moai_adk/core/spec_status_manager.py +64 -74
- moai_adk/core/template/backup.py +45 -20
- moai_adk/core/template/config.py +112 -39
- moai_adk/core/template/merger.py +11 -19
- moai_adk/core/template/processor.py +253 -149
- moai_adk/core/template_engine.py +73 -40
- moai_adk/core/template_variable_synchronizer.py +417 -0
- moai_adk/core/unified_permission_manager.py +745 -0
- moai_adk/core/user_behavior_analytics.py +851 -0
- moai_adk/core/version_sync.py +429 -0
- moai_adk/foundation/__init__.py +56 -0
- moai_adk/foundation/backend.py +1027 -0
- moai_adk/foundation/database.py +1115 -0
- moai_adk/foundation/devops.py +1585 -0
- moai_adk/foundation/ears.py +431 -0
- moai_adk/foundation/frontend.py +870 -0
- moai_adk/foundation/git/commit_templates.py +4 -12
- moai_adk/foundation/git.py +376 -0
- moai_adk/foundation/langs.py +484 -0
- moai_adk/foundation/ml_ops.py +1162 -0
- moai_adk/foundation/testing.py +1524 -0
- moai_adk/foundation/trust/trust_principles.py +23 -72
- moai_adk/foundation/trust/validation_checklist.py +57 -162
- moai_adk/project/__init__.py +0 -0
- moai_adk/project/configuration.py +1084 -0
- moai_adk/project/documentation.py +566 -0
- moai_adk/project/schema.py +447 -0
- moai_adk/statusline/alfred_detector.py +1 -3
- moai_adk/statusline/config.py +13 -4
- moai_adk/statusline/enhanced_output_style_detector.py +23 -15
- moai_adk/statusline/main.py +51 -15
- moai_adk/statusline/renderer.py +104 -48
- moai_adk/statusline/update_checker.py +3 -9
- moai_adk/statusline/version_reader.py +140 -46
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +993 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
- moai_adk/templates/.claude/hooks/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
- moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
- moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
- moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +921 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +320 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +496 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +491 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +201 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +438 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +362 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/SKILL.md +352 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +316 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +370 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/README.md +186 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +135 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +374 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +410 -0
- moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
- moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +103 -41
- moai_adk/templates/.git-hooks/pre-push +116 -21
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.gitignore +184 -44
- moai_adk/templates/.mcp.json +7 -9
- moai_adk/templates/.moai/cache/personalization.json +10 -0
- moai_adk/templates/.moai/config/config.yaml +344 -0
- moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
- moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
- moai_adk/templates/.moai/config/presets/team.yaml +33 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -0
- moai_adk/templates/.moai/config/sections/language.yaml +11 -0
- moai_adk/templates/.moai/config/sections/project.yaml +13 -0
- moai_adk/templates/.moai/config/sections/quality.yaml +15 -0
- moai_adk/templates/.moai/config/sections/system.yaml +14 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +382 -501
- moai_adk/utils/__init__.py +24 -1
- moai_adk/utils/banner.py +7 -10
- moai_adk/utils/common.py +16 -30
- moai_adk/utils/link_validator.py +4 -12
- moai_adk/utils/safe_file_reader.py +2 -6
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.32.8.dist-info/METADATA +2478 -0
- moai_adk-0.32.8.dist-info/RECORD +396 -0
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
- moai_adk/cli/commands/backup.py +0 -82
- moai_adk/cli/commands/improve_user_experience.py +0 -348
- moai_adk/cli/commands/migrate.py +0 -158
- moai_adk/cli/commands/validate_links.py +0 -118
- moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -413
- moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
- moai_adk/utils/user_experience.py +0 -531
- moai_adk-0.25.4.dist-info/METADATA +0 -2279
- moai_adk-0.25.4.dist-info/RECORD +0 -112
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
# Caching and Performance Optimization
|
|
2
|
+
|
|
3
|
+
> Module: Advanced caching strategies and performance optimization
|
|
4
|
+
> Complexity: Advanced
|
|
5
|
+
> Time: 15+ minutes
|
|
6
|
+
> Dependencies: functools, hashlib, pickle, time, typing
|
|
7
|
+
|
|
8
|
+
## Intelligent Data Caching
|
|
9
|
+
|
|
10
|
+
```python
|
|
11
|
+
from functools import wraps
|
|
12
|
+
import hashlib
|
|
13
|
+
import pickle
|
|
14
|
+
from typing import Any, Dict, Optional
|
|
15
|
+
import time
|
|
16
|
+
|
|
17
|
+
class DataCache:
|
|
18
|
+
"""Intelligent caching system for data operations."""
|
|
19
|
+
|
|
20
|
+
def __init__(self, max_size: int = 1000, ttl: int = 3600):
|
|
21
|
+
self.max_size = max_size
|
|
22
|
+
self.ttl = ttl
|
|
23
|
+
self.cache: Dict[str, Dict] = {}
|
|
24
|
+
|
|
25
|
+
def _generate_key(self, func_name: str, args: tuple, kwargs: dict) -> str:
|
|
26
|
+
"""Generate cache key from function arguments."""
|
|
27
|
+
key_data = {
|
|
28
|
+
'func': func_name,
|
|
29
|
+
'args': args,
|
|
30
|
+
'kwargs': kwargs
|
|
31
|
+
}
|
|
32
|
+
key_str = pickle.dumps(key_data)
|
|
33
|
+
return hashlib.md5(key_str).hexdigest()
|
|
34
|
+
|
|
35
|
+
def cache_result(self, ttl: Optional[int] = None):
|
|
36
|
+
"""Decorator for caching function results."""
|
|
37
|
+
def decorator(func):
|
|
38
|
+
@wraps(func)
|
|
39
|
+
def wrapper(*args, kwargs):
|
|
40
|
+
cache_key = self._generate_key(func.__name__, args, kwargs)
|
|
41
|
+
|
|
42
|
+
# Check cache
|
|
43
|
+
if cache_key in self.cache:
|
|
44
|
+
cache_entry = self.cache[cache_key]
|
|
45
|
+
if time.time() - cache_entry['timestamp'] < (ttl or self.ttl):
|
|
46
|
+
return cache_entry['result']
|
|
47
|
+
|
|
48
|
+
# Execute function and cache result
|
|
49
|
+
result = func(*args, kwargs)
|
|
50
|
+
|
|
51
|
+
# Manage cache size
|
|
52
|
+
if len(self.cache) >= self.max_size:
|
|
53
|
+
# Remove oldest entry
|
|
54
|
+
oldest_key = min(self.cache.keys(),
|
|
55
|
+
key=lambda k: self.cache[k]['timestamp'])
|
|
56
|
+
del self.cache[oldest_key]
|
|
57
|
+
|
|
58
|
+
# Store new entry
|
|
59
|
+
self.cache[cache_key] = {
|
|
60
|
+
'result': result,
|
|
61
|
+
'timestamp': time.time()
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return result
|
|
65
|
+
|
|
66
|
+
return wrapper
|
|
67
|
+
return decorator
|
|
68
|
+
|
|
69
|
+
def invalidate_pattern(self, pattern: str):
|
|
70
|
+
"""Invalidate cache entries matching pattern."""
|
|
71
|
+
keys_to_remove = [
|
|
72
|
+
key for key in self.cache.keys()
|
|
73
|
+
if pattern in key
|
|
74
|
+
]
|
|
75
|
+
for key in keys_to_remove:
|
|
76
|
+
del self.cache[key]
|
|
77
|
+
|
|
78
|
+
def clear_expired(self):
|
|
79
|
+
"""Clear expired cache entries."""
|
|
80
|
+
current_time = time.time()
|
|
81
|
+
expired_keys = [
|
|
82
|
+
key for key, entry in self.cache.items()
|
|
83
|
+
if current_time - entry['timestamp'] >= self.ttl
|
|
84
|
+
]
|
|
85
|
+
for key in expired_keys:
|
|
86
|
+
del self.cache[key]
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Advanced Caching Strategies
|
|
90
|
+
|
|
91
|
+
### Multi-Level Caching
|
|
92
|
+
|
|
93
|
+
```python
|
|
94
|
+
class MultiLevelCache:
|
|
95
|
+
"""Multi-level caching with memory and persistent storage."""
|
|
96
|
+
|
|
97
|
+
def __init__(self, memory_size: int = 1000, persistent_path: str = None):
|
|
98
|
+
self.memory_cache = DataCache(max_size=memory_size)
|
|
99
|
+
self.persistent_path = persistent_path
|
|
100
|
+
self.persistent_cache = {}
|
|
101
|
+
|
|
102
|
+
if persistent_path:
|
|
103
|
+
self._load_persistent_cache()
|
|
104
|
+
|
|
105
|
+
def _load_persistent_cache(self):
|
|
106
|
+
"""Load persistent cache from disk."""
|
|
107
|
+
try:
|
|
108
|
+
with open(self.persistent_path, 'rb') as f:
|
|
109
|
+
self.persistent_cache = pickle.load(f)
|
|
110
|
+
except (FileNotFoundError, pickle.PickleError):
|
|
111
|
+
self.persistent_cache = {}
|
|
112
|
+
|
|
113
|
+
def _save_persistent_cache(self):
|
|
114
|
+
"""Save persistent cache to disk."""
|
|
115
|
+
try:
|
|
116
|
+
with open(self.persistent_path, 'wb') as f:
|
|
117
|
+
pickle.dump(self.persistent_cache, f)
|
|
118
|
+
except (IOError, pickle.PickleError):
|
|
119
|
+
pass # Silently fail for cache operations
|
|
120
|
+
|
|
121
|
+
def get(self, key: str, use_memory: bool = True, use_persistent: bool = True) -> Any:
|
|
122
|
+
"""Get value from cache levels."""
|
|
123
|
+
# Try memory cache first
|
|
124
|
+
if use_memory and key in self.memory_cache.cache:
|
|
125
|
+
entry = self.memory_cache.cache[key]
|
|
126
|
+
if time.time() - entry['timestamp'] < self.memory_cache.ttl:
|
|
127
|
+
return entry['result']
|
|
128
|
+
|
|
129
|
+
# Try persistent cache
|
|
130
|
+
if use_persistent and key in self.persistent_cache:
|
|
131
|
+
entry = self.persistent_cache[key]
|
|
132
|
+
if time.time() - entry['timestamp'] < entry.get('ttl', self.memory_cache.ttl):
|
|
133
|
+
# Promote to memory cache
|
|
134
|
+
self.memory_cache.cache[key] = entry
|
|
135
|
+
return entry['result']
|
|
136
|
+
|
|
137
|
+
return None
|
|
138
|
+
|
|
139
|
+
def set(self, key: str, value: Any, persist: bool = False, ttl: int = None):
|
|
140
|
+
"""Set value in cache levels."""
|
|
141
|
+
# Always set in memory cache
|
|
142
|
+
self.memory_cache.cache[key] = {
|
|
143
|
+
'result': value,
|
|
144
|
+
'timestamp': time.time()
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
# Optionally persist
|
|
148
|
+
if persist and self.persistent_path:
|
|
149
|
+
self.persistent_cache[key] = {
|
|
150
|
+
'result': value,
|
|
151
|
+
'timestamp': time.time(),
|
|
152
|
+
'ttl': ttl or self.memory_cache.ttl
|
|
153
|
+
}
|
|
154
|
+
self._save_persistent_cache()
|
|
155
|
+
|
|
156
|
+
class SmartCache:
|
|
157
|
+
"""Smart caching with memory pressure and access pattern analysis."""
|
|
158
|
+
|
|
159
|
+
def __init__(self, max_memory_mb: int = 100, max_items: int = 10000):
|
|
160
|
+
self.max_memory_mb = max_memory_mb
|
|
161
|
+
self.max_items = max_items
|
|
162
|
+
self.cache = {}
|
|
163
|
+
self.access_count = {}
|
|
164
|
+
self.last_access = {}
|
|
165
|
+
self.estimated_sizes = {}
|
|
166
|
+
|
|
167
|
+
def _estimate_size(self, obj: Any) -> int:
|
|
168
|
+
"""Estimate memory size of an object."""
|
|
169
|
+
try:
|
|
170
|
+
return len(pickle.dumps(obj))
|
|
171
|
+
except pickle.PickleError:
|
|
172
|
+
return 1024 # Default estimate
|
|
173
|
+
|
|
174
|
+
def _get_memory_usage(self) -> int:
|
|
175
|
+
"""Get current memory usage in bytes."""
|
|
176
|
+
return sum(self.estimated_sizes.values())
|
|
177
|
+
|
|
178
|
+
def _evict_lru(self, count: int = 1):
|
|
179
|
+
"""Evict least recently used items."""
|
|
180
|
+
if not self.cache:
|
|
181
|
+
return
|
|
182
|
+
|
|
183
|
+
# Sort by last access time
|
|
184
|
+
sorted_items = sorted(
|
|
185
|
+
self.cache.keys(),
|
|
186
|
+
key=lambda k: self.last_access.get(k, 0)
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
for key in sorted_items[:count]:
|
|
190
|
+
self.remove(key)
|
|
191
|
+
|
|
192
|
+
def get(self, key: str) -> Any:
|
|
193
|
+
"""Get item and update access statistics."""
|
|
194
|
+
if key in self.cache:
|
|
195
|
+
entry = self.cache[key]
|
|
196
|
+
current_time = time.time()
|
|
197
|
+
|
|
198
|
+
# Check expiration
|
|
199
|
+
if current_time - entry['timestamp'] > entry.get('ttl', float('inf')):
|
|
200
|
+
self.remove(key)
|
|
201
|
+
return None
|
|
202
|
+
|
|
203
|
+
# Update access statistics
|
|
204
|
+
self.access_count[key] = self.access_count.get(key, 0) + 1
|
|
205
|
+
self.last_access[key] = current_time
|
|
206
|
+
|
|
207
|
+
return entry['value']
|
|
208
|
+
|
|
209
|
+
return None
|
|
210
|
+
|
|
211
|
+
def set(self, key: str, value: Any, ttl: int = None):
|
|
212
|
+
"""Set item with memory management."""
|
|
213
|
+
current_time = time.time()
|
|
214
|
+
item_size = self._estimate_size(value)
|
|
215
|
+
|
|
216
|
+
# Check memory constraints
|
|
217
|
+
if (self._get_memory_usage() + item_size > self.max_memory_mb * 1024 * 1024 or
|
|
218
|
+
len(self.cache) >= self.max_items):
|
|
219
|
+
|
|
220
|
+
# Calculate eviction score (access count * recency)
|
|
221
|
+
def eviction_score(k):
|
|
222
|
+
count = self.access_count.get(k, 0)
|
|
223
|
+
last_access = self.last_access.get(k, current_time)
|
|
224
|
+
recency = current_time - last_access
|
|
225
|
+
return count / (recency + 1) # Avoid division by zero
|
|
226
|
+
|
|
227
|
+
# Evict items with lowest scores
|
|
228
|
+
if self.cache:
|
|
229
|
+
sorted_by_score = sorted(self.cache.keys(), key=eviction_score)
|
|
230
|
+
evict_count = max(1, len(self.cache) // 10) # Evict 10% or at least 1
|
|
231
|
+
for key in sorted_by_score[:evict_count]:
|
|
232
|
+
self.remove(key)
|
|
233
|
+
|
|
234
|
+
# Store item
|
|
235
|
+
self.cache[key] = {
|
|
236
|
+
'value': value,
|
|
237
|
+
'timestamp': current_time,
|
|
238
|
+
'ttl': ttl or float('inf')
|
|
239
|
+
}
|
|
240
|
+
self.access_count[key] = 1
|
|
241
|
+
self.last_access[key] = current_time
|
|
242
|
+
self.estimated_sizes[key] = item_size
|
|
243
|
+
|
|
244
|
+
def remove(self, key: str):
|
|
245
|
+
"""Remove item from cache."""
|
|
246
|
+
self.cache.pop(key, None)
|
|
247
|
+
self.access_count.pop(key, None)
|
|
248
|
+
self.last_access.pop(key, None)
|
|
249
|
+
self.estimated_sizes.pop(key, None)
|
|
250
|
+
|
|
251
|
+
def get_stats(self) -> Dict[str, Any]:
|
|
252
|
+
"""Get cache statistics."""
|
|
253
|
+
return {
|
|
254
|
+
'items': len(self.cache),
|
|
255
|
+
'memory_usage_mb': self._get_memory_usage() / (1024 * 1024),
|
|
256
|
+
'memory_limit_mb': self.max_memory_mb,
|
|
257
|
+
'hit_rate': self._calculate_hit_rate(),
|
|
258
|
+
'top_accessed': sorted(
|
|
259
|
+
self.access_count.items(),
|
|
260
|
+
key=lambda x: x[1],
|
|
261
|
+
reverse=True
|
|
262
|
+
)[:10]
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
def _calculate_hit_rate(self) -> float:
|
|
266
|
+
"""Calculate cache hit rate (simplified)."""
|
|
267
|
+
total_accesses = sum(self.access_count.values())
|
|
268
|
+
if total_accesses == 0:
|
|
269
|
+
return 0.0
|
|
270
|
+
# This is a simplified calculation - real implementation would track hits/misses
|
|
271
|
+
return min(0.8, total_accesses / (total_accesses + 10)) # Dummy calculation
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Cache Invalidation Strategies
|
|
275
|
+
|
|
276
|
+
```python
|
|
277
|
+
class CacheInvalidator:
|
|
278
|
+
"""Advanced cache invalidation strategies."""
|
|
279
|
+
|
|
280
|
+
def __init__(self, cache: DataCache):
|
|
281
|
+
self.cache = cache
|
|
282
|
+
self.tags = {} # key -> set of tags
|
|
283
|
+
self.tag_to_keys = {} # tag -> set of keys
|
|
284
|
+
|
|
285
|
+
def set_with_tags(self, key: str, value: Any, tags: List[str], ttl: int = None):
|
|
286
|
+
"""Set cache value with tags for invalidation."""
|
|
287
|
+
# Store in cache
|
|
288
|
+
if hasattr(self.cache, 'set'):
|
|
289
|
+
self.cache.set(key, value, ttl)
|
|
290
|
+
else:
|
|
291
|
+
self.cache.cache[key] = {
|
|
292
|
+
'result': value,
|
|
293
|
+
'timestamp': time.time()
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
# Manage tags
|
|
297
|
+
self.tags[key] = set(tags)
|
|
298
|
+
for tag in tags:
|
|
299
|
+
if tag not in self.tag_to_keys:
|
|
300
|
+
self.tag_to_keys[tag] = set()
|
|
301
|
+
self.tag_to_keys[tag].add(key)
|
|
302
|
+
|
|
303
|
+
def invalidate_by_tag(self, tag: str):
|
|
304
|
+
"""Invalidate all cache entries with specific tag."""
|
|
305
|
+
if tag in self.tag_to_keys:
|
|
306
|
+
keys_to_invalidate = self.tag_to_keys[tag]
|
|
307
|
+
for key in keys_to_invalidate:
|
|
308
|
+
self.cache.cache.pop(key, None)
|
|
309
|
+
self.tags.pop(key, None)
|
|
310
|
+
|
|
311
|
+
# Clear tag mapping
|
|
312
|
+
del self.tag_to_keys[tag]
|
|
313
|
+
|
|
314
|
+
def invalidate_by_pattern(self, pattern: str, is_regex: bool = False):
|
|
315
|
+
"""Invalidate cache entries matching pattern."""
|
|
316
|
+
keys_to_remove = []
|
|
317
|
+
|
|
318
|
+
if is_regex:
|
|
319
|
+
import re
|
|
320
|
+
regex = re.compile(pattern)
|
|
321
|
+
keys_to_remove = [key for key in self.cache.cache.keys() if regex.match(key)]
|
|
322
|
+
else:
|
|
323
|
+
keys_to_remove = [key for key in self.cache.cache.keys() if pattern in key]
|
|
324
|
+
|
|
325
|
+
for key in keys_to_remove:
|
|
326
|
+
self.cache.cache.pop(key, None)
|
|
327
|
+
# Clean up tags
|
|
328
|
+
if key in self.tags:
|
|
329
|
+
for tag in self.tags[key]:
|
|
330
|
+
self.tag_to_keys[tag].discard(key)
|
|
331
|
+
self.tags.pop(key, None)
|
|
332
|
+
|
|
333
|
+
def invalidate_dependencies(self, key: str):
|
|
334
|
+
"""Invalidate entries that depend on this key."""
|
|
335
|
+
# Implement dependency tracking logic
|
|
336
|
+
pass
|
|
337
|
+
|
|
338
|
+
class CacheWarmer:
|
|
339
|
+
"""Cache warming for predictable access patterns."""
|
|
340
|
+
|
|
341
|
+
def __init__(self, cache: DataCache):
|
|
342
|
+
self.cache = cache
|
|
343
|
+
self.warming_strategies = {}
|
|
344
|
+
|
|
345
|
+
def register_warm_strategy(self, name: str, warm_func: callable):
|
|
346
|
+
"""Register a cache warming strategy."""
|
|
347
|
+
self.warming_strategies[name] = warm_func
|
|
348
|
+
|
|
349
|
+
def warm_cache(self, strategy_name: str, *args, kwargs):
|
|
350
|
+
"""Warm cache using specific strategy."""
|
|
351
|
+
if strategy_name in self.warming_strategies:
|
|
352
|
+
warm_func = self.warming_strategies[strategy_name]
|
|
353
|
+
warm_func(self.cache, *args, kwargs)
|
|
354
|
+
|
|
355
|
+
def warm_all_strategies(self):
|
|
356
|
+
"""Warm cache using all registered strategies."""
|
|
357
|
+
for name, warm_func in self.warming_strategies.items():
|
|
358
|
+
try:
|
|
359
|
+
warm_func(self.cache)
|
|
360
|
+
except Exception as e:
|
|
361
|
+
print(f"Cache warming failed for {name}: {e}")
|
|
362
|
+
|
|
363
|
+
# Example usage
|
|
364
|
+
@SmartCache(max_memory_mb=50).cache.cache_result(ttl=1800)
|
|
365
|
+
def expensive_computation(data: Dict) -> Dict:
|
|
366
|
+
"""Example function with caching."""
|
|
367
|
+
# Simulate expensive operation
|
|
368
|
+
time.sleep(0.1)
|
|
369
|
+
return {"result": sum(data.values()), "timestamp": time.time()}
|
|
370
|
+
|
|
371
|
+
def cache_warming_example(cache: DataCache):
|
|
372
|
+
"""Example cache warming function."""
|
|
373
|
+
# Pre-load common data
|
|
374
|
+
common_data = [
|
|
375
|
+
{"a": 1, "b": 2},
|
|
376
|
+
{"x": 10, "y": 20},
|
|
377
|
+
{"p": 100, "q": 200}
|
|
378
|
+
]
|
|
379
|
+
|
|
380
|
+
for data in common_data:
|
|
381
|
+
cache.cache.cache[f"computation_{hash(str(data))}"] = {
|
|
382
|
+
'result': {"result": sum(data.values()), "timestamp": time.time()},
|
|
383
|
+
'timestamp': time.time()
|
|
384
|
+
}
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
## Performance Monitoring
|
|
388
|
+
|
|
389
|
+
```python
|
|
390
|
+
class PerformanceMonitor:
|
|
391
|
+
"""Monitor cache and data processing performance."""
|
|
392
|
+
|
|
393
|
+
def __init__(self):
|
|
394
|
+
self.metrics = {
|
|
395
|
+
'cache_hits': 0,
|
|
396
|
+
'cache_misses': 0,
|
|
397
|
+
'operation_times': {},
|
|
398
|
+
'memory_usage': []
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
def record_cache_hit(self):
|
|
402
|
+
"""Record a cache hit."""
|
|
403
|
+
self.metrics['cache_hits'] += 1
|
|
404
|
+
|
|
405
|
+
def record_cache_miss(self):
|
|
406
|
+
"""Record a cache miss."""
|
|
407
|
+
self.metrics['cache_misses'] += 1
|
|
408
|
+
|
|
409
|
+
def time_operation(self, operation_name: str):
|
|
410
|
+
"""Decorator to time operations."""
|
|
411
|
+
def decorator(func):
|
|
412
|
+
@wraps(func)
|
|
413
|
+
def wrapper(*args, kwargs):
|
|
414
|
+
start_time = time.time()
|
|
415
|
+
result = func(*args, kwargs)
|
|
416
|
+
duration = time.time() - start_time
|
|
417
|
+
|
|
418
|
+
if operation_name not in self.metrics['operation_times']:
|
|
419
|
+
self.metrics['operation_times'][operation_name] = []
|
|
420
|
+
self.metrics['operation_times'][operation_name].append(duration)
|
|
421
|
+
|
|
422
|
+
return result
|
|
423
|
+
return wrapper
|
|
424
|
+
return decorator
|
|
425
|
+
|
|
426
|
+
def get_cache_hit_rate(self) -> float:
|
|
427
|
+
"""Calculate cache hit rate."""
|
|
428
|
+
total = self.metrics['cache_hits'] + self.metrics['cache_misses']
|
|
429
|
+
return self.metrics['cache_hits'] / total if total > 0 else 0.0
|
|
430
|
+
|
|
431
|
+
def get_performance_report(self) -> Dict[str, Any]:
|
|
432
|
+
"""Get comprehensive performance report."""
|
|
433
|
+
report = {
|
|
434
|
+
'cache_hit_rate': self.get_cache_hit_rate(),
|
|
435
|
+
'total_requests': self.metrics['cache_hits'] + self.metrics['cache_misses']
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
# Operation statistics
|
|
439
|
+
for op_name, times in self.metrics['operation_times'].items():
|
|
440
|
+
report[f'{op_name}_avg_time'] = sum(times) / len(times)
|
|
441
|
+
report[f'{op_name}_max_time'] = max(times)
|
|
442
|
+
report[f'{op_name}_min_time'] = min(times)
|
|
443
|
+
|
|
444
|
+
return report
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
## Best Practices
|
|
448
|
+
|
|
449
|
+
1. Use multi-level caching: Memory + persistent storage
|
|
450
|
+
2. Implement smart eviction: LRU with memory pressure awareness
|
|
451
|
+
3. Tag-based invalidation: Group related cache entries
|
|
452
|
+
4. Monitor performance: Track hit rates and operation times
|
|
453
|
+
5. Warm caches strategically: Pre-load predictable data
|
|
454
|
+
6. Set appropriate TTLs: Balance freshness and performance
|
|
455
|
+
|
|
456
|
+
---
|
|
457
|
+
|
|
458
|
+
Module: `modules/caching-performance.md`
|
|
459
|
+
Related: [JSON Optimization](./json-optimization.md) | [TOON Encoding](./toon-encoding.md)
|