moai-adk 0.25.4__py3-none-any.whl → 0.41.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +2 -5
- moai_adk/__main__.py +114 -82
- moai_adk/cli/__init__.py +6 -1
- moai_adk/cli/commands/__init__.py +1 -3
- moai_adk/cli/commands/analyze.py +5 -16
- moai_adk/cli/commands/doctor.py +6 -18
- moai_adk/cli/commands/init.py +60 -126
- moai_adk/cli/commands/language.py +14 -35
- moai_adk/cli/commands/status.py +9 -15
- moai_adk/cli/commands/update.py +1560 -190
- moai_adk/cli/prompts/init_prompts.py +112 -56
- moai_adk/cli/spec_status.py +263 -0
- moai_adk/cli/ui/__init__.py +44 -0
- moai_adk/cli/ui/progress.py +422 -0
- moai_adk/cli/ui/prompts.py +389 -0
- moai_adk/cli/ui/theme.py +129 -0
- moai_adk/cli/worktree/__init__.py +27 -0
- moai_adk/cli/worktree/__main__.py +31 -0
- moai_adk/cli/worktree/cli.py +683 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +493 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +422 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/analysis/session_analyzer.py +17 -56
- moai_adk/core/claude_integration.py +26 -54
- moai_adk/core/command_helpers.py +10 -10
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/migration.py +19 -9
- moai_adk/core/config/unified.py +610 -0
- moai_adk/core/context_manager.py +6 -12
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +747 -116
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +8 -0
- moai_adk/core/git/branch_manager.py +3 -11
- moai_adk/core/git/checkpoint.py +1 -3
- moai_adk/core/git/conflict_detector.py +422 -0
- moai_adk/core/git/event_detector.py +16 -5
- moai_adk/core/git/manager.py +91 -1
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/engine.py +6 -18
- moai_adk/core/integration/integration_tester.py +10 -9
- moai_adk/core/integration/utils.py +1 -1
- moai_adk/core/issue_creator.py +10 -28
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config_resolver.py +578 -0
- moai_adk/core/language_validator.py +28 -41
- moai_adk/core/mcp/setup.py +15 -12
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +666 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +389 -0
- moai_adk/core/migration/backup_manager.py +131 -12
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +181 -18
- moai_adk/core/migration/interactive_checkbox_ui.py +499 -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 +127 -27
- moai_adk/core/migration/version_migrator.py +47 -12
- moai_adk/core/performance/cache_system.py +8 -10
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/backup_utils.py +9 -1
- moai_adk/core/project/checker.py +2 -4
- moai_adk/core/project/detector.py +1 -3
- moai_adk/core/project/initializer.py +142 -93
- moai_adk/core/project/phase_executor.py +130 -111
- moai_adk/core/project/validator.py +6 -12
- moai_adk/core/quality/trust_checker.py +39 -37
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +116 -164
- moai_adk/core/session_manager.py +10 -26
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec_status_manager.py +64 -74
- moai_adk/core/template/backup.py +48 -22
- moai_adk/core/template/config.py +142 -45
- moai_adk/core/template/merger.py +45 -27
- moai_adk/core/template/processor.py +391 -152
- moai_adk/core/template_engine.py +83 -41
- moai_adk/core/template_variable_synchronizer.py +431 -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 +477 -0
- moai_adk/foundation/__init__.py +56 -0
- moai_adk/foundation/backend.py +1027 -0
- moai_adk/foundation/database.py +1115 -0
- moai_adk/foundation/devops.py +1585 -0
- moai_adk/foundation/ears.py +431 -0
- moai_adk/foundation/frontend.py +870 -0
- moai_adk/foundation/git/commit_templates.py +4 -12
- moai_adk/foundation/git.py +376 -0
- moai_adk/foundation/langs.py +484 -0
- moai_adk/foundation/ml_ops.py +1162 -0
- moai_adk/foundation/testing.py +1524 -0
- moai_adk/foundation/trust/trust_principles.py +23 -72
- moai_adk/foundation/trust/validation_checklist.py +57 -162
- moai_adk/project/__init__.py +0 -0
- moai_adk/project/configuration.py +1084 -0
- moai_adk/project/documentation.py +566 -0
- moai_adk/project/schema.py +447 -0
- moai_adk/statusline/alfred_detector.py +1 -3
- moai_adk/statusline/config.py +18 -6
- moai_adk/statusline/enhanced_output_style_detector.py +23 -15
- moai_adk/statusline/main.py +109 -15
- moai_adk/statusline/renderer.py +85 -69
- moai_adk/statusline/update_checker.py +3 -9
- moai_adk/statusline/version_reader.py +140 -46
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +716 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +480 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1194 -0
- moai_adk/templates/.claude/agents/moai/builder-plugin.md +753 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +672 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +903 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +782 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +407 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +722 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +727 -0
- moai_adk/templates/.claude/agents/moai/expert-performance.md +661 -0
- moai_adk/templates/.claude/agents/moai/expert-refactoring.md +218 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +525 -0
- moai_adk/templates/.claude/agents/moai/expert-testing.md +737 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1047 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +438 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +578 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +1092 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +897 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +640 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +815 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +786 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +797 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +464 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1588 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +795 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +475 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +1038 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1339 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1367 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +825 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +1358 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +320 -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/README.md +143 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +247 -0
- moai_adk/templates/.claude/hooks/moai/lib/common.py +161 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +444 -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/exceptions.py +171 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +407 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +219 -0
- moai_adk/templates/.claude/hooks/moai/lib/project.py +777 -0
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
- moai_adk/templates/.claude/hooks/moai/lib/tool_registry.py +804 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +542 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__ast_grep_scan.py +256 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__code_formatter.py +253 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__linter.py +307 -0
- moai_adk/templates/.claude/hooks/moai/pre_tool__security_guard.py +231 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +866 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +1125 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +643 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +359 -0
- moai_adk/templates/.claude/settings.json +209 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +302 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/reference.md +139 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/batch_generate.py +560 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/generate_image.py +362 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +302 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +252 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +56 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +120 -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 +185 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +207 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +234 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +324 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +718 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +464 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +326 -0
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +830 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +545 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +194 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +968 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/component-architecture.md +723 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/nextjs16-patterns.md +713 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/performance-optimization.md +694 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/react19-patterns.md +591 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/state-management.md +680 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/vue35-patterns.md +802 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +664 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +454 -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/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 +280 -0
- moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +327 -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-formats-data/reference.md +585 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +243 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/advanced-agent-patterns.md +370 -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-cli-reference-official.md +420 -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-devcontainers-official.md +381 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-discover-plugins-official.md +379 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-headless-official.md +378 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +670 -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-plugin-marketplaces-official.md +308 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugins-official.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sandboxing-official.md +282 -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 +467 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-statusline-official.md +293 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +420 -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-claude/reference.md +209 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +449 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/examples.md +1048 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/reference.md +246 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +414 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/examples.md +358 -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 +359 -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-advanced.md +279 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-implementation.md +267 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +228 -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/patterns.md +22 -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-ears-format.md +200 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +171 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-tdd-implementation.md +275 -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 +239 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-implementation.md +244 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-validation.md +219 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/reference.md +478 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +311 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/examples.md +228 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/assumption-matrix.md +80 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/cognitive-bias.md +199 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/first-principles.md +140 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/trade-off-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/reference.md +157 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +363 -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-lang-cpp/SKILL.md +430 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +17 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/modules/advanced-patterns.md +401 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +17 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +193 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +585 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/aspnet-core.md +627 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/blazor-components.md +767 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/cqrs-validation.md +626 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/csharp12-features.md +580 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/efcore-patterns.md +622 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +403 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +394 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/examples.md +17 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/modules/advanced-patterns.md +531 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/reference.md +17 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +472 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/examples.md +1090 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/reference.md +686 -0
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +919 -0
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +737 -0
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +386 -0
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +864 -0
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +291 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +418 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +973 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +1543 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +383 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +1006 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +562 -0
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +504 -0
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +17 -0
- moai_adk/templates/.claude/skills/moai-lang-php/modules/advanced-patterns.md +538 -0
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +17 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +977 -0
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +804 -0
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +389 -0
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +17 -0
- moai_adk/templates/.claude/skills/moai-lang-r/modules/advanced-patterns.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +17 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +432 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +17 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/modules/advanced-patterns.md +309 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/modules/testing-patterns.md +306 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +17 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +659 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +504 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +211 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +633 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/akka-actors.md +479 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/cats-effect.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/functional-programming.md +460 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/spark-data.md +498 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/zio-patterns.md +541 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +423 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +191 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +918 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/combine-reactive.md +256 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/concurrency.md +270 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/swift6-features.md +265 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/swiftui-patterns.md +314 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +672 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +364 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +1089 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +731 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +164 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/modules/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/modules/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 +335 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/examples.md +592 -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 +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +350 -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/modules/optimization.md +303 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/reference.md +379 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +373 -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-auth0/SKILL.md +283 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/examples.md +2446 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/adaptive-mfa.md +233 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/akamai-integration.md +214 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/application-credentials.md +280 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-log-events.md +224 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-overview.md +140 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/bot-detection.md +144 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/breached-password-detection.md +187 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/brute-force-protection.md +189 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/certifications.md +282 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/compliance-overview.md +263 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/continuous-session-protection.md +307 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/customize-mfa.md +177 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/dpop-implementation.md +283 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/fapi-implementation.md +259 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/gdpr-compliance.md +313 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/guardian-configuration.md +269 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/highly-regulated-identity.md +272 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/jwt-fundamentals.md +248 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mdl-verification.md +210 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-api-management.md +278 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-factors.md +226 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-overview.md +174 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mtls-sender-constraining.md +316 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/ropg-flow-mfa.md +216 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-center.md +325 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-guidance.md +277 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/state-parameters.md +177 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/step-up-authentication.md +251 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/suspicious-ip-throttling.md +240 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/tenant-access-control.md +179 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/webauthn-fido.md +235 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/reference.md +224 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +425 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/modules/advanced-patterns.md +417 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/reference.md +273 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +228 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/examples.md +506 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/auth-integration.md +421 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/file-storage.md +474 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/reactive-queries.md +302 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/server-functions.md +452 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/reference.md +385 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +249 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/examples.md +514 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/custom-claims.md +374 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/phone-auth.md +372 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/social-auth.md +339 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/reference.md +382 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +230 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/examples.md +445 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/offline-cache.md +392 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/realtime-listeners.md +441 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/security-rules.md +352 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/transactions.md +452 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/reference.md +322 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +205 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/examples.md +470 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/auto-scaling.md +349 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/branching-workflows.md +354 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/connection-pooling.md +412 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/pitr-backups.md +458 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/reference.md +272 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +223 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/examples.md +539 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/docker-deployment.md +261 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/multi-service.md +291 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/networking-domains.md +338 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/volumes-storage.md +353 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/reference.md +374 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +206 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/examples.md +502 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/auth-integration.md +384 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/edge-functions.md +371 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/postgresql-pgvector.md +231 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/realtime-presence.md +354 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/row-level-security.md +286 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/storage-cdn.md +319 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/typescript-patterns.md +453 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/reference.md +284 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +209 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/examples.md +502 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/analytics-speed.md +348 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/deployment-config.md +344 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/edge-functions.md +222 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/isr-caching.md +306 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/kv-storage.md +399 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/reference.md +360 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/SKILL.md +473 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/examples.md +621 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/modules/migration.md +341 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/modules/validation.md +373 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/reference.md +464 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/SKILL.md +306 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/examples.md +1099 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/language-specific.md +307 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/pattern-syntax.md +237 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/refactoring-patterns.md +260 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/security-rules.md +239 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/reference.md +288 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/go.yml +90 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/python.yml +101 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/typescript.yml +83 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/complexity-check.yml +94 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/deprecated-apis.yml +84 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/secrets-detection.yml +89 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/sql-injection.yml +45 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/xss-prevention.yml +50 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/sgconfig.yml +54 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/SKILL.md +214 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/examples.md +697 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/index.md +96 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/acp.md +115 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/agents.md +241 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/commands.md +197 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/custom-tools.md +197 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/formatters.md +164 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/keybinds.md +150 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/lsp-servers.md +156 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/mcp-servers.md +214 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/models.md +197 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/permissions.md +162 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/rules.md +129 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/skills.md +192 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/themes.md +200 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/tools.md +169 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/core/config.md +211 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/core/enterprise.md +68 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/core/intro.md +127 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/core/migration-1.0.md +82 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/core/network.md +72 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/core/providers.md +310 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/core/troubleshooting.md +124 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/develop/ecosystem.md +75 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/develop/plugins.md +218 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/develop/sdk.md +266 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/develop/server.md +207 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/usage/cli.md +159 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/usage/github.md +181 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/usage/gitlab.md +122 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/usage/ide.md +74 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/usage/share.md +106 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/usage/tui.md +129 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/usage/zen.md +118 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/reference.md +790 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +211 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/modules/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/modules/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/reference.md +307 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +260 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/reference.md +275 -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 +1434 -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 +92 -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-spec/SKILL.md +336 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/modules/advanced-patterns.md +237 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +386 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/examples.md +552 -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-templates/reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +307 -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/examples.md +672 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +269 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +302 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/context7-integration.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/review-workflows.md +500 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/relevance-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/safety-analysis.md +148 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/scoring-algorithms.md +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/timeliness-analysis.md +168 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/truthfulness-analysis.md +136 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/usability-analysis.md +153 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework.md +257 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +263 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/analysis-patterns.md +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/core-classes.md +299 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/tool-integration.md +380 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/debugging-workflows.md +451 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/error-analysis.md +442 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/optimization-patterns.md +473 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/profiling-techniques.md +481 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/ai-optimization.md +241 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/bottleneck-detection.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/optimization-plan.md +315 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/profiler-core.md +277 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/real-time-monitoring.md +187 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +327 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/quality-metrics.md +415 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/ai-workflows.md +620 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/patterns.md +692 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/security-analysis.md +429 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +313 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/static-analysis.md +438 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd/core-classes.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/advanced-features.md +494 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/red-green-refactor.md +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-generation.md +471 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-patterns.md +371 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +265 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/trust5-validation.md +428 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference.md +440 -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-workflow-worktree/SKILL.md +227 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/integration-patterns.md +149 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/moai-adk-integration.md +245 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-advanced.md +310 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-development.md +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-workflows.md +302 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/registry-architecture.md +271 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/resource-optimization.md +300 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/tools-integration.md +280 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/troubleshooting.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-commands.md +296 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-management.md +217 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +103 -41
- moai_adk/templates/.git-hooks/pre-push +244 -31
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.gitignore +181 -44
- moai_adk/templates/.lsp.json +152 -0
- moai_adk/templates/.mcp.json +6 -15
- moai_adk/templates/.moai/config/config.yaml +58 -0
- moai_adk/templates/.moai/config/multilingual-triggers.yaml +213 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +174 -0
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +259 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +107 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +632 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +183 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +96 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +116 -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 +18 -0
- moai_adk/templates/.moai/config/sections/system.yaml +24 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +92 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +804 -499
- moai_adk/utils/__init__.py +24 -1
- moai_adk/utils/banner.py +7 -10
- moai_adk/utils/common.py +49 -30
- moai_adk/utils/link_validator.py +4 -12
- moai_adk/utils/safe_file_reader.py +2 -6
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.41.0.dist-info/METADATA +3274 -0
- moai_adk-0.41.0.dist-info/RECORD +683 -0
- {moai_adk-0.25.4.dist-info → moai_adk-0.41.0.dist-info}/WHEEL +1 -1
- {moai_adk-0.25.4.dist-info → moai_adk-0.41.0.dist-info}/entry_points.txt +1 -0
- moai_adk/cli/commands/backup.py +0 -82
- moai_adk/cli/commands/improve_user_experience.py +0 -348
- moai_adk/cli/commands/migrate.py +0 -158
- moai_adk/cli/commands/validate_links.py +0 -118
- moai_adk/core/config/auto_spec_config.py +0 -346
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +0 -925
- moai_adk/core/spec/confidence_scoring.py +0 -749
- moai_adk/core/spec/ears_template_engine.py +0 -1182
- moai_adk/core/spec/quality_validator.py +0 -721
- moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -413
- moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
- moai_adk/utils/user_experience.py +0 -531
- moai_adk-0.25.4.dist-info/METADATA +0 -2279
- moai_adk-0.25.4.dist-info/RECORD +0 -112
- {moai_adk-0.25.4.dist-info → moai_adk-0.41.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -12,6 +12,7 @@ Enhanced with:
|
|
|
12
12
|
|
|
13
13
|
from __future__ import annotations
|
|
14
14
|
|
|
15
|
+
import json
|
|
15
16
|
import logging
|
|
16
17
|
import re
|
|
17
18
|
import shutil
|
|
@@ -61,23 +62,13 @@ class TemplateProcessorConfig:
|
|
|
61
62
|
return cls(
|
|
62
63
|
version_cache_ttl_seconds=config_dict.get("version_cache_ttl_seconds", 120),
|
|
63
64
|
version_fallback=config_dict.get("version_fallback", "unknown"),
|
|
64
|
-
version_format_regex=config_dict.get(
|
|
65
|
-
|
|
66
|
-
),
|
|
67
|
-
enable_version_validation=config_dict.get(
|
|
68
|
-
"enable_version_validation", True
|
|
69
|
-
),
|
|
65
|
+
version_format_regex=config_dict.get("version_format_regex", r"^v?(\d+\.\d+\.\d+(-[a-zA-Z0-9]+)?)$"),
|
|
66
|
+
enable_version_validation=config_dict.get("enable_version_validation", True),
|
|
70
67
|
preserve_user_version=config_dict.get("preserve_user_version", True),
|
|
71
|
-
validate_template_variables=config_dict.get(
|
|
72
|
-
"validate_template_variables", True
|
|
73
|
-
),
|
|
68
|
+
validate_template_variables=config_dict.get("validate_template_variables", True),
|
|
74
69
|
max_variable_length=config_dict.get("max_variable_length", 50),
|
|
75
|
-
allowed_variable_pattern=config_dict.get(
|
|
76
|
-
|
|
77
|
-
),
|
|
78
|
-
enable_substitution_warnings=config_dict.get(
|
|
79
|
-
"enable_substitution_warnings", True
|
|
80
|
-
),
|
|
70
|
+
allowed_variable_pattern=config_dict.get("allowed_variable_pattern", r"^[A-Z_]+$"),
|
|
71
|
+
enable_substitution_warnings=config_dict.get("enable_substitution_warnings", True),
|
|
81
72
|
enable_caching=config_dict.get("enable_caching", True),
|
|
82
73
|
cache_size=config_dict.get("cache_size", 100),
|
|
83
74
|
async_operations=config_dict.get("async_operations", False),
|
|
@@ -94,8 +85,9 @@ class TemplateProcessor:
|
|
|
94
85
|
".moai/specs/", # User SPEC documents
|
|
95
86
|
".moai/reports/", # User reports
|
|
96
87
|
".moai/project/", # User project documents (product/structure/tech.md)
|
|
97
|
-
#
|
|
98
|
-
#
|
|
88
|
+
".moai/config/sections/", # User configuration section files (YAML)
|
|
89
|
+
# config.json/config.yaml is now FORCE OVERWRITTEN (backup in .moai-backups/)
|
|
90
|
+
# Merge via /moai:0-project when optimized=false
|
|
99
91
|
]
|
|
100
92
|
|
|
101
93
|
# Paths excluded from backups
|
|
@@ -103,11 +95,10 @@ class TemplateProcessor:
|
|
|
103
95
|
|
|
104
96
|
# Common template variables with validation hints
|
|
105
97
|
COMMON_TEMPLATE_VARIABLES = {
|
|
106
|
-
"PROJECT_DIR": "Cross-platform project path (run /
|
|
107
|
-
"
|
|
108
|
-
"
|
|
109
|
-
"
|
|
110
|
-
"CONVERSATION_LANGUAGE": "Interface language (run /alfred:0-project to set)",
|
|
98
|
+
"PROJECT_DIR": "Cross-platform project path (run /moai:0-project to set)",
|
|
99
|
+
"PROJECT_NAME": "Project name (run /moai:0-project to set)",
|
|
100
|
+
"AUTHOR": "Project author (run /moai:0-project to set)",
|
|
101
|
+
"CONVERSATION_LANGUAGE": "Interface language (run /moai:0-project to set)",
|
|
111
102
|
"MOAI_VERSION": "MoAI-ADK version (should be set automatically)",
|
|
112
103
|
"MOAI_VERSION_SHORT": "Short MoAI-ADK version (without 'v' prefix)",
|
|
113
104
|
"MOAI_VERSION_DISPLAY": "Display version with proper formatting",
|
|
@@ -117,11 +108,10 @@ class TemplateProcessor:
|
|
|
117
108
|
"MOAI_VERSION_SOURCE": "Version source information",
|
|
118
109
|
"MOAI_VERSION_CACHE_AGE": "Cache age for debugging",
|
|
119
110
|
"CREATION_TIMESTAMP": "Project creation timestamp",
|
|
111
|
+
"STATUSLINE_COMMAND": "Cross-platform statusline command (OS-specific)",
|
|
120
112
|
}
|
|
121
113
|
|
|
122
|
-
def __init__(
|
|
123
|
-
self, target_path: Path, config: Optional[TemplateProcessorConfig] = None
|
|
124
|
-
) -> None:
|
|
114
|
+
def __init__(self, target_path: Path, config: Optional[TemplateProcessorConfig] = None) -> None:
|
|
125
115
|
"""Initialize the processor with enhanced configuration.
|
|
126
116
|
|
|
127
117
|
Args:
|
|
@@ -135,16 +125,14 @@ class TemplateProcessor:
|
|
|
135
125
|
self.context: dict[str, str] = {} # Template variable substitution context
|
|
136
126
|
self._version_reader: VersionReader | None = None
|
|
137
127
|
self.config = config or TemplateProcessorConfig()
|
|
138
|
-
self._substitution_cache: Dict[
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
128
|
+
self._substitution_cache: Dict[
|
|
129
|
+
int, tuple[str, list[str]]
|
|
130
|
+
] = {} # Cache for substitution results (key: hash, value: (content, warnings))
|
|
131
|
+
self._variable_validation_cache: Dict[str, bool] = {} # Cache for variable validation
|
|
142
132
|
self.logger = logging.getLogger(__name__)
|
|
143
133
|
|
|
144
134
|
if self.config.verbose_logging:
|
|
145
|
-
self.logger.info(
|
|
146
|
-
f"TemplateProcessor initialized with config: {self.config}"
|
|
147
|
-
)
|
|
135
|
+
self.logger.info(f"TemplateProcessor initialized with config: {self.config}")
|
|
148
136
|
|
|
149
137
|
def set_context(self, context: dict[str, str]) -> None:
|
|
150
138
|
"""Set variable substitution context with enhanced validation.
|
|
@@ -213,21 +201,15 @@ class TemplateProcessor:
|
|
|
213
201
|
|
|
214
202
|
# Check variable length
|
|
215
203
|
if len(var_name) > self.config.max_variable_length:
|
|
216
|
-
warning_messages.append(
|
|
217
|
-
f"Variable name '{var_name}' exceeds maximum length"
|
|
218
|
-
)
|
|
204
|
+
warning_messages.append(f"Variable name '{var_name}' exceeds maximum length")
|
|
219
205
|
|
|
220
206
|
# Check variable value length
|
|
221
207
|
if len(var_value) > self.config.max_variable_length * 2:
|
|
222
|
-
warning_messages.append(
|
|
223
|
-
f"Variable value '{var_value[:20]}...' is very long"
|
|
224
|
-
)
|
|
208
|
+
warning_messages.append(f"Variable value '{var_value[:20]}...' is very long")
|
|
225
209
|
|
|
226
210
|
# Check for potentially dangerous values
|
|
227
211
|
if "{{" in var_value or "}}" in var_value:
|
|
228
|
-
warning_messages.append(
|
|
229
|
-
f"Variable '{var_name}' contains placeholder patterns"
|
|
230
|
-
)
|
|
212
|
+
warning_messages.append(f"Variable '{var_name}' contains placeholder patterns")
|
|
231
213
|
|
|
232
214
|
# Check for common variables that should be present
|
|
233
215
|
missing_common_vars = []
|
|
@@ -236,28 +218,20 @@ class TemplateProcessor:
|
|
|
236
218
|
missing_common_vars.append(common_var)
|
|
237
219
|
|
|
238
220
|
if missing_common_vars and self.config.enable_substitution_warnings:
|
|
239
|
-
warning_messages.append(
|
|
240
|
-
f"Common variables missing: {', '.join(missing_common_vars[:3])}"
|
|
241
|
-
)
|
|
221
|
+
warning_messages.append(f"Common variables missing: {', '.join(missing_common_vars[:3])}")
|
|
242
222
|
|
|
243
223
|
# Report validation results
|
|
244
224
|
if validation_errors and not self.config.graceful_degradation:
|
|
245
|
-
raise ValueError(
|
|
246
|
-
f"Template variable validation failed: {validation_errors}"
|
|
247
|
-
)
|
|
225
|
+
raise ValueError(f"Template variable validation failed: {validation_errors}")
|
|
248
226
|
|
|
249
227
|
if validation_errors and self.config.graceful_degradation:
|
|
250
|
-
self.logger.warning(
|
|
251
|
-
f"Template variable validation warnings: {validation_errors}"
|
|
252
|
-
)
|
|
228
|
+
self.logger.warning(f"Template variable validation warnings: {validation_errors}")
|
|
253
229
|
|
|
254
230
|
if warning_messages and self.config.enable_substitution_warnings:
|
|
255
231
|
self.logger.warning(f"Template variable warnings: {warning_messages}")
|
|
256
232
|
|
|
257
233
|
if self.config.verbose_logging:
|
|
258
|
-
self.logger.debug(
|
|
259
|
-
f"Template variables validated: {len(context)} variables checked"
|
|
260
|
-
)
|
|
234
|
+
self.logger.debug(f"Template variables validated: {len(context)} variables checked")
|
|
261
235
|
|
|
262
236
|
def get_enhanced_version_context(self) -> dict[str, str]:
|
|
263
237
|
"""
|
|
@@ -278,28 +252,16 @@ class TemplateProcessor:
|
|
|
278
252
|
|
|
279
253
|
# Basic version information
|
|
280
254
|
version_context["MOAI_VERSION"] = moai_version
|
|
281
|
-
version_context["MOAI_VERSION_SHORT"] = self._format_short_version(
|
|
282
|
-
|
|
283
|
-
)
|
|
284
|
-
version_context["MOAI_VERSION_DISPLAY"] = self._format_display_version(
|
|
285
|
-
moai_version
|
|
286
|
-
)
|
|
255
|
+
version_context["MOAI_VERSION_SHORT"] = self._format_short_version(moai_version)
|
|
256
|
+
version_context["MOAI_VERSION_DISPLAY"] = self._format_display_version(moai_version)
|
|
287
257
|
|
|
288
258
|
# Enhanced formatting options
|
|
289
|
-
version_context["MOAI_VERSION_TRIMMED"] = self._format_trimmed_version(
|
|
290
|
-
|
|
291
|
-
)
|
|
292
|
-
version_context["MOAI_VERSION_SEMVER"] = self._format_semver_version(
|
|
293
|
-
moai_version
|
|
294
|
-
)
|
|
259
|
+
version_context["MOAI_VERSION_TRIMMED"] = self._format_trimmed_version(moai_version, max_length=10)
|
|
260
|
+
version_context["MOAI_VERSION_SEMVER"] = self._format_semver_version(moai_version)
|
|
295
261
|
|
|
296
262
|
# Validation and source information
|
|
297
|
-
version_context["MOAI_VERSION_VALID"] =
|
|
298
|
-
|
|
299
|
-
)
|
|
300
|
-
version_context["MOAI_VERSION_SOURCE"] = self._get_version_source(
|
|
301
|
-
version_reader
|
|
302
|
-
)
|
|
263
|
+
version_context["MOAI_VERSION_VALID"] = "true" if moai_version != "unknown" else "false"
|
|
264
|
+
version_context["MOAI_VERSION_SOURCE"] = self._get_version_source(version_reader)
|
|
303
265
|
|
|
304
266
|
# Performance metrics
|
|
305
267
|
cache_age = version_reader.get_cache_age_seconds()
|
|
@@ -311,9 +273,7 @@ class TemplateProcessor:
|
|
|
311
273
|
# Additional metadata
|
|
312
274
|
if self.config.enable_version_validation:
|
|
313
275
|
is_valid = self._is_valid_version_format(moai_version)
|
|
314
|
-
version_context["MOAI_VERSION_FORMAT_VALID"] =
|
|
315
|
-
"true" if is_valid else "false"
|
|
316
|
-
)
|
|
276
|
+
version_context["MOAI_VERSION_FORMAT_VALID"] = "true" if is_valid else "false"
|
|
317
277
|
|
|
318
278
|
if self.config.verbose_logging:
|
|
319
279
|
logger.debug(f"Enhanced version context generated: {version_context}")
|
|
@@ -323,21 +283,11 @@ class TemplateProcessor:
|
|
|
323
283
|
# Use fallback version with comprehensive formatting
|
|
324
284
|
fallback_version = self.config.version_fallback
|
|
325
285
|
version_context["MOAI_VERSION"] = fallback_version
|
|
326
|
-
version_context["MOAI_VERSION_SHORT"] = self._format_short_version(
|
|
327
|
-
|
|
328
|
-
)
|
|
329
|
-
version_context["
|
|
330
|
-
|
|
331
|
-
)
|
|
332
|
-
version_context["MOAI_VERSION_TRIMMED"] = self._format_trimmed_version(
|
|
333
|
-
fallback_version, max_length=10
|
|
334
|
-
)
|
|
335
|
-
version_context["MOAI_VERSION_SEMVER"] = self._format_semver_version(
|
|
336
|
-
fallback_version
|
|
337
|
-
)
|
|
338
|
-
version_context["MOAI_VERSION_VALID"] = (
|
|
339
|
-
"false" if fallback_version == "unknown" else "true"
|
|
340
|
-
)
|
|
286
|
+
version_context["MOAI_VERSION_SHORT"] = self._format_short_version(fallback_version)
|
|
287
|
+
version_context["MOAI_VERSION_DISPLAY"] = self._format_display_version(fallback_version)
|
|
288
|
+
version_context["MOAI_VERSION_TRIMMED"] = self._format_trimmed_version(fallback_version, max_length=10)
|
|
289
|
+
version_context["MOAI_VERSION_SEMVER"] = self._format_semver_version(fallback_version)
|
|
290
|
+
version_context["MOAI_VERSION_VALID"] = "false" if fallback_version == "unknown" else "true"
|
|
341
291
|
version_context["MOAI_VERSION_SOURCE"] = "fallback_config"
|
|
342
292
|
version_context["MOAI_VERSION_CACHE_AGE"] = "unavailable"
|
|
343
293
|
version_context["MOAI_VERSION_FORMAT_VALID"] = "false"
|
|
@@ -466,14 +416,6 @@ class TemplateProcessor:
|
|
|
466
416
|
package_root = current_file.parent.parent.parent
|
|
467
417
|
return package_root / "templates"
|
|
468
418
|
|
|
469
|
-
def set_context(self, context: dict[str, str]) -> None:
|
|
470
|
-
"""Set variable substitution context.
|
|
471
|
-
|
|
472
|
-
Args:
|
|
473
|
-
context: Dictionary of template variables.
|
|
474
|
-
"""
|
|
475
|
-
self.context = context
|
|
476
|
-
|
|
477
419
|
def _substitute_variables(self, content: str) -> tuple[str, list[str]]:
|
|
478
420
|
"""
|
|
479
421
|
Substitute template variables in content with enhanced validation and caching.
|
|
@@ -503,9 +445,7 @@ class TemplateProcessor:
|
|
|
503
445
|
if self.config.validate_template_variables:
|
|
504
446
|
# Validate variable before substitution
|
|
505
447
|
if not self._is_valid_template_variable(key, value):
|
|
506
|
-
warnings.append(
|
|
507
|
-
f"Invalid variable {key} - skipped substitution"
|
|
508
|
-
)
|
|
448
|
+
warnings.append(f"Invalid variable {key} - skipped substitution")
|
|
509
449
|
continue
|
|
510
450
|
|
|
511
451
|
safe_value = self._sanitize_value(value)
|
|
@@ -527,17 +467,13 @@ class TemplateProcessor:
|
|
|
527
467
|
suggestion = self.COMMON_TEMPLATE_VARIABLES[var]
|
|
528
468
|
warning_parts.append(f"{{{{{var}}}}} → {suggestion}")
|
|
529
469
|
else:
|
|
530
|
-
warning_parts.append(
|
|
531
|
-
f"{{{{{var}}}}} → Unknown variable (check template)"
|
|
532
|
-
)
|
|
470
|
+
warning_parts.append(f"{{{{{var}}}}} → Unknown variable (check template)")
|
|
533
471
|
|
|
534
472
|
warnings.append("Template variables not substituted:")
|
|
535
473
|
warnings.extend(f" • {part}" for part in warning_parts)
|
|
536
474
|
|
|
537
475
|
if self.config.enable_substitution_warnings:
|
|
538
|
-
warnings.append(
|
|
539
|
-
"💡 Run 'uv run moai-adk update' to fix template variables"
|
|
540
|
-
)
|
|
476
|
+
warnings.append("💡 Run 'uv run moai-adk update' to fix template variables")
|
|
541
477
|
|
|
542
478
|
# Add performance information if verbose logging is enabled
|
|
543
479
|
if self.config.verbose_logging:
|
|
@@ -668,7 +604,7 @@ class TemplateProcessor:
|
|
|
668
604
|
Returns:
|
|
669
605
|
Content with localized descriptions.
|
|
670
606
|
"""
|
|
671
|
-
import yaml
|
|
607
|
+
import yaml # type: ignore[import-untyped]
|
|
672
608
|
|
|
673
609
|
# Pattern to match YAML frontmatter
|
|
674
610
|
frontmatter_pattern = r"^---\n(.*?)\n---"
|
|
@@ -712,6 +648,8 @@ class TemplateProcessor:
|
|
|
712
648
|
Returns:
|
|
713
649
|
List of warnings.
|
|
714
650
|
"""
|
|
651
|
+
import stat
|
|
652
|
+
|
|
715
653
|
warnings = []
|
|
716
654
|
|
|
717
655
|
# Text files: read, substitute, write
|
|
@@ -721,9 +659,7 @@ class TemplateProcessor:
|
|
|
721
659
|
content, file_warnings = self._substitute_variables(content)
|
|
722
660
|
|
|
723
661
|
# Apply description localization for command/output-style files
|
|
724
|
-
if src.suffix == ".md" and (
|
|
725
|
-
"commands/alfred" in str(src) or "output-styles/alfred" in str(src)
|
|
726
|
-
):
|
|
662
|
+
if src.suffix == ".md" and ("commands/alfred" in str(src) or "output-styles/alfred" in str(src)):
|
|
727
663
|
lang = self.context.get("CONVERSATION_LANGUAGE", "en")
|
|
728
664
|
content = self._localize_yaml_description(content, lang)
|
|
729
665
|
|
|
@@ -736,6 +672,12 @@ class TemplateProcessor:
|
|
|
736
672
|
# Binary file or no context: simple copy
|
|
737
673
|
shutil.copy2(src, dst)
|
|
738
674
|
|
|
675
|
+
# Ensure executable permission for shell scripts
|
|
676
|
+
if src.suffix == ".sh":
|
|
677
|
+
# Always make shell scripts executable regardless of source permissions
|
|
678
|
+
dst_mode = dst.stat().st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
|
|
679
|
+
dst.chmod(dst_mode)
|
|
680
|
+
|
|
739
681
|
return warnings
|
|
740
682
|
|
|
741
683
|
def _copy_dir_with_substitution(self, src: Path, dst: Path) -> None:
|
|
@@ -781,6 +723,7 @@ class TemplateProcessor:
|
|
|
781
723
|
self._copy_github(silent)
|
|
782
724
|
self._copy_claude_md(silent)
|
|
783
725
|
self._copy_gitignore(silent)
|
|
726
|
+
self._copy_mcp_json(silent)
|
|
784
727
|
|
|
785
728
|
if not silent:
|
|
786
729
|
console.print("✅ Templates copied successfully")
|
|
@@ -849,16 +792,21 @@ class TemplateProcessor:
|
|
|
849
792
|
# Create .claude directory if not exists
|
|
850
793
|
dst.mkdir(parents=True, exist_ok=True)
|
|
851
794
|
|
|
852
|
-
# Alfred folders to copy wholesale (overwrite)
|
|
853
|
-
|
|
795
|
+
# Alfred and Moai folders to copy wholesale (overwrite)
|
|
796
|
+
# Including both legacy alfred/ and new moai/ structure
|
|
797
|
+
alfred_moai_folders = [
|
|
854
798
|
"hooks/alfred",
|
|
799
|
+
"hooks/moai",
|
|
855
800
|
"commands/alfred", # Contains 0-project.md, 1-plan.md, 2-run.md, 3-sync.md
|
|
856
|
-
"
|
|
801
|
+
"commands/moai",
|
|
802
|
+
"output-styles/moai",
|
|
857
803
|
"agents/alfred",
|
|
804
|
+
"agents/moai",
|
|
805
|
+
# NOTE: "skills" handled by _sync_skills_selective() to preserve custom skills
|
|
858
806
|
]
|
|
859
807
|
|
|
860
|
-
# 1. Copy Alfred folders wholesale (backup before delete & overwrite)
|
|
861
|
-
for folder in
|
|
808
|
+
# 1. Copy Alfred and Moai folders wholesale (backup before delete & overwrite)
|
|
809
|
+
for folder in alfred_moai_folders:
|
|
862
810
|
src_folder = src / folder
|
|
863
811
|
dst_folder = dst / folder
|
|
864
812
|
|
|
@@ -873,18 +821,51 @@ class TemplateProcessor:
|
|
|
873
821
|
if not silent:
|
|
874
822
|
console.print(f" ✅ .claude/{folder}/ overwritten")
|
|
875
823
|
|
|
876
|
-
#
|
|
824
|
+
# 1.5 Copy other subdirectories in parent folders (e.g., output-styles/moai, hooks/shared)
|
|
825
|
+
# This ensures non-alfred subdirectories are also copied
|
|
826
|
+
parent_folders_with_subdirs = ["output-styles", "hooks", "commands", "agents"]
|
|
827
|
+
for parent_name in parent_folders_with_subdirs:
|
|
828
|
+
src_parent = src / parent_name
|
|
829
|
+
if not src_parent.exists():
|
|
830
|
+
continue
|
|
831
|
+
|
|
832
|
+
for subdir in src_parent.iterdir():
|
|
833
|
+
if not subdir.is_dir():
|
|
834
|
+
continue
|
|
835
|
+
|
|
836
|
+
# Skip alfred subdirectories (already handled above)
|
|
837
|
+
if subdir.name == "alfred":
|
|
838
|
+
continue
|
|
839
|
+
|
|
840
|
+
rel_subdir = f"{parent_name}/{subdir.name}"
|
|
841
|
+
dst_subdir = dst / parent_name / subdir.name
|
|
842
|
+
|
|
843
|
+
if dst_subdir.exists():
|
|
844
|
+
# For non-alfred directories, overwrite with merge if necessary
|
|
845
|
+
shutil.rmtree(dst_subdir)
|
|
846
|
+
|
|
847
|
+
# Copy the subdirectory
|
|
848
|
+
shutil.copytree(subdir, dst_subdir)
|
|
849
|
+
if not silent:
|
|
850
|
+
console.print(f" ✅ .claude/{rel_subdir}/ copied")
|
|
851
|
+
|
|
852
|
+
# 1.6 Sync skills selectively (preserve custom skills, update moai-* skills)
|
|
853
|
+
self._sync_skills_selective(src, dst, silent)
|
|
854
|
+
|
|
855
|
+
# 2. Copy other files/folders individually (smart merge for settings.json and config.json)
|
|
877
856
|
all_warnings = []
|
|
878
857
|
for item in src.iterdir():
|
|
879
858
|
rel_path = item.relative_to(src)
|
|
880
859
|
dst_item = dst / rel_path
|
|
881
860
|
|
|
882
861
|
# Skip Alfred parent folders (already handled above)
|
|
862
|
+
# Also skip "skills" - handled by _sync_skills_selective()
|
|
883
863
|
if item.is_dir() and item.name in [
|
|
884
864
|
"hooks",
|
|
885
865
|
"commands",
|
|
886
866
|
"output-styles",
|
|
887
867
|
"agents",
|
|
868
|
+
"skills", # Handled by _sync_skills_selective() to preserve custom skills
|
|
888
869
|
]:
|
|
889
870
|
continue
|
|
890
871
|
|
|
@@ -899,9 +880,12 @@ class TemplateProcessor:
|
|
|
899
880
|
dst_item.write_text(content, encoding="utf-8")
|
|
900
881
|
all_warnings.extend(file_warnings)
|
|
901
882
|
if not silent:
|
|
902
|
-
console.print(
|
|
903
|
-
|
|
904
|
-
|
|
883
|
+
console.print(" 🔄 settings.json merged (Hook paths configured for your OS)")
|
|
884
|
+
# Smart merge for config.json
|
|
885
|
+
elif item.name == "config.json":
|
|
886
|
+
self._merge_config_json(item, dst_item)
|
|
887
|
+
if not silent:
|
|
888
|
+
console.print(" 🔄 config.json merged (user preferences preserved)")
|
|
905
889
|
else:
|
|
906
890
|
# FORCE OVERWRITE: Always copy other files (no skip)
|
|
907
891
|
warnings = self._copy_file_with_substitution(item, dst_item)
|
|
@@ -919,6 +903,54 @@ class TemplateProcessor:
|
|
|
919
903
|
if not silent:
|
|
920
904
|
console.print(" ✅ .claude/ copy complete (variables substituted)")
|
|
921
905
|
|
|
906
|
+
def _sync_skills_selective(self, src: Path, dst: Path, silent: bool = False) -> None:
|
|
907
|
+
"""Sync only moai-* template skills, preserve custom skills.
|
|
908
|
+
|
|
909
|
+
This method ensures that:
|
|
910
|
+
- Template skills (moai-* prefix) are updated from source
|
|
911
|
+
- Custom skills (any other prefix) are preserved untouched
|
|
912
|
+
|
|
913
|
+
Args:
|
|
914
|
+
src: Source .claude directory from template
|
|
915
|
+
dst: Destination .claude directory in project
|
|
916
|
+
silent: Suppress console output if True
|
|
917
|
+
"""
|
|
918
|
+
skills_src = src / "skills"
|
|
919
|
+
skills_dst = dst / "skills"
|
|
920
|
+
|
|
921
|
+
if not skills_src.exists():
|
|
922
|
+
return
|
|
923
|
+
|
|
924
|
+
skills_dst.mkdir(parents=True, exist_ok=True)
|
|
925
|
+
|
|
926
|
+
# Step 1: Identify template skills in source (moai-* prefix)
|
|
927
|
+
template_skills = {d.name for d in skills_src.iterdir() if d.is_dir() and d.name.startswith("moai-")}
|
|
928
|
+
|
|
929
|
+
# Step 2: Delete only template skills in destination
|
|
930
|
+
if skills_dst.exists():
|
|
931
|
+
for skill_dir in list(skills_dst.iterdir()):
|
|
932
|
+
if skill_dir.is_dir() and skill_dir.name.startswith("moai-"):
|
|
933
|
+
shutil.rmtree(skill_dir)
|
|
934
|
+
if not silent:
|
|
935
|
+
console.print(f" [dim]Updating template skill: {skill_dir.name}[/dim]")
|
|
936
|
+
|
|
937
|
+
# Step 3: Copy template skills from source
|
|
938
|
+
for skill_name in sorted(template_skills):
|
|
939
|
+
src_skill = skills_src / skill_name
|
|
940
|
+
dst_skill = skills_dst / skill_name
|
|
941
|
+
shutil.copytree(src_skill, dst_skill)
|
|
942
|
+
|
|
943
|
+
if not silent and template_skills:
|
|
944
|
+
console.print(f" ✅ Synced {len(template_skills)} template skill(s)")
|
|
945
|
+
|
|
946
|
+
# Step 4: Report preserved custom skills
|
|
947
|
+
if skills_dst.exists():
|
|
948
|
+
custom_skills = [d.name for d in skills_dst.iterdir() if d.is_dir() and not d.name.startswith("moai-")]
|
|
949
|
+
if custom_skills and not silent:
|
|
950
|
+
preview = ", ".join(sorted(custom_skills)[:3])
|
|
951
|
+
suffix = "..." if len(custom_skills) > 3 else ""
|
|
952
|
+
console.print(f" ✅ Preserved {len(custom_skills)} custom skill(s): {preview}{suffix}")
|
|
953
|
+
|
|
922
954
|
def _copy_moai(self, silent: bool = False) -> None:
|
|
923
955
|
""".moai/ directory copy with variable substitution (excludes protected paths)."""
|
|
924
956
|
src = self.template_root / ".moai"
|
|
@@ -929,11 +961,11 @@ class TemplateProcessor:
|
|
|
929
961
|
console.print("⚠️ .moai/ template not found")
|
|
930
962
|
return
|
|
931
963
|
|
|
932
|
-
# Paths excluded from template copying (specs/, reports/,
|
|
964
|
+
# Paths excluded from template copying (specs/, reports/, sections/)
|
|
933
965
|
template_protected_paths = [
|
|
934
966
|
"specs",
|
|
935
967
|
"reports",
|
|
936
|
-
"
|
|
968
|
+
"config/sections", # User section YAML files
|
|
937
969
|
]
|
|
938
970
|
|
|
939
971
|
all_warnings = []
|
|
@@ -984,12 +1016,10 @@ class TemplateProcessor:
|
|
|
984
1016
|
self._copy_dir_with_substitution(src, dst)
|
|
985
1017
|
|
|
986
1018
|
if not silent:
|
|
987
|
-
console.print(
|
|
988
|
-
" 🔄 .github/ merged (user workflows preserved, variables substituted)"
|
|
989
|
-
)
|
|
1019
|
+
console.print(" 🔄 .github/ merged (user workflows preserved, variables substituted)")
|
|
990
1020
|
|
|
991
1021
|
def _copy_claude_md(self, silent: bool = False) -> None:
|
|
992
|
-
"""Copy CLAUDE.md with
|
|
1022
|
+
"""Copy CLAUDE.md with complete replacement (no merge)."""
|
|
993
1023
|
src = self.template_root / "CLAUDE.md"
|
|
994
1024
|
dst = self.target_path / "CLAUDE.md"
|
|
995
1025
|
|
|
@@ -998,27 +1028,11 @@ class TemplateProcessor:
|
|
|
998
1028
|
console.print("⚠️ CLAUDE.md template not found")
|
|
999
1029
|
return
|
|
1000
1030
|
|
|
1001
|
-
#
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
content = dst.read_text(encoding="utf-8")
|
|
1007
|
-
content, warnings = self._substitute_variables(content)
|
|
1008
|
-
dst.write_text(content, encoding="utf-8")
|
|
1009
|
-
if warnings and not silent:
|
|
1010
|
-
console.print("[yellow]⚠️ Template warnings:[/yellow]")
|
|
1011
|
-
for warning in set(warnings):
|
|
1012
|
-
console.print(f" {warning}")
|
|
1013
|
-
if not silent:
|
|
1014
|
-
console.print(
|
|
1015
|
-
" 🔄 CLAUDE.md merged (project information preserved, variables substituted)"
|
|
1016
|
-
)
|
|
1017
|
-
else:
|
|
1018
|
-
# First time: just copy
|
|
1019
|
-
self._copy_file_with_substitution(src, dst)
|
|
1020
|
-
if not silent:
|
|
1021
|
-
console.print(" ✅ CLAUDE.md created")
|
|
1031
|
+
# Simple copy with substitution (no merge)
|
|
1032
|
+
self._copy_file_with_substitution(src, dst)
|
|
1033
|
+
|
|
1034
|
+
if not silent:
|
|
1035
|
+
console.print(" ✅ CLAUDE.md replaced (use CLAUDE.local.md for personal instructions)")
|
|
1022
1036
|
|
|
1023
1037
|
def _merge_claude_md(self, src: Path, dst: Path) -> None:
|
|
1024
1038
|
"""Delegate the smart merge for CLAUDE.md.
|
|
@@ -1047,15 +1061,199 @@ class TemplateProcessor:
|
|
|
1047
1061
|
"""
|
|
1048
1062
|
# Find the latest backup for user settings extraction
|
|
1049
1063
|
backup_path = None
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
backup_path = backup_settings
|
|
1064
|
+
latest_backup = self.backup.get_latest_backup()
|
|
1065
|
+
if latest_backup:
|
|
1066
|
+
backup_settings = latest_backup / ".claude" / "settings.json"
|
|
1067
|
+
if backup_settings.exists():
|
|
1068
|
+
backup_path = backup_settings
|
|
1056
1069
|
|
|
1057
1070
|
self.merger.merge_settings_json(src, dst, backup_path)
|
|
1058
1071
|
|
|
1072
|
+
def _merge_config_json(self, src: Path, dst: Path) -> None:
|
|
1073
|
+
"""Smart merge for config using section YAML files with JSON fallback.
|
|
1074
|
+
|
|
1075
|
+
Supports both new section-based YAML files and legacy config.json.
|
|
1076
|
+
Priority: Section YAML files > config.json fallback
|
|
1077
|
+
|
|
1078
|
+
Args:
|
|
1079
|
+
src: Template config file (config.json for legacy projects).
|
|
1080
|
+
dst: Project config file destination.
|
|
1081
|
+
"""
|
|
1082
|
+
import json
|
|
1083
|
+
import os
|
|
1084
|
+
|
|
1085
|
+
try:
|
|
1086
|
+
import yaml # noqa: F401
|
|
1087
|
+
|
|
1088
|
+
yaml_available = True
|
|
1089
|
+
except ImportError:
|
|
1090
|
+
yaml_available = False
|
|
1091
|
+
|
|
1092
|
+
# Check for section-based YAML configuration (new approach)
|
|
1093
|
+
sections_dir = self.target_path / ".moai" / "config" / "sections"
|
|
1094
|
+
|
|
1095
|
+
if yaml_available and sections_dir.exists() and sections_dir.is_dir():
|
|
1096
|
+
# Use section YAML files - merge each section individually
|
|
1097
|
+
self._merge_section_yaml_files(sections_dir)
|
|
1098
|
+
return
|
|
1099
|
+
|
|
1100
|
+
# Fallback to legacy config.json merging
|
|
1101
|
+
# Load template config
|
|
1102
|
+
try:
|
|
1103
|
+
template_config = json.loads(src.read_text(encoding="utf-8"))
|
|
1104
|
+
except (json.JSONDecodeError, FileNotFoundError) as e:
|
|
1105
|
+
console.print(f"⚠️ Warning: Could not read template config.json: {e}")
|
|
1106
|
+
return
|
|
1107
|
+
|
|
1108
|
+
# Find latest backup config.json
|
|
1109
|
+
latest_backup = self.backup.get_latest_backup()
|
|
1110
|
+
if latest_backup:
|
|
1111
|
+
backup_config_path = latest_backup / ".moai" / "config" / "config.json"
|
|
1112
|
+
if backup_config_path.exists():
|
|
1113
|
+
try:
|
|
1114
|
+
json.loads(backup_config_path.read_text(encoding="utf-8"))
|
|
1115
|
+
except json.JSONDecodeError as e:
|
|
1116
|
+
console.print(f"⚠️ Warning: Could not read backup config.json: {e}")
|
|
1117
|
+
|
|
1118
|
+
# Load existing project config.json
|
|
1119
|
+
existing_config = {}
|
|
1120
|
+
if dst.exists():
|
|
1121
|
+
try:
|
|
1122
|
+
existing_config = json.loads(dst.read_text(encoding="utf-8"))
|
|
1123
|
+
except json.JSONDecodeError as e:
|
|
1124
|
+
console.print(f"⚠️ Warning: Could not read existing config.json: {e}")
|
|
1125
|
+
|
|
1126
|
+
# Merge with priority system: Environment > Existing User > Template
|
|
1127
|
+
# We'll use LanguageConfigResolver to handle this properly
|
|
1128
|
+
try:
|
|
1129
|
+
# Import LanguageConfigResolver for priority-based merging
|
|
1130
|
+
from moai_adk.core.language_config_resolver import LanguageConfigResolver
|
|
1131
|
+
|
|
1132
|
+
# Create temporary resolver to handle merging
|
|
1133
|
+
temp_project_path = self.target_path / ".moai" / "config"
|
|
1134
|
+
temp_project_path.mkdir(parents=True, exist_ok=True)
|
|
1135
|
+
|
|
1136
|
+
# Start with template config as base
|
|
1137
|
+
merged_config = template_config.copy()
|
|
1138
|
+
|
|
1139
|
+
# Apply existing user config (higher priority than template)
|
|
1140
|
+
for key, value in existing_config.items():
|
|
1141
|
+
if key not in ["config_source"]: # Skip metadata
|
|
1142
|
+
if key in merged_config and isinstance(merged_config[key], dict) and isinstance(value, dict):
|
|
1143
|
+
# Deep merge for nested objects
|
|
1144
|
+
merged_config[key].update(value)
|
|
1145
|
+
else:
|
|
1146
|
+
merged_config[key] = value
|
|
1147
|
+
|
|
1148
|
+
# Apply environment variables (highest priority)
|
|
1149
|
+
env_mappings = {
|
|
1150
|
+
"MOAI_USER_NAME": ("user", "name"),
|
|
1151
|
+
"MOAI_CONVERSATION_LANG": ("language", "conversation_language"),
|
|
1152
|
+
"MOAI_AGENT_PROMPT_LANG": ("language", "agent_prompt_language"),
|
|
1153
|
+
"MOAI_CONVERSATION_LANG_NAME": (
|
|
1154
|
+
"language",
|
|
1155
|
+
"conversation_language_name",
|
|
1156
|
+
),
|
|
1157
|
+
"MOAI_GIT_COMMIT_MESSAGES_LANG": ("language", "git_commit_messages"),
|
|
1158
|
+
"MOAI_CODE_COMMENTS_LANG": ("language", "code_comments"),
|
|
1159
|
+
"MOAI_DOCUMENTATION_LANG": ("language", "documentation"),
|
|
1160
|
+
"MOAI_ERROR_MESSAGES_LANG": ("language", "error_messages"),
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
for env_var, (section, key) in env_mappings.items():
|
|
1164
|
+
env_value = os.getenv(env_var)
|
|
1165
|
+
if env_value:
|
|
1166
|
+
if section not in merged_config:
|
|
1167
|
+
merged_config[section] = {}
|
|
1168
|
+
merged_config[section][key] = env_value
|
|
1169
|
+
|
|
1170
|
+
# Ensure consistency
|
|
1171
|
+
resolver = LanguageConfigResolver(str(self.target_path))
|
|
1172
|
+
merged_config = resolver._ensure_consistency(merged_config)
|
|
1173
|
+
|
|
1174
|
+
# Write merged config
|
|
1175
|
+
dst.write_text(
|
|
1176
|
+
json.dumps(merged_config, indent=2, ensure_ascii=False) + "\n",
|
|
1177
|
+
encoding="utf-8",
|
|
1178
|
+
)
|
|
1179
|
+
|
|
1180
|
+
except ImportError:
|
|
1181
|
+
# Fallback: simple merge without LanguageConfigResolver
|
|
1182
|
+
merged_config = template_config.copy()
|
|
1183
|
+
|
|
1184
|
+
# Apply existing config
|
|
1185
|
+
for key, value in existing_config.items():
|
|
1186
|
+
if key not in ["config_source"]:
|
|
1187
|
+
merged_config[key] = value
|
|
1188
|
+
|
|
1189
|
+
dst.write_text(
|
|
1190
|
+
json.dumps(merged_config, indent=2, ensure_ascii=False) + "\n",
|
|
1191
|
+
encoding="utf-8",
|
|
1192
|
+
)
|
|
1193
|
+
console.print(" ⚠️ Warning: Using simple merge (LanguageConfigResolver not available)")
|
|
1194
|
+
|
|
1195
|
+
def _merge_section_yaml_files(self, sections_dir: Path) -> None:
|
|
1196
|
+
"""Merge section YAML files with user-specific values preserved.
|
|
1197
|
+
|
|
1198
|
+
Args:
|
|
1199
|
+
sections_dir: Path to sections directory (.moai/config/sections/)
|
|
1200
|
+
"""
|
|
1201
|
+
import os
|
|
1202
|
+
|
|
1203
|
+
try:
|
|
1204
|
+
import yaml
|
|
1205
|
+
except ImportError:
|
|
1206
|
+
console.print("⚠️ Warning: PyYAML not available, skipping section merge")
|
|
1207
|
+
return
|
|
1208
|
+
|
|
1209
|
+
# Environment variable mappings for each section
|
|
1210
|
+
env_mappings = {
|
|
1211
|
+
"language.yaml": {
|
|
1212
|
+
"MOAI_CONVERSATION_LANG": ["language", "conversation_language"],
|
|
1213
|
+
"MOAI_AGENT_PROMPT_LANG": ["language", "agent_prompt_language"],
|
|
1214
|
+
"MOAI_CONVERSATION_LANG_NAME": ["language", "conversation_language_name"],
|
|
1215
|
+
"MOAI_GIT_COMMIT_MESSAGES_LANG": ["language", "git_commit_messages"],
|
|
1216
|
+
"MOAI_CODE_COMMENTS_LANG": ["language", "code_comments"],
|
|
1217
|
+
"MOAI_DOCUMENTATION_LANG": ["language", "documentation"],
|
|
1218
|
+
"MOAI_ERROR_MESSAGES_LANG": ["language", "error_messages"],
|
|
1219
|
+
},
|
|
1220
|
+
"user.yaml": {
|
|
1221
|
+
"MOAI_USER_NAME": ["user", "name"],
|
|
1222
|
+
},
|
|
1223
|
+
}
|
|
1224
|
+
|
|
1225
|
+
for section_file in sections_dir.glob("*.yaml"):
|
|
1226
|
+
try:
|
|
1227
|
+
# Read existing section content
|
|
1228
|
+
with open(section_file, "r", encoding="utf-8") as f:
|
|
1229
|
+
section_data = yaml.safe_load(f) or {}
|
|
1230
|
+
|
|
1231
|
+
# Apply environment variable overrides if applicable
|
|
1232
|
+
if section_file.name in env_mappings:
|
|
1233
|
+
for env_var, path in env_mappings[section_file.name].items():
|
|
1234
|
+
env_value = os.getenv(env_var)
|
|
1235
|
+
if env_value:
|
|
1236
|
+
# Navigate to the correct nested location
|
|
1237
|
+
current = section_data
|
|
1238
|
+
for key in path[:-1]:
|
|
1239
|
+
if key not in current:
|
|
1240
|
+
current[key] = {}
|
|
1241
|
+
current = current[key]
|
|
1242
|
+
current[path[-1]] = env_value
|
|
1243
|
+
|
|
1244
|
+
# Write back if environment variables were applied
|
|
1245
|
+
with open(section_file, "w", encoding="utf-8") as f:
|
|
1246
|
+
yaml.safe_dump(
|
|
1247
|
+
section_data,
|
|
1248
|
+
f,
|
|
1249
|
+
default_flow_style=False,
|
|
1250
|
+
allow_unicode=True,
|
|
1251
|
+
sort_keys=False,
|
|
1252
|
+
)
|
|
1253
|
+
|
|
1254
|
+
except Exception as e:
|
|
1255
|
+
console.print(f"⚠️ Warning: Failed to merge {section_file.name}: {e}")
|
|
1256
|
+
|
|
1059
1257
|
def _copy_gitignore(self, silent: bool = False) -> None:
|
|
1060
1258
|
""".gitignore copy (optional)."""
|
|
1061
1259
|
src = self.template_root / ".gitignore"
|
|
@@ -1083,6 +1281,47 @@ class TemplateProcessor:
|
|
|
1083
1281
|
"""
|
|
1084
1282
|
self.merger.merge_gitignore(src, dst)
|
|
1085
1283
|
|
|
1284
|
+
def _copy_mcp_json(self, silent: bool = False) -> None:
|
|
1285
|
+
""".mcp.json copy (smart merge with existing MCP server configuration)."""
|
|
1286
|
+
src = self.template_root / ".mcp.json"
|
|
1287
|
+
dst = self.target_path / ".mcp.json"
|
|
1288
|
+
|
|
1289
|
+
if not src.exists():
|
|
1290
|
+
return
|
|
1291
|
+
|
|
1292
|
+
# Merge with existing .mcp.json when present (preserve user-added MCP servers)
|
|
1293
|
+
if dst.exists():
|
|
1294
|
+
self._merge_mcp_json(src, dst)
|
|
1295
|
+
if not silent:
|
|
1296
|
+
console.print(" 🔄 .mcp.json merged (user MCP servers preserved)")
|
|
1297
|
+
else:
|
|
1298
|
+
shutil.copy2(src, dst)
|
|
1299
|
+
if not silent:
|
|
1300
|
+
console.print(" ✅ .mcp.json copy complete")
|
|
1301
|
+
|
|
1302
|
+
def _merge_mcp_json(self, src: Path, dst: Path) -> None:
|
|
1303
|
+
"""Smart merge for .mcp.json (preserve user-added MCP servers).
|
|
1304
|
+
|
|
1305
|
+
Args:
|
|
1306
|
+
src: Template .mcp.json.
|
|
1307
|
+
dst: Project .mcp.json.
|
|
1308
|
+
"""
|
|
1309
|
+
try:
|
|
1310
|
+
src_data = json.loads(src.read_text(encoding="utf-8"))
|
|
1311
|
+
dst_data = json.loads(dst.read_text(encoding="utf-8"))
|
|
1312
|
+
|
|
1313
|
+
# Merge mcpServers: preserve user servers, update template servers
|
|
1314
|
+
if "mcpServers" in src_data:
|
|
1315
|
+
if "mcpServers" not in dst_data:
|
|
1316
|
+
dst_data["mcpServers"] = {}
|
|
1317
|
+
# Update with template servers (preserves existing user servers)
|
|
1318
|
+
dst_data["mcpServers"].update(src_data["mcpServers"])
|
|
1319
|
+
|
|
1320
|
+
# Write merged result back
|
|
1321
|
+
dst.write_text(json.dumps(dst_data, indent=2, ensure_ascii=False), encoding="utf-8")
|
|
1322
|
+
except json.JSONDecodeError as e:
|
|
1323
|
+
console.print(f"[yellow]⚠️ Failed to merge .mcp.json: {e}[/yellow]")
|
|
1324
|
+
|
|
1086
1325
|
def merge_config(self, detected_language: str | None = None) -> dict[str, str]:
|
|
1087
1326
|
"""Delegate the smart merge for config.json.
|
|
1088
1327
|
|