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,228 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Main version migration orchestrator for MoAI-ADK
|
|
3
|
+
|
|
4
|
+
Coordinates version detection, backup creation, file migration,
|
|
5
|
+
and cleanup processes for automatic project upgrades.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Any, Dict
|
|
11
|
+
|
|
12
|
+
from .backup_manager import BackupManager
|
|
13
|
+
from .file_migrator import FileMigrator
|
|
14
|
+
from .version_detector import VersionDetector
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class VersionMigrator:
|
|
20
|
+
"""Main migration orchestrator for MoAI-ADK version upgrades"""
|
|
21
|
+
|
|
22
|
+
def __init__(self, project_root: Path):
|
|
23
|
+
"""
|
|
24
|
+
Initialize version migrator
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
project_root: Root directory of the project
|
|
28
|
+
"""
|
|
29
|
+
self.project_root = Path(project_root)
|
|
30
|
+
self.detector = VersionDetector(project_root)
|
|
31
|
+
self.backup_manager = BackupManager(project_root)
|
|
32
|
+
self.file_migrator = FileMigrator(project_root)
|
|
33
|
+
|
|
34
|
+
def detect_version(self) -> str:
|
|
35
|
+
"""
|
|
36
|
+
Detect current project version
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
Version string (e.g., "0.23.0", "0.24.0+", "unknown")
|
|
40
|
+
"""
|
|
41
|
+
return self.detector.detect_version()
|
|
42
|
+
|
|
43
|
+
def needs_migration(self) -> bool:
|
|
44
|
+
"""
|
|
45
|
+
Check if project needs migration
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
True if migration is needed, False otherwise
|
|
49
|
+
"""
|
|
50
|
+
return self.detector.needs_migration()
|
|
51
|
+
|
|
52
|
+
def get_migration_info(self) -> Dict[str, Any]:
|
|
53
|
+
"""
|
|
54
|
+
Get detailed migration information
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
Dictionary with migration details
|
|
58
|
+
"""
|
|
59
|
+
version = self.detector.detect_version()
|
|
60
|
+
needs_migration = self.detector.needs_migration()
|
|
61
|
+
plan = self.detector.get_migration_plan()
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
"current_version": version,
|
|
65
|
+
"needs_migration": needs_migration,
|
|
66
|
+
"target_version": "0.24.0" if needs_migration else version,
|
|
67
|
+
"migration_plan": plan,
|
|
68
|
+
"file_count": len(plan.get("move", [])),
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
def migrate_to_v024(self, dry_run: bool = False, cleanup: bool = True) -> bool:
|
|
72
|
+
"""
|
|
73
|
+
Migrate project from v0.23.0 to v0.24.0
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
dry_run: If True, only show what would be done
|
|
77
|
+
cleanup: If True, remove old files after successful migration
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
True if migration was successful, False otherwise
|
|
81
|
+
"""
|
|
82
|
+
if not self.needs_migration():
|
|
83
|
+
logger.info("✅ Project is already up to date")
|
|
84
|
+
return True
|
|
85
|
+
|
|
86
|
+
if dry_run:
|
|
87
|
+
logger.info("🔍 DRY RUN MODE - No changes will be made")
|
|
88
|
+
self._show_migration_plan()
|
|
89
|
+
return True
|
|
90
|
+
|
|
91
|
+
logger.info("🚀 Starting migration to v0.24.0...")
|
|
92
|
+
|
|
93
|
+
try:
|
|
94
|
+
# Step 1: Create backup
|
|
95
|
+
logger.info("\n💾 Step 1: Creating backup...")
|
|
96
|
+
backup_path = self.backup_manager.create_backup("pre_v024_migration")
|
|
97
|
+
logger.info(f"✅ Backup created: {backup_path}")
|
|
98
|
+
|
|
99
|
+
# Step 2: Get migration plan
|
|
100
|
+
logger.info("\n📋 Step 2: Analyzing migration requirements...")
|
|
101
|
+
plan = self.detector.get_migration_plan()
|
|
102
|
+
logger.info(f" - {len(plan['create'])} directories to create")
|
|
103
|
+
logger.info(f" - {len(plan['move'])} files to move")
|
|
104
|
+
|
|
105
|
+
# Step 3: Execute migration
|
|
106
|
+
logger.info("\n🔄 Step 3: Executing migration...")
|
|
107
|
+
results = self.file_migrator.execute_migration_plan(plan)
|
|
108
|
+
|
|
109
|
+
if not results["success"]:
|
|
110
|
+
logger.error("❌ Migration failed with errors:")
|
|
111
|
+
for error in results["errors"]:
|
|
112
|
+
logger.error(f" - {error}")
|
|
113
|
+
logger.info(f"\n🔙 Rolling back using backup: {backup_path}")
|
|
114
|
+
self.backup_manager.restore_backup(backup_path)
|
|
115
|
+
return False
|
|
116
|
+
|
|
117
|
+
logger.info("✅ Migration completed successfully!")
|
|
118
|
+
logger.info(f" - {results['created_dirs']} directories created")
|
|
119
|
+
logger.info(f" - {results['moved_files']} files moved")
|
|
120
|
+
|
|
121
|
+
# Step 4: Verify migration
|
|
122
|
+
logger.info("\n🔍 Step 4: Verifying migration...")
|
|
123
|
+
if self._verify_migration():
|
|
124
|
+
logger.info("✅ Verification passed")
|
|
125
|
+
|
|
126
|
+
# Step 5: Cleanup (optional)
|
|
127
|
+
if cleanup:
|
|
128
|
+
logger.info("\n🗑️ Step 5: Cleaning up old files...")
|
|
129
|
+
cleaned = self.file_migrator.cleanup_old_files(plan["cleanup"])
|
|
130
|
+
logger.info(f"✅ Cleaned up {cleaned} old files")
|
|
131
|
+
else:
|
|
132
|
+
logger.info("\n⏭️ Step 5: Skipped cleanup (old files preserved)")
|
|
133
|
+
|
|
134
|
+
logger.info("\n✨ Migration to v0.24.0 completed successfully!")
|
|
135
|
+
return True
|
|
136
|
+
else:
|
|
137
|
+
logger.error("❌ Verification failed")
|
|
138
|
+
logger.info(f"🔙 Rolling back using backup: {backup_path}")
|
|
139
|
+
self.backup_manager.restore_backup(backup_path)
|
|
140
|
+
return False
|
|
141
|
+
|
|
142
|
+
except Exception as e:
|
|
143
|
+
logger.error(f"❌ Migration failed with exception: {e}")
|
|
144
|
+
logger.info("🔙 Attempting rollback...")
|
|
145
|
+
try:
|
|
146
|
+
latest_backup = self.backup_manager.get_latest_backup()
|
|
147
|
+
if latest_backup:
|
|
148
|
+
self.backup_manager.restore_backup(latest_backup)
|
|
149
|
+
logger.info("✅ Rollback completed")
|
|
150
|
+
except Exception as rollback_error:
|
|
151
|
+
logger.error(f"❌ Rollback failed: {rollback_error}")
|
|
152
|
+
return False
|
|
153
|
+
|
|
154
|
+
def _show_migration_plan(self) -> None:
|
|
155
|
+
"""Display migration plan without executing"""
|
|
156
|
+
plan = self.detector.get_migration_plan()
|
|
157
|
+
|
|
158
|
+
print("\n📋 Migration Plan:")
|
|
159
|
+
print("\n📁 Directories to create:")
|
|
160
|
+
for directory in plan.get("create", []):
|
|
161
|
+
print(f" + {directory}")
|
|
162
|
+
|
|
163
|
+
print("\n📄 Files to move:")
|
|
164
|
+
for move_op in plan.get("move", []):
|
|
165
|
+
print(f" • {move_op['description']}")
|
|
166
|
+
print(f" {move_op['from']} → {move_op['to']}")
|
|
167
|
+
|
|
168
|
+
print("\n🗑️ Files to cleanup after migration:")
|
|
169
|
+
for cleanup_file in plan.get("cleanup", []):
|
|
170
|
+
print(f" - {cleanup_file}")
|
|
171
|
+
|
|
172
|
+
def _verify_migration(self) -> bool:
|
|
173
|
+
"""
|
|
174
|
+
Verify migration was successful
|
|
175
|
+
|
|
176
|
+
Returns:
|
|
177
|
+
True if verification passed
|
|
178
|
+
"""
|
|
179
|
+
# Check that new config exists
|
|
180
|
+
new_config = self.project_root / ".moai" / "config" / "config.json"
|
|
181
|
+
if not new_config.exists():
|
|
182
|
+
logger.error("Verification failed: new config.json not found")
|
|
183
|
+
return False
|
|
184
|
+
|
|
185
|
+
# Check that new config directory exists
|
|
186
|
+
config_dir = self.project_root / ".moai" / "config"
|
|
187
|
+
if not config_dir.is_dir():
|
|
188
|
+
logger.error("Verification failed: config directory not found")
|
|
189
|
+
return False
|
|
190
|
+
|
|
191
|
+
logger.debug("All verification checks passed")
|
|
192
|
+
return True
|
|
193
|
+
|
|
194
|
+
def check_status(self) -> Dict[str, Any]:
|
|
195
|
+
"""
|
|
196
|
+
Check migration status and return detailed information
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
Dictionary with status information
|
|
200
|
+
"""
|
|
201
|
+
version_info = self.detector.get_version_info()
|
|
202
|
+
migration_info = self.get_migration_info()
|
|
203
|
+
backups = self.backup_manager.list_backups()
|
|
204
|
+
|
|
205
|
+
return {
|
|
206
|
+
"version": version_info,
|
|
207
|
+
"migration": migration_info,
|
|
208
|
+
"backups": {
|
|
209
|
+
"count": len(backups),
|
|
210
|
+
"latest": backups[0] if backups else None,
|
|
211
|
+
},
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
def rollback_to_latest_backup(self) -> bool:
|
|
215
|
+
"""
|
|
216
|
+
Rollback to the most recent backup
|
|
217
|
+
|
|
218
|
+
Returns:
|
|
219
|
+
True if rollback was successful
|
|
220
|
+
"""
|
|
221
|
+
latest_backup = self.backup_manager.get_latest_backup()
|
|
222
|
+
|
|
223
|
+
if not latest_backup:
|
|
224
|
+
logger.error("No backup found to rollback to")
|
|
225
|
+
return False
|
|
226
|
+
|
|
227
|
+
logger.info(f"🔙 Rolling back to backup: {latest_backup}")
|
|
228
|
+
return self.backup_manager.restore_backup(latest_backup)
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Cache System
|
|
3
|
+
|
|
4
|
+
Provides persistent caching capabilities with TTL support for improved performance.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
import os
|
|
9
|
+
import time
|
|
10
|
+
from typing import Any, Dict, List, Optional
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class CacheSystem:
|
|
14
|
+
"""
|
|
15
|
+
A persistent cache system with TTL support.
|
|
16
|
+
|
|
17
|
+
This class provides file-based caching with support for time-to-live,
|
|
18
|
+
multiple operations, persistence across instances, and thread safety.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(self, cache_dir: Optional[str] = None, auto_cleanup: bool = True):
|
|
22
|
+
"""
|
|
23
|
+
Initialize the cache system.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
cache_dir: Directory to store cache files. If None, uses default temp directory.
|
|
27
|
+
auto_cleanup: Whether to automatically clean up expired files on operations
|
|
28
|
+
"""
|
|
29
|
+
self.auto_cleanup = auto_cleanup
|
|
30
|
+
|
|
31
|
+
if cache_dir is None:
|
|
32
|
+
import tempfile
|
|
33
|
+
|
|
34
|
+
self.cache_dir = os.path.join(tempfile.gettempdir(), "moai_adk_cache")
|
|
35
|
+
else:
|
|
36
|
+
self.cache_dir = cache_dir
|
|
37
|
+
|
|
38
|
+
# Cache file extension
|
|
39
|
+
self.file_extension = ".cache"
|
|
40
|
+
|
|
41
|
+
# Create cache directory if it doesn't exist
|
|
42
|
+
self._ensure_cache_dir()
|
|
43
|
+
|
|
44
|
+
def _ensure_cache_dir(self) -> None:
|
|
45
|
+
"""Ensure cache directory exists."""
|
|
46
|
+
try:
|
|
47
|
+
os.makedirs(self.cache_dir, exist_ok=True)
|
|
48
|
+
except OSError as e:
|
|
49
|
+
raise OSError(f"Failed to create cache directory {self.cache_dir}: {e}")
|
|
50
|
+
|
|
51
|
+
def _validate_key(self, key: str) -> str:
|
|
52
|
+
"""
|
|
53
|
+
Validate and sanitize cache key.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
key: Raw cache key
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
Sanitized key suitable for filename
|
|
60
|
+
"""
|
|
61
|
+
if not isinstance(key, str):
|
|
62
|
+
raise TypeError("Cache key must be a string")
|
|
63
|
+
|
|
64
|
+
if not key or key.isspace():
|
|
65
|
+
raise ValueError("Cache key cannot be empty")
|
|
66
|
+
|
|
67
|
+
# Sanitize key for safe filename usage
|
|
68
|
+
safe_key = key.replace("/", "_").replace("\\", "_")
|
|
69
|
+
if safe_key != key:
|
|
70
|
+
return safe_key
|
|
71
|
+
|
|
72
|
+
return key
|
|
73
|
+
|
|
74
|
+
def _get_file_path(self, key: str) -> str:
|
|
75
|
+
"""Get file path for a given cache key."""
|
|
76
|
+
safe_key = self._validate_key(key)
|
|
77
|
+
return os.path.join(self.cache_dir, f"{safe_key}{self.file_extension}")
|
|
78
|
+
|
|
79
|
+
def _is_expired(self, data: Dict[str, Any]) -> bool:
|
|
80
|
+
"""Check if cache data is expired."""
|
|
81
|
+
if "expires_at" not in data:
|
|
82
|
+
return False
|
|
83
|
+
|
|
84
|
+
return time.time() > data["expires_at"]
|
|
85
|
+
|
|
86
|
+
def _cleanup_expired_files(self) -> None:
|
|
87
|
+
"""Remove expired cache files."""
|
|
88
|
+
time.time()
|
|
89
|
+
for file_name in os.listdir(self.cache_dir):
|
|
90
|
+
if file_name.endswith(self.file_extension):
|
|
91
|
+
file_path = os.path.join(self.cache_dir, file_name)
|
|
92
|
+
try:
|
|
93
|
+
with open(file_path, "r", encoding="utf-8") as f:
|
|
94
|
+
data = json.load(f)
|
|
95
|
+
|
|
96
|
+
if self._is_expired(data):
|
|
97
|
+
os.remove(file_path)
|
|
98
|
+
except (json.JSONDecodeError, KeyError, OSError):
|
|
99
|
+
# Remove corrupted files too
|
|
100
|
+
try:
|
|
101
|
+
os.remove(file_path)
|
|
102
|
+
except OSError:
|
|
103
|
+
pass
|
|
104
|
+
|
|
105
|
+
def _write_data(self, file_path: str, data: Dict[str, Any]) -> None:
|
|
106
|
+
"""Write data to file with error handling."""
|
|
107
|
+
try:
|
|
108
|
+
with open(file_path, "w", encoding="utf-8") as f:
|
|
109
|
+
json.dump(data, f, indent=2, ensure_ascii=False)
|
|
110
|
+
except (OSError, TypeError) as e:
|
|
111
|
+
raise OSError(f"Failed to write cache file {file_path}: {e}")
|
|
112
|
+
|
|
113
|
+
def _read_data(self, file_path: str) -> Optional[Dict[str, Any]]:
|
|
114
|
+
"""Read data from file with error handling."""
|
|
115
|
+
if not os.path.exists(file_path):
|
|
116
|
+
return None
|
|
117
|
+
|
|
118
|
+
try:
|
|
119
|
+
with open(file_path, "r", encoding="utf-8") as f:
|
|
120
|
+
return json.load(f)
|
|
121
|
+
except (json.JSONDecodeError, OSError):
|
|
122
|
+
# File is corrupted, remove it
|
|
123
|
+
try:
|
|
124
|
+
os.remove(file_path)
|
|
125
|
+
except OSError:
|
|
126
|
+
pass
|
|
127
|
+
return None
|
|
128
|
+
|
|
129
|
+
def set(self, key: str, value: Any, ttl: Optional[float] = None) -> None:
|
|
130
|
+
"""
|
|
131
|
+
Set a value in the cache.
|
|
132
|
+
|
|
133
|
+
Args:
|
|
134
|
+
key: Cache key
|
|
135
|
+
value: Value to cache (must be JSON serializable)
|
|
136
|
+
ttl: Time to live in seconds (optional)
|
|
137
|
+
|
|
138
|
+
Raises:
|
|
139
|
+
TypeError: If value is not JSON serializable
|
|
140
|
+
OSError: If file operations fail
|
|
141
|
+
"""
|
|
142
|
+
# Validate JSON serializability
|
|
143
|
+
try:
|
|
144
|
+
json.dumps(value)
|
|
145
|
+
except (TypeError, ValueError) as e:
|
|
146
|
+
raise TypeError(f"Cache value must be JSON serializable: {e}")
|
|
147
|
+
|
|
148
|
+
data = {"value": value, "created_at": time.time()}
|
|
149
|
+
|
|
150
|
+
if ttl is not None:
|
|
151
|
+
if not isinstance(ttl, (int, float)) or ttl < 0:
|
|
152
|
+
raise ValueError("TTL must be a positive number")
|
|
153
|
+
data["expires_at"] = data["created_at"] + ttl
|
|
154
|
+
|
|
155
|
+
file_path = self._get_file_path(key)
|
|
156
|
+
self._write_data(file_path, data)
|
|
157
|
+
|
|
158
|
+
# Auto-cleanup if enabled
|
|
159
|
+
if self.auto_cleanup:
|
|
160
|
+
self._cleanup_expired_files()
|
|
161
|
+
|
|
162
|
+
def get(self, key: str) -> Optional[Any]:
|
|
163
|
+
"""
|
|
164
|
+
Get a value from the cache.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
key: Cache key
|
|
168
|
+
|
|
169
|
+
Returns:
|
|
170
|
+
Cached value or None if not found or expired
|
|
171
|
+
"""
|
|
172
|
+
file_path = self._get_file_path(key)
|
|
173
|
+
data = self._read_data(file_path)
|
|
174
|
+
|
|
175
|
+
if data is None:
|
|
176
|
+
return None
|
|
177
|
+
|
|
178
|
+
# Check expiration
|
|
179
|
+
if self._is_expired(data):
|
|
180
|
+
try:
|
|
181
|
+
os.remove(file_path)
|
|
182
|
+
except OSError:
|
|
183
|
+
pass
|
|
184
|
+
return None
|
|
185
|
+
|
|
186
|
+
return data["value"]
|
|
187
|
+
|
|
188
|
+
def delete(self, key: str) -> bool:
|
|
189
|
+
"""
|
|
190
|
+
Delete a value from the cache.
|
|
191
|
+
|
|
192
|
+
Args:
|
|
193
|
+
key: Cache key
|
|
194
|
+
|
|
195
|
+
Returns:
|
|
196
|
+
True if file was deleted, False if it didn't exist
|
|
197
|
+
"""
|
|
198
|
+
file_path = self._get_file_path(key)
|
|
199
|
+
try:
|
|
200
|
+
os.remove(file_path)
|
|
201
|
+
return True
|
|
202
|
+
except OSError:
|
|
203
|
+
return False
|
|
204
|
+
|
|
205
|
+
def clear(self) -> int:
|
|
206
|
+
"""
|
|
207
|
+
Clear all values from the cache.
|
|
208
|
+
|
|
209
|
+
Returns:
|
|
210
|
+
Number of files removed
|
|
211
|
+
"""
|
|
212
|
+
count = 0
|
|
213
|
+
for file_name in os.listdir(self.cache_dir):
|
|
214
|
+
if file_name.endswith(self.file_extension):
|
|
215
|
+
file_path = os.path.join(self.cache_dir, file_name)
|
|
216
|
+
try:
|
|
217
|
+
os.remove(file_path)
|
|
218
|
+
count += 1
|
|
219
|
+
except OSError:
|
|
220
|
+
continue
|
|
221
|
+
return count
|
|
222
|
+
|
|
223
|
+
def exists(self, key: str) -> bool:
|
|
224
|
+
"""
|
|
225
|
+
Check if a key exists in the cache.
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
key: Cache key
|
|
229
|
+
|
|
230
|
+
Returns:
|
|
231
|
+
True if key exists and is not expired, False otherwise
|
|
232
|
+
"""
|
|
233
|
+
return self.get(key) is not None
|
|
234
|
+
|
|
235
|
+
def size(self) -> int:
|
|
236
|
+
"""
|
|
237
|
+
Get the number of items in the cache.
|
|
238
|
+
|
|
239
|
+
Returns:
|
|
240
|
+
Number of non-expired cache items
|
|
241
|
+
"""
|
|
242
|
+
count = 0
|
|
243
|
+
for file_name in os.listdir(self.cache_dir):
|
|
244
|
+
if file_name.endswith(self.file_extension):
|
|
245
|
+
os.path.join(self.cache_dir, file_name)
|
|
246
|
+
key = file_name[: -len(self.file_extension)] # Remove extension
|
|
247
|
+
|
|
248
|
+
if self.exists(key):
|
|
249
|
+
count += 1
|
|
250
|
+
return count
|
|
251
|
+
|
|
252
|
+
def set_if_not_exists(self, key: str, value: Any, ttl: Optional[float] = None) -> bool:
|
|
253
|
+
"""
|
|
254
|
+
Set a value only if the key doesn't exist.
|
|
255
|
+
|
|
256
|
+
Args:
|
|
257
|
+
key: Cache key
|
|
258
|
+
value: Value to cache
|
|
259
|
+
ttl: Time to live in seconds (optional)
|
|
260
|
+
|
|
261
|
+
Returns:
|
|
262
|
+
True if value was set, False if key already existed
|
|
263
|
+
"""
|
|
264
|
+
if self.exists(key):
|
|
265
|
+
return False
|
|
266
|
+
|
|
267
|
+
self.set(key, value, ttl)
|
|
268
|
+
return True
|
|
269
|
+
|
|
270
|
+
def get_multiple(self, keys: List[str]) -> Dict[str, Optional[Any]]:
|
|
271
|
+
"""
|
|
272
|
+
Get multiple values from the cache.
|
|
273
|
+
|
|
274
|
+
Args:
|
|
275
|
+
keys: List of cache keys
|
|
276
|
+
|
|
277
|
+
Returns:
|
|
278
|
+
Dictionary mapping keys to values (or None)
|
|
279
|
+
"""
|
|
280
|
+
if not isinstance(keys, list):
|
|
281
|
+
raise TypeError("keys must be a list")
|
|
282
|
+
|
|
283
|
+
result = {}
|
|
284
|
+
for key in keys:
|
|
285
|
+
if not isinstance(key, str):
|
|
286
|
+
raise TypeError("All keys must be strings")
|
|
287
|
+
result[key] = self.get(key)
|
|
288
|
+
return result
|
|
289
|
+
|
|
290
|
+
def get_stats(self) -> Dict[str, Any]:
|
|
291
|
+
"""
|
|
292
|
+
Get cache statistics.
|
|
293
|
+
|
|
294
|
+
Returns:
|
|
295
|
+
Dictionary with cache statistics
|
|
296
|
+
"""
|
|
297
|
+
total_files = 0
|
|
298
|
+
expired_files = 0
|
|
299
|
+
time.time()
|
|
300
|
+
|
|
301
|
+
for file_name in os.listdir(self.cache_dir):
|
|
302
|
+
if file_name.endswith(self.file_extension):
|
|
303
|
+
total_files += 1
|
|
304
|
+
file_path = os.path.join(self.cache_dir, file_name)
|
|
305
|
+
data = self._read_data(file_path)
|
|
306
|
+
|
|
307
|
+
if data and self._is_expired(data):
|
|
308
|
+
expired_files += 1
|
|
309
|
+
|
|
310
|
+
return {
|
|
311
|
+
"total_files": total_files,
|
|
312
|
+
"expired_files": expired_files,
|
|
313
|
+
"valid_files": total_files - expired_files,
|
|
314
|
+
"cache_directory": self.cache_dir,
|
|
315
|
+
"auto_cleanup_enabled": self.auto_cleanup,
|
|
316
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Parallel Processing Core
|
|
3
|
+
|
|
4
|
+
Provides efficient parallel processing capabilities for concurrent task execution.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import asyncio
|
|
8
|
+
from typing import Any, Callable, Coroutine, Dict, List, Optional, Union
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ParallelProcessor:
|
|
12
|
+
"""
|
|
13
|
+
A parallel processor for executing tasks concurrently with configurable limits.
|
|
14
|
+
|
|
15
|
+
This class provides a high-level interface for running multiple async tasks
|
|
16
|
+
in parallel with optional progress tracking and error handling.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
def __init__(self, max_workers: Optional[int] = None):
|
|
20
|
+
"""
|
|
21
|
+
Initialize the parallel processor.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
max_workers: Maximum number of concurrent tasks. If None, defaults to CPU count.
|
|
25
|
+
"""
|
|
26
|
+
self.max_workers = max_workers
|
|
27
|
+
|
|
28
|
+
async def process_tasks(
|
|
29
|
+
self,
|
|
30
|
+
tasks: List[Callable],
|
|
31
|
+
progress_callback: Optional[Callable[[int, int], None]] = None,
|
|
32
|
+
) -> List[Dict[str, Any]]:
|
|
33
|
+
"""
|
|
34
|
+
Process multiple tasks concurrently.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
tasks: List of async task functions or coroutines to execute
|
|
38
|
+
progress_callback: Optional callback for progress updates (completed, total)
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
List of results from all completed tasks in the same order as input
|
|
42
|
+
|
|
43
|
+
Raises:
|
|
44
|
+
Exception: If any task raises an exception
|
|
45
|
+
"""
|
|
46
|
+
if not tasks:
|
|
47
|
+
return []
|
|
48
|
+
|
|
49
|
+
results = []
|
|
50
|
+
completed_count = 0
|
|
51
|
+
|
|
52
|
+
# Validate input
|
|
53
|
+
self._validate_tasks(tasks)
|
|
54
|
+
|
|
55
|
+
# Initialize progress tracking
|
|
56
|
+
self._update_progress(progress_callback, completed_count, len(tasks))
|
|
57
|
+
|
|
58
|
+
# Process tasks concurrently
|
|
59
|
+
for task in tasks:
|
|
60
|
+
try:
|
|
61
|
+
# Get coroutine from task
|
|
62
|
+
coroutine = self._get_coroutine(task)
|
|
63
|
+
|
|
64
|
+
# Execute the task and get result
|
|
65
|
+
result = await coroutine
|
|
66
|
+
results.append(result)
|
|
67
|
+
completed_count += 1
|
|
68
|
+
|
|
69
|
+
# Update progress
|
|
70
|
+
self._update_progress(progress_callback, completed_count, len(tasks))
|
|
71
|
+
|
|
72
|
+
except Exception as e:
|
|
73
|
+
# Add context to the exception
|
|
74
|
+
raise type(e)(f"Task failed: {str(e)}") from e
|
|
75
|
+
|
|
76
|
+
return results
|
|
77
|
+
|
|
78
|
+
def _validate_tasks(self, tasks: List[Callable]) -> None:
|
|
79
|
+
"""Validate that all tasks are callable or coroutines."""
|
|
80
|
+
if not isinstance(tasks, list):
|
|
81
|
+
raise TypeError("tasks must be a list")
|
|
82
|
+
|
|
83
|
+
for i, task in enumerate(tasks):
|
|
84
|
+
if not callable(task) and not asyncio.iscoroutine(task):
|
|
85
|
+
raise TypeError(f"Task at index {i} is not callable or a coroutine")
|
|
86
|
+
|
|
87
|
+
def _get_coroutine(self, task: Union[Callable, Coroutine]) -> Coroutine:
|
|
88
|
+
"""Extract coroutine from task function or return coroutine directly."""
|
|
89
|
+
if asyncio.iscoroutine(task):
|
|
90
|
+
return task
|
|
91
|
+
|
|
92
|
+
if callable(task):
|
|
93
|
+
try:
|
|
94
|
+
result = task()
|
|
95
|
+
if asyncio.iscoroutine(result):
|
|
96
|
+
return result
|
|
97
|
+
else:
|
|
98
|
+
raise TypeError("Task function must return a coroutine")
|
|
99
|
+
except Exception as e:
|
|
100
|
+
raise TypeError(f"Failed to execute task function: {str(e)}")
|
|
101
|
+
|
|
102
|
+
raise TypeError(f"Task must be callable or a coroutine, got {type(task)}")
|
|
103
|
+
|
|
104
|
+
def _update_progress(
|
|
105
|
+
self,
|
|
106
|
+
progress_callback: Optional[Callable[[int, int], None]],
|
|
107
|
+
completed: int,
|
|
108
|
+
total: int,
|
|
109
|
+
) -> None:
|
|
110
|
+
"""Update progress callback if provided."""
|
|
111
|
+
if progress_callback is not None:
|
|
112
|
+
try:
|
|
113
|
+
progress_callback(completed, total)
|
|
114
|
+
except Exception as e:
|
|
115
|
+
# Log progress callback error but don't fail the entire process
|
|
116
|
+
print(f"Warning: Progress callback failed: {str(e)}")
|