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
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
"""
|
|
2
|
+
User Experience Improvement CLI Command
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import argparse
|
|
6
|
+
import asyncio
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
from rich.console import Console
|
|
10
|
+
from rich.panel import Panel
|
|
11
|
+
from rich.progress import Progress, SpinnerColumn, TextColumn
|
|
12
|
+
from rich.table import Table
|
|
13
|
+
|
|
14
|
+
from moai_adk.utils.user_experience import (
|
|
15
|
+
UserExperienceAnalyzer,
|
|
16
|
+
generate_improvement_plan,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
console = Console()
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def create_parser(subparsers) -> argparse.ArgumentParser:
|
|
23
|
+
"""Create user experience improvement parser"""
|
|
24
|
+
parser = subparsers.add_parser(
|
|
25
|
+
"improve-ux",
|
|
26
|
+
help="Analyze user experience improvements",
|
|
27
|
+
description="Analyze user experience of online documentation portal and provide improvement plan",
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
parser.add_argument(
|
|
31
|
+
"--url",
|
|
32
|
+
"-u",
|
|
33
|
+
type=str,
|
|
34
|
+
default="https://adk.mo.ai.kr",
|
|
35
|
+
help="URL to analyze (default: https://adk.mo.ai.kr)",
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
parser.add_argument(
|
|
39
|
+
"--output", "-o", type=str, help="File path to save analysis results"
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
parser.add_argument(
|
|
43
|
+
"--format",
|
|
44
|
+
"-f",
|
|
45
|
+
type=str,
|
|
46
|
+
choices=["json", "markdown", "text"],
|
|
47
|
+
default="markdown",
|
|
48
|
+
help="Output format (default: markdown)",
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
parser.add_argument(
|
|
52
|
+
"--verbose", "-v", action="store_true", help="Display detailed progress"
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
parser.add_argument(
|
|
56
|
+
"--max-workers",
|
|
57
|
+
"-w",
|
|
58
|
+
type=int,
|
|
59
|
+
default=5,
|
|
60
|
+
help="Maximum number of concurrent tasks (default: 5)",
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
return parser
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def format_metrics_table(metrics: dict) -> Table:
|
|
67
|
+
"""Format metrics table"""
|
|
68
|
+
table = Table(title="User Experience Metrics")
|
|
69
|
+
table.add_column("Category", style="cyan")
|
|
70
|
+
table.add_column("Score", style="magenta")
|
|
71
|
+
table.add_column("Status", style="green")
|
|
72
|
+
|
|
73
|
+
# Performance metrics
|
|
74
|
+
perf = metrics.get("performance")
|
|
75
|
+
table.add_row(
|
|
76
|
+
"Performance",
|
|
77
|
+
f"{perf.success_rate if perf else 0:.2f}",
|
|
78
|
+
"✅ Good" if (perf and perf.is_good) else "❌ Needs Improvement",
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
# Navigation metrics
|
|
82
|
+
nav = metrics.get("navigation")
|
|
83
|
+
table.add_row(
|
|
84
|
+
"Navigation",
|
|
85
|
+
f"{nav.structure_score if nav else 0:.2f}",
|
|
86
|
+
"✅ Good" if (nav and nav.is_good) else "❌ Needs Improvement",
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
# Content metrics
|
|
90
|
+
content = metrics.get("content")
|
|
91
|
+
table.add_row(
|
|
92
|
+
"Content",
|
|
93
|
+
f"{content.accuracy_score if content else 0:.2f}",
|
|
94
|
+
"✅ Good" if (content and content.is_good) else "❌ Needs Improvement",
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
# Accessibility metrics
|
|
98
|
+
acc = metrics.get("accessibility")
|
|
99
|
+
table.add_row(
|
|
100
|
+
"Accessibility",
|
|
101
|
+
f"{1.0 if (acc and acc.is_good) else 0.0:.2f}",
|
|
102
|
+
"✅ Good" if (acc and acc.is_good) else "❌ Needs Improvement",
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
return table
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def format_recommendations(recommendations: list) -> Table:
|
|
109
|
+
"""Format recommendations table"""
|
|
110
|
+
table = Table(title="Improvement Recommendations")
|
|
111
|
+
table.add_column("Recommendation", style="yellow")
|
|
112
|
+
table.add_column("Priority", style="red")
|
|
113
|
+
|
|
114
|
+
for i, rec in enumerate(recommendations, 1):
|
|
115
|
+
priority = "Medium" # Default
|
|
116
|
+
if (
|
|
117
|
+
"error" in rec.lower()
|
|
118
|
+
or "keyboard" in rec.lower()
|
|
119
|
+
or "accuracy" in rec.lower()
|
|
120
|
+
):
|
|
121
|
+
priority = "High"
|
|
122
|
+
elif "performance" in rec.lower() or "structure" in rec.lower():
|
|
123
|
+
priority = "Medium"
|
|
124
|
+
else:
|
|
125
|
+
priority = "Low"
|
|
126
|
+
|
|
127
|
+
table.add_row(f"{i}. {rec}", priority)
|
|
128
|
+
|
|
129
|
+
return table
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def format_timeline(timeline: dict) -> Table:
|
|
133
|
+
"""Format timeline table"""
|
|
134
|
+
table = Table(title="Implementation Plan")
|
|
135
|
+
table.add_column("Period", style="cyan")
|
|
136
|
+
table.add_column("Tasks", style="magenta")
|
|
137
|
+
|
|
138
|
+
for period, tasks in timeline.items():
|
|
139
|
+
if tasks:
|
|
140
|
+
table.add_row(
|
|
141
|
+
period.replace("_", " ").title(),
|
|
142
|
+
"\n".join(f"• {task}" for task in tasks),
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
return table
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
async def analyze_user_experience(
|
|
149
|
+
url: str, max_workers: int = 5, verbose: bool = False
|
|
150
|
+
) -> dict:
|
|
151
|
+
"""Perform user experience analysis"""
|
|
152
|
+
if verbose:
|
|
153
|
+
console.print(f"[blue]Starting user experience analysis: {url}[/blue]")
|
|
154
|
+
|
|
155
|
+
analyzer = UserExperienceAnalyzer(url, max_workers=max_workers)
|
|
156
|
+
|
|
157
|
+
with Progress(
|
|
158
|
+
SpinnerColumn(),
|
|
159
|
+
TextColumn("[progress.description]{task.description}"),
|
|
160
|
+
console=console,
|
|
161
|
+
transient=True,
|
|
162
|
+
) as progress:
|
|
163
|
+
# Create analysis task
|
|
164
|
+
analysis_task = progress.add_task("Analyzing user experience...", total=None)
|
|
165
|
+
|
|
166
|
+
# Execute analysis
|
|
167
|
+
analysis_report = await analyzer.generate_report()
|
|
168
|
+
|
|
169
|
+
progress.update(analysis_task, completed=True)
|
|
170
|
+
|
|
171
|
+
return analysis_report
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def generate_markdown_report(analysis_report: dict, improvement_plan: dict) -> str:
|
|
175
|
+
"""Generate markdown report"""
|
|
176
|
+
report = []
|
|
177
|
+
|
|
178
|
+
# Header
|
|
179
|
+
report.append("# User Experience Improvement Report")
|
|
180
|
+
report.append("")
|
|
181
|
+
report.append(f"**Analysis Target**: {analysis_report.get('base_url', 'N/A')}")
|
|
182
|
+
report.append(f"**Analysis Time**: {analysis_report.get('generated_at', 'N/A')}")
|
|
183
|
+
report.append("")
|
|
184
|
+
|
|
185
|
+
# Overall score
|
|
186
|
+
overall_score = analysis_report.get("overall_score", 0)
|
|
187
|
+
report.append(f"## Overall Score: {overall_score:.2f}")
|
|
188
|
+
report.append("")
|
|
189
|
+
|
|
190
|
+
# Metrics details
|
|
191
|
+
report.append("### Metrics Details")
|
|
192
|
+
report.append("")
|
|
193
|
+
|
|
194
|
+
# Performance metrics
|
|
195
|
+
performance = analysis_report.get("performance")
|
|
196
|
+
report.append("#### Performance")
|
|
197
|
+
report.append(
|
|
198
|
+
f"- Success Rate: {performance.success_rate if performance else 0:.2f}"
|
|
199
|
+
)
|
|
200
|
+
report.append(
|
|
201
|
+
f"- Average Load Time: {performance.load_time if performance else 0:.2f}s"
|
|
202
|
+
)
|
|
203
|
+
report.append(
|
|
204
|
+
f"- Response Time: {performance.response_time if performance else 0:.2f}s"
|
|
205
|
+
)
|
|
206
|
+
report.append(f"- Error Rate: {performance.error_rate if performance else 0:.2f}")
|
|
207
|
+
report.append("")
|
|
208
|
+
|
|
209
|
+
# Navigation metrics
|
|
210
|
+
navigation = analysis_report.get("navigation")
|
|
211
|
+
report.append("#### Navigation")
|
|
212
|
+
report.append(
|
|
213
|
+
f"- Structure Score: {navigation.structure_score if navigation else 0:.2f}"
|
|
214
|
+
)
|
|
215
|
+
report.append(f"- Link Count: {navigation.link_count if navigation else 0}")
|
|
216
|
+
report.append(f"- Depth: {navigation.depth if navigation else 0}")
|
|
217
|
+
report.append(f"- Completeness: {navigation.completeness if navigation else 0:.2f}")
|
|
218
|
+
report.append("")
|
|
219
|
+
|
|
220
|
+
# Content metrics
|
|
221
|
+
content = analysis_report.get("content")
|
|
222
|
+
report.append("#### Content")
|
|
223
|
+
report.append(f"- Accuracy: {content.accuracy_score if content else 0:.2f}")
|
|
224
|
+
report.append(f"- Completeness: {content.completeness_score if content else 0:.2f}")
|
|
225
|
+
report.append(f"- Organization: {content.organization_score if content else 0:.2f}")
|
|
226
|
+
report.append(f"- Readability: {content.readability_score if content else 0:.2f}")
|
|
227
|
+
report.append("")
|
|
228
|
+
|
|
229
|
+
# Accessibility metrics
|
|
230
|
+
accessibility = analysis_report.get("accessibility")
|
|
231
|
+
report.append("#### Accessibility")
|
|
232
|
+
report.append(
|
|
233
|
+
f"- Keyboard Navigation: {'✅' if (accessibility and accessibility.keyboard_navigation) else '❌'}"
|
|
234
|
+
)
|
|
235
|
+
report.append(
|
|
236
|
+
f"- Screen Reader Support: {'✅' if (accessibility and accessibility.screen_reader_support) else '❌'}"
|
|
237
|
+
)
|
|
238
|
+
report.append(
|
|
239
|
+
f"- Color Contrast: {'✅' if (accessibility and accessibility.color_contrast) else '❌'}"
|
|
240
|
+
)
|
|
241
|
+
report.append(
|
|
242
|
+
f"- Responsive Design: {'✅' if (accessibility and accessibility.responsive_design) else '❌'}"
|
|
243
|
+
)
|
|
244
|
+
report.append(
|
|
245
|
+
f"- ARIA Labels: {'✅' if (accessibility and accessibility.aria_labels) else '❌'}"
|
|
246
|
+
)
|
|
247
|
+
report.append("")
|
|
248
|
+
|
|
249
|
+
# Recommendations
|
|
250
|
+
report.append("### Improvement Recommendations")
|
|
251
|
+
report.append("")
|
|
252
|
+
for rec in analysis_report.get("recommendations", []):
|
|
253
|
+
report.append(f"- {rec}")
|
|
254
|
+
report.append("")
|
|
255
|
+
|
|
256
|
+
# Implementation plan
|
|
257
|
+
report.append("### Implementation Plan")
|
|
258
|
+
report.append("")
|
|
259
|
+
report.append(
|
|
260
|
+
f"**Estimated Duration**: {improvement_plan.get('estimated_duration', 'N/A')}"
|
|
261
|
+
)
|
|
262
|
+
report.append("")
|
|
263
|
+
|
|
264
|
+
timeline = improvement_plan.get("timeline", {})
|
|
265
|
+
for period, tasks in timeline.items():
|
|
266
|
+
if tasks:
|
|
267
|
+
report.append(f"#### {period.replace('_', ' ').title()}")
|
|
268
|
+
for task in tasks:
|
|
269
|
+
report.append(f"- {task}")
|
|
270
|
+
report.append("")
|
|
271
|
+
|
|
272
|
+
return "\n".join(report)
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
def run_command(args) -> int:
|
|
276
|
+
"""Run user experience improvement command"""
|
|
277
|
+
try:
|
|
278
|
+
# Execute analysis
|
|
279
|
+
analysis_report = asyncio.run(
|
|
280
|
+
analyze_user_experience(args.url, args.max_workers, args.verbose)
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
# Generate improvement plan
|
|
284
|
+
improvement_plan = generate_improvement_plan(analysis_report)
|
|
285
|
+
|
|
286
|
+
# Display results
|
|
287
|
+
if args.verbose:
|
|
288
|
+
console.print(
|
|
289
|
+
Panel.fit(
|
|
290
|
+
f"Overall Score: {analysis_report['overall_score']:.2f}",
|
|
291
|
+
title="Analysis Results",
|
|
292
|
+
style="blue",
|
|
293
|
+
)
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
# Display metrics table
|
|
297
|
+
metrics_table = format_metrics_table(analysis_report)
|
|
298
|
+
console.print(metrics_table)
|
|
299
|
+
|
|
300
|
+
# Display recommendations
|
|
301
|
+
if analysis_report.get("recommendations"):
|
|
302
|
+
recommendations_table = format_recommendations(
|
|
303
|
+
analysis_report["recommendations"]
|
|
304
|
+
)
|
|
305
|
+
console.print(recommendations_table)
|
|
306
|
+
|
|
307
|
+
# Display implementation plan
|
|
308
|
+
if improvement_plan.get("timeline"):
|
|
309
|
+
timeline_table = format_timeline(improvement_plan["timeline"])
|
|
310
|
+
console.print(timeline_table)
|
|
311
|
+
|
|
312
|
+
# Save results
|
|
313
|
+
if args.output:
|
|
314
|
+
if args.format == "json":
|
|
315
|
+
import json
|
|
316
|
+
|
|
317
|
+
result = {
|
|
318
|
+
"analysis": analysis_report,
|
|
319
|
+
"improvement_plan": improvement_plan,
|
|
320
|
+
}
|
|
321
|
+
output_content = json.dumps(result, indent=2, ensure_ascii=False)
|
|
322
|
+
else:
|
|
323
|
+
output_content = generate_markdown_report(
|
|
324
|
+
analysis_report, improvement_plan
|
|
325
|
+
)
|
|
326
|
+
|
|
327
|
+
output_path = Path(args.output)
|
|
328
|
+
output_path.write_text(output_content, encoding="utf-8")
|
|
329
|
+
console.print(f"\n[green]Results saved:[/green] {output_path}")
|
|
330
|
+
|
|
331
|
+
# Return exit code
|
|
332
|
+
if analysis_report["overall_score"] >= 0.85:
|
|
333
|
+
console.print(
|
|
334
|
+
f"\n[green]✅ User experience is excellent (score: {analysis_report['overall_score']:.2f})[/green]"
|
|
335
|
+
)
|
|
336
|
+
return 0
|
|
337
|
+
else:
|
|
338
|
+
console.print(
|
|
339
|
+
f"\n[yellow]⚠️ User experience needs improvement (score: {analysis_report['overall_score']:.2f})[/yellow]"
|
|
340
|
+
)
|
|
341
|
+
return 1
|
|
342
|
+
|
|
343
|
+
except KeyboardInterrupt:
|
|
344
|
+
console.print("\n[yellow]Analysis interrupted by user.[/yellow]")
|
|
345
|
+
return 1
|
|
346
|
+
except Exception as e:
|
|
347
|
+
console.print(f"[red]Error occurred:[/red] {e}")
|
|
348
|
+
return 1
|
moai_adk/cli/commands/init.py
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# @CODE:CLI-001 | @CODE:INIT-003:CLI
|
|
2
1
|
# SPEC: SPEC-CLI-001.md, SPEC-INIT-003.md
|
|
3
2
|
# TEST: tests/unit/test_cli_commands.py, tests/unit/test_init_reinit.py
|
|
4
3
|
"""MoAI-ADK init command
|
|
@@ -37,7 +36,9 @@ from rich.progress import BarColumn, Progress, SpinnerColumn, TaskID, TextColumn
|
|
|
37
36
|
|
|
38
37
|
from moai_adk import __version__
|
|
39
38
|
from moai_adk.cli.prompts import prompt_project_setup
|
|
39
|
+
from moai_adk.core.mcp.setup import MCPSetupManager
|
|
40
40
|
from moai_adk.core.project.initializer import ProjectInitializer
|
|
41
|
+
from moai_adk.statusline.version_reader import VersionConfig, VersionReader
|
|
41
42
|
from moai_adk.utils.banner import print_banner, print_welcome_message
|
|
42
43
|
|
|
43
44
|
console = Console()
|
|
@@ -85,9 +86,9 @@ def create_progress_callback(progress: Progress, task_ids: Sequence[TaskID]):
|
|
|
85
86
|
)
|
|
86
87
|
@click.option(
|
|
87
88
|
"--locale",
|
|
88
|
-
type=click.Choice(["ko", "en"]),
|
|
89
|
+
type=click.Choice(["ko", "en", "ja", "zh"]),
|
|
89
90
|
default=None,
|
|
90
|
-
help="Preferred language (default: en)",
|
|
91
|
+
help="Preferred language (ko/en/ja/zh, default: en)",
|
|
91
92
|
)
|
|
92
93
|
@click.option(
|
|
93
94
|
"--language",
|
|
@@ -95,6 +96,17 @@ def create_progress_callback(progress: Progress, task_ids: Sequence[TaskID]):
|
|
|
95
96
|
default=None,
|
|
96
97
|
help="Programming language (auto-detect if not specified)",
|
|
97
98
|
)
|
|
99
|
+
@click.option(
|
|
100
|
+
"--with-mcp",
|
|
101
|
+
multiple=True,
|
|
102
|
+
type=click.Choice(["context7", "figma", "playwright", "sequential-thinking"]),
|
|
103
|
+
help="Install MCP servers automatically (can be used multiple times)",
|
|
104
|
+
)
|
|
105
|
+
@click.option(
|
|
106
|
+
"--mcp-auto",
|
|
107
|
+
is_flag=True,
|
|
108
|
+
help="Auto-install all recommended MCP servers",
|
|
109
|
+
)
|
|
98
110
|
@click.option(
|
|
99
111
|
"--force",
|
|
100
112
|
is_flag=True,
|
|
@@ -106,6 +118,8 @@ def init(
|
|
|
106
118
|
mode: str,
|
|
107
119
|
locale: str,
|
|
108
120
|
language: str | None,
|
|
121
|
+
with_mcp: tuple,
|
|
122
|
+
mcp_auto: bool,
|
|
109
123
|
force: bool,
|
|
110
124
|
) -> None:
|
|
111
125
|
"""Initialize a new MoAI-ADK project
|
|
@@ -114,18 +128,38 @@ def init(
|
|
|
114
128
|
path: Project directory path (default: current directory)
|
|
115
129
|
non_interactive: Skip prompts and use defaults
|
|
116
130
|
mode: Project mode (personal/team)
|
|
117
|
-
locale: Preferred language (ko/en).
|
|
131
|
+
locale: Preferred language (ko/en/ja/zh). Interactive mode supports additional languages.
|
|
118
132
|
language: Programming language
|
|
133
|
+
with_mcp: Install specific MCP servers (can be used multiple times)
|
|
134
|
+
mcp_auto: Auto-install all recommended MCP servers
|
|
119
135
|
force: Force reinitialize without confirmation
|
|
120
136
|
"""
|
|
121
137
|
try:
|
|
122
|
-
# 1. Print banner
|
|
138
|
+
# 1. Print banner with enhanced version info
|
|
123
139
|
print_banner(__version__)
|
|
124
140
|
|
|
125
|
-
# 2.
|
|
141
|
+
# 2. Enhanced version reading with error handling
|
|
142
|
+
try:
|
|
143
|
+
version_config = VersionConfig(
|
|
144
|
+
cache_ttl_seconds=10, # Very short cache for CLI
|
|
145
|
+
fallback_version=__version__,
|
|
146
|
+
debug_mode=False,
|
|
147
|
+
)
|
|
148
|
+
version_reader = VersionReader(version_config)
|
|
149
|
+
current_version = version_reader.get_version()
|
|
150
|
+
|
|
151
|
+
# Log version info for debugging
|
|
152
|
+
console.print(f"[dim]Current MoAI-ADK version: {current_version}[/dim]")
|
|
153
|
+
except Exception as e:
|
|
154
|
+
console.print(f"[yellow]⚠️ Version read error: {e}[/yellow]")
|
|
155
|
+
|
|
156
|
+
# 3. Check current directory mode
|
|
126
157
|
is_current_dir = path == "."
|
|
127
158
|
project_path = Path(path).resolve()
|
|
128
159
|
|
|
160
|
+
# Initialize variables
|
|
161
|
+
custom_language = None
|
|
162
|
+
|
|
129
163
|
# 3. Interactive vs Non-Interactive
|
|
130
164
|
if non_interactive:
|
|
131
165
|
# Non-Interactive Mode
|
|
@@ -134,10 +168,33 @@ def init(
|
|
|
134
168
|
)
|
|
135
169
|
project_name = project_path.name if is_current_dir else path
|
|
136
170
|
locale = locale or "en"
|
|
171
|
+
# Language detection happens in /alfred:0-project, so default to None here
|
|
172
|
+
# This will become "generic" internally, but Summary will show more helpful message
|
|
173
|
+
if not language:
|
|
174
|
+
language = None
|
|
175
|
+
|
|
176
|
+
# Handle MCP options in non-interactive mode
|
|
177
|
+
if mcp_auto:
|
|
178
|
+
mcp_servers = ["context7", "playwright", "sequential-thinking"]
|
|
179
|
+
console.print(
|
|
180
|
+
"[cyan]🔧 MCP servers:[/cyan] Auto-installing all recommended servers"
|
|
181
|
+
)
|
|
182
|
+
elif with_mcp:
|
|
183
|
+
mcp_servers = list(with_mcp)
|
|
184
|
+
console.print(f"[cyan]🔧 MCP servers:[/cyan] {', '.join(mcp_servers)}")
|
|
185
|
+
else:
|
|
186
|
+
mcp_servers = []
|
|
137
187
|
else:
|
|
138
188
|
# Interactive Mode
|
|
139
189
|
print_welcome_message()
|
|
140
190
|
|
|
191
|
+
# Check for MCP CLI options in interactive mode (warn user)
|
|
192
|
+
if mcp_auto or with_mcp:
|
|
193
|
+
console.print(
|
|
194
|
+
"[yellow]⚠️ MCP options ignored in interactive mode[/yellow]"
|
|
195
|
+
)
|
|
196
|
+
console.print(" Please use the interactive prompts instead.\n")
|
|
197
|
+
|
|
141
198
|
# Interactive prompt
|
|
142
199
|
answers = prompt_project_setup(
|
|
143
200
|
project_name=None if is_current_dir else path,
|
|
@@ -151,6 +208,8 @@ def init(
|
|
|
151
208
|
locale = answers["locale"]
|
|
152
209
|
language = answers["language"]
|
|
153
210
|
project_name = answers["project_name"]
|
|
211
|
+
mcp_servers = answers.get("mcp_servers", [])
|
|
212
|
+
custom_language = answers.get("custom_language")
|
|
154
213
|
|
|
155
214
|
console.print("\n[cyan]🚀 Starting installation...[/cyan]\n")
|
|
156
215
|
|
|
@@ -163,7 +222,9 @@ def init(
|
|
|
163
222
|
if initializer.is_initialized():
|
|
164
223
|
# Always reinitialize without confirmation (force mode by default)
|
|
165
224
|
if non_interactive:
|
|
166
|
-
console.print(
|
|
225
|
+
console.print(
|
|
226
|
+
"\n[green]🔄 Reinitializing project (force mode)...[/green]\n"
|
|
227
|
+
)
|
|
167
228
|
else:
|
|
168
229
|
# Interactive mode: Simple notification
|
|
169
230
|
console.print("\n[cyan]🔄 Reinitializing project...[/cyan]")
|
|
@@ -187,7 +248,7 @@ def init(
|
|
|
187
248
|
except Exception:
|
|
188
249
|
pass # Ignore removal failures
|
|
189
250
|
|
|
190
|
-
config_path = project_path / ".moai" / "config.json"
|
|
251
|
+
config_path = project_path / ".moai" / "config" / "config.json"
|
|
191
252
|
if config_path.exists():
|
|
192
253
|
try:
|
|
193
254
|
with open(config_path, "r", encoding="utf-8") as f:
|
|
@@ -196,7 +257,20 @@ def init(
|
|
|
196
257
|
# Update version and optimization flags
|
|
197
258
|
if "moai" not in config_data:
|
|
198
259
|
config_data["moai"] = {}
|
|
199
|
-
|
|
260
|
+
|
|
261
|
+
# Use enhanced version reader for consistent version handling
|
|
262
|
+
try:
|
|
263
|
+
version_config = VersionConfig(
|
|
264
|
+
cache_ttl_seconds=5, # Very short cache for config update
|
|
265
|
+
fallback_version=__version__,
|
|
266
|
+
debug_mode=False,
|
|
267
|
+
)
|
|
268
|
+
version_reader = VersionReader(version_config)
|
|
269
|
+
current_version = version_reader.get_version()
|
|
270
|
+
config_data["moai"]["version"] = current_version
|
|
271
|
+
except Exception:
|
|
272
|
+
# Fallback to package version
|
|
273
|
+
config_data["moai"]["version"] = __version__
|
|
200
274
|
|
|
201
275
|
if "project" not in config_data:
|
|
202
276
|
config_data["project"] = {}
|
|
@@ -230,6 +304,7 @@ def init(
|
|
|
230
304
|
mode=mode,
|
|
231
305
|
locale=locale,
|
|
232
306
|
language=language,
|
|
307
|
+
custom_language=custom_language,
|
|
233
308
|
backup_enabled=True,
|
|
234
309
|
progress_callback=callback,
|
|
235
310
|
reinit=True, # Always allow reinit (force mode by default)
|
|
@@ -244,21 +319,41 @@ def init(
|
|
|
244
319
|
console.print(separator)
|
|
245
320
|
console.print("\n[cyan]📊 Summary:[/cyan]")
|
|
246
321
|
console.print(f" [dim]📁 Location:[/dim] {result.project_path}")
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
322
|
+
# Show language more clearly - "generic" means auto-detect
|
|
323
|
+
language_display = (
|
|
324
|
+
"Auto-detect (use /alfred:0-project)"
|
|
325
|
+
if result.language == "generic"
|
|
326
|
+
else result.language
|
|
251
327
|
)
|
|
328
|
+
console.print(f" [dim]🌐 Language:[/dim] {language_display}")
|
|
329
|
+
console.print(f" [dim]🔧 Mode:[/dim] {result.mode}")
|
|
330
|
+
console.print(f" [dim]🌍 Locale:[/dim] {result.locale}")
|
|
252
331
|
console.print(
|
|
253
332
|
f" [dim]📄 Files:[/dim] {len(result.created_files)} created"
|
|
254
333
|
)
|
|
255
334
|
console.print(f" [dim]⏱️ Duration:[/dim] {result.duration}ms")
|
|
256
335
|
|
|
336
|
+
# Show MCP setup info
|
|
337
|
+
if mcp_servers:
|
|
338
|
+
console.print(f" [dim]🔧 MCP Servers:[/dim] {', '.join(mcp_servers)}")
|
|
339
|
+
|
|
340
|
+
# MCP Setup (if servers selected)
|
|
341
|
+
if mcp_servers:
|
|
342
|
+
console.print("\n[cyan]🔧 Setting up MCP servers...[/cyan]")
|
|
343
|
+
mcp_manager = MCPSetupManager(project_path)
|
|
344
|
+
mcp_success = mcp_manager.setup_mcp_servers(mcp_servers)
|
|
345
|
+
if not mcp_success:
|
|
346
|
+
console.print(
|
|
347
|
+
"[yellow]⚠️ MCP setup completed with warnings[/yellow]"
|
|
348
|
+
)
|
|
349
|
+
|
|
257
350
|
# Show backup info if reinitialized
|
|
258
351
|
if is_reinit:
|
|
259
352
|
backup_dir = project_path / ".moai-backups"
|
|
260
353
|
if backup_dir.exists():
|
|
261
|
-
latest_backup = max(
|
|
354
|
+
latest_backup = max(
|
|
355
|
+
backup_dir.iterdir(), key=lambda p: p.stat().st_mtime
|
|
356
|
+
)
|
|
262
357
|
console.print(f" [dim]💾 Backup:[/dim] {latest_backup.name}/")
|
|
263
358
|
|
|
264
359
|
console.print(f"\n{separator}")
|
|
@@ -266,11 +361,19 @@ def init(
|
|
|
266
361
|
# Show config merge notice if reinitialized
|
|
267
362
|
if is_reinit:
|
|
268
363
|
console.print("\n[yellow]⚠️ Configuration Notice:[/yellow]")
|
|
269
|
-
console.print(
|
|
270
|
-
|
|
364
|
+
console.print(
|
|
365
|
+
" All template files have been [bold]force overwritten[/bold]"
|
|
366
|
+
)
|
|
367
|
+
console.print(
|
|
368
|
+
" Previous files are backed up in [cyan].moai-backups/backup/[/cyan]"
|
|
369
|
+
)
|
|
271
370
|
console.print("\n [cyan]To merge your previous config:[/cyan]")
|
|
272
|
-
console.print(
|
|
273
|
-
|
|
371
|
+
console.print(
|
|
372
|
+
" Run [bold]/alfred:0-project[/bold] command in Claude Code"
|
|
373
|
+
)
|
|
374
|
+
console.print(
|
|
375
|
+
" It will merge backup config when [dim]optimized=false[/dim]\n"
|
|
376
|
+
)
|
|
274
377
|
|
|
275
378
|
console.print("\n[cyan]🚀 Next Steps:[/cyan]")
|
|
276
379
|
if not is_current_dir:
|
|
@@ -278,18 +381,40 @@ def init(
|
|
|
278
381
|
f" [blue]1.[/blue] Run [bold]cd {project_name}[/bold] to enter the project"
|
|
279
382
|
)
|
|
280
383
|
console.print(
|
|
281
|
-
" [blue]2.[/blue]
|
|
384
|
+
" [blue]2.[/blue] Run [bold]/alfred:0-project[/bold] in Claude Code for full setup"
|
|
282
385
|
)
|
|
283
386
|
console.print(
|
|
284
|
-
"
|
|
387
|
+
" (Configure: mode, language, report generation, etc.)"
|
|
285
388
|
)
|
|
286
389
|
else:
|
|
287
390
|
console.print(
|
|
288
|
-
" [blue]1.[/blue]
|
|
391
|
+
" [blue]1.[/blue] Run [bold]/alfred:0-project[/bold] in Claude Code for full setup"
|
|
392
|
+
)
|
|
393
|
+
console.print(
|
|
394
|
+
" (Configure: mode, language, report generation, etc.)"
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
# Figma token setup guidance
|
|
398
|
+
if mcp_servers and "figma" in mcp_servers:
|
|
399
|
+
console.print("\n[yellow]🔐 Figma Access Token Setup:[/yellow]")
|
|
400
|
+
console.print(
|
|
401
|
+
" [dim]Figma MCP requires an access token to function:[/dim]"
|
|
402
|
+
)
|
|
403
|
+
console.print(
|
|
404
|
+
" 1. Visit: https://www.figma.com/developers/api#access-tokens"
|
|
289
405
|
)
|
|
406
|
+
console.print(" 2. Create a new access token")
|
|
290
407
|
console.print(
|
|
291
|
-
"
|
|
408
|
+
" 3. Run [bold]/alfred:0-project[/bold] and follow the Figma setup prompts"
|
|
292
409
|
)
|
|
410
|
+
console.print(
|
|
411
|
+
" 4. The token will be securely stored in your environment\n"
|
|
412
|
+
)
|
|
413
|
+
|
|
414
|
+
if not is_current_dir:
|
|
415
|
+
console.print(" [blue]3.[/blue] Start developing with MoAI-ADK!\n")
|
|
416
|
+
else:
|
|
417
|
+
console.print(" [blue]2.[/blue] Start developing with MoAI-ADK!\n")
|
|
293
418
|
else:
|
|
294
419
|
console.print("\n[red bold]❌ Initialization Failed![/red bold]")
|
|
295
420
|
if result.errors:
|
|
@@ -304,7 +429,9 @@ def init(
|
|
|
304
429
|
raise click.Abort()
|
|
305
430
|
except FileExistsError as e:
|
|
306
431
|
console.print("\n[yellow]⚠ Project already initialized[/yellow]")
|
|
307
|
-
console.print(
|
|
432
|
+
console.print(
|
|
433
|
+
"[dim] Use 'python -m moai_adk status' to check configuration[/dim]\n"
|
|
434
|
+
)
|
|
308
435
|
raise click.Abort() from e
|
|
309
436
|
except Exception as e:
|
|
310
437
|
console.print(f"\n[red]✗ Initialization failed: {e}[/red]\n")
|