moai-adk 0.15.1__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 (699) hide show
  1. moai_adk/__init__.py +2 -6
  2. moai_adk/__main__.py +136 -21
  3. moai_adk/cli/__init__.py +6 -2
  4. moai_adk/cli/commands/__init__.py +1 -4
  5. moai_adk/cli/commands/analyze.py +116 -0
  6. moai_adk/cli/commands/doctor.py +17 -5
  7. moai_adk/cli/commands/init.py +105 -47
  8. moai_adk/cli/commands/language.py +248 -0
  9. moai_adk/cli/commands/status.py +8 -13
  10. moai_adk/cli/commands/update.py +1734 -65
  11. moai_adk/cli/main.py +3 -2
  12. moai_adk/cli/prompts/init_prompts.py +144 -91
  13. moai_adk/cli/spec_status.py +263 -0
  14. moai_adk/cli/ui/__init__.py +44 -0
  15. moai_adk/cli/ui/progress.py +422 -0
  16. moai_adk/cli/ui/prompts.py +389 -0
  17. moai_adk/cli/ui/theme.py +129 -0
  18. moai_adk/cli/worktree/__init__.py +27 -0
  19. moai_adk/cli/worktree/__main__.py +31 -0
  20. moai_adk/cli/worktree/cli.py +672 -0
  21. moai_adk/cli/worktree/exceptions.py +89 -0
  22. moai_adk/cli/worktree/manager.py +490 -0
  23. moai_adk/cli/worktree/models.py +65 -0
  24. moai_adk/cli/worktree/registry.py +128 -0
  25. moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
  26. moai_adk/core/__init__.py +0 -1
  27. moai_adk/core/analysis/__init__.py +9 -0
  28. moai_adk/core/analysis/session_analyzer.py +400 -0
  29. moai_adk/core/claude_integration.py +393 -0
  30. moai_adk/core/command_helpers.py +270 -0
  31. moai_adk/core/comprehensive_monitoring_system.py +1183 -0
  32. moai_adk/core/config/__init__.py +6 -0
  33. moai_adk/core/config/auto_spec_config.py +340 -0
  34. moai_adk/core/config/migration.py +147 -16
  35. moai_adk/core/config/unified.py +436 -0
  36. moai_adk/core/context_manager.py +273 -0
  37. moai_adk/core/diagnostics/slash_commands.py +0 -1
  38. moai_adk/core/enterprise_features.py +1404 -0
  39. moai_adk/core/error_recovery_system.py +1902 -0
  40. moai_adk/core/event_driven_hook_system.py +1371 -0
  41. moai_adk/core/git/__init__.py +8 -1
  42. moai_adk/core/git/branch.py +0 -1
  43. moai_adk/core/git/branch_manager.py +2 -10
  44. moai_adk/core/git/checkpoint.py +1 -7
  45. moai_adk/core/git/commit.py +0 -1
  46. moai_adk/core/git/conflict_detector.py +413 -0
  47. moai_adk/core/git/event_detector.py +3 -5
  48. moai_adk/core/git/manager.py +91 -2
  49. moai_adk/core/hooks/post_tool_auto_spec_completion.py +901 -0
  50. moai_adk/core/input_validation_middleware.py +1006 -0
  51. moai_adk/core/integration/__init__.py +22 -0
  52. moai_adk/core/integration/engine.py +157 -0
  53. moai_adk/core/integration/integration_tester.py +226 -0
  54. moai_adk/core/integration/models.py +88 -0
  55. moai_adk/core/integration/utils.py +211 -0
  56. moai_adk/core/issue_creator.py +20 -28
  57. moai_adk/core/jit_context_loader.py +956 -0
  58. moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
  59. moai_adk/core/language_config.py +202 -0
  60. moai_adk/core/language_config_resolver.py +485 -0
  61. moai_adk/core/language_validator.py +543 -0
  62. moai_adk/core/mcp/setup.py +116 -0
  63. moai_adk/core/merge/__init__.py +9 -0
  64. moai_adk/core/merge/analyzer.py +481 -0
  65. moai_adk/core/migration/__init__.py +18 -0
  66. moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
  67. moai_adk/core/migration/backup_manager.py +277 -0
  68. moai_adk/core/migration/custom_element_scanner.py +358 -0
  69. moai_adk/core/migration/file_migrator.py +209 -0
  70. moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
  71. moai_adk/core/migration/selective_restorer.py +470 -0
  72. moai_adk/core/migration/template_utils.py +74 -0
  73. moai_adk/core/migration/user_selection_ui.py +338 -0
  74. moai_adk/core/migration/version_detector.py +139 -0
  75. moai_adk/core/migration/version_migrator.py +228 -0
  76. moai_adk/core/performance/__init__.py +6 -0
  77. moai_adk/core/performance/cache_system.py +316 -0
  78. moai_adk/core/performance/parallel_processor.py +116 -0
  79. moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
  80. moai_adk/core/project/__init__.py +0 -1
  81. moai_adk/core/project/backup_utils.py +2 -7
  82. moai_adk/core/project/checker.py +2 -4
  83. moai_adk/core/project/detector.py +17 -39
  84. moai_adk/core/project/initializer.py +170 -33
  85. moai_adk/core/project/phase_executor.py +398 -68
  86. moai_adk/core/project/validator.py +7 -32
  87. moai_adk/core/quality/__init__.py +1 -1
  88. moai_adk/core/quality/trust_checker.py +37 -101
  89. moai_adk/core/quality/validators/__init__.py +1 -1
  90. moai_adk/core/quality/validators/base_validator.py +1 -1
  91. moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
  92. moai_adk/core/robust_json_parser.py +611 -0
  93. moai_adk/core/rollback_manager.py +918 -0
  94. moai_adk/core/session_manager.py +651 -0
  95. moai_adk/core/skill_loading_system.py +579 -0
  96. moai_adk/core/spec/confidence_scoring.py +680 -0
  97. moai_adk/core/spec/ears_template_engine.py +1247 -0
  98. moai_adk/core/spec/quality_validator.py +687 -0
  99. moai_adk/core/spec_status_manager.py +478 -0
  100. moai_adk/core/template/__init__.py +0 -1
  101. moai_adk/core/template/backup.py +82 -17
  102. moai_adk/core/template/config.py +112 -40
  103. moai_adk/core/template/languages.py +0 -1
  104. moai_adk/core/template/merger.py +75 -26
  105. moai_adk/core/template/processor.py +750 -72
  106. moai_adk/core/template_engine.py +90 -48
  107. moai_adk/core/template_variable_synchronizer.py +417 -0
  108. moai_adk/core/unified_permission_manager.py +745 -0
  109. moai_adk/core/user_behavior_analytics.py +851 -0
  110. moai_adk/core/version_sync.py +429 -0
  111. moai_adk/foundation/__init__.py +56 -0
  112. moai_adk/foundation/backend.py +1027 -0
  113. moai_adk/foundation/database.py +1115 -0
  114. moai_adk/foundation/devops.py +1585 -0
  115. moai_adk/foundation/ears.py +431 -0
  116. moai_adk/foundation/frontend.py +870 -0
  117. moai_adk/foundation/git/commit_templates.py +557 -0
  118. moai_adk/foundation/git.py +376 -0
  119. moai_adk/foundation/langs.py +484 -0
  120. moai_adk/foundation/ml_ops.py +1162 -0
  121. moai_adk/foundation/testing.py +1524 -0
  122. moai_adk/foundation/trust/trust_principles.py +676 -0
  123. moai_adk/foundation/trust/validation_checklist.py +1573 -0
  124. moai_adk/project/__init__.py +0 -0
  125. moai_adk/project/configuration.py +1084 -0
  126. moai_adk/project/documentation.py +566 -0
  127. moai_adk/project/schema.py +447 -0
  128. moai_adk/statusline/__init__.py +38 -0
  129. moai_adk/statusline/alfred_detector.py +105 -0
  130. moai_adk/statusline/config.py +373 -0
  131. moai_adk/statusline/enhanced_output_style_detector.py +372 -0
  132. moai_adk/statusline/git_collector.py +190 -0
  133. moai_adk/statusline/main.py +264 -0
  134. moai_adk/statusline/metrics_tracker.py +78 -0
  135. moai_adk/statusline/renderer.py +383 -0
  136. moai_adk/statusline/update_checker.py +129 -0
  137. moai_adk/statusline/version_reader.py +741 -0
  138. moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
  139. moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
  140. moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
  141. moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
  142. moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
  143. moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
  144. moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
  145. moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
  146. moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
  147. moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
  148. moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
  149. moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
  150. moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
  151. moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
  152. moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
  153. moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
  154. moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
  155. moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
  156. moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
  157. moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
  158. moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
  159. moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
  160. moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
  161. moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
  162. moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
  163. moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
  164. moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
  165. moai_adk/templates/.claude/commands/moai/3-sync.md +993 -0
  166. moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
  167. moai_adk/templates/.claude/hooks/__init__.py +8 -0
  168. moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
  169. moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
  170. moai_adk/templates/.claude/hooks/{alfred/shared/core → moai/lib}/checkpoint.py +9 -36
  171. moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
  172. moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
  173. moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
  174. moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
  175. moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
  176. moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
  177. moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
  178. moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
  179. moai_adk/templates/.claude/hooks/{alfred/shared/core → moai/lib}/project.py +63 -44
  180. moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
  181. moai_adk/templates/.claude/hooks/{alfred/core → moai/lib}/timeout.py +40 -16
  182. moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
  183. moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
  184. moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +921 -0
  185. moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
  186. moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
  187. moai_adk/templates/.claude/settings.json +78 -50
  188. moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -0
  189. moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
  190. moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
  191. moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
  192. moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
  193. moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
  194. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +312 -283
  195. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +291 -94
  196. moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
  197. moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
  198. moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
  199. moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
  200. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +469 -101
  201. moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -0
  202. moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
  203. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
  204. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
  205. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
  206. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
  207. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
  208. moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
  209. moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +491 -0
  210. moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
  211. moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
  212. moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
  213. moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
  214. moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
  215. moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
  216. moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +201 -0
  217. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
  218. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
  219. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
  220. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
  221. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
  222. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
  223. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
  224. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
  225. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
  226. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
  227. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
  228. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
  229. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
  230. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
  231. moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +438 -0
  232. moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -0
  233. moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
  234. moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +346 -0
  235. moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
  236. moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
  237. moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
  238. moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
  239. moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
  240. moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
  241. moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
  242. moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
  243. moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +362 -0
  244. moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
  245. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
  246. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
  247. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
  248. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
  249. moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
  250. moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
  251. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
  252. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
  253. moai_adk/templates/.claude/skills/moai-integration-mcp/SKILL.md +352 -0
  254. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
  255. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
  256. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
  257. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
  258. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
  259. moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
  260. moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
  261. moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
  262. moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
  263. moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -0
  264. moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
  265. moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
  266. moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
  267. moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
  268. moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +316 -0
  269. moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
  270. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
  271. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
  272. moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
  273. moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
  274. moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
  275. moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
  276. moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
  277. moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
  278. moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
  279. moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +370 -0
  280. moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
  281. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
  282. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
  283. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
  284. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
  285. moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
  286. moai_adk/templates/.claude/skills/moai-platform-baas/README.md +186 -0
  287. moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
  288. moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
  289. moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
  290. moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
  291. moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
  292. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
  293. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
  294. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
  295. moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
  296. moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -0
  297. moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
  298. moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
  299. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
  300. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
  301. moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
  302. moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +135 -0
  303. moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
  304. moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
  305. moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
  306. moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
  307. moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
  308. moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
  309. moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
  310. moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
  311. moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
  312. moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
  313. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
  314. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -0
  315. moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
  316. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
  317. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
  318. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +71 -0
  319. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
  320. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
  321. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
  322. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
  323. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
  324. moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
  325. moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +374 -0
  326. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
  327. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
  328. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
  329. moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
  330. moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -0
  331. moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
  332. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
  333. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
  334. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
  335. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
  336. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
  337. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
  338. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
  339. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
  340. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
  341. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
  342. moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
  343. moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
  344. moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
  345. moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
  346. moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
  347. moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +410 -0
  348. moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
  349. moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
  350. moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
  351. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
  352. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
  353. moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
  354. moai_adk/templates/.git-hooks/pre-commit +128 -0
  355. moai_adk/templates/.git-hooks/pre-push +220 -13
  356. moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
  357. moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
  358. moai_adk/templates/.github/workflows/spec-issue-sync.yml +0 -1
  359. moai_adk/templates/.gitignore +197 -13
  360. moai_adk/templates/.mcp.json +20 -0
  361. moai_adk/templates/.moai/cache/personalization.json +10 -0
  362. moai_adk/templates/.moai/config/config.yaml +344 -0
  363. moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
  364. moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
  365. moai_adk/templates/.moai/config/presets/team.yaml +33 -0
  366. moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
  367. moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
  368. moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
  369. moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
  370. moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
  371. moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
  372. moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -0
  373. moai_adk/templates/.moai/config/sections/language.yaml +11 -0
  374. moai_adk/templates/.moai/config/sections/project.yaml +13 -0
  375. moai_adk/templates/.moai/config/sections/quality.yaml +15 -0
  376. moai_adk/templates/.moai/config/sections/system.yaml +14 -0
  377. moai_adk/templates/.moai/config/sections/user.yaml +5 -0
  378. moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
  379. moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
  380. moai_adk/templates/CLAUDE.md +310 -1050
  381. moai_adk/utils/__init__.py +24 -2
  382. moai_adk/utils/banner.py +7 -11
  383. moai_adk/utils/common.py +294 -0
  384. moai_adk/utils/link_validator.py +241 -0
  385. moai_adk/utils/logger.py +4 -9
  386. moai_adk/utils/safe_file_reader.py +206 -0
  387. moai_adk/{templates/.claude/hooks/alfred/utils → utils}/timeout.py +8 -9
  388. moai_adk/utils/toon_utils.py +256 -0
  389. moai_adk/version.py +22 -0
  390. moai_adk-0.32.8.dist-info/METADATA +2478 -0
  391. moai_adk-0.32.8.dist-info/RECORD +396 -0
  392. {moai_adk-0.15.1.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
  393. {moai_adk-0.15.1.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
  394. moai_adk/cli/commands/backup.py +0 -80
  395. moai_adk/core/tags/__init__.py +0 -86
  396. moai_adk/core/tags/ci_validator.py +0 -463
  397. moai_adk/core/tags/cli.py +0 -283
  398. moai_adk/core/tags/generator.py +0 -109
  399. moai_adk/core/tags/inserter.py +0 -99
  400. moai_adk/core/tags/mapper.py +0 -126
  401. moai_adk/core/tags/parser.py +0 -76
  402. moai_adk/core/tags/pre_commit_validator.py +0 -393
  403. moai_adk/core/tags/reporter.py +0 -956
  404. moai_adk/core/tags/tags.py +0 -149
  405. moai_adk/core/tags/validator.py +0 -897
  406. moai_adk/templates/.claude/agents/alfred/backend-expert.md +0 -319
  407. moai_adk/templates/.claude/agents/alfred/cc-manager.md +0 -316
  408. moai_adk/templates/.claude/agents/alfred/debug-helper.md +0 -208
  409. moai_adk/templates/.claude/agents/alfred/devops-expert.md +0 -464
  410. moai_adk/templates/.claude/agents/alfred/doc-syncer.md +0 -214
  411. moai_adk/templates/.claude/agents/alfred/frontend-expert.md +0 -357
  412. moai_adk/templates/.claude/agents/alfred/git-manager.md +0 -406
  413. moai_adk/templates/.claude/agents/alfred/implementation-planner.md +0 -423
  414. moai_adk/templates/.claude/agents/alfred/project-manager.md +0 -312
  415. moai_adk/templates/.claude/agents/alfred/quality-gate.md +0 -343
  416. moai_adk/templates/.claude/agents/alfred/skill-factory.md +0 -865
  417. moai_adk/templates/.claude/agents/alfred/spec-builder.md +0 -426
  418. moai_adk/templates/.claude/agents/alfred/tag-agent.md +0 -361
  419. moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +0 -428
  420. moai_adk/templates/.claude/agents/alfred/trust-checker.md +0 -375
  421. moai_adk/templates/.claude/agents/alfred/ui-ux-expert.md +0 -571
  422. moai_adk/templates/.claude/commands/alfred/0-project.md +0 -1854
  423. moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -880
  424. moai_adk/templates/.claude/commands/alfred/2-run.md +0 -793
  425. moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -1084
  426. moai_adk/templates/.claude/commands/alfred/9-feedback.md +0 -149
  427. moai_adk/templates/.claude/hooks/alfred/core/project.py +0 -748
  428. moai_adk/templates/.claude/hooks/alfred/core/ttl_cache.py +0 -108
  429. moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +0 -198
  430. moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +0 -29
  431. moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +0 -94
  432. moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +0 -100
  433. moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +0 -94
  434. moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +0 -94
  435. moai_adk/templates/.claude/hooks/alfred/shared/core/__init__.py +0 -170
  436. moai_adk/templates/.claude/hooks/alfred/shared/core/context.py +0 -67
  437. moai_adk/templates/.claude/hooks/alfred/shared/core/tags.py +0 -230
  438. moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +0 -198
  439. moai_adk/templates/.claude/hooks/alfred/shared/handlers/__init__.py +0 -21
  440. moai_adk/templates/.claude/hooks/alfred/shared/handlers/notification.py +0 -154
  441. moai_adk/templates/.claude/hooks/alfred/shared/handlers/session.py +0 -174
  442. moai_adk/templates/.claude/hooks/alfred/shared/handlers/tool.py +0 -87
  443. moai_adk/templates/.claude/hooks/alfred/shared/handlers/user.py +0 -61
  444. moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +0 -112
  445. moai_adk/templates/.claude/hooks/alfred/utils/__init__.py +0 -1
  446. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/SKILL.md +0 -70
  447. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/examples.md +0 -62
  448. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/reference.md +0 -242
  449. moai_adk/templates/.claude/skills/moai-alfred-config-schema/SKILL.md +0 -56
  450. moai_adk/templates/.claude/skills/moai-alfred-config-schema/examples.md +0 -28
  451. moai_adk/templates/.claude/skills/moai-alfred-config-schema/reference.md +0 -444
  452. moai_adk/templates/.claude/skills/moai-alfred-context-budget/SKILL.md +0 -62
  453. moai_adk/templates/.claude/skills/moai-alfred-context-budget/examples.md +0 -28
  454. moai_adk/templates/.claude/skills/moai-alfred-context-budget/reference.md +0 -405
  455. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/SKILL.md +0 -51
  456. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/examples.md +0 -355
  457. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/reference.md +0 -239
  458. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -113
  459. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/examples.md +0 -29
  460. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/reference.md +0 -28
  461. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/SKILL.md +0 -323
  462. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/examples.md +0 -286
  463. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/reference.md +0 -126
  464. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -122
  465. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/examples.md +0 -29
  466. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/reference.md +0 -29
  467. moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/SKILL.md +0 -74
  468. moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/examples.md +0 -4
  469. moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/reference.md +0 -269
  470. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/SKILL.md +0 -237
  471. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/examples.md +0 -615
  472. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/reference.md +0 -653
  473. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/SKILL.md +0 -19
  474. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/examples.md +0 -4
  475. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/reference.md +0 -150
  476. moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +0 -113
  477. moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +0 -29
  478. moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +0 -28
  479. moai_adk/templates/.claude/skills/moai-alfred-persona-roles/SKILL.md +0 -198
  480. moai_adk/templates/.claude/skills/moai-alfred-persona-roles/examples.md +0 -431
  481. moai_adk/templates/.claude/skills/moai-alfred-persona-roles/reference.md +0 -141
  482. moai_adk/templates/.claude/skills/moai-alfred-practices/SKILL.md +0 -89
  483. moai_adk/templates/.claude/skills/moai-alfred-practices/examples.md +0 -122
  484. moai_adk/templates/.claude/skills/moai-alfred-practices/reference.md +0 -369
  485. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/SKILL.md +0 -508
  486. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/examples.md +0 -481
  487. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/reference.md +0 -100
  488. moai_adk/templates/.claude/skills/moai-alfred-reporting/SKILL.md +0 -273
  489. moai_adk/templates/.claude/skills/moai-alfred-rules/SKILL.md +0 -77
  490. moai_adk/templates/.claude/skills/moai-alfred-rules/examples.md +0 -265
  491. moai_adk/templates/.claude/skills/moai-alfred-rules/reference.md +0 -539
  492. moai_adk/templates/.claude/skills/moai-alfred-session-state/SKILL.md +0 -19
  493. moai_adk/templates/.claude/skills/moai-alfred-session-state/examples.md +0 -4
  494. moai_adk/templates/.claude/skills/moai-alfred-session-state/reference.md +0 -84
  495. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/README.md +0 -137
  496. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/SKILL.md +0 -219
  497. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples/validate-spec.sh +0 -161
  498. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples.md +0 -541
  499. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/reference.md +0 -622
  500. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/SKILL.md +0 -115
  501. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/examples.md +0 -4
  502. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/reference.md +0 -348
  503. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -113
  504. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/examples.md +0 -29
  505. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/reference.md +0 -28
  506. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -113
  507. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/examples.md +0 -29
  508. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/reference.md +0 -28
  509. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/SKILL.md +0 -19
  510. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/examples.md +0 -4
  511. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/reference.md +0 -211
  512. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -113
  513. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/examples.md +0 -29
  514. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/reference.md +0 -28
  515. moai_adk/templates/.claude/skills/moai-alfred-workflow/SKILL.md +0 -288
  516. moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +0 -269
  517. moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +0 -32
  518. moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +0 -298
  519. moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +0 -26
  520. moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +0 -307
  521. moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +0 -21
  522. moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +0 -252
  523. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +0 -19
  524. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +0 -19
  525. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +0 -24
  526. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +0 -199
  527. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +0 -39
  528. moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +0 -316
  529. moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +0 -18
  530. moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +0 -263
  531. moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +0 -30
  532. moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/SKILL.md +0 -19
  533. moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/examples.md +0 -4
  534. moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/reference.md +0 -218
  535. moai_adk/templates/.claude/skills/moai-cc-skill-factory/CHECKLIST.md +0 -482
  536. moai_adk/templates/.claude/skills/moai-cc-skill-factory/EXAMPLES.md +0 -278
  537. moai_adk/templates/.claude/skills/moai-cc-skill-factory/INTERACTIVE-DISCOVERY.md +0 -524
  538. moai_adk/templates/.claude/skills/moai-cc-skill-factory/METADATA.md +0 -477
  539. moai_adk/templates/.claude/skills/moai-cc-skill-factory/PARALLEL-ANALYSIS-REPORT.md +0 -429
  540. moai_adk/templates/.claude/skills/moai-cc-skill-factory/PYTHON-VERSION-MATRIX.md +0 -391
  541. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-FACTORY-WORKFLOW.md +0 -431
  542. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-UPDATE-ADVISOR.md +0 -577
  543. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL.md +0 -271
  544. moai_adk/templates/.claude/skills/moai-cc-skill-factory/STEP-BY-STEP-GUIDE.md +0 -466
  545. moai_adk/templates/.claude/skills/moai-cc-skill-factory/STRUCTURE.md +0 -583
  546. moai_adk/templates/.claude/skills/moai-cc-skill-factory/WEB-RESEARCH.md +0 -526
  547. moai_adk/templates/.claude/skills/moai-cc-skill-factory/reference.md +0 -465
  548. moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/generate-structure.sh +0 -328
  549. moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/validate-skill.sh +0 -312
  550. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/SKILL_TEMPLATE.md +0 -245
  551. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/examples-template.md +0 -285
  552. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/reference-template.md +0 -278
  553. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/scripts-template.sh +0 -303
  554. moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +0 -291
  555. moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +0 -15
  556. moai_adk/templates/.claude/skills/moai-design-systems/SKILL.md +0 -802
  557. moai_adk/templates/.claude/skills/moai-design-systems/examples.md +0 -1238
  558. moai_adk/templates/.claude/skills/moai-design-systems/reference.md +0 -673
  559. moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +0 -1633
  560. moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +0 -660
  561. moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +0 -123
  562. moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +0 -29
  563. moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +0 -30
  564. moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +0 -123
  565. moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +0 -29
  566. moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +0 -30
  567. moai_adk/templates/.claude/skills/moai-domain-database/examples.md +0 -29
  568. moai_adk/templates/.claude/skills/moai-domain-database/reference.md +0 -30
  569. moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +0 -124
  570. moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +0 -29
  571. moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +0 -31
  572. moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +0 -29
  573. moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +0 -31
  574. moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +0 -123
  575. moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +0 -29
  576. moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +0 -30
  577. moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +0 -123
  578. moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +0 -29
  579. moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +0 -30
  580. moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +0 -123
  581. moai_adk/templates/.claude/skills/moai-domain-security/examples.md +0 -29
  582. moai_adk/templates/.claude/skills/moai-domain-security/reference.md +0 -30
  583. moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +0 -123
  584. moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +0 -29
  585. moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +0 -30
  586. moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +0 -303
  587. moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +0 -1064
  588. moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +0 -1047
  589. moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +0 -113
  590. moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +0 -29
  591. moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +0 -28
  592. moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +0 -113
  593. moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +0 -29
  594. moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +0 -28
  595. moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +0 -113
  596. moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +0 -29
  597. moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +0 -28
  598. moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +0 -116
  599. moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +0 -29
  600. moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +0 -28
  601. moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +0 -122
  602. moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +0 -29
  603. moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +0 -29
  604. moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +0 -113
  605. moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +0 -29
  606. moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +0 -28
  607. moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +0 -113
  608. moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +0 -29
  609. moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +0 -28
  610. moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +0 -113
  611. moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +0 -29
  612. moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +0 -28
  613. moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +0 -307
  614. moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
  615. moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +0 -1099
  616. moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +0 -124
  617. moai_adk/templates/.claude/skills/moai-lang-c/examples.md +0 -29
  618. moai_adk/templates/.claude/skills/moai-lang-c/reference.md +0 -31
  619. moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +0 -124
  620. moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +0 -29
  621. moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +0 -31
  622. moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +0 -123
  623. moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +0 -29
  624. moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +0 -30
  625. moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +0 -123
  626. moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +0 -29
  627. moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +0 -30
  628. moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +0 -127
  629. moai_adk/templates/.claude/skills/moai-lang-go/examples.md +0 -29
  630. moai_adk/templates/.claude/skills/moai-lang-go/reference.md +0 -31
  631. moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +0 -126
  632. moai_adk/templates/.claude/skills/moai-lang-java/examples.md +0 -29
  633. moai_adk/templates/.claude/skills/moai-lang-java/reference.md +0 -31
  634. moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +0 -125
  635. moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +0 -29
  636. moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +0 -32
  637. moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +0 -124
  638. moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +0 -29
  639. moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +0 -31
  640. moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +0 -126
  641. moai_adk/templates/.claude/skills/moai-lang-php/examples.md +0 -29
  642. moai_adk/templates/.claude/skills/moai-lang-php/reference.md +0 -30
  643. moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +0 -433
  644. moai_adk/templates/.claude/skills/moai-lang-python/examples.md +0 -624
  645. moai_adk/templates/.claude/skills/moai-lang-python/reference.md +0 -316
  646. moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +0 -123
  647. moai_adk/templates/.claude/skills/moai-lang-r/examples.md +0 -29
  648. moai_adk/templates/.claude/skills/moai-lang-r/reference.md +0 -30
  649. moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +0 -124
  650. moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +0 -29
  651. moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +0 -31
  652. moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +0 -127
  653. moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +0 -29
  654. moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +0 -31
  655. moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +0 -125
  656. moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +0 -29
  657. moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +0 -30
  658. moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +0 -123
  659. moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +0 -29
  660. moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +0 -30
  661. moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +0 -124
  662. moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +0 -29
  663. moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +0 -31
  664. moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +0 -123
  665. moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +0 -29
  666. moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +0 -30
  667. moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +0 -133
  668. moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +0 -29
  669. moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +0 -34
  670. moai_adk/templates/.claude/skills/moai-project-documentation.md +0 -622
  671. moai_adk/templates/.github/workflows/c-tag-validation.yml +0 -11
  672. moai_adk/templates/.github/workflows/cpp-tag-validation.yml +0 -11
  673. moai_adk/templates/.github/workflows/csharp-tag-validation.yml +0 -11
  674. moai_adk/templates/.github/workflows/dart-tag-validation.yml +0 -11
  675. moai_adk/templates/.github/workflows/go-tag-validation.yml +0 -130
  676. moai_adk/templates/.github/workflows/java-tag-validation.yml +0 -11
  677. moai_adk/templates/.github/workflows/javascript-tag-validation.yml +0 -135
  678. moai_adk/templates/.github/workflows/kotlin-tag-validation.yml +0 -11
  679. moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -419
  680. moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
  681. moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
  682. moai_adk/templates/.github/workflows/php-tag-validation.yml +0 -11
  683. moai_adk/templates/.github/workflows/python-tag-validation.yml +0 -118
  684. moai_adk/templates/.github/workflows/release.yml +0 -118
  685. moai_adk/templates/.github/workflows/ruby-tag-validation.yml +0 -11
  686. moai_adk/templates/.github/workflows/rust-tag-validation.yml +0 -11
  687. moai_adk/templates/.github/workflows/shell-tag-validation.yml +0 -11
  688. moai_adk/templates/.github/workflows/swift-tag-validation.yml +0 -11
  689. moai_adk/templates/.github/workflows/tag-report.yml +0 -269
  690. moai_adk/templates/.github/workflows/tag-validation.yml +0 -186
  691. moai_adk/templates/.github/workflows/typescript-tag-validation.yml +0 -154
  692. moai_adk/templates/.moai/config.json +0 -115
  693. moai_adk/templates/workflows/go-tag-validation.yml +0 -30
  694. moai_adk/templates/workflows/javascript-tag-validation.yml +0 -41
  695. moai_adk/templates/workflows/python-tag-validation.yml +0 -42
  696. moai_adk/templates/workflows/typescript-tag-validation.yml +0 -31
  697. moai_adk-0.15.1.dist-info/METADATA +0 -3094
  698. moai_adk-0.15.1.dist-info/RECORD +0 -365
  699. {moai_adk-0.15.1.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,918 @@
1
+ """
2
+ Rollback Manager for Research Integration Changes
3
+
4
+ Provides comprehensive rollback system for:
5
+ - Configuration backup and restore
6
+ - Version management
7
+ - Safe rollback procedures
8
+ - Integration with existing MoAI-ADK backup systems
9
+ - Research-specific rollback operations
10
+
11
+ Supports:
12
+ - Full system rollback
13
+ - Component-specific rollback
14
+ - Incremental rollback
15
+ - Emergency rollback
16
+ - Rollback validation and verification
17
+ """
18
+
19
+ import hashlib
20
+ import json
21
+ import logging
22
+ import os
23
+ import shutil
24
+ import sys
25
+ from dataclasses import asdict, dataclass
26
+ from datetime import datetime, timezone
27
+ from pathlib import Path
28
+ from typing import Any, Dict, List, Tuple
29
+
30
+ # Configure logging
31
+ logging.basicConfig(level=logging.INFO)
32
+ logger = logging.getLogger(__name__)
33
+
34
+
35
+ @dataclass
36
+ class RollbackPoint:
37
+ """Represents a rollback point with metadata"""
38
+
39
+ id: str
40
+ timestamp: datetime
41
+ description: str
42
+ changes: List[str]
43
+ backup_path: str
44
+ checksum: str
45
+ metadata: Dict[str, Any]
46
+
47
+
48
+ @dataclass
49
+ class RollbackResult:
50
+ """Result of a rollback operation"""
51
+
52
+ success: bool
53
+ rollback_point_id: str
54
+ message: str
55
+ restored_files: List[str]
56
+ failed_files: List[str] = None
57
+ validation_results: Dict[str, Any] = None
58
+
59
+
60
+ class RollbackManager:
61
+ """Comprehensive rollback management system"""
62
+
63
+ def __init__(self, project_root: Path = None):
64
+ self.project_root = project_root or Path.cwd()
65
+ self.backup_root = self.project_root / ".moai" / "rollbacks"
66
+ self.config_backup_dir = self.backup_root / "config"
67
+ self.code_backup_dir = self.backup_root / "code"
68
+ self.docs_backup_dir = self.backup_root / "docs"
69
+ self.registry_file = self.backup_root / "rollback_registry.json"
70
+
71
+ # Create backup directories
72
+ self.backup_root.mkdir(parents=True, exist_ok=True)
73
+ self.config_backup_dir.mkdir(parents=True, exist_ok=True)
74
+ self.code_backup_dir.mkdir(parents=True, exist_ok=True)
75
+ self.docs_backup_dir.mkdir(parents=True, exist_ok=True)
76
+
77
+ # Load existing registry
78
+ self.registry = self._load_registry()
79
+
80
+ # Research-specific paths
81
+ self.research_dirs = [
82
+ self.project_root / ".claude" / "skills",
83
+ self.project_root / ".claude" / "agents",
84
+ self.project_root / ".claude" / "commands",
85
+ self.project_root / ".claude" / "hooks",
86
+ ]
87
+
88
+ def create_rollback_point(self, description: str, changes: List[str] = None) -> str:
89
+ """
90
+ Create a rollback point before making changes
91
+
92
+ Args:
93
+ description: Description of the changes being made
94
+ changes: List of specific changes (files modified, components updated)
95
+
96
+ Returns:
97
+ Rollback point ID
98
+ """
99
+ rollback_id = self._generate_rollback_id()
100
+ timestamp = datetime.now(timezone.utc)
101
+
102
+ logger.info(f"Creating rollback point {rollback_id}: {description}")
103
+
104
+ try:
105
+ # Create backup directory for this rollback point
106
+ rollback_dir = self.backup_root / rollback_id
107
+ rollback_dir.mkdir(parents=True, exist_ok=True)
108
+
109
+ # Backup configuration files
110
+ config_backup_path = self._backup_configuration(rollback_dir)
111
+
112
+ # Backup research components
113
+ research_backup_path = self._backup_research_components(rollback_dir)
114
+
115
+ # Backup project files
116
+ code_backup_path = self._backup_code_files(rollback_dir)
117
+
118
+ # Create checksum for integrity verification
119
+ checksum = self._calculate_backup_checksum(rollback_dir)
120
+
121
+ # Create rollback point record
122
+ rollback_point = RollbackPoint(
123
+ id=rollback_id,
124
+ timestamp=timestamp,
125
+ description=description,
126
+ changes=changes or [],
127
+ backup_path=str(rollback_dir),
128
+ checksum=checksum,
129
+ metadata={
130
+ "config_backup": config_backup_path,
131
+ "research_backup": research_backup_path,
132
+ "code_backup": code_backup_path,
133
+ "project_root": str(self.project_root),
134
+ "created_by": "rollback_manager",
135
+ "version": "1.0.0",
136
+ },
137
+ )
138
+
139
+ # Register rollback point
140
+ self.registry[rollback_id] = asdict(rollback_point)
141
+ self._save_registry()
142
+
143
+ logger.info(f"Rollback point {rollback_id} created successfully")
144
+ return rollback_id
145
+
146
+ except Exception as e:
147
+ logger.error(f"Failed to create rollback point: {str(e)}")
148
+ # Cleanup partial backup
149
+ self._cleanup_partial_backup(rollback_id)
150
+ raise
151
+
152
+ def rollback_to_point(
153
+ self,
154
+ rollback_id: str,
155
+ validate_before: bool = True,
156
+ validate_after: bool = True,
157
+ ) -> RollbackResult:
158
+ """
159
+ Rollback to a specific rollback point
160
+
161
+ Args:
162
+ rollback_id: ID of rollback point to restore
163
+ validate_before: Validate rollback point before restoration
164
+ validate_after: Validate system after restoration
165
+
166
+ Returns:
167
+ RollbackResult with operation details
168
+ """
169
+ if rollback_id not in self.registry:
170
+ return RollbackResult(
171
+ success=False,
172
+ rollback_point_id=rollback_id,
173
+ message=f"Rollback point {rollback_id} not found",
174
+ restored_files=[],
175
+ )
176
+
177
+ logger.info(f"Rolling back to point {rollback_id}")
178
+
179
+ try:
180
+ rollback_point = RollbackPoint(**self.registry[rollback_id])
181
+
182
+ # Pre-rollback validation
183
+ if validate_before:
184
+ validation_result = self._validate_rollback_point(rollback_point)
185
+ if not validation_result["valid"]:
186
+ return RollbackResult(
187
+ success=False,
188
+ rollback_point_id=rollback_id,
189
+ message=f"Rollback point validation failed: {validation_result['message']}",
190
+ restored_files=[],
191
+ )
192
+
193
+ # Perform rollback
194
+ restored_files, failed_files = self._perform_rollback(rollback_point)
195
+
196
+ # Post-rollback validation
197
+ validation_results = {}
198
+ if validate_after:
199
+ validation_results = self._validate_system_after_rollback()
200
+
201
+ # Update registry with rollback info
202
+ self._mark_rollback_as_used(rollback_id)
203
+
204
+ success = len(failed_files) == 0
205
+
206
+ result = RollbackResult(
207
+ success=success,
208
+ rollback_point_id=rollback_id,
209
+ message=f"Rollback {'completed successfully' if success else 'completed with errors'}",
210
+ restored_files=restored_files,
211
+ failed_files=failed_files or [],
212
+ validation_results=validation_results,
213
+ )
214
+
215
+ logger.info(f"Rollback {rollback_id} completed. Success: {success}")
216
+ return result
217
+
218
+ except Exception as e:
219
+ logger.error(f"Rollback failed: {str(e)}")
220
+ return RollbackResult(
221
+ success=False,
222
+ rollback_point_id=rollback_id,
223
+ message=f"Rollback failed with error: {str(e)}",
224
+ restored_files=[],
225
+ )
226
+
227
+ def rollback_research_integration(self, component_type: str = None, component_name: str = None) -> RollbackResult:
228
+ """
229
+ Specialized rollback for research integration changes
230
+
231
+ Args:
232
+ component_type: Type of component (skills, agents, commands, hooks)
233
+ component_name: Specific component name to rollback
234
+
235
+ Returns:
236
+ RollbackResult with operation details
237
+ """
238
+ logger.info(f"Rolling back research integration: {component_type}:{component_name}")
239
+
240
+ try:
241
+ # Find relevant rollback points for research integration
242
+ research_rollback_points = self._find_research_rollback_points(component_type, component_name)
243
+
244
+ if not research_rollback_points:
245
+ return RollbackResult(
246
+ success=False,
247
+ rollback_point_id="",
248
+ message="No suitable rollback points found for research integration",
249
+ restored_files=[],
250
+ )
251
+
252
+ # Use the most recent suitable rollback point
253
+ latest_rollback = max(research_rollback_points, key=lambda x: x["timestamp"])
254
+
255
+ # Perform targeted rollback
256
+ restored_files, failed_files = self._perform_research_rollback(
257
+ latest_rollback, component_type, component_name
258
+ )
259
+
260
+ # Validate research components
261
+ validation_results = self._validate_research_components()
262
+
263
+ success = len(failed_files) == 0
264
+
265
+ return RollbackResult(
266
+ success=success,
267
+ rollback_point_id=latest_rollback["id"],
268
+ message=f"Research integration rollback "
269
+ f"{'completed successfully' if success else 'completed with errors'}",
270
+ restored_files=restored_files,
271
+ failed_files=failed_files or [],
272
+ validation_results=validation_results,
273
+ )
274
+
275
+ except Exception as e:
276
+ logger.error(f"Research integration rollback failed: {str(e)}")
277
+ return RollbackResult(
278
+ success=False,
279
+ rollback_point_id="",
280
+ message=f"Research integration rollback failed: {str(e)}",
281
+ restored_files=[],
282
+ )
283
+
284
+ def list_rollback_points(self, limit: int = 10) -> List[Dict[str, Any]]:
285
+ """
286
+ List available rollback points
287
+
288
+ Args:
289
+ limit: Maximum number of rollback points to return
290
+
291
+ Returns:
292
+ List of rollback point information
293
+ """
294
+ rollback_points = []
295
+
296
+ for rollback_id, rollback_data in self.registry.items():
297
+ rollback_points.append(
298
+ {
299
+ "id": rollback_id,
300
+ "timestamp": rollback_data["timestamp"],
301
+ "description": rollback_data["description"],
302
+ "changes_count": len(rollback_data.get("changes", [])),
303
+ "used": rollback_data.get("used", False),
304
+ }
305
+ )
306
+
307
+ # Sort by timestamp (newest first) and limit
308
+ rollback_points.sort(key=lambda x: x["timestamp"], reverse=True)
309
+ return rollback_points[:limit]
310
+
311
+ def validate_rollback_system(self) -> Dict[str, Any]:
312
+ """
313
+ Validate the rollback system integrity
314
+
315
+ Returns:
316
+ Validation results with system health information
317
+ """
318
+ issues: List[str] = []
319
+ recommendations: List[str] = []
320
+ validation_results = {
321
+ "system_healthy": True,
322
+ "issues": issues,
323
+ "recommendations": recommendations,
324
+ "rollback_points_count": len(self.registry),
325
+ "backup_size": self._calculate_backup_size(),
326
+ "last_rollback": None,
327
+ }
328
+
329
+ try:
330
+ # Check backup directories exist
331
+ required_dirs = [
332
+ self.backup_root,
333
+ self.config_backup_dir,
334
+ self.code_backup_dir,
335
+ self.docs_backup_dir,
336
+ ]
337
+
338
+ for dir_path in required_dirs:
339
+ if not dir_path.exists():
340
+ issues.append(f"Missing backup directory: {dir_path}")
341
+ validation_results["system_healthy"] = False
342
+
343
+ # Validate rollback points
344
+ invalid_rollback_points: List[str] = []
345
+ for rollback_id, rollback_data in self.registry.items():
346
+ backup_path = Path(rollback_data["backup_path"])
347
+ if not backup_path.exists():
348
+ invalid_rollback_points.append(rollback_id)
349
+
350
+ if invalid_rollback_points:
351
+ issues.append(f"Invalid rollback points: {invalid_rollback_points}")
352
+ validation_results["system_healthy"] = False
353
+
354
+ # Check available disk space
355
+ backup_size: int = validation_results["backup_size"] # type: ignore[assignment]
356
+ free_space = shutil.disk_usage(self.backup_root).free
357
+ if backup_size > free_space * 0.8: # Using more than 80% of free space
358
+ recommendations.append("Consider cleaning up old rollback points")
359
+
360
+ # Check last rollback
361
+ if self.registry:
362
+ last_rollback = max(self.registry.values(), key=lambda x: x["timestamp"])
363
+ validation_results["last_rollback"] = last_rollback["timestamp"]
364
+
365
+ except Exception as e:
366
+ validation_results["system_healthy"] = False
367
+ issues.append(f"Validation error: {str(e)}")
368
+
369
+ return validation_results
370
+
371
+ def cleanup_old_rollbacks(self, keep_count: int = 10, dry_run: bool = True) -> Dict[str, Any]:
372
+ """
373
+ Clean up old rollback points
374
+
375
+ Args:
376
+ keep_count: Number of recent rollback points to keep
377
+ dry_run: If True, only show what would be deleted
378
+
379
+ Returns:
380
+ Cleanup operation results
381
+ """
382
+ rollback_points = list(self.registry.values())
383
+ rollback_points.sort(key=lambda x: x["timestamp"], reverse=True)
384
+
385
+ # Keep the most recent rollback points
386
+ to_keep = rollback_points[:keep_count]
387
+ to_delete = rollback_points[keep_count:]
388
+
389
+ if dry_run:
390
+ return {
391
+ "dry_run": True,
392
+ "would_delete_count": len(to_delete),
393
+ "would_keep_count": len(to_keep),
394
+ "would_free_space": sum(self._get_directory_size(Path(rp["backup_path"])) for rp in to_delete),
395
+ }
396
+
397
+ # Perform actual cleanup
398
+ deleted_count = 0
399
+ freed_space = 0
400
+
401
+ for rollback_point in to_delete:
402
+ try:
403
+ backup_path = Path(rollback_point["backup_path"])
404
+ if backup_path.exists():
405
+ size = self._get_directory_size(backup_path)
406
+ shutil.rmtree(backup_path)
407
+ freed_space += size
408
+
409
+ # Remove from registry
410
+ del self.registry[rollback_point["id"]]
411
+ deleted_count += 1
412
+
413
+ except Exception as e:
414
+ logger.warning(f"Failed to delete rollback point {rollback_point['id']}: {str(e)}")
415
+
416
+ # Save updated registry
417
+ self._save_registry()
418
+
419
+ return {
420
+ "dry_run": False,
421
+ "deleted_count": deleted_count,
422
+ "kept_count": len(to_keep),
423
+ "freed_space": freed_space,
424
+ }
425
+
426
+ def _generate_rollback_id(self) -> str:
427
+ """Generate unique rollback point ID"""
428
+ timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
429
+ random_suffix = hashlib.md5(os.urandom(4), usedforsecurity=False).hexdigest()[:8]
430
+ return f"rollback_{timestamp}_{random_suffix}"
431
+
432
+ def _load_registry(self) -> Dict[str, Any]:
433
+ """Load rollback registry from file"""
434
+ if self.registry_file.exists():
435
+ try:
436
+ with open(self.registry_file, "r", encoding="utf-8") as f:
437
+ return json.load(f)
438
+ except Exception as e:
439
+ logger.warning(f"Failed to load rollback registry: {str(e)}")
440
+
441
+ return {}
442
+
443
+ def _save_registry(self):
444
+ """Save rollback registry to file"""
445
+ try:
446
+ with open(self.registry_file, "w", encoding="utf-8") as f:
447
+ json.dump(self.registry, f, indent=2, default=str, ensure_ascii=False)
448
+ except Exception as e:
449
+ logger.error(f"Failed to save rollback registry: {str(e)}")
450
+ raise
451
+
452
+ def _backup_configuration(self, rollback_dir: Path) -> str:
453
+ """Backup configuration files"""
454
+ config_backup_path = rollback_dir / "config"
455
+ config_backup_path.mkdir(parents=True, exist_ok=True)
456
+
457
+ # Backup .moai/config/config.json
458
+ config_file = self.project_root / ".moai" / "config" / "config.json"
459
+ if config_file.exists():
460
+ shutil.copy2(config_file, config_backup_path / "config.json")
461
+
462
+ # Backup .claude/settings.json
463
+ settings_file = self.project_root / ".claude" / "settings.json"
464
+ if settings_file.exists():
465
+ shutil.copy2(settings_file, config_backup_path / "settings.json")
466
+
467
+ # Backup .claude/settings.local.json
468
+ local_settings_file = self.project_root / ".claude" / "settings.local.json"
469
+ if local_settings_file.exists():
470
+ shutil.copy2(local_settings_file, config_backup_path / "settings.local.json")
471
+
472
+ return str(config_backup_path)
473
+
474
+ def _backup_research_components(self, rollback_dir: Path) -> str:
475
+ """Backup research-specific components"""
476
+ research_backup_path = rollback_dir / "research"
477
+ research_backup_path.mkdir(parents=True, exist_ok=True)
478
+
479
+ for research_dir in self.research_dirs:
480
+ if research_dir.exists():
481
+ dir_name = research_dir.name
482
+ target_dir = research_backup_path / dir_name
483
+ shutil.copytree(research_dir, target_dir, dirs_exist_ok=True)
484
+
485
+ return str(research_backup_path)
486
+
487
+ def _backup_code_files(self, rollback_dir: Path) -> str:
488
+ """Backup important code files"""
489
+ code_backup_path = rollback_dir / "code"
490
+ code_backup_path.mkdir(parents=True, exist_ok=True)
491
+
492
+ # Backup source code
493
+ src_dir = self.project_root / "src"
494
+ if src_dir.exists():
495
+ shutil.copytree(src_dir, code_backup_path / "src", dirs_exist_ok=True)
496
+
497
+ # Backup tests
498
+ tests_dir = self.project_root / "tests"
499
+ if tests_dir.exists():
500
+ shutil.copytree(tests_dir, code_backup_path / "tests", dirs_exist_ok=True)
501
+
502
+ # Backup documentation
503
+ docs_dir = self.project_root / "docs"
504
+ if docs_dir.exists():
505
+ shutil.copytree(docs_dir, code_backup_path / "docs", dirs_exist_ok=True)
506
+
507
+ return str(code_backup_path)
508
+
509
+ def _calculate_backup_checksum(self, backup_dir: Path) -> str:
510
+ """Calculate checksum for backup integrity verification"""
511
+ checksum_hash = hashlib.sha256()
512
+
513
+ for file_path in backup_dir.rglob("*"):
514
+ if file_path.is_file():
515
+ with open(file_path, "rb") as f:
516
+ # Update hash with file content and path
517
+ checksum_hash.update(f.read())
518
+ checksum_hash.update(str(file_path.relative_to(backup_dir)).encode())
519
+
520
+ return checksum_hash.hexdigest()
521
+
522
+ def _validate_rollback_point(self, rollback_point: RollbackPoint) -> Dict[str, Any]:
523
+ """Validate rollback point before restoration"""
524
+ warnings: List[str] = []
525
+ validation_result = {
526
+ "valid": True,
527
+ "message": "Rollback point is valid",
528
+ "warnings": warnings,
529
+ }
530
+
531
+ try:
532
+ # Check backup directory exists
533
+ backup_path = Path(rollback_point.backup_path)
534
+ if not backup_path.exists():
535
+ validation_result["valid"] = False
536
+ validation_result["message"] = "Backup directory not found"
537
+ return validation_result
538
+
539
+ # Verify checksum
540
+ current_checksum = self._calculate_backup_checksum(backup_path)
541
+ if current_checksum != rollback_point.checksum:
542
+ warnings.append("Backup checksum mismatch - possible corruption")
543
+
544
+ # Check essential files exist
545
+ required_files = [
546
+ backup_path / "config" / "config.json",
547
+ backup_path / "research",
548
+ ]
549
+
550
+ missing_files = [f for f in required_files if not f.exists()]
551
+ if missing_files:
552
+ warnings.append(f"Missing backup files: {missing_files}")
553
+
554
+ except Exception as e:
555
+ validation_result["valid"] = False
556
+ validation_result["message"] = f"Validation error: {str(e)}"
557
+
558
+ return validation_result
559
+
560
+ def _perform_rollback(self, rollback_point: RollbackPoint) -> Tuple[List[str], List[str]]:
561
+ """Perform the actual rollback operation"""
562
+ backup_path = Path(rollback_point.backup_path)
563
+ restored_files: List[str] = []
564
+ failed_files: List[str] = []
565
+
566
+ try:
567
+ # Restore configuration
568
+ config_backup = backup_path / "config"
569
+ if config_backup.exists():
570
+ for config_file in config_backup.rglob("*"):
571
+ if config_file.is_file():
572
+ target_path = self.project_root / ".moai" / config_file.relative_to(config_backup)
573
+ target_path.parent.mkdir(parents=True, exist_ok=True)
574
+ try:
575
+ shutil.copy2(config_file, target_path)
576
+ restored_files.append(str(target_path))
577
+ except Exception as e:
578
+ failed_files.append(f"{target_path}: {str(e)}")
579
+
580
+ # Restore research components
581
+ research_backup = backup_path / "research"
582
+ if research_backup.exists():
583
+ for research_file in research_backup.rglob("*"):
584
+ if research_file.is_file():
585
+ target_path = self.project_root / research_file.relative_to(research_backup)
586
+ target_path.parent.mkdir(parents=True, exist_ok=True)
587
+ try:
588
+ shutil.copy2(research_file, target_path)
589
+ restored_files.append(str(target_path))
590
+ except Exception as e:
591
+ failed_files.append(f"{target_path}: {str(e)}")
592
+
593
+ # Restore code files
594
+ code_backup = backup_path / "code"
595
+ if code_backup.exists():
596
+ for code_file in code_backup.rglob("*"):
597
+ if code_file.is_file():
598
+ target_path = self.project_root / code_file.relative_to(code_backup)
599
+ target_path.parent.mkdir(parents=True, exist_ok=True)
600
+ try:
601
+ shutil.copy2(code_file, target_path)
602
+ restored_files.append(str(target_path))
603
+ except Exception as e:
604
+ failed_files.append(f"{target_path}: {str(e)}")
605
+
606
+ except Exception as e:
607
+ logger.error(f"Rollback operation failed: {str(e)}")
608
+ failed_files.append(f"rollback_operation: {str(e)}")
609
+
610
+ return restored_files, failed_files
611
+
612
+ def _perform_research_rollback(
613
+ self,
614
+ rollback_point: Dict[str, Any],
615
+ component_type: str = None,
616
+ component_name: str = None,
617
+ ) -> Tuple[List[str], List[str]]:
618
+ """Perform targeted research component rollback"""
619
+ backup_path = Path(rollback_point["backup_path"])
620
+ research_backup = backup_path / "research"
621
+
622
+ restored_files: List[str] = []
623
+ failed_files: List[str] = []
624
+
625
+ if not research_backup.exists():
626
+ failed_files.append("research_backup: Research backup not found")
627
+ return restored_files, failed_files
628
+
629
+ try:
630
+ # Restore specific component or all research components
631
+ if component_type:
632
+ component_backup_dir = research_backup / component_type
633
+ if component_backup_dir.exists():
634
+ target_dir = self.project_root / ".claude" / component_type
635
+
636
+ if component_name:
637
+ # Restore specific component
638
+ component_file = component_backup_dir / f"{component_name}.md"
639
+ if component_file.exists():
640
+ target_file = target_dir / f"{component_name}.md"
641
+ target_file.parent.mkdir(parents=True, exist_ok=True)
642
+ shutil.copy2(component_file, target_file)
643
+ restored_files.append(str(target_file))
644
+ else:
645
+ failed_files.append(f"{component_name}: Component file not found in backup")
646
+ else:
647
+ # Restore entire component type
648
+ if target_dir.exists():
649
+ shutil.rmtree(target_dir)
650
+ shutil.copytree(component_backup_dir, target_dir)
651
+ restored_files.append(str(target_dir))
652
+ else:
653
+ failed_files.append(f"{component_type}: Component type not found in backup")
654
+ else:
655
+ # Restore all research components
656
+ for research_dir in research_backup.iterdir():
657
+ if research_dir.is_dir():
658
+ target_dir = self.project_root / ".claude" / research_dir.name
659
+ if target_dir.exists():
660
+ shutil.rmtree(target_dir)
661
+ shutil.copytree(research_dir, target_dir)
662
+ restored_files.append(str(target_dir))
663
+
664
+ except Exception as e:
665
+ logger.error(f"Research rollback failed: {str(e)}")
666
+ failed_files.append(f"research_rollback: {str(e)}")
667
+
668
+ return restored_files, failed_files
669
+
670
+ def _validate_system_after_rollback(self) -> Dict[str, Any]:
671
+ """Validate system state after rollback"""
672
+ issues: List[str] = []
673
+ validation_results = {
674
+ "config_valid": True,
675
+ "research_valid": True,
676
+ "issues": issues,
677
+ }
678
+
679
+ try:
680
+ # Validate configuration
681
+ config_file = self.project_root / ".moai" / "config" / "config.json"
682
+ if config_file.exists():
683
+ try:
684
+ with open(config_file, "r", encoding="utf-8") as f:
685
+ json.load(f) # Validate JSON syntax
686
+ except json.JSONDecodeError:
687
+ validation_results["config_valid"] = False
688
+ issues.append("Invalid JSON in config.json")
689
+ else:
690
+ validation_results["config_valid"] = False
691
+ issues.append("config.json not found")
692
+
693
+ # Validate research components
694
+ for research_dir in self.research_dirs:
695
+ if research_dir.exists():
696
+ # Check for readable files
697
+ for file_path in research_dir.rglob("*.md"):
698
+ try:
699
+ with open(file_path, "r", encoding="utf-8") as f:
700
+ f.read() # Validate file can be read
701
+ except Exception as e:
702
+ validation_results["research_valid"] = False
703
+ issues.append(f"Cannot read {file_path}: {str(e)}")
704
+
705
+ except Exception as e:
706
+ issues.append(f"Validation error: {str(e)}")
707
+
708
+ return validation_results
709
+
710
+ def _validate_research_components(self) -> Dict[str, Any]:
711
+ """Validate research components after rollback"""
712
+ issues: List[str] = []
713
+ validation_results = {
714
+ "skills_valid": True,
715
+ "agents_valid": True,
716
+ "commands_valid": True,
717
+ "hooks_valid": True,
718
+ "issues": issues,
719
+ }
720
+
721
+ component_checks = [
722
+ ("skills", "Skills", self.project_root / ".claude" / "skills"),
723
+ ("agents", "Agents", self.project_root / ".claude" / "agents"),
724
+ ("commands", "Commands", self.project_root / ".claude" / "commands"),
725
+ ("hooks", "Hooks", self.project_root / ".claude" / "hooks"),
726
+ ]
727
+
728
+ for component_key, component_name, component_path in component_checks:
729
+ if component_path.exists():
730
+ # Check component structure
731
+ files = list(component_path.rglob("*.md"))
732
+ if not files:
733
+ validation_results[f"{component_key}_valid"] = False
734
+ issues.append(f"{component_name} directory is empty")
735
+
736
+ # Validate file content
737
+ for file_path in files[:5]: # Check first 5 files
738
+ try:
739
+ with open(file_path, "r", encoding="utf-8") as f:
740
+ content = f.read()
741
+ if not content.strip():
742
+ validation_results[f"{component_key}_valid"] = False
743
+ issues.append(f"Empty file: {file_path}")
744
+ except Exception as e:
745
+ validation_results[f"{component_key}_valid"] = False
746
+ issues.append(f"Cannot read {file_path}: {str(e)}")
747
+ else:
748
+ validation_results[f"{component_key}_valid"] = False
749
+ issues.append(f"{component_name} directory not found")
750
+
751
+ return validation_results
752
+
753
+ def _find_research_rollback_points(
754
+ self, component_type: str = None, component_name: str = None
755
+ ) -> List[Dict[str, Any]]:
756
+ """Find rollback points related to research integration"""
757
+ research_rollback_points = []
758
+
759
+ for rollback_id, rollback_data in self.registry.items():
760
+ # Check if rollback point has research backup
761
+ backup_path = Path(rollback_data["backup_path"])
762
+ research_backup = backup_path / "research"
763
+
764
+ if not research_backup.exists():
765
+ continue
766
+
767
+ # Check for specific component match
768
+ if component_type:
769
+ component_backup = research_backup / component_type
770
+ if component_backup.exists():
771
+ if component_name:
772
+ component_file = component_backup / f"{component_name}.md"
773
+ if component_file.exists():
774
+ research_rollback_points.append(rollback_data)
775
+ else:
776
+ research_rollback_points.append(rollback_data)
777
+ else:
778
+ # Include any rollback with research components
779
+ research_rollback_points.append(rollback_data)
780
+
781
+ return research_rollback_points
782
+
783
+ def _mark_rollback_as_used(self, rollback_id: str):
784
+ """Mark rollback point as used in registry"""
785
+ if rollback_id in self.registry:
786
+ self.registry[rollback_id]["used"] = True
787
+ self.registry[rollback_id]["used_timestamp"] = datetime.now(timezone.utc).isoformat()
788
+ self._save_registry()
789
+
790
+ def _cleanup_partial_backup(self, rollback_id: str):
791
+ """Clean up partial backup if creation failed"""
792
+ try:
793
+ backup_dir = self.backup_root / rollback_id
794
+ if backup_dir.exists():
795
+ shutil.rmtree(backup_dir)
796
+ except Exception as e:
797
+ logger.warning(f"Failed to cleanup partial backup {rollback_id}: {str(e)}")
798
+
799
+ def _calculate_backup_size(self) -> int:
800
+ """Calculate total size of all backups"""
801
+ total_size = 0
802
+ for rollback_id, rollback_data in self.registry.items():
803
+ backup_path = Path(rollback_data["backup_path"])
804
+ if backup_path.exists():
805
+ total_size += self._get_directory_size(backup_path)
806
+ return total_size
807
+
808
+ def _get_directory_size(self, directory: Path) -> int:
809
+ """Get total size of directory in bytes"""
810
+ total_size = 0
811
+ try:
812
+ for file_path in directory.rglob("*"):
813
+ if file_path.is_file():
814
+ total_size += file_path.stat().st_size
815
+ except Exception:
816
+ pass # Ignore errors in size calculation
817
+ return total_size
818
+
819
+
820
+ # Command-line interface for rollback manager
821
+ def main():
822
+ """Command-line interface for rollback operations"""
823
+ import argparse
824
+
825
+ parser = argparse.ArgumentParser(description="MoAI-ADK Rollback Manager")
826
+ subparsers = parser.add_subparsers(dest="command", help="Available commands")
827
+
828
+ # Create rollback point
829
+ create_parser = subparsers.add_parser("create", help="Create rollback point")
830
+ create_parser.add_argument("description", help="Description of changes")
831
+ create_parser.add_argument("--changes", nargs="*", help="List of changes")
832
+
833
+ # List rollback points
834
+ list_parser = subparsers.add_parser("list", help="List rollback points")
835
+ list_parser.add_argument("--limit", type=int, default=10, help="Maximum number to show")
836
+
837
+ # Perform rollback
838
+ rollback_parser = subparsers.add_parser("rollback", help="Rollback to point")
839
+ rollback_parser.add_argument("rollback_id", help="Rollback point ID")
840
+ rollback_parser.add_argument("--no-validate", action="store_true", help="Skip validation")
841
+
842
+ # Research rollback
843
+ research_parser = subparsers.add_parser("research-rollback", help="Rollback research components")
844
+ research_parser.add_argument("--type", help="Component type (skills, agents, commands, hooks)")
845
+ research_parser.add_argument("--name", help="Component name")
846
+
847
+ # Validate system
848
+ subparsers.add_parser("validate", help="Validate rollback system")
849
+
850
+ # Cleanup
851
+ cleanup_parser = subparsers.add_parser("cleanup", help="Cleanup old rollback points")
852
+ cleanup_parser.add_argument("--keep", type=int, default=10, help="Number to keep")
853
+ cleanup_parser.add_argument("--execute", action="store_true", help="Execute cleanup (default: dry run)")
854
+
855
+ args = parser.parse_args()
856
+
857
+ if not args.command:
858
+ parser.print_help()
859
+ return
860
+
861
+ # Initialize rollback manager
862
+ rollback_manager = RollbackManager()
863
+
864
+ try:
865
+ if args.command == "create":
866
+ rollback_id = rollback_manager.create_rollback_point(args.description, args.changes)
867
+ print(f"Rollback point created: {rollback_id}")
868
+
869
+ elif args.command == "list":
870
+ rollback_points = rollback_manager.list_rollback_points(args.limit)
871
+ print(f"Available rollback points (showing {len(rollback_points)}):")
872
+ for rp in rollback_points:
873
+ status = "USED" if rp["used"] else "AVAILABLE"
874
+ print(f" {rp['id']} - {rp['description']} ({status})")
875
+
876
+ elif args.command == "rollback":
877
+ result = rollback_manager.rollback_to_point(args.rollback_id, validate_before=not args.no_validate)
878
+ if result.success:
879
+ print("Rollback completed successfully")
880
+ print(f"Restored {len(result.restored_files)} files")
881
+ else:
882
+ print(f"Rollback failed: {result.message}")
883
+
884
+ elif args.command == "research-rollback":
885
+ result = rollback_manager.rollback_research_integration(args.type, args.name)
886
+ if result.success:
887
+ print("Research rollback completed successfully")
888
+ else:
889
+ print(f"Research rollback failed: {result.message}")
890
+
891
+ elif args.command == "validate":
892
+ validation = rollback_manager.validate_rollback_system()
893
+ print(f"Rollback system health: {'HEALTHY' if validation['system_healthy'] else 'UNHEALTHY'}")
894
+ if validation["issues"]:
895
+ print("Issues found:")
896
+ for issue in validation["issues"]:
897
+ print(f" - {issue}")
898
+ if validation["recommendations"]:
899
+ print("Recommendations:")
900
+ for rec in validation["recommendations"]:
901
+ print(f" - {rec}")
902
+
903
+ elif args.command == "cleanup":
904
+ result = rollback_manager.cleanup_old_rollbacks(args.keep, dry_run=not args.execute)
905
+ if result["dry_run"]:
906
+ print(f"Dry run: Would delete {result['would_delete_count']} rollback points")
907
+ print(f"Would free {result['would_free_space'] / 1024 / 1024:.1f} MB")
908
+ else:
909
+ print(f"Deleted {result['deleted_count']} rollback points")
910
+ print(f"Freed {result['freed_space'] / 1024 / 1024:.1f} MB")
911
+
912
+ except Exception as e:
913
+ print(f"Error: {str(e)}")
914
+ sys.exit(1)
915
+
916
+
917
+ if __name__ == "__main__":
918
+ main()