moai-adk 0.35.1__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 +10 -0
- moai_adk/__main__.py +199 -0
- moai_adk/cli/__init__.py +6 -0
- moai_adk/cli/commands/__init__.py +17 -0
- moai_adk/cli/commands/analyze.py +116 -0
- moai_adk/cli/commands/doctor.py +272 -0
- moai_adk/cli/commands/init.py +372 -0
- moai_adk/cli/commands/language.py +248 -0
- moai_adk/cli/commands/status.py +104 -0
- moai_adk/cli/commands/update.py +2686 -0
- moai_adk/cli/main.py +13 -0
- moai_adk/cli/prompts/__init__.py +5 -0
- moai_adk/cli/prompts/init_prompts.py +219 -0
- 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/__init__.py +1 -0
- 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 +19 -0
- moai_adk/core/config/auto_spec_config.py +340 -0
- moai_adk/core/config/migration.py +244 -0
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +273 -0
- moai_adk/core/diagnostics/__init__.py +19 -0
- moai_adk/core/diagnostics/slash_commands.py +159 -0
- 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 +31 -0
- moai_adk/core/git/branch.py +25 -0
- moai_adk/core/git/branch_manager.py +129 -0
- moai_adk/core/git/checkpoint.py +134 -0
- moai_adk/core/git/commit.py +67 -0
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/event_detector.py +79 -0
- moai_adk/core/git/manager.py +216 -0
- 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 +305 -0
- 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 +572 -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 +605 -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 +1 -0
- moai_adk/core/project/backup_utils.py +70 -0
- moai_adk/core/project/checker.py +300 -0
- moai_adk/core/project/detector.py +293 -0
- moai_adk/core/project/initializer.py +387 -0
- moai_adk/core/project/phase_executor.py +716 -0
- moai_adk/core/project/validator.py +139 -0
- moai_adk/core/quality/__init__.py +6 -0
- moai_adk/core/quality/trust_checker.py +377 -0
- moai_adk/core/quality/validators/__init__.py +6 -0
- moai_adk/core/quality/validators/base_validator.py +19 -0
- 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 +7 -0
- moai_adk/core/template/backup.py +174 -0
- moai_adk/core/template/config.py +191 -0
- moai_adk/core/template/languages.py +43 -0
- moai_adk/core/template/merger.py +233 -0
- moai_adk/core/template/processor.py +1200 -0
- moai_adk/core/template_engine.py +310 -0
- 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 +376 -0
- moai_adk/statusline/enhanced_output_style_detector.py +372 -0
- moai_adk/statusline/git_collector.py +190 -0
- moai_adk/statusline/main.py +322 -0
- moai_adk/statusline/metrics_tracker.py +78 -0
- moai_adk/statusline/renderer.py +343 -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 +714 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +474 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1172 -0
- moai_adk/templates/.claude/agents/moai/builder-plugin.md +637 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +899 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +777 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +401 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +720 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +734 -0
- moai_adk/templates/.claude/agents/moai/expert-performance.md +657 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +513 -0
- moai_adk/templates/.claude/agents/moai/expert-testing.md +733 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1041 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +432 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +573 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +1060 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +624 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +809 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +780 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +784 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +458 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1607 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +789 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +469 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +1032 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1386 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1427 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +943 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +1324 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
- moai_adk/templates/.claude/hooks/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
- moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
- moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
- moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +1083 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +560 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +359 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +307 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -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 +249 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +406 -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-docs-generation/reference.md +328 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +320 -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 +323 -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 +497 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +968 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +664 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +455 -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 +492 -0
- moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -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-formats-data/reference.md +585 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +202 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -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-claude/reference.md +209 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +441 -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 +420 -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-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-core/reference.md +478 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +315 -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 +364 -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 +649 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +478 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +612 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +477 -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 +376 -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 +385 -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-kotlin/SKILL.md +382 -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 +644 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +481 -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 +579 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +687 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +372 -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 +497 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +633 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +423 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +918 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +672 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +368 -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 +300 -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 +319 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -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 +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-nextra/reference.md +379 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +372 -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-mcp-figma/SKILL.md +402 -0
- moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +607 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +300 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +537 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +291 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +390 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +398 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +379 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +358 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +467 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +466 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +482 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/SKILL.md +474 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/examples.md +621 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/migration.md +341 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/reference.md +463 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/validation.md +373 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/SKILL.md +275 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/adaptive-mfa.md +233 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/akamai-integration.md +215 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/application-credentials.md +280 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-log-events.md +225 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-overview.md +140 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/bot-detection.md +144 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/breached-password-detection.md +187 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/brute-force-protection.md +189 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/certifications.md +282 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/compliance-overview.md +263 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/continuous-session-protection.md +307 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/customize-mfa.md +178 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/dpop-implementation.md +283 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/fapi-implementation.md +259 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/gdpr-compliance.md +313 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/guardian-configuration.md +269 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/highly-regulated-identity.md +272 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/jwt-fundamentals.md +248 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mdl-verification.md +211 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-api-management.md +278 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-factors.md +226 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-overview.md +174 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mtls-sender-constraining.md +316 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/ropg-flow-mfa.md +217 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-center.md +325 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-guidance.md +277 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/state-parameters.md +178 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/step-up-authentication.md +251 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/suspicious-ip-throttling.md +240 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/tenant-access-control.md +180 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/webauthn-fido.md +235 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +449 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/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 +390 -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 +175 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -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/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-project/test_integration_simple.py +436 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +534 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +377 -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 +456 -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/examples.md +672 -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/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-worktree/SKILL.md +411 -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 +365 -0
- 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 +337 -0
- moai_adk/templates/.gitignore +222 -0
- moai_adk/templates/.mcp.json +13 -0
- moai_adk/templates/.moai/config/config.yaml +58 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +174 -0
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +251 -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 +182 -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 +17 -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 +642 -0
- moai_adk/utils/__init__.py +30 -0
- moai_adk/utils/banner.py +38 -0
- moai_adk/utils/common.py +294 -0
- moai_adk/utils/link_validator.py +241 -0
- moai_adk/utils/logger.py +147 -0
- moai_adk/utils/safe_file_reader.py +206 -0
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.35.1.dist-info/METADATA +3018 -0
- moai_adk-0.35.1.dist-info/RECORD +502 -0
- moai_adk-0.35.1.dist-info/WHEEL +4 -0
- moai_adk-0.35.1.dist-info/entry_points.txt +3 -0
- moai_adk-0.35.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,716 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
"""Phase-based installation executor (SPEC-INIT-003 v0.4.2)
|
|
3
|
+
|
|
4
|
+
Runs the project initialization across five phases:
|
|
5
|
+
- Phase 1: Preparation (create single backup at .moai-backups/backup/)
|
|
6
|
+
- Phase 2: Directory (build directory structure)
|
|
7
|
+
- Phase 3: Resource (copy templates while preserving user content)
|
|
8
|
+
- Phase 4: Configuration (generate configuration files)
|
|
9
|
+
- Phase 5: Validation (verify and finalize)
|
|
10
|
+
|
|
11
|
+
Test coverage includes 5-phase integration tests with backup, configuration, and validation
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import json
|
|
15
|
+
import logging
|
|
16
|
+
import platform
|
|
17
|
+
import shutil
|
|
18
|
+
import subprocess
|
|
19
|
+
from collections.abc import Callable
|
|
20
|
+
from datetime import datetime
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from typing import Any
|
|
23
|
+
|
|
24
|
+
from rich.console import Console
|
|
25
|
+
|
|
26
|
+
from moai_adk import __version__
|
|
27
|
+
from moai_adk.core.project.backup_utils import (
|
|
28
|
+
get_backup_targets,
|
|
29
|
+
has_any_moai_files,
|
|
30
|
+
is_protected_path,
|
|
31
|
+
)
|
|
32
|
+
from moai_adk.core.project.validator import ProjectValidator
|
|
33
|
+
from moai_adk.core.template.processor import TemplateProcessor
|
|
34
|
+
from moai_adk.statusline.version_reader import VersionConfig, VersionReader
|
|
35
|
+
|
|
36
|
+
console = Console()
|
|
37
|
+
|
|
38
|
+
# Progress callback type alias
|
|
39
|
+
ProgressCallback = Callable[[str, int, int], None]
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class PhaseExecutor:
|
|
43
|
+
"""Execute the installation across the five phases.
|
|
44
|
+
|
|
45
|
+
Phases:
|
|
46
|
+
1. Preparation: Back up and verify the system.
|
|
47
|
+
2. Directory: Create the directory structure.
|
|
48
|
+
3. Resource: Copy template resources.
|
|
49
|
+
4. Configuration: Generate configuration files.
|
|
50
|
+
5. Validation: Perform final checks.
|
|
51
|
+
|
|
52
|
+
Enhanced with improved version reading and context management.
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
# Required directory structure
|
|
56
|
+
REQUIRED_DIRECTORIES = [
|
|
57
|
+
".moai/",
|
|
58
|
+
".moai/project/",
|
|
59
|
+
".moai/specs/",
|
|
60
|
+
".moai/reports/",
|
|
61
|
+
".moai/memory/",
|
|
62
|
+
".claude/",
|
|
63
|
+
".claude/logs/",
|
|
64
|
+
".github/",
|
|
65
|
+
]
|
|
66
|
+
|
|
67
|
+
def __init__(self, validator: ProjectValidator) -> None:
|
|
68
|
+
"""Initialize the executor.
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
validator: Project validation helper.
|
|
72
|
+
"""
|
|
73
|
+
self.validator = validator
|
|
74
|
+
self.total_phases = 5
|
|
75
|
+
self.current_phase = 0
|
|
76
|
+
self._version_reader: VersionReader | None = None
|
|
77
|
+
|
|
78
|
+
def _get_version_reader(self) -> VersionReader:
|
|
79
|
+
"""
|
|
80
|
+
Get or create version reader instance.
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
VersionReader instance with enhanced configuration
|
|
84
|
+
"""
|
|
85
|
+
if self._version_reader is None:
|
|
86
|
+
config = VersionConfig(
|
|
87
|
+
cache_ttl_seconds=120, # Longer cache for phase execution
|
|
88
|
+
fallback_version=__version__,
|
|
89
|
+
version_format_regex=r"^v?(\d+\.\d+\.\d+(-[a-zA-Z0-9]+)?)$",
|
|
90
|
+
cache_enabled=True,
|
|
91
|
+
debug_mode=False,
|
|
92
|
+
)
|
|
93
|
+
self._version_reader = VersionReader(config)
|
|
94
|
+
return self._version_reader
|
|
95
|
+
|
|
96
|
+
def _get_enhanced_version_context(self) -> dict[str, str]:
|
|
97
|
+
"""
|
|
98
|
+
Get enhanced version context with fallback strategies and comprehensive configuration.
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
Dictionary containing version-related template variables with enhanced formatting
|
|
102
|
+
"""
|
|
103
|
+
version_context = {}
|
|
104
|
+
logger = logging.getLogger(__name__)
|
|
105
|
+
|
|
106
|
+
try:
|
|
107
|
+
version_reader = self._get_version_reader()
|
|
108
|
+
moai_version = version_reader.get_version()
|
|
109
|
+
|
|
110
|
+
# Enhanced version context with multiple format options
|
|
111
|
+
version_context["MOAI_VERSION"] = moai_version
|
|
112
|
+
version_context["MOAI_VERSION_SHORT"] = self._format_short_version(moai_version)
|
|
113
|
+
version_context["MOAI_VERSION_DISPLAY"] = self._format_display_version(moai_version)
|
|
114
|
+
version_context["MOAI_VERSION_TRIMMED"] = self._format_trimmed_version(moai_version, max_length=10)
|
|
115
|
+
version_context["MOAI_VERSION_SEMVER"] = self._format_semver_version(moai_version)
|
|
116
|
+
version_context["MOAI_VERSION_VALID"] = "true" if moai_version != "unknown" else "false"
|
|
117
|
+
version_context["MOAI_VERSION_SOURCE"] = self._get_version_source(version_reader)
|
|
118
|
+
|
|
119
|
+
# Add performance metrics for debugging
|
|
120
|
+
cache_age = version_reader.get_cache_age_seconds()
|
|
121
|
+
if cache_age is not None:
|
|
122
|
+
version_context["MOAI_VERSION_CACHE_AGE"] = f"{cache_age:.2f}s"
|
|
123
|
+
else:
|
|
124
|
+
version_context["MOAI_VERSION_CACHE_AGE"] = "uncached"
|
|
125
|
+
|
|
126
|
+
except Exception as e:
|
|
127
|
+
logger.warning(f"Failed to read version for context: {e}")
|
|
128
|
+
# Use fallback version with comprehensive fallback formatting
|
|
129
|
+
fallback_version = __version__
|
|
130
|
+
version_context["MOAI_VERSION"] = fallback_version
|
|
131
|
+
version_context["MOAI_VERSION_SHORT"] = self._format_short_version(fallback_version)
|
|
132
|
+
version_context["MOAI_VERSION_DISPLAY"] = self._format_display_version(fallback_version)
|
|
133
|
+
version_context["MOAI_VERSION_TRIMMED"] = self._format_trimmed_version(fallback_version, max_length=10)
|
|
134
|
+
version_context["MOAI_VERSION_SEMVER"] = self._format_semver_version(fallback_version)
|
|
135
|
+
version_context["MOAI_VERSION_VALID"] = "true"
|
|
136
|
+
version_context["MOAI_VERSION_SOURCE"] = "fallback_package"
|
|
137
|
+
version_context["MOAI_VERSION_CACHE_AGE"] = "unavailable"
|
|
138
|
+
|
|
139
|
+
return version_context
|
|
140
|
+
|
|
141
|
+
def _format_short_version(self, version: str) -> str:
|
|
142
|
+
"""
|
|
143
|
+
Format short version by removing 'v' prefix if present.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
version: Version string
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
Short version string
|
|
150
|
+
"""
|
|
151
|
+
return version[1:] if version.startswith("v") else version
|
|
152
|
+
|
|
153
|
+
def _format_display_version(self, version: str) -> str:
|
|
154
|
+
"""
|
|
155
|
+
Format display version with proper formatting.
|
|
156
|
+
|
|
157
|
+
Args:
|
|
158
|
+
version: Version string
|
|
159
|
+
|
|
160
|
+
Returns:
|
|
161
|
+
Display version string
|
|
162
|
+
"""
|
|
163
|
+
if version == "unknown":
|
|
164
|
+
return "MoAI-ADK unknown version"
|
|
165
|
+
elif version.startswith("v"):
|
|
166
|
+
return f"MoAI-ADK {version}"
|
|
167
|
+
else:
|
|
168
|
+
return f"MoAI-ADK v{version}"
|
|
169
|
+
|
|
170
|
+
def _format_trimmed_version(self, version: str, max_length: int = 10) -> str:
|
|
171
|
+
"""
|
|
172
|
+
Format version with maximum length, suitable for UI displays.
|
|
173
|
+
|
|
174
|
+
Args:
|
|
175
|
+
version: Version string
|
|
176
|
+
max_length: Maximum allowed length for the version string
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
Trimmed version string
|
|
180
|
+
"""
|
|
181
|
+
if version == "unknown":
|
|
182
|
+
return "unknown"
|
|
183
|
+
|
|
184
|
+
# Remove 'v' prefix for trimming
|
|
185
|
+
clean_version = version[1:] if version.startswith("v") else version
|
|
186
|
+
|
|
187
|
+
# Trim if necessary
|
|
188
|
+
if len(clean_version) > max_length:
|
|
189
|
+
return clean_version[:max_length]
|
|
190
|
+
return clean_version
|
|
191
|
+
|
|
192
|
+
def _format_semver_version(self, version: str) -> str:
|
|
193
|
+
"""
|
|
194
|
+
Format version as semantic version with major.minor.patch structure.
|
|
195
|
+
|
|
196
|
+
Args:
|
|
197
|
+
version: Version string
|
|
198
|
+
|
|
199
|
+
Returns:
|
|
200
|
+
Semantic version string
|
|
201
|
+
"""
|
|
202
|
+
if version == "unknown":
|
|
203
|
+
return "0.0.0"
|
|
204
|
+
|
|
205
|
+
# Remove 'v' prefix and extract semantic version
|
|
206
|
+
clean_version = version[1:] if version.startswith("v") else version
|
|
207
|
+
|
|
208
|
+
# Extract core semantic version (remove pre-release and build metadata)
|
|
209
|
+
import re
|
|
210
|
+
|
|
211
|
+
semver_match = re.match(r"^(\d+\.\d+\.\d+)", clean_version)
|
|
212
|
+
if semver_match:
|
|
213
|
+
return semver_match.group(1)
|
|
214
|
+
return "0.0.0"
|
|
215
|
+
|
|
216
|
+
def _get_version_source(self, version_reader: VersionReader) -> str:
|
|
217
|
+
"""
|
|
218
|
+
Determine the source of the version information.
|
|
219
|
+
|
|
220
|
+
Args:
|
|
221
|
+
version_reader: VersionReader instance
|
|
222
|
+
|
|
223
|
+
Returns:
|
|
224
|
+
String indicating version source
|
|
225
|
+
"""
|
|
226
|
+
config = version_reader.get_config()
|
|
227
|
+
|
|
228
|
+
# Check if we have a cached version (most likely from config)
|
|
229
|
+
cache_age = version_reader.get_cache_age_seconds()
|
|
230
|
+
if cache_age is not None and cache_age < config.cache_ttl_seconds:
|
|
231
|
+
return "config_cached"
|
|
232
|
+
elif cache_age is not None:
|
|
233
|
+
return "config_stale"
|
|
234
|
+
else:
|
|
235
|
+
return config.fallback_version
|
|
236
|
+
|
|
237
|
+
def execute_preparation_phase(
|
|
238
|
+
self,
|
|
239
|
+
project_path: Path,
|
|
240
|
+
backup_enabled: bool = True,
|
|
241
|
+
progress_callback: ProgressCallback | None = None,
|
|
242
|
+
) -> None:
|
|
243
|
+
"""Phase 1: preparation and backup.
|
|
244
|
+
|
|
245
|
+
Args:
|
|
246
|
+
project_path: Project path.
|
|
247
|
+
backup_enabled: Whether backups are enabled.
|
|
248
|
+
progress_callback: Optional progress callback.
|
|
249
|
+
"""
|
|
250
|
+
self.current_phase = 1
|
|
251
|
+
self._report_progress("Phase 1: Preparation and backup...", progress_callback)
|
|
252
|
+
|
|
253
|
+
# Validate system requirements
|
|
254
|
+
self.validator.validate_system_requirements()
|
|
255
|
+
|
|
256
|
+
# Verify the project path
|
|
257
|
+
self.validator.validate_project_path(project_path)
|
|
258
|
+
|
|
259
|
+
# Create a backup when needed
|
|
260
|
+
if backup_enabled and has_any_moai_files(project_path):
|
|
261
|
+
self._create_backup(project_path)
|
|
262
|
+
|
|
263
|
+
def execute_directory_phase(
|
|
264
|
+
self,
|
|
265
|
+
project_path: Path,
|
|
266
|
+
progress_callback: ProgressCallback | None = None,
|
|
267
|
+
) -> None:
|
|
268
|
+
"""Phase 2: create directories.
|
|
269
|
+
|
|
270
|
+
Args:
|
|
271
|
+
project_path: Project path.
|
|
272
|
+
progress_callback: Optional progress callback.
|
|
273
|
+
"""
|
|
274
|
+
self.current_phase = 2
|
|
275
|
+
self._report_progress("Phase 2: Creating directory structure...", progress_callback)
|
|
276
|
+
|
|
277
|
+
for directory in self.REQUIRED_DIRECTORIES:
|
|
278
|
+
dir_path = project_path / directory
|
|
279
|
+
dir_path.mkdir(parents=True, exist_ok=True)
|
|
280
|
+
|
|
281
|
+
def execute_resource_phase(
|
|
282
|
+
self,
|
|
283
|
+
project_path: Path,
|
|
284
|
+
config: dict[str, str] | None = None,
|
|
285
|
+
progress_callback: ProgressCallback | None = None,
|
|
286
|
+
) -> list[str]:
|
|
287
|
+
"""Phase 3: install resources with variable substitution.
|
|
288
|
+
|
|
289
|
+
Args:
|
|
290
|
+
project_path: Project path.
|
|
291
|
+
config: Configuration dictionary for template variable substitution.
|
|
292
|
+
progress_callback: Optional progress callback.
|
|
293
|
+
|
|
294
|
+
Returns:
|
|
295
|
+
List of created files or directories.
|
|
296
|
+
"""
|
|
297
|
+
import stat
|
|
298
|
+
|
|
299
|
+
self.current_phase = 3
|
|
300
|
+
self._report_progress("Phase 3: Installing resources...", progress_callback)
|
|
301
|
+
|
|
302
|
+
# Copy resources via TemplateProcessor in silent mode
|
|
303
|
+
processor = TemplateProcessor(project_path)
|
|
304
|
+
|
|
305
|
+
# Set template variable context (if provided)
|
|
306
|
+
if config:
|
|
307
|
+
# Get language settings from 'language_settings' key (dict)
|
|
308
|
+
# Falls back to 'language' key for backwards compatibility
|
|
309
|
+
language_config: dict[str, Any] = config.get("language_settings") or {}
|
|
310
|
+
if not language_config or not isinstance(language_config, dict):
|
|
311
|
+
# Backwards compatibility: try 'language' key as dict
|
|
312
|
+
legacy_lang = config.get("language", {})
|
|
313
|
+
language_config = legacy_lang if isinstance(legacy_lang, dict) else {}
|
|
314
|
+
|
|
315
|
+
# Detect OS for cross-platform Hook path configuration
|
|
316
|
+
hook_project_dir = "%CLAUDE_PROJECT_DIR%" if platform.system() == "Windows" else "$CLAUDE_PROJECT_DIR"
|
|
317
|
+
|
|
318
|
+
# Detect OS for cross-platform statusline command
|
|
319
|
+
# Windows: Use python -m for better PATH compatibility
|
|
320
|
+
# Unix: Use moai-adk directly (assumes installed via uv tool)
|
|
321
|
+
if platform.system() == "Windows":
|
|
322
|
+
statusline_command = "python -m moai_adk statusline"
|
|
323
|
+
else:
|
|
324
|
+
statusline_command = "moai-adk statusline"
|
|
325
|
+
|
|
326
|
+
# Get enhanced version context with fallback strategies
|
|
327
|
+
version_context = self._get_enhanced_version_context()
|
|
328
|
+
|
|
329
|
+
context = {
|
|
330
|
+
**version_context,
|
|
331
|
+
"CREATION_TIMESTAMP": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
|
332
|
+
"PROJECT_NAME": config.get("name", "unknown"),
|
|
333
|
+
"PROJECT_DESCRIPTION": config.get("description", ""),
|
|
334
|
+
"PROJECT_MODE": config.get("mode", "personal"),
|
|
335
|
+
"PROJECT_VERSION": config.get("version", "0.1.0"),
|
|
336
|
+
"PROJECT_OWNER": config.get("author", "@user"),
|
|
337
|
+
"AUTHOR": config.get("author", "@user"),
|
|
338
|
+
"CONVERSATION_LANGUAGE": language_config.get("conversation_language", "en"),
|
|
339
|
+
"CONVERSATION_LANGUAGE_NAME": language_config.get("conversation_language_name", "English"),
|
|
340
|
+
"CODEBASE_LANGUAGE": config.get("language", "generic"),
|
|
341
|
+
"PROJECT_DIR": hook_project_dir,
|
|
342
|
+
"STATUSLINE_COMMAND": statusline_command,
|
|
343
|
+
}
|
|
344
|
+
processor.set_context(context)
|
|
345
|
+
|
|
346
|
+
processor.copy_templates(backup=False, silent=True) # Avoid progress bar conflicts
|
|
347
|
+
|
|
348
|
+
# Post-process: Set executable permission on shell scripts
|
|
349
|
+
# This is necessary because git may not preserve file permissions during clone/checkout
|
|
350
|
+
scripts_dir = project_path / ".moai" / "scripts"
|
|
351
|
+
logger = logging.getLogger(__name__)
|
|
352
|
+
if scripts_dir.exists():
|
|
353
|
+
logger.debug(f"Processing shell scripts in {scripts_dir}")
|
|
354
|
+
for script_file in scripts_dir.glob("*.sh"):
|
|
355
|
+
try:
|
|
356
|
+
# Add execute permission for user, group, and others
|
|
357
|
+
current_mode = script_file.stat().st_mode
|
|
358
|
+
new_mode = current_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
|
|
359
|
+
script_file.chmod(new_mode)
|
|
360
|
+
logger.debug(f"Set executable permission on {script_file}: {oct(current_mode)} -> {oct(new_mode)}")
|
|
361
|
+
except Exception as e:
|
|
362
|
+
logger.warning(f"Failed to set executable permission on {script_file}: {e}")
|
|
363
|
+
else:
|
|
364
|
+
logger.debug(f"Scripts directory not found: {scripts_dir}")
|
|
365
|
+
|
|
366
|
+
# Return a simplified list of generated assets
|
|
367
|
+
return [
|
|
368
|
+
".claude/",
|
|
369
|
+
".moai/",
|
|
370
|
+
".github/",
|
|
371
|
+
"CLAUDE.md",
|
|
372
|
+
".gitignore",
|
|
373
|
+
]
|
|
374
|
+
|
|
375
|
+
def execute_configuration_phase(
|
|
376
|
+
self,
|
|
377
|
+
project_path: Path,
|
|
378
|
+
config: dict[str, str | bool | dict[Any, Any]],
|
|
379
|
+
progress_callback: ProgressCallback | None = None,
|
|
380
|
+
) -> list[str]:
|
|
381
|
+
"""Phase 4: generate configuration.
|
|
382
|
+
|
|
383
|
+
Args:
|
|
384
|
+
project_path: Project path.
|
|
385
|
+
config: Configuration dictionary.
|
|
386
|
+
progress_callback: Optional progress callback.
|
|
387
|
+
|
|
388
|
+
Returns:
|
|
389
|
+
List of created files.
|
|
390
|
+
"""
|
|
391
|
+
self.current_phase = 4
|
|
392
|
+
self._report_progress("Phase 4: Generating configurations...", progress_callback)
|
|
393
|
+
|
|
394
|
+
logger = logging.getLogger(__name__)
|
|
395
|
+
|
|
396
|
+
# Read existing config to preserve user settings (Issue #165)
|
|
397
|
+
config_path = project_path / ".moai" / "config" / "config.json"
|
|
398
|
+
existing_config: dict[str, Any] = {}
|
|
399
|
+
if config_path.exists():
|
|
400
|
+
try:
|
|
401
|
+
with open(config_path, "r", encoding="utf-8") as f:
|
|
402
|
+
existing_config = json.load(f)
|
|
403
|
+
logger.debug(f"Successfully read existing config from {config_path}")
|
|
404
|
+
except (json.JSONDecodeError, OSError) as e:
|
|
405
|
+
logger.warning(f"Failed to read existing config: {e}. Starting fresh.")
|
|
406
|
+
existing_config = {}
|
|
407
|
+
|
|
408
|
+
# Enhanced config merging with comprehensive version preservation
|
|
409
|
+
merged_config = self._merge_configuration_preserving_versions(config, existing_config)
|
|
410
|
+
|
|
411
|
+
# Enhanced version handling using VersionReader for consistency
|
|
412
|
+
try:
|
|
413
|
+
version_reader = self._get_version_reader()
|
|
414
|
+
current_config_version = version_reader.get_version()
|
|
415
|
+
|
|
416
|
+
# Ensure version consistency across the merged config
|
|
417
|
+
self._ensure_version_consistency(merged_config, current_config_version, existing_config)
|
|
418
|
+
|
|
419
|
+
logger.debug(f"Version consistency check completed. Current version: {current_config_version}")
|
|
420
|
+
except Exception as e:
|
|
421
|
+
logger.warning(f"Version consistency check failed: {e}. Using fallback version.")
|
|
422
|
+
merged_config["moai"]["version"] = __version__
|
|
423
|
+
|
|
424
|
+
# Write final config with enhanced formatting
|
|
425
|
+
self._write_configuration_file(config_path, merged_config)
|
|
426
|
+
logger.info(f"Configuration file written to {config_path}")
|
|
427
|
+
|
|
428
|
+
return [str(config_path)]
|
|
429
|
+
|
|
430
|
+
def _merge_configuration_preserving_versions(
|
|
431
|
+
self, new_config: dict[str, Any], existing_config: dict[str, Any]
|
|
432
|
+
) -> dict[str, Any]:
|
|
433
|
+
"""
|
|
434
|
+
Merge configurations while preserving user settings and version information.
|
|
435
|
+
|
|
436
|
+
Args:
|
|
437
|
+
new_config: New configuration from initialization
|
|
438
|
+
existing_config: Existing configuration from project
|
|
439
|
+
|
|
440
|
+
Returns:
|
|
441
|
+
Merged configuration dictionary
|
|
442
|
+
"""
|
|
443
|
+
logger = logging.getLogger(__name__)
|
|
444
|
+
merged_config = new_config.copy()
|
|
445
|
+
|
|
446
|
+
# Define configuration sections with their merge strategies
|
|
447
|
+
config_sections = {
|
|
448
|
+
"moai": {"preserve_all": True, "priority": "user"},
|
|
449
|
+
"user": {"preserve_keys": ["nickname"], "priority": "user"},
|
|
450
|
+
"language": {
|
|
451
|
+
"preserve_keys": [],
|
|
452
|
+
"priority": "new",
|
|
453
|
+
}, # Use new language config during init
|
|
454
|
+
"project": {"preserve_keys": [], "priority": "new"},
|
|
455
|
+
"git": {"preserve_keys": [], "priority": "new"},
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
for section_name, strategy in config_sections.items():
|
|
459
|
+
if section_name in existing_config:
|
|
460
|
+
logger.debug(f"Merging section: {section_name}")
|
|
461
|
+
self._merge_config_section(merged_config, existing_config, section_name, strategy)
|
|
462
|
+
|
|
463
|
+
return merged_config
|
|
464
|
+
|
|
465
|
+
def _merge_config_section(
|
|
466
|
+
self,
|
|
467
|
+
merged_config: dict[str, Any],
|
|
468
|
+
existing_config: dict[str, Any],
|
|
469
|
+
section_name: str,
|
|
470
|
+
strategy: dict[str, Any],
|
|
471
|
+
) -> None:
|
|
472
|
+
"""
|
|
473
|
+
Merge a specific configuration section.
|
|
474
|
+
|
|
475
|
+
Args:
|
|
476
|
+
merged_config: Target configuration to merge into
|
|
477
|
+
existing_config: Source configuration to merge from
|
|
478
|
+
section_name: Name of the section to merge
|
|
479
|
+
strategy: Merge strategy for this section
|
|
480
|
+
"""
|
|
481
|
+
logger = logging.getLogger(__name__)
|
|
482
|
+
if section_name not in merged_config:
|
|
483
|
+
merged_config[section_name] = {}
|
|
484
|
+
|
|
485
|
+
section_config = merged_config[section_name]
|
|
486
|
+
existing_section = existing_config[section_name]
|
|
487
|
+
|
|
488
|
+
if strategy["priority"] == "user":
|
|
489
|
+
# User priority: preserve existing values
|
|
490
|
+
preserve_keys = strategy.get("preserve_keys", [])
|
|
491
|
+
# Convert frozenset to list if needed
|
|
492
|
+
if isinstance(preserve_keys, frozenset):
|
|
493
|
+
preserve_keys = list(preserve_keys)
|
|
494
|
+
elif not isinstance(preserve_keys, list):
|
|
495
|
+
preserve_keys = list(preserve_keys) if preserve_keys else []
|
|
496
|
+
|
|
497
|
+
for key, value in existing_section.items():
|
|
498
|
+
if strategy.get("preserve_all", False) or key in preserve_keys:
|
|
499
|
+
section_config[key] = value
|
|
500
|
+
logger.debug(f"Preserved {section_name}.{key} = {value}")
|
|
501
|
+
else:
|
|
502
|
+
# New priority: keep new config, but don't overwrite if exists
|
|
503
|
+
for key, value in existing_section.items():
|
|
504
|
+
if key not in section_config:
|
|
505
|
+
section_config[key] = value
|
|
506
|
+
logger.debug(f"Inherited {section_name}.{key} = {value}")
|
|
507
|
+
|
|
508
|
+
def _ensure_version_consistency(
|
|
509
|
+
self,
|
|
510
|
+
config: dict[str, Any],
|
|
511
|
+
current_version: str,
|
|
512
|
+
existing_config: dict[str, Any],
|
|
513
|
+
) -> None:
|
|
514
|
+
"""
|
|
515
|
+
Ensure version consistency across the configuration.
|
|
516
|
+
|
|
517
|
+
Args:
|
|
518
|
+
config: Configuration to update
|
|
519
|
+
current_version: Current version from VersionReader
|
|
520
|
+
existing_config: Existing configuration for reference
|
|
521
|
+
"""
|
|
522
|
+
logger = logging.getLogger(__name__)
|
|
523
|
+
|
|
524
|
+
# Ensure moai section exists
|
|
525
|
+
if "moai" not in config:
|
|
526
|
+
config["moai"] = {}
|
|
527
|
+
|
|
528
|
+
# Version field priority strategy:
|
|
529
|
+
# 1. User explicitly set in existing config -> preserve
|
|
530
|
+
# 2. Version from config file -> use
|
|
531
|
+
# 3. Current version from VersionReader -> use
|
|
532
|
+
# 4. Package version -> fallback
|
|
533
|
+
|
|
534
|
+
existing_moai = existing_config.get("moai", {})
|
|
535
|
+
config_moai = config["moai"]
|
|
536
|
+
|
|
537
|
+
# Check if user explicitly set a version in existing config
|
|
538
|
+
if "version" in existing_moai:
|
|
539
|
+
user_version = existing_moai["version"]
|
|
540
|
+
logger.debug(f"User explicitly set version: {user_version}")
|
|
541
|
+
config_moai["version"] = user_version
|
|
542
|
+
elif "version" in config_moai:
|
|
543
|
+
# Version already in new config, validate it
|
|
544
|
+
config_version = config_moai["version"]
|
|
545
|
+
if config_version == "unknown" or not self._is_valid_version_format(config_version):
|
|
546
|
+
logger.debug(f"Invalid config version {config_version}, updating to current: {current_version}")
|
|
547
|
+
config_moai["version"] = current_version
|
|
548
|
+
else:
|
|
549
|
+
# No version found, use current version
|
|
550
|
+
logger.debug(f"No version found, setting to current: {current_version}")
|
|
551
|
+
config_moai["version"] = current_version
|
|
552
|
+
|
|
553
|
+
def _is_valid_version_format(self, version: str) -> bool:
|
|
554
|
+
"""
|
|
555
|
+
Check if version format is valid.
|
|
556
|
+
|
|
557
|
+
Args:
|
|
558
|
+
version: Version string to validate
|
|
559
|
+
|
|
560
|
+
Returns:
|
|
561
|
+
True if version format is valid
|
|
562
|
+
"""
|
|
563
|
+
import re
|
|
564
|
+
|
|
565
|
+
pattern = r"^v?(\d+\.\d+\.\d+(-[a-zA-Z0-9]+)?)$"
|
|
566
|
+
return bool(re.match(pattern, version))
|
|
567
|
+
|
|
568
|
+
def _write_configuration_file(self, config_path: Path, config: dict[str, Any]) -> None:
|
|
569
|
+
"""
|
|
570
|
+
Write configuration file with enhanced formatting and error handling.
|
|
571
|
+
|
|
572
|
+
Args:
|
|
573
|
+
config_path: Path to write configuration file
|
|
574
|
+
config: Configuration dictionary to write
|
|
575
|
+
"""
|
|
576
|
+
logger = logging.getLogger(__name__)
|
|
577
|
+
|
|
578
|
+
try:
|
|
579
|
+
# Ensure parent directory exists
|
|
580
|
+
config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
581
|
+
|
|
582
|
+
# Write with enhanced formatting
|
|
583
|
+
with open(config_path, "w", encoding="utf-8") as f:
|
|
584
|
+
json.dump(config, f, indent=2, ensure_ascii=False)
|
|
585
|
+
|
|
586
|
+
logger.info(f"Configuration successfully written to {config_path}")
|
|
587
|
+
|
|
588
|
+
except Exception as e:
|
|
589
|
+
logger.error(f"Failed to write configuration file: {e}")
|
|
590
|
+
raise
|
|
591
|
+
|
|
592
|
+
def execute_validation_phase(
|
|
593
|
+
self,
|
|
594
|
+
project_path: Path,
|
|
595
|
+
mode: str = "personal",
|
|
596
|
+
progress_callback: ProgressCallback | None = None,
|
|
597
|
+
) -> None:
|
|
598
|
+
"""Phase 5: validation and wrap-up.
|
|
599
|
+
|
|
600
|
+
|
|
601
|
+
Args:
|
|
602
|
+
project_path: Project path.
|
|
603
|
+
mode: Project mode (personal/team).
|
|
604
|
+
progress_callback: Optional progress callback.
|
|
605
|
+
"""
|
|
606
|
+
self.current_phase = 5
|
|
607
|
+
self._report_progress("Phase 5: Validation and finalization...", progress_callback)
|
|
608
|
+
|
|
609
|
+
# Validate installation results
|
|
610
|
+
# Comprehensive installation validation
|
|
611
|
+
# Verifies all required files including 4 Alfred command files:
|
|
612
|
+
# - 0-project.md, 1-plan.md, 2-run.md, 3-sync.md
|
|
613
|
+
self.validator.validate_installation(project_path)
|
|
614
|
+
|
|
615
|
+
# Initialize Git for all modes (team, personal, solo)
|
|
616
|
+
self._initialize_git(project_path)
|
|
617
|
+
|
|
618
|
+
def _create_backup(self, project_path: Path) -> None:
|
|
619
|
+
"""Create a single backup (v0.4.2).
|
|
620
|
+
|
|
621
|
+
Maintains only one backup at .moai-backups/backup/.
|
|
622
|
+
|
|
623
|
+
Args:
|
|
624
|
+
project_path: Project path.
|
|
625
|
+
"""
|
|
626
|
+
# Define backup directory
|
|
627
|
+
backups_dir = project_path / ".moai-backups"
|
|
628
|
+
backup_path = backups_dir / "backup"
|
|
629
|
+
|
|
630
|
+
# Remove existing backup if present
|
|
631
|
+
if backup_path.exists():
|
|
632
|
+
shutil.rmtree(backup_path)
|
|
633
|
+
|
|
634
|
+
# Create backup directories
|
|
635
|
+
backups_dir.mkdir(parents=True, exist_ok=True)
|
|
636
|
+
backup_path.mkdir(parents=True, exist_ok=True)
|
|
637
|
+
|
|
638
|
+
# Collect backup targets
|
|
639
|
+
targets = get_backup_targets(project_path)
|
|
640
|
+
backed_up_files: list[str] = []
|
|
641
|
+
|
|
642
|
+
# Execute the backup
|
|
643
|
+
for target in targets:
|
|
644
|
+
src_path = project_path / target
|
|
645
|
+
dst_path = backup_path / target
|
|
646
|
+
|
|
647
|
+
if src_path.is_dir():
|
|
648
|
+
self._copy_directory_selective(src_path, dst_path)
|
|
649
|
+
backed_up_files.append(f"{target}/")
|
|
650
|
+
else:
|
|
651
|
+
dst_path.parent.mkdir(parents=True, exist_ok=True)
|
|
652
|
+
shutil.copy2(src_path, dst_path)
|
|
653
|
+
backed_up_files.append(target)
|
|
654
|
+
|
|
655
|
+
# Avoid additional console messages to prevent progress bar conflicts
|
|
656
|
+
|
|
657
|
+
def _copy_directory_selective(self, src: Path, dst: Path) -> None:
|
|
658
|
+
"""Copy a directory while skipping protected paths.
|
|
659
|
+
|
|
660
|
+
Args:
|
|
661
|
+
src: Source directory.
|
|
662
|
+
dst: Destination directory.
|
|
663
|
+
"""
|
|
664
|
+
dst.mkdir(parents=True, exist_ok=True)
|
|
665
|
+
|
|
666
|
+
for item in src.rglob("*"):
|
|
667
|
+
rel_path = item.relative_to(src)
|
|
668
|
+
|
|
669
|
+
# Skip protected paths
|
|
670
|
+
if is_protected_path(rel_path):
|
|
671
|
+
continue
|
|
672
|
+
|
|
673
|
+
dst_item = dst / rel_path
|
|
674
|
+
if item.is_file():
|
|
675
|
+
dst_item.parent.mkdir(parents=True, exist_ok=True)
|
|
676
|
+
shutil.copy2(item, dst_item)
|
|
677
|
+
elif item.is_dir():
|
|
678
|
+
dst_item.mkdir(parents=True, exist_ok=True)
|
|
679
|
+
|
|
680
|
+
def _initialize_git(self, project_path: Path) -> None:
|
|
681
|
+
"""Initialize a Git repository if not already initialized.
|
|
682
|
+
|
|
683
|
+
Args:
|
|
684
|
+
project_path: Project path.
|
|
685
|
+
"""
|
|
686
|
+
# Check if .git directory already exists
|
|
687
|
+
git_dir = project_path / ".git"
|
|
688
|
+
if git_dir.exists() and git_dir.is_dir():
|
|
689
|
+
# Git already initialized, skip
|
|
690
|
+
return
|
|
691
|
+
|
|
692
|
+
try:
|
|
693
|
+
subprocess.run(
|
|
694
|
+
["git", "init"],
|
|
695
|
+
cwd=project_path,
|
|
696
|
+
check=True,
|
|
697
|
+
capture_output=True,
|
|
698
|
+
timeout=30, # Default timeout for git operations
|
|
699
|
+
)
|
|
700
|
+
# Intentionally avoid printing to keep progress output clean
|
|
701
|
+
except subprocess.TimeoutExpired:
|
|
702
|
+
# Timeout is non-fatal
|
|
703
|
+
pass
|
|
704
|
+
except subprocess.CalledProcessError:
|
|
705
|
+
# Only log on error; failures are non-fatal
|
|
706
|
+
pass
|
|
707
|
+
|
|
708
|
+
def _report_progress(self, message: str, callback: ProgressCallback | None) -> None:
|
|
709
|
+
"""Report progress.
|
|
710
|
+
|
|
711
|
+
Args:
|
|
712
|
+
message: Progress message.
|
|
713
|
+
callback: Callback function.
|
|
714
|
+
"""
|
|
715
|
+
if callback:
|
|
716
|
+
callback(message, self.current_phase, self.total_phases)
|