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.

Files changed (433) hide show
  1. moai_adk/__init__.py +1 -1
  2. moai_adk/__main__.py +74 -1
  3. moai_adk/cli/commands/__init__.py +1 -1
  4. moai_adk/cli/commands/analyze.py +119 -0
  5. moai_adk/cli/commands/backup.py +25 -1
  6. moai_adk/cli/commands/doctor.py +31 -5
  7. moai_adk/cli/commands/improve_user_experience.py +307 -0
  8. moai_adk/cli/commands/init.py +111 -10
  9. moai_adk/cli/commands/status.py +33 -3
  10. moai_adk/cli/commands/update.py +921 -130
  11. moai_adk/cli/commands/validate_links.py +120 -0
  12. moai_adk/cli/prompts/init_prompts.py +22 -87
  13. moai_adk/core/analysis/__init__.py +9 -0
  14. moai_adk/core/analysis/session_analyzer.py +388 -0
  15. moai_adk/core/analysis/tag_chain_analyzer.py +344 -0
  16. moai_adk/core/analysis/tag_chain_repair.py +879 -0
  17. moai_adk/core/config/__init__.py +19 -0
  18. moai_adk/core/config/migration.py +235 -0
  19. moai_adk/core/git/__init__.py +1 -1
  20. moai_adk/core/git/branch.py +1 -1
  21. moai_adk/core/git/commit.py +1 -1
  22. moai_adk/core/git/manager.py +1 -1
  23. moai_adk/core/issue_creator.py +313 -0
  24. moai_adk/core/mcp/setup.py +56 -0
  25. moai_adk/core/mcp/setup_old.py +296 -0
  26. moai_adk/core/project/backup_utils.py +1 -1
  27. moai_adk/core/project/checker.py +2 -2
  28. moai_adk/core/project/detector.py +211 -12
  29. moai_adk/core/project/initializer.py +85 -15
  30. moai_adk/core/project/phase_executor.py +76 -13
  31. moai_adk/core/project/validator.py +13 -13
  32. moai_adk/core/quality/__init__.py +1 -1
  33. moai_adk/core/quality/trust_checker.py +1 -1
  34. moai_adk/core/quality/validators/__init__.py +1 -1
  35. moai_adk/core/quality/validators/base_validator.py +1 -1
  36. moai_adk/core/tags/__init__.py +86 -0
  37. moai_adk/core/tags/auto_corrector.py +693 -0
  38. moai_adk/core/tags/ci_validator.py +463 -0
  39. moai_adk/core/tags/cli.py +283 -0
  40. moai_adk/core/tags/generator.py +109 -0
  41. moai_adk/core/tags/inserter.py +99 -0
  42. moai_adk/core/tags/mapper.py +126 -0
  43. moai_adk/core/tags/parser.py +76 -0
  44. moai_adk/core/tags/policy_validator.py +580 -0
  45. moai_adk/core/tags/pre_commit_validator.py +421 -0
  46. moai_adk/core/tags/reporter.py +956 -0
  47. moai_adk/core/tags/rollback_manager.py +525 -0
  48. moai_adk/core/tags/tags.py +149 -0
  49. moai_adk/core/tags/validator.py +897 -0
  50. moai_adk/core/template/__init__.py +1 -1
  51. moai_adk/core/template/backup.py +1 -1
  52. moai_adk/core/template/merger.py +50 -1
  53. moai_adk/core/template/processor.py +119 -13
  54. moai_adk/core/template_engine.py +268 -0
  55. moai_adk/templates/.claude/agents/alfred/backend-expert.md +348 -0
  56. moai_adk/templates/.claude/agents/alfred/cc-manager.md +209 -944
  57. moai_adk/templates/.claude/agents/alfred/database-expert.md +352 -0
  58. moai_adk/templates/.claude/agents/alfred/debug-helper.md +34 -5
  59. moai_adk/templates/.claude/agents/alfred/devops-expert.md +464 -0
  60. moai_adk/templates/.claude/agents/alfred/doc-syncer.md +38 -8
  61. moai_adk/templates/.claude/agents/alfred/format-expert.md +469 -0
  62. moai_adk/templates/.claude/agents/alfred/frontend-expert.md +357 -0
  63. moai_adk/templates/.claude/agents/alfred/git-manager.md +128 -9
  64. moai_adk/templates/.claude/agents/alfred/implementation-planner.md +104 -6
  65. moai_adk/templates/.claude/agents/alfred/project-manager.md +88 -16
  66. moai_adk/templates/.claude/agents/alfred/quality-gate.md +36 -9
  67. moai_adk/templates/.claude/agents/alfred/security-expert.md +270 -0
  68. moai_adk/templates/.claude/agents/alfred/skill-factory.md +865 -0
  69. moai_adk/templates/.claude/agents/alfred/spec-builder.md +214 -43
  70. moai_adk/templates/.claude/agents/alfred/tag-agent.md +111 -9
  71. moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +309 -160
  72. moai_adk/templates/.claude/agents/alfred/trust-checker.md +36 -7
  73. moai_adk/templates/.claude/agents/alfred/ui-ux-expert.md +605 -0
  74. moai_adk/templates/.claude/commands/alfred/0-project.md +393 -966
  75. moai_adk/templates/.claude/commands/alfred/1-plan.md +651 -367
  76. moai_adk/templates/.claude/commands/alfred/2-run.md +388 -241
  77. moai_adk/templates/.claude/commands/alfred/3-sync.md +1921 -410
  78. moai_adk/templates/.claude/commands/alfred/9-feedback.md +153 -0
  79. moai_adk/templates/.claude/commands/alfred/release-new.md +3604 -0
  80. moai_adk/templates/.claude/hooks/alfred/core/project.py +484 -20
  81. moai_adk/templates/.claude/hooks/alfred/core/timeout.py +136 -0
  82. moai_adk/templates/.claude/hooks/alfred/core/ttl_cache.py +108 -0
  83. moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +198 -0
  84. moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +14 -6
  85. moai_adk/templates/.claude/hooks/alfred/post_tool__enable_streaming_ui.py +50 -0
  86. moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +93 -0
  87. moai_adk/templates/.claude/hooks/alfred/post_tool__tag_auto_corrector.py +407 -0
  88. moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +99 -0
  89. moai_adk/templates/.claude/hooks/alfred/pre_tool__realtime_tag_monitor.py +335 -0
  90. moai_adk/templates/.claude/hooks/alfred/pre_tool__tag_policy_validator.py +325 -0
  91. moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +93 -0
  92. moai_adk/templates/.claude/hooks/alfred/session_start__auto_cleanup.py +580 -0
  93. moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +298 -0
  94. moai_adk/templates/.claude/hooks/alfred/shared/core/__init__.py +170 -0
  95. moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/checkpoint.py +3 -3
  96. moai_adk/templates/.claude/hooks/alfred/{core → shared/core}/context.py +5 -5
  97. moai_adk/templates/.claude/hooks/alfred/shared/core/project.py +749 -0
  98. moai_adk/templates/.claude/hooks/alfred/shared/core/tags.py +230 -0
  99. moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +198 -0
  100. moai_adk/templates/.claude/hooks/alfred/shared/handlers/__init__.py +21 -0
  101. moai_adk/templates/.claude/hooks/alfred/shared/handlers/daily_analysis.py +351 -0
  102. moai_adk/templates/.claude/hooks/alfred/shared/handlers/notification.py +154 -0
  103. moai_adk/templates/.claude/hooks/alfred/shared/handlers/session.py +174 -0
  104. moai_adk/templates/.claude/hooks/alfred/shared/handlers/tool.py +87 -0
  105. moai_adk/templates/.claude/hooks/alfred/shared/handlers/user.py +61 -0
  106. moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +111 -0
  107. moai_adk/templates/.claude/hooks/alfred/utils/__init__.py +1 -0
  108. moai_adk/templates/.claude/hooks/alfred/utils/hook_config.py +94 -0
  109. moai_adk/templates/.claude/hooks/alfred/utils/timeout.py +161 -0
  110. moai_adk/templates/.claude/output-styles/alfred/alfred-moai-adk-beginner.md +267 -0
  111. moai_adk/templates/.claude/output-styles/alfred/keating-personal-tutor.md +440 -0
  112. moai_adk/templates/.claude/output-styles/alfred/r2d2-agentic-coding.md +583 -0
  113. moai_adk/templates/.claude/settings.json +96 -14
  114. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/SKILL.md +70 -0
  115. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/examples.md +62 -0
  116. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/reference.md +242 -0
  117. moai_adk/templates/.claude/skills/moai-alfred-ask-user-questions/SKILL.md +237 -0
  118. moai_adk/templates/.claude/skills/moai-alfred-ask-user-questions/examples.md +871 -0
  119. moai_adk/templates/.claude/skills/moai-alfred-ask-user-questions/reference.md +653 -0
  120. moai_adk/templates/.claude/skills/moai-alfred-clone-pattern/README.md +162 -0
  121. moai_adk/templates/.claude/skills/moai-alfred-clone-pattern/SKILL.md +227 -0
  122. moai_adk/templates/.claude/skills/moai-alfred-clone-pattern/examples.md +354 -0
  123. moai_adk/templates/.claude/skills/moai-alfred-clone-pattern/reference.md +158 -0
  124. moai_adk/templates/.claude/skills/moai-alfred-code-reviewer/SKILL.md +179 -79
  125. moai_adk/templates/.claude/skills/moai-alfred-code-reviewer/examples.md +117 -0
  126. moai_adk/templates/.claude/skills/moai-alfred-code-reviewer/scripts/pre-review-check.sh +62 -0
  127. moai_adk/templates/.claude/skills/moai-alfred-config-schema/SKILL.md +132 -0
  128. moai_adk/templates/.claude/skills/moai-alfred-config-schema/examples.md +28 -0
  129. moai_adk/templates/.claude/skills/moai-alfred-config-schema/reference.md +444 -0
  130. moai_adk/templates/.claude/skills/moai-alfred-context-budget/SKILL.md +62 -0
  131. moai_adk/templates/.claude/skills/moai-alfred-context-budget/examples.md +28 -0
  132. moai_adk/templates/.claude/skills/moai-alfred-context-budget/reference.md +405 -0
  133. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/SKILL.md +51 -0
  134. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/examples.md +355 -0
  135. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/reference.md +239 -0
  136. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/SKILL.md +323 -0
  137. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/examples.md +286 -0
  138. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/reference.md +126 -0
  139. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/SKILL.md +229 -0
  140. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/examples.md +4 -0
  141. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/reference.md +150 -0
  142. moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +87 -73
  143. moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +29 -0
  144. moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +28 -0
  145. moai_adk/templates/.claude/skills/moai-alfred-personas/README.md +42 -0
  146. moai_adk/templates/.claude/skills/moai-alfred-personas/SKILL.md +429 -0
  147. moai_adk/templates/.claude/skills/moai-alfred-personas/examples.md +520 -0
  148. moai_adk/templates/.claude/skills/moai-alfred-personas/reference.md +405 -0
  149. moai_adk/templates/.claude/skills/moai-alfred-practices/SKILL.md +89 -0
  150. moai_adk/templates/.claude/skills/moai-alfred-practices/examples.md +122 -0
  151. moai_adk/templates/.claude/skills/moai-alfred-practices/reference.md +369 -0
  152. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/SKILL.md +508 -0
  153. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/examples.md +481 -0
  154. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/reference.md +100 -0
  155. moai_adk/templates/.claude/skills/moai-alfred-rules/SKILL.md +77 -0
  156. moai_adk/templates/.claude/skills/moai-alfred-rules/examples.md +265 -0
  157. moai_adk/templates/.claude/skills/moai-alfred-rules/reference.md +539 -0
  158. moai_adk/templates/.claude/skills/moai-alfred-session-state/SKILL.md +320 -0
  159. moai_adk/templates/.claude/skills/moai-alfred-session-state/examples.md +4 -0
  160. moai_adk/templates/.claude/skills/moai-alfred-session-state/reference.md +84 -0
  161. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/README.md +137 -0
  162. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/SKILL.md +219 -0
  163. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples/validate-spec.sh +161 -0
  164. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples.md +541 -0
  165. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/reference.md +622 -0
  166. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/SKILL.md +19 -0
  167. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/examples.md +4 -0
  168. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/reference.md +211 -0
  169. moai_adk/templates/.claude/skills/moai-alfred-workflow/SKILL.md +288 -0
  170. moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +269 -0
  171. moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +32 -0
  172. moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +298 -0
  173. moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +26 -0
  174. moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +307 -0
  175. moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +21 -0
  176. moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +252 -0
  177. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +19 -0
  178. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +19 -0
  179. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +24 -0
  180. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +199 -0
  181. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +39 -0
  182. moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +316 -0
  183. moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +18 -0
  184. moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +263 -0
  185. moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +30 -0
  186. moai_adk/templates/.claude/skills/moai-cc-skill-factory/CHECKLIST.md +482 -0
  187. moai_adk/templates/.claude/skills/moai-cc-skill-factory/EXAMPLES.md +303 -0
  188. moai_adk/templates/.claude/skills/moai-cc-skill-factory/INTERACTIVE-DISCOVERY.md +524 -0
  189. moai_adk/templates/.claude/skills/moai-cc-skill-factory/METADATA.md +477 -0
  190. moai_adk/templates/.claude/skills/moai-cc-skill-factory/PARALLEL-ANALYSIS-REPORT.md +429 -0
  191. moai_adk/templates/.claude/skills/moai-cc-skill-factory/PYTHON-VERSION-MATRIX.md +391 -0
  192. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-FACTORY-WORKFLOW.md +431 -0
  193. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-UPDATE-ADVISOR.md +577 -0
  194. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL.md +273 -0
  195. moai_adk/templates/.claude/skills/moai-cc-skill-factory/STEP-BY-STEP-GUIDE.md +466 -0
  196. moai_adk/templates/.claude/skills/moai-cc-skill-factory/STRUCTURE.md +583 -0
  197. moai_adk/templates/.claude/skills/moai-cc-skill-factory/WEB-RESEARCH.md +526 -0
  198. moai_adk/templates/.claude/skills/moai-cc-skill-factory/reference.md +608 -0
  199. moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/generate-structure.sh +328 -0
  200. moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/validate-skill.sh +312 -0
  201. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/SKILL_TEMPLATE.md +245 -0
  202. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/examples-template.md +285 -0
  203. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/reference-template.md +278 -0
  204. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/scripts-template.sh +303 -0
  205. moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +291 -0
  206. moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +15 -0
  207. moai_adk/templates/.claude/skills/moai-change-logger/SKILL.md +563 -0
  208. moai_adk/templates/.claude/skills/moai-design-systems/SKILL.md +802 -0
  209. moai_adk/templates/.claude/skills/moai-design-systems/examples.md +1238 -0
  210. moai_adk/templates/.claude/skills/moai-design-systems/reference.md +673 -0
  211. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +234 -43
  212. moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +1633 -0
  213. moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +660 -0
  214. moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +97 -69
  215. moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +29 -0
  216. moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +30 -0
  217. moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +97 -72
  218. moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +29 -0
  219. moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +30 -0
  220. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +97 -74
  221. moai_adk/templates/.claude/skills/moai-domain-database/examples.md +29 -0
  222. moai_adk/templates/.claude/skills/moai-domain-database/reference.md +30 -0
  223. moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +98 -74
  224. moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +29 -0
  225. moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +31 -0
  226. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +102 -73
  227. moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +29 -0
  228. moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +31 -0
  229. moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +97 -73
  230. moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +29 -0
  231. moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +30 -0
  232. moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +97 -67
  233. moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +29 -0
  234. moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +30 -0
  235. moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +97 -79
  236. moai_adk/templates/.claude/skills/moai-domain-security/examples.md +29 -0
  237. moai_adk/templates/.claude/skills/moai-domain-security/reference.md +30 -0
  238. moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +97 -71
  239. moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +29 -0
  240. moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +30 -0
  241. moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +265 -64
  242. moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +1064 -0
  243. moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +1047 -0
  244. moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +87 -78
  245. moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +29 -0
  246. moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +28 -0
  247. moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +87 -70
  248. moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +29 -0
  249. moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +28 -0
  250. moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +87 -86
  251. moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +29 -0
  252. moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +28 -0
  253. moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +80 -62
  254. moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +29 -0
  255. moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +28 -0
  256. moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +207 -50
  257. moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +29 -0
  258. moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +29 -0
  259. moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +90 -71
  260. moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +29 -0
  261. moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +28 -0
  262. moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +78 -58
  263. moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +29 -0
  264. moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +28 -0
  265. moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +78 -51
  266. moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +29 -0
  267. moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +28 -0
  268. moai_adk/templates/.claude/skills/moai-foundation-trust/.!11330!examples.md +0 -0
  269. moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +253 -32
  270. moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
  271. moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +1099 -0
  272. moai_adk/templates/.claude/skills/moai-jit-docs-enhanced/SKILL.md +460 -0
  273. moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +98 -74
  274. moai_adk/templates/.claude/skills/moai-lang-c/examples.md +29 -0
  275. moai_adk/templates/.claude/skills/moai-lang-c/reference.md +31 -0
  276. moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +98 -76
  277. moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +29 -0
  278. moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +31 -0
  279. moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +2358 -70
  280. moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +29 -0
  281. moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +30 -0
  282. moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +2962 -68
  283. moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +29 -0
  284. moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +30 -0
  285. moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +1898 -70
  286. moai_adk/templates/.claude/skills/moai-lang-go/examples.md +29 -0
  287. moai_adk/templates/.claude/skills/moai-lang-go/reference.md +31 -0
  288. moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +1465 -68
  289. moai_adk/templates/.claude/skills/moai-lang-java/examples.md +29 -0
  290. moai_adk/templates/.claude/skills/moai-lang-java/reference.md +31 -0
  291. moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +2364 -66
  292. moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +29 -0
  293. moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +32 -0
  294. moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +1630 -69
  295. moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +29 -0
  296. moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +31 -0
  297. moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +89 -61
  298. moai_adk/templates/.claude/skills/moai-lang-php/examples.md +29 -0
  299. moai_adk/templates/.claude/skills/moai-lang-php/reference.md +30 -0
  300. moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +735 -66
  301. moai_adk/templates/.claude/skills/moai-lang-python/examples.md +624 -0
  302. moai_adk/templates/.claude/skills/moai-lang-python/reference.md +316 -0
  303. moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +97 -73
  304. moai_adk/templates/.claude/skills/moai-lang-r/examples.md +29 -0
  305. moai_adk/templates/.claude/skills/moai-lang-r/reference.md +30 -0
  306. moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +98 -73
  307. moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +29 -0
  308. moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +31 -0
  309. moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +1834 -70
  310. moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +29 -0
  311. moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +31 -0
  312. moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +99 -74
  313. moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +29 -0
  314. moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +30 -0
  315. moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +97 -74
  316. moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +29 -0
  317. moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +30 -0
  318. moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +98 -74
  319. moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +29 -0
  320. moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +31 -0
  321. moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +1959 -69
  322. moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +29 -0
  323. moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +30 -0
  324. moai_adk/templates/.claude/skills/moai-lang-template/SKILL.md +348 -0
  325. moai_adk/templates/.claude/skills/moai-lang-template/VARIABLES.md +98 -0
  326. moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +1230 -66
  327. moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +29 -0
  328. moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +34 -0
  329. moai_adk/templates/.claude/skills/moai-learning-optimizer/SKILL.md +575 -0
  330. moai_adk/templates/.claude/skills/moai-project-batch-questions/README.md +50 -0
  331. moai_adk/templates/.claude/skills/moai-project-batch-questions/SKILL.md +304 -0
  332. moai_adk/templates/.claude/skills/moai-project-batch-questions/examples.md +417 -0
  333. moai_adk/templates/.claude/skills/moai-project-batch-questions/reference.md +704 -0
  334. moai_adk/templates/.claude/skills/moai-project-config-manager/README.md +87 -0
  335. moai_adk/templates/.claude/skills/moai-project-config-manager/SKILL.md +552 -0
  336. moai_adk/templates/.claude/skills/moai-project-config-manager/examples.md +1109 -0
  337. moai_adk/templates/.claude/skills/moai-project-config-manager/reference.md +514 -0
  338. moai_adk/templates/.claude/skills/moai-project-config-manager/validate.py +106 -0
  339. moai_adk/templates/.claude/skills/moai-project-documentation/README.md +11 -0
  340. moai_adk/templates/.claude/skills/moai-project-documentation/SKILL.md +622 -0
  341. moai_adk/templates/.claude/skills/moai-project-documentation/examples.md +20 -0
  342. moai_adk/templates/.claude/skills/moai-project-documentation/reference.md +12 -0
  343. moai_adk/templates/.claude/skills/moai-project-language-initializer/README.md +152 -0
  344. moai_adk/templates/.claude/skills/moai-project-language-initializer/SKILL.md +285 -0
  345. moai_adk/templates/.claude/skills/moai-project-language-initializer/examples.md +333 -0
  346. moai_adk/templates/.claude/skills/moai-project-language-initializer/reference.md +386 -0
  347. moai_adk/templates/.claude/skills/moai-project-template-optimizer/README.md +49 -0
  348. moai_adk/templates/.claude/skills/moai-project-template-optimizer/SKILL.md +319 -0
  349. moai_adk/templates/.claude/skills/moai-project-template-optimizer/examples.md +58 -0
  350. moai_adk/templates/.claude/skills/moai-project-template-optimizer/reference.md +123 -0
  351. moai_adk/templates/.claude/skills/moai-session-info/SKILL.md +314 -0
  352. moai_adk/templates/.claude/skills/moai-streaming-ui/SKILL.md +552 -0
  353. moai_adk/templates/.claude/skills/moai-tag-policy-validator/SKILL.md +570 -0
  354. moai_adk/templates/.git-hooks/pre-commit +66 -0
  355. moai_adk/templates/.git-hooks/pre-push +255 -0
  356. moai_adk/templates/.github/workflows/c-tag-validation.yml +11 -0
  357. moai_adk/templates/.github/workflows/cpp-tag-validation.yml +11 -0
  358. moai_adk/templates/.github/workflows/csharp-tag-validation.yml +11 -0
  359. moai_adk/templates/.github/workflows/dart-tag-validation.yml +11 -0
  360. moai_adk/templates/.github/workflows/go-tag-validation.yml +130 -0
  361. moai_adk/templates/.github/workflows/java-tag-validation.yml +11 -0
  362. moai_adk/templates/.github/workflows/javascript-tag-validation.yml +135 -0
  363. moai_adk/templates/.github/workflows/kotlin-tag-validation.yml +11 -0
  364. moai_adk/templates/.github/workflows/moai-gitflow.yml +166 -3
  365. moai_adk/templates/.github/workflows/moai-release-create.yml +100 -0
  366. moai_adk/templates/.github/workflows/moai-release-pipeline.yml +188 -0
  367. moai_adk/templates/.github/workflows/php-tag-validation.yml +11 -0
  368. moai_adk/templates/.github/workflows/python-tag-validation.yml +118 -0
  369. moai_adk/templates/.github/workflows/release.yml +118 -0
  370. moai_adk/templates/.github/workflows/ruby-tag-validation.yml +11 -0
  371. moai_adk/templates/.github/workflows/rust-tag-validation.yml +11 -0
  372. moai_adk/templates/.github/workflows/shell-tag-validation.yml +11 -0
  373. moai_adk/templates/.github/workflows/spec-issue-sync.yml +338 -0
  374. moai_adk/templates/.github/workflows/swift-tag-validation.yml +11 -0
  375. moai_adk/templates/.github/workflows/tag-report.yml +269 -0
  376. moai_adk/templates/.github/workflows/tag-validation.yml +186 -0
  377. moai_adk/templates/.github/workflows/typescript-tag-validation.yml +154 -0
  378. moai_adk/templates/.mcp.json +31 -0
  379. moai_adk/templates/.moai/config.json +80 -7
  380. moai_adk/templates/CLAUDE.md +562 -546
  381. moai_adk/utils/banner.py +5 -5
  382. moai_adk/utils/common.py +294 -0
  383. moai_adk/utils/link_validator.py +235 -0
  384. moai_adk/utils/logger.py +8 -8
  385. moai_adk/utils/user_experience.py +451 -0
  386. moai_adk-0.20.1.dist-info/METADATA +233 -0
  387. moai_adk-0.20.1.dist-info/RECORD +404 -0
  388. moai_adk/templates/.claude/hooks/alfred/README.md +0 -230
  389. moai_adk/templates/.claude/hooks/alfred/alfred_hooks.py +0 -156
  390. moai_adk/templates/.claude/hooks/alfred/core/__init__.py +0 -85
  391. moai_adk/templates/.claude/hooks/alfred/handlers/notification.py +0 -25
  392. moai_adk/templates/.claude/hooks/alfred/handlers/session.py +0 -92
  393. moai_adk/templates/.claude/hooks/alfred/handlers/tool.py +0 -70
  394. moai_adk/templates/.claude/hooks/alfred/handlers/user.py +0 -41
  395. moai_adk/templates/.claude/output-styles/alfred/agentic-coding.md +0 -636
  396. moai_adk/templates/.claude/output-styles/alfred/moai-adk-learning.md +0 -692
  397. moai_adk/templates/.claude/output-styles/alfred/study-with-alfred.md +0 -470
  398. moai_adk/templates/.claude/skills/moai-alfred-debugger-pro/SKILL.md +0 -103
  399. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -103
  400. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -95
  401. moai_adk/templates/.claude/skills/moai-alfred-performance-optimizer/SKILL.md +0 -105
  402. moai_adk/templates/.claude/skills/moai-alfred-refactoring-coach/SKILL.md +0 -97
  403. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -97
  404. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -90
  405. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -99
  406. moai_adk/templates/.claude/skills/moai-alfred-tui-survey/SKILL.md +0 -87
  407. moai_adk/templates/.claude/skills/moai-alfred-tui-survey/examples.md +0 -62
  408. moai_adk/templates/.claude/skills/moai-claude-code/SKILL.md +0 -94
  409. moai_adk/templates/.claude/skills/moai-claude-code/examples.md +0 -513
  410. moai_adk/templates/.claude/skills/moai-claude-code/reference.md +0 -433
  411. moai_adk/templates/.claude/skills/moai-claude-code/templates/agent-full.md +0 -332
  412. moai_adk/templates/.claude/skills/moai-claude-code/templates/command-full.md +0 -384
  413. moai_adk/templates/.claude/skills/moai-claude-code/templates/plugin-full.json +0 -363
  414. moai_adk/templates/.claude/skills/moai-claude-code/templates/settings-full.json +0 -595
  415. moai_adk/templates/.claude/skills/moai-claude-code/templates/skill-full.md +0 -496
  416. moai_adk/templates/.claude/skills/moai-lang-clojure/SKILL.md +0 -100
  417. moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +0 -99
  418. moai_adk/templates/.claude/skills/moai-lang-haskell/SKILL.md +0 -100
  419. moai_adk/templates/.claude/skills/moai-lang-julia/SKILL.md +0 -98
  420. moai_adk/templates/.claude/skills/moai-lang-lua/SKILL.md +0 -98
  421. moai_adk/templates/.github/PULL_REQUEST_TEMPLATE.md +0 -69
  422. moai_adk/templates/.moai/memory/development-guide.md +0 -344
  423. moai_adk/templates/.moai/memory/gitflow-protection-policy.md +0 -220
  424. moai_adk/templates/.moai/memory/spec-metadata.md +0 -356
  425. moai_adk/templates/.moai/project/product.md +0 -161
  426. moai_adk/templates/.moai/project/structure.md +0 -156
  427. moai_adk/templates/.moai/project/tech.md +0 -227
  428. moai_adk/templates/__init__.py +0 -2
  429. moai_adk-0.4.5.dist-info/METADATA +0 -369
  430. moai_adk-0.4.5.dist-info/RECORD +0 -152
  431. {moai_adk-0.4.5.dist-info → moai_adk-0.20.1.dist-info}/WHEEL +0 -0
  432. {moai_adk-0.4.5.dist-info → moai_adk-0.20.1.dist-info}/entry_points.txt +0 -0
  433. {moai_adk-0.4.5.dist-info → moai_adk-0.20.1.dist-info}/licenses/LICENSE +0 -0
moai_adk/__init__.py CHANGED
@@ -9,6 +9,6 @@ from importlib.metadata import PackageNotFoundError, version
9
9
  try:
10
10
  __version__ = version("moai-adk")
11
11
  except PackageNotFoundError:
12
- __version__ = "0.4.1-dev"
12
+ __version__ = "0.5.6-dev"
13
13
 
14
14
  __all__ = ["__version__"]
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("python -m moai_adk --help", style="cyan", end="")
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')
@@ -1,4 +1,4 @@
1
- # @CODE:CLI-001 | SPEC: SPEC-CLI-001/spec.md | TEST: tests/unit/test_cli_commands.py
1
+ # @CODE:CLI-003 | SPEC: SPEC-CLI-001/spec.md | TEST: tests/unit/test_cli_commands.py
2
2
  """CLI command module
3
3
 
4
4
  Core commands:
@@ -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
+
@@ -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
@@ -1,4 +1,4 @@
1
- # @CODE:CLI-001 | SPEC: SPEC-CLI-001/spec.md | TEST: tests/unit/test_doctor.py
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
- "pytest": "pip install pytest",
174
- "mypy": "pip install mypy",
175
- "ruff": "pip install ruff",
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