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,741 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Enhanced Version reader for MoAI-ADK from config.yaml with performance optimizations
|
|
3
|
+
|
|
4
|
+
Refactored for improved performance, error handling, configurability, and caching strategies
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import asyncio
|
|
8
|
+
import json
|
|
9
|
+
import logging
|
|
10
|
+
import os
|
|
11
|
+
import re
|
|
12
|
+
import time
|
|
13
|
+
from dataclasses import dataclass, field
|
|
14
|
+
from datetime import datetime, timedelta
|
|
15
|
+
from enum import Enum
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from typing import Any, Dict, List, Optional
|
|
18
|
+
|
|
19
|
+
import yaml
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class VersionSource(Enum):
|
|
25
|
+
"""Enum for version source tracking"""
|
|
26
|
+
|
|
27
|
+
CONFIG_FILE = "config_file"
|
|
28
|
+
FALLBACK = "fallback"
|
|
29
|
+
PACKAGE = "package"
|
|
30
|
+
CACHE = "cache"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@dataclass
|
|
34
|
+
class CacheEntry:
|
|
35
|
+
"""Cache entry with metadata"""
|
|
36
|
+
|
|
37
|
+
version: str
|
|
38
|
+
timestamp: datetime
|
|
39
|
+
source: VersionSource
|
|
40
|
+
access_count: int = 0
|
|
41
|
+
last_access: datetime = field(default_factory=datetime.now)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@dataclass
|
|
45
|
+
class VersionConfig:
|
|
46
|
+
"""Configuration for version reading behavior with enhanced options"""
|
|
47
|
+
|
|
48
|
+
# Cache configuration
|
|
49
|
+
cache_ttl_seconds: int = 60
|
|
50
|
+
cache_enabled: bool = True
|
|
51
|
+
cache_size: int = 50 # Maximum number of cached entries
|
|
52
|
+
enable_lru_cache: bool = True # Enable least recently used cache eviction
|
|
53
|
+
|
|
54
|
+
# Fallback configuration
|
|
55
|
+
fallback_version: str = "unknown"
|
|
56
|
+
fallback_source: VersionSource = VersionSource.FALLBACK
|
|
57
|
+
|
|
58
|
+
# Validation configuration
|
|
59
|
+
version_format_regex: str = r"^v?(\d+\.\d+\.\d+(-[a-zA-Z0-9]+)?)$"
|
|
60
|
+
enable_validation: bool = True
|
|
61
|
+
strict_validation: bool = False
|
|
62
|
+
|
|
63
|
+
# Performance configuration
|
|
64
|
+
enable_async: bool = True
|
|
65
|
+
enable_batch_reading: bool = True
|
|
66
|
+
batch_size: int = 10
|
|
67
|
+
timeout_seconds: int = 5
|
|
68
|
+
|
|
69
|
+
# Debug configuration
|
|
70
|
+
debug_mode: bool = False
|
|
71
|
+
enable_detailed_logging: bool = False
|
|
72
|
+
track_performance_metrics: bool = True
|
|
73
|
+
|
|
74
|
+
# Version field priority configuration
|
|
75
|
+
# Order: 1) MoAI package version, 2) Project version, 3) Fallbacks
|
|
76
|
+
version_fields: List[str] = field(
|
|
77
|
+
default_factory=lambda: [
|
|
78
|
+
"moai.version", # ← 1st priority: MoAI-ADK version
|
|
79
|
+
"project.version", # ← 2nd priority: Project version
|
|
80
|
+
"version", # ← 3rd priority: General version
|
|
81
|
+
"project.template_version", # ← 4th priority: Template version
|
|
82
|
+
"template_version",
|
|
83
|
+
]
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class VersionReader:
|
|
88
|
+
"""
|
|
89
|
+
Enhanced version reader for MoAI-ADK with advanced caching,
|
|
90
|
+
performance optimization, and comprehensive error handling.
|
|
91
|
+
|
|
92
|
+
Features:
|
|
93
|
+
- Multi-level caching with LRU eviction strategy
|
|
94
|
+
- Configurable version field priority
|
|
95
|
+
- Async batch processing for better performance
|
|
96
|
+
- Comprehensive error handling and recovery
|
|
97
|
+
- Version format validation with customizable patterns
|
|
98
|
+
- Performance metrics tracking
|
|
99
|
+
- Graceful degradation strategies
|
|
100
|
+
- Source tracking for debugging
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
# Default configuration
|
|
104
|
+
DEFAULT_CONFIG = VersionConfig()
|
|
105
|
+
|
|
106
|
+
# Supported version fields in order of priority
|
|
107
|
+
# Order: 1) MoAI package version, 2) Project version, 3) Fallbacks
|
|
108
|
+
DEFAULT_VERSION_FIELDS = [
|
|
109
|
+
"moai.version", # ← 1st priority: MoAI-ADK version
|
|
110
|
+
"project.version", # ← 2nd priority: Project version
|
|
111
|
+
"version", # ← 3rd priority: General version
|
|
112
|
+
"project.template_version", # ← 4th priority: Template version
|
|
113
|
+
"template_version",
|
|
114
|
+
]
|
|
115
|
+
|
|
116
|
+
def __init__(self, config: Optional[VersionConfig] = None, working_dir: Optional[Path] = None):
|
|
117
|
+
"""
|
|
118
|
+
Initialize version reader with enhanced configuration.
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
config: Version configuration object. If None, uses defaults.
|
|
122
|
+
working_dir: Working directory to search for config. If None, uses environment detection.
|
|
123
|
+
"""
|
|
124
|
+
self.config = config or self.DEFAULT_CONFIG
|
|
125
|
+
|
|
126
|
+
# Determine working directory with priority:
|
|
127
|
+
# 1. Explicit working_dir parameter
|
|
128
|
+
# 2. CLAUDE_PROJECT_DIR environment variable (set by Claude Code)
|
|
129
|
+
# 3. Current working directory
|
|
130
|
+
if working_dir:
|
|
131
|
+
base_dir = Path(working_dir)
|
|
132
|
+
elif "CLAUDE_PROJECT_DIR" in os.environ:
|
|
133
|
+
base_dir = Path(os.environ["CLAUDE_PROJECT_DIR"])
|
|
134
|
+
else:
|
|
135
|
+
base_dir = Path.cwd()
|
|
136
|
+
|
|
137
|
+
self._config_path = base_dir / ".moai" / "config" / "config.yaml"
|
|
138
|
+
|
|
139
|
+
# Enhanced caching with LRU support
|
|
140
|
+
self._cache: Dict[str, CacheEntry] = {}
|
|
141
|
+
self._cache_stats: Dict[str, Any] = {
|
|
142
|
+
"hits": 0,
|
|
143
|
+
"misses": 0,
|
|
144
|
+
"errors": 0,
|
|
145
|
+
"cache_hits_by_source": {
|
|
146
|
+
VersionSource.CONFIG_FILE.value: 0,
|
|
147
|
+
VersionSource.CACHE.value: 0,
|
|
148
|
+
VersionSource.FALLBACK.value: 0,
|
|
149
|
+
},
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
# Performance tracking
|
|
153
|
+
self._performance_metrics: Dict[str, List[float]] = {
|
|
154
|
+
"read_times": [],
|
|
155
|
+
"validation_times": [],
|
|
156
|
+
"cache_operation_times": [],
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
# Version field configuration (backwards compatibility)
|
|
160
|
+
self._version_fields = self.config.version_fields.copy()
|
|
161
|
+
self.VERSION_FIELDS = self._version_fields.copy()
|
|
162
|
+
|
|
163
|
+
# Pre-compile regex for performance
|
|
164
|
+
try:
|
|
165
|
+
self._version_pattern = re.compile(self.config.version_format_regex)
|
|
166
|
+
except re.error:
|
|
167
|
+
self._version_pattern = re.compile(self.DEFAULT_CONFIG.version_format_regex)
|
|
168
|
+
|
|
169
|
+
# Logging
|
|
170
|
+
self._logger = logging.getLogger(__name__)
|
|
171
|
+
|
|
172
|
+
# Backwards compatibility cache attributes
|
|
173
|
+
self._version_cache: Optional[str] = None
|
|
174
|
+
self._cache_time: Optional[datetime] = None
|
|
175
|
+
self._cache_ttl = timedelta(seconds=self.config.cache_ttl_seconds)
|
|
176
|
+
|
|
177
|
+
if self.config.debug_mode:
|
|
178
|
+
self._logger.info(f"VersionReader initialized with config: {self.config}")
|
|
179
|
+
|
|
180
|
+
def get_version(self, force_refresh: bool = False) -> str:
|
|
181
|
+
"""
|
|
182
|
+
Get MoAI-ADK version from config with enhanced caching.
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
force_refresh: If True, bypass cache and force fresh read
|
|
186
|
+
|
|
187
|
+
Returns:
|
|
188
|
+
Version string (e.g., "0.20.1" or "v0.20.1")
|
|
189
|
+
|
|
190
|
+
Raises:
|
|
191
|
+
VersionReadError: If version cannot be determined after fallbacks
|
|
192
|
+
"""
|
|
193
|
+
# Check if we need to force refresh
|
|
194
|
+
if force_refresh:
|
|
195
|
+
self.clear_cache()
|
|
196
|
+
|
|
197
|
+
if self.config.enable_async:
|
|
198
|
+
return asyncio.run(self.get_version_async())
|
|
199
|
+
else:
|
|
200
|
+
return self.get_version_sync()
|
|
201
|
+
|
|
202
|
+
def get_version_sync(self) -> str:
|
|
203
|
+
"""
|
|
204
|
+
Synchronous version getter for performance-critical paths.
|
|
205
|
+
|
|
206
|
+
Priority: installed package version > config file version > fallback
|
|
207
|
+
|
|
208
|
+
Returns:
|
|
209
|
+
Version string
|
|
210
|
+
"""
|
|
211
|
+
start_time = time.time()
|
|
212
|
+
|
|
213
|
+
try:
|
|
214
|
+
# Check cache first
|
|
215
|
+
version = self._check_cache()
|
|
216
|
+
if version is not None:
|
|
217
|
+
self._cache_stats["hits"] += 1
|
|
218
|
+
self._cache_stats["cache_hits_by_source"][VersionSource.CACHE.value] += 1
|
|
219
|
+
return version
|
|
220
|
+
|
|
221
|
+
# Priority 1: Try installed package version first (most accurate)
|
|
222
|
+
version = self._get_package_version()
|
|
223
|
+
if version:
|
|
224
|
+
self._update_cache(version, VersionSource.CONFIG_FILE)
|
|
225
|
+
self._cache_stats["misses"] += 1
|
|
226
|
+
return version
|
|
227
|
+
|
|
228
|
+
# Priority 2: Read from config file
|
|
229
|
+
version = self._read_version_from_config_sync()
|
|
230
|
+
if not version:
|
|
231
|
+
version = self._get_fallback_version()
|
|
232
|
+
self._update_cache(version, VersionSource.CONFIG_FILE)
|
|
233
|
+
self._cache_stats["misses"] += 1
|
|
234
|
+
return version
|
|
235
|
+
|
|
236
|
+
except Exception as e:
|
|
237
|
+
self._handle_read_error(e, start_time)
|
|
238
|
+
return self._get_fallback_version()
|
|
239
|
+
|
|
240
|
+
finally:
|
|
241
|
+
self._log_performance(start_time, "sync_read")
|
|
242
|
+
|
|
243
|
+
async def get_version_async(self) -> str:
|
|
244
|
+
"""
|
|
245
|
+
Async version getter for better performance.
|
|
246
|
+
|
|
247
|
+
Priority: installed package version > config file version > fallback
|
|
248
|
+
|
|
249
|
+
Returns:
|
|
250
|
+
Version string
|
|
251
|
+
"""
|
|
252
|
+
start_time = time.time()
|
|
253
|
+
|
|
254
|
+
try:
|
|
255
|
+
# Check cache first
|
|
256
|
+
version = self._check_cache()
|
|
257
|
+
if version is not None:
|
|
258
|
+
self._cache_stats["hits"] += 1
|
|
259
|
+
self._cache_stats["cache_hits_by_source"][VersionSource.CACHE.value] += 1
|
|
260
|
+
return version
|
|
261
|
+
|
|
262
|
+
# Priority 1: Try installed package version first (most accurate)
|
|
263
|
+
version = self._get_package_version()
|
|
264
|
+
if version:
|
|
265
|
+
self._update_cache(version, VersionSource.CONFIG_FILE)
|
|
266
|
+
self._cache_stats["misses"] += 1
|
|
267
|
+
return version
|
|
268
|
+
|
|
269
|
+
# Priority 2: Read from config file asynchronously
|
|
270
|
+
version = await self._read_version_from_config_async()
|
|
271
|
+
if not version:
|
|
272
|
+
version = self._get_fallback_version()
|
|
273
|
+
self._update_cache(version, VersionSource.CONFIG_FILE)
|
|
274
|
+
self._cache_stats["misses"] += 1
|
|
275
|
+
return version
|
|
276
|
+
|
|
277
|
+
except Exception as e:
|
|
278
|
+
self._handle_read_error(e, start_time)
|
|
279
|
+
return self._get_fallback_version()
|
|
280
|
+
|
|
281
|
+
finally:
|
|
282
|
+
self._log_performance(start_time, "async_read")
|
|
283
|
+
|
|
284
|
+
# Enhanced internal methods
|
|
285
|
+
def _check_cache(self) -> Optional[str]:
|
|
286
|
+
"""
|
|
287
|
+
Check cache for valid version entry.
|
|
288
|
+
|
|
289
|
+
Returns:
|
|
290
|
+
Version string if cache is valid, None otherwise
|
|
291
|
+
"""
|
|
292
|
+
if not self.config.cache_enabled:
|
|
293
|
+
return None
|
|
294
|
+
|
|
295
|
+
# Check for existing cache entries
|
|
296
|
+
config_key = str(self._config_path)
|
|
297
|
+
if config_key in self._cache:
|
|
298
|
+
entry = self._cache[config_key]
|
|
299
|
+
|
|
300
|
+
# Check if cache entry is still valid
|
|
301
|
+
if self._is_cache_entry_valid(entry):
|
|
302
|
+
entry.access_count += 1
|
|
303
|
+
entry.last_access = datetime.now()
|
|
304
|
+
self._cache_stats["hits"] += 1
|
|
305
|
+
self._cache_stats["cache_hits_by_source"][VersionSource.CACHE.value] += 1
|
|
306
|
+
|
|
307
|
+
if self.config.debug_mode:
|
|
308
|
+
self._logger.debug(f"Cache hit: {entry.version} (source: {entry.source.value})")
|
|
309
|
+
|
|
310
|
+
return entry.version
|
|
311
|
+
|
|
312
|
+
return None
|
|
313
|
+
|
|
314
|
+
def _is_cache_entry_valid(self, entry: CacheEntry) -> bool:
|
|
315
|
+
"""
|
|
316
|
+
Check if cache entry is still valid.
|
|
317
|
+
|
|
318
|
+
Args:
|
|
319
|
+
entry: Cache entry to validate
|
|
320
|
+
|
|
321
|
+
Returns:
|
|
322
|
+
True if cache entry is valid
|
|
323
|
+
"""
|
|
324
|
+
# Check TTL
|
|
325
|
+
if self.config.cache_enabled:
|
|
326
|
+
age = datetime.now() - entry.timestamp
|
|
327
|
+
if age.total_seconds() > self.config.cache_ttl_seconds:
|
|
328
|
+
return False
|
|
329
|
+
|
|
330
|
+
return True
|
|
331
|
+
|
|
332
|
+
def _update_cache(self, version: str, source: VersionSource) -> None:
|
|
333
|
+
"""
|
|
334
|
+
Update cache with new version entry.
|
|
335
|
+
|
|
336
|
+
Args:
|
|
337
|
+
version: Version string to cache
|
|
338
|
+
source: Source of the version
|
|
339
|
+
"""
|
|
340
|
+
if not self.config.cache_enabled:
|
|
341
|
+
return
|
|
342
|
+
|
|
343
|
+
config_key = str(self._config_path)
|
|
344
|
+
entry = CacheEntry(version=version, timestamp=datetime.now(), source=source)
|
|
345
|
+
|
|
346
|
+
self._cache[config_key] = entry
|
|
347
|
+
|
|
348
|
+
# Apply cache size limits with LRU eviction
|
|
349
|
+
if len(self._cache) > self.config.cache_size:
|
|
350
|
+
self._evict_oldest_cache_entry()
|
|
351
|
+
|
|
352
|
+
if self.config.debug_mode:
|
|
353
|
+
self._logger.debug(f"Cache updated with version: {version} (source: {source.value})")
|
|
354
|
+
|
|
355
|
+
def _evict_oldest_cache_entry(self) -> None:
|
|
356
|
+
"""
|
|
357
|
+
Evict the least recently used cache entry.
|
|
358
|
+
"""
|
|
359
|
+
if not self.config.enable_lru_cache or len(self._cache) <= 1:
|
|
360
|
+
return
|
|
361
|
+
|
|
362
|
+
oldest_entry = None
|
|
363
|
+
oldest_key = None
|
|
364
|
+
|
|
365
|
+
for key, entry in self._cache.items():
|
|
366
|
+
if oldest_entry is None or entry.last_access < oldest_entry.last_access:
|
|
367
|
+
oldest_entry = entry
|
|
368
|
+
oldest_key = key
|
|
369
|
+
|
|
370
|
+
if oldest_key is not None:
|
|
371
|
+
del self._cache[oldest_key]
|
|
372
|
+
if self.config.debug_mode:
|
|
373
|
+
self._logger.debug(f"Evicted oldest cache entry: {oldest_key}")
|
|
374
|
+
|
|
375
|
+
def _handle_read_error(self, error: Exception, start_time: float) -> None:
|
|
376
|
+
"""
|
|
377
|
+
Handle read errors with enhanced logging and recovery.
|
|
378
|
+
|
|
379
|
+
Args:
|
|
380
|
+
error: Exception that occurred
|
|
381
|
+
start_time: When the operation started
|
|
382
|
+
"""
|
|
383
|
+
self._cache_stats["errors"] += 1
|
|
384
|
+
|
|
385
|
+
error_msg = f"Error reading version: {error}"
|
|
386
|
+
if self.config.debug_mode:
|
|
387
|
+
self._logger.error(error_msg, exc_info=True)
|
|
388
|
+
else:
|
|
389
|
+
self._logger.warning(error_msg)
|
|
390
|
+
|
|
391
|
+
self._log_performance(start_time, "error_read")
|
|
392
|
+
|
|
393
|
+
def _log_performance(self, start_time: float, operation: str) -> None:
|
|
394
|
+
"""
|
|
395
|
+
Log performance metrics for the operation.
|
|
396
|
+
|
|
397
|
+
Args:
|
|
398
|
+
start_time: When the operation started
|
|
399
|
+
operation: Type of operation being logged
|
|
400
|
+
"""
|
|
401
|
+
if not self.config.track_performance_metrics:
|
|
402
|
+
return
|
|
403
|
+
|
|
404
|
+
duration = time.time() - start_time
|
|
405
|
+
metric_name = f"{operation}_duration"
|
|
406
|
+
|
|
407
|
+
if metric_name not in self._performance_metrics:
|
|
408
|
+
self._performance_metrics[metric_name] = []
|
|
409
|
+
|
|
410
|
+
self._performance_metrics[metric_name].append(duration)
|
|
411
|
+
|
|
412
|
+
if self.config.debug_mode:
|
|
413
|
+
self._logger.debug(f"Performance {operation}: {duration:.4f}s")
|
|
414
|
+
|
|
415
|
+
def get_performance_metrics(self) -> Dict[str, Any]:
|
|
416
|
+
"""
|
|
417
|
+
Get performance metrics for analysis.
|
|
418
|
+
|
|
419
|
+
Returns:
|
|
420
|
+
Dictionary containing performance metrics
|
|
421
|
+
"""
|
|
422
|
+
metrics: Dict[str, Any] = {
|
|
423
|
+
"cache_stats": self._cache_stats.copy(),
|
|
424
|
+
"cache_size": len(self._cache),
|
|
425
|
+
"max_cache_size": self.config.cache_size,
|
|
426
|
+
"performance_metrics": {},
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
# Calculate average times for each operation
|
|
430
|
+
for operation, times in self._performance_metrics.items():
|
|
431
|
+
if times:
|
|
432
|
+
metrics["performance_metrics"][operation] = {
|
|
433
|
+
"count": len(times),
|
|
434
|
+
"average": sum(times) / len(times),
|
|
435
|
+
"min": min(times),
|
|
436
|
+
"max": max(times),
|
|
437
|
+
"total": sum(times),
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
return metrics
|
|
441
|
+
|
|
442
|
+
def _read_version_from_config_sync(self) -> str:
|
|
443
|
+
"""
|
|
444
|
+
Synchronous version of reading from .moai/config/config.yaml.
|
|
445
|
+
|
|
446
|
+
Returns:
|
|
447
|
+
Version string or empty string if not found
|
|
448
|
+
"""
|
|
449
|
+
try:
|
|
450
|
+
if not self._config_path.exists():
|
|
451
|
+
logger.debug(f"Config file not found: {self._config_path}")
|
|
452
|
+
return ""
|
|
453
|
+
|
|
454
|
+
try:
|
|
455
|
+
config_data = self._read_config_sync(self._config_path)
|
|
456
|
+
version = self._extract_version_from_config(config_data)
|
|
457
|
+
return version if version else ""
|
|
458
|
+
except (json.JSONDecodeError, yaml.YAMLError) as e:
|
|
459
|
+
logger.error(f"Invalid config in {self._config_path}: {e}")
|
|
460
|
+
return ""
|
|
461
|
+
|
|
462
|
+
except Exception as e:
|
|
463
|
+
logger.error(f"Error reading version from config: {e}")
|
|
464
|
+
return ""
|
|
465
|
+
|
|
466
|
+
async def _read_version_from_config_async(self) -> str:
|
|
467
|
+
"""
|
|
468
|
+
Read version from .moai/config/config.yaml asynchronously.
|
|
469
|
+
|
|
470
|
+
Returns:
|
|
471
|
+
Version string or empty string if not found
|
|
472
|
+
"""
|
|
473
|
+
try:
|
|
474
|
+
if not await self._file_exists_async(self._config_path):
|
|
475
|
+
logger.debug(f"Config file not found: {self._config_path}")
|
|
476
|
+
return ""
|
|
477
|
+
|
|
478
|
+
try:
|
|
479
|
+
config_data = await self._read_config_async(self._config_path)
|
|
480
|
+
return self._extract_version_from_config(config_data)
|
|
481
|
+
except (json.JSONDecodeError, yaml.YAMLError) as e:
|
|
482
|
+
logger.error(f"Invalid config in {self._config_path}: {e}")
|
|
483
|
+
return ""
|
|
484
|
+
|
|
485
|
+
except Exception as e:
|
|
486
|
+
logger.error(f"Error reading version from config: {e}")
|
|
487
|
+
return ""
|
|
488
|
+
|
|
489
|
+
def _extract_version_from_config(self, config: Dict[str, Any]) -> str:
|
|
490
|
+
"""
|
|
491
|
+
Extract version from config using multiple fallback strategies.
|
|
492
|
+
|
|
493
|
+
Args:
|
|
494
|
+
config: Configuration dictionary
|
|
495
|
+
|
|
496
|
+
Returns:
|
|
497
|
+
Version string or empty string
|
|
498
|
+
"""
|
|
499
|
+
# Try each version field in order of priority
|
|
500
|
+
for field_path in self.VERSION_FIELDS:
|
|
501
|
+
version = self._get_nested_value(config, field_path)
|
|
502
|
+
if version:
|
|
503
|
+
logger.debug(f"Found version in field '{field_path}': {version}")
|
|
504
|
+
return version
|
|
505
|
+
|
|
506
|
+
logger.debug("No version field found in config")
|
|
507
|
+
return ""
|
|
508
|
+
|
|
509
|
+
def _get_nested_value(self, config: Dict[str, Any], field_path: str) -> Optional[str]:
|
|
510
|
+
"""
|
|
511
|
+
Get nested value from config using dot notation.
|
|
512
|
+
|
|
513
|
+
Args:
|
|
514
|
+
config: Configuration dictionary
|
|
515
|
+
field_path: Dot-separated path (e.g., "moai.version")
|
|
516
|
+
|
|
517
|
+
Returns:
|
|
518
|
+
Value or None if not found
|
|
519
|
+
"""
|
|
520
|
+
keys = field_path.split(".")
|
|
521
|
+
current = config
|
|
522
|
+
|
|
523
|
+
for key in keys:
|
|
524
|
+
if isinstance(current, dict) and key in current:
|
|
525
|
+
current = current[key]
|
|
526
|
+
else:
|
|
527
|
+
return None
|
|
528
|
+
|
|
529
|
+
return str(current) if current is not None else None
|
|
530
|
+
|
|
531
|
+
def _format_short_version(self, version: str) -> str:
|
|
532
|
+
"""
|
|
533
|
+
Format short version by removing 'v' prefix if present.
|
|
534
|
+
|
|
535
|
+
Args:
|
|
536
|
+
version: Version string
|
|
537
|
+
|
|
538
|
+
Returns:
|
|
539
|
+
Short version string
|
|
540
|
+
"""
|
|
541
|
+
return version[1:] if version.startswith("v") else version
|
|
542
|
+
|
|
543
|
+
def _format_display_version(self, version: str) -> str:
|
|
544
|
+
"""
|
|
545
|
+
Format display version with proper formatting.
|
|
546
|
+
|
|
547
|
+
Args:
|
|
548
|
+
version: Version string
|
|
549
|
+
|
|
550
|
+
Returns:
|
|
551
|
+
Display version string
|
|
552
|
+
"""
|
|
553
|
+
if version == "unknown":
|
|
554
|
+
return "MoAI-ADK unknown version"
|
|
555
|
+
elif version.startswith("v"):
|
|
556
|
+
return f"MoAI-ADK {version}"
|
|
557
|
+
else:
|
|
558
|
+
return f"MoAI-ADK v{version}"
|
|
559
|
+
|
|
560
|
+
def _is_valid_version_format(self, version: str) -> bool:
|
|
561
|
+
"""
|
|
562
|
+
Validate version format using regex pattern.
|
|
563
|
+
|
|
564
|
+
Args:
|
|
565
|
+
version: Version string to validate
|
|
566
|
+
|
|
567
|
+
Returns:
|
|
568
|
+
True if version format is valid
|
|
569
|
+
"""
|
|
570
|
+
return bool(self._version_pattern.match(version))
|
|
571
|
+
|
|
572
|
+
def _get_fallback_version(self) -> str:
|
|
573
|
+
"""
|
|
574
|
+
Get fallback version with graceful degradation.
|
|
575
|
+
|
|
576
|
+
Returns:
|
|
577
|
+
Fallback version string
|
|
578
|
+
"""
|
|
579
|
+
# Try to get version from package metadata first
|
|
580
|
+
pkg_version = self._get_package_version()
|
|
581
|
+
if pkg_version:
|
|
582
|
+
self._logger.debug(f"Using package metadata version: {pkg_version}")
|
|
583
|
+
return pkg_version
|
|
584
|
+
|
|
585
|
+
# Fall back to configured fallback version
|
|
586
|
+
fallback = self.config.fallback_version
|
|
587
|
+
self._logger.debug(f"Using configured fallback version: {fallback}")
|
|
588
|
+
return fallback
|
|
589
|
+
|
|
590
|
+
def _get_package_version(self) -> str:
|
|
591
|
+
"""
|
|
592
|
+
Get version from installed moai-adk package metadata.
|
|
593
|
+
|
|
594
|
+
This allows the statusline to work even when .moai/config/config.json
|
|
595
|
+
is not found, as long as the moai-adk package is installed.
|
|
596
|
+
|
|
597
|
+
Returns:
|
|
598
|
+
Version string or empty string if package not found
|
|
599
|
+
"""
|
|
600
|
+
try:
|
|
601
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
602
|
+
|
|
603
|
+
try:
|
|
604
|
+
pkg_version = version("moai-adk")
|
|
605
|
+
self._logger.debug(f"Found moai-adk package version: {pkg_version}")
|
|
606
|
+
return pkg_version
|
|
607
|
+
except PackageNotFoundError:
|
|
608
|
+
self._logger.debug("moai-adk package not found in metadata")
|
|
609
|
+
return ""
|
|
610
|
+
except ImportError:
|
|
611
|
+
self._logger.debug("importlib.metadata not available")
|
|
612
|
+
return ""
|
|
613
|
+
except Exception as e:
|
|
614
|
+
self._logger.debug(f"Error getting package version: {e}")
|
|
615
|
+
return ""
|
|
616
|
+
|
|
617
|
+
async def _file_exists_async(self, path: Path) -> bool:
|
|
618
|
+
"""Async file existence check"""
|
|
619
|
+
try:
|
|
620
|
+
loop = asyncio.get_event_loop()
|
|
621
|
+
return await loop.run_in_executor(None, path.exists)
|
|
622
|
+
except Exception:
|
|
623
|
+
return False
|
|
624
|
+
|
|
625
|
+
async def _read_json_async(self, path: Path) -> Dict[str, Any]:
|
|
626
|
+
"""Async JSON file reading"""
|
|
627
|
+
loop = asyncio.get_event_loop()
|
|
628
|
+
return await loop.run_in_executor(None, self._read_json_sync, path)
|
|
629
|
+
|
|
630
|
+
def _read_json_sync(self, path: Path) -> Dict[str, Any]:
|
|
631
|
+
"""Synchronous JSON file reading"""
|
|
632
|
+
with open(path, "r", encoding="utf-8") as f:
|
|
633
|
+
return json.load(f)
|
|
634
|
+
|
|
635
|
+
async def _read_config_async(self, path: Path) -> Dict[str, Any]:
|
|
636
|
+
"""Async config file reading (supports YAML and JSON)"""
|
|
637
|
+
loop = asyncio.get_event_loop()
|
|
638
|
+
return await loop.run_in_executor(None, self._read_config_sync, path)
|
|
639
|
+
|
|
640
|
+
def _read_config_sync(self, path: Path) -> Dict[str, Any]:
|
|
641
|
+
"""Synchronous config file reading (supports YAML and JSON)"""
|
|
642
|
+
with open(path, "r", encoding="utf-8") as f:
|
|
643
|
+
if path.suffix in (".yaml", ".yml"):
|
|
644
|
+
return yaml.safe_load(f) or {}
|
|
645
|
+
else:
|
|
646
|
+
return json.load(f)
|
|
647
|
+
|
|
648
|
+
# Backwards compatibility cache methods
|
|
649
|
+
def clear_cache(self) -> None:
|
|
650
|
+
"""Clear version cache (backwards compatibility)"""
|
|
651
|
+
self._version_cache = None
|
|
652
|
+
self._cache_time = None
|
|
653
|
+
# Also clear the main cache dictionary
|
|
654
|
+
self._cache.clear()
|
|
655
|
+
# Reset cache statistics
|
|
656
|
+
self._cache_stats = {
|
|
657
|
+
"hits": 0,
|
|
658
|
+
"misses": 0,
|
|
659
|
+
"errors": 0,
|
|
660
|
+
"cache_hits_by_source": {
|
|
661
|
+
VersionSource.CONFIG_FILE.value: 0,
|
|
662
|
+
VersionSource.CACHE.value: 0,
|
|
663
|
+
VersionSource.FALLBACK.value: 0,
|
|
664
|
+
},
|
|
665
|
+
}
|
|
666
|
+
logger.debug("Version cache cleared")
|
|
667
|
+
|
|
668
|
+
def get_cache_stats(self) -> Dict[str, int]:
|
|
669
|
+
"""
|
|
670
|
+
Get cache statistics (backwards compatibility).
|
|
671
|
+
|
|
672
|
+
Returns:
|
|
673
|
+
Dictionary with cache hit/miss/error counts
|
|
674
|
+
"""
|
|
675
|
+
return self._cache_stats.copy()
|
|
676
|
+
|
|
677
|
+
def get_cache_age_seconds(self) -> Optional[float]:
|
|
678
|
+
"""
|
|
679
|
+
Get cache age in seconds (backwards compatibility).
|
|
680
|
+
|
|
681
|
+
Returns:
|
|
682
|
+
Cache age in seconds, or None if no cached version
|
|
683
|
+
"""
|
|
684
|
+
if self._cache_time is None:
|
|
685
|
+
return None
|
|
686
|
+
return (datetime.now() - self._cache_time).total_seconds()
|
|
687
|
+
|
|
688
|
+
def is_cache_expired(self) -> bool:
|
|
689
|
+
"""
|
|
690
|
+
Check if cache is expired (backwards compatibility).
|
|
691
|
+
|
|
692
|
+
Returns:
|
|
693
|
+
True if cache is expired
|
|
694
|
+
"""
|
|
695
|
+
# Check if cache entry exists and is still valid
|
|
696
|
+
config_key = str(self._config_path)
|
|
697
|
+
if config_key not in self._cache:
|
|
698
|
+
return True
|
|
699
|
+
entry = self._cache[config_key]
|
|
700
|
+
return not self._is_cache_entry_valid(entry)
|
|
701
|
+
|
|
702
|
+
def get_config(self) -> VersionConfig:
|
|
703
|
+
"""Get current configuration"""
|
|
704
|
+
return self.config
|
|
705
|
+
|
|
706
|
+
def update_config(self, config: VersionConfig) -> None:
|
|
707
|
+
"""
|
|
708
|
+
Update configuration.
|
|
709
|
+
|
|
710
|
+
Args:
|
|
711
|
+
config: New configuration object
|
|
712
|
+
"""
|
|
713
|
+
self.config = config
|
|
714
|
+
self._cache_ttl = timedelta(seconds=self.config.cache_ttl_seconds)
|
|
715
|
+
logger.debug("Version reader configuration updated")
|
|
716
|
+
|
|
717
|
+
def get_available_version_fields(self) -> list[str]:
|
|
718
|
+
"""
|
|
719
|
+
Get list of available version field paths.
|
|
720
|
+
|
|
721
|
+
Returns:
|
|
722
|
+
List of version field paths
|
|
723
|
+
"""
|
|
724
|
+
return self.VERSION_FIELDS.copy()
|
|
725
|
+
|
|
726
|
+
def set_custom_version_fields(self, fields: list[str]) -> None:
|
|
727
|
+
"""
|
|
728
|
+
Set custom version field paths.
|
|
729
|
+
|
|
730
|
+
Args:
|
|
731
|
+
fields: List of version field paths in order of priority
|
|
732
|
+
"""
|
|
733
|
+
self.VERSION_FIELDS = fields.copy()
|
|
734
|
+
self._version_fields = fields.copy() # Also update internal field list
|
|
735
|
+
logger.debug(f"Custom version fields set: {fields}")
|
|
736
|
+
|
|
737
|
+
|
|
738
|
+
class VersionReadError(Exception):
|
|
739
|
+
"""Exception raised when version cannot be read"""
|
|
740
|
+
|
|
741
|
+
pass
|