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
@@ -0,0 +1,608 @@
1
+ """
2
+ MoAI Menu Project - Configuration Migration Manager
3
+
4
+ This module handles migration from legacy configuration formats to the new
5
+ unified configuration system, supporting rollback and history tracking.
6
+ """
7
+
8
+ import json
9
+ import logging
10
+ from dataclasses import dataclass
11
+ from pathlib import Path
12
+ from typing import Any, Dict, List, Optional, Union
13
+
14
+ from .config_manager import UnifiedConfigManager
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+
19
+ @dataclass
20
+ class MigrationStep:
21
+ """Single migration step definition."""
22
+
23
+ from_version: str
24
+ to_version: str
25
+ description: str
26
+ migration_func: str
27
+ rollback_func: Optional[str] = None
28
+
29
+
30
+ @dataclass
31
+ class LegacyConfigInfo:
32
+ """Information about legacy configuration file."""
33
+
34
+ path: Path
35
+ module_name: str
36
+ version: str
37
+ format: str # 'json', 'yaml', 'ini', etc.
38
+ priority: int # Migration priority (lower = higher priority)
39
+
40
+
41
+ class LegacyConfigDetector:
42
+ """Detects and analyzes legacy configuration files."""
43
+
44
+ def __init__(self, search_dirs: List[Path]):
45
+ """
46
+ Initialize detector with search directories.
47
+
48
+ Args:
49
+ search_dirs: List of directories to search for legacy configs
50
+ """
51
+ self.search_dirs = search_dirs
52
+ self.legacy_patterns = {
53
+ "batch_questions": [
54
+ "batch_questions_config.json",
55
+ "batch-config.json",
56
+ ".batch_questions.json",
57
+ ],
58
+ "documentation": [
59
+ "docs_config.json",
60
+ "documentation.json",
61
+ ".docs_config.json",
62
+ ],
63
+ "language_config": [
64
+ "language_settings.json",
65
+ "i18n_config.json",
66
+ ".language_config.json",
67
+ ],
68
+ "template_optimizer": [
69
+ "template_config.json",
70
+ "optimizer_config.json",
71
+ ".template_config.json",
72
+ ],
73
+ "project_initializer": [
74
+ "init_config.json",
75
+ "project_config.json",
76
+ ".init_config.json",
77
+ ],
78
+ }
79
+
80
+ def find_legacy_configs(self) -> List[LegacyConfigInfo]:
81
+ """
82
+ Find all legacy configuration files.
83
+
84
+ Returns:
85
+ List of legacy configuration information
86
+ """
87
+ legacy_configs = []
88
+
89
+ for search_dir in self.search_dirs:
90
+ if not search_dir.exists():
91
+ continue
92
+
93
+ for module_name, patterns in self.legacy_patterns.items():
94
+ for pattern in patterns:
95
+ for file_path in search_dir.glob(f"**/{pattern}"):
96
+ try:
97
+ config_info = self._analyze_config_file(file_path, module_name)
98
+ if config_info:
99
+ legacy_configs.append(config_info)
100
+ except Exception as e:
101
+ logger.warning(f"Failed to analyze {file_path}: {e}")
102
+
103
+ # Sort by priority and path
104
+ legacy_configs.sort(key=lambda x: (x.priority, str(x.path)))
105
+ return legacy_configs
106
+
107
+ def _analyze_config_file(self, file_path: Path, module_name: str) -> Optional[LegacyConfigInfo]:
108
+ """Analyze individual configuration file."""
109
+ if not file_path.is_file():
110
+ return None
111
+
112
+ # Determine format
113
+ suffix = file_path.suffix.lower()
114
+ if suffix == ".json":
115
+ format_type = "json"
116
+ elif suffix in [".yml", ".yaml"]:
117
+ format_type = "yaml"
118
+ elif suffix == ".ini":
119
+ format_type = "ini"
120
+ else:
121
+ format_type = "unknown"
122
+
123
+ # Try to load and analyze
124
+ try:
125
+ with open(file_path, "r", encoding="utf-8") as f:
126
+ if format_type == "json":
127
+ data = json.load(f)
128
+ elif format_type == "yaml":
129
+ try:
130
+ import yaml
131
+
132
+ data = yaml.safe_load(f)
133
+ except ImportError:
134
+ logger.warning(f"PyYAML not available, skipping {file_path}")
135
+ return None
136
+ else:
137
+ return None
138
+
139
+ # Extract version if available
140
+ version = data.get("version", "1.0.0") if isinstance(data, dict) else "1.0.0"
141
+
142
+ # Determine priority based on file location and naming
143
+ priority = self._calculate_priority(file_path, module_name)
144
+
145
+ return LegacyConfigInfo(
146
+ path=file_path,
147
+ module_name=module_name,
148
+ version=version,
149
+ format=format_type,
150
+ priority=priority,
151
+ )
152
+
153
+ except Exception as e:
154
+ logger.warning(f"Failed to load config file {file_path}: {e}")
155
+ return None
156
+
157
+ def _calculate_priority(self, file_path: Path, module_name: str) -> int:
158
+ """Calculate migration priority for config file."""
159
+ priority = 100 # Default priority
160
+
161
+ # Hidden files have higher priority
162
+ if file_path.name.startswith("."):
163
+ priority -= 30
164
+
165
+ # Files in .moai or .claude directories have higher priority
166
+ if ".moai" in str(file_path) or ".claude" in str(file_path):
167
+ priority -= 20
168
+
169
+ # Files with exact module name have higher priority
170
+ if module_name in file_path.name:
171
+ priority -= 10
172
+
173
+ # Files closer to root have higher priority
174
+ depth = len(file_path.relative_to(Path.cwd()).parts)
175
+ priority += depth * 5
176
+
177
+ return priority
178
+
179
+
180
+ class ConfigurationMigrator:
181
+ """
182
+ Handles migration from legacy configurations to unified format.
183
+ """
184
+
185
+ def __init__(self, config_manager: UnifiedConfigManager, dry_run: bool = False):
186
+ """
187
+ Initialize migrator.
188
+
189
+ Args:
190
+ config_manager: Target configuration manager
191
+ dry_run: If True, only show what would be migrated
192
+ """
193
+ self.config_manager = config_manager
194
+ self.dry_run = dry_run
195
+ self.detector = LegacyConfigDetector([Path.cwd()])
196
+
197
+ # Migration steps registry
198
+ self.migration_steps: Dict[str, List[MigrationStep]] = {
199
+ "batch_questions": self._get_batch_questions_migrations(),
200
+ "documentation": self._get_documentation_migrations(),
201
+ "language_config": self._get_language_config_migrations(),
202
+ "template_optimizer": self._get_template_optimizer_migrations(),
203
+ "project_initializer": self._get_project_initializer_migrations(),
204
+ }
205
+
206
+ def detect_and_migrate(self, backup: bool = True) -> Dict[str, Any]:
207
+ """
208
+ Detect legacy configurations and migrate them.
209
+
210
+ Args:
211
+ backup: Whether to create backup before migration
212
+
213
+ Returns:
214
+ Migration result summary
215
+ """
216
+ logger.info("Detecting legacy configurations...")
217
+ legacy_configs = self.detector.find_legacy_configs()
218
+
219
+ if not legacy_configs:
220
+ logger.info("No legacy configurations found")
221
+ return {"migrated": 0, "failed": 0, "skipped": 0, "details": []}
222
+
223
+ logger.info(f"Found {len(legacy_configs)} legacy configuration files")
224
+
225
+ # Group by module
226
+ module_configs = {}
227
+ for config_info in legacy_configs:
228
+ if config_info.module_name not in module_configs:
229
+ module_configs[config_info.module_name] = []
230
+ module_configs[config_info.module_name].append(config_info)
231
+
232
+ # Migrate each module
233
+ results = {"migrated": 0, "failed": 0, "skipped": 0, "details": []}
234
+
235
+ for module_name, configs in module_configs.items():
236
+ try:
237
+ module_result = self._migrate_module(module_name, configs, backup)
238
+ results["details"].append(module_result)
239
+
240
+ if module_result["status"] == "success":
241
+ results["migrated"] += len(configs)
242
+ elif module_result["status"] == "failed":
243
+ results["failed"] += len(configs)
244
+ else:
245
+ results["skipped"] += len(configs)
246
+
247
+ except Exception as e:
248
+ logger.error(f"Failed to migrate module {module_name}: {e}")
249
+ results["failed"] += len(configs)
250
+ results["details"].append(
251
+ {
252
+ "module": module_name,
253
+ "status": "failed",
254
+ "error": str(e),
255
+ "files": [str(c.path) for c in configs],
256
+ }
257
+ )
258
+
259
+ return results
260
+
261
+ def _migrate_module(self, module_name: str, configs: List[LegacyConfigInfo], backup: bool) -> Dict[str, Any]:
262
+ """Migrate configurations for a specific module."""
263
+ logger.info(f"Migrating {len(configs)} configuration files for module {module_name}")
264
+
265
+ # Load existing unified config
266
+ unified_config = self.config_manager.load_config()
267
+
268
+ # Merge legacy configurations
269
+ merged_legacy_config = {}
270
+
271
+ for config_info in configs:
272
+ try:
273
+ legacy_data = self._load_legacy_config(config_info)
274
+
275
+ # Apply transformations based on version
276
+ transformed_data = self._transform_legacy_data(
277
+ legacy_data, config_info.module_name, config_info.version
278
+ )
279
+
280
+ # Merge into unified format
281
+ merged_legacy_config.update(transformed_data)
282
+
283
+ logger.debug(f"Merged {config_info.path}")
284
+
285
+ except Exception as e:
286
+ logger.error(f"Failed to load {config_info.path}: {e}")
287
+ raise
288
+
289
+ if not merged_legacy_config:
290
+ return {
291
+ "module": module_name,
292
+ "status": "skipped",
293
+ "message": "No valid configuration data found",
294
+ "files": [str(c.path) for c in configs],
295
+ }
296
+
297
+ # Create backup if requested
298
+ if backup and not self.dry_run:
299
+ self.config_manager._create_backup()
300
+
301
+ # Update unified configuration
302
+ if module_name in unified_config:
303
+ # Merge with existing configuration
304
+ unified_config[module_name].update(merged_legacy_config)
305
+ else:
306
+ unified_config[module_name] = merged_legacy_config
307
+
308
+ # Save updated configuration
309
+ if not self.dry_run:
310
+ self.config_manager.save_config(unified_config)
311
+ logger.info(f"Successfully migrated {module_name} configuration")
312
+
313
+ return {
314
+ "module": module_name,
315
+ "status": "success",
316
+ "merged_keys": list(merged_legacy_config.keys()),
317
+ "files": [str(c.path) for c in configs],
318
+ "dry_run": self.dry_run,
319
+ }
320
+
321
+ def _load_legacy_config(self, config_info: LegacyConfigInfo) -> Dict[str, Any]:
322
+ """Load legacy configuration file."""
323
+ try:
324
+ with open(config_info.path, "r", encoding="utf-8") as f:
325
+ if config_info.format == "json":
326
+ return json.load(f)
327
+ elif config_info.format == "yaml":
328
+ try:
329
+ import yaml
330
+
331
+ return yaml.safe_load(f)
332
+ except ImportError:
333
+ raise ImportError("PyYAML is required for YAML migration")
334
+ else:
335
+ raise ValueError(f"Unsupported format: {config_info.format}")
336
+
337
+ except Exception as e:
338
+ logger.error(f"Failed to load {config_info.path}: {e}")
339
+ raise
340
+
341
+ def _transform_legacy_data(self, data: Dict[str, Any], module_name: str, version: str) -> Dict[str, Any]:
342
+ """Transform legacy data to unified format."""
343
+ if module_name not in self.migration_steps:
344
+ logger.warning(f"No migration steps defined for {module_name}")
345
+ return data
346
+
347
+ # Apply version-specific transformations
348
+ for step in self.migration_steps[module_name]:
349
+ if self._version_matches(version, step.from_version):
350
+ try:
351
+ migration_func = getattr(self, step.migration_func)
352
+ data = migration_func(data)
353
+ logger.debug(f"Applied migration {step.from_version}->{step.to_version} for {module_name}")
354
+ except Exception as e:
355
+ logger.error(f"Failed to apply migration {step.from_version}->{step.to_version}: {e}")
356
+ raise
357
+
358
+ return data
359
+
360
+ def _version_matches(self, current_version: str, target_version: str) -> bool:
361
+ """Check if current version matches target pattern."""
362
+ # Simple version matching - can be enhanced
363
+ return current_version.startswith(target_version.rstrip("x"))
364
+
365
+ def _get_batch_questions_migrations(self) -> List[MigrationStep]:
366
+ """Get migration steps for batch questions module."""
367
+ return [
368
+ MigrationStep(
369
+ from_version="1.0",
370
+ to_version="1.0.0",
371
+ description="Initial format standardization",
372
+ migration_func="_migrate_batch_questions_1_0",
373
+ )
374
+ ]
375
+
376
+ def _get_documentation_migrations(self) -> List[MigrationStep]:
377
+ """Get migration steps for documentation module."""
378
+ return [
379
+ MigrationStep(
380
+ from_version="1.0",
381
+ to_version="1.0.0",
382
+ description="Initial format standardization",
383
+ migration_func="_migrate_documentation_1_0",
384
+ )
385
+ ]
386
+
387
+ def _get_language_config_migrations(self) -> List[MigrationStep]:
388
+ """Get migration steps for language configuration module."""
389
+ return [
390
+ MigrationStep(
391
+ from_version="1.0",
392
+ to_version="1.0.0",
393
+ description="Initial format standardization",
394
+ migration_func="_migrate_language_config_1_0",
395
+ )
396
+ ]
397
+
398
+ def _get_template_optimizer_migrations(self) -> List[MigrationStep]:
399
+ """Get migration steps for template optimizer module."""
400
+ return [
401
+ MigrationStep(
402
+ from_version="1.0",
403
+ to_version="1.0.0",
404
+ description="Initial format standardization",
405
+ migration_func="_migrate_template_optimizer_1_0",
406
+ )
407
+ ]
408
+
409
+ def _get_project_initializer_migrations(self) -> List[MigrationStep]:
410
+ """Get migration steps for project initializer module."""
411
+ return [
412
+ MigrationStep(
413
+ from_version="1.0",
414
+ to_version="1.0.0",
415
+ description="Initial format standardization",
416
+ migration_func="_migrate_project_initializer_1_0",
417
+ )
418
+ ]
419
+
420
+ # Migration functions
421
+ def _migrate_batch_questions_1_0(self, data: Dict[str, Any]) -> Dict[str, Any]:
422
+ """Migrate batch questions from 1.0 format."""
423
+ # Example transformation logic
424
+ if "max_batch_size" in data:
425
+ data["max_questions"] = data.pop("max_batch_size")
426
+
427
+ if "timeout" in data:
428
+ data["timeout_seconds"] = data.pop("timeout")
429
+
430
+ # Ensure default values
431
+ data.setdefault("enabled", True)
432
+ data.setdefault("max_questions", 50)
433
+ data.setdefault("timeout_seconds", 300)
434
+ data.setdefault("retry_attempts", 3)
435
+ data.setdefault("output_format", "json")
436
+
437
+ return data
438
+
439
+ def _migrate_documentation_1_0(self, data: Dict[str, Any]) -> Dict[str, Any]:
440
+ """Migrate documentation from 1.0 format."""
441
+ # Example transformation logic
442
+ if "auto_docs" in data:
443
+ data["auto_generate"] = data.pop("auto_docs")
444
+
445
+ if "doc_format" in data:
446
+ data["format"] = data.pop("doc_format")
447
+
448
+ # Ensure defaults
449
+ data.setdefault("auto_generate", True)
450
+ data.setdefault("format", "markdown")
451
+ data.setdefault("include_api_docs", True)
452
+ data.setdefault("include_examples", True)
453
+ data.setdefault("template_engine", "jinja2")
454
+ data.setdefault("output_directory", "docs")
455
+
456
+ return data
457
+
458
+ def _migrate_language_config_1_0(self, data: Dict[str, Any]) -> Dict[str, Any]:
459
+ """Migrate language configuration from 1.0 format."""
460
+ # Example transformation logic
461
+ if "default_lang" in data:
462
+ data["default_language"] = data.pop("default_lang")
463
+
464
+ if "supported_langs" in data:
465
+ data["supported_languages"] = data.pop("supported_langs")
466
+
467
+ # Ensure defaults
468
+ data.setdefault("default_language", "en")
469
+ data.setdefault("supported_languages", ["en"])
470
+ data.setdefault("auto_detect", True)
471
+ data.setdefault("fallback_language", "en")
472
+
473
+ return data
474
+
475
+ def _migrate_template_optimizer_1_0(self, data: Dict[str, Any]) -> Dict[str, Any]:
476
+ """Migrate template optimizer from 1.0 format."""
477
+ # Example transformation logic
478
+ if "optimize_level" in data:
479
+ data["optimization_level"] = data.pop("optimize_level")
480
+
481
+ # Ensure defaults
482
+ data.setdefault("enabled", True)
483
+ data.setdefault("optimization_level", "basic")
484
+ data.setdefault("minification", False)
485
+
486
+ return data
487
+
488
+ def _migrate_project_initializer_1_0(self, data: Dict[str, Any]) -> Dict[str, Any]:
489
+ """Migrate project initializer from 1.0 format."""
490
+ # Example transformation logic
491
+ if "auto_install" in data:
492
+ data["auto_dependencies"] = data.pop("auto_install")
493
+
494
+ # Ensure defaults
495
+ data.setdefault("auto_dependencies", True)
496
+ data.setdefault("git_init", True)
497
+ data.setdefault("create_virtual_env", True)
498
+
499
+ return data
500
+
501
+ def rollback_migration(self, target_timestamp: Optional[str] = None) -> bool:
502
+ """
503
+ Rollback migration to specific timestamp or latest backup.
504
+
505
+ Args:
506
+ target_timestamp: Target timestamp for rollback (optional)
507
+
508
+ Returns:
509
+ True if rollback successful, False otherwise
510
+ """
511
+ try:
512
+ backups = self.config_manager.list_backups()
513
+
514
+ if not backups:
515
+ logger.error("No backups available for rollback")
516
+ return False
517
+
518
+ # Find target backup
519
+ if target_timestamp:
520
+ target_backup = None
521
+ for backup in backups:
522
+ if target_timestamp in backup:
523
+ target_backup = backup
524
+ break
525
+
526
+ if not target_backup:
527
+ logger.error(f"Backup with timestamp {target_timestamp} not found")
528
+ return False
529
+ else:
530
+ target_backup = backups[0] # Use latest backup
531
+
532
+ # Restore backup
533
+ self.config_manager.restore_backup(target_backup)
534
+ logger.info(f"Successfully rolled back to {target_backup}")
535
+ return True
536
+
537
+ except Exception as e:
538
+ logger.error(f"Rollback failed: {e}")
539
+ return False
540
+
541
+ def preview_migration(self) -> Dict[str, Any]:
542
+ """
543
+ Preview what would be migrated without actually doing it.
544
+
545
+ Returns:
546
+ Migration preview information
547
+ """
548
+ # Create temporary migrator in dry-run mode
549
+ preview_migrator = ConfigurationMigrator(self.config_manager, dry_run=True)
550
+
551
+ # Run migration detection
552
+ return preview_migrator.detect_and_migrate(backup=False)
553
+
554
+
555
+ # Utility functions
556
+ def run_migration(config_dir: Union[str, Path], backup: bool = True, dry_run: bool = False) -> Dict[str, Any]:
557
+ """
558
+ Run complete migration process.
559
+
560
+ Args:
561
+ config_dir: Directory containing configuration files
562
+ backup: Whether to create backup before migration
563
+ dry_run: If True, only preview what would be migrated
564
+
565
+ Returns:
566
+ Migration result summary
567
+ """
568
+ config_dir = Path(config_dir)
569
+ config_manager = UnifiedConfigManager(config_dir / "config.json")
570
+ migrator = ConfigurationMigrator(config_manager, dry_run=dry_run)
571
+
572
+ return migrator.detect_and_migrate(backup=backup)
573
+
574
+
575
+ def check_migration_status(config_dir: Union[str, Path]) -> Dict[str, Any]:
576
+ """
577
+ Check migration status for configuration directory.
578
+
579
+ Args:
580
+ config_dir: Directory to check
581
+
582
+ Returns:
583
+ Migration status information
584
+ """
585
+ config_dir = Path(config_dir)
586
+
587
+ # Check for unified config
588
+ unified_config_path = config_dir / "config.json"
589
+ has_unified_config = unified_config_path.exists()
590
+
591
+ # Check for legacy configs
592
+ detector = LegacyConfigDetector([config_dir])
593
+ legacy_configs = detector.find_legacy_configs()
594
+
595
+ return {
596
+ "has_unified_config": has_unified_config,
597
+ "legacy_configs_found": len(legacy_configs),
598
+ "legacy_configs": [
599
+ {
600
+ "path": str(c.path),
601
+ "module": c.module_name,
602
+ "version": c.version,
603
+ "format": c.format,
604
+ }
605
+ for c in legacy_configs
606
+ ],
607
+ "migration_needed": len(legacy_configs) > 0,
608
+ }