moai-adk 0.4.5__py3-none-any.whl → 0.20.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +1 -1
- moai_adk/__main__.py +74 -1
- moai_adk/cli/commands/__init__.py +1 -1
- moai_adk/cli/commands/analyze.py +119 -0
- moai_adk/cli/commands/backup.py +25 -1
- moai_adk/cli/commands/doctor.py +31 -5
- moai_adk/cli/commands/improve_user_experience.py +307 -0
- moai_adk/cli/commands/init.py +111 -10
- moai_adk/cli/commands/status.py +33 -3
- moai_adk/cli/commands/update.py +921 -130
- moai_adk/cli/commands/validate_links.py +120 -0
- moai_adk/cli/prompts/init_prompts.py +22 -87
- moai_adk/core/analysis/__init__.py +9 -0
- moai_adk/core/analysis/session_analyzer.py +388 -0
- moai_adk/core/analysis/tag_chain_analyzer.py +344 -0
- moai_adk/core/analysis/tag_chain_repair.py +879 -0
- moai_adk/core/config/__init__.py +19 -0
- moai_adk/core/config/migration.py +235 -0
- moai_adk/core/git/__init__.py +1 -1
- moai_adk/core/git/branch.py +1 -1
- moai_adk/core/git/commit.py +1 -1
- moai_adk/core/git/manager.py +1 -1
- moai_adk/core/issue_creator.py +313 -0
- moai_adk/core/mcp/setup.py +56 -0
- moai_adk/core/mcp/setup_old.py +296 -0
- moai_adk/core/project/backup_utils.py +1 -1
- moai_adk/core/project/checker.py +2 -2
- moai_adk/core/project/detector.py +211 -12
- moai_adk/core/project/initializer.py +85 -15
- moai_adk/core/project/phase_executor.py +76 -13
- moai_adk/core/project/validator.py +13 -13
- moai_adk/core/quality/__init__.py +1 -1
- moai_adk/core/quality/trust_checker.py +1 -1
- moai_adk/core/quality/validators/__init__.py +1 -1
- moai_adk/core/quality/validators/base_validator.py +1 -1
- moai_adk/core/tags/__init__.py +86 -0
- moai_adk/core/tags/auto_corrector.py +693 -0
- moai_adk/core/tags/ci_validator.py +463 -0
- moai_adk/core/tags/cli.py +283 -0
- moai_adk/core/tags/generator.py +109 -0
- moai_adk/core/tags/inserter.py +99 -0
- moai_adk/core/tags/mapper.py +126 -0
- moai_adk/core/tags/parser.py +76 -0
- moai_adk/core/tags/policy_validator.py +580 -0
- moai_adk/core/tags/pre_commit_validator.py +421 -0
- moai_adk/core/tags/reporter.py +956 -0
- moai_adk/core/tags/rollback_manager.py +525 -0
- moai_adk/core/tags/tags.py +149 -0
- moai_adk/core/tags/validator.py +897 -0
- moai_adk/core/template/__init__.py +1 -1
- moai_adk/core/template/backup.py +1 -1
- moai_adk/core/template/merger.py +50 -1
- moai_adk/core/template/processor.py +119 -13
- moai_adk/core/template_engine.py +268 -0
- moai_adk/templates/.claude/agents/alfred/backend-expert.md +348 -0
- moai_adk/templates/.claude/agents/alfred/cc-manager.md +209 -944
- moai_adk/templates/.claude/agents/alfred/database-expert.md +352 -0
- moai_adk/templates/.claude/agents/alfred/debug-helper.md +34 -5
- moai_adk/templates/.claude/agents/alfred/devops-expert.md +464 -0
- moai_adk/templates/.claude/agents/alfred/doc-syncer.md +38 -8
- moai_adk/templates/.claude/agents/alfred/format-expert.md +469 -0
- moai_adk/templates/.claude/agents/alfred/frontend-expert.md +357 -0
- moai_adk/templates/.claude/agents/alfred/git-manager.md +128 -9
- moai_adk/templates/.claude/agents/alfred/implementation-planner.md +104 -6
- moai_adk/templates/.claude/agents/alfred/project-manager.md +88 -16
- moai_adk/templates/.claude/agents/alfred/quality-gate.md +36 -9
- moai_adk/templates/.claude/agents/alfred/security-expert.md +270 -0
- moai_adk/templates/.claude/agents/alfred/skill-factory.md +865 -0
- moai_adk/templates/.claude/agents/alfred/spec-builder.md +214 -43
- moai_adk/templates/.claude/agents/alfred/tag-agent.md +111 -9
- moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +309 -160
- moai_adk/templates/.claude/agents/alfred/trust-checker.md +36 -7
- moai_adk/templates/.claude/agents/alfred/ui-ux-expert.md +605 -0
- moai_adk/templates/.claude/commands/alfred/0-project.md +393 -966
- moai_adk/templates/.claude/commands/alfred/1-plan.md +651 -367
- moai_adk/templates/.claude/commands/alfred/2-run.md +388 -241
- moai_adk/templates/.claude/commands/alfred/3-sync.md +1921 -410
- moai_adk/templates/.claude/commands/alfred/9-feedback.md +153 -0
- moai_adk/templates/.claude/commands/alfred/release-new.md +3604 -0
- moai_adk/templates/.claude/hooks/alfred/core/project.py +484 -20
- moai_adk/templates/.claude/hooks/alfred/core/timeout.py +136 -0
- moai_adk/templates/.claude/hooks/alfred/core/ttl_cache.py +108 -0
- moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +198 -0
- moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +14 -6
- moai_adk/templates/.claude/hooks/alfred/post_tool__enable_streaming_ui.py +50 -0
- moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +93 -0
- moai_adk/templates/.claude/hooks/alfred/post_tool__tag_auto_corrector.py +407 -0
- moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +99 -0
- moai_adk/templates/.claude/hooks/alfred/pre_tool__realtime_tag_monitor.py +335 -0
- moai_adk/templates/.claude/hooks/alfred/pre_tool__tag_policy_validator.py +325 -0
- moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +93 -0
- moai_adk/templates/.claude/hooks/alfred/session_start__auto_cleanup.py +580 -0
- moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +298 -0
- moai_adk/templates/.claude/hooks/alfred/shared/core/__init__.py +170 -0
- moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/checkpoint.py +3 -3
- moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/context.py +5 -5
- moai_adk/templates/.claude/hooks/alfred/shared/core/project.py +749 -0
- moai_adk/templates/.claude/hooks/alfred/shared/core/tags.py +230 -0
- moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +198 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/__init__.py +21 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/daily_analysis.py +351 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/notification.py +154 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/session.py +174 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/tool.py +87 -0
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/user.py +61 -0
- moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +111 -0
- moai_adk/templates/.claude/hooks/alfred/utils/__init__.py +1 -0
- moai_adk/templates/.claude/hooks/alfred/utils/hook_config.py +94 -0
- moai_adk/templates/.claude/hooks/alfred/utils/timeout.py +161 -0
- moai_adk/templates/.claude/output-styles/alfred/alfred-moai-adk-beginner.md +267 -0
- moai_adk/templates/.claude/output-styles/alfred/keating-personal-tutor.md +440 -0
- moai_adk/templates/.claude/output-styles/alfred/r2d2-agentic-coding.md +583 -0
- moai_adk/templates/.claude/settings.json +96 -14
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/SKILL.md +70 -0
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/examples.md +62 -0
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/reference.md +242 -0
- moai_adk/templates/.claude/skills/moai-alfred-ask-user-questions/SKILL.md +237 -0
- moai_adk/templates/.claude/skills/moai-alfred-ask-user-questions/examples.md +871 -0
- moai_adk/templates/.claude/skills/moai-alfred-ask-user-questions/reference.md +653 -0
- moai_adk/templates/.claude/skills/moai-alfred-clone-pattern/README.md +162 -0
- moai_adk/templates/.claude/skills/moai-alfred-clone-pattern/SKILL.md +227 -0
- moai_adk/templates/.claude/skills/moai-alfred-clone-pattern/examples.md +354 -0
- moai_adk/templates/.claude/skills/moai-alfred-clone-pattern/reference.md +158 -0
- moai_adk/templates/.claude/skills/moai-alfred-code-reviewer/SKILL.md +179 -79
- moai_adk/templates/.claude/skills/moai-alfred-code-reviewer/examples.md +117 -0
- moai_adk/templates/.claude/skills/moai-alfred-code-reviewer/scripts/pre-review-check.sh +62 -0
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/SKILL.md +132 -0
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/examples.md +28 -0
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/reference.md +444 -0
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/SKILL.md +62 -0
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/examples.md +28 -0
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/reference.md +405 -0
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/SKILL.md +51 -0
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/examples.md +355 -0
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/reference.md +239 -0
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/SKILL.md +323 -0
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/examples.md +286 -0
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/reference.md +126 -0
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/SKILL.md +229 -0
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/examples.md +4 -0
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/reference.md +150 -0
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +87 -73
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-alfred-personas/README.md +42 -0
- moai_adk/templates/.claude/skills/moai-alfred-personas/SKILL.md +429 -0
- moai_adk/templates/.claude/skills/moai-alfred-personas/examples.md +520 -0
- moai_adk/templates/.claude/skills/moai-alfred-personas/reference.md +405 -0
- moai_adk/templates/.claude/skills/moai-alfred-practices/SKILL.md +89 -0
- moai_adk/templates/.claude/skills/moai-alfred-practices/examples.md +122 -0
- moai_adk/templates/.claude/skills/moai-alfred-practices/reference.md +369 -0
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/SKILL.md +508 -0
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/examples.md +481 -0
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/reference.md +100 -0
- moai_adk/templates/.claude/skills/moai-alfred-rules/SKILL.md +77 -0
- moai_adk/templates/.claude/skills/moai-alfred-rules/examples.md +265 -0
- moai_adk/templates/.claude/skills/moai-alfred-rules/reference.md +539 -0
- moai_adk/templates/.claude/skills/moai-alfred-session-state/SKILL.md +320 -0
- moai_adk/templates/.claude/skills/moai-alfred-session-state/examples.md +4 -0
- moai_adk/templates/.claude/skills/moai-alfred-session-state/reference.md +84 -0
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/README.md +137 -0
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/SKILL.md +219 -0
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples/validate-spec.sh +161 -0
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples.md +541 -0
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/reference.md +622 -0
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/SKILL.md +19 -0
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/examples.md +4 -0
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/reference.md +211 -0
- moai_adk/templates/.claude/skills/moai-alfred-workflow/SKILL.md +288 -0
- moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +269 -0
- moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +32 -0
- moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +298 -0
- moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +26 -0
- moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +307 -0
- moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +21 -0
- moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +252 -0
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +19 -0
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +19 -0
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +24 -0
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +199 -0
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +39 -0
- moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +316 -0
- moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +18 -0
- moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +263 -0
- moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +30 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/CHECKLIST.md +482 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/EXAMPLES.md +303 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/INTERACTIVE-DISCOVERY.md +524 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/METADATA.md +477 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/PARALLEL-ANALYSIS-REPORT.md +429 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/PYTHON-VERSION-MATRIX.md +391 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-FACTORY-WORKFLOW.md +431 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-UPDATE-ADVISOR.md +577 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL.md +273 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/STEP-BY-STEP-GUIDE.md +466 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/STRUCTURE.md +583 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/WEB-RESEARCH.md +526 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/reference.md +608 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/generate-structure.sh +328 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/validate-skill.sh +312 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/SKILL_TEMPLATE.md +245 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/examples-template.md +285 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/reference-template.md +278 -0
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/scripts-template.sh +303 -0
- moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +291 -0
- moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +15 -0
- moai_adk/templates/.claude/skills/moai-change-logger/SKILL.md +563 -0
- moai_adk/templates/.claude/skills/moai-design-systems/SKILL.md +802 -0
- moai_adk/templates/.claude/skills/moai-design-systems/examples.md +1238 -0
- moai_adk/templates/.claude/skills/moai-design-systems/reference.md +673 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +234 -43
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +1633 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +660 -0
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +97 -69
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +97 -72
- moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +97 -74
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +98 -74
- moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +102 -73
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +97 -73
- moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +97 -67
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +97 -79
- moai_adk/templates/.claude/skills/moai-domain-security/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-security/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +97 -71
- moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +265 -64
- moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +1064 -0
- moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +1047 -0
- moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +87 -78
- moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +87 -70
- moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +87 -86
- moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +80 -62
- moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +207 -50
- moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +90 -71
- moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +78 -58
- moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +78 -51
- moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +28 -0
- moai_adk/templates/.claude/skills/moai-foundation-trust/.!11330!examples.md +0 -0
- moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +253 -32
- moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
- moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +1099 -0
- moai_adk/templates/.claude/skills/moai-jit-docs-enhanced/SKILL.md +460 -0
- moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +98 -74
- moai_adk/templates/.claude/skills/moai-lang-c/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-c/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +98 -76
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +2358 -70
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +2962 -68
- moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +1898 -70
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +1465 -68
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +2364 -66
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +32 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +1630 -69
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +89 -61
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +735 -66
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +624 -0
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +316 -0
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +97 -73
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +98 -73
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +1834 -70
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +99 -74
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +97 -74
- moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +98 -74
- moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +31 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +1959 -69
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +30 -0
- moai_adk/templates/.claude/skills/moai-lang-template/SKILL.md +348 -0
- moai_adk/templates/.claude/skills/moai-lang-template/VARIABLES.md +98 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +1230 -66
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +29 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +34 -0
- moai_adk/templates/.claude/skills/moai-learning-optimizer/SKILL.md +575 -0
- moai_adk/templates/.claude/skills/moai-project-batch-questions/README.md +50 -0
- moai_adk/templates/.claude/skills/moai-project-batch-questions/SKILL.md +304 -0
- moai_adk/templates/.claude/skills/moai-project-batch-questions/examples.md +417 -0
- moai_adk/templates/.claude/skills/moai-project-batch-questions/reference.md +704 -0
- moai_adk/templates/.claude/skills/moai-project-config-manager/README.md +87 -0
- moai_adk/templates/.claude/skills/moai-project-config-manager/SKILL.md +552 -0
- moai_adk/templates/.claude/skills/moai-project-config-manager/examples.md +1109 -0
- moai_adk/templates/.claude/skills/moai-project-config-manager/reference.md +514 -0
- moai_adk/templates/.claude/skills/moai-project-config-manager/validate.py +106 -0
- moai_adk/templates/.claude/skills/moai-project-documentation/README.md +11 -0
- moai_adk/templates/.claude/skills/moai-project-documentation/SKILL.md +622 -0
- moai_adk/templates/.claude/skills/moai-project-documentation/examples.md +20 -0
- moai_adk/templates/.claude/skills/moai-project-documentation/reference.md +12 -0
- moai_adk/templates/.claude/skills/moai-project-language-initializer/README.md +152 -0
- moai_adk/templates/.claude/skills/moai-project-language-initializer/SKILL.md +285 -0
- moai_adk/templates/.claude/skills/moai-project-language-initializer/examples.md +333 -0
- moai_adk/templates/.claude/skills/moai-project-language-initializer/reference.md +386 -0
- moai_adk/templates/.claude/skills/moai-project-template-optimizer/README.md +49 -0
- moai_adk/templates/.claude/skills/moai-project-template-optimizer/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-project-template-optimizer/examples.md +58 -0
- moai_adk/templates/.claude/skills/moai-project-template-optimizer/reference.md +123 -0
- moai_adk/templates/.claude/skills/moai-session-info/SKILL.md +314 -0
- moai_adk/templates/.claude/skills/moai-streaming-ui/SKILL.md +552 -0
- moai_adk/templates/.claude/skills/moai-tag-policy-validator/SKILL.md +570 -0
- moai_adk/templates/.git-hooks/pre-commit +66 -0
- moai_adk/templates/.git-hooks/pre-push +255 -0
- moai_adk/templates/.github/workflows/c-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/cpp-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/csharp-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/dart-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/go-tag-validation.yml +130 -0
- moai_adk/templates/.github/workflows/java-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/javascript-tag-validation.yml +135 -0
- moai_adk/templates/.github/workflows/kotlin-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/moai-gitflow.yml +166 -3
- moai_adk/templates/.github/workflows/moai-release-create.yml +100 -0
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +188 -0
- moai_adk/templates/.github/workflows/php-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/python-tag-validation.yml +118 -0
- moai_adk/templates/.github/workflows/release.yml +118 -0
- moai_adk/templates/.github/workflows/ruby-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/rust-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/shell-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/spec-issue-sync.yml +338 -0
- moai_adk/templates/.github/workflows/swift-tag-validation.yml +11 -0
- moai_adk/templates/.github/workflows/tag-report.yml +269 -0
- moai_adk/templates/.github/workflows/tag-validation.yml +186 -0
- moai_adk/templates/.github/workflows/typescript-tag-validation.yml +154 -0
- moai_adk/templates/.mcp.json +31 -0
- moai_adk/templates/.moai/config.json +80 -7
- moai_adk/templates/CLAUDE.md +562 -546
- moai_adk/utils/banner.py +5 -5
- moai_adk/utils/common.py +294 -0
- moai_adk/utils/link_validator.py +235 -0
- moai_adk/utils/logger.py +8 -8
- moai_adk/utils/user_experience.py +451 -0
- moai_adk-0.20.1.dist-info/METADATA +233 -0
- moai_adk-0.20.1.dist-info/RECORD +404 -0
- moai_adk/templates/.claude/hooks/alfred/README.md +0 -230
- moai_adk/templates/.claude/hooks/alfred/alfred_hooks.py +0 -156
- moai_adk/templates/.claude/hooks/alfred/core/__init__.py +0 -85
- moai_adk/templates/.claude/hooks/alfred/handlers/notification.py +0 -25
- moai_adk/templates/.claude/hooks/alfred/handlers/session.py +0 -92
- moai_adk/templates/.claude/hooks/alfred/handlers/tool.py +0 -70
- moai_adk/templates/.claude/hooks/alfred/handlers/user.py +0 -41
- moai_adk/templates/.claude/output-styles/alfred/agentic-coding.md +0 -636
- moai_adk/templates/.claude/output-styles/alfred/moai-adk-learning.md +0 -692
- moai_adk/templates/.claude/output-styles/alfred/study-with-alfred.md +0 -470
- moai_adk/templates/.claude/skills/moai-alfred-debugger-pro/SKILL.md +0 -103
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -103
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -95
- moai_adk/templates/.claude/skills/moai-alfred-performance-optimizer/SKILL.md +0 -105
- moai_adk/templates/.claude/skills/moai-alfred-refactoring-coach/SKILL.md +0 -97
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -97
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -90
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -99
- moai_adk/templates/.claude/skills/moai-alfred-tui-survey/SKILL.md +0 -87
- moai_adk/templates/.claude/skills/moai-alfred-tui-survey/examples.md +0 -62
- moai_adk/templates/.claude/skills/moai-claude-code/SKILL.md +0 -94
- moai_adk/templates/.claude/skills/moai-claude-code/examples.md +0 -513
- moai_adk/templates/.claude/skills/moai-claude-code/reference.md +0 -433
- moai_adk/templates/.claude/skills/moai-claude-code/templates/agent-full.md +0 -332
- moai_adk/templates/.claude/skills/moai-claude-code/templates/command-full.md +0 -384
- moai_adk/templates/.claude/skills/moai-claude-code/templates/plugin-full.json +0 -363
- moai_adk/templates/.claude/skills/moai-claude-code/templates/settings-full.json +0 -595
- moai_adk/templates/.claude/skills/moai-claude-code/templates/skill-full.md +0 -496
- moai_adk/templates/.claude/skills/moai-lang-clojure/SKILL.md +0 -100
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +0 -99
- moai_adk/templates/.claude/skills/moai-lang-haskell/SKILL.md +0 -100
- moai_adk/templates/.claude/skills/moai-lang-julia/SKILL.md +0 -98
- moai_adk/templates/.claude/skills/moai-lang-lua/SKILL.md +0 -98
- moai_adk/templates/.github/PULL_REQUEST_TEMPLATE.md +0 -69
- moai_adk/templates/.moai/memory/development-guide.md +0 -344
- moai_adk/templates/.moai/memory/gitflow-protection-policy.md +0 -220
- moai_adk/templates/.moai/memory/spec-metadata.md +0 -356
- moai_adk/templates/.moai/project/product.md +0 -161
- moai_adk/templates/.moai/project/structure.md +0 -156
- moai_adk/templates/.moai/project/tech.md +0 -227
- moai_adk/templates/__init__.py +0 -2
- moai_adk-0.4.5.dist-info/METADATA +0 -369
- moai_adk-0.4.5.dist-info/RECORD +0 -152
- {moai_adk-0.4.5.dist-info → moai_adk-0.20.1.dist-info}/WHEEL +0 -0
- {moai_adk-0.4.5.dist-info → moai_adk-0.20.1.dist-info}/entry_points.txt +0 -0
- {moai_adk-0.4.5.dist-info → moai_adk-0.20.1.dist-info}/licenses/LICENSE +0 -0
moai_adk/__init__.py
CHANGED
moai_adk/__main__.py
CHANGED
|
@@ -38,7 +38,7 @@ def show_logo() -> None:
|
|
|
38
38
|
console.print(__version__, style="cyan bold")
|
|
39
39
|
console.print()
|
|
40
40
|
console.print(" Tip: Run ", style="yellow", end="")
|
|
41
|
-
console.print("
|
|
41
|
+
console.print("uv run moai-adk --help", style="cyan", end="")
|
|
42
42
|
console.print(" to see available commands", style="yellow")
|
|
43
43
|
|
|
44
44
|
|
|
@@ -61,6 +61,48 @@ cli.add_command(backup)
|
|
|
61
61
|
cli.add_command(update)
|
|
62
62
|
|
|
63
63
|
|
|
64
|
+
# 링크 검증 명령
|
|
65
|
+
@click.command(name='validate-links')
|
|
66
|
+
@click.option('--file', '-f', default='README.ko.md', help='검증할 파일 경로 (기본값: README.ko.md)')
|
|
67
|
+
@click.option('--max-concurrent', '-c', type=int, default=3, help='동시에 검증할 최대 링크 수 (기본값: 3)')
|
|
68
|
+
@click.option('--timeout', '-t', type=int, default=8, help='요청 타임아웃 (초) (기본값: 8)')
|
|
69
|
+
@click.option('--output', '-o', help='결과를 저장할 파일 경로')
|
|
70
|
+
@click.option('--verbose', '-v', is_flag=True, help='상세한 진행 상황 표시')
|
|
71
|
+
def validate_links(file, max_concurrent, timeout, output, verbose):
|
|
72
|
+
"""온라인 문서 링크 검증"""
|
|
73
|
+
from moai_adk.cli.commands.validate_links import run_command as validate_links_run
|
|
74
|
+
|
|
75
|
+
# CLI 명령 실행
|
|
76
|
+
sys.exit(validate_links_run(locals()))
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# 사용자 경험 개선 명령
|
|
80
|
+
@click.command(name='improve-ux')
|
|
81
|
+
@click.option('--url', '-u', default='https://adk.mo.ai.kr', help='분석할 URL (기본값: https://adk.mo.ai.kr)')
|
|
82
|
+
@click.option('--output', '-o', help='분석 결과를 저장할 파일 경로')
|
|
83
|
+
@click.option('--format', '-f', type=click.Choice(['json', 'markdown', 'text']),
|
|
84
|
+
default='markdown', help='출력 형식 (기본값: markdown)')
|
|
85
|
+
@click.option('--verbose', '-v', is_flag=True, help='상세한 진행 상황 표시')
|
|
86
|
+
@click.option('--max-workers', '-w', type=int, default=5, help='동시에 처리할 최대 작업 수 (기본값: 5)')
|
|
87
|
+
def improve_ux(url, output, format, verbose, max_workers):
|
|
88
|
+
"""사용자 경험 개선 분석"""
|
|
89
|
+
# 임시 args 객체 생성
|
|
90
|
+
class Args:
|
|
91
|
+
def __init__(self, **kwargs):
|
|
92
|
+
for key, value in kwargs.items():
|
|
93
|
+
setattr(self, key, value)
|
|
94
|
+
|
|
95
|
+
args = Args(url=url, output=output, format=format, verbose=verbose, max_workers=max_workers)
|
|
96
|
+
|
|
97
|
+
# CLI 명령 실행
|
|
98
|
+
from moai_adk.cli.commands.improve_user_experience import run_command as improve_ux_run
|
|
99
|
+
sys.exit(improve_ux_run(args))
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
cli.add_command(validate_links)
|
|
103
|
+
cli.add_command(improve_ux)
|
|
104
|
+
|
|
105
|
+
|
|
64
106
|
def main() -> int:
|
|
65
107
|
"""CLI entry point"""
|
|
66
108
|
try:
|
|
@@ -82,3 +124,34 @@ def main() -> int:
|
|
|
82
124
|
|
|
83
125
|
if __name__ == "__main__":
|
|
84
126
|
sys.exit(main())
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
# Sync 명령어 추가
|
|
130
|
+
@click.command(name='sync')
|
|
131
|
+
@click.option('--skip-docs', is_flag=True, help='문서 동기화 건너뛰기')
|
|
132
|
+
@click.option('--skip-tags', is_flag=True, help='TAG 검증 건너뛰기')
|
|
133
|
+
@click.option('--apply-dedup', is_flag=True, help='TAG 중복 제거 적용')
|
|
134
|
+
@click.option('--dry-run', is_flag=True, default=True, help='시뮬레이션 모드 (기본값: True)')
|
|
135
|
+
def sync_command_func(skip_docs, skip_tags, apply_dedup, dry_run):
|
|
136
|
+
"""MoAI-ADK 프로젝트 동기화 (TAG 중복 제거 포함)"""
|
|
137
|
+
options = {
|
|
138
|
+
"skip_docs": skip_docs,
|
|
139
|
+
"skip_tags": skip_tags,
|
|
140
|
+
"apply_dedup": apply_dedup,
|
|
141
|
+
"dry_run": dry_run
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
from moai_adk.cli.commands.sync import sync as sync_cli
|
|
145
|
+
sys.exit(sync_cli(options))
|
|
146
|
+
|
|
147
|
+
cli.add_command(sync_command_func)
|
|
148
|
+
|
|
149
|
+
# Sync 명령어 추가
|
|
150
|
+
def sync_command():
|
|
151
|
+
"""Sync command wrapper"""
|
|
152
|
+
import sys
|
|
153
|
+
sys.path.insert(0, 'src')
|
|
154
|
+
from moai_adk.cli.commands.sync_main import main as sync_main
|
|
155
|
+
sys.exit(sync_main())
|
|
156
|
+
|
|
157
|
+
cli.add_command(sync_command, name='sync')
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Analyze command for MoAI-ADK
|
|
4
|
+
|
|
5
|
+
Analyze Claude Code sessions and generate improvement suggestions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
# @CODE:CLI-002 | SPEC: SPEC-CLI-001/spec.md | TEST: tests/unit/test_cli_commands.py
|
|
9
|
+
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Optional
|
|
12
|
+
|
|
13
|
+
import click
|
|
14
|
+
from rich.console import Console
|
|
15
|
+
from rich.table import Table
|
|
16
|
+
|
|
17
|
+
from moai_adk.core.analysis.session_analyzer import SessionAnalyzer
|
|
18
|
+
|
|
19
|
+
console = Console()
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@click.command()
|
|
23
|
+
@click.option("--days", "-d", default=7, help="Number of days to analyze (default: 7)")
|
|
24
|
+
@click.option("--output", "-o", type=click.Path(), help="Output file path")
|
|
25
|
+
@click.option("--verbose", "-v", is_flag=True, help="Verbose output")
|
|
26
|
+
@click.option("--report-only", "-r", is_flag=True, help="Generate report only (no console output)")
|
|
27
|
+
@click.option("--project-path", "-p", type=click.Path(), help="Project root path (default: current directory)")
|
|
28
|
+
def analyze(
|
|
29
|
+
days: int,
|
|
30
|
+
output: Optional[Path],
|
|
31
|
+
verbose: bool,
|
|
32
|
+
report_only: bool,
|
|
33
|
+
project_path: Optional[Path],
|
|
34
|
+
):
|
|
35
|
+
"""
|
|
36
|
+
Analyze Claude Code sessions from the last N days
|
|
37
|
+
|
|
38
|
+
Analyzes Claude Code session logs to identify usage patterns,
|
|
39
|
+
error frequencies, and generate improvement suggestions.
|
|
40
|
+
|
|
41
|
+
Examples:
|
|
42
|
+
moai-adk analyze session
|
|
43
|
+
moai-adk analyze session --days 14 --verbose
|
|
44
|
+
moai-adk analyze session --output /path/to/report.md
|
|
45
|
+
"""
|
|
46
|
+
if project_path is None:
|
|
47
|
+
project_path = Path.cwd()
|
|
48
|
+
|
|
49
|
+
# Validate project path
|
|
50
|
+
if not (project_path / ".moai").exists():
|
|
51
|
+
console.print("[red]Error:[/red] Not a MoAI-ADK project (missing .moai directory)")
|
|
52
|
+
console.print(f"[blue]Current path:[/blue] {project_path}")
|
|
53
|
+
return
|
|
54
|
+
|
|
55
|
+
# Initialize analyzer
|
|
56
|
+
analyzer = SessionAnalyzer(days_back=days, verbose=verbose)
|
|
57
|
+
|
|
58
|
+
if not report_only:
|
|
59
|
+
console.print(f"[blue]📊 Analyzing sessions from last {days} days...[/blue]")
|
|
60
|
+
|
|
61
|
+
# Parse sessions
|
|
62
|
+
patterns = analyzer.parse_sessions()
|
|
63
|
+
|
|
64
|
+
if not report_only:
|
|
65
|
+
console.print(f"[green]✅ Analyzed {patterns['total_sessions']} sessions[/green]")
|
|
66
|
+
console.print(f"[blue] Total events: {patterns['total_events']}[/blue]")
|
|
67
|
+
|
|
68
|
+
# Display summary table
|
|
69
|
+
table = Table(title="Session Summary")
|
|
70
|
+
table.add_column("Metric", style="cyan")
|
|
71
|
+
table.add_column("Value", style="green")
|
|
72
|
+
|
|
73
|
+
table.add_row("Total Sessions", str(patterns['total_sessions']))
|
|
74
|
+
table.add_row("Total Events", str(patterns['total_events']))
|
|
75
|
+
table.add_row("Failed Sessions", str(patterns['failed_sessions']))
|
|
76
|
+
table.add_row("Success Rate", f"{patterns.get('success_rate', 0):.1f}%")
|
|
77
|
+
|
|
78
|
+
console.print(table)
|
|
79
|
+
|
|
80
|
+
# Show top tools
|
|
81
|
+
if patterns['tool_usage']:
|
|
82
|
+
console.print("\n[bold]🔧 Top Tools Used:[/bold]")
|
|
83
|
+
top_tools = sorted(
|
|
84
|
+
patterns['tool_usage'].items(),
|
|
85
|
+
key=lambda x: x[1],
|
|
86
|
+
reverse=True
|
|
87
|
+
)[:10]
|
|
88
|
+
|
|
89
|
+
tools_table = Table()
|
|
90
|
+
tools_table.add_column("Tool", style="cyan")
|
|
91
|
+
tools_table.add_column("Usage", style="green")
|
|
92
|
+
|
|
93
|
+
for tool, count in top_tools:
|
|
94
|
+
tools_table.add_row(f"`{tool}`", str(count))
|
|
95
|
+
|
|
96
|
+
console.print(tools_table)
|
|
97
|
+
|
|
98
|
+
# Save report
|
|
99
|
+
output_path_obj = Path(output) if output else None
|
|
100
|
+
report_path = analyzer.save_report(output_path_obj, project_path)
|
|
101
|
+
|
|
102
|
+
if not report_only:
|
|
103
|
+
console.print(f"\n[green]📄 Report saved: {report_path}[/green]")
|
|
104
|
+
|
|
105
|
+
# Show key suggestions
|
|
106
|
+
report_content = analyzer.generate_report()
|
|
107
|
+
if "💡 개선 제안" in report_content:
|
|
108
|
+
console.print("\n[bold yellow]💡 Key Suggestions:[/bold yellow]")
|
|
109
|
+
# Extract suggestions section
|
|
110
|
+
suggestions_start = report_content.find("💡 개선 제안")
|
|
111
|
+
if suggestions_start != -1:
|
|
112
|
+
suggestions_section = report_content[suggestions_start:]
|
|
113
|
+
# Extract first few suggestions
|
|
114
|
+
lines = suggestions_section.split('\n')[2:] # Skip header and empty line
|
|
115
|
+
for line in lines[:10]: # Show first 10 lines
|
|
116
|
+
if line.strip() and not line.startswith("---"):
|
|
117
|
+
console.print(line)
|
|
118
|
+
|
|
119
|
+
|
moai_adk/cli/commands/backup.py
CHANGED
|
@@ -1,4 +1,28 @@
|
|
|
1
|
-
"""Backup command
|
|
1
|
+
"""Backup command
|
|
2
|
+
|
|
3
|
+
Create a backup of the current project including:
|
|
4
|
+
- .claude/ (entire directory)
|
|
5
|
+
- .moai/ (excluding specs and reports)
|
|
6
|
+
- CLAUDE.md
|
|
7
|
+
|
|
8
|
+
Backup location: .moai-backups/YYYYMMDD-HHMMSS/
|
|
9
|
+
|
|
10
|
+
## Skill Invocation Guide (English-Only)
|
|
11
|
+
|
|
12
|
+
### Related Skills
|
|
13
|
+
- **moai-foundation-git**: For Git workflow and backup management
|
|
14
|
+
- Trigger: Before creating critical backups, review Git state
|
|
15
|
+
- Invocation: `Skill("moai-foundation-git")` for backup naming conventions
|
|
16
|
+
|
|
17
|
+
### When to Invoke Skills in Related Workflows
|
|
18
|
+
1. **Before backup creation**:
|
|
19
|
+
- Run `Skill("moai-foundation-git")` to document current Git branch state
|
|
20
|
+
- Tag backup with feature branch name for easier recovery
|
|
21
|
+
|
|
22
|
+
2. **After restoration from backup**:
|
|
23
|
+
- Verify with `Skill("moai-foundation-tags")` that TAGs are intact
|
|
24
|
+
- Run `Skill("moai-foundation-trust")` to validate toolchain
|
|
25
|
+
"""
|
|
2
26
|
from pathlib import Path
|
|
3
27
|
|
|
4
28
|
import click
|
moai_adk/cli/commands/doctor.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# @CODE:CLI-
|
|
1
|
+
# @CODE:CLI-003 | SPEC: SPEC-CLI-001/spec.md | TEST: tests/unit/test_doctor.py
|
|
2
2
|
# @CODE:CLAUDE-COMMANDS-001:CLI | SPEC: SPEC-CLAUDE-COMMANDS-001/spec.md | TEST: tests/unit/test_slash_commands.py
|
|
3
3
|
"""MoAI-ADK doctor command
|
|
4
4
|
|
|
@@ -8,6 +8,30 @@ System diagnostics command:
|
|
|
8
8
|
- Validate project structure
|
|
9
9
|
- Inspect language-specific tool chains
|
|
10
10
|
- Diagnose slash command loading issues (--check-commands)
|
|
11
|
+
|
|
12
|
+
## Skill Invocation Guide (English-Only)
|
|
13
|
+
|
|
14
|
+
### Related Skills
|
|
15
|
+
- **moai-foundation-langs**: For language toolchain verification and detection
|
|
16
|
+
- Trigger: Use `--verbose` or `--fix` flag to inspect language-specific tools
|
|
17
|
+
- Invocation: `Skill("moai-foundation-langs")` for detailed language stack analysis
|
|
18
|
+
|
|
19
|
+
- **moai-foundation-trust**: For TRUST 5-principles verification after fixing tools
|
|
20
|
+
- Trigger: After running doctor with `--fix` to validate improvements
|
|
21
|
+
- Invocation: `Skill("moai-foundation-trust")` to verify code quality toolchain
|
|
22
|
+
|
|
23
|
+
### When to Invoke Skills in Related Workflows
|
|
24
|
+
1. **After doctor diagnosis**:
|
|
25
|
+
- Run `Skill("moai-foundation-trust")` to validate that all TRUST tools are properly configured
|
|
26
|
+
- Run `Skill("moai-foundation-langs")` to confirm language-specific toolchains
|
|
27
|
+
|
|
28
|
+
2. **When tools are missing** (`--fix` flag):
|
|
29
|
+
- Use suggested fixes from doctor command
|
|
30
|
+
- Follow up with `Skill("moai-foundation-langs")` to validate corrections
|
|
31
|
+
|
|
32
|
+
3. **Debugging slash command issues** (`--check-commands`):
|
|
33
|
+
- Run `Skill("moai-cc-commands")` if commands fail to load
|
|
34
|
+
- Check `.claude/commands/` directory structure and permissions
|
|
11
35
|
"""
|
|
12
36
|
|
|
13
37
|
import json
|
|
@@ -168,11 +192,13 @@ def _suggest_fixes(tools: dict[str, bool], language: str | None) -> None:
|
|
|
168
192
|
|
|
169
193
|
def _get_install_command(tool: str, language: str | None) -> str:
|
|
170
194
|
"""Return the install command for a given tool (helper)"""
|
|
171
|
-
# Common tools
|
|
195
|
+
# Common tools with preferred package managers
|
|
172
196
|
install_commands = {
|
|
173
|
-
|
|
174
|
-
"
|
|
175
|
-
"
|
|
197
|
+
# Python tools (prefer uv)
|
|
198
|
+
"pytest": "uv pip install pytest",
|
|
199
|
+
"mypy": "uv pip install mypy",
|
|
200
|
+
"ruff": "uv pip install ruff",
|
|
201
|
+
# JavaScript tools
|
|
176
202
|
"vitest": "npm install -D vitest",
|
|
177
203
|
"biome": "npm install -D @biomejs/biome",
|
|
178
204
|
"eslint": "npm install -D eslint",
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
# @CODE:USER-EXPERIENCE-CLI-001 | @TEST:USER-EXPERIENCE-CLI-001
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
User Experience Improvement CLI Command
|
|
5
|
+
사용자 경험 개선 CLI 명령어
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import argparse
|
|
9
|
+
import asyncio
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
from rich.console import Console
|
|
13
|
+
from rich.panel import Panel
|
|
14
|
+
from rich.progress import Progress, SpinnerColumn, TextColumn
|
|
15
|
+
from rich.table import Table
|
|
16
|
+
|
|
17
|
+
from moai_adk.utils.user_experience import (
|
|
18
|
+
UserExperienceAnalyzer,
|
|
19
|
+
generate_improvement_plan,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
console = Console()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def create_parser(subparsers) -> argparse.ArgumentParser:
|
|
26
|
+
"""사용자 경험 개선 파서 생성"""
|
|
27
|
+
parser = subparsers.add_parser(
|
|
28
|
+
'improve-ux',
|
|
29
|
+
help='사용자 경험 개선 분석',
|
|
30
|
+
description='온라인 문서 포털의 사용자 경험을 분석하고 개선 계획을 제공합니다'
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
parser.add_argument(
|
|
34
|
+
'--url', '-u',
|
|
35
|
+
type=str,
|
|
36
|
+
default='https://adk.mo.ai.kr',
|
|
37
|
+
help='분석할 URL (기본값: https://adk.mo.ai.kr)'
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
parser.add_argument(
|
|
41
|
+
'--output', '-o',
|
|
42
|
+
type=str,
|
|
43
|
+
help='분석 결과를 저장할 파일 경로'
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
parser.add_argument(
|
|
47
|
+
'--format', '-f',
|
|
48
|
+
type=str,
|
|
49
|
+
choices=['json', 'markdown', 'text'],
|
|
50
|
+
default='markdown',
|
|
51
|
+
help='출력 형식 (기본값: markdown)'
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
parser.add_argument(
|
|
55
|
+
'--verbose', '-v',
|
|
56
|
+
action='store_true',
|
|
57
|
+
help='상세한 진행 상황 표시'
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
parser.add_argument(
|
|
61
|
+
'--max-workers', '-w',
|
|
62
|
+
type=int,
|
|
63
|
+
default=5,
|
|
64
|
+
help='동시에 처리할 최대 작업 수 (기본값: 5)'
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
return parser
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def format_metrics_table(metrics: dict) -> Table:
|
|
71
|
+
"""지표 테이블 형식화"""
|
|
72
|
+
table = Table(title="사용자 경험 지표")
|
|
73
|
+
table.add_column("분야", style="cyan")
|
|
74
|
+
table.add_column("점수", style="magenta")
|
|
75
|
+
table.add_column("상태", style="green")
|
|
76
|
+
|
|
77
|
+
# 성능 지표
|
|
78
|
+
perf = metrics.get('performance')
|
|
79
|
+
table.add_row("성능", f"{perf.success_rate if perf else 0:.2f}",
|
|
80
|
+
"✅ 좋음" if (perf and perf.is_good) else "❌ 개선 필요")
|
|
81
|
+
|
|
82
|
+
# 네비게이션 지표
|
|
83
|
+
nav = metrics.get('navigation')
|
|
84
|
+
table.add_row("네비게이션", f"{nav.structure_score if nav else 0:.2f}",
|
|
85
|
+
"✅ 좋음" if (nav and nav.is_good) else "❌ 개선 필요")
|
|
86
|
+
|
|
87
|
+
# 콘텐츠 지표
|
|
88
|
+
content = metrics.get('content')
|
|
89
|
+
table.add_row("콘텐츠", f"{content.accuracy_score if content else 0:.2f}",
|
|
90
|
+
"✅ 좋음" if (content and content.is_good) else "❌ 개선 필요")
|
|
91
|
+
|
|
92
|
+
# 접근성 지표
|
|
93
|
+
acc = metrics.get('accessibility')
|
|
94
|
+
table.add_row("접근성", f"{1.0 if (acc and acc.is_good) else 0.0:.2f}",
|
|
95
|
+
"✅ 좋음" if (acc and acc.is_good) else "❌ 개선 필요")
|
|
96
|
+
|
|
97
|
+
return table
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def format_recommendations(recommendations: list) -> Table:
|
|
101
|
+
"""개선 제안 테이블 형식화"""
|
|
102
|
+
table = Table(title="개선 제안")
|
|
103
|
+
table.add_column("제안", style="yellow")
|
|
104
|
+
table.add_column("우선순위", style="red")
|
|
105
|
+
|
|
106
|
+
for i, rec in enumerate(recommendations, 1):
|
|
107
|
+
priority = "중간" # 기본값
|
|
108
|
+
if "에러" in rec or "키보드" in rec or "정확성" in rec:
|
|
109
|
+
priority = "높음"
|
|
110
|
+
elif "성능" in rec or "구조" in rec:
|
|
111
|
+
priority = "중간"
|
|
112
|
+
else:
|
|
113
|
+
priority = "낮음"
|
|
114
|
+
|
|
115
|
+
table.add_row(f"{i}. {rec}", priority)
|
|
116
|
+
|
|
117
|
+
return table
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def format_timeline(timeline: dict) -> Table:
|
|
121
|
+
"""실행 계획 테이블 형식화"""
|
|
122
|
+
table = Table(title="실행 계획")
|
|
123
|
+
table.add_column("기간", style="cyan")
|
|
124
|
+
table.add_column("작업", style="magenta")
|
|
125
|
+
|
|
126
|
+
for period, tasks in timeline.items():
|
|
127
|
+
if tasks:
|
|
128
|
+
table.add_row(
|
|
129
|
+
period.replace('_', ' ').title(),
|
|
130
|
+
'\n'.join(f"• {task}" for task in tasks)
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
return table
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
async def analyze_user_experience(url: str, max_workers: int = 5, verbose: bool = False) -> dict:
|
|
137
|
+
"""사용자 경험 분석 수행"""
|
|
138
|
+
if verbose:
|
|
139
|
+
console.print(f"[blue]사용자 경험 분석 시작: {url}[/blue]")
|
|
140
|
+
|
|
141
|
+
analyzer = UserExperienceAnalyzer(url, max_workers=max_workers)
|
|
142
|
+
|
|
143
|
+
with Progress(
|
|
144
|
+
SpinnerColumn(),
|
|
145
|
+
TextColumn("[progress.description]{task.description}"),
|
|
146
|
+
console=console,
|
|
147
|
+
transient=True
|
|
148
|
+
) as progress:
|
|
149
|
+
# 분석 작업 생성
|
|
150
|
+
analysis_task = progress.add_task("사용자 경험 분석 중...", total=None)
|
|
151
|
+
|
|
152
|
+
# 분석 실행
|
|
153
|
+
analysis_report = await analyzer.generate_report()
|
|
154
|
+
|
|
155
|
+
progress.update(analysis_task, completed=True)
|
|
156
|
+
|
|
157
|
+
return analysis_report
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def generate_markdown_report(analysis_report: dict, improvement_plan: dict) -> str:
|
|
161
|
+
"""마크다운 보고서 생성"""
|
|
162
|
+
report = []
|
|
163
|
+
|
|
164
|
+
# 헤더
|
|
165
|
+
report.append("# 사용자 경험 개선 보고서")
|
|
166
|
+
report.append("")
|
|
167
|
+
report.append(f"**분석 대상**: {analysis_report.get('base_url', 'N/A')}")
|
|
168
|
+
report.append(f"**분석 시간**: {analysis_report.get('generated_at', 'N/A')}")
|
|
169
|
+
report.append("")
|
|
170
|
+
|
|
171
|
+
# 전체 점수
|
|
172
|
+
overall_score = analysis_report.get('overall_score', 0)
|
|
173
|
+
report.append(f"## 전체 점수: {overall_score:.2f}")
|
|
174
|
+
report.append("")
|
|
175
|
+
|
|
176
|
+
# 지표 상세
|
|
177
|
+
report.append("### 지표 상세")
|
|
178
|
+
report.append("")
|
|
179
|
+
|
|
180
|
+
# 성능 지표
|
|
181
|
+
performance = analysis_report.get('performance')
|
|
182
|
+
report.append("#### 성능")
|
|
183
|
+
report.append(f"- 성공률: {performance.success_rate if performance else 0:.2f}")
|
|
184
|
+
report.append(f"- 평균 로드 시간: {performance.load_time if performance else 0:.2f}초")
|
|
185
|
+
report.append(f"- 응답 시간: {performance.response_time if performance else 0:.2f}초")
|
|
186
|
+
report.append(f"- 에러율: {performance.error_rate if performance else 0:.2f}")
|
|
187
|
+
report.append("")
|
|
188
|
+
|
|
189
|
+
# 네비게이션 지표
|
|
190
|
+
navigation = analysis_report.get('navigation')
|
|
191
|
+
report.append("#### 네비게이션")
|
|
192
|
+
report.append(f"- 구조 점수: {navigation.structure_score if navigation else 0:.2f}")
|
|
193
|
+
report.append(f"- 링크 수: {navigation.link_count if navigation else 0}")
|
|
194
|
+
report.append(f"- 깊이: {navigation.depth if navigation else 0}")
|
|
195
|
+
report.append(f"- 완성도: {navigation.completeness if navigation else 0:.2f}")
|
|
196
|
+
report.append("")
|
|
197
|
+
|
|
198
|
+
# 콘텐츠 지표
|
|
199
|
+
content = analysis_report.get('content')
|
|
200
|
+
report.append("#### 콘텐츠")
|
|
201
|
+
report.append(f"- 정확성: {content.accuracy_score if content else 0:.2f}")
|
|
202
|
+
report.append(f"- 완성도: {content.completeness_score if content else 0:.2f}")
|
|
203
|
+
report.append(f"- 조직성: {content.organization_score if content else 0:.2f}")
|
|
204
|
+
report.append(f"- 가독성: {content.readability_score if content else 0:.2f}")
|
|
205
|
+
report.append("")
|
|
206
|
+
|
|
207
|
+
# 접근성 지표
|
|
208
|
+
accessibility = analysis_report.get('accessibility')
|
|
209
|
+
report.append("#### 접근성")
|
|
210
|
+
report.append(f"- 키보드 네비게이션: {'✅' if (accessibility and accessibility.keyboard_navigation) else '❌'}")
|
|
211
|
+
report.append(f"- 스크린 리더 지원: {'✅' if (accessibility and accessibility.screen_reader_support) else '❌'}")
|
|
212
|
+
report.append(f"- 색상 대비: {'✅' if (accessibility and accessibility.color_contrast) else '❌'}")
|
|
213
|
+
report.append(f"- 반응형 디자인: {'✅' if (accessibility and accessibility.responsive_design) else '❌'}")
|
|
214
|
+
report.append(f"- ARIA 레이블: {'✅' if (accessibility and accessibility.aria_labels) else '❌'}")
|
|
215
|
+
report.append("")
|
|
216
|
+
|
|
217
|
+
# 개선 제안
|
|
218
|
+
report.append("### 개선 제안")
|
|
219
|
+
report.append("")
|
|
220
|
+
for rec in analysis_report.get('recommendations', []):
|
|
221
|
+
report.append(f"- {rec}")
|
|
222
|
+
report.append("")
|
|
223
|
+
|
|
224
|
+
# 실행 계획
|
|
225
|
+
report.append("### 실행 계획")
|
|
226
|
+
report.append("")
|
|
227
|
+
report.append(f"**예상 소요 시간**: {improvement_plan.get('estimated_duration', 'N/A')}")
|
|
228
|
+
report.append("")
|
|
229
|
+
|
|
230
|
+
timeline = improvement_plan.get('timeline', {})
|
|
231
|
+
for period, tasks in timeline.items():
|
|
232
|
+
if tasks:
|
|
233
|
+
report.append(f"#### {period.replace('_', ' ').title()}")
|
|
234
|
+
for task in tasks:
|
|
235
|
+
report.append(f"- {task}")
|
|
236
|
+
report.append("")
|
|
237
|
+
|
|
238
|
+
return "\n".join(report)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def run_command(args) -> int:
|
|
242
|
+
"""사용자 경험 개선 명령 실행"""
|
|
243
|
+
try:
|
|
244
|
+
# 분석 실행
|
|
245
|
+
analysis_report = asyncio.run(
|
|
246
|
+
analyze_user_experience(args.url, args.max_workers, args.verbose)
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
# 개선 계획 생성
|
|
250
|
+
improvement_plan = generate_improvement_plan(analysis_report)
|
|
251
|
+
|
|
252
|
+
# 결과 출력
|
|
253
|
+
if args.verbose:
|
|
254
|
+
console.print(Panel.fit(
|
|
255
|
+
f"전체 점수: {analysis_report['overall_score']:.2f}",
|
|
256
|
+
title="분석 결과",
|
|
257
|
+
style="blue"
|
|
258
|
+
))
|
|
259
|
+
|
|
260
|
+
# 지표 테이블 표시
|
|
261
|
+
metrics_table = format_metrics_table(analysis_report)
|
|
262
|
+
console.print(metrics_table)
|
|
263
|
+
|
|
264
|
+
# 개선 제안 표시
|
|
265
|
+
if analysis_report.get('recommendations'):
|
|
266
|
+
recommendations_table = format_recommendations(analysis_report['recommendations'])
|
|
267
|
+
console.print(recommendations_table)
|
|
268
|
+
|
|
269
|
+
# 실행 계획 표시
|
|
270
|
+
if improvement_plan.get('timeline'):
|
|
271
|
+
timeline_table = format_timeline(improvement_plan['timeline'])
|
|
272
|
+
console.print(timeline_table)
|
|
273
|
+
|
|
274
|
+
# 결과 저장
|
|
275
|
+
if args.output:
|
|
276
|
+
if args.format == 'json':
|
|
277
|
+
import json
|
|
278
|
+
result = {
|
|
279
|
+
"analysis": analysis_report,
|
|
280
|
+
"improvement_plan": improvement_plan
|
|
281
|
+
}
|
|
282
|
+
output_content = json.dumps(result, indent=2, ensure_ascii=False)
|
|
283
|
+
else:
|
|
284
|
+
output_content = generate_markdown_report(analysis_report, improvement_plan)
|
|
285
|
+
|
|
286
|
+
output_path = Path(args.output)
|
|
287
|
+
output_path.write_text(output_content, encoding='utf-8')
|
|
288
|
+
console.print(f"\n[green]결과가 저장되었습니다:[/green] {output_path}")
|
|
289
|
+
|
|
290
|
+
# 종료 코드 반환
|
|
291
|
+
if analysis_report['overall_score'] >= 0.85:
|
|
292
|
+
console.print(
|
|
293
|
+
f"\n[green]✅ 사용자 경험이 우수합니다 (점수: {analysis_report['overall_score']:.2f})[/green]"
|
|
294
|
+
)
|
|
295
|
+
return 0
|
|
296
|
+
else:
|
|
297
|
+
console.print(
|
|
298
|
+
f"\n[yellow]⚠️ 사용자 경험이 개선 필요합니다 (점수: {analysis_report['overall_score']:.2f})[/yellow]"
|
|
299
|
+
)
|
|
300
|
+
return 1
|
|
301
|
+
|
|
302
|
+
except KeyboardInterrupt:
|
|
303
|
+
console.print("\n[yellow]분석이 사용자에 의해 중단되었습니다.[/yellow]")
|
|
304
|
+
return 1
|
|
305
|
+
except Exception as e:
|
|
306
|
+
console.print(f"[red]오류 발생:[/red] {e}")
|
|
307
|
+
return 1
|