moai-adk 0.35.1__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (502) hide show
  1. moai_adk/__init__.py +10 -0
  2. moai_adk/__main__.py +199 -0
  3. moai_adk/cli/__init__.py +6 -0
  4. moai_adk/cli/commands/__init__.py +17 -0
  5. moai_adk/cli/commands/analyze.py +116 -0
  6. moai_adk/cli/commands/doctor.py +272 -0
  7. moai_adk/cli/commands/init.py +372 -0
  8. moai_adk/cli/commands/language.py +248 -0
  9. moai_adk/cli/commands/status.py +104 -0
  10. moai_adk/cli/commands/update.py +2686 -0
  11. moai_adk/cli/main.py +13 -0
  12. moai_adk/cli/prompts/__init__.py +5 -0
  13. moai_adk/cli/prompts/init_prompts.py +219 -0
  14. moai_adk/cli/spec_status.py +263 -0
  15. moai_adk/cli/ui/__init__.py +44 -0
  16. moai_adk/cli/ui/progress.py +422 -0
  17. moai_adk/cli/ui/prompts.py +389 -0
  18. moai_adk/cli/ui/theme.py +129 -0
  19. moai_adk/cli/worktree/__init__.py +27 -0
  20. moai_adk/cli/worktree/__main__.py +31 -0
  21. moai_adk/cli/worktree/cli.py +683 -0
  22. moai_adk/cli/worktree/exceptions.py +89 -0
  23. moai_adk/cli/worktree/manager.py +493 -0
  24. moai_adk/cli/worktree/models.py +65 -0
  25. moai_adk/cli/worktree/registry.py +422 -0
  26. moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
  27. moai_adk/core/__init__.py +1 -0
  28. moai_adk/core/analysis/__init__.py +9 -0
  29. moai_adk/core/analysis/session_analyzer.py +400 -0
  30. moai_adk/core/claude_integration.py +393 -0
  31. moai_adk/core/command_helpers.py +270 -0
  32. moai_adk/core/comprehensive_monitoring_system.py +1183 -0
  33. moai_adk/core/config/__init__.py +19 -0
  34. moai_adk/core/config/auto_spec_config.py +340 -0
  35. moai_adk/core/config/migration.py +244 -0
  36. moai_adk/core/config/unified.py +436 -0
  37. moai_adk/core/context_manager.py +273 -0
  38. moai_adk/core/diagnostics/__init__.py +19 -0
  39. moai_adk/core/diagnostics/slash_commands.py +159 -0
  40. moai_adk/core/enterprise_features.py +1404 -0
  41. moai_adk/core/error_recovery_system.py +1902 -0
  42. moai_adk/core/event_driven_hook_system.py +1371 -0
  43. moai_adk/core/git/__init__.py +31 -0
  44. moai_adk/core/git/branch.py +25 -0
  45. moai_adk/core/git/branch_manager.py +129 -0
  46. moai_adk/core/git/checkpoint.py +134 -0
  47. moai_adk/core/git/commit.py +67 -0
  48. moai_adk/core/git/conflict_detector.py +413 -0
  49. moai_adk/core/git/event_detector.py +79 -0
  50. moai_adk/core/git/manager.py +216 -0
  51. moai_adk/core/hooks/post_tool_auto_spec_completion.py +901 -0
  52. moai_adk/core/input_validation_middleware.py +1006 -0
  53. moai_adk/core/integration/__init__.py +22 -0
  54. moai_adk/core/integration/engine.py +157 -0
  55. moai_adk/core/integration/integration_tester.py +226 -0
  56. moai_adk/core/integration/models.py +88 -0
  57. moai_adk/core/integration/utils.py +211 -0
  58. moai_adk/core/issue_creator.py +305 -0
  59. moai_adk/core/jit_context_loader.py +956 -0
  60. moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
  61. moai_adk/core/language_config.py +202 -0
  62. moai_adk/core/language_config_resolver.py +572 -0
  63. moai_adk/core/language_validator.py +543 -0
  64. moai_adk/core/mcp/setup.py +116 -0
  65. moai_adk/core/merge/__init__.py +9 -0
  66. moai_adk/core/merge/analyzer.py +605 -0
  67. moai_adk/core/migration/__init__.py +18 -0
  68. moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
  69. moai_adk/core/migration/backup_manager.py +277 -0
  70. moai_adk/core/migration/custom_element_scanner.py +358 -0
  71. moai_adk/core/migration/file_migrator.py +209 -0
  72. moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
  73. moai_adk/core/migration/selective_restorer.py +470 -0
  74. moai_adk/core/migration/template_utils.py +74 -0
  75. moai_adk/core/migration/user_selection_ui.py +338 -0
  76. moai_adk/core/migration/version_detector.py +139 -0
  77. moai_adk/core/migration/version_migrator.py +228 -0
  78. moai_adk/core/performance/__init__.py +6 -0
  79. moai_adk/core/performance/cache_system.py +316 -0
  80. moai_adk/core/performance/parallel_processor.py +116 -0
  81. moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
  82. moai_adk/core/project/__init__.py +1 -0
  83. moai_adk/core/project/backup_utils.py +70 -0
  84. moai_adk/core/project/checker.py +300 -0
  85. moai_adk/core/project/detector.py +293 -0
  86. moai_adk/core/project/initializer.py +387 -0
  87. moai_adk/core/project/phase_executor.py +716 -0
  88. moai_adk/core/project/validator.py +139 -0
  89. moai_adk/core/quality/__init__.py +6 -0
  90. moai_adk/core/quality/trust_checker.py +377 -0
  91. moai_adk/core/quality/validators/__init__.py +6 -0
  92. moai_adk/core/quality/validators/base_validator.py +19 -0
  93. moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
  94. moai_adk/core/robust_json_parser.py +611 -0
  95. moai_adk/core/rollback_manager.py +918 -0
  96. moai_adk/core/session_manager.py +651 -0
  97. moai_adk/core/skill_loading_system.py +579 -0
  98. moai_adk/core/spec/confidence_scoring.py +680 -0
  99. moai_adk/core/spec/ears_template_engine.py +1247 -0
  100. moai_adk/core/spec/quality_validator.py +687 -0
  101. moai_adk/core/spec_status_manager.py +478 -0
  102. moai_adk/core/template/__init__.py +7 -0
  103. moai_adk/core/template/backup.py +174 -0
  104. moai_adk/core/template/config.py +191 -0
  105. moai_adk/core/template/languages.py +43 -0
  106. moai_adk/core/template/merger.py +233 -0
  107. moai_adk/core/template/processor.py +1200 -0
  108. moai_adk/core/template_engine.py +310 -0
  109. moai_adk/core/template_variable_synchronizer.py +417 -0
  110. moai_adk/core/unified_permission_manager.py +745 -0
  111. moai_adk/core/user_behavior_analytics.py +851 -0
  112. moai_adk/core/version_sync.py +429 -0
  113. moai_adk/foundation/__init__.py +56 -0
  114. moai_adk/foundation/backend.py +1027 -0
  115. moai_adk/foundation/database.py +1115 -0
  116. moai_adk/foundation/devops.py +1585 -0
  117. moai_adk/foundation/ears.py +431 -0
  118. moai_adk/foundation/frontend.py +870 -0
  119. moai_adk/foundation/git/commit_templates.py +557 -0
  120. moai_adk/foundation/git.py +376 -0
  121. moai_adk/foundation/langs.py +484 -0
  122. moai_adk/foundation/ml_ops.py +1162 -0
  123. moai_adk/foundation/testing.py +1524 -0
  124. moai_adk/foundation/trust/trust_principles.py +676 -0
  125. moai_adk/foundation/trust/validation_checklist.py +1573 -0
  126. moai_adk/project/__init__.py +0 -0
  127. moai_adk/project/configuration.py +1084 -0
  128. moai_adk/project/documentation.py +566 -0
  129. moai_adk/project/schema.py +447 -0
  130. moai_adk/statusline/__init__.py +38 -0
  131. moai_adk/statusline/alfred_detector.py +105 -0
  132. moai_adk/statusline/config.py +376 -0
  133. moai_adk/statusline/enhanced_output_style_detector.py +372 -0
  134. moai_adk/statusline/git_collector.py +190 -0
  135. moai_adk/statusline/main.py +322 -0
  136. moai_adk/statusline/metrics_tracker.py +78 -0
  137. moai_adk/statusline/renderer.py +343 -0
  138. moai_adk/statusline/update_checker.py +129 -0
  139. moai_adk/statusline/version_reader.py +741 -0
  140. moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +714 -0
  141. moai_adk/templates/.claude/agents/moai/builder-agent.md +474 -0
  142. moai_adk/templates/.claude/agents/moai/builder-command.md +1172 -0
  143. moai_adk/templates/.claude/agents/moai/builder-plugin.md +637 -0
  144. moai_adk/templates/.claude/agents/moai/builder-skill.md +666 -0
  145. moai_adk/templates/.claude/agents/moai/expert-backend.md +899 -0
  146. moai_adk/templates/.claude/agents/moai/expert-database.md +777 -0
  147. moai_adk/templates/.claude/agents/moai/expert-debug.md +401 -0
  148. moai_adk/templates/.claude/agents/moai/expert-devops.md +720 -0
  149. moai_adk/templates/.claude/agents/moai/expert-frontend.md +734 -0
  150. moai_adk/templates/.claude/agents/moai/expert-performance.md +657 -0
  151. moai_adk/templates/.claude/agents/moai/expert-security.md +513 -0
  152. moai_adk/templates/.claude/agents/moai/expert-testing.md +733 -0
  153. moai_adk/templates/.claude/agents/moai/expert-uiux.md +1041 -0
  154. moai_adk/templates/.claude/agents/moai/manager-claude-code.md +432 -0
  155. moai_adk/templates/.claude/agents/moai/manager-docs.md +573 -0
  156. moai_adk/templates/.claude/agents/moai/manager-git.md +1060 -0
  157. moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
  158. moai_adk/templates/.claude/agents/moai/manager-quality.md +624 -0
  159. moai_adk/templates/.claude/agents/moai/manager-spec.md +809 -0
  160. moai_adk/templates/.claude/agents/moai/manager-strategy.md +780 -0
  161. moai_adk/templates/.claude/agents/moai/manager-tdd.md +784 -0
  162. moai_adk/templates/.claude/agents/moai/mcp-context7.md +458 -0
  163. moai_adk/templates/.claude/agents/moai/mcp-figma.md +1607 -0
  164. moai_adk/templates/.claude/agents/moai/mcp-notion.md +789 -0
  165. moai_adk/templates/.claude/agents/moai/mcp-playwright.md +469 -0
  166. moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +1032 -0
  167. moai_adk/templates/.claude/commands/moai/0-project.md +1386 -0
  168. moai_adk/templates/.claude/commands/moai/1-plan.md +1427 -0
  169. moai_adk/templates/.claude/commands/moai/2-run.md +943 -0
  170. moai_adk/templates/.claude/commands/moai/3-sync.md +1324 -0
  171. moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
  172. moai_adk/templates/.claude/hooks/__init__.py +8 -0
  173. moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
  174. moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
  175. moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
  176. moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
  177. moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
  178. moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
  179. moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
  180. moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
  181. moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
  182. moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
  183. moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
  184. moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
  185. moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
  186. moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
  187. moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
  188. moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
  189. moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +1083 -0
  190. moai_adk/templates/.claude/output-styles/moai/r2d2.md +560 -0
  191. moai_adk/templates/.claude/output-styles/moai/yoda.md +359 -0
  192. moai_adk/templates/.claude/settings.json +172 -0
  193. moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +307 -0
  194. moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -0
  195. moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/batch_generate.py +560 -0
  196. moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/generate_image.py +362 -0
  197. moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +249 -0
  198. moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +406 -0
  199. moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
  200. moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
  201. moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
  202. moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
  203. moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
  204. moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +328 -0
  205. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +320 -0
  206. moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +718 -0
  207. moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +464 -0
  208. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +323 -0
  209. moai_adk/templates/.claude/skills/moai-domain-database/examples.md +830 -0
  210. moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
  211. moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
  212. moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
  213. moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
  214. moai_adk/templates/.claude/skills/moai-domain-database/reference.md +545 -0
  215. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +497 -0
  216. moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +968 -0
  217. moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +664 -0
  218. moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +455 -0
  219. moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
  220. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
  221. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
  222. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
  223. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
  224. moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
  225. moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +492 -0
  226. moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -0
  227. moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
  228. moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
  229. moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
  230. moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
  231. moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
  232. moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
  233. moai_adk/templates/.claude/skills/moai-formats-data/reference.md +585 -0
  234. moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +202 -0
  235. moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -0
  236. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
  237. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
  238. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
  239. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
  240. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
  241. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
  242. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
  243. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
  244. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
  245. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
  246. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
  247. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
  248. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
  249. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
  250. moai_adk/templates/.claude/skills/moai-foundation-claude/reference.md +209 -0
  251. moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +441 -0
  252. moai_adk/templates/.claude/skills/moai-foundation-context/examples.md +1048 -0
  253. moai_adk/templates/.claude/skills/moai-foundation-context/reference.md +246 -0
  254. moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +420 -0
  255. moai_adk/templates/.claude/skills/moai-foundation-core/examples.md +358 -0
  256. moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
  257. moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +359 -0
  258. moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
  259. moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
  260. moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
  261. moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
  262. moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
  263. moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
  264. moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
  265. moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
  266. moai_adk/templates/.claude/skills/moai-foundation-core/reference.md +478 -0
  267. moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +315 -0
  268. moai_adk/templates/.claude/skills/moai-foundation-philosopher/examples.md +228 -0
  269. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/assumption-matrix.md +80 -0
  270. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/cognitive-bias.md +199 -0
  271. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/first-principles.md +140 -0
  272. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/trade-off-analysis.md +154 -0
  273. moai_adk/templates/.claude/skills/moai-foundation-philosopher/reference.md +157 -0
  274. moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +364 -0
  275. moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
  276. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
  277. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
  278. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
  279. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
  280. moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
  281. moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
  282. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
  283. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
  284. moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +649 -0
  285. moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +478 -0
  286. moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +612 -0
  287. moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +477 -0
  288. moai_adk/templates/.claude/skills/moai-lang-flutter/examples.md +1090 -0
  289. moai_adk/templates/.claude/skills/moai-lang-flutter/reference.md +686 -0
  290. moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +376 -0
  291. moai_adk/templates/.claude/skills/moai-lang-go/examples.md +919 -0
  292. moai_adk/templates/.claude/skills/moai-lang-go/reference.md +737 -0
  293. moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +385 -0
  294. moai_adk/templates/.claude/skills/moai-lang-java/examples.md +864 -0
  295. moai_adk/templates/.claude/skills/moai-lang-java/reference.md +291 -0
  296. moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +382 -0
  297. moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +1006 -0
  298. moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +562 -0
  299. moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +644 -0
  300. moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +481 -0
  301. moai_adk/templates/.claude/skills/moai-lang-python/examples.md +977 -0
  302. moai_adk/templates/.claude/skills/moai-lang-python/reference.md +804 -0
  303. moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +579 -0
  304. moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +687 -0
  305. moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +372 -0
  306. moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +659 -0
  307. moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +504 -0
  308. moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +497 -0
  309. moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +633 -0
  310. moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +423 -0
  311. moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +497 -0
  312. moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +918 -0
  313. moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +672 -0
  314. moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +368 -0
  315. moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +1089 -0
  316. moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +731 -0
  317. moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +300 -0
  318. moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
  319. moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
  320. moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
  321. moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
  322. moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +319 -0
  323. moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
  324. moai_adk/templates/.claude/skills/moai-library-nextra/examples.md +592 -0
  325. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
  326. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
  327. moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
  328. moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
  329. moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
  330. moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
  331. moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
  332. moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
  333. moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
  334. moai_adk/templates/.claude/skills/moai-library-nextra/reference.md +379 -0
  335. moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +372 -0
  336. moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
  337. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
  338. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
  339. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
  340. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
  341. moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
  342. moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +402 -0
  343. moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +607 -0
  344. moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +300 -0
  345. moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +537 -0
  346. moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +291 -0
  347. moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +390 -0
  348. moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +398 -0
  349. moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +379 -0
  350. moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +358 -0
  351. moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +467 -0
  352. moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +377 -0
  353. moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +466 -0
  354. moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +482 -0
  355. moai_adk/templates/.claude/skills/moai-plugin-builder/SKILL.md +474 -0
  356. moai_adk/templates/.claude/skills/moai-plugin-builder/examples.md +621 -0
  357. moai_adk/templates/.claude/skills/moai-plugin-builder/migration.md +341 -0
  358. moai_adk/templates/.claude/skills/moai-plugin-builder/reference.md +463 -0
  359. moai_adk/templates/.claude/skills/moai-plugin-builder/validation.md +373 -0
  360. moai_adk/templates/.claude/skills/moai-security-auth0/SKILL.md +275 -0
  361. moai_adk/templates/.claude/skills/moai-security-auth0/modules/adaptive-mfa.md +233 -0
  362. moai_adk/templates/.claude/skills/moai-security-auth0/modules/akamai-integration.md +215 -0
  363. moai_adk/templates/.claude/skills/moai-security-auth0/modules/application-credentials.md +280 -0
  364. moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-log-events.md +225 -0
  365. moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-overview.md +140 -0
  366. moai_adk/templates/.claude/skills/moai-security-auth0/modules/bot-detection.md +144 -0
  367. moai_adk/templates/.claude/skills/moai-security-auth0/modules/breached-password-detection.md +187 -0
  368. moai_adk/templates/.claude/skills/moai-security-auth0/modules/brute-force-protection.md +189 -0
  369. moai_adk/templates/.claude/skills/moai-security-auth0/modules/certifications.md +282 -0
  370. moai_adk/templates/.claude/skills/moai-security-auth0/modules/compliance-overview.md +263 -0
  371. moai_adk/templates/.claude/skills/moai-security-auth0/modules/continuous-session-protection.md +307 -0
  372. moai_adk/templates/.claude/skills/moai-security-auth0/modules/customize-mfa.md +178 -0
  373. moai_adk/templates/.claude/skills/moai-security-auth0/modules/dpop-implementation.md +283 -0
  374. moai_adk/templates/.claude/skills/moai-security-auth0/modules/fapi-implementation.md +259 -0
  375. moai_adk/templates/.claude/skills/moai-security-auth0/modules/gdpr-compliance.md +313 -0
  376. moai_adk/templates/.claude/skills/moai-security-auth0/modules/guardian-configuration.md +269 -0
  377. moai_adk/templates/.claude/skills/moai-security-auth0/modules/highly-regulated-identity.md +272 -0
  378. moai_adk/templates/.claude/skills/moai-security-auth0/modules/jwt-fundamentals.md +248 -0
  379. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mdl-verification.md +211 -0
  380. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-api-management.md +278 -0
  381. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-factors.md +226 -0
  382. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-overview.md +174 -0
  383. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mtls-sender-constraining.md +316 -0
  384. moai_adk/templates/.claude/skills/moai-security-auth0/modules/ropg-flow-mfa.md +217 -0
  385. moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-center.md +325 -0
  386. moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-guidance.md +277 -0
  387. moai_adk/templates/.claude/skills/moai-security-auth0/modules/state-parameters.md +178 -0
  388. moai_adk/templates/.claude/skills/moai-security-auth0/modules/step-up-authentication.md +251 -0
  389. moai_adk/templates/.claude/skills/moai-security-auth0/modules/suspicious-ip-throttling.md +240 -0
  390. moai_adk/templates/.claude/skills/moai-security-auth0/modules/tenant-access-control.md +180 -0
  391. moai_adk/templates/.claude/skills/moai-security-auth0/modules/webauthn-fido.md +235 -0
  392. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +449 -0
  393. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
  394. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
  395. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
  396. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/reference.md +307 -0
  397. moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
  398. moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +390 -0
  399. moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
  400. moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
  401. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
  402. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
  403. moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
  404. moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +175 -0
  405. moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
  406. moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -0
  407. moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
  408. moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
  409. moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
  410. moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
  411. moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
  412. moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
  413. moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
  414. moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
  415. moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
  416. moai_adk/templates/.claude/skills/moai-workflow-project/reference.md +275 -0
  417. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
  418. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1434 -0
  419. moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
  420. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
  421. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
  422. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +92 -0
  423. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
  424. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
  425. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
  426. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
  427. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
  428. moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
  429. moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +534 -0
  430. moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
  431. moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
  432. moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +377 -0
  433. moai_adk/templates/.claude/skills/moai-workflow-templates/examples.md +552 -0
  434. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
  435. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
  436. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
  437. moai_adk/templates/.claude/skills/moai-workflow-templates/reference.md +346 -0
  438. moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
  439. moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +456 -0
  440. moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
  441. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
  442. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
  443. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
  444. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
  445. moai_adk/templates/.claude/skills/moai-workflow-testing/examples.md +672 -0
  446. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
  447. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
  448. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
  449. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
  450. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
  451. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
  452. moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
  453. moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
  454. moai_adk/templates/.claude/skills/moai-workflow-testing/reference.md +440 -0
  455. moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
  456. moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
  457. moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
  458. moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +411 -0
  459. moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
  460. moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
  461. moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
  462. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
  463. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
  464. moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
  465. moai_adk/templates/.git-hooks/pre-commit +128 -0
  466. moai_adk/templates/.git-hooks/pre-push +365 -0
  467. moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
  468. moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
  469. moai_adk/templates/.github/workflows/spec-issue-sync.yml +337 -0
  470. moai_adk/templates/.gitignore +222 -0
  471. moai_adk/templates/.mcp.json +13 -0
  472. moai_adk/templates/.moai/config/config.yaml +58 -0
  473. moai_adk/templates/.moai/config/questions/_schema.yaml +174 -0
  474. moai_adk/templates/.moai/config/questions/tab0-init.yaml +251 -0
  475. moai_adk/templates/.moai/config/questions/tab1-user.yaml +107 -0
  476. moai_adk/templates/.moai/config/questions/tab2-project.yaml +79 -0
  477. moai_adk/templates/.moai/config/questions/tab3-git.yaml +632 -0
  478. moai_adk/templates/.moai/config/questions/tab4-quality.yaml +182 -0
  479. moai_adk/templates/.moai/config/questions/tab5-system.yaml +96 -0
  480. moai_adk/templates/.moai/config/sections/git-strategy.yaml +116 -0
  481. moai_adk/templates/.moai/config/sections/language.yaml +11 -0
  482. moai_adk/templates/.moai/config/sections/project.yaml +13 -0
  483. moai_adk/templates/.moai/config/sections/quality.yaml +17 -0
  484. moai_adk/templates/.moai/config/sections/system.yaml +24 -0
  485. moai_adk/templates/.moai/config/sections/user.yaml +5 -0
  486. moai_adk/templates/.moai/config/statusline-config.yaml +92 -0
  487. moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
  488. moai_adk/templates/CLAUDE.md +642 -0
  489. moai_adk/utils/__init__.py +30 -0
  490. moai_adk/utils/banner.py +38 -0
  491. moai_adk/utils/common.py +294 -0
  492. moai_adk/utils/link_validator.py +241 -0
  493. moai_adk/utils/logger.py +147 -0
  494. moai_adk/utils/safe_file_reader.py +206 -0
  495. moai_adk/utils/timeout.py +160 -0
  496. moai_adk/utils/toon_utils.py +256 -0
  497. moai_adk/version.py +22 -0
  498. moai_adk-0.35.1.dist-info/METADATA +3018 -0
  499. moai_adk-0.35.1.dist-info/RECORD +502 -0
  500. moai_adk-0.35.1.dist-info/WHEEL +4 -0
  501. moai_adk-0.35.1.dist-info/entry_points.txt +3 -0
  502. moai_adk-0.35.1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,383 @@
1
+ """
2
+ Alfred to Moai folder structure migration for MoAI-ADK
3
+
4
+ Handles automatic migration from legacy alfred/ folders to new moai/ structure.
5
+ - Creates backup before migration
6
+ - Installs fresh moai/ templates from package
7
+ - Deletes alfred/ folders
8
+ - Updates settings.json Hook paths
9
+ - Records migration status in config.json
10
+ - Provides automatic rollback on failure
11
+ """
12
+
13
+ import json
14
+ import logging
15
+ import shutil
16
+ from datetime import datetime
17
+ from pathlib import Path
18
+ from typing import Optional
19
+
20
+ from .backup_manager import BackupManager
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+
25
+ class AlfredToMoaiMigrator:
26
+ """Handles automatic migration from Alfred to Moai folder structure"""
27
+
28
+ def __init__(self, project_root: Path):
29
+ """
30
+ Initialize Alfred to Moai migrator
31
+
32
+ Args:
33
+ project_root: Root directory of the project
34
+ """
35
+ self.project_root = Path(project_root)
36
+ self.claude_root = self.project_root / ".claude"
37
+ self.config_path = self.project_root / ".moai" / "config" / "config.json"
38
+ self.settings_path = self.claude_root / "settings.json"
39
+ self.backup_manager = BackupManager(project_root)
40
+
41
+ # Define folder paths
42
+ self.alfred_folders = {
43
+ "commands": self.claude_root / "commands" / "alfred",
44
+ "agents": self.claude_root / "agents" / "alfred",
45
+ "hooks": self.claude_root / "hooks" / "alfred",
46
+ }
47
+
48
+ self.moai_folders = {
49
+ "commands": self.claude_root / "commands" / "moai",
50
+ "agents": self.claude_root / "agents" / "moai",
51
+ "hooks": self.claude_root / "hooks" / "moai",
52
+ }
53
+
54
+ def _load_config(self) -> dict:
55
+ """
56
+ Load config.json
57
+
58
+ Returns:
59
+ Dictionary from config.json, or empty dict if not found
60
+ """
61
+ if not self.config_path.exists():
62
+ return {}
63
+
64
+ try:
65
+ return json.loads(self.config_path.read_text(encoding="utf-8"))
66
+ except Exception as e:
67
+ logger.warning(f"Failed to load config.json: {e}")
68
+ return {}
69
+
70
+ def _save_config(self, config: dict) -> None:
71
+ """
72
+ Save config.json
73
+
74
+ Args:
75
+ config: Configuration dictionary to save
76
+
77
+ Raises:
78
+ Exception: If save fails
79
+ """
80
+ self.config_path.parent.mkdir(parents=True, exist_ok=True)
81
+ self.config_path.write_text(json.dumps(config, indent=2, ensure_ascii=False))
82
+
83
+ def needs_migration(self) -> bool:
84
+ """
85
+ Check if Alfred to Moai migration is needed
86
+
87
+ Returns:
88
+ True if migration is needed, False otherwise
89
+ """
90
+ # Check if already migrated
91
+ try:
92
+ config = self._load_config()
93
+ migration_state = config.get("migration", {}).get("alfred_to_moai", {})
94
+ if migration_state.get("migrated"):
95
+ logger.info("ℹ️ Alfred → Moai migration already completed")
96
+ if migration_state.get("timestamp"):
97
+ logger.info(f"Timestamp: {migration_state['timestamp']}")
98
+ return False
99
+ except Exception as e:
100
+ logger.debug(f"Config check error: {e}")
101
+
102
+ # Check if any alfred folder exists
103
+ has_alfred = any(folder.exists() for folder in self.alfred_folders.values())
104
+
105
+ if has_alfred:
106
+ detected = [name for name, folder in self.alfred_folders.items() if folder.exists()]
107
+ logger.debug(f"Alfred folders detected: {', '.join(detected)}")
108
+
109
+ return has_alfred
110
+
111
+ def execute_migration(self, backup_path: Optional[Path] = None) -> bool:
112
+ """
113
+ Execute Alfred to Moai migration
114
+
115
+ Args:
116
+ backup_path: Path to use for backup (if None, creates new backup)
117
+
118
+ Returns:
119
+ True if migration successful, False otherwise
120
+ """
121
+ try:
122
+ logger.info("\n[1/5] Backing up project...")
123
+
124
+ # Step 1: Create or use existing backup
125
+ if backup_path is None:
126
+ try:
127
+ backup_path = self.backup_manager.create_backup("alfred_to_moai_migration")
128
+ logger.info(f"✅ Backup completed: {backup_path}")
129
+ except Exception as e:
130
+ logger.error("❌ Error: Backup failed")
131
+ logger.error(f"Cause: {str(e)}")
132
+ return False
133
+ else:
134
+ logger.info(f"✅ Using existing backup: {backup_path}")
135
+
136
+ # Step 2: Detect alfred folders
137
+ logger.info("\n[2/5] Alfred folders detected:")
138
+ alfred_detected = {name: folder for name, folder in self.alfred_folders.items() if folder.exists()}
139
+
140
+ if not alfred_detected:
141
+ logger.warning("No Alfred folders found - skipping migration")
142
+ return True
143
+
144
+ logger.info(", ".join(alfred_detected.keys()))
145
+
146
+ # Step 3: Verify moai folders exist (should be created in Phase 1)
147
+ logger.info("\n[3/5] Verifying Moai template installation...")
148
+ missing_moai = [name for name, folder in self.moai_folders.items() if not folder.exists()]
149
+
150
+ if missing_moai:
151
+ logger.error(f"❌ Missing Moai folders: {', '.join(missing_moai)}")
152
+ logger.error("Phase 1 implementation required first (package template moai structure)")
153
+ self._rollback_migration(backup_path)
154
+ return False
155
+
156
+ logger.info("✅ Moai templates installed")
157
+
158
+ # Step 4: Update settings.json hooks
159
+ logger.info("\n[4/5] Updating paths...")
160
+ try:
161
+ self._update_settings_json_hooks()
162
+ logger.info("✅ settings.json Hook paths updated")
163
+ except Exception as e:
164
+ logger.error("❌ Error: Failed to update settings.json")
165
+ logger.error(f"Cause: {str(e)}")
166
+ self._rollback_migration(backup_path)
167
+ return False
168
+
169
+ # Step 5: Delete alfred folders
170
+ logger.info("\n[5/5] Cleaning up...")
171
+ try:
172
+ self._delete_alfred_folders(alfred_detected)
173
+ logger.info("✅ Alfred folders deleted")
174
+ except Exception as e:
175
+ logger.error("❌ Error: Failed to delete Alfred folders")
176
+ logger.error(f"Cause: {str(e)}")
177
+ self._rollback_migration(backup_path)
178
+ return False
179
+
180
+ # Step 6: Verify migration
181
+ logger.info("\n[6/6] Verifying migration...")
182
+ if not self._verify_migration():
183
+ logger.error("❌ Migration verification failed")
184
+ self._rollback_migration(backup_path)
185
+ return False
186
+
187
+ logger.info("✅ Migration verification passed")
188
+
189
+ # Step 7: Record migration status
190
+ logger.info("\nRecording migration status...")
191
+ try:
192
+ self._record_migration_state(backup_path, len(alfred_detected))
193
+ logger.info("✅ Migration status recorded")
194
+ except Exception as e:
195
+ logger.warning(f"⚠️ Failed to record status: {str(e)}")
196
+ # Don't rollback for this, migration was successful
197
+
198
+ logger.info("\n✅ Alfred → Moai migration completed!")
199
+ return True
200
+
201
+ except Exception as e:
202
+ logger.error(f"\n❌ Unexpected error: {str(e)}")
203
+ if backup_path:
204
+ self._rollback_migration(backup_path)
205
+ return False
206
+
207
+ def _delete_alfred_folders(self, alfred_detected: dict) -> None:
208
+ """
209
+ Delete Alfred folders
210
+
211
+ Args:
212
+ alfred_detected: Dictionary of detected alfred folders
213
+
214
+ Raises:
215
+ Exception: If deletion fails
216
+ """
217
+ for name, folder in alfred_detected.items():
218
+ if folder.exists():
219
+ try:
220
+ shutil.rmtree(folder)
221
+ logger.debug(f"Deleted: {folder}")
222
+ except Exception as e:
223
+ raise Exception(f"Failed to delete {name} folder: {str(e)}")
224
+
225
+ def _update_settings_json_hooks(self) -> None:
226
+ """
227
+ Update settings.json to replace alfred paths with moai paths
228
+
229
+ Raises:
230
+ Exception: If update fails
231
+ """
232
+ if not self.settings_path.exists():
233
+ logger.warning(f"settings.json file missing: {self.settings_path}")
234
+ return
235
+
236
+ try:
237
+ # Read settings.json
238
+ with open(self.settings_path, "r", encoding="utf-8") as f:
239
+ settings_content = f.read()
240
+
241
+ # Replace all alfred references with moai
242
+ # Pattern: .claude/hooks/alfred/ → .claude/hooks/moai/
243
+ updated_content = settings_content.replace(".claude/hooks/alfred/", ".claude/hooks/moai/")
244
+ updated_content = updated_content.replace(".claude/commands/alfred/", ".claude/commands/moai/")
245
+ updated_content = updated_content.replace(".claude/agents/alfred/", ".claude/agents/moai/")
246
+
247
+ # Write back to file
248
+ with open(self.settings_path, "w", encoding="utf-8") as f:
249
+ f.write(updated_content)
250
+
251
+ # Verify JSON validity
252
+ with open(self.settings_path, "r", encoding="utf-8") as f:
253
+ json.load(f) # This will raise if JSON is invalid
254
+
255
+ logger.debug("settings.json update and verification completed")
256
+
257
+ except json.JSONDecodeError as e:
258
+ raise Exception(f"settings.json JSON format error: {str(e)}")
259
+ except Exception as e:
260
+ raise Exception(f"Failed to update settings.json: {str(e)}")
261
+
262
+ def _verify_migration(self) -> bool:
263
+ """
264
+ Verify migration was successful
265
+
266
+ Returns:
267
+ True if migration is valid, False otherwise
268
+ """
269
+ # Check moai folders exist
270
+ for name, folder in self.moai_folders.items():
271
+ if not folder.exists():
272
+ logger.error(f"❌ Missing Moai {name} folder: {folder}")
273
+ return False
274
+
275
+ # Check alfred folders are deleted
276
+ for name, folder in self.alfred_folders.items():
277
+ if folder.exists():
278
+ logger.warning(f"⚠️ Alfred {name} folder still exists: {folder}")
279
+ return False
280
+
281
+ # Check settings.json hooks paths (ignore pattern matching strings like "Bash(alfred:*)")
282
+ if self.settings_path.exists():
283
+ try:
284
+ with open(self.settings_path, "r", encoding="utf-8") as f:
285
+ settings_content = f.read()
286
+
287
+ # Only check for hooks/alfred paths, not pattern strings
288
+ if (
289
+ ".claude/hooks/alfred/" in settings_content
290
+ or ".claude/commands/alfred/" in settings_content
291
+ or ".claude/agents/alfred/" in settings_content
292
+ ):
293
+ logger.error("❌ settings.json still contains alfred hook paths")
294
+ return False
295
+
296
+ if "moai" not in settings_content.lower():
297
+ logger.warning("⚠️ No moai references in settings.json")
298
+
299
+ except Exception as e:
300
+ logger.error(f"❌ settings.json verification failed: {str(e)}")
301
+ return False
302
+
303
+ logger.debug("Migration verification completed")
304
+ return True
305
+
306
+ def _record_migration_state(self, backup_path: Path, folders_count: int) -> None:
307
+ """
308
+ Record migration state in config.json
309
+
310
+ Args:
311
+ backup_path: Path to the backup
312
+ folders_count: Number of folders migrated
313
+
314
+ Raises:
315
+ Exception: If recording fails
316
+ """
317
+ try:
318
+ config = self._load_config()
319
+
320
+ # Initialize migration section if not exists
321
+ if "migration" not in config:
322
+ config["migration"] = {}
323
+
324
+ config["migration"]["alfred_to_moai"] = {
325
+ "migrated": True,
326
+ "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
327
+ "folders_installed": 3, # commands, agents, hooks
328
+ "folders_removed": folders_count,
329
+ "backup_path": str(backup_path),
330
+ "package_version": self._get_package_version(),
331
+ }
332
+
333
+ self._save_config(config)
334
+ logger.debug("Migration state recorded in config.json")
335
+
336
+ except Exception as e:
337
+ raise Exception(f"Migration state recording failed: {str(e)}")
338
+
339
+ def _rollback_migration(self, backup_path: Path) -> None:
340
+ """
341
+ Rollback migration from backup
342
+
343
+ Args:
344
+ backup_path: Path to the backup to restore from
345
+ """
346
+ try:
347
+ logger.info("\n🔄 Starting automatic rollback...")
348
+ logger.info("[1/3] Restoring project...")
349
+
350
+ # Restore from backup
351
+ self.backup_manager.restore_backup(backup_path)
352
+
353
+ logger.info("✅ Project restored")
354
+ logger.info("[2/3] Resetting migration state...")
355
+
356
+ # Clear migration state in config
357
+ try:
358
+ config = self._load_config()
359
+ if "migration" in config and "alfred_to_moai" in config["migration"]:
360
+ del config["migration"]["alfred_to_moai"]
361
+ self._save_config(config)
362
+ except Exception as e:
363
+ logger.warning(f"⚠️ Failed to reset state: {str(e)}")
364
+
365
+ logger.info("✅ Rollback completed")
366
+ logger.info("💡 Tip: Run `moai-adk update` again after resolving the error")
367
+
368
+ except Exception as e:
369
+ logger.error(f"\n❌ Rollback failed: {str(e)}")
370
+ logger.error(f"⚠️ Manual recovery required: Please restore manually from backup: {backup_path}")
371
+
372
+ def _get_package_version(self) -> str:
373
+ """
374
+ Get current package version
375
+
376
+ Returns:
377
+ Version string
378
+ """
379
+ try:
380
+ config = self._load_config()
381
+ return config.get("moai", {}).get("version", "unknown")
382
+ except Exception:
383
+ return "unknown"
@@ -0,0 +1,277 @@
1
+ """
2
+ Backup management module for MoAI-ADK migrations
3
+
4
+ Creates and manages backups during migration processes
5
+ to ensure data safety and enable rollback.
6
+ """
7
+
8
+ import json
9
+ import logging
10
+ import shutil
11
+ from datetime import datetime
12
+ from pathlib import Path
13
+ from typing import Any, Dict, List, Optional
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ class BackupManager:
19
+ """Manages backup creation and restoration for migrations"""
20
+
21
+ def __init__(self, project_root: Path):
22
+ """
23
+ Initialize backup manager
24
+
25
+ Args:
26
+ project_root: Root directory of the project
27
+ """
28
+ self.project_root = Path(project_root)
29
+ self.backup_base_dir = self.project_root / ".moai" / "backups"
30
+ self.backup_base_dir.mkdir(parents=True, exist_ok=True)
31
+
32
+ def create_backup(self, description: str = "migration") -> Path:
33
+ """
34
+ Create a full backup of configuration files
35
+
36
+ Args:
37
+ description: Description of this backup
38
+
39
+ Returns:
40
+ Path to the backup directory
41
+ """
42
+ # Create timestamped backup directory
43
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
44
+ backup_dir = self.backup_base_dir / f"{description}_{timestamp}"
45
+ backup_dir.mkdir(parents=True, exist_ok=True)
46
+
47
+ logger.info(f"Creating backup at {backup_dir}")
48
+
49
+ # Files to backup
50
+ backup_targets = [
51
+ self.project_root / ".moai" / "config.json",
52
+ self.project_root / ".moai" / "config" / "config.json",
53
+ self.project_root / ".claude" / "statusline-config.yaml",
54
+ self.project_root / ".moai" / "config" / "statusline-config.yaml",
55
+ ]
56
+
57
+ backed_up_files = []
58
+
59
+ for target in backup_targets:
60
+ if target.exists():
61
+ # Preserve relative path structure in backup
62
+ rel_path = target.relative_to(self.project_root)
63
+ backup_path = backup_dir / rel_path
64
+
65
+ # Create parent directories
66
+ backup_path.parent.mkdir(parents=True, exist_ok=True)
67
+
68
+ # Copy file
69
+ shutil.copy2(target, backup_path)
70
+ backed_up_files.append(str(rel_path))
71
+ logger.debug(f"Backed up: {rel_path}")
72
+
73
+ # Save backup metadata
74
+ metadata = {
75
+ "timestamp": timestamp,
76
+ "description": description,
77
+ "backed_up_files": backed_up_files,
78
+ "project_root": str(self.project_root),
79
+ }
80
+
81
+ metadata_path = backup_dir / "backup_metadata.json"
82
+ with open(metadata_path, "w", encoding="utf-8") as f:
83
+ json.dump(metadata, f, indent=2, ensure_ascii=False)
84
+
85
+ logger.info(f"✅ Backup created successfully: {backup_dir}")
86
+ return backup_dir
87
+
88
+ def list_backups(self) -> List[Dict[str, str]]:
89
+ """
90
+ List all available backups
91
+
92
+ Returns:
93
+ List of backup information dictionaries
94
+ """
95
+ backups: List[Dict[str, Any]] = []
96
+
97
+ if not self.backup_base_dir.exists():
98
+ return backups
99
+
100
+ for backup_dir in sorted(self.backup_base_dir.iterdir(), reverse=True):
101
+ if backup_dir.is_dir():
102
+ metadata_path = backup_dir / "backup_metadata.json"
103
+ if metadata_path.exists():
104
+ try:
105
+ with open(metadata_path, "r", encoding="utf-8") as f:
106
+ metadata = json.load(f)
107
+ backups.append(
108
+ {
109
+ "path": str(backup_dir),
110
+ "timestamp": metadata.get("timestamp", "unknown"),
111
+ "description": metadata.get("description", "unknown"),
112
+ "files": len(metadata.get("backed_up_files", [])),
113
+ }
114
+ )
115
+ except Exception as e:
116
+ logger.warning(f"Failed to read backup metadata: {e}")
117
+
118
+ return backups
119
+
120
+ def restore_backup(self, backup_path: Path) -> bool:
121
+ """
122
+ Restore files from a backup
123
+
124
+ Args:
125
+ backup_path: Path to the backup directory
126
+
127
+ Returns:
128
+ True if restore was successful, False otherwise
129
+ """
130
+ backup_path = Path(backup_path)
131
+
132
+ if not backup_path.exists():
133
+ logger.error(f"Backup directory not found: {backup_path}")
134
+ return False
135
+
136
+ metadata_path = backup_path / "backup_metadata.json"
137
+ if not metadata_path.exists():
138
+ logger.error(f"Backup metadata not found: {metadata_path}")
139
+ return False
140
+
141
+ try:
142
+ # Read metadata
143
+ with open(metadata_path, "r", encoding="utf-8") as f:
144
+ metadata = json.load(f)
145
+
146
+ logger.info(f"Restoring backup from {backup_path}")
147
+
148
+ # Restore each file
149
+ for rel_path in metadata.get("backed_up_files", []):
150
+ backup_file = backup_path / rel_path
151
+ target_file = self.project_root / rel_path
152
+
153
+ if backup_file.exists():
154
+ # Create parent directories
155
+ target_file.parent.mkdir(parents=True, exist_ok=True)
156
+
157
+ # Restore file
158
+ shutil.copy2(backup_file, target_file)
159
+ logger.debug(f"Restored: {rel_path}")
160
+
161
+ logger.info("✅ Backup restored successfully")
162
+ return True
163
+
164
+ except Exception as e:
165
+ logger.error(f"Failed to restore backup: {e}")
166
+ return False
167
+
168
+ def cleanup_old_backups(self, keep_count: int = 5) -> int:
169
+ """
170
+ Clean up old backups, keeping only the most recent ones
171
+
172
+ Args:
173
+ keep_count: Number of recent backups to keep
174
+
175
+ Returns:
176
+ Number of backups deleted
177
+ """
178
+ backups = self.list_backups()
179
+
180
+ if len(backups) <= keep_count:
181
+ return 0
182
+
183
+ deleted_count = 0
184
+ for backup_info in backups[keep_count:]:
185
+ backup_path = Path(backup_info["path"])
186
+ try:
187
+ shutil.rmtree(backup_path)
188
+ deleted_count += 1
189
+ logger.debug(f"Deleted old backup: {backup_path}")
190
+ except Exception as e:
191
+ logger.warning(f"Failed to delete backup {backup_path}: {e}")
192
+
193
+ logger.info(f"Cleaned up {deleted_count} old backups")
194
+ return deleted_count
195
+
196
+ def get_latest_backup(self) -> Optional[Path]:
197
+ """
198
+ Get the most recent backup
199
+
200
+ Returns:
201
+ Path to the latest backup directory, or None if no backups exist
202
+ """
203
+ backups = self.list_backups()
204
+ if backups:
205
+ return Path(backups[0]["path"])
206
+ return None
207
+
208
+ def create_full_project_backup(self, description: str = "pre-update-backup") -> Path:
209
+ """
210
+ Create a complete backup of entire project structure before update
211
+
212
+ Backs up:
213
+ - .claude/ (entire directory)
214
+ - .moai/ (entire directory)
215
+ - CLAUDE.md (file)
216
+
217
+ Args:
218
+ description: Description of this backup (default: "pre-update-backup")
219
+
220
+ Returns:
221
+ Path to the backup directory
222
+ """
223
+ # Create timestamped backup directory
224
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
225
+ backup_dir = self.project_root / ".moai-backups" / f"{description}_{timestamp}"
226
+ backup_dir.mkdir(parents=True, exist_ok=True)
227
+
228
+ logger.info(f"Creating full project backup at {backup_dir}")
229
+
230
+ # Directories and files to backup
231
+ backup_targets = [
232
+ (self.project_root / ".claude", True), # (path, is_directory)
233
+ (self.project_root / ".moai", True),
234
+ (self.project_root / "CLAUDE.md", False),
235
+ ]
236
+
237
+ backed_up_items = []
238
+
239
+ for target_path, is_dir in backup_targets:
240
+ if not target_path.exists():
241
+ continue
242
+
243
+ try:
244
+ rel_path = target_path.relative_to(self.project_root)
245
+ backup_path = backup_dir / rel_path
246
+
247
+ if is_dir:
248
+ # Backup directory
249
+ shutil.copytree(target_path, backup_path, dirs_exist_ok=True)
250
+ backed_up_items.append(str(rel_path))
251
+ logger.debug(f"Backed up directory: {rel_path}")
252
+ else:
253
+ # Backup file
254
+ backup_path.parent.mkdir(parents=True, exist_ok=True)
255
+ shutil.copy2(target_path, backup_path)
256
+ backed_up_items.append(str(rel_path))
257
+ logger.debug(f"Backed up file: {rel_path}")
258
+
259
+ except Exception as e:
260
+ logger.error(f"Failed to backup {target_path}: {e}")
261
+ raise
262
+
263
+ # Save backup metadata
264
+ metadata = {
265
+ "timestamp": timestamp,
266
+ "description": description,
267
+ "backed_up_items": backed_up_items,
268
+ "project_root": str(self.project_root),
269
+ "backup_type": "full_project",
270
+ }
271
+
272
+ metadata_path = backup_dir / "backup_metadata.json"
273
+ with open(metadata_path, "w", encoding="utf-8") as f:
274
+ json.dump(metadata, f, indent=2, ensure_ascii=False)
275
+
276
+ logger.info(f"✅ Full project backup created successfully: {backup_dir}")
277
+ return backup_dir