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
@@ -224,9 +224,7 @@ class RollbackManager:
224
224
  restored_files=[],
225
225
  )
226
226
 
227
- def rollback_research_integration(
228
- self, component_type: str = None, component_name: str = None
229
- ) -> RollbackResult:
227
+ def rollback_research_integration(self, component_type: str = None, component_name: str = None) -> RollbackResult:
230
228
  """
231
229
  Specialized rollback for research integration changes
232
230
 
@@ -237,15 +235,11 @@ class RollbackManager:
237
235
  Returns:
238
236
  RollbackResult with operation details
239
237
  """
240
- logger.info(
241
- f"Rolling back research integration: {component_type}:{component_name}"
242
- )
238
+ logger.info(f"Rolling back research integration: {component_type}:{component_name}")
243
239
 
244
240
  try:
245
241
  # Find relevant rollback points for research integration
246
- research_rollback_points = self._find_research_rollback_points(
247
- component_type, component_name
248
- )
242
+ research_rollback_points = self._find_research_rollback_points(component_type, component_name)
249
243
 
250
244
  if not research_rollback_points:
251
245
  return RollbackResult(
@@ -256,9 +250,7 @@ class RollbackManager:
256
250
  )
257
251
 
258
252
  # Use the most recent suitable rollback point
259
- latest_rollback = max(
260
- research_rollback_points, key=lambda x: x["timestamp"]
261
- )
253
+ latest_rollback = max(research_rollback_points, key=lambda x: x["timestamp"])
262
254
 
263
255
  # Perform targeted rollback
264
256
  restored_files, failed_files = self._perform_research_rollback(
@@ -273,7 +265,8 @@ class RollbackManager:
273
265
  return RollbackResult(
274
266
  success=success,
275
267
  rollback_point_id=latest_rollback["id"],
276
- message=f"Research integration rollback {'completed successfully' if success else 'completed with errors'}",
268
+ message=f"Research integration rollback "
269
+ f"{'completed successfully' if success else 'completed with errors'}",
277
270
  restored_files=restored_files,
278
271
  failed_files=failed_files or [],
279
272
  validation_results=validation_results,
@@ -322,10 +315,12 @@ class RollbackManager:
322
315
  Returns:
323
316
  Validation results with system health information
324
317
  """
318
+ issues: List[str] = []
319
+ recommendations: List[str] = []
325
320
  validation_results = {
326
321
  "system_healthy": True,
327
- "issues": [],
328
- "recommendations": [],
322
+ "issues": issues,
323
+ "recommendations": recommendations,
329
324
  "rollback_points_count": len(self.registry),
330
325
  "backup_size": self._calculate_backup_size(),
331
326
  "last_rollback": None,
@@ -342,48 +337,38 @@ class RollbackManager:
342
337
 
343
338
  for dir_path in required_dirs:
344
339
  if not dir_path.exists():
345
- validation_results["issues"].append(
346
- f"Missing backup directory: {dir_path}"
347
- )
340
+ issues.append(f"Missing backup directory: {dir_path}")
348
341
  validation_results["system_healthy"] = False
349
342
 
350
343
  # Validate rollback points
351
- invalid_rollback_points = []
344
+ invalid_rollback_points: List[str] = []
352
345
  for rollback_id, rollback_data in self.registry.items():
353
346
  backup_path = Path(rollback_data["backup_path"])
354
347
  if not backup_path.exists():
355
348
  invalid_rollback_points.append(rollback_id)
356
349
 
357
350
  if invalid_rollback_points:
358
- validation_results["issues"].append(
359
- f"Invalid rollback points: {invalid_rollback_points}"
360
- )
351
+ issues.append(f"Invalid rollback points: {invalid_rollback_points}")
361
352
  validation_results["system_healthy"] = False
362
353
 
363
354
  # Check available disk space
364
- backup_size = validation_results["backup_size"]
355
+ backup_size: int = validation_results["backup_size"] # type: ignore[assignment]
365
356
  free_space = shutil.disk_usage(self.backup_root).free
366
357
  if backup_size > free_space * 0.8: # Using more than 80% of free space
367
- validation_results["recommendations"].append(
368
- "Consider cleaning up old rollback points"
369
- )
358
+ recommendations.append("Consider cleaning up old rollback points")
370
359
 
371
360
  # Check last rollback
372
361
  if self.registry:
373
- last_rollback = max(
374
- self.registry.values(), key=lambda x: x["timestamp"]
375
- )
362
+ last_rollback = max(self.registry.values(), key=lambda x: x["timestamp"])
376
363
  validation_results["last_rollback"] = last_rollback["timestamp"]
377
364
 
378
365
  except Exception as e:
379
366
  validation_results["system_healthy"] = False
380
- validation_results["issues"].append(f"Validation error: {str(e)}")
367
+ issues.append(f"Validation error: {str(e)}")
381
368
 
382
369
  return validation_results
383
370
 
384
- def cleanup_old_rollbacks(
385
- self, keep_count: int = 10, dry_run: bool = True
386
- ) -> Dict[str, Any]:
371
+ def cleanup_old_rollbacks(self, keep_count: int = 10, dry_run: bool = True) -> Dict[str, Any]:
387
372
  """
388
373
  Clean up old rollback points
389
374
 
@@ -406,10 +391,7 @@ class RollbackManager:
406
391
  "dry_run": True,
407
392
  "would_delete_count": len(to_delete),
408
393
  "would_keep_count": len(to_keep),
409
- "would_free_space": sum(
410
- self._get_directory_size(Path(rp["backup_path"]))
411
- for rp in to_delete
412
- ),
394
+ "would_free_space": sum(self._get_directory_size(Path(rp["backup_path"])) for rp in to_delete),
413
395
  }
414
396
 
415
397
  # Perform actual cleanup
@@ -429,9 +411,7 @@ class RollbackManager:
429
411
  deleted_count += 1
430
412
 
431
413
  except Exception as e:
432
- logger.warning(
433
- f"Failed to delete rollback point {rollback_point['id']}: {str(e)}"
434
- )
414
+ logger.warning(f"Failed to delete rollback point {rollback_point['id']}: {str(e)}")
435
415
 
436
416
  # Save updated registry
437
417
  self._save_registry()
@@ -446,14 +426,14 @@ class RollbackManager:
446
426
  def _generate_rollback_id(self) -> str:
447
427
  """Generate unique rollback point ID"""
448
428
  timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
449
- random_suffix = hashlib.md5(os.urandom(4)).hexdigest()[:8]
429
+ random_suffix = hashlib.md5(os.urandom(4), usedforsecurity=False).hexdigest()[:8]
450
430
  return f"rollback_{timestamp}_{random_suffix}"
451
431
 
452
432
  def _load_registry(self) -> Dict[str, Any]:
453
433
  """Load rollback registry from file"""
454
434
  if self.registry_file.exists():
455
435
  try:
456
- with open(self.registry_file, "r") as f:
436
+ with open(self.registry_file, "r", encoding="utf-8") as f:
457
437
  return json.load(f)
458
438
  except Exception as e:
459
439
  logger.warning(f"Failed to load rollback registry: {str(e)}")
@@ -463,8 +443,8 @@ class RollbackManager:
463
443
  def _save_registry(self):
464
444
  """Save rollback registry to file"""
465
445
  try:
466
- with open(self.registry_file, "w") as f:
467
- json.dump(self.registry, f, indent=2, default=str)
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)
468
448
  except Exception as e:
469
449
  logger.error(f"Failed to save rollback registry: {str(e)}")
470
450
  raise
@@ -487,9 +467,7 @@ class RollbackManager:
487
467
  # Backup .claude/settings.local.json
488
468
  local_settings_file = self.project_root / ".claude" / "settings.local.json"
489
469
  if local_settings_file.exists():
490
- shutil.copy2(
491
- local_settings_file, config_backup_path / "settings.local.json"
492
- )
470
+ shutil.copy2(local_settings_file, config_backup_path / "settings.local.json")
493
471
 
494
472
  return str(config_backup_path)
495
473
 
@@ -537,18 +515,17 @@ class RollbackManager:
537
515
  with open(file_path, "rb") as f:
538
516
  # Update hash with file content and path
539
517
  checksum_hash.update(f.read())
540
- checksum_hash.update(
541
- str(file_path.relative_to(backup_dir)).encode()
542
- )
518
+ checksum_hash.update(str(file_path.relative_to(backup_dir)).encode())
543
519
 
544
520
  return checksum_hash.hexdigest()
545
521
 
546
522
  def _validate_rollback_point(self, rollback_point: RollbackPoint) -> Dict[str, Any]:
547
523
  """Validate rollback point before restoration"""
524
+ warnings: List[str] = []
548
525
  validation_result = {
549
526
  "valid": True,
550
527
  "message": "Rollback point is valid",
551
- "warnings": [],
528
+ "warnings": warnings,
552
529
  }
553
530
 
554
531
  try:
@@ -562,9 +539,7 @@ class RollbackManager:
562
539
  # Verify checksum
563
540
  current_checksum = self._calculate_backup_checksum(backup_path)
564
541
  if current_checksum != rollback_point.checksum:
565
- validation_result["warnings"].append(
566
- "Backup checksum mismatch - possible corruption"
567
- )
542
+ warnings.append("Backup checksum mismatch - possible corruption")
568
543
 
569
544
  # Check essential files exist
570
545
  required_files = [
@@ -574,9 +549,7 @@ class RollbackManager:
574
549
 
575
550
  missing_files = [f for f in required_files if not f.exists()]
576
551
  if missing_files:
577
- validation_result["warnings"].append(
578
- f"Missing backup files: {missing_files}"
579
- )
552
+ warnings.append(f"Missing backup files: {missing_files}")
580
553
 
581
554
  except Exception as e:
582
555
  validation_result["valid"] = False
@@ -584,13 +557,11 @@ class RollbackManager:
584
557
 
585
558
  return validation_result
586
559
 
587
- def _perform_rollback(
588
- self, rollback_point: RollbackPoint
589
- ) -> Tuple[List[str], List[str]]:
560
+ def _perform_rollback(self, rollback_point: RollbackPoint) -> Tuple[List[str], List[str]]:
590
561
  """Perform the actual rollback operation"""
591
562
  backup_path = Path(rollback_point.backup_path)
592
- restored_files = []
593
- failed_files = []
563
+ restored_files: List[str] = []
564
+ failed_files: List[str] = []
594
565
 
595
566
  try:
596
567
  # Restore configuration
@@ -598,51 +569,43 @@ class RollbackManager:
598
569
  if config_backup.exists():
599
570
  for config_file in config_backup.rglob("*"):
600
571
  if config_file.is_file():
601
- target_path = (
602
- self.project_root
603
- / ".moai"
604
- / config_file.relative_to(config_backup)
605
- )
572
+ target_path = self.project_root / ".moai" / config_file.relative_to(config_backup)
606
573
  target_path.parent.mkdir(parents=True, exist_ok=True)
607
574
  try:
608
575
  shutil.copy2(config_file, target_path)
609
576
  restored_files.append(str(target_path))
610
577
  except Exception as e:
611
- failed_files.append((str(target_path), str(e)))
578
+ failed_files.append(f"{target_path}: {str(e)}")
612
579
 
613
580
  # Restore research components
614
581
  research_backup = backup_path / "research"
615
582
  if research_backup.exists():
616
583
  for research_file in research_backup.rglob("*"):
617
584
  if research_file.is_file():
618
- target_path = self.project_root / research_file.relative_to(
619
- research_backup
620
- )
585
+ target_path = self.project_root / research_file.relative_to(research_backup)
621
586
  target_path.parent.mkdir(parents=True, exist_ok=True)
622
587
  try:
623
588
  shutil.copy2(research_file, target_path)
624
589
  restored_files.append(str(target_path))
625
590
  except Exception as e:
626
- failed_files.append((str(target_path), str(e)))
591
+ failed_files.append(f"{target_path}: {str(e)}")
627
592
 
628
593
  # Restore code files
629
594
  code_backup = backup_path / "code"
630
595
  if code_backup.exists():
631
596
  for code_file in code_backup.rglob("*"):
632
597
  if code_file.is_file():
633
- target_path = self.project_root / code_file.relative_to(
634
- code_backup
635
- )
598
+ target_path = self.project_root / code_file.relative_to(code_backup)
636
599
  target_path.parent.mkdir(parents=True, exist_ok=True)
637
600
  try:
638
601
  shutil.copy2(code_file, target_path)
639
602
  restored_files.append(str(target_path))
640
603
  except Exception as e:
641
- failed_files.append((str(target_path), str(e)))
604
+ failed_files.append(f"{target_path}: {str(e)}")
642
605
 
643
606
  except Exception as e:
644
607
  logger.error(f"Rollback operation failed: {str(e)}")
645
- failed_files.append(("rollback_operation", str(e)))
608
+ failed_files.append(f"rollback_operation: {str(e)}")
646
609
 
647
610
  return restored_files, failed_files
648
611
 
@@ -656,11 +619,11 @@ class RollbackManager:
656
619
  backup_path = Path(rollback_point["backup_path"])
657
620
  research_backup = backup_path / "research"
658
621
 
659
- restored_files = []
660
- failed_files = []
622
+ restored_files: List[str] = []
623
+ failed_files: List[str] = []
661
624
 
662
625
  if not research_backup.exists():
663
- failed_files.append(("research_backup", "Research backup not found"))
626
+ failed_files.append("research_backup: Research backup not found")
664
627
  return restored_files, failed_files
665
628
 
666
629
  try:
@@ -679,9 +642,7 @@ class RollbackManager:
679
642
  shutil.copy2(component_file, target_file)
680
643
  restored_files.append(str(target_file))
681
644
  else:
682
- failed_files.append(
683
- (component_name, "Component file not found in backup")
684
- )
645
+ failed_files.append(f"{component_name}: Component file not found in backup")
685
646
  else:
686
647
  # Restore entire component type
687
648
  if target_dir.exists():
@@ -689,9 +650,7 @@ class RollbackManager:
689
650
  shutil.copytree(component_backup_dir, target_dir)
690
651
  restored_files.append(str(target_dir))
691
652
  else:
692
- failed_files.append(
693
- (component_type, "Component type not found in backup")
694
- )
653
+ failed_files.append(f"{component_type}: Component type not found in backup")
695
654
  else:
696
655
  # Restore all research components
697
656
  for research_dir in research_backup.iterdir():
@@ -704,16 +663,17 @@ class RollbackManager:
704
663
 
705
664
  except Exception as e:
706
665
  logger.error(f"Research rollback failed: {str(e)}")
707
- failed_files.append(("research_rollback", str(e)))
666
+ failed_files.append(f"research_rollback: {str(e)}")
708
667
 
709
668
  return restored_files, failed_files
710
669
 
711
670
  def _validate_system_after_rollback(self) -> Dict[str, Any]:
712
671
  """Validate system state after rollback"""
672
+ issues: List[str] = []
713
673
  validation_results = {
714
674
  "config_valid": True,
715
675
  "research_valid": True,
716
- "issues": [],
676
+ "issues": issues,
717
677
  }
718
678
 
719
679
  try:
@@ -721,14 +681,14 @@ class RollbackManager:
721
681
  config_file = self.project_root / ".moai" / "config" / "config.json"
722
682
  if config_file.exists():
723
683
  try:
724
- with open(config_file, "r") as f:
684
+ with open(config_file, "r", encoding="utf-8") as f:
725
685
  json.load(f) # Validate JSON syntax
726
686
  except json.JSONDecodeError:
727
687
  validation_results["config_valid"] = False
728
- validation_results["issues"].append("Invalid JSON in config.json")
688
+ issues.append("Invalid JSON in config.json")
729
689
  else:
730
690
  validation_results["config_valid"] = False
731
- validation_results["issues"].append("config.json not found")
691
+ issues.append("config.json not found")
732
692
 
733
693
  # Validate research components
734
694
  for research_dir in self.research_dirs:
@@ -740,23 +700,22 @@ class RollbackManager:
740
700
  f.read() # Validate file can be read
741
701
  except Exception as e:
742
702
  validation_results["research_valid"] = False
743
- validation_results["issues"].append(
744
- f"Cannot read {file_path}: {str(e)}"
745
- )
703
+ issues.append(f"Cannot read {file_path}: {str(e)}")
746
704
 
747
705
  except Exception as e:
748
- validation_results["issues"].append(f"Validation error: {str(e)}")
706
+ issues.append(f"Validation error: {str(e)}")
749
707
 
750
708
  return validation_results
751
709
 
752
710
  def _validate_research_components(self) -> Dict[str, Any]:
753
711
  """Validate research components after rollback"""
712
+ issues: List[str] = []
754
713
  validation_results = {
755
714
  "skills_valid": True,
756
715
  "agents_valid": True,
757
716
  "commands_valid": True,
758
717
  "hooks_valid": True,
759
- "issues": [],
718
+ "issues": issues,
760
719
  }
761
720
 
762
721
  component_checks = [
@@ -772,9 +731,7 @@ class RollbackManager:
772
731
  files = list(component_path.rglob("*.md"))
773
732
  if not files:
774
733
  validation_results[f"{component_key}_valid"] = False
775
- validation_results["issues"].append(
776
- f"{component_name} directory is empty"
777
- )
734
+ issues.append(f"{component_name} directory is empty")
778
735
 
779
736
  # Validate file content
780
737
  for file_path in files[:5]: # Check first 5 files
@@ -783,19 +740,13 @@ class RollbackManager:
783
740
  content = f.read()
784
741
  if not content.strip():
785
742
  validation_results[f"{component_key}_valid"] = False
786
- validation_results["issues"].append(
787
- f"Empty file: {file_path}"
788
- )
743
+ issues.append(f"Empty file: {file_path}")
789
744
  except Exception as e:
790
745
  validation_results[f"{component_key}_valid"] = False
791
- validation_results["issues"].append(
792
- f"Cannot read {file_path}: {str(e)}"
793
- )
746
+ issues.append(f"Cannot read {file_path}: {str(e)}")
794
747
  else:
795
748
  validation_results[f"{component_key}_valid"] = False
796
- validation_results["issues"].append(
797
- f"{component_name} directory not found"
798
- )
749
+ issues.append(f"{component_name} directory not found")
799
750
 
800
751
  return validation_results
801
752
 
@@ -833,9 +784,7 @@ class RollbackManager:
833
784
  """Mark rollback point as used in registry"""
834
785
  if rollback_id in self.registry:
835
786
  self.registry[rollback_id]["used"] = True
836
- self.registry[rollback_id]["used_timestamp"] = datetime.now(
837
- timezone.utc
838
- ).isoformat()
787
+ self.registry[rollback_id]["used_timestamp"] = datetime.now(timezone.utc).isoformat()
839
788
  self._save_registry()
840
789
 
841
790
  def _cleanup_partial_backup(self, rollback_id: str):
@@ -883,37 +832,25 @@ def main():
883
832
 
884
833
  # List rollback points
885
834
  list_parser = subparsers.add_parser("list", help="List rollback points")
886
- list_parser.add_argument(
887
- "--limit", type=int, default=10, help="Maximum number to show"
888
- )
835
+ list_parser.add_argument("--limit", type=int, default=10, help="Maximum number to show")
889
836
 
890
837
  # Perform rollback
891
838
  rollback_parser = subparsers.add_parser("rollback", help="Rollback to point")
892
839
  rollback_parser.add_argument("rollback_id", help="Rollback point ID")
893
- rollback_parser.add_argument(
894
- "--no-validate", action="store_true", help="Skip validation"
895
- )
840
+ rollback_parser.add_argument("--no-validate", action="store_true", help="Skip validation")
896
841
 
897
842
  # Research rollback
898
- research_parser = subparsers.add_parser(
899
- "research-rollback", help="Rollback research components"
900
- )
901
- research_parser.add_argument(
902
- "--type", help="Component type (skills, agents, commands, hooks)"
903
- )
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)")
904
845
  research_parser.add_argument("--name", help="Component name")
905
846
 
906
847
  # Validate system
907
- validate_parser = subparsers.add_parser("validate", help="Validate rollback system")
848
+ subparsers.add_parser("validate", help="Validate rollback system")
908
849
 
909
850
  # Cleanup
910
- cleanup_parser = subparsers.add_parser(
911
- "cleanup", help="Cleanup old rollback points"
912
- )
851
+ cleanup_parser = subparsers.add_parser("cleanup", help="Cleanup old rollback points")
913
852
  cleanup_parser.add_argument("--keep", type=int, default=10, help="Number to keep")
914
- cleanup_parser.add_argument(
915
- "--execute", action="store_true", help="Execute cleanup (default: dry run)"
916
- )
853
+ cleanup_parser.add_argument("--execute", action="store_true", help="Execute cleanup (default: dry run)")
917
854
 
918
855
  args = parser.parse_args()
919
856
 
@@ -926,9 +863,7 @@ def main():
926
863
 
927
864
  try:
928
865
  if args.command == "create":
929
- rollback_id = rollback_manager.create_rollback_point(
930
- args.description, args.changes
931
- )
866
+ rollback_id = rollback_manager.create_rollback_point(args.description, args.changes)
932
867
  print(f"Rollback point created: {rollback_id}")
933
868
 
934
869
  elif args.command == "list":
@@ -939,9 +874,7 @@ def main():
939
874
  print(f" {rp['id']} - {rp['description']} ({status})")
940
875
 
941
876
  elif args.command == "rollback":
942
- result = rollback_manager.rollback_to_point(
943
- args.rollback_id, validate_before=not args.no_validate
944
- )
877
+ result = rollback_manager.rollback_to_point(args.rollback_id, validate_before=not args.no_validate)
945
878
  if result.success:
946
879
  print("Rollback completed successfully")
947
880
  print(f"Restored {len(result.restored_files)} files")
@@ -949,9 +882,7 @@ def main():
949
882
  print(f"Rollback failed: {result.message}")
950
883
 
951
884
  elif args.command == "research-rollback":
952
- result = rollback_manager.rollback_research_integration(
953
- args.type, args.name
954
- )
885
+ result = rollback_manager.rollback_research_integration(args.type, args.name)
955
886
  if result.success:
956
887
  print("Research rollback completed successfully")
957
888
  else:
@@ -959,9 +890,7 @@ def main():
959
890
 
960
891
  elif args.command == "validate":
961
892
  validation = rollback_manager.validate_rollback_system()
962
- print(
963
- f"Rollback system health: {'HEALTHY' if validation['system_healthy'] else 'UNHEALTHY'}"
964
- )
893
+ print(f"Rollback system health: {'HEALTHY' if validation['system_healthy'] else 'UNHEALTHY'}")
965
894
  if validation["issues"]:
966
895
  print("Issues found:")
967
896
  for issue in validation["issues"]:
@@ -972,13 +901,9 @@ def main():
972
901
  print(f" - {rec}")
973
902
 
974
903
  elif args.command == "cleanup":
975
- result = rollback_manager.cleanup_old_rollback_points(
976
- args.keep, dry_run=not args.execute
977
- )
904
+ result = rollback_manager.cleanup_old_rollbacks(args.keep, dry_run=not args.execute)
978
905
  if result["dry_run"]:
979
- print(
980
- f"Dry run: Would delete {result['would_delete_count']} rollback points"
981
- )
906
+ print(f"Dry run: Would delete {result['would_delete_count']} rollback points")
982
907
  print(f"Would free {result['would_free_space'] / 1024 / 1024:.1f} MB")
983
908
  else:
984
909
  print(f"Deleted {result['deleted_count']} rollback points")
@@ -57,12 +57,8 @@ class SessionManager:
57
57
  """
58
58
  # Default paths
59
59
  project_root = Path.cwd()
60
- self._session_file = (
61
- session_file or project_root / ".moai" / "memory" / "agent-sessions.json"
62
- )
63
- self._transcript_dir = (
64
- transcript_dir or project_root / ".moai" / "logs" / "agent-transcripts"
65
- )
60
+ self._session_file = session_file or project_root / ".moai" / "memory" / "agent-sessions.json"
61
+ self._transcript_dir = transcript_dir or project_root / ".moai" / "logs" / "agent-transcripts"
66
62
 
67
63
  # Ensure directories exist
68
64
  self._session_file.parent.mkdir(parents=True, exist_ok=True)
@@ -86,9 +82,7 @@ class SessionManager:
86
82
  self._sessions = data.get("sessions", {})
87
83
  self._chains = data.get("chains", {})
88
84
  self._metadata = data.get("metadata", {})
89
- logger.info(
90
- f"Loaded {len(self._sessions)} sessions from {self._session_file}"
91
- )
85
+ logger.info(f"Loaded {len(self._sessions)} sessions from {self._session_file}")
92
86
  except json.JSONDecodeError as e:
93
87
  logger.warning(f"Failed to load sessions: {e}")
94
88
  self._sessions = {}
@@ -158,9 +152,7 @@ class SessionManager:
158
152
  # Persist to disk
159
153
  self._save_sessions()
160
154
 
161
- logger.info(
162
- f"Registered agent result: {agent_name} (agentId: {agent_id[:8]}..., chain: {chain_id})"
163
- )
155
+ logger.info(f"Registered agent result: {agent_name} (agentId: {agent_id[:8]}..., chain: {chain_id})")
164
156
 
165
157
  def get_resume_id(
166
158
  self,
@@ -192,10 +184,7 @@ class SessionManager:
192
184
  if chain_id:
193
185
  metadata = self._metadata.get(agent_id, {})
194
186
  if metadata.get("chain_id") != chain_id:
195
- logger.debug(
196
- f"Chain mismatch: {agent_name} was in {metadata.get('chain_id')}, "
197
- f"requested {chain_id}"
198
- )
187
+ logger.debug(f"Chain mismatch: {agent_name} was in {metadata.get('chain_id')}, requested {chain_id}")
199
188
  return None
200
189
 
201
190
  logger.info(f"Resume ID for {agent_name}: {agent_id[:8]}...")
@@ -236,17 +225,13 @@ class SessionManager:
236
225
  resume_count = metadata.get("resume_count", 0)
237
226
 
238
227
  if resume_count >= 5: # Max resume depth from config
239
- logger.warning(
240
- f"{agent_name} has been resumed {resume_count} times, starting new session"
241
- )
228
+ logger.warning(f"{agent_name} has been resumed {resume_count} times, starting new session")
242
229
  return False
243
230
 
244
231
  # Heuristic: Check if tasks are related
245
232
  # (This can be enhanced with semantic similarity)
246
233
  task_keywords_match = any(
247
- keyword in current_task.lower()
248
- for keyword in previous_task.lower().split()
249
- if len(keyword) > 4
234
+ keyword in current_task.lower() for keyword in previous_task.lower().split() if len(keyword) > 4
250
235
  )
251
236
 
252
237
  if task_keywords_match:
@@ -442,9 +427,7 @@ class SessionManager:
442
427
  with open(chains_file, "w", encoding="utf-8") as f:
443
428
  json.dump(chains_data, f, indent=2, ensure_ascii=False)
444
429
 
445
- logger.info(
446
- f"Created workflow chain: {chain_id} with {len(agent_sequence)} agents"
447
- )
430
+ logger.info(f"Created workflow chain: {chain_id} with {len(agent_sequence)} agents")
448
431
 
449
432
 
450
433
  # Global instance (singleton pattern)
@@ -647,9 +630,10 @@ if __name__ == "__main__":
647
630
  }
648
631
 
649
632
  for expert_name, data in experts_results.items():
633
+ agent_id_value: str = data["agent_id"] # type: ignore[assignment]
650
634
  manager.register_agent_result(
651
635
  agent_name=expert_name,
652
- agent_id=data["agent_id"],
636
+ agent_id=agent_id_value,
653
637
  result={k: v for k, v in data.items() if k != "agent_id"},
654
638
  chain_id="SPEC-AUTH-001-review",
655
639
  )