moai-adk 0.25.4__py3-none-any.whl → 0.32.8__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 (378) hide show
  1. moai_adk/__init__.py +2 -5
  2. moai_adk/__main__.py +114 -82
  3. moai_adk/cli/__init__.py +6 -1
  4. moai_adk/cli/commands/__init__.py +1 -3
  5. moai_adk/cli/commands/analyze.py +5 -16
  6. moai_adk/cli/commands/doctor.py +6 -18
  7. moai_adk/cli/commands/init.py +56 -125
  8. moai_adk/cli/commands/language.py +14 -35
  9. moai_adk/cli/commands/status.py +9 -15
  10. moai_adk/cli/commands/update.py +1555 -190
  11. moai_adk/cli/prompts/init_prompts.py +112 -56
  12. moai_adk/cli/spec_status.py +263 -0
  13. moai_adk/cli/ui/__init__.py +44 -0
  14. moai_adk/cli/ui/progress.py +422 -0
  15. moai_adk/cli/ui/prompts.py +389 -0
  16. moai_adk/cli/ui/theme.py +129 -0
  17. moai_adk/cli/worktree/__init__.py +27 -0
  18. moai_adk/cli/worktree/__main__.py +31 -0
  19. moai_adk/cli/worktree/cli.py +672 -0
  20. moai_adk/cli/worktree/exceptions.py +89 -0
  21. moai_adk/cli/worktree/manager.py +490 -0
  22. moai_adk/cli/worktree/models.py +65 -0
  23. moai_adk/cli/worktree/registry.py +128 -0
  24. moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
  25. moai_adk/core/analysis/session_analyzer.py +17 -56
  26. moai_adk/core/claude_integration.py +26 -54
  27. moai_adk/core/command_helpers.py +10 -10
  28. moai_adk/core/comprehensive_monitoring_system.py +1183 -0
  29. moai_adk/core/config/auto_spec_config.py +5 -11
  30. moai_adk/core/config/migration.py +19 -9
  31. moai_adk/core/config/unified.py +436 -0
  32. moai_adk/core/context_manager.py +6 -12
  33. moai_adk/core/enterprise_features.py +1404 -0
  34. moai_adk/core/error_recovery_system.py +725 -112
  35. moai_adk/core/event_driven_hook_system.py +1371 -0
  36. moai_adk/core/git/__init__.py +8 -0
  37. moai_adk/core/git/branch_manager.py +3 -11
  38. moai_adk/core/git/checkpoint.py +1 -3
  39. moai_adk/core/git/conflict_detector.py +413 -0
  40. moai_adk/core/git/manager.py +91 -1
  41. moai_adk/core/hooks/post_tool_auto_spec_completion.py +56 -80
  42. moai_adk/core/input_validation_middleware.py +1006 -0
  43. moai_adk/core/integration/engine.py +6 -18
  44. moai_adk/core/integration/integration_tester.py +10 -9
  45. moai_adk/core/integration/utils.py +1 -1
  46. moai_adk/core/issue_creator.py +10 -28
  47. moai_adk/core/jit_context_loader.py +956 -0
  48. moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
  49. moai_adk/core/language_config_resolver.py +485 -0
  50. moai_adk/core/language_validator.py +28 -41
  51. moai_adk/core/mcp/setup.py +15 -12
  52. moai_adk/core/merge/__init__.py +9 -0
  53. moai_adk/core/merge/analyzer.py +481 -0
  54. moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
  55. moai_adk/core/migration/backup_manager.py +78 -9
  56. moai_adk/core/migration/custom_element_scanner.py +358 -0
  57. moai_adk/core/migration/file_migrator.py +8 -17
  58. moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
  59. moai_adk/core/migration/selective_restorer.py +470 -0
  60. moai_adk/core/migration/template_utils.py +74 -0
  61. moai_adk/core/migration/user_selection_ui.py +338 -0
  62. moai_adk/core/migration/version_detector.py +6 -10
  63. moai_adk/core/migration/version_migrator.py +3 -3
  64. moai_adk/core/performance/cache_system.py +8 -10
  65. moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
  66. moai_adk/core/project/checker.py +2 -4
  67. moai_adk/core/project/detector.py +1 -3
  68. moai_adk/core/project/initializer.py +135 -23
  69. moai_adk/core/project/phase_executor.py +54 -81
  70. moai_adk/core/project/validator.py +6 -12
  71. moai_adk/core/quality/trust_checker.py +9 -27
  72. moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
  73. moai_adk/core/robust_json_parser.py +611 -0
  74. moai_adk/core/rollback_manager.py +73 -148
  75. moai_adk/core/session_manager.py +10 -26
  76. moai_adk/core/skill_loading_system.py +579 -0
  77. moai_adk/core/spec/confidence_scoring.py +31 -100
  78. moai_adk/core/spec/ears_template_engine.py +351 -286
  79. moai_adk/core/spec/quality_validator.py +35 -69
  80. moai_adk/core/spec_status_manager.py +64 -74
  81. moai_adk/core/template/backup.py +45 -20
  82. moai_adk/core/template/config.py +112 -39
  83. moai_adk/core/template/merger.py +11 -19
  84. moai_adk/core/template/processor.py +253 -149
  85. moai_adk/core/template_engine.py +73 -40
  86. moai_adk/core/template_variable_synchronizer.py +417 -0
  87. moai_adk/core/unified_permission_manager.py +745 -0
  88. moai_adk/core/user_behavior_analytics.py +851 -0
  89. moai_adk/core/version_sync.py +429 -0
  90. moai_adk/foundation/__init__.py +56 -0
  91. moai_adk/foundation/backend.py +1027 -0
  92. moai_adk/foundation/database.py +1115 -0
  93. moai_adk/foundation/devops.py +1585 -0
  94. moai_adk/foundation/ears.py +431 -0
  95. moai_adk/foundation/frontend.py +870 -0
  96. moai_adk/foundation/git/commit_templates.py +4 -12
  97. moai_adk/foundation/git.py +376 -0
  98. moai_adk/foundation/langs.py +484 -0
  99. moai_adk/foundation/ml_ops.py +1162 -0
  100. moai_adk/foundation/testing.py +1524 -0
  101. moai_adk/foundation/trust/trust_principles.py +23 -72
  102. moai_adk/foundation/trust/validation_checklist.py +57 -162
  103. moai_adk/project/__init__.py +0 -0
  104. moai_adk/project/configuration.py +1084 -0
  105. moai_adk/project/documentation.py +566 -0
  106. moai_adk/project/schema.py +447 -0
  107. moai_adk/statusline/alfred_detector.py +1 -3
  108. moai_adk/statusline/config.py +13 -4
  109. moai_adk/statusline/enhanced_output_style_detector.py +23 -15
  110. moai_adk/statusline/main.py +51 -15
  111. moai_adk/statusline/renderer.py +104 -48
  112. moai_adk/statusline/update_checker.py +3 -9
  113. moai_adk/statusline/version_reader.py +140 -46
  114. moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
  115. moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
  116. moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
  117. moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
  118. moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
  119. moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
  120. moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
  121. moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
  122. moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
  123. moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
  124. moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
  125. moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
  126. moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
  127. moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
  128. moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
  129. moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
  130. moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
  131. moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
  132. moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
  133. moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
  134. moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
  135. moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
  136. moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
  137. moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
  138. moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
  139. moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
  140. moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
  141. moai_adk/templates/.claude/commands/moai/3-sync.md +993 -0
  142. moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
  143. moai_adk/templates/.claude/hooks/__init__.py +8 -0
  144. moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
  145. moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
  146. moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
  147. moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
  148. moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
  149. moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
  150. moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
  151. moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
  152. moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
  153. moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
  154. moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
  155. moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
  156. moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
  157. moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
  158. moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
  159. moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
  160. moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +921 -0
  161. moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
  162. moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
  163. moai_adk/templates/.claude/settings.json +172 -0
  164. moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -0
  165. moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
  166. moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
  167. moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
  168. moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
  169. moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
  170. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +319 -0
  171. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +320 -0
  172. moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
  173. moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
  174. moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
  175. moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
  176. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +496 -0
  177. moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -0
  178. moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
  179. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
  180. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
  181. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
  182. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
  183. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
  184. moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
  185. moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +491 -0
  186. moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
  187. moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
  188. moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
  189. moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
  190. moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
  191. moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
  192. moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +201 -0
  193. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
  194. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
  195. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
  196. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
  197. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
  198. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
  199. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
  200. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
  201. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
  202. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
  203. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
  204. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
  205. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
  206. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
  207. moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +438 -0
  208. moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -0
  209. moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
  210. moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +346 -0
  211. moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
  212. moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
  213. moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
  214. moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
  215. moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
  216. moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
  217. moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
  218. moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
  219. moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +362 -0
  220. moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
  221. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
  222. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
  223. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
  224. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
  225. moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
  226. moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
  227. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
  228. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
  229. moai_adk/templates/.claude/skills/moai-integration-mcp/SKILL.md +352 -0
  230. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
  231. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
  232. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
  233. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
  234. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
  235. moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
  236. moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
  237. moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
  238. moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
  239. moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -0
  240. moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
  241. moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
  242. moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
  243. moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
  244. moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +316 -0
  245. moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
  246. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
  247. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
  248. moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
  249. moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
  250. moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
  251. moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
  252. moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
  253. moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
  254. moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
  255. moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +370 -0
  256. moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
  257. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
  258. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
  259. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
  260. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
  261. moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
  262. moai_adk/templates/.claude/skills/moai-platform-baas/README.md +186 -0
  263. moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
  264. moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
  265. moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
  266. moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
  267. moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
  268. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
  269. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
  270. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
  271. moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
  272. moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -0
  273. moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
  274. moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
  275. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
  276. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
  277. moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
  278. moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +135 -0
  279. moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
  280. moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
  281. moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
  282. moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
  283. moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
  284. moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
  285. moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
  286. moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
  287. moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
  288. moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
  289. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
  290. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -0
  291. moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
  292. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
  293. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
  294. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +71 -0
  295. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
  296. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
  297. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
  298. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
  299. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
  300. moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
  301. moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +374 -0
  302. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
  303. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
  304. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
  305. moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
  306. moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -0
  307. moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
  308. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
  309. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
  310. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
  311. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
  312. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
  313. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
  314. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
  315. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
  316. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
  317. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
  318. moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
  319. moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
  320. moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
  321. moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
  322. moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
  323. moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +410 -0
  324. moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
  325. moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
  326. moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
  327. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
  328. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
  329. moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
  330. moai_adk/templates/.git-hooks/pre-commit +103 -41
  331. moai_adk/templates/.git-hooks/pre-push +116 -21
  332. moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
  333. moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
  334. moai_adk/templates/.gitignore +184 -44
  335. moai_adk/templates/.mcp.json +7 -9
  336. moai_adk/templates/.moai/cache/personalization.json +10 -0
  337. moai_adk/templates/.moai/config/config.yaml +344 -0
  338. moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
  339. moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
  340. moai_adk/templates/.moai/config/presets/team.yaml +33 -0
  341. moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
  342. moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
  343. moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
  344. moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
  345. moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
  346. moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
  347. moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -0
  348. moai_adk/templates/.moai/config/sections/language.yaml +11 -0
  349. moai_adk/templates/.moai/config/sections/project.yaml +13 -0
  350. moai_adk/templates/.moai/config/sections/quality.yaml +15 -0
  351. moai_adk/templates/.moai/config/sections/system.yaml +14 -0
  352. moai_adk/templates/.moai/config/sections/user.yaml +5 -0
  353. moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
  354. moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
  355. moai_adk/templates/CLAUDE.md +382 -501
  356. moai_adk/utils/__init__.py +24 -1
  357. moai_adk/utils/banner.py +7 -10
  358. moai_adk/utils/common.py +16 -30
  359. moai_adk/utils/link_validator.py +4 -12
  360. moai_adk/utils/safe_file_reader.py +2 -6
  361. moai_adk/utils/timeout.py +160 -0
  362. moai_adk/utils/toon_utils.py +256 -0
  363. moai_adk/version.py +22 -0
  364. moai_adk-0.32.8.dist-info/METADATA +2478 -0
  365. moai_adk-0.32.8.dist-info/RECORD +396 -0
  366. {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
  367. {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
  368. moai_adk/cli/commands/backup.py +0 -82
  369. moai_adk/cli/commands/improve_user_experience.py +0 -348
  370. moai_adk/cli/commands/migrate.py +0 -158
  371. moai_adk/cli/commands/validate_links.py +0 -118
  372. moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -413
  373. moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
  374. moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
  375. moai_adk/utils/user_experience.py +0 -531
  376. moai_adk-0.25.4.dist-info/METADATA +0 -2279
  377. moai_adk-0.25.4.dist-info/RECORD +0 -112
  378. {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
@@ -52,9 +52,7 @@ class MCPSetupManager:
52
52
  # Convert "command": "npx", "args": ["-y", "pkg"]
53
53
  # to "command": "cmd", "args": ["/c", "npx", "-y", "pkg"]
54
54
  server_config["command"] = "cmd"
55
- server_config["args"] = ["/c", "npx"] + server_config.get(
56
- "args", []
57
- )
55
+ server_config["args"] = ["/c", "npx"] + server_config.get("args", [])
58
56
  else:
59
57
  server_config["command"] = adapted_command
60
58
 
@@ -89,9 +87,7 @@ class MCPSetupManager:
89
87
 
90
88
  # Show platform info
91
89
  if self.is_windows:
92
- console.print(
93
- "🪟 Windows platform detected - npx commands wrapped with 'cmd /c'"
94
- )
90
+ console.print("🪟 Windows platform detected - npx commands wrapped with 'cmd /c'")
95
91
 
96
92
  console.print(f"📋 Configured servers: {', '.join(server_names)}")
97
93
  return True
@@ -103,11 +99,18 @@ class MCPSetupManager:
103
99
  console.print(f"❌ Failed to copy MCP configuration: {e}")
104
100
  return False
105
101
 
106
- def setup_mcp_servers(self, selected_servers: list[str]) -> bool:
107
- """Complete MCP server setup process with platform adaptation"""
108
- if not selected_servers:
109
- console.print("ℹ️ No MCP servers selected")
110
- return True
102
+ def setup_mcp_servers(self, selected_servers: list[str] | None = None) -> bool:
103
+ """Copy MCP server template to project
111
104
 
112
- console.print("🔧 Setting up MCP servers...")
105
+ This method copies ALL MCP servers from the package template to .mcp.json.
106
+ Server selection happens in settings.local.json via enabledMcpjsonServers array.
107
+
108
+ Args:
109
+ selected_servers: Deprecated parameter (ignored, kept for backward compatibility)
110
+
111
+ Returns:
112
+ True if setup successful, False otherwise
113
+ """
114
+ # This method now only copies the full template
115
+ # User selection is done via settings.local.json
113
116
  return self.copy_template_mcp_config()
@@ -0,0 +1,9 @@
1
+ """MoAI-ADK Merge Analysis Module
2
+
3
+ Provides intelligent merge analysis using Claude Code headless mode
4
+ for comparing backup vs new template configurations.
5
+ """
6
+
7
+ from .analyzer import MergeAnalyzer
8
+
9
+ __all__ = ["MergeAnalyzer"]
@@ -0,0 +1,481 @@
1
+ """Claude Code Headless-based Merge Analyzer
2
+
3
+ Analyzes template merge differences using Claude Code headless mode
4
+ for intelligent backup vs new template comparison and recommendations.
5
+ """
6
+
7
+ import json
8
+ import logging
9
+ import re
10
+ import subprocess
11
+ from difflib import unified_diff
12
+ from pathlib import Path
13
+ from typing import Any
14
+
15
+ import click
16
+ from rich.console import Console
17
+ from rich.live import Live
18
+ from rich.spinner import Spinner
19
+ from rich.table import Table
20
+
21
+ console = Console()
22
+ logger = logging.getLogger(__name__)
23
+
24
+
25
+ class MergeAnalyzer:
26
+ """Merge analyzer using Claude Code for intelligent template merge analysis
27
+
28
+ Compares backed-up user configurations with new templates,
29
+ analyzes them using Claude AI, and provides merge recommendations.
30
+ """
31
+
32
+ # Primary files to analyze
33
+ ANALYZED_FILES = [
34
+ "CLAUDE.md",
35
+ ".claude/settings.json",
36
+ ".moai/config/config.json",
37
+ ".gitignore",
38
+ ]
39
+
40
+ # Claude headless execution settings
41
+ CLAUDE_TIMEOUT = 120 # Maximum 2 minutes
42
+ CLAUDE_MODEL = "claude-haiku-4-5-20251001" # Latest Haiku (cost optimized)
43
+ CLAUDE_TOOLS = ["Read", "Glob", "Grep"] # Read-only tools
44
+
45
+ def __init__(self, project_path: Path):
46
+ """Initialize analyzer with project path."""
47
+ self.project_path = project_path
48
+
49
+ def analyze_merge(self, backup_path: Path, template_path: Path) -> dict[str, Any]:
50
+ """Perform merge analysis using Claude Code headless mode
51
+
52
+ Args:
53
+ backup_path: Path to backed-up configuration directory
54
+ template_path: Path to new template directory
55
+
56
+ Returns:
57
+ Dictionary containing analysis results:
58
+ - files: List of changes by file
59
+ - safe_to_auto_merge: Whether auto-merge is safe
60
+ - user_action_required: Whether user intervention is needed
61
+ - summary: Overall summary
62
+ - error: Error message (if any)
63
+ """
64
+ # 1. Collect files to compare
65
+ diff_files = self._collect_diff_files(backup_path, template_path)
66
+
67
+ # 2. Create Claude headless prompt
68
+ prompt = self._create_analysis_prompt(backup_path, template_path, diff_files)
69
+
70
+ # 3. Run Claude Code headless (show spinner)
71
+ spinner = Spinner("dots", text="[cyan]Running Claude Code analysis...[/cyan]")
72
+
73
+ try:
74
+ with Live(spinner, refresh_per_second=12):
75
+ result = subprocess.run(
76
+ self._build_claude_command(),
77
+ input=prompt,
78
+ capture_output=True,
79
+ text=True,
80
+ timeout=self.CLAUDE_TIMEOUT,
81
+ )
82
+
83
+ if result.returncode == 0:
84
+ # Use new response parsing method
85
+ analysis = self._parse_claude_response(result.stdout)
86
+ if "error" not in analysis:
87
+ console.print("[green]✅ Analysis complete[/green]")
88
+ return analysis
89
+ else:
90
+ console.print(f"[yellow]⚠️ Analysis failed: {analysis.get('summary', 'Unknown error')}[/yellow]")
91
+ return self._fallback_analysis(backup_path, template_path, diff_files)
92
+ else:
93
+ # Use improved error detection
94
+ error_msg = self._detect_claude_errors(result.stderr)
95
+ console.print(f"[yellow]⚠️ Claude execution error: {error_msg}[/yellow]")
96
+ return self._fallback_analysis(backup_path, template_path, diff_files)
97
+
98
+ except subprocess.TimeoutExpired:
99
+ console.print("[yellow]⚠️ Claude analysis timeout (exceeded 120 seconds)[/yellow]")
100
+ return self._fallback_analysis(backup_path, template_path, diff_files)
101
+ except FileNotFoundError:
102
+ console.print("[red]❌ Claude Code not found.[/red]")
103
+ console.print("[cyan] Install Claude Code: https://claude.com/claude-code[/cyan]")
104
+ return self._fallback_analysis(backup_path, template_path, diff_files)
105
+
106
+ def ask_user_confirmation(self, analysis: dict[str, Any]) -> bool:
107
+ """Display analysis results and request user confirmation
108
+
109
+ Args:
110
+ analysis: Result from analyze_merge()
111
+
112
+ Returns:
113
+ True: Proceed, False: Cancel
114
+ """
115
+ # 1. Display analysis results
116
+ self._display_analysis(analysis)
117
+
118
+ # 2. User confirmation
119
+ if analysis.get("user_action_required", False):
120
+ console.print(
121
+ "\n⚠️ User intervention required. Please review the following:",
122
+ style="warning",
123
+ )
124
+ for file_info in analysis.get("files", []):
125
+ if file_info.get("conflict_severity") in ["medium", "high"]:
126
+ console.print(
127
+ f" • {file_info['filename']}: {file_info.get('note', '')}",
128
+ )
129
+
130
+ # 3. Confirmation prompt
131
+ proceed = click.confirm(
132
+ "\nProceed with merge?",
133
+ default=analysis.get("safe_to_auto_merge", False),
134
+ )
135
+
136
+ return proceed
137
+
138
+ def _collect_diff_files(self, backup_path: Path, template_path: Path) -> dict[str, dict[str, Any]]:
139
+ """Collect differences between backup and template files
140
+
141
+ Returns:
142
+ Dictionary with diff information per file
143
+ """
144
+ diff_files = {}
145
+
146
+ for file_name in self.ANALYZED_FILES:
147
+ backup_file = backup_path / file_name
148
+ template_file = template_path / file_name
149
+
150
+ if not backup_file.exists() and not template_file.exists():
151
+ continue
152
+
153
+ diff_info = {
154
+ "backup_exists": backup_file.exists(),
155
+ "template_exists": template_file.exists(),
156
+ "has_diff": False,
157
+ "diff_lines": 0,
158
+ }
159
+
160
+ if backup_file.exists() and template_file.exists():
161
+ backup_content = backup_file.read_text(encoding="utf-8")
162
+ template_content = template_file.read_text(encoding="utf-8")
163
+
164
+ if backup_content != template_content:
165
+ diff = list(
166
+ unified_diff(
167
+ backup_content.splitlines(),
168
+ template_content.splitlines(),
169
+ lineterm="",
170
+ )
171
+ )
172
+ diff_info["has_diff"] = True
173
+ diff_info["diff_lines"] = len(diff)
174
+
175
+ diff_files[file_name] = diff_info
176
+
177
+ return diff_files
178
+
179
+ def _create_analysis_prompt(
180
+ self,
181
+ backup_path: Path,
182
+ template_path: Path,
183
+ diff_files: dict[str, dict[str, Any]],
184
+ ) -> str:
185
+ """Generate Claude headless analysis prompt
186
+
187
+ Returns:
188
+ Analysis prompt to send to Claude
189
+ """
190
+ return f"""You are a MoAI-ADK configuration file merge expert.
191
+
192
+ ## Context
193
+ - Backed-up user configuration: {backup_path}
194
+ - New template: {template_path}
195
+ - Files to analyze: {", ".join(self.ANALYZED_FILES)}
196
+
197
+ ## Files to Analyze
198
+ {self._format_diff_summary(diff_files)}
199
+
200
+ ## Analysis Tasks
201
+ Analyze the following items and provide a JSON response:
202
+
203
+ 1. Identify changes per file
204
+ 2. Assess conflict risk (low/medium/high)
205
+ 3. Merge recommendations (use_template/keep_existing/smart_merge)
206
+ 4. Overall safety assessment
207
+
208
+ ## Response Format (JSON)
209
+ {{
210
+ "files": [
211
+ {{
212
+ "filename": "CLAUDE.md",
213
+ "changes": "Description of changes",
214
+ "recommendation": "use_template|keep_existing|smart_merge",
215
+ "conflict_severity": "low|medium|high",
216
+ "note": "Additional notes (optional)"
217
+ }}
218
+ ],
219
+ "safe_to_auto_merge": true/false,
220
+ "user_action_required": true/false,
221
+ "summary": "Whether merge is safe and why",
222
+ "risk_assessment": "Risk assessment"
223
+ }}
224
+
225
+ ## Merge Rules Reference
226
+ - CLAUDE.md: Preserve Project Information section
227
+ - settings.json: Merge env variables, prioritize template permissions.deny
228
+ - config.json: Preserve user metadata, update schema
229
+ - .gitignore: Additions only (preserve existing items)
230
+
231
+ ## Additional Considerations
232
+ - Assess risk of user customization loss
233
+ - Determine if force overwriting Alfred infrastructure files
234
+ - Review rollback possibilities
235
+ """
236
+
237
+ def _display_analysis(self, analysis: dict[str, Any]) -> None:
238
+ """Display analysis results in Rich format"""
239
+ # Title
240
+ console.print("\n📊 Merge Analysis Results (Claude Code)", style="bold")
241
+
242
+ # Summary
243
+ summary = analysis.get("summary", "No analysis results")
244
+ console.print(f"\n📝 {summary}")
245
+
246
+ # Risk assessment
247
+ risk_assessment = analysis.get("risk_assessment", "")
248
+ if risk_assessment:
249
+ risk_style = "green" if "safe" in risk_assessment.lower() else "yellow"
250
+ console.print(f"⚠️ Risk Level: {risk_assessment}", style=risk_style)
251
+
252
+ # Changes by file table
253
+ files_list = analysis.get("files")
254
+ if files_list and isinstance(files_list, list):
255
+ table = Table(title="Changes by File")
256
+ table.add_column("File", style="cyan")
257
+ table.add_column("Changes", style="white")
258
+ table.add_column("Recommendation", style="yellow")
259
+ table.add_column("Risk", style="red")
260
+
261
+ for file_info in files_list:
262
+ # Ensure file_info is a dictionary
263
+ if not isinstance(file_info, dict):
264
+ continue
265
+
266
+ severity_style = {
267
+ "low": "green",
268
+ "medium": "yellow",
269
+ "high": "red",
270
+ }.get(file_info.get("conflict_severity", "low"), "white")
271
+
272
+ table.add_row(
273
+ file_info.get("filename", "?"),
274
+ file_info.get("changes", "")[:30],
275
+ file_info.get("recommendation", "?"),
276
+ file_info.get("conflict_severity", "?"),
277
+ style=severity_style,
278
+ )
279
+
280
+ console.print(table)
281
+
282
+ # Additional details
283
+ for file_info in files_list:
284
+ # Ensure file_info is a dictionary
285
+ if not isinstance(file_info, dict):
286
+ continue
287
+
288
+ if file_info.get("note"):
289
+ console.print(
290
+ f"\n💡 {file_info['filename']}: {file_info['note']}",
291
+ style="dim",
292
+ )
293
+
294
+ def _parse_claude_response(self, response_text: str) -> dict[str, Any]:
295
+ """Parse Claude Code response supporting both v1.x and v2.0+ formats.
296
+
297
+ Args:
298
+ response_text: Raw response text from Claude Code
299
+
300
+ Returns:
301
+ Parsed analysis dictionary
302
+ """
303
+ try:
304
+ # First try direct JSON parsing (v1.x format)
305
+ return json.loads(response_text)
306
+ except json.JSONDecodeError:
307
+ # Try v2.0+ wrapped format
308
+ try:
309
+ # Look for JSON in the response
310
+ if '"type":' in response_text and '"result":' in response_text:
311
+ # Parse the wrapped v2.0+ format
312
+ response_obj = json.loads(response_text)
313
+ if "result" in response_obj:
314
+ result_text = response_obj["result"]
315
+
316
+ # Try to extract JSON from the result field
317
+ if isinstance(result_text, str):
318
+ # Look for JSON blocks in the result
319
+ if "```json" in result_text:
320
+ # Extract JSON from code block
321
+ start = result_text.find("```json") + 7
322
+ end = result_text.find("```", start)
323
+ if end != -1:
324
+ json_text = result_text[start:end].strip()
325
+ return json.loads(json_text)
326
+ elif result_text.strip().startswith("{"):
327
+ # Try direct JSON parsing
328
+ return json.loads(result_text)
329
+ else:
330
+ # Try to find JSON pattern in text
331
+ json_match = re.search(r"\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}", result_text)
332
+ if json_match:
333
+ try:
334
+ return json.loads(json_match.group(0))
335
+ except json.JSONDecodeError:
336
+ pass
337
+
338
+ # Fallback: try to find any JSON in the text
339
+ json_match = re.search(r"\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}", response_text)
340
+ if json_match:
341
+ return json.loads(json_match.group(0))
342
+
343
+ except (json.JSONDecodeError, KeyError, TypeError) as e:
344
+ console.print(f"[yellow]⚠️ Failed to parse Claude v2.0+ response: {e}[/yellow]")
345
+ logger.warning(f"Claude response parsing failed: {e}")
346
+
347
+ # If all parsing attempts fail, return error structure
348
+ logger.error(f"Could not parse Claude response. Raw response: {response_text[:500]}...")
349
+ return {
350
+ "files": [],
351
+ "safe_to_auto_merge": False,
352
+ "user_action_required": True,
353
+ "summary": "Failed to parse Claude response",
354
+ "risk_assessment": "High - Response parsing failed",
355
+ "error": "response_parse_failed",
356
+ "raw_response": response_text[:500] if response_text else "",
357
+ }
358
+
359
+ def _detect_claude_errors(self, stderr: str) -> str:
360
+ """Detect and interpret Claude Code specific errors.
361
+
362
+ Args:
363
+ stderr: Standard error output from Claude Code
364
+
365
+ Returns:
366
+ User-friendly error message
367
+ """
368
+ if not stderr:
369
+ return ""
370
+
371
+ error_lower = stderr.lower()
372
+
373
+ if "model not found" in error_lower or "unknown model" in error_lower:
374
+ return f"Claude model '{self.CLAUDE_MODEL}' not found. Please check available models with 'claude --models'"
375
+
376
+ if "permission denied" in error_lower:
377
+ return "Permission denied. Check file permissions and Claude Code access rights."
378
+
379
+ if "timeout" in error_lower:
380
+ return f"Claude analysis timed out after {self.CLAUDE_TIMEOUT} seconds. Consider increasing timeout."
381
+
382
+ if "file not found" in error_lower:
383
+ return "Required files not found. Check project structure and file paths."
384
+
385
+ if "invalid argument" in error_lower or "unknown option" in error_lower:
386
+ return "Invalid Claude Code arguments. This might be a version compatibility issue."
387
+
388
+ # Return generic error if no specific pattern matches
389
+ return f"Claude Code error: {stderr[:200]}"
390
+
391
+ def _build_claude_command(self) -> list[str]:
392
+ """Build Claude Code headless command (based on official v4.0+)
393
+
394
+ Claude Code CLI official options:
395
+ - -p: Non-interactive headless mode
396
+ - --model: Explicit model selection (Haiku)
397
+ - --output-format: JSON response format
398
+ - --tools: Read-only tools only (space-separated - POSIX standard)
399
+ - --permission-mode: Auto-approval (background task)
400
+
401
+ Returns:
402
+ List of Claude CLI command arguments
403
+ """
404
+ # Tools list space-separated (POSIX standard, officially recommended)
405
+ tools_str = " ".join(self.CLAUDE_TOOLS)
406
+
407
+ return [
408
+ "claude",
409
+ "-p", # Non-interactive headless mode
410
+ "--model",
411
+ self.CLAUDE_MODEL, # Explicit model specification (Haiku)
412
+ "--output-format",
413
+ "json", # Single JSON response
414
+ "--tools",
415
+ tools_str, # Space-separated (Read Glob Grep)
416
+ "--permission-mode",
417
+ "dontAsk", # Auto-approval (safe, read-only)
418
+ ]
419
+
420
+ def _format_diff_summary(self, diff_files: dict[str, dict[str, Any]]) -> str:
421
+ """Format diff_files for prompt"""
422
+ summary = []
423
+ for file_name, info in diff_files.items():
424
+ if info["backup_exists"] and info["template_exists"]:
425
+ status = f"✏️ Modified ({info['diff_lines']} lines)" if info["has_diff"] else "✓ Identical"
426
+ elif info["backup_exists"]:
427
+ status = "❌ Deleted from template"
428
+ else:
429
+ status = "✨ New file (from template)"
430
+
431
+ summary.append(f"- {file_name}: {status}")
432
+
433
+ return "\n".join(summary)
434
+
435
+ def _fallback_analysis(
436
+ self,
437
+ backup_path: Path,
438
+ template_path: Path,
439
+ diff_files: dict[str, dict[str, Any]],
440
+ ) -> dict[str, Any]:
441
+ """Fallback analysis when Claude call fails (difflib-based)
442
+
443
+ Returns basic analysis results when Claude is unavailable
444
+ """
445
+ console.print(
446
+ "⚠️ Claude Code unavailable. Using fallback analysis.",
447
+ style="yellow",
448
+ )
449
+
450
+ files_analysis = []
451
+ has_high_risk = False
452
+
453
+ for file_name, info in diff_files.items():
454
+ if not info["has_diff"]:
455
+ continue
456
+
457
+ # Simple risk assessment
458
+ severity = "low"
459
+ if file_name in [".claude/settings.json", ".moai/config/config.json"]:
460
+ severity = "medium" if info["diff_lines"] > 10 else "low"
461
+
462
+ files_analysis.append(
463
+ {
464
+ "filename": file_name,
465
+ "changes": f"{info['diff_lines']} lines changed",
466
+ "recommendation": "smart_merge",
467
+ "conflict_severity": severity,
468
+ }
469
+ )
470
+
471
+ if severity == "high":
472
+ has_high_risk = True
473
+
474
+ return {
475
+ "files": files_analysis,
476
+ "safe_to_auto_merge": not has_high_risk,
477
+ "user_action_required": has_high_risk,
478
+ "summary": f"{len(files_analysis)} files changed (fallback analysis)",
479
+ "risk_assessment": ("High - Claude unavailable, manual review recommended" if has_high_risk else "Low"),
480
+ "fallback": True,
481
+ }