moai-adk 0.15.1__py3-none-any.whl → 0.25.4__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 +1 -2
- moai_adk/__main__.py +85 -2
- moai_adk/cli/__init__.py +0 -1
- moai_adk/cli/commands/__init__.py +0 -1
- moai_adk/cli/commands/analyze.py +127 -0
- moai_adk/cli/commands/backup.py +5 -3
- moai_adk/cli/commands/doctor.py +35 -11
- moai_adk/cli/commands/improve_user_experience.py +348 -0
- moai_adk/cli/commands/init.py +150 -23
- moai_adk/cli/commands/language.py +269 -0
- moai_adk/cli/commands/migrate.py +158 -0
- moai_adk/cli/commands/status.py +13 -12
- moai_adk/cli/commands/update.py +364 -60
- moai_adk/cli/commands/validate_links.py +118 -0
- moai_adk/cli/main.py +3 -2
- moai_adk/cli/prompts/init_prompts.py +79 -82
- moai_adk/core/__init__.py +0 -1
- moai_adk/core/analysis/__init__.py +9 -0
- moai_adk/core/analysis/session_analyzer.py +439 -0
- moai_adk/core/claude_integration.py +421 -0
- moai_adk/core/command_helpers.py +270 -0
- moai_adk/core/config/__init__.py +6 -0
- moai_adk/core/config/auto_spec_config.py +346 -0
- moai_adk/core/config/migration.py +133 -12
- moai_adk/core/context_manager.py +279 -0
- moai_adk/core/diagnostics/slash_commands.py +0 -1
- moai_adk/core/error_recovery_system.py +1289 -0
- moai_adk/core/git/__init__.py +0 -1
- moai_adk/core/git/branch.py +0 -1
- moai_adk/core/git/branch_manager.py +4 -4
- moai_adk/core/git/checkpoint.py +1 -5
- moai_adk/core/git/commit.py +0 -1
- moai_adk/core/git/event_detector.py +3 -5
- moai_adk/core/git/manager.py +0 -1
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +925 -0
- moai_adk/core/integration/__init__.py +22 -0
- moai_adk/core/integration/engine.py +169 -0
- moai_adk/core/integration/integration_tester.py +225 -0
- moai_adk/core/integration/models.py +88 -0
- moai_adk/core/integration/utils.py +211 -0
- moai_adk/core/issue_creator.py +28 -18
- moai_adk/core/language_config.py +202 -0
- moai_adk/core/language_validator.py +556 -0
- moai_adk/core/mcp/setup.py +113 -0
- moai_adk/core/migration/__init__.py +18 -0
- moai_adk/core/migration/backup_manager.py +208 -0
- moai_adk/core/migration/file_migrator.py +218 -0
- moai_adk/core/migration/version_detector.py +143 -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 +318 -0
- moai_adk/core/performance/parallel_processor.py +116 -0
- moai_adk/core/project/__init__.py +0 -1
- moai_adk/core/project/backup_utils.py +2 -7
- moai_adk/core/project/checker.py +3 -3
- moai_adk/core/project/detector.py +20 -40
- moai_adk/core/project/initializer.py +42 -17
- moai_adk/core/project/phase_executor.py +415 -58
- moai_adk/core/project/validator.py +6 -25
- moai_adk/core/quality/__init__.py +1 -1
- moai_adk/core/quality/trust_checker.py +64 -110
- moai_adk/core/quality/validators/__init__.py +1 -1
- moai_adk/core/quality/validators/base_validator.py +1 -1
- moai_adk/core/rollback_manager.py +993 -0
- moai_adk/core/session_manager.py +667 -0
- moai_adk/core/spec/confidence_scoring.py +749 -0
- moai_adk/core/spec/ears_template_engine.py +1182 -0
- moai_adk/core/spec/quality_validator.py +721 -0
- moai_adk/core/spec_status_manager.py +488 -0
- moai_adk/core/template/__init__.py +0 -1
- moai_adk/core/template/backup.py +41 -1
- moai_adk/core/template/config.py +11 -12
- moai_adk/core/template/languages.py +0 -1
- moai_adk/core/template/merger.py +79 -22
- moai_adk/core/template/processor.py +614 -40
- moai_adk/core/template_engine.py +36 -27
- moai_adk/foundation/git/commit_templates.py +565 -0
- moai_adk/foundation/trust/trust_principles.py +725 -0
- moai_adk/foundation/trust/validation_checklist.py +1678 -0
- moai_adk/statusline/__init__.py +38 -0
- moai_adk/statusline/alfred_detector.py +107 -0
- moai_adk/statusline/config.py +364 -0
- moai_adk/statusline/enhanced_output_style_detector.py +364 -0
- moai_adk/statusline/git_collector.py +190 -0
- moai_adk/statusline/main.py +228 -0
- moai_adk/statusline/metrics_tracker.py +78 -0
- moai_adk/statusline/renderer.py +327 -0
- moai_adk/statusline/update_checker.py +135 -0
- moai_adk/statusline/version_reader.py +647 -0
- moai_adk/templates/.git-hooks/pre-commit +66 -0
- moai_adk/templates/.git-hooks/pre-push +116 -4
- moai_adk/templates/.github/workflows/moai-gitflow.yml +1 -7
- moai_adk/templates/.github/workflows/spec-issue-sync.yml +0 -1
- moai_adk/templates/.gitignore +44 -0
- moai_adk/templates/.mcp.json +22 -0
- moai_adk/templates/CLAUDE.md +450 -1071
- moai_adk/utils/__init__.py +0 -1
- moai_adk/utils/banner.py +0 -1
- moai_adk/utils/common.py +308 -0
- moai_adk/utils/link_validator.py +249 -0
- moai_adk/utils/logger.py +4 -9
- moai_adk/utils/safe_file_reader.py +210 -0
- moai_adk/utils/user_experience.py +531 -0
- moai_adk-0.25.4.dist-info/METADATA +2279 -0
- moai_adk-0.25.4.dist-info/RECORD +112 -0
- moai_adk/core/tags/__init__.py +0 -86
- moai_adk/core/tags/ci_validator.py +0 -463
- moai_adk/core/tags/cli.py +0 -283
- moai_adk/core/tags/generator.py +0 -109
- moai_adk/core/tags/inserter.py +0 -99
- moai_adk/core/tags/mapper.py +0 -126
- moai_adk/core/tags/parser.py +0 -76
- moai_adk/core/tags/pre_commit_validator.py +0 -393
- moai_adk/core/tags/reporter.py +0 -956
- moai_adk/core/tags/tags.py +0 -149
- moai_adk/core/tags/validator.py +0 -897
- moai_adk/templates/.claude/agents/alfred/backend-expert.md +0 -319
- moai_adk/templates/.claude/agents/alfred/cc-manager.md +0 -316
- moai_adk/templates/.claude/agents/alfred/debug-helper.md +0 -208
- moai_adk/templates/.claude/agents/alfred/devops-expert.md +0 -464
- moai_adk/templates/.claude/agents/alfred/doc-syncer.md +0 -214
- moai_adk/templates/.claude/agents/alfred/frontend-expert.md +0 -357
- moai_adk/templates/.claude/agents/alfred/git-manager.md +0 -406
- moai_adk/templates/.claude/agents/alfred/implementation-planner.md +0 -423
- moai_adk/templates/.claude/agents/alfred/project-manager.md +0 -312
- moai_adk/templates/.claude/agents/alfred/quality-gate.md +0 -343
- moai_adk/templates/.claude/agents/alfred/skill-factory.md +0 -865
- moai_adk/templates/.claude/agents/alfred/spec-builder.md +0 -426
- moai_adk/templates/.claude/agents/alfred/tag-agent.md +0 -361
- moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +0 -428
- moai_adk/templates/.claude/agents/alfred/trust-checker.md +0 -375
- moai_adk/templates/.claude/agents/alfred/ui-ux-expert.md +0 -571
- moai_adk/templates/.claude/commands/alfred/0-project.md +0 -1854
- moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -880
- moai_adk/templates/.claude/commands/alfred/2-run.md +0 -793
- moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -1084
- moai_adk/templates/.claude/commands/alfred/9-feedback.md +0 -149
- moai_adk/templates/.claude/hooks/alfred/core/project.py +0 -748
- moai_adk/templates/.claude/hooks/alfred/core/timeout.py +0 -136
- moai_adk/templates/.claude/hooks/alfred/core/ttl_cache.py +0 -108
- moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +0 -198
- moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +0 -29
- moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +0 -94
- moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +0 -100
- moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +0 -94
- moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +0 -94
- moai_adk/templates/.claude/hooks/alfred/shared/core/__init__.py +0 -170
- moai_adk/templates/.claude/hooks/alfred/shared/core/checkpoint.py +0 -271
- moai_adk/templates/.claude/hooks/alfred/shared/core/context.py +0 -67
- moai_adk/templates/.claude/hooks/alfred/shared/core/project.py +0 -749
- moai_adk/templates/.claude/hooks/alfred/shared/core/tags.py +0 -230
- moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +0 -198
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/__init__.py +0 -21
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/notification.py +0 -154
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/session.py +0 -174
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/tool.py +0 -87
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/user.py +0 -61
- moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +0 -112
- moai_adk/templates/.claude/hooks/alfred/utils/__init__.py +0 -1
- moai_adk/templates/.claude/hooks/alfred/utils/timeout.py +0 -161
- moai_adk/templates/.claude/settings.json +0 -144
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/SKILL.md +0 -70
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/examples.md +0 -62
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/reference.md +0 -242
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/SKILL.md +0 -56
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/examples.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/reference.md +0 -444
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/SKILL.md +0 -62
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/examples.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/reference.md +0 -405
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/SKILL.md +0 -51
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/examples.md +0 -355
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/reference.md +0 -239
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/SKILL.md +0 -323
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/examples.md +0 -286
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/reference.md +0 -126
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -122
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/reference.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/SKILL.md +0 -74
- moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/reference.md +0 -269
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/SKILL.md +0 -237
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/examples.md +0 -615
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/reference.md +0 -653
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/reference.md +0 -150
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-persona-roles/SKILL.md +0 -198
- moai_adk/templates/.claude/skills/moai-alfred-persona-roles/examples.md +0 -431
- moai_adk/templates/.claude/skills/moai-alfred-persona-roles/reference.md +0 -141
- moai_adk/templates/.claude/skills/moai-alfred-practices/SKILL.md +0 -89
- moai_adk/templates/.claude/skills/moai-alfred-practices/examples.md +0 -122
- moai_adk/templates/.claude/skills/moai-alfred-practices/reference.md +0 -369
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/SKILL.md +0 -508
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/examples.md +0 -481
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/reference.md +0 -100
- moai_adk/templates/.claude/skills/moai-alfred-reporting/SKILL.md +0 -273
- moai_adk/templates/.claude/skills/moai-alfred-rules/SKILL.md +0 -77
- moai_adk/templates/.claude/skills/moai-alfred-rules/examples.md +0 -265
- moai_adk/templates/.claude/skills/moai-alfred-rules/reference.md +0 -539
- moai_adk/templates/.claude/skills/moai-alfred-session-state/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-alfred-session-state/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-session-state/reference.md +0 -84
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/README.md +0 -137
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/SKILL.md +0 -219
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples/validate-spec.sh +0 -161
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples.md +0 -541
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/reference.md +0 -622
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/SKILL.md +0 -115
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/reference.md +0 -348
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/reference.md +0 -211
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-workflow/SKILL.md +0 -288
- moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +0 -269
- moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +0 -32
- moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +0 -298
- moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +0 -26
- moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +0 -307
- moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +0 -21
- moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +0 -252
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +0 -19
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +0 -19
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +0 -24
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +0 -199
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +0 -39
- moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +0 -316
- moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +0 -18
- moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +0 -263
- moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +0 -30
- moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/reference.md +0 -218
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/CHECKLIST.md +0 -482
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/EXAMPLES.md +0 -278
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/INTERACTIVE-DISCOVERY.md +0 -524
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/METADATA.md +0 -477
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/PARALLEL-ANALYSIS-REPORT.md +0 -429
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/PYTHON-VERSION-MATRIX.md +0 -391
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-FACTORY-WORKFLOW.md +0 -431
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-UPDATE-ADVISOR.md +0 -577
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL.md +0 -271
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/STEP-BY-STEP-GUIDE.md +0 -466
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/STRUCTURE.md +0 -583
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/WEB-RESEARCH.md +0 -526
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/reference.md +0 -465
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/generate-structure.sh +0 -328
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/validate-skill.sh +0 -312
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/SKILL_TEMPLATE.md +0 -245
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/examples-template.md +0 -285
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/reference-template.md +0 -278
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/scripts-template.sh +0 -303
- moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +0 -291
- moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +0 -15
- moai_adk/templates/.claude/skills/moai-design-systems/SKILL.md +0 -802
- moai_adk/templates/.claude/skills/moai-design-systems/examples.md +0 -1238
- moai_adk/templates/.claude/skills/moai-design-systems/reference.md +0 -673
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +0 -290
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +0 -1633
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +0 -660
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +0 -128
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-security/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-security/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +0 -303
- moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +0 -1064
- moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +0 -1047
- moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +0 -116
- moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +0 -122
- moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +0 -307
- moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
- moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +0 -1099
- moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-c/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-c/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +0 -127
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +0 -126
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +0 -125
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +0 -32
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +0 -126
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +0 -433
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +0 -624
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +0 -316
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +0 -127
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +0 -125
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +0 -133
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +0 -34
- moai_adk/templates/.claude/skills/moai-project-documentation.md +0 -622
- moai_adk/templates/.github/workflows/c-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/cpp-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/csharp-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/dart-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/go-tag-validation.yml +0 -130
- moai_adk/templates/.github/workflows/java-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/javascript-tag-validation.yml +0 -135
- moai_adk/templates/.github/workflows/kotlin-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/php-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/python-tag-validation.yml +0 -118
- moai_adk/templates/.github/workflows/release.yml +0 -118
- moai_adk/templates/.github/workflows/ruby-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/rust-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/shell-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/swift-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/tag-report.yml +0 -269
- moai_adk/templates/.github/workflows/tag-validation.yml +0 -186
- moai_adk/templates/.github/workflows/typescript-tag-validation.yml +0 -154
- moai_adk/templates/.moai/config.json +0 -115
- moai_adk/templates/workflows/go-tag-validation.yml +0 -30
- moai_adk/templates/workflows/javascript-tag-validation.yml +0 -41
- moai_adk/templates/workflows/python-tag-validation.yml +0 -42
- moai_adk/templates/workflows/typescript-tag-validation.yml +0 -31
- moai_adk-0.15.1.dist-info/METADATA +0 -3094
- moai_adk-0.15.1.dist-info/RECORD +0 -365
- {moai_adk-0.15.1.dist-info → moai_adk-0.25.4.dist-info}/WHEEL +0 -0
- {moai_adk-0.15.1.dist-info → moai_adk-0.25.4.dist-info}/entry_points.txt +0 -0
- {moai_adk-0.15.1.dist-info → moai_adk-0.25.4.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
#
|
|
2
|
-
# @CODE:TEST-COVERAGE-001 | SPEC: SPEC-TEST-COVERAGE-001.md | TEST: tests/unit/test_phase_executor.py
|
|
1
|
+
# type: ignore
|
|
3
2
|
"""Phase-based installation executor (SPEC-INIT-003 v0.4.2)
|
|
4
3
|
|
|
5
4
|
Runs the project initialization across five phases:
|
|
@@ -13,6 +12,8 @@ Test coverage includes 5-phase integration tests with backup, configuration, and
|
|
|
13
12
|
"""
|
|
14
13
|
|
|
15
14
|
import json
|
|
15
|
+
import logging
|
|
16
|
+
import platform
|
|
16
17
|
import shutil
|
|
17
18
|
import subprocess
|
|
18
19
|
from collections.abc import Callable
|
|
@@ -30,6 +31,7 @@ from moai_adk.core.project.backup_utils import (
|
|
|
30
31
|
)
|
|
31
32
|
from moai_adk.core.project.validator import ProjectValidator
|
|
32
33
|
from moai_adk.core.template.processor import TemplateProcessor
|
|
34
|
+
from moai_adk.statusline.version_reader import VersionConfig, VersionReader
|
|
33
35
|
|
|
34
36
|
console = Console()
|
|
35
37
|
|
|
@@ -46,6 +48,8 @@ class PhaseExecutor:
|
|
|
46
48
|
3. Resource: Copy template resources.
|
|
47
49
|
4. Configuration: Generate configuration files.
|
|
48
50
|
5. Validation: Perform final checks.
|
|
51
|
+
|
|
52
|
+
Enhanced with improved version reading and context management.
|
|
49
53
|
"""
|
|
50
54
|
|
|
51
55
|
# Required directory structure
|
|
@@ -69,6 +73,186 @@ class PhaseExecutor:
|
|
|
69
73
|
self.validator = validator
|
|
70
74
|
self.total_phases = 5
|
|
71
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(
|
|
113
|
+
moai_version
|
|
114
|
+
)
|
|
115
|
+
version_context["MOAI_VERSION_DISPLAY"] = self._format_display_version(
|
|
116
|
+
moai_version
|
|
117
|
+
)
|
|
118
|
+
version_context["MOAI_VERSION_TRIMMED"] = self._format_trimmed_version(
|
|
119
|
+
moai_version, max_length=10
|
|
120
|
+
)
|
|
121
|
+
version_context["MOAI_VERSION_SEMVER"] = self._format_semver_version(
|
|
122
|
+
moai_version
|
|
123
|
+
)
|
|
124
|
+
version_context["MOAI_VERSION_VALID"] = (
|
|
125
|
+
"true" if moai_version != "unknown" else "false"
|
|
126
|
+
)
|
|
127
|
+
version_context["MOAI_VERSION_SOURCE"] = self._get_version_source(
|
|
128
|
+
version_reader
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
# Add performance metrics for debugging
|
|
132
|
+
cache_age = version_reader.get_cache_age_seconds()
|
|
133
|
+
if cache_age is not None:
|
|
134
|
+
version_context["MOAI_VERSION_CACHE_AGE"] = f"{cache_age:.2f}s"
|
|
135
|
+
else:
|
|
136
|
+
version_context["MOAI_VERSION_CACHE_AGE"] = "uncached"
|
|
137
|
+
|
|
138
|
+
except Exception as e:
|
|
139
|
+
logger.warning(f"Failed to read version for context: {e}")
|
|
140
|
+
# Use fallback version with comprehensive fallback formatting
|
|
141
|
+
fallback_version = __version__
|
|
142
|
+
version_context["MOAI_VERSION"] = fallback_version
|
|
143
|
+
version_context["MOAI_VERSION_SHORT"] = self._format_short_version(
|
|
144
|
+
fallback_version
|
|
145
|
+
)
|
|
146
|
+
version_context["MOAI_VERSION_DISPLAY"] = self._format_display_version(
|
|
147
|
+
fallback_version
|
|
148
|
+
)
|
|
149
|
+
version_context["MOAI_VERSION_TRIMMED"] = self._format_trimmed_version(
|
|
150
|
+
fallback_version, max_length=10
|
|
151
|
+
)
|
|
152
|
+
version_context["MOAI_VERSION_SEMVER"] = self._format_semver_version(
|
|
153
|
+
fallback_version
|
|
154
|
+
)
|
|
155
|
+
version_context["MOAI_VERSION_VALID"] = "true"
|
|
156
|
+
version_context["MOAI_VERSION_SOURCE"] = "fallback_package"
|
|
157
|
+
version_context["MOAI_VERSION_CACHE_AGE"] = "unavailable"
|
|
158
|
+
|
|
159
|
+
return version_context
|
|
160
|
+
|
|
161
|
+
def _format_short_version(self, version: str) -> str:
|
|
162
|
+
"""
|
|
163
|
+
Format short version by removing 'v' prefix if present.
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
version: Version string
|
|
167
|
+
|
|
168
|
+
Returns:
|
|
169
|
+
Short version string
|
|
170
|
+
"""
|
|
171
|
+
return version[1:] if version.startswith("v") else version
|
|
172
|
+
|
|
173
|
+
def _format_display_version(self, version: str) -> str:
|
|
174
|
+
"""
|
|
175
|
+
Format display version with proper formatting.
|
|
176
|
+
|
|
177
|
+
Args:
|
|
178
|
+
version: Version string
|
|
179
|
+
|
|
180
|
+
Returns:
|
|
181
|
+
Display version string
|
|
182
|
+
"""
|
|
183
|
+
if version == "unknown":
|
|
184
|
+
return "MoAI-ADK unknown version"
|
|
185
|
+
elif version.startswith("v"):
|
|
186
|
+
return f"MoAI-ADK {version}"
|
|
187
|
+
else:
|
|
188
|
+
return f"MoAI-ADK v{version}"
|
|
189
|
+
|
|
190
|
+
def _format_trimmed_version(self, version: str, max_length: int = 10) -> str:
|
|
191
|
+
"""
|
|
192
|
+
Format version with maximum length, suitable for UI displays.
|
|
193
|
+
|
|
194
|
+
Args:
|
|
195
|
+
version: Version string
|
|
196
|
+
max_length: Maximum allowed length for the version string
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
Trimmed version string
|
|
200
|
+
"""
|
|
201
|
+
if version == "unknown":
|
|
202
|
+
return "unknown"
|
|
203
|
+
|
|
204
|
+
# Remove 'v' prefix for trimming
|
|
205
|
+
clean_version = version[1:] if version.startswith("v") else version
|
|
206
|
+
|
|
207
|
+
# Trim if necessary
|
|
208
|
+
if len(clean_version) > max_length:
|
|
209
|
+
return clean_version[:max_length]
|
|
210
|
+
return clean_version
|
|
211
|
+
|
|
212
|
+
def _format_semver_version(self, version: str) -> str:
|
|
213
|
+
"""
|
|
214
|
+
Format version as semantic version with major.minor.patch structure.
|
|
215
|
+
|
|
216
|
+
Args:
|
|
217
|
+
version: Version string
|
|
218
|
+
|
|
219
|
+
Returns:
|
|
220
|
+
Semantic version string
|
|
221
|
+
"""
|
|
222
|
+
if version == "unknown":
|
|
223
|
+
return "0.0.0"
|
|
224
|
+
|
|
225
|
+
# Remove 'v' prefix and extract semantic version
|
|
226
|
+
clean_version = version[1:] if version.startswith("v") else version
|
|
227
|
+
|
|
228
|
+
# Extract core semantic version (remove pre-release and build metadata)
|
|
229
|
+
import re
|
|
230
|
+
|
|
231
|
+
semver_match = re.match(r"^(\d+\.\d+\.\d+)", clean_version)
|
|
232
|
+
if semver_match:
|
|
233
|
+
return semver_match.group(1)
|
|
234
|
+
return "0.0.0"
|
|
235
|
+
|
|
236
|
+
def _get_version_source(self, version_reader: VersionReader) -> str:
|
|
237
|
+
"""
|
|
238
|
+
Determine the source of the version information.
|
|
239
|
+
|
|
240
|
+
Args:
|
|
241
|
+
version_reader: VersionReader instance
|
|
242
|
+
|
|
243
|
+
Returns:
|
|
244
|
+
String indicating version source
|
|
245
|
+
"""
|
|
246
|
+
config = version_reader.get_config()
|
|
247
|
+
|
|
248
|
+
# Check if we have a cached version (most likely from config)
|
|
249
|
+
cache_age = version_reader.get_cache_age_seconds()
|
|
250
|
+
if cache_age is not None and cache_age < config.cache_ttl_seconds:
|
|
251
|
+
return "config_cached"
|
|
252
|
+
elif cache_age is not None:
|
|
253
|
+
return "config_stale"
|
|
254
|
+
else:
|
|
255
|
+
return config.fallback_version
|
|
72
256
|
|
|
73
257
|
def execute_preparation_phase(
|
|
74
258
|
self,
|
|
@@ -84,9 +268,7 @@ class PhaseExecutor:
|
|
|
84
268
|
progress_callback: Optional progress callback.
|
|
85
269
|
"""
|
|
86
270
|
self.current_phase = 1
|
|
87
|
-
self._report_progress(
|
|
88
|
-
"Phase 1: Preparation and backup...", progress_callback
|
|
89
|
-
)
|
|
271
|
+
self._report_progress("Phase 1: Preparation and backup...", progress_callback)
|
|
90
272
|
|
|
91
273
|
# Validate system requirements
|
|
92
274
|
self.validator.validate_system_requirements()
|
|
@@ -135,22 +317,29 @@ class PhaseExecutor:
|
|
|
135
317
|
List of created files or directories.
|
|
136
318
|
"""
|
|
137
319
|
self.current_phase = 3
|
|
138
|
-
self._report_progress(
|
|
139
|
-
"Phase 3: Installing resources...", progress_callback
|
|
140
|
-
)
|
|
320
|
+
self._report_progress("Phase 3: Installing resources...", progress_callback)
|
|
141
321
|
|
|
142
322
|
# Copy resources via TemplateProcessor in silent mode
|
|
143
323
|
processor = TemplateProcessor(project_path)
|
|
144
324
|
|
|
145
325
|
# Set template variable context (if provided)
|
|
146
326
|
if config:
|
|
147
|
-
# @TAG:LANG-FIX-001:PY-CONFIG | Read language from nested config structure
|
|
148
327
|
language_config: dict[str, Any] = config.get("language", {})
|
|
149
328
|
if not isinstance(language_config, dict):
|
|
150
329
|
language_config = {}
|
|
151
330
|
|
|
331
|
+
# Detect OS for cross-platform Hook path configuration
|
|
332
|
+
hook_project_dir = (
|
|
333
|
+
"%CLAUDE_PROJECT_DIR%"
|
|
334
|
+
if platform.system() == "Windows"
|
|
335
|
+
else "$CLAUDE_PROJECT_DIR"
|
|
336
|
+
)
|
|
337
|
+
|
|
338
|
+
# Get enhanced version context with fallback strategies
|
|
339
|
+
version_context = self._get_enhanced_version_context()
|
|
340
|
+
|
|
152
341
|
context = {
|
|
153
|
-
|
|
342
|
+
**version_context,
|
|
154
343
|
"CREATION_TIMESTAMP": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
|
155
344
|
"PROJECT_NAME": config.get("name", "unknown"),
|
|
156
345
|
"PROJECT_DESCRIPTION": config.get("description", ""),
|
|
@@ -158,13 +347,20 @@ class PhaseExecutor:
|
|
|
158
347
|
"PROJECT_VERSION": config.get("version", "0.1.0"),
|
|
159
348
|
"PROJECT_OWNER": config.get("author", "@user"),
|
|
160
349
|
"AUTHOR": config.get("author", "@user"),
|
|
161
|
-
"CONVERSATION_LANGUAGE": language_config.get(
|
|
162
|
-
|
|
350
|
+
"CONVERSATION_LANGUAGE": language_config.get(
|
|
351
|
+
"conversation_language", "en"
|
|
352
|
+
),
|
|
353
|
+
"CONVERSATION_LANGUAGE_NAME": language_config.get(
|
|
354
|
+
"conversation_language_name", "English"
|
|
355
|
+
),
|
|
163
356
|
"CODEBASE_LANGUAGE": config.get("language", "generic"),
|
|
357
|
+
"PROJECT_DIR": hook_project_dir,
|
|
164
358
|
}
|
|
165
359
|
processor.set_context(context)
|
|
166
360
|
|
|
167
|
-
processor.copy_templates(
|
|
361
|
+
processor.copy_templates(
|
|
362
|
+
backup=False, silent=True
|
|
363
|
+
) # Avoid progress bar conflicts
|
|
168
364
|
|
|
169
365
|
# Return a simplified list of generated assets
|
|
170
366
|
return [
|
|
@@ -196,57 +392,220 @@ class PhaseExecutor:
|
|
|
196
392
|
"Phase 4: Generating configurations...", progress_callback
|
|
197
393
|
)
|
|
198
394
|
|
|
395
|
+
logger = logging.getLogger(__name__)
|
|
396
|
+
|
|
199
397
|
# Read existing config to preserve user settings (Issue #165)
|
|
200
|
-
config_path = project_path / ".moai" / "config.json"
|
|
398
|
+
config_path = project_path / ".moai" / "config" / "config.json"
|
|
201
399
|
existing_config: dict[str, Any] = {}
|
|
202
400
|
if config_path.exists():
|
|
203
401
|
try:
|
|
204
402
|
with open(config_path, "r", encoding="utf-8") as f:
|
|
205
403
|
existing_config = json.load(f)
|
|
206
|
-
|
|
207
|
-
|
|
404
|
+
logger.debug(f"Successfully read existing config from {config_path}")
|
|
405
|
+
except (json.JSONDecodeError, OSError) as e:
|
|
406
|
+
logger.warning(f"Failed to read existing config: {e}. Starting fresh.")
|
|
208
407
|
existing_config = {}
|
|
209
408
|
|
|
210
|
-
#
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
if "project" not in config:
|
|
238
|
-
config["project"] = {}
|
|
239
|
-
# Type guard for mypy
|
|
240
|
-
project_config = config["project"]
|
|
241
|
-
if isinstance(project_config, dict):
|
|
242
|
-
project_config["optimized"] = False # Default value
|
|
243
|
-
|
|
244
|
-
# Write config.json
|
|
245
|
-
with open(config_path, "w", encoding="utf-8") as f:
|
|
246
|
-
json.dump(config, f, indent=2, ensure_ascii=False)
|
|
409
|
+
# Enhanced config merging with comprehensive version preservation
|
|
410
|
+
merged_config = self._merge_configuration_preserving_versions(
|
|
411
|
+
config, existing_config
|
|
412
|
+
)
|
|
413
|
+
|
|
414
|
+
# Enhanced version handling using VersionReader for consistency
|
|
415
|
+
try:
|
|
416
|
+
version_reader = self._get_version_reader()
|
|
417
|
+
current_config_version = version_reader.get_version()
|
|
418
|
+
|
|
419
|
+
# Ensure version consistency across the merged config
|
|
420
|
+
self._ensure_version_consistency(
|
|
421
|
+
merged_config, current_config_version, existing_config
|
|
422
|
+
)
|
|
423
|
+
|
|
424
|
+
logger.debug(
|
|
425
|
+
f"Version consistency check completed. Current version: {current_config_version}"
|
|
426
|
+
)
|
|
427
|
+
except Exception as e:
|
|
428
|
+
logger.warning(
|
|
429
|
+
f"Version consistency check failed: {e}. Using fallback version."
|
|
430
|
+
)
|
|
431
|
+
merged_config["moai"]["version"] = __version__
|
|
432
|
+
|
|
433
|
+
# Write final config with enhanced formatting
|
|
434
|
+
self._write_configuration_file(config_path, merged_config)
|
|
435
|
+
logger.info(f"Configuration file written to {config_path}")
|
|
247
436
|
|
|
248
437
|
return [str(config_path)]
|
|
249
438
|
|
|
439
|
+
def _merge_configuration_preserving_versions(
|
|
440
|
+
self, new_config: dict[str, Any], existing_config: dict[str, Any]
|
|
441
|
+
) -> dict[str, Any]:
|
|
442
|
+
"""
|
|
443
|
+
Merge configurations while preserving user settings and version information.
|
|
444
|
+
|
|
445
|
+
Args:
|
|
446
|
+
new_config: New configuration from initialization
|
|
447
|
+
existing_config: Existing configuration from project
|
|
448
|
+
|
|
449
|
+
Returns:
|
|
450
|
+
Merged configuration dictionary
|
|
451
|
+
"""
|
|
452
|
+
logger = logging.getLogger(__name__)
|
|
453
|
+
merged_config = new_config.copy()
|
|
454
|
+
|
|
455
|
+
# Define configuration sections with their merge strategies
|
|
456
|
+
config_sections = {
|
|
457
|
+
"moai": {"preserve_all": True, "priority": "user"},
|
|
458
|
+
"user": {"preserve_keys": ["nickname"], "priority": "user"},
|
|
459
|
+
"language": {
|
|
460
|
+
"preserve_keys": [],
|
|
461
|
+
"priority": "new",
|
|
462
|
+
}, # Use new language config during init
|
|
463
|
+
"project": {"preserve_keys": [], "priority": "new"},
|
|
464
|
+
"git": {"preserve_keys": [], "priority": "new"},
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
for section_name, strategy in config_sections.items():
|
|
468
|
+
if section_name in existing_config:
|
|
469
|
+
logger.debug(f"Merging section: {section_name}")
|
|
470
|
+
self._merge_config_section(
|
|
471
|
+
merged_config, existing_config, section_name, strategy
|
|
472
|
+
)
|
|
473
|
+
|
|
474
|
+
return merged_config
|
|
475
|
+
|
|
476
|
+
def _merge_config_section(
|
|
477
|
+
self,
|
|
478
|
+
merged_config: dict[str, Any],
|
|
479
|
+
existing_config: dict[str, Any],
|
|
480
|
+
section_name: str,
|
|
481
|
+
strategy: dict[str, Any],
|
|
482
|
+
) -> None:
|
|
483
|
+
"""
|
|
484
|
+
Merge a specific configuration section.
|
|
485
|
+
|
|
486
|
+
Args:
|
|
487
|
+
merged_config: Target configuration to merge into
|
|
488
|
+
existing_config: Source configuration to merge from
|
|
489
|
+
section_name: Name of the section to merge
|
|
490
|
+
strategy: Merge strategy for this section
|
|
491
|
+
"""
|
|
492
|
+
logger = logging.getLogger(__name__)
|
|
493
|
+
if section_name not in merged_config:
|
|
494
|
+
merged_config[section_name] = {}
|
|
495
|
+
|
|
496
|
+
section_config = merged_config[section_name]
|
|
497
|
+
existing_section = existing_config[section_name]
|
|
498
|
+
|
|
499
|
+
if strategy["priority"] == "user":
|
|
500
|
+
# User priority: preserve existing values
|
|
501
|
+
preserve_keys = strategy.get("preserve_keys", [])
|
|
502
|
+
# Convert frozenset to list if needed
|
|
503
|
+
if isinstance(preserve_keys, frozenset):
|
|
504
|
+
preserve_keys = list(preserve_keys)
|
|
505
|
+
elif not isinstance(preserve_keys, list):
|
|
506
|
+
preserve_keys = list(preserve_keys) if preserve_keys else []
|
|
507
|
+
|
|
508
|
+
for key, value in existing_section.items():
|
|
509
|
+
if strategy.get("preserve_all", False) or key in preserve_keys:
|
|
510
|
+
section_config[key] = value
|
|
511
|
+
logger.debug(f"Preserved {section_name}.{key} = {value}")
|
|
512
|
+
else:
|
|
513
|
+
# New priority: keep new config, but don't overwrite if exists
|
|
514
|
+
for key, value in existing_section.items():
|
|
515
|
+
if key not in section_config:
|
|
516
|
+
section_config[key] = value
|
|
517
|
+
logger.debug(f"Inherited {section_name}.{key} = {value}")
|
|
518
|
+
|
|
519
|
+
def _ensure_version_consistency(
|
|
520
|
+
self,
|
|
521
|
+
config: dict[str, Any],
|
|
522
|
+
current_version: str,
|
|
523
|
+
existing_config: dict[str, Any],
|
|
524
|
+
) -> None:
|
|
525
|
+
"""
|
|
526
|
+
Ensure version consistency across the configuration.
|
|
527
|
+
|
|
528
|
+
Args:
|
|
529
|
+
config: Configuration to update
|
|
530
|
+
current_version: Current version from VersionReader
|
|
531
|
+
existing_config: Existing configuration for reference
|
|
532
|
+
"""
|
|
533
|
+
logger = logging.getLogger(__name__)
|
|
534
|
+
|
|
535
|
+
# Ensure moai section exists
|
|
536
|
+
if "moai" not in config:
|
|
537
|
+
config["moai"] = {}
|
|
538
|
+
|
|
539
|
+
# Version field priority strategy:
|
|
540
|
+
# 1. User explicitly set in existing config -> preserve
|
|
541
|
+
# 2. Version from config file -> use
|
|
542
|
+
# 3. Current version from VersionReader -> use
|
|
543
|
+
# 4. Package version -> fallback
|
|
544
|
+
|
|
545
|
+
existing_moai = existing_config.get("moai", {})
|
|
546
|
+
config_moai = config["moai"]
|
|
547
|
+
|
|
548
|
+
# Check if user explicitly set a version in existing config
|
|
549
|
+
if "version" in existing_moai:
|
|
550
|
+
user_version = existing_moai["version"]
|
|
551
|
+
logger.debug(f"User explicitly set version: {user_version}")
|
|
552
|
+
config_moai["version"] = user_version
|
|
553
|
+
elif "version" in config_moai:
|
|
554
|
+
# Version already in new config, validate it
|
|
555
|
+
config_version = config_moai["version"]
|
|
556
|
+
if config_version == "unknown" or not self._is_valid_version_format(
|
|
557
|
+
config_version
|
|
558
|
+
):
|
|
559
|
+
logger.debug(
|
|
560
|
+
f"Invalid config version {config_version}, updating to current: {current_version}"
|
|
561
|
+
)
|
|
562
|
+
config_moai["version"] = current_version
|
|
563
|
+
else:
|
|
564
|
+
# No version found, use current version
|
|
565
|
+
logger.debug(f"No version found, setting to current: {current_version}")
|
|
566
|
+
config_moai["version"] = current_version
|
|
567
|
+
|
|
568
|
+
def _is_valid_version_format(self, version: str) -> bool:
|
|
569
|
+
"""
|
|
570
|
+
Check if version format is valid.
|
|
571
|
+
|
|
572
|
+
Args:
|
|
573
|
+
version: Version string to validate
|
|
574
|
+
|
|
575
|
+
Returns:
|
|
576
|
+
True if version format is valid
|
|
577
|
+
"""
|
|
578
|
+
import re
|
|
579
|
+
|
|
580
|
+
pattern = r"^v?(\d+\.\d+\.\d+(-[a-zA-Z0-9]+)?)$"
|
|
581
|
+
return bool(re.match(pattern, version))
|
|
582
|
+
|
|
583
|
+
def _write_configuration_file(
|
|
584
|
+
self, config_path: Path, config: dict[str, Any]
|
|
585
|
+
) -> None:
|
|
586
|
+
"""
|
|
587
|
+
Write configuration file with enhanced formatting and error handling.
|
|
588
|
+
|
|
589
|
+
Args:
|
|
590
|
+
config_path: Path to write configuration file
|
|
591
|
+
config: Configuration dictionary to write
|
|
592
|
+
"""
|
|
593
|
+
logger = logging.getLogger(__name__)
|
|
594
|
+
|
|
595
|
+
try:
|
|
596
|
+
# Ensure parent directory exists
|
|
597
|
+
config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
598
|
+
|
|
599
|
+
# Write with enhanced formatting
|
|
600
|
+
with open(config_path, "w", encoding="utf-8") as f:
|
|
601
|
+
json.dump(config, f, indent=2, ensure_ascii=False)
|
|
602
|
+
|
|
603
|
+
logger.info(f"Configuration successfully written to {config_path}")
|
|
604
|
+
|
|
605
|
+
except Exception as e:
|
|
606
|
+
logger.error(f"Failed to write configuration file: {e}")
|
|
607
|
+
raise
|
|
608
|
+
|
|
250
609
|
def execute_validation_phase(
|
|
251
610
|
self,
|
|
252
611
|
project_path: Path,
|
|
@@ -255,8 +614,6 @@ class PhaseExecutor:
|
|
|
255
614
|
) -> None:
|
|
256
615
|
"""Phase 5: validation and wrap-up.
|
|
257
616
|
|
|
258
|
-
@CODE:INIT-PHASE-001 | Phase 5 verification logic
|
|
259
|
-
@REQ:VALIDATION-001 | SPEC-INIT-004: Verify required files after initialization completion
|
|
260
617
|
|
|
261
618
|
Args:
|
|
262
619
|
project_path: Project path.
|
|
@@ -294,6 +651,8 @@ class PhaseExecutor:
|
|
|
294
651
|
if backup_path.exists():
|
|
295
652
|
shutil.rmtree(backup_path)
|
|
296
653
|
|
|
654
|
+
# Create backup directories
|
|
655
|
+
backups_dir.mkdir(parents=True, exist_ok=True)
|
|
297
656
|
backup_path.mkdir(parents=True, exist_ok=True)
|
|
298
657
|
|
|
299
658
|
# Collect backup targets
|
|
@@ -360,9 +719,7 @@ class PhaseExecutor:
|
|
|
360
719
|
# Only log on error; failures are non-fatal
|
|
361
720
|
pass
|
|
362
721
|
|
|
363
|
-
def _report_progress(
|
|
364
|
-
self, message: str, callback: ProgressCallback | None
|
|
365
|
-
) -> None:
|
|
722
|
+
def _report_progress(self, message: str, callback: ProgressCallback | None) -> None:
|
|
366
723
|
"""Report progress.
|
|
367
724
|
|
|
368
725
|
Args:
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
# @CODE:CORE-PROJECT-003 | SPEC: SPEC-CORE-PROJECT-001.md, SPEC-INIT-004.md
|
|
2
|
-
# @CODE:INIT-004:VALIDATION | Chain: SPEC-INIT-004 -> CODE-INIT-004 -> TEST-INIT-004
|
|
3
|
-
# @REQ:VALIDATION-001 | SPEC-INIT-004: Initial verification after installation completion
|
|
4
|
-
# @SPEC:VERIFICATION-001 | SPEC-INIT-004: Verification logic implementation
|
|
5
1
|
"""Project initialization validation module.
|
|
6
2
|
|
|
7
3
|
Validates system requirements and installation results.
|
|
@@ -10,11 +6,6 @@ SPEC-INIT-004 Enhancement:
|
|
|
10
6
|
- Alfred command files validation (Phase 5)
|
|
11
7
|
- Explicit missing files reporting
|
|
12
8
|
- Required files verification checklist
|
|
13
|
-
|
|
14
|
-
TAG Chain:
|
|
15
|
-
SPEC-INIT-004 (spec.md)
|
|
16
|
-
└─> @CODE:INIT-004:VALIDATION (this file)
|
|
17
|
-
└─> @TEST:INIT-004:VALIDATION (test_validator.py)
|
|
18
9
|
"""
|
|
19
10
|
|
|
20
11
|
import shutil
|
|
@@ -42,7 +33,7 @@ class ProjectValidator:
|
|
|
42
33
|
|
|
43
34
|
# Required files
|
|
44
35
|
REQUIRED_FILES = [
|
|
45
|
-
".moai/config.json",
|
|
36
|
+
".moai/config/config.json",
|
|
46
37
|
"CLAUDE.md",
|
|
47
38
|
]
|
|
48
39
|
|
|
@@ -87,20 +78,17 @@ class ProjectValidator:
|
|
|
87
78
|
|
|
88
79
|
# Parent directory must exist
|
|
89
80
|
if not project_path.parent.exists():
|
|
90
|
-
raise ValidationError(
|
|
81
|
+
raise ValidationError(
|
|
82
|
+
f"Parent directory does not exist: {project_path.parent}"
|
|
83
|
+
)
|
|
91
84
|
|
|
92
85
|
# Prevent initialization inside the MoAI-ADK package
|
|
93
86
|
if self._is_inside_moai_package(project_path):
|
|
94
|
-
raise ValidationError(
|
|
95
|
-
"Cannot initialize inside MoAI-ADK package directory"
|
|
96
|
-
)
|
|
87
|
+
raise ValidationError("Cannot initialize inside MoAI-ADK package directory")
|
|
97
88
|
|
|
98
89
|
def validate_installation(self, project_path: Path) -> None:
|
|
99
90
|
"""Validate installation results.
|
|
100
91
|
|
|
101
|
-
@CODE:INIT-004:VERIFY-001 | Verification of all required files upon successful completion
|
|
102
|
-
@SPEC:VERIFICATION-001 | SPEC-INIT-004: Verification checklist implementation
|
|
103
|
-
@REQ:VALIDATION-001 | UR-003: All required files verified after init completes
|
|
104
92
|
|
|
105
93
|
Args:
|
|
106
94
|
project_path: Project path.
|
|
@@ -109,22 +97,17 @@ class ProjectValidator:
|
|
|
109
97
|
ValidationError: Raised when installation was incomplete.
|
|
110
98
|
"""
|
|
111
99
|
# Verify required directories
|
|
112
|
-
# @CODE:INIT-004:VALIDATION-001 | Core project structure validation
|
|
113
100
|
for directory in self.REQUIRED_DIRECTORIES:
|
|
114
101
|
dir_path = project_path / directory
|
|
115
102
|
if not dir_path.exists():
|
|
116
103
|
raise ValidationError(f"Required directory not found: {directory}")
|
|
117
104
|
|
|
118
105
|
# Verify required files
|
|
119
|
-
# @CODE:INIT-004:VALIDATION-002 | Required configuration files validation
|
|
120
106
|
for file in self.REQUIRED_FILES:
|
|
121
107
|
file_path = project_path / file
|
|
122
108
|
if not file_path.exists():
|
|
123
109
|
raise ValidationError(f"Required file not found: {file}")
|
|
124
110
|
|
|
125
|
-
# @CODE:INIT-004:VERIFY-002 | Verify required Alfred command files (SPEC-INIT-004)
|
|
126
|
-
# @REQ:COMMAND-GENERATION-001 | All 4 Alfred command files must be created
|
|
127
|
-
# @CODE:INIT-004:ALFRED-VALIDATION | Alfred command file integrity check
|
|
128
111
|
alfred_dir = project_path / ".claude" / "commands" / "alfred"
|
|
129
112
|
missing_commands = []
|
|
130
113
|
for cmd in self.REQUIRED_ALFRED_COMMANDS:
|
|
@@ -134,8 +117,6 @@ class ProjectValidator:
|
|
|
134
117
|
|
|
135
118
|
if missing_commands:
|
|
136
119
|
missing_list = ", ".join(missing_commands)
|
|
137
|
-
# @SPEC:ERROR-HANDLING-001 | Clear error messages upon missing files
|
|
138
|
-
# @CODE:INIT-004:ERROR-MESSAGE | Clear reporting of missing Alfred command files
|
|
139
120
|
raise ValidationError(
|
|
140
121
|
f"Required Alfred command files not found: {missing_list}"
|
|
141
122
|
)
|
|
@@ -156,7 +137,7 @@ class ProjectValidator:
|
|
|
156
137
|
if pyproject.exists():
|
|
157
138
|
try:
|
|
158
139
|
content = pyproject.read_text(encoding="utf-8")
|
|
159
|
-
if
|
|
140
|
+
if 'name = "moai-adk"' in content or 'name = "moai-adk"' in content:
|
|
160
141
|
return True
|
|
161
142
|
except Exception:
|
|
162
143
|
pass
|