moai-adk 0.15.0__py3-none-any.whl → 0.25.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of moai-adk might be problematic. Click here for more details.

Files changed (417) hide show
  1. moai_adk/__init__.py +1 -2
  2. moai_adk/__main__.py +85 -2
  3. moai_adk/cli/__init__.py +0 -1
  4. moai_adk/cli/commands/__init__.py +0 -1
  5. moai_adk/cli/commands/analyze.py +127 -0
  6. moai_adk/cli/commands/backup.py +5 -3
  7. moai_adk/cli/commands/doctor.py +35 -11
  8. moai_adk/cli/commands/improve_user_experience.py +348 -0
  9. moai_adk/cli/commands/init.py +150 -23
  10. moai_adk/cli/commands/language.py +269 -0
  11. moai_adk/cli/commands/migrate.py +158 -0
  12. moai_adk/cli/commands/status.py +13 -12
  13. moai_adk/cli/commands/update.py +364 -60
  14. moai_adk/cli/commands/validate_links.py +118 -0
  15. moai_adk/cli/main.py +3 -2
  16. moai_adk/cli/prompts/init_prompts.py +79 -82
  17. moai_adk/core/__init__.py +0 -1
  18. moai_adk/core/analysis/__init__.py +9 -0
  19. moai_adk/core/analysis/session_analyzer.py +439 -0
  20. moai_adk/core/claude_integration.py +421 -0
  21. moai_adk/core/command_helpers.py +270 -0
  22. moai_adk/core/config/__init__.py +6 -0
  23. moai_adk/core/config/auto_spec_config.py +346 -0
  24. moai_adk/core/config/migration.py +133 -12
  25. moai_adk/core/context_manager.py +279 -0
  26. moai_adk/core/diagnostics/slash_commands.py +0 -1
  27. moai_adk/core/error_recovery_system.py +1289 -0
  28. moai_adk/core/git/__init__.py +0 -1
  29. moai_adk/core/git/branch.py +0 -1
  30. moai_adk/core/git/branch_manager.py +4 -4
  31. moai_adk/core/git/checkpoint.py +1 -5
  32. moai_adk/core/git/commit.py +0 -1
  33. moai_adk/core/git/event_detector.py +3 -5
  34. moai_adk/core/git/manager.py +0 -1
  35. moai_adk/core/hooks/post_tool_auto_spec_completion.py +925 -0
  36. moai_adk/core/integration/__init__.py +22 -0
  37. moai_adk/core/integration/engine.py +169 -0
  38. moai_adk/core/integration/integration_tester.py +225 -0
  39. moai_adk/core/integration/models.py +88 -0
  40. moai_adk/core/integration/utils.py +211 -0
  41. moai_adk/core/issue_creator.py +28 -18
  42. moai_adk/core/language_config.py +202 -0
  43. moai_adk/core/language_validator.py +556 -0
  44. moai_adk/core/mcp/setup.py +113 -0
  45. moai_adk/core/migration/__init__.py +18 -0
  46. moai_adk/core/migration/backup_manager.py +208 -0
  47. moai_adk/core/migration/file_migrator.py +218 -0
  48. moai_adk/core/migration/version_detector.py +143 -0
  49. moai_adk/core/migration/version_migrator.py +228 -0
  50. moai_adk/core/performance/__init__.py +6 -0
  51. moai_adk/core/performance/cache_system.py +318 -0
  52. moai_adk/core/performance/parallel_processor.py +116 -0
  53. moai_adk/core/project/__init__.py +0 -1
  54. moai_adk/core/project/backup_utils.py +2 -7
  55. moai_adk/core/project/checker.py +3 -3
  56. moai_adk/core/project/detector.py +20 -40
  57. moai_adk/core/project/initializer.py +42 -17
  58. moai_adk/core/project/phase_executor.py +415 -58
  59. moai_adk/core/project/validator.py +6 -25
  60. moai_adk/core/quality/__init__.py +1 -1
  61. moai_adk/core/quality/trust_checker.py +64 -110
  62. moai_adk/core/quality/validators/__init__.py +1 -1
  63. moai_adk/core/quality/validators/base_validator.py +1 -1
  64. moai_adk/core/rollback_manager.py +993 -0
  65. moai_adk/core/session_manager.py +667 -0
  66. moai_adk/core/spec/confidence_scoring.py +749 -0
  67. moai_adk/core/spec/ears_template_engine.py +1182 -0
  68. moai_adk/core/spec/quality_validator.py +721 -0
  69. moai_adk/core/spec_status_manager.py +488 -0
  70. moai_adk/core/template/__init__.py +0 -1
  71. moai_adk/core/template/backup.py +41 -1
  72. moai_adk/core/template/config.py +11 -12
  73. moai_adk/core/template/languages.py +0 -1
  74. moai_adk/core/template/merger.py +79 -22
  75. moai_adk/core/template/processor.py +614 -40
  76. moai_adk/core/template_engine.py +36 -27
  77. moai_adk/foundation/git/commit_templates.py +565 -0
  78. moai_adk/foundation/trust/trust_principles.py +725 -0
  79. moai_adk/foundation/trust/validation_checklist.py +1678 -0
  80. moai_adk/statusline/__init__.py +38 -0
  81. moai_adk/statusline/alfred_detector.py +107 -0
  82. moai_adk/statusline/config.py +364 -0
  83. moai_adk/statusline/enhanced_output_style_detector.py +364 -0
  84. moai_adk/statusline/git_collector.py +190 -0
  85. moai_adk/statusline/main.py +228 -0
  86. moai_adk/statusline/metrics_tracker.py +78 -0
  87. moai_adk/statusline/renderer.py +327 -0
  88. moai_adk/statusline/update_checker.py +135 -0
  89. moai_adk/statusline/version_reader.py +647 -0
  90. moai_adk/templates/.git-hooks/pre-commit +66 -0
  91. moai_adk/templates/.git-hooks/pre-push +116 -4
  92. moai_adk/templates/.github/workflows/moai-gitflow.yml +1 -7
  93. moai_adk/templates/.github/workflows/spec-issue-sync.yml +0 -1
  94. moai_adk/templates/.gitignore +44 -0
  95. moai_adk/templates/.mcp.json +22 -0
  96. moai_adk/templates/CLAUDE.md +450 -1071
  97. moai_adk/utils/__init__.py +0 -1
  98. moai_adk/utils/banner.py +0 -1
  99. moai_adk/utils/common.py +308 -0
  100. moai_adk/utils/link_validator.py +249 -0
  101. moai_adk/utils/logger.py +4 -9
  102. moai_adk/utils/safe_file_reader.py +210 -0
  103. moai_adk/utils/user_experience.py +531 -0
  104. moai_adk-0.25.4.dist-info/METADATA +2279 -0
  105. moai_adk-0.25.4.dist-info/RECORD +112 -0
  106. moai_adk/core/tags/__init__.py +0 -86
  107. moai_adk/core/tags/ci_validator.py +0 -463
  108. moai_adk/core/tags/cli.py +0 -283
  109. moai_adk/core/tags/generator.py +0 -109
  110. moai_adk/core/tags/inserter.py +0 -99
  111. moai_adk/core/tags/mapper.py +0 -126
  112. moai_adk/core/tags/parser.py +0 -76
  113. moai_adk/core/tags/pre_commit_validator.py +0 -393
  114. moai_adk/core/tags/reporter.py +0 -956
  115. moai_adk/core/tags/tags.py +0 -149
  116. moai_adk/core/tags/validator.py +0 -897
  117. moai_adk/templates/.claude/agents/alfred/backend-expert.md +0 -319
  118. moai_adk/templates/.claude/agents/alfred/cc-manager.md +0 -316
  119. moai_adk/templates/.claude/agents/alfred/debug-helper.md +0 -208
  120. moai_adk/templates/.claude/agents/alfred/devops-expert.md +0 -464
  121. moai_adk/templates/.claude/agents/alfred/doc-syncer.md +0 -214
  122. moai_adk/templates/.claude/agents/alfred/frontend-expert.md +0 -357
  123. moai_adk/templates/.claude/agents/alfred/git-manager.md +0 -406
  124. moai_adk/templates/.claude/agents/alfred/implementation-planner.md +0 -423
  125. moai_adk/templates/.claude/agents/alfred/project-manager.md +0 -312
  126. moai_adk/templates/.claude/agents/alfred/quality-gate.md +0 -343
  127. moai_adk/templates/.claude/agents/alfred/skill-factory.md +0 -865
  128. moai_adk/templates/.claude/agents/alfred/spec-builder.md +0 -392
  129. moai_adk/templates/.claude/agents/alfred/tag-agent.md +0 -361
  130. moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +0 -428
  131. moai_adk/templates/.claude/agents/alfred/trust-checker.md +0 -375
  132. moai_adk/templates/.claude/agents/alfred/ui-ux-expert.md +0 -571
  133. moai_adk/templates/.claude/commands/alfred/0-project.md +0 -1525
  134. moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -802
  135. moai_adk/templates/.claude/commands/alfred/2-run.md +0 -709
  136. moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -1009
  137. moai_adk/templates/.claude/commands/alfred/9-feedback.md +0 -149
  138. moai_adk/templates/.claude/hooks/alfred/core/project.py +0 -748
  139. moai_adk/templates/.claude/hooks/alfred/core/timeout.py +0 -136
  140. moai_adk/templates/.claude/hooks/alfred/core/ttl_cache.py +0 -108
  141. moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +0 -198
  142. moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +0 -29
  143. moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +0 -94
  144. moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +0 -100
  145. moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +0 -94
  146. moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +0 -94
  147. moai_adk/templates/.claude/hooks/alfred/shared/core/__init__.py +0 -170
  148. moai_adk/templates/.claude/hooks/alfred/shared/core/checkpoint.py +0 -271
  149. moai_adk/templates/.claude/hooks/alfred/shared/core/context.py +0 -67
  150. moai_adk/templates/.claude/hooks/alfred/shared/core/project.py +0 -749
  151. moai_adk/templates/.claude/hooks/alfred/shared/core/tags.py +0 -230
  152. moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +0 -198
  153. moai_adk/templates/.claude/hooks/alfred/shared/handlers/__init__.py +0 -21
  154. moai_adk/templates/.claude/hooks/alfred/shared/handlers/notification.py +0 -154
  155. moai_adk/templates/.claude/hooks/alfred/shared/handlers/session.py +0 -174
  156. moai_adk/templates/.claude/hooks/alfred/shared/handlers/tool.py +0 -87
  157. moai_adk/templates/.claude/hooks/alfred/shared/handlers/user.py +0 -61
  158. moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +0 -112
  159. moai_adk/templates/.claude/hooks/alfred/utils/__init__.py +0 -1
  160. moai_adk/templates/.claude/hooks/alfred/utils/timeout.py +0 -161
  161. moai_adk/templates/.claude/settings.json +0 -144
  162. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/SKILL.md +0 -70
  163. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/examples.md +0 -62
  164. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/reference.md +0 -242
  165. moai_adk/templates/.claude/skills/moai-alfred-config-schema/SKILL.md +0 -56
  166. moai_adk/templates/.claude/skills/moai-alfred-config-schema/examples.md +0 -28
  167. moai_adk/templates/.claude/skills/moai-alfred-config-schema/reference.md +0 -444
  168. moai_adk/templates/.claude/skills/moai-alfred-context-budget/SKILL.md +0 -62
  169. moai_adk/templates/.claude/skills/moai-alfred-context-budget/examples.md +0 -28
  170. moai_adk/templates/.claude/skills/moai-alfred-context-budget/reference.md +0 -405
  171. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/SKILL.md +0 -51
  172. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/examples.md +0 -355
  173. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/reference.md +0 -239
  174. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -113
  175. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/examples.md +0 -29
  176. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/reference.md +0 -28
  177. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/SKILL.md +0 -323
  178. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/examples.md +0 -286
  179. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/reference.md +0 -126
  180. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -122
  181. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/examples.md +0 -29
  182. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/reference.md +0 -29
  183. moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/SKILL.md +0 -74
  184. moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/examples.md +0 -4
  185. moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/reference.md +0 -269
  186. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/SKILL.md +0 -237
  187. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/examples.md +0 -615
  188. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/reference.md +0 -653
  189. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/SKILL.md +0 -19
  190. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/examples.md +0 -4
  191. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/reference.md +0 -150
  192. moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +0 -113
  193. moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +0 -29
  194. moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +0 -28
  195. moai_adk/templates/.claude/skills/moai-alfred-persona-roles/SKILL.md +0 -198
  196. moai_adk/templates/.claude/skills/moai-alfred-persona-roles/examples.md +0 -431
  197. moai_adk/templates/.claude/skills/moai-alfred-persona-roles/reference.md +0 -141
  198. moai_adk/templates/.claude/skills/moai-alfred-practices/SKILL.md +0 -89
  199. moai_adk/templates/.claude/skills/moai-alfred-practices/examples.md +0 -122
  200. moai_adk/templates/.claude/skills/moai-alfred-practices/reference.md +0 -369
  201. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/SKILL.md +0 -508
  202. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/examples.md +0 -481
  203. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/reference.md +0 -100
  204. moai_adk/templates/.claude/skills/moai-alfred-reporting/SKILL.md +0 -273
  205. moai_adk/templates/.claude/skills/moai-alfred-rules/SKILL.md +0 -77
  206. moai_adk/templates/.claude/skills/moai-alfred-rules/examples.md +0 -265
  207. moai_adk/templates/.claude/skills/moai-alfred-rules/reference.md +0 -539
  208. moai_adk/templates/.claude/skills/moai-alfred-session-state/SKILL.md +0 -19
  209. moai_adk/templates/.claude/skills/moai-alfred-session-state/examples.md +0 -4
  210. moai_adk/templates/.claude/skills/moai-alfred-session-state/reference.md +0 -84
  211. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/README.md +0 -137
  212. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/SKILL.md +0 -219
  213. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples/validate-spec.sh +0 -161
  214. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples.md +0 -541
  215. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/reference.md +0 -622
  216. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/SKILL.md +0 -115
  217. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/examples.md +0 -4
  218. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/reference.md +0 -348
  219. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -113
  220. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/examples.md +0 -29
  221. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/reference.md +0 -28
  222. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -113
  223. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/examples.md +0 -29
  224. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/reference.md +0 -28
  225. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/SKILL.md +0 -19
  226. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/examples.md +0 -4
  227. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/reference.md +0 -211
  228. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -113
  229. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/examples.md +0 -29
  230. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/reference.md +0 -28
  231. moai_adk/templates/.claude/skills/moai-alfred-workflow/SKILL.md +0 -288
  232. moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +0 -269
  233. moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +0 -32
  234. moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +0 -298
  235. moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +0 -26
  236. moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +0 -307
  237. moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +0 -21
  238. moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +0 -252
  239. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +0 -19
  240. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +0 -19
  241. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +0 -24
  242. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +0 -199
  243. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +0 -39
  244. moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +0 -316
  245. moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +0 -18
  246. moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +0 -263
  247. moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +0 -30
  248. moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/SKILL.md +0 -19
  249. moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/examples.md +0 -4
  250. moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/reference.md +0 -218
  251. moai_adk/templates/.claude/skills/moai-cc-skill-factory/CHECKLIST.md +0 -482
  252. moai_adk/templates/.claude/skills/moai-cc-skill-factory/EXAMPLES.md +0 -278
  253. moai_adk/templates/.claude/skills/moai-cc-skill-factory/INTERACTIVE-DISCOVERY.md +0 -524
  254. moai_adk/templates/.claude/skills/moai-cc-skill-factory/METADATA.md +0 -477
  255. moai_adk/templates/.claude/skills/moai-cc-skill-factory/PARALLEL-ANALYSIS-REPORT.md +0 -429
  256. moai_adk/templates/.claude/skills/moai-cc-skill-factory/PYTHON-VERSION-MATRIX.md +0 -391
  257. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-FACTORY-WORKFLOW.md +0 -431
  258. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-UPDATE-ADVISOR.md +0 -577
  259. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL.md +0 -271
  260. moai_adk/templates/.claude/skills/moai-cc-skill-factory/STEP-BY-STEP-GUIDE.md +0 -466
  261. moai_adk/templates/.claude/skills/moai-cc-skill-factory/STRUCTURE.md +0 -583
  262. moai_adk/templates/.claude/skills/moai-cc-skill-factory/WEB-RESEARCH.md +0 -526
  263. moai_adk/templates/.claude/skills/moai-cc-skill-factory/reference.md +0 -465
  264. moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/generate-structure.sh +0 -328
  265. moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/validate-skill.sh +0 -312
  266. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/SKILL_TEMPLATE.md +0 -245
  267. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/examples-template.md +0 -285
  268. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/reference-template.md +0 -278
  269. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/scripts-template.sh +0 -303
  270. moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +0 -291
  271. moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +0 -15
  272. moai_adk/templates/.claude/skills/moai-design-systems/SKILL.md +0 -802
  273. moai_adk/templates/.claude/skills/moai-design-systems/examples.md +0 -1238
  274. moai_adk/templates/.claude/skills/moai-design-systems/reference.md +0 -673
  275. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +0 -290
  276. moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +0 -1633
  277. moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +0 -660
  278. moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +0 -123
  279. moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +0 -29
  280. moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +0 -30
  281. moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +0 -123
  282. moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +0 -29
  283. moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +0 -30
  284. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +0 -123
  285. moai_adk/templates/.claude/skills/moai-domain-database/examples.md +0 -29
  286. moai_adk/templates/.claude/skills/moai-domain-database/reference.md +0 -30
  287. moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +0 -124
  288. moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +0 -29
  289. moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +0 -31
  290. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +0 -128
  291. moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +0 -29
  292. moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +0 -31
  293. moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +0 -123
  294. moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +0 -29
  295. moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +0 -30
  296. moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +0 -123
  297. moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +0 -29
  298. moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +0 -30
  299. moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +0 -123
  300. moai_adk/templates/.claude/skills/moai-domain-security/examples.md +0 -29
  301. moai_adk/templates/.claude/skills/moai-domain-security/reference.md +0 -30
  302. moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +0 -123
  303. moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +0 -29
  304. moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +0 -30
  305. moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +0 -303
  306. moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +0 -1064
  307. moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +0 -1047
  308. moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +0 -113
  309. moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +0 -29
  310. moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +0 -28
  311. moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +0 -113
  312. moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +0 -29
  313. moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +0 -28
  314. moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +0 -113
  315. moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +0 -29
  316. moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +0 -28
  317. moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +0 -116
  318. moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +0 -29
  319. moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +0 -28
  320. moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +0 -122
  321. moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +0 -29
  322. moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +0 -29
  323. moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +0 -113
  324. moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +0 -29
  325. moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +0 -28
  326. moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +0 -113
  327. moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +0 -29
  328. moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +0 -28
  329. moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +0 -113
  330. moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +0 -29
  331. moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +0 -28
  332. moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +0 -307
  333. moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
  334. moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +0 -1099
  335. moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +0 -124
  336. moai_adk/templates/.claude/skills/moai-lang-c/examples.md +0 -29
  337. moai_adk/templates/.claude/skills/moai-lang-c/reference.md +0 -31
  338. moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +0 -124
  339. moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +0 -29
  340. moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +0 -31
  341. moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +0 -123
  342. moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +0 -29
  343. moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +0 -30
  344. moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +0 -123
  345. moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +0 -29
  346. moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +0 -30
  347. moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +0 -127
  348. moai_adk/templates/.claude/skills/moai-lang-go/examples.md +0 -29
  349. moai_adk/templates/.claude/skills/moai-lang-go/reference.md +0 -31
  350. moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +0 -126
  351. moai_adk/templates/.claude/skills/moai-lang-java/examples.md +0 -29
  352. moai_adk/templates/.claude/skills/moai-lang-java/reference.md +0 -31
  353. moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +0 -125
  354. moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +0 -29
  355. moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +0 -32
  356. moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +0 -124
  357. moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +0 -29
  358. moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +0 -31
  359. moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +0 -126
  360. moai_adk/templates/.claude/skills/moai-lang-php/examples.md +0 -29
  361. moai_adk/templates/.claude/skills/moai-lang-php/reference.md +0 -30
  362. moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +0 -433
  363. moai_adk/templates/.claude/skills/moai-lang-python/examples.md +0 -624
  364. moai_adk/templates/.claude/skills/moai-lang-python/reference.md +0 -316
  365. moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +0 -123
  366. moai_adk/templates/.claude/skills/moai-lang-r/examples.md +0 -29
  367. moai_adk/templates/.claude/skills/moai-lang-r/reference.md +0 -30
  368. moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +0 -124
  369. moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +0 -29
  370. moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +0 -31
  371. moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +0 -127
  372. moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +0 -29
  373. moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +0 -31
  374. moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +0 -125
  375. moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +0 -29
  376. moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +0 -30
  377. moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +0 -123
  378. moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +0 -29
  379. moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +0 -30
  380. moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +0 -124
  381. moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +0 -29
  382. moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +0 -31
  383. moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +0 -123
  384. moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +0 -29
  385. moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +0 -30
  386. moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +0 -133
  387. moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +0 -29
  388. moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +0 -34
  389. moai_adk/templates/.claude/skills/moai-project-documentation.md +0 -622
  390. moai_adk/templates/.github/workflows/c-tag-validation.yml +0 -11
  391. moai_adk/templates/.github/workflows/cpp-tag-validation.yml +0 -11
  392. moai_adk/templates/.github/workflows/csharp-tag-validation.yml +0 -11
  393. moai_adk/templates/.github/workflows/dart-tag-validation.yml +0 -11
  394. moai_adk/templates/.github/workflows/go-tag-validation.yml +0 -130
  395. moai_adk/templates/.github/workflows/java-tag-validation.yml +0 -11
  396. moai_adk/templates/.github/workflows/javascript-tag-validation.yml +0 -135
  397. moai_adk/templates/.github/workflows/kotlin-tag-validation.yml +0 -11
  398. moai_adk/templates/.github/workflows/php-tag-validation.yml +0 -11
  399. moai_adk/templates/.github/workflows/python-tag-validation.yml +0 -118
  400. moai_adk/templates/.github/workflows/release.yml +0 -118
  401. moai_adk/templates/.github/workflows/ruby-tag-validation.yml +0 -11
  402. moai_adk/templates/.github/workflows/rust-tag-validation.yml +0 -11
  403. moai_adk/templates/.github/workflows/shell-tag-validation.yml +0 -11
  404. moai_adk/templates/.github/workflows/swift-tag-validation.yml +0 -11
  405. moai_adk/templates/.github/workflows/tag-report.yml +0 -269
  406. moai_adk/templates/.github/workflows/tag-validation.yml +0 -186
  407. moai_adk/templates/.github/workflows/typescript-tag-validation.yml +0 -154
  408. moai_adk/templates/.moai/config.json +0 -115
  409. moai_adk/templates/workflows/go-tag-validation.yml +0 -30
  410. moai_adk/templates/workflows/javascript-tag-validation.yml +0 -41
  411. moai_adk/templates/workflows/python-tag-validation.yml +0 -42
  412. moai_adk/templates/workflows/typescript-tag-validation.yml +0 -31
  413. moai_adk-0.15.0.dist-info/METADATA +0 -3079
  414. moai_adk-0.15.0.dist-info/RECORD +0 -365
  415. {moai_adk-0.15.0.dist-info → moai_adk-0.25.4.dist-info}/WHEEL +0 -0
  416. {moai_adk-0.15.0.dist-info → moai_adk-0.25.4.dist-info}/entry_points.txt +0 -0
  417. {moai_adk-0.15.0.dist-info → moai_adk-0.25.4.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,348 @@
1
+ """
2
+ User Experience Improvement CLI Command
3
+ """
4
+
5
+ import argparse
6
+ import asyncio
7
+ from pathlib import Path
8
+
9
+ from rich.console import Console
10
+ from rich.panel import Panel
11
+ from rich.progress import Progress, SpinnerColumn, TextColumn
12
+ from rich.table import Table
13
+
14
+ from moai_adk.utils.user_experience import (
15
+ UserExperienceAnalyzer,
16
+ generate_improvement_plan,
17
+ )
18
+
19
+ console = Console()
20
+
21
+
22
+ def create_parser(subparsers) -> argparse.ArgumentParser:
23
+ """Create user experience improvement parser"""
24
+ parser = subparsers.add_parser(
25
+ "improve-ux",
26
+ help="Analyze user experience improvements",
27
+ description="Analyze user experience of online documentation portal and provide improvement plan",
28
+ )
29
+
30
+ parser.add_argument(
31
+ "--url",
32
+ "-u",
33
+ type=str,
34
+ default="https://adk.mo.ai.kr",
35
+ help="URL to analyze (default: https://adk.mo.ai.kr)",
36
+ )
37
+
38
+ parser.add_argument(
39
+ "--output", "-o", type=str, help="File path to save analysis results"
40
+ )
41
+
42
+ parser.add_argument(
43
+ "--format",
44
+ "-f",
45
+ type=str,
46
+ choices=["json", "markdown", "text"],
47
+ default="markdown",
48
+ help="Output format (default: markdown)",
49
+ )
50
+
51
+ parser.add_argument(
52
+ "--verbose", "-v", action="store_true", help="Display detailed progress"
53
+ )
54
+
55
+ parser.add_argument(
56
+ "--max-workers",
57
+ "-w",
58
+ type=int,
59
+ default=5,
60
+ help="Maximum number of concurrent tasks (default: 5)",
61
+ )
62
+
63
+ return parser
64
+
65
+
66
+ def format_metrics_table(metrics: dict) -> Table:
67
+ """Format metrics table"""
68
+ table = Table(title="User Experience Metrics")
69
+ table.add_column("Category", style="cyan")
70
+ table.add_column("Score", style="magenta")
71
+ table.add_column("Status", style="green")
72
+
73
+ # Performance metrics
74
+ perf = metrics.get("performance")
75
+ table.add_row(
76
+ "Performance",
77
+ f"{perf.success_rate if perf else 0:.2f}",
78
+ "✅ Good" if (perf and perf.is_good) else "❌ Needs Improvement",
79
+ )
80
+
81
+ # Navigation metrics
82
+ nav = metrics.get("navigation")
83
+ table.add_row(
84
+ "Navigation",
85
+ f"{nav.structure_score if nav else 0:.2f}",
86
+ "✅ Good" if (nav and nav.is_good) else "❌ Needs Improvement",
87
+ )
88
+
89
+ # Content metrics
90
+ content = metrics.get("content")
91
+ table.add_row(
92
+ "Content",
93
+ f"{content.accuracy_score if content else 0:.2f}",
94
+ "✅ Good" if (content and content.is_good) else "❌ Needs Improvement",
95
+ )
96
+
97
+ # Accessibility metrics
98
+ acc = metrics.get("accessibility")
99
+ table.add_row(
100
+ "Accessibility",
101
+ f"{1.0 if (acc and acc.is_good) else 0.0:.2f}",
102
+ "✅ Good" if (acc and acc.is_good) else "❌ Needs Improvement",
103
+ )
104
+
105
+ return table
106
+
107
+
108
+ def format_recommendations(recommendations: list) -> Table:
109
+ """Format recommendations table"""
110
+ table = Table(title="Improvement Recommendations")
111
+ table.add_column("Recommendation", style="yellow")
112
+ table.add_column("Priority", style="red")
113
+
114
+ for i, rec in enumerate(recommendations, 1):
115
+ priority = "Medium" # Default
116
+ if (
117
+ "error" in rec.lower()
118
+ or "keyboard" in rec.lower()
119
+ or "accuracy" in rec.lower()
120
+ ):
121
+ priority = "High"
122
+ elif "performance" in rec.lower() or "structure" in rec.lower():
123
+ priority = "Medium"
124
+ else:
125
+ priority = "Low"
126
+
127
+ table.add_row(f"{i}. {rec}", priority)
128
+
129
+ return table
130
+
131
+
132
+ def format_timeline(timeline: dict) -> Table:
133
+ """Format timeline table"""
134
+ table = Table(title="Implementation Plan")
135
+ table.add_column("Period", style="cyan")
136
+ table.add_column("Tasks", style="magenta")
137
+
138
+ for period, tasks in timeline.items():
139
+ if tasks:
140
+ table.add_row(
141
+ period.replace("_", " ").title(),
142
+ "\n".join(f"• {task}" for task in tasks),
143
+ )
144
+
145
+ return table
146
+
147
+
148
+ async def analyze_user_experience(
149
+ url: str, max_workers: int = 5, verbose: bool = False
150
+ ) -> dict:
151
+ """Perform user experience analysis"""
152
+ if verbose:
153
+ console.print(f"[blue]Starting user experience analysis: {url}[/blue]")
154
+
155
+ analyzer = UserExperienceAnalyzer(url, max_workers=max_workers)
156
+
157
+ with Progress(
158
+ SpinnerColumn(),
159
+ TextColumn("[progress.description]{task.description}"),
160
+ console=console,
161
+ transient=True,
162
+ ) as progress:
163
+ # Create analysis task
164
+ analysis_task = progress.add_task("Analyzing user experience...", total=None)
165
+
166
+ # Execute analysis
167
+ analysis_report = await analyzer.generate_report()
168
+
169
+ progress.update(analysis_task, completed=True)
170
+
171
+ return analysis_report
172
+
173
+
174
+ def generate_markdown_report(analysis_report: dict, improvement_plan: dict) -> str:
175
+ """Generate markdown report"""
176
+ report = []
177
+
178
+ # Header
179
+ report.append("# User Experience Improvement Report")
180
+ report.append("")
181
+ report.append(f"**Analysis Target**: {analysis_report.get('base_url', 'N/A')}")
182
+ report.append(f"**Analysis Time**: {analysis_report.get('generated_at', 'N/A')}")
183
+ report.append("")
184
+
185
+ # Overall score
186
+ overall_score = analysis_report.get("overall_score", 0)
187
+ report.append(f"## Overall Score: {overall_score:.2f}")
188
+ report.append("")
189
+
190
+ # Metrics details
191
+ report.append("### Metrics Details")
192
+ report.append("")
193
+
194
+ # Performance metrics
195
+ performance = analysis_report.get("performance")
196
+ report.append("#### Performance")
197
+ report.append(
198
+ f"- Success Rate: {performance.success_rate if performance else 0:.2f}"
199
+ )
200
+ report.append(
201
+ f"- Average Load Time: {performance.load_time if performance else 0:.2f}s"
202
+ )
203
+ report.append(
204
+ f"- Response Time: {performance.response_time if performance else 0:.2f}s"
205
+ )
206
+ report.append(f"- Error Rate: {performance.error_rate if performance else 0:.2f}")
207
+ report.append("")
208
+
209
+ # Navigation metrics
210
+ navigation = analysis_report.get("navigation")
211
+ report.append("#### Navigation")
212
+ report.append(
213
+ f"- Structure Score: {navigation.structure_score if navigation else 0:.2f}"
214
+ )
215
+ report.append(f"- Link Count: {navigation.link_count if navigation else 0}")
216
+ report.append(f"- Depth: {navigation.depth if navigation else 0}")
217
+ report.append(f"- Completeness: {navigation.completeness if navigation else 0:.2f}")
218
+ report.append("")
219
+
220
+ # Content metrics
221
+ content = analysis_report.get("content")
222
+ report.append("#### Content")
223
+ report.append(f"- Accuracy: {content.accuracy_score if content else 0:.2f}")
224
+ report.append(f"- Completeness: {content.completeness_score if content else 0:.2f}")
225
+ report.append(f"- Organization: {content.organization_score if content else 0:.2f}")
226
+ report.append(f"- Readability: {content.readability_score if content else 0:.2f}")
227
+ report.append("")
228
+
229
+ # Accessibility metrics
230
+ accessibility = analysis_report.get("accessibility")
231
+ report.append("#### Accessibility")
232
+ report.append(
233
+ f"- Keyboard Navigation: {'✅' if (accessibility and accessibility.keyboard_navigation) else '❌'}"
234
+ )
235
+ report.append(
236
+ f"- Screen Reader Support: {'✅' if (accessibility and accessibility.screen_reader_support) else '❌'}"
237
+ )
238
+ report.append(
239
+ f"- Color Contrast: {'✅' if (accessibility and accessibility.color_contrast) else '❌'}"
240
+ )
241
+ report.append(
242
+ f"- Responsive Design: {'✅' if (accessibility and accessibility.responsive_design) else '❌'}"
243
+ )
244
+ report.append(
245
+ f"- ARIA Labels: {'✅' if (accessibility and accessibility.aria_labels) else '❌'}"
246
+ )
247
+ report.append("")
248
+
249
+ # Recommendations
250
+ report.append("### Improvement Recommendations")
251
+ report.append("")
252
+ for rec in analysis_report.get("recommendations", []):
253
+ report.append(f"- {rec}")
254
+ report.append("")
255
+
256
+ # Implementation plan
257
+ report.append("### Implementation Plan")
258
+ report.append("")
259
+ report.append(
260
+ f"**Estimated Duration**: {improvement_plan.get('estimated_duration', 'N/A')}"
261
+ )
262
+ report.append("")
263
+
264
+ timeline = improvement_plan.get("timeline", {})
265
+ for period, tasks in timeline.items():
266
+ if tasks:
267
+ report.append(f"#### {period.replace('_', ' ').title()}")
268
+ for task in tasks:
269
+ report.append(f"- {task}")
270
+ report.append("")
271
+
272
+ return "\n".join(report)
273
+
274
+
275
+ def run_command(args) -> int:
276
+ """Run user experience improvement command"""
277
+ try:
278
+ # Execute analysis
279
+ analysis_report = asyncio.run(
280
+ analyze_user_experience(args.url, args.max_workers, args.verbose)
281
+ )
282
+
283
+ # Generate improvement plan
284
+ improvement_plan = generate_improvement_plan(analysis_report)
285
+
286
+ # Display results
287
+ if args.verbose:
288
+ console.print(
289
+ Panel.fit(
290
+ f"Overall Score: {analysis_report['overall_score']:.2f}",
291
+ title="Analysis Results",
292
+ style="blue",
293
+ )
294
+ )
295
+
296
+ # Display metrics table
297
+ metrics_table = format_metrics_table(analysis_report)
298
+ console.print(metrics_table)
299
+
300
+ # Display recommendations
301
+ if analysis_report.get("recommendations"):
302
+ recommendations_table = format_recommendations(
303
+ analysis_report["recommendations"]
304
+ )
305
+ console.print(recommendations_table)
306
+
307
+ # Display implementation plan
308
+ if improvement_plan.get("timeline"):
309
+ timeline_table = format_timeline(improvement_plan["timeline"])
310
+ console.print(timeline_table)
311
+
312
+ # Save results
313
+ if args.output:
314
+ if args.format == "json":
315
+ import json
316
+
317
+ result = {
318
+ "analysis": analysis_report,
319
+ "improvement_plan": improvement_plan,
320
+ }
321
+ output_content = json.dumps(result, indent=2, ensure_ascii=False)
322
+ else:
323
+ output_content = generate_markdown_report(
324
+ analysis_report, improvement_plan
325
+ )
326
+
327
+ output_path = Path(args.output)
328
+ output_path.write_text(output_content, encoding="utf-8")
329
+ console.print(f"\n[green]Results saved:[/green] {output_path}")
330
+
331
+ # Return exit code
332
+ if analysis_report["overall_score"] >= 0.85:
333
+ console.print(
334
+ f"\n[green]✅ User experience is excellent (score: {analysis_report['overall_score']:.2f})[/green]"
335
+ )
336
+ return 0
337
+ else:
338
+ console.print(
339
+ f"\n[yellow]⚠️ User experience needs improvement (score: {analysis_report['overall_score']:.2f})[/yellow]"
340
+ )
341
+ return 1
342
+
343
+ except KeyboardInterrupt:
344
+ console.print("\n[yellow]Analysis interrupted by user.[/yellow]")
345
+ return 1
346
+ except Exception as e:
347
+ console.print(f"[red]Error occurred:[/red] {e}")
348
+ return 1
@@ -1,4 +1,3 @@
1
- # @CODE:CLI-001 | @CODE:INIT-003:CLI
2
1
  # SPEC: SPEC-CLI-001.md, SPEC-INIT-003.md
3
2
  # TEST: tests/unit/test_cli_commands.py, tests/unit/test_init_reinit.py
4
3
  """MoAI-ADK init command
@@ -37,7 +36,9 @@ from rich.progress import BarColumn, Progress, SpinnerColumn, TaskID, TextColumn
37
36
 
38
37
  from moai_adk import __version__
39
38
  from moai_adk.cli.prompts import prompt_project_setup
39
+ from moai_adk.core.mcp.setup import MCPSetupManager
40
40
  from moai_adk.core.project.initializer import ProjectInitializer
41
+ from moai_adk.statusline.version_reader import VersionConfig, VersionReader
41
42
  from moai_adk.utils.banner import print_banner, print_welcome_message
42
43
 
43
44
  console = Console()
@@ -85,9 +86,9 @@ def create_progress_callback(progress: Progress, task_ids: Sequence[TaskID]):
85
86
  )
86
87
  @click.option(
87
88
  "--locale",
88
- type=click.Choice(["ko", "en"]),
89
+ type=click.Choice(["ko", "en", "ja", "zh"]),
89
90
  default=None,
90
- help="Preferred language (default: en)",
91
+ help="Preferred language (ko/en/ja/zh, default: en)",
91
92
  )
92
93
  @click.option(
93
94
  "--language",
@@ -95,6 +96,17 @@ def create_progress_callback(progress: Progress, task_ids: Sequence[TaskID]):
95
96
  default=None,
96
97
  help="Programming language (auto-detect if not specified)",
97
98
  )
99
+ @click.option(
100
+ "--with-mcp",
101
+ multiple=True,
102
+ type=click.Choice(["context7", "figma", "playwright", "sequential-thinking"]),
103
+ help="Install MCP servers automatically (can be used multiple times)",
104
+ )
105
+ @click.option(
106
+ "--mcp-auto",
107
+ is_flag=True,
108
+ help="Auto-install all recommended MCP servers",
109
+ )
98
110
  @click.option(
99
111
  "--force",
100
112
  is_flag=True,
@@ -106,6 +118,8 @@ def init(
106
118
  mode: str,
107
119
  locale: str,
108
120
  language: str | None,
121
+ with_mcp: tuple,
122
+ mcp_auto: bool,
109
123
  force: bool,
110
124
  ) -> None:
111
125
  """Initialize a new MoAI-ADK project
@@ -114,18 +128,38 @@ def init(
114
128
  path: Project directory path (default: current directory)
115
129
  non_interactive: Skip prompts and use defaults
116
130
  mode: Project mode (personal/team)
117
- locale: Preferred language (ko/en). When omitted, defaults to en.
131
+ locale: Preferred language (ko/en/ja/zh). Interactive mode supports additional languages.
118
132
  language: Programming language
133
+ with_mcp: Install specific MCP servers (can be used multiple times)
134
+ mcp_auto: Auto-install all recommended MCP servers
119
135
  force: Force reinitialize without confirmation
120
136
  """
121
137
  try:
122
- # 1. Print banner
138
+ # 1. Print banner with enhanced version info
123
139
  print_banner(__version__)
124
140
 
125
- # 2. Check current directory mode
141
+ # 2. Enhanced version reading with error handling
142
+ try:
143
+ version_config = VersionConfig(
144
+ cache_ttl_seconds=10, # Very short cache for CLI
145
+ fallback_version=__version__,
146
+ debug_mode=False,
147
+ )
148
+ version_reader = VersionReader(version_config)
149
+ current_version = version_reader.get_version()
150
+
151
+ # Log version info for debugging
152
+ console.print(f"[dim]Current MoAI-ADK version: {current_version}[/dim]")
153
+ except Exception as e:
154
+ console.print(f"[yellow]⚠️ Version read error: {e}[/yellow]")
155
+
156
+ # 3. Check current directory mode
126
157
  is_current_dir = path == "."
127
158
  project_path = Path(path).resolve()
128
159
 
160
+ # Initialize variables
161
+ custom_language = None
162
+
129
163
  # 3. Interactive vs Non-Interactive
130
164
  if non_interactive:
131
165
  # Non-Interactive Mode
@@ -134,10 +168,33 @@ def init(
134
168
  )
135
169
  project_name = project_path.name if is_current_dir else path
136
170
  locale = locale or "en"
171
+ # Language detection happens in /alfred:0-project, so default to None here
172
+ # This will become "generic" internally, but Summary will show more helpful message
173
+ if not language:
174
+ language = None
175
+
176
+ # Handle MCP options in non-interactive mode
177
+ if mcp_auto:
178
+ mcp_servers = ["context7", "playwright", "sequential-thinking"]
179
+ console.print(
180
+ "[cyan]🔧 MCP servers:[/cyan] Auto-installing all recommended servers"
181
+ )
182
+ elif with_mcp:
183
+ mcp_servers = list(with_mcp)
184
+ console.print(f"[cyan]🔧 MCP servers:[/cyan] {', '.join(mcp_servers)}")
185
+ else:
186
+ mcp_servers = []
137
187
  else:
138
188
  # Interactive Mode
139
189
  print_welcome_message()
140
190
 
191
+ # Check for MCP CLI options in interactive mode (warn user)
192
+ if mcp_auto or with_mcp:
193
+ console.print(
194
+ "[yellow]⚠️ MCP options ignored in interactive mode[/yellow]"
195
+ )
196
+ console.print(" Please use the interactive prompts instead.\n")
197
+
141
198
  # Interactive prompt
142
199
  answers = prompt_project_setup(
143
200
  project_name=None if is_current_dir else path,
@@ -151,6 +208,8 @@ def init(
151
208
  locale = answers["locale"]
152
209
  language = answers["language"]
153
210
  project_name = answers["project_name"]
211
+ mcp_servers = answers.get("mcp_servers", [])
212
+ custom_language = answers.get("custom_language")
154
213
 
155
214
  console.print("\n[cyan]🚀 Starting installation...[/cyan]\n")
156
215
 
@@ -163,7 +222,9 @@ def init(
163
222
  if initializer.is_initialized():
164
223
  # Always reinitialize without confirmation (force mode by default)
165
224
  if non_interactive:
166
- console.print("\n[green]🔄 Reinitializing project (force mode)...[/green]\n")
225
+ console.print(
226
+ "\n[green]🔄 Reinitializing project (force mode)...[/green]\n"
227
+ )
167
228
  else:
168
229
  # Interactive mode: Simple notification
169
230
  console.print("\n[cyan]🔄 Reinitializing project...[/cyan]")
@@ -187,7 +248,7 @@ def init(
187
248
  except Exception:
188
249
  pass # Ignore removal failures
189
250
 
190
- config_path = project_path / ".moai" / "config.json"
251
+ config_path = project_path / ".moai" / "config" / "config.json"
191
252
  if config_path.exists():
192
253
  try:
193
254
  with open(config_path, "r", encoding="utf-8") as f:
@@ -196,7 +257,20 @@ def init(
196
257
  # Update version and optimization flags
197
258
  if "moai" not in config_data:
198
259
  config_data["moai"] = {}
199
- config_data["moai"]["version"] = __version__
260
+
261
+ # Use enhanced version reader for consistent version handling
262
+ try:
263
+ version_config = VersionConfig(
264
+ cache_ttl_seconds=5, # Very short cache for config update
265
+ fallback_version=__version__,
266
+ debug_mode=False,
267
+ )
268
+ version_reader = VersionReader(version_config)
269
+ current_version = version_reader.get_version()
270
+ config_data["moai"]["version"] = current_version
271
+ except Exception:
272
+ # Fallback to package version
273
+ config_data["moai"]["version"] = __version__
200
274
 
201
275
  if "project" not in config_data:
202
276
  config_data["project"] = {}
@@ -230,6 +304,7 @@ def init(
230
304
  mode=mode,
231
305
  locale=locale,
232
306
  language=language,
307
+ custom_language=custom_language,
233
308
  backup_enabled=True,
234
309
  progress_callback=callback,
235
310
  reinit=True, # Always allow reinit (force mode by default)
@@ -244,21 +319,41 @@ def init(
244
319
  console.print(separator)
245
320
  console.print("\n[cyan]📊 Summary:[/cyan]")
246
321
  console.print(f" [dim]📁 Location:[/dim] {result.project_path}")
247
- console.print(f" [dim]🌐 Language:[/dim] {result.language}")
248
- console.print(f" [dim]🔧 Mode:[/dim] {result.mode}")
249
- console.print(
250
- f" [dim]🌍 Locale:[/dim] {result.locale}"
322
+ # Show language more clearly - "generic" means auto-detect
323
+ language_display = (
324
+ "Auto-detect (use /alfred:0-project)"
325
+ if result.language == "generic"
326
+ else result.language
251
327
  )
328
+ console.print(f" [dim]🌐 Language:[/dim] {language_display}")
329
+ console.print(f" [dim]🔧 Mode:[/dim] {result.mode}")
330
+ console.print(f" [dim]🌍 Locale:[/dim] {result.locale}")
252
331
  console.print(
253
332
  f" [dim]📄 Files:[/dim] {len(result.created_files)} created"
254
333
  )
255
334
  console.print(f" [dim]⏱️ Duration:[/dim] {result.duration}ms")
256
335
 
336
+ # Show MCP setup info
337
+ if mcp_servers:
338
+ console.print(f" [dim]🔧 MCP Servers:[/dim] {', '.join(mcp_servers)}")
339
+
340
+ # MCP Setup (if servers selected)
341
+ if mcp_servers:
342
+ console.print("\n[cyan]🔧 Setting up MCP servers...[/cyan]")
343
+ mcp_manager = MCPSetupManager(project_path)
344
+ mcp_success = mcp_manager.setup_mcp_servers(mcp_servers)
345
+ if not mcp_success:
346
+ console.print(
347
+ "[yellow]⚠️ MCP setup completed with warnings[/yellow]"
348
+ )
349
+
257
350
  # Show backup info if reinitialized
258
351
  if is_reinit:
259
352
  backup_dir = project_path / ".moai-backups"
260
353
  if backup_dir.exists():
261
- latest_backup = max(backup_dir.iterdir(), key=lambda p: p.stat().st_mtime)
354
+ latest_backup = max(
355
+ backup_dir.iterdir(), key=lambda p: p.stat().st_mtime
356
+ )
262
357
  console.print(f" [dim]💾 Backup:[/dim] {latest_backup.name}/")
263
358
 
264
359
  console.print(f"\n{separator}")
@@ -266,11 +361,19 @@ def init(
266
361
  # Show config merge notice if reinitialized
267
362
  if is_reinit:
268
363
  console.print("\n[yellow]⚠️ Configuration Notice:[/yellow]")
269
- console.print(" All template files have been [bold]force overwritten[/bold]")
270
- console.print(" Previous files are backed up in [cyan].moai-backups/backup/[/cyan]")
364
+ console.print(
365
+ " All template files have been [bold]force overwritten[/bold]"
366
+ )
367
+ console.print(
368
+ " Previous files are backed up in [cyan].moai-backups/backup/[/cyan]"
369
+ )
271
370
  console.print("\n [cyan]To merge your previous config:[/cyan]")
272
- console.print(" Run [bold]/alfred:0-project[/bold] command in Claude Code")
273
- console.print(" It will merge backup config when [dim]optimized=false[/dim]\n")
371
+ console.print(
372
+ " Run [bold]/alfred:0-project[/bold] command in Claude Code"
373
+ )
374
+ console.print(
375
+ " It will merge backup config when [dim]optimized=false[/dim]\n"
376
+ )
274
377
 
275
378
  console.print("\n[cyan]🚀 Next Steps:[/cyan]")
276
379
  if not is_current_dir:
@@ -278,18 +381,40 @@ def init(
278
381
  f" [blue]1.[/blue] Run [bold]cd {project_name}[/bold] to enter the project"
279
382
  )
280
383
  console.print(
281
- " [blue]2.[/blue] Check [bold].moai/config.json[/bold] for configuration"
384
+ " [blue]2.[/blue] Run [bold]/alfred:0-project[/bold] in Claude Code for full setup"
282
385
  )
283
386
  console.print(
284
- " [blue]3.[/blue] Read [bold]CLAUDE.md[/bold] for development guide\n"
387
+ " (Configure: mode, language, report generation, etc.)"
285
388
  )
286
389
  else:
287
390
  console.print(
288
- " [blue]1.[/blue] Check [bold].moai/config.json[/bold] for configuration"
391
+ " [blue]1.[/blue] Run [bold]/alfred:0-project[/bold] in Claude Code for full setup"
392
+ )
393
+ console.print(
394
+ " (Configure: mode, language, report generation, etc.)"
395
+ )
396
+
397
+ # Figma token setup guidance
398
+ if mcp_servers and "figma" in mcp_servers:
399
+ console.print("\n[yellow]🔐 Figma Access Token Setup:[/yellow]")
400
+ console.print(
401
+ " [dim]Figma MCP requires an access token to function:[/dim]"
402
+ )
403
+ console.print(
404
+ " 1. Visit: https://www.figma.com/developers/api#access-tokens"
289
405
  )
406
+ console.print(" 2. Create a new access token")
290
407
  console.print(
291
- " [blue]2.[/blue] Read [bold]CLAUDE.md[/bold] for development guide\n"
408
+ " 3. Run [bold]/alfred:0-project[/bold] and follow the Figma setup prompts"
292
409
  )
410
+ console.print(
411
+ " 4. The token will be securely stored in your environment\n"
412
+ )
413
+
414
+ if not is_current_dir:
415
+ console.print(" [blue]3.[/blue] Start developing with MoAI-ADK!\n")
416
+ else:
417
+ console.print(" [blue]2.[/blue] Start developing with MoAI-ADK!\n")
293
418
  else:
294
419
  console.print("\n[red bold]❌ Initialization Failed![/red bold]")
295
420
  if result.errors:
@@ -304,7 +429,9 @@ def init(
304
429
  raise click.Abort()
305
430
  except FileExistsError as e:
306
431
  console.print("\n[yellow]⚠ Project already initialized[/yellow]")
307
- console.print("[dim] Use 'python -m moai_adk status' to check configuration[/dim]\n")
432
+ console.print(
433
+ "[dim] Use 'python -m moai_adk status' to check configuration[/dim]\n"
434
+ )
308
435
  raise click.Abort() from e
309
436
  except Exception as e:
310
437
  console.print(f"\n[red]✗ Initialization failed: {e}[/red]\n")