moai-adk 0.35.1__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (502) hide show
  1. moai_adk/__init__.py +10 -0
  2. moai_adk/__main__.py +199 -0
  3. moai_adk/cli/__init__.py +6 -0
  4. moai_adk/cli/commands/__init__.py +17 -0
  5. moai_adk/cli/commands/analyze.py +116 -0
  6. moai_adk/cli/commands/doctor.py +272 -0
  7. moai_adk/cli/commands/init.py +372 -0
  8. moai_adk/cli/commands/language.py +248 -0
  9. moai_adk/cli/commands/status.py +104 -0
  10. moai_adk/cli/commands/update.py +2686 -0
  11. moai_adk/cli/main.py +13 -0
  12. moai_adk/cli/prompts/__init__.py +5 -0
  13. moai_adk/cli/prompts/init_prompts.py +219 -0
  14. moai_adk/cli/spec_status.py +263 -0
  15. moai_adk/cli/ui/__init__.py +44 -0
  16. moai_adk/cli/ui/progress.py +422 -0
  17. moai_adk/cli/ui/prompts.py +389 -0
  18. moai_adk/cli/ui/theme.py +129 -0
  19. moai_adk/cli/worktree/__init__.py +27 -0
  20. moai_adk/cli/worktree/__main__.py +31 -0
  21. moai_adk/cli/worktree/cli.py +683 -0
  22. moai_adk/cli/worktree/exceptions.py +89 -0
  23. moai_adk/cli/worktree/manager.py +493 -0
  24. moai_adk/cli/worktree/models.py +65 -0
  25. moai_adk/cli/worktree/registry.py +422 -0
  26. moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
  27. moai_adk/core/__init__.py +1 -0
  28. moai_adk/core/analysis/__init__.py +9 -0
  29. moai_adk/core/analysis/session_analyzer.py +400 -0
  30. moai_adk/core/claude_integration.py +393 -0
  31. moai_adk/core/command_helpers.py +270 -0
  32. moai_adk/core/comprehensive_monitoring_system.py +1183 -0
  33. moai_adk/core/config/__init__.py +19 -0
  34. moai_adk/core/config/auto_spec_config.py +340 -0
  35. moai_adk/core/config/migration.py +244 -0
  36. moai_adk/core/config/unified.py +436 -0
  37. moai_adk/core/context_manager.py +273 -0
  38. moai_adk/core/diagnostics/__init__.py +19 -0
  39. moai_adk/core/diagnostics/slash_commands.py +159 -0
  40. moai_adk/core/enterprise_features.py +1404 -0
  41. moai_adk/core/error_recovery_system.py +1902 -0
  42. moai_adk/core/event_driven_hook_system.py +1371 -0
  43. moai_adk/core/git/__init__.py +31 -0
  44. moai_adk/core/git/branch.py +25 -0
  45. moai_adk/core/git/branch_manager.py +129 -0
  46. moai_adk/core/git/checkpoint.py +134 -0
  47. moai_adk/core/git/commit.py +67 -0
  48. moai_adk/core/git/conflict_detector.py +413 -0
  49. moai_adk/core/git/event_detector.py +79 -0
  50. moai_adk/core/git/manager.py +216 -0
  51. moai_adk/core/hooks/post_tool_auto_spec_completion.py +901 -0
  52. moai_adk/core/input_validation_middleware.py +1006 -0
  53. moai_adk/core/integration/__init__.py +22 -0
  54. moai_adk/core/integration/engine.py +157 -0
  55. moai_adk/core/integration/integration_tester.py +226 -0
  56. moai_adk/core/integration/models.py +88 -0
  57. moai_adk/core/integration/utils.py +211 -0
  58. moai_adk/core/issue_creator.py +305 -0
  59. moai_adk/core/jit_context_loader.py +956 -0
  60. moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
  61. moai_adk/core/language_config.py +202 -0
  62. moai_adk/core/language_config_resolver.py +572 -0
  63. moai_adk/core/language_validator.py +543 -0
  64. moai_adk/core/mcp/setup.py +116 -0
  65. moai_adk/core/merge/__init__.py +9 -0
  66. moai_adk/core/merge/analyzer.py +605 -0
  67. moai_adk/core/migration/__init__.py +18 -0
  68. moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
  69. moai_adk/core/migration/backup_manager.py +277 -0
  70. moai_adk/core/migration/custom_element_scanner.py +358 -0
  71. moai_adk/core/migration/file_migrator.py +209 -0
  72. moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
  73. moai_adk/core/migration/selective_restorer.py +470 -0
  74. moai_adk/core/migration/template_utils.py +74 -0
  75. moai_adk/core/migration/user_selection_ui.py +338 -0
  76. moai_adk/core/migration/version_detector.py +139 -0
  77. moai_adk/core/migration/version_migrator.py +228 -0
  78. moai_adk/core/performance/__init__.py +6 -0
  79. moai_adk/core/performance/cache_system.py +316 -0
  80. moai_adk/core/performance/parallel_processor.py +116 -0
  81. moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
  82. moai_adk/core/project/__init__.py +1 -0
  83. moai_adk/core/project/backup_utils.py +70 -0
  84. moai_adk/core/project/checker.py +300 -0
  85. moai_adk/core/project/detector.py +293 -0
  86. moai_adk/core/project/initializer.py +387 -0
  87. moai_adk/core/project/phase_executor.py +716 -0
  88. moai_adk/core/project/validator.py +139 -0
  89. moai_adk/core/quality/__init__.py +6 -0
  90. moai_adk/core/quality/trust_checker.py +377 -0
  91. moai_adk/core/quality/validators/__init__.py +6 -0
  92. moai_adk/core/quality/validators/base_validator.py +19 -0
  93. moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
  94. moai_adk/core/robust_json_parser.py +611 -0
  95. moai_adk/core/rollback_manager.py +918 -0
  96. moai_adk/core/session_manager.py +651 -0
  97. moai_adk/core/skill_loading_system.py +579 -0
  98. moai_adk/core/spec/confidence_scoring.py +680 -0
  99. moai_adk/core/spec/ears_template_engine.py +1247 -0
  100. moai_adk/core/spec/quality_validator.py +687 -0
  101. moai_adk/core/spec_status_manager.py +478 -0
  102. moai_adk/core/template/__init__.py +7 -0
  103. moai_adk/core/template/backup.py +174 -0
  104. moai_adk/core/template/config.py +191 -0
  105. moai_adk/core/template/languages.py +43 -0
  106. moai_adk/core/template/merger.py +233 -0
  107. moai_adk/core/template/processor.py +1200 -0
  108. moai_adk/core/template_engine.py +310 -0
  109. moai_adk/core/template_variable_synchronizer.py +417 -0
  110. moai_adk/core/unified_permission_manager.py +745 -0
  111. moai_adk/core/user_behavior_analytics.py +851 -0
  112. moai_adk/core/version_sync.py +429 -0
  113. moai_adk/foundation/__init__.py +56 -0
  114. moai_adk/foundation/backend.py +1027 -0
  115. moai_adk/foundation/database.py +1115 -0
  116. moai_adk/foundation/devops.py +1585 -0
  117. moai_adk/foundation/ears.py +431 -0
  118. moai_adk/foundation/frontend.py +870 -0
  119. moai_adk/foundation/git/commit_templates.py +557 -0
  120. moai_adk/foundation/git.py +376 -0
  121. moai_adk/foundation/langs.py +484 -0
  122. moai_adk/foundation/ml_ops.py +1162 -0
  123. moai_adk/foundation/testing.py +1524 -0
  124. moai_adk/foundation/trust/trust_principles.py +676 -0
  125. moai_adk/foundation/trust/validation_checklist.py +1573 -0
  126. moai_adk/project/__init__.py +0 -0
  127. moai_adk/project/configuration.py +1084 -0
  128. moai_adk/project/documentation.py +566 -0
  129. moai_adk/project/schema.py +447 -0
  130. moai_adk/statusline/__init__.py +38 -0
  131. moai_adk/statusline/alfred_detector.py +105 -0
  132. moai_adk/statusline/config.py +376 -0
  133. moai_adk/statusline/enhanced_output_style_detector.py +372 -0
  134. moai_adk/statusline/git_collector.py +190 -0
  135. moai_adk/statusline/main.py +322 -0
  136. moai_adk/statusline/metrics_tracker.py +78 -0
  137. moai_adk/statusline/renderer.py +343 -0
  138. moai_adk/statusline/update_checker.py +129 -0
  139. moai_adk/statusline/version_reader.py +741 -0
  140. moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +714 -0
  141. moai_adk/templates/.claude/agents/moai/builder-agent.md +474 -0
  142. moai_adk/templates/.claude/agents/moai/builder-command.md +1172 -0
  143. moai_adk/templates/.claude/agents/moai/builder-plugin.md +637 -0
  144. moai_adk/templates/.claude/agents/moai/builder-skill.md +666 -0
  145. moai_adk/templates/.claude/agents/moai/expert-backend.md +899 -0
  146. moai_adk/templates/.claude/agents/moai/expert-database.md +777 -0
  147. moai_adk/templates/.claude/agents/moai/expert-debug.md +401 -0
  148. moai_adk/templates/.claude/agents/moai/expert-devops.md +720 -0
  149. moai_adk/templates/.claude/agents/moai/expert-frontend.md +734 -0
  150. moai_adk/templates/.claude/agents/moai/expert-performance.md +657 -0
  151. moai_adk/templates/.claude/agents/moai/expert-security.md +513 -0
  152. moai_adk/templates/.claude/agents/moai/expert-testing.md +733 -0
  153. moai_adk/templates/.claude/agents/moai/expert-uiux.md +1041 -0
  154. moai_adk/templates/.claude/agents/moai/manager-claude-code.md +432 -0
  155. moai_adk/templates/.claude/agents/moai/manager-docs.md +573 -0
  156. moai_adk/templates/.claude/agents/moai/manager-git.md +1060 -0
  157. moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
  158. moai_adk/templates/.claude/agents/moai/manager-quality.md +624 -0
  159. moai_adk/templates/.claude/agents/moai/manager-spec.md +809 -0
  160. moai_adk/templates/.claude/agents/moai/manager-strategy.md +780 -0
  161. moai_adk/templates/.claude/agents/moai/manager-tdd.md +784 -0
  162. moai_adk/templates/.claude/agents/moai/mcp-context7.md +458 -0
  163. moai_adk/templates/.claude/agents/moai/mcp-figma.md +1607 -0
  164. moai_adk/templates/.claude/agents/moai/mcp-notion.md +789 -0
  165. moai_adk/templates/.claude/agents/moai/mcp-playwright.md +469 -0
  166. moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +1032 -0
  167. moai_adk/templates/.claude/commands/moai/0-project.md +1386 -0
  168. moai_adk/templates/.claude/commands/moai/1-plan.md +1427 -0
  169. moai_adk/templates/.claude/commands/moai/2-run.md +943 -0
  170. moai_adk/templates/.claude/commands/moai/3-sync.md +1324 -0
  171. moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
  172. moai_adk/templates/.claude/hooks/__init__.py +8 -0
  173. moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
  174. moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
  175. moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
  176. moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
  177. moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
  178. moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
  179. moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
  180. moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
  181. moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
  182. moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
  183. moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
  184. moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
  185. moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
  186. moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
  187. moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
  188. moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
  189. moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +1083 -0
  190. moai_adk/templates/.claude/output-styles/moai/r2d2.md +560 -0
  191. moai_adk/templates/.claude/output-styles/moai/yoda.md +359 -0
  192. moai_adk/templates/.claude/settings.json +172 -0
  193. moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +307 -0
  194. moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -0
  195. moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/batch_generate.py +560 -0
  196. moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/generate_image.py +362 -0
  197. moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +249 -0
  198. moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +406 -0
  199. moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
  200. moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
  201. moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
  202. moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
  203. moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
  204. moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +328 -0
  205. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +320 -0
  206. moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +718 -0
  207. moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +464 -0
  208. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +323 -0
  209. moai_adk/templates/.claude/skills/moai-domain-database/examples.md +830 -0
  210. moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
  211. moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
  212. moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
  213. moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
  214. moai_adk/templates/.claude/skills/moai-domain-database/reference.md +545 -0
  215. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +497 -0
  216. moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +968 -0
  217. moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +664 -0
  218. moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +455 -0
  219. moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
  220. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
  221. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
  222. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
  223. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
  224. moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
  225. moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +492 -0
  226. moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -0
  227. moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
  228. moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
  229. moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
  230. moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
  231. moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
  232. moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
  233. moai_adk/templates/.claude/skills/moai-formats-data/reference.md +585 -0
  234. moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +202 -0
  235. moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -0
  236. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
  237. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
  238. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
  239. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
  240. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
  241. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
  242. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
  243. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
  244. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
  245. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
  246. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
  247. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
  248. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
  249. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
  250. moai_adk/templates/.claude/skills/moai-foundation-claude/reference.md +209 -0
  251. moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +441 -0
  252. moai_adk/templates/.claude/skills/moai-foundation-context/examples.md +1048 -0
  253. moai_adk/templates/.claude/skills/moai-foundation-context/reference.md +246 -0
  254. moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +420 -0
  255. moai_adk/templates/.claude/skills/moai-foundation-core/examples.md +358 -0
  256. moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
  257. moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +359 -0
  258. moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
  259. moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
  260. moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
  261. moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
  262. moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
  263. moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
  264. moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
  265. moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
  266. moai_adk/templates/.claude/skills/moai-foundation-core/reference.md +478 -0
  267. moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +315 -0
  268. moai_adk/templates/.claude/skills/moai-foundation-philosopher/examples.md +228 -0
  269. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/assumption-matrix.md +80 -0
  270. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/cognitive-bias.md +199 -0
  271. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/first-principles.md +140 -0
  272. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/trade-off-analysis.md +154 -0
  273. moai_adk/templates/.claude/skills/moai-foundation-philosopher/reference.md +157 -0
  274. moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +364 -0
  275. moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
  276. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
  277. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
  278. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
  279. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
  280. moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
  281. moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
  282. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
  283. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
  284. moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +649 -0
  285. moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +478 -0
  286. moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +612 -0
  287. moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +477 -0
  288. moai_adk/templates/.claude/skills/moai-lang-flutter/examples.md +1090 -0
  289. moai_adk/templates/.claude/skills/moai-lang-flutter/reference.md +686 -0
  290. moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +376 -0
  291. moai_adk/templates/.claude/skills/moai-lang-go/examples.md +919 -0
  292. moai_adk/templates/.claude/skills/moai-lang-go/reference.md +737 -0
  293. moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +385 -0
  294. moai_adk/templates/.claude/skills/moai-lang-java/examples.md +864 -0
  295. moai_adk/templates/.claude/skills/moai-lang-java/reference.md +291 -0
  296. moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +382 -0
  297. moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +1006 -0
  298. moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +562 -0
  299. moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +644 -0
  300. moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +481 -0
  301. moai_adk/templates/.claude/skills/moai-lang-python/examples.md +977 -0
  302. moai_adk/templates/.claude/skills/moai-lang-python/reference.md +804 -0
  303. moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +579 -0
  304. moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +687 -0
  305. moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +372 -0
  306. moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +659 -0
  307. moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +504 -0
  308. moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +497 -0
  309. moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +633 -0
  310. moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +423 -0
  311. moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +497 -0
  312. moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +918 -0
  313. moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +672 -0
  314. moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +368 -0
  315. moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +1089 -0
  316. moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +731 -0
  317. moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +300 -0
  318. moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
  319. moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
  320. moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
  321. moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
  322. moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +319 -0
  323. moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
  324. moai_adk/templates/.claude/skills/moai-library-nextra/examples.md +592 -0
  325. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
  326. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
  327. moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
  328. moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
  329. moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
  330. moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
  331. moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
  332. moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
  333. moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
  334. moai_adk/templates/.claude/skills/moai-library-nextra/reference.md +379 -0
  335. moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +372 -0
  336. moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
  337. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
  338. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
  339. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
  340. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
  341. moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
  342. moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +402 -0
  343. moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +607 -0
  344. moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +300 -0
  345. moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +537 -0
  346. moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +291 -0
  347. moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +390 -0
  348. moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +398 -0
  349. moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +379 -0
  350. moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +358 -0
  351. moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +467 -0
  352. moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +377 -0
  353. moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +466 -0
  354. moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +482 -0
  355. moai_adk/templates/.claude/skills/moai-plugin-builder/SKILL.md +474 -0
  356. moai_adk/templates/.claude/skills/moai-plugin-builder/examples.md +621 -0
  357. moai_adk/templates/.claude/skills/moai-plugin-builder/migration.md +341 -0
  358. moai_adk/templates/.claude/skills/moai-plugin-builder/reference.md +463 -0
  359. moai_adk/templates/.claude/skills/moai-plugin-builder/validation.md +373 -0
  360. moai_adk/templates/.claude/skills/moai-security-auth0/SKILL.md +275 -0
  361. moai_adk/templates/.claude/skills/moai-security-auth0/modules/adaptive-mfa.md +233 -0
  362. moai_adk/templates/.claude/skills/moai-security-auth0/modules/akamai-integration.md +215 -0
  363. moai_adk/templates/.claude/skills/moai-security-auth0/modules/application-credentials.md +280 -0
  364. moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-log-events.md +225 -0
  365. moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-overview.md +140 -0
  366. moai_adk/templates/.claude/skills/moai-security-auth0/modules/bot-detection.md +144 -0
  367. moai_adk/templates/.claude/skills/moai-security-auth0/modules/breached-password-detection.md +187 -0
  368. moai_adk/templates/.claude/skills/moai-security-auth0/modules/brute-force-protection.md +189 -0
  369. moai_adk/templates/.claude/skills/moai-security-auth0/modules/certifications.md +282 -0
  370. moai_adk/templates/.claude/skills/moai-security-auth0/modules/compliance-overview.md +263 -0
  371. moai_adk/templates/.claude/skills/moai-security-auth0/modules/continuous-session-protection.md +307 -0
  372. moai_adk/templates/.claude/skills/moai-security-auth0/modules/customize-mfa.md +178 -0
  373. moai_adk/templates/.claude/skills/moai-security-auth0/modules/dpop-implementation.md +283 -0
  374. moai_adk/templates/.claude/skills/moai-security-auth0/modules/fapi-implementation.md +259 -0
  375. moai_adk/templates/.claude/skills/moai-security-auth0/modules/gdpr-compliance.md +313 -0
  376. moai_adk/templates/.claude/skills/moai-security-auth0/modules/guardian-configuration.md +269 -0
  377. moai_adk/templates/.claude/skills/moai-security-auth0/modules/highly-regulated-identity.md +272 -0
  378. moai_adk/templates/.claude/skills/moai-security-auth0/modules/jwt-fundamentals.md +248 -0
  379. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mdl-verification.md +211 -0
  380. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-api-management.md +278 -0
  381. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-factors.md +226 -0
  382. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-overview.md +174 -0
  383. moai_adk/templates/.claude/skills/moai-security-auth0/modules/mtls-sender-constraining.md +316 -0
  384. moai_adk/templates/.claude/skills/moai-security-auth0/modules/ropg-flow-mfa.md +217 -0
  385. moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-center.md +325 -0
  386. moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-guidance.md +277 -0
  387. moai_adk/templates/.claude/skills/moai-security-auth0/modules/state-parameters.md +178 -0
  388. moai_adk/templates/.claude/skills/moai-security-auth0/modules/step-up-authentication.md +251 -0
  389. moai_adk/templates/.claude/skills/moai-security-auth0/modules/suspicious-ip-throttling.md +240 -0
  390. moai_adk/templates/.claude/skills/moai-security-auth0/modules/tenant-access-control.md +180 -0
  391. moai_adk/templates/.claude/skills/moai-security-auth0/modules/webauthn-fido.md +235 -0
  392. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +449 -0
  393. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
  394. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
  395. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
  396. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/reference.md +307 -0
  397. moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
  398. moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +390 -0
  399. moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
  400. moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
  401. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
  402. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
  403. moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
  404. moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +175 -0
  405. moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
  406. moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -0
  407. moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
  408. moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
  409. moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
  410. moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
  411. moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
  412. moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
  413. moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
  414. moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
  415. moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
  416. moai_adk/templates/.claude/skills/moai-workflow-project/reference.md +275 -0
  417. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
  418. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1434 -0
  419. moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
  420. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
  421. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
  422. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +92 -0
  423. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
  424. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
  425. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
  426. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
  427. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
  428. moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
  429. moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +534 -0
  430. moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
  431. moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
  432. moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +377 -0
  433. moai_adk/templates/.claude/skills/moai-workflow-templates/examples.md +552 -0
  434. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
  435. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
  436. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
  437. moai_adk/templates/.claude/skills/moai-workflow-templates/reference.md +346 -0
  438. moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
  439. moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +456 -0
  440. moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
  441. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
  442. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
  443. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
  444. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
  445. moai_adk/templates/.claude/skills/moai-workflow-testing/examples.md +672 -0
  446. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
  447. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
  448. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
  449. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
  450. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
  451. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
  452. moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
  453. moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
  454. moai_adk/templates/.claude/skills/moai-workflow-testing/reference.md +440 -0
  455. moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
  456. moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
  457. moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
  458. moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +411 -0
  459. moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
  460. moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
  461. moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
  462. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
  463. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
  464. moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
  465. moai_adk/templates/.git-hooks/pre-commit +128 -0
  466. moai_adk/templates/.git-hooks/pre-push +365 -0
  467. moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
  468. moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
  469. moai_adk/templates/.github/workflows/spec-issue-sync.yml +337 -0
  470. moai_adk/templates/.gitignore +222 -0
  471. moai_adk/templates/.mcp.json +13 -0
  472. moai_adk/templates/.moai/config/config.yaml +58 -0
  473. moai_adk/templates/.moai/config/questions/_schema.yaml +174 -0
  474. moai_adk/templates/.moai/config/questions/tab0-init.yaml +251 -0
  475. moai_adk/templates/.moai/config/questions/tab1-user.yaml +107 -0
  476. moai_adk/templates/.moai/config/questions/tab2-project.yaml +79 -0
  477. moai_adk/templates/.moai/config/questions/tab3-git.yaml +632 -0
  478. moai_adk/templates/.moai/config/questions/tab4-quality.yaml +182 -0
  479. moai_adk/templates/.moai/config/questions/tab5-system.yaml +96 -0
  480. moai_adk/templates/.moai/config/sections/git-strategy.yaml +116 -0
  481. moai_adk/templates/.moai/config/sections/language.yaml +11 -0
  482. moai_adk/templates/.moai/config/sections/project.yaml +13 -0
  483. moai_adk/templates/.moai/config/sections/quality.yaml +17 -0
  484. moai_adk/templates/.moai/config/sections/system.yaml +24 -0
  485. moai_adk/templates/.moai/config/sections/user.yaml +5 -0
  486. moai_adk/templates/.moai/config/statusline-config.yaml +92 -0
  487. moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
  488. moai_adk/templates/CLAUDE.md +642 -0
  489. moai_adk/utils/__init__.py +30 -0
  490. moai_adk/utils/banner.py +38 -0
  491. moai_adk/utils/common.py +294 -0
  492. moai_adk/utils/link_validator.py +241 -0
  493. moai_adk/utils/logger.py +147 -0
  494. moai_adk/utils/safe_file_reader.py +206 -0
  495. moai_adk/utils/timeout.py +160 -0
  496. moai_adk/utils/toon_utils.py +256 -0
  497. moai_adk/version.py +22 -0
  498. moai_adk-0.35.1.dist-info/METADATA +3018 -0
  499. moai_adk-0.35.1.dist-info/RECORD +502 -0
  500. moai_adk-0.35.1.dist-info/WHEEL +4 -0
  501. moai_adk-0.35.1.dist-info/entry_points.txt +3 -0
  502. moai_adk-0.35.1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,478 @@
1
+ """SPEC Status Manager
2
+
3
+ Automated management of SPEC status transitions from 'draft' to 'completed'
4
+ based on implementation completion detection and validation criteria.
5
+ """
6
+
7
+ import logging
8
+ import re
9
+ from datetime import datetime
10
+ from pathlib import Path
11
+ from typing import Any, Dict, List, Set
12
+
13
+ import yaml # type: ignore
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ class SpecStatusManager:
19
+ """Manages SPEC status detection and updates based on implementation completion"""
20
+
21
+ def __init__(self, project_root: Path):
22
+ """Initialize the SPEC status manager
23
+
24
+ Args:
25
+ project_root: Root directory of the MoAI project
26
+ """
27
+ self.project_root = Path(project_root)
28
+ self.specs_dir = self.project_root / ".moai" / "specs"
29
+ self.src_dir = self.project_root / "src"
30
+ self.tests_dir = self.project_root / "tests"
31
+ self.docs_dir = self.project_root / "docs"
32
+
33
+ # Validation criteria (configurable)
34
+ self.validation_criteria = {
35
+ "min_code_coverage": 0.85, # 85% minimum coverage
36
+ "require_acceptance_criteria": True,
37
+ "min_implementation_age_days": 0, # Days since last implementation
38
+ }
39
+
40
+ def detect_draft_specs(self) -> Set[str]:
41
+ """Detect all SPEC files with 'draft' status
42
+
43
+ Returns:
44
+ Set of SPEC IDs that have draft status
45
+ """
46
+ draft_specs: Set[str] = set()
47
+
48
+ if not self.specs_dir.exists():
49
+ logger.warning(f"SPEC directory not found: {self.specs_dir}")
50
+ return draft_specs
51
+
52
+ for spec_dir in self.specs_dir.iterdir():
53
+ if spec_dir.is_dir():
54
+ spec_file = spec_dir / "spec.md"
55
+ if spec_file.exists():
56
+ try:
57
+ # Read frontmatter to check status
58
+ with open(spec_file, "r", encoding="utf-8") as f:
59
+ content = f.read()
60
+
61
+ frontmatter = None
62
+
63
+ # Handle JSON-like meta (common in older specs)
64
+ meta_match = re.search(r"<%?\s*---\s*\n(.*?)\n---\s*%?>", content, re.DOTALL)
65
+ if meta_match:
66
+ try:
67
+ meta_text = meta_match.group(1)
68
+ # Replace JSON-style quotes and parse as YAML
69
+ meta_text = meta_text.replace('"', "").replace("'", "")
70
+ frontmatter = yaml.safe_load("{" + meta_text + "}")
71
+ except Exception as e:
72
+ logger.debug(f"JSON meta parsing failed for {spec_dir.name}: {e}")
73
+
74
+ # Handle regular YAML frontmatter
75
+ elif content.startswith("---"):
76
+ end_marker = content.find("---", 3)
77
+ if end_marker != -1:
78
+ frontmatter_text = content[3:end_marker].strip()
79
+ try:
80
+ frontmatter = yaml.safe_load(frontmatter_text)
81
+ except yaml.YAMLError as e:
82
+ logger.warning(f"YAML parsing error for {spec_dir.name}: {e}")
83
+ # Try to fix common issues (like @ in author field)
84
+ try:
85
+ # Replace problematic @author entries
86
+ fixed_text = frontmatter_text
87
+ if "author: @" in fixed_text:
88
+ fixed_text = re.sub(
89
+ r"author:\s*@(\w+)",
90
+ r'author: "\1"',
91
+ fixed_text,
92
+ )
93
+ frontmatter = yaml.safe_load(fixed_text)
94
+ except yaml.YAMLError:
95
+ logger.error(f"Could not parse YAML for {spec_dir.name} even after fixes")
96
+ continue
97
+
98
+ if frontmatter and frontmatter.get("status") == "draft":
99
+ spec_id = spec_dir.name
100
+ draft_specs.add(spec_id)
101
+ logger.debug(f"Found draft SPEC: {spec_id}")
102
+
103
+ except Exception as e:
104
+ logger.error(f"Error reading SPEC {spec_dir.name}: {e}")
105
+
106
+ logger.info(f"Found {len(draft_specs)} draft SPECs")
107
+ return draft_specs
108
+
109
+ def is_spec_implementation_completed(self, spec_id: str) -> bool:
110
+ """Check if a SPEC's implementation is complete
111
+
112
+ Args:
113
+ spec_id: The SPEC identifier (e.g., "SPEC-001")
114
+
115
+ Returns:
116
+ True if implementation is complete, False otherwise
117
+ """
118
+ spec_dir = self.specs_dir / spec_id
119
+ spec_file = spec_dir / "spec.md"
120
+
121
+ if not spec_file.exists():
122
+ logger.warning(f"SPEC file not found: {spec_file}")
123
+ return False
124
+
125
+ try:
126
+ # Check basic implementation status
127
+ spec_dir = spec_file.parent
128
+
129
+ # Check for implementation files
130
+ src_files = list(spec_dir.rglob("*.py")) if (spec_dir.parent.parent / "src").exists() else []
131
+
132
+ # Check for test files
133
+ test_dir = spec_dir.parent.parent / "tests"
134
+ test_files = list(test_dir.rglob(f"test_*{spec_id.lower()}*.py")) if test_dir.exists() else []
135
+
136
+ # Simple completion criteria
137
+ has_code = len(src_files) > 0
138
+ has_tests = len(test_files) > 0
139
+
140
+ # Check if SPEC has acceptance criteria
141
+ with open(spec_file, "r", encoding="utf-8") as f:
142
+ spec_content = f.read()
143
+ has_acceptance_criteria = "Acceptance Criteria" in spec_content
144
+
145
+ # Overall completion check
146
+ is_complete = has_code and has_tests and has_acceptance_criteria
147
+
148
+ logger.info(f"SPEC {spec_id} implementation status: {'COMPLETE' if is_complete else 'INCOMPLETE'}")
149
+ return is_complete
150
+
151
+ except Exception as e:
152
+ logger.error(f"Error checking SPEC {spec_id} completion: {e}")
153
+ return False
154
+
155
+ def update_spec_status(self, spec_id: str, new_status: str) -> bool:
156
+ """Update SPEC status in frontmatter
157
+
158
+ Args:
159
+ spec_id: The SPEC identifier
160
+ new_status: New status value ('completed', 'draft', etc.)
161
+
162
+ Returns:
163
+ True if update successful, False otherwise
164
+ """
165
+ spec_dir = self.specs_dir / spec_id
166
+ spec_file = spec_dir / "spec.md"
167
+
168
+ if not spec_file.exists():
169
+ logger.error(f"SPEC file not found: {spec_file}")
170
+ return False
171
+
172
+ try:
173
+ with open(spec_file, "r", encoding="utf-8") as f:
174
+ content = f.read()
175
+
176
+ # Extract and update frontmatter
177
+ if content.startswith("---"):
178
+ end_marker = content.find("---", 3)
179
+ if end_marker != -1:
180
+ frontmatter_text = content[3:end_marker].strip()
181
+ try:
182
+ frontmatter = yaml.safe_load(frontmatter_text) or {}
183
+ except yaml.YAMLError as e:
184
+ logger.warning(f"YAML parsing error for {spec_id}: {e}")
185
+ # Try to fix common issues
186
+ try:
187
+ fixed_text = frontmatter_text
188
+ if "author: @" in fixed_text:
189
+ fixed_text = re.sub(r"author:\s*@(\w+)", r'author: "\1"', fixed_text)
190
+ frontmatter = yaml.safe_load(fixed_text) or {}
191
+ except yaml.YAMLError:
192
+ logger.error(f"Could not parse YAML for {spec_id} even after fixes")
193
+ return False
194
+
195
+ # Update status
196
+ frontmatter["status"] = new_status
197
+
198
+ # Bump version if completing
199
+ if new_status == "completed":
200
+ frontmatter["version"] = self._bump_version(frontmatter.get("version", "0.1.0"))
201
+ frontmatter["updated"] = datetime.now().strftime("%Y-%m-%d")
202
+
203
+ # Reconstruct the file
204
+ new_frontmatter = yaml.dump(frontmatter, default_flow_style=False)
205
+ new_content = f"---\n{new_frontmatter}---{content[end_marker + 3 :]}"
206
+
207
+ # Write back to file
208
+ with open(spec_file, "w", encoding="utf-8") as f:
209
+ f.write(new_content)
210
+
211
+ logger.info(f"Updated SPEC {spec_id} status to {new_status}")
212
+ return True
213
+
214
+ except Exception as e:
215
+ logger.error(f"Error updating SPEC {spec_id} status: {e}")
216
+ return False
217
+
218
+ def get_completion_validation_criteria(self) -> Dict:
219
+ """Get the current validation criteria for SPEC completion
220
+
221
+ Returns:
222
+ Dictionary of validation criteria
223
+ """
224
+ return self.validation_criteria.copy()
225
+
226
+ def validate_spec_for_completion(self, spec_id: str) -> Dict[str, Any]:
227
+ """Validate if a SPEC is ready for completion
228
+
229
+ Args:
230
+ spec_id: The SPEC identifier
231
+
232
+ Returns:
233
+ Dictionary with validation results:
234
+ {
235
+ 'is_ready': bool,
236
+ 'criteria_met': Dict[str, bool],
237
+ 'issues': List[str],
238
+ 'recommendations': List[str]
239
+ }
240
+ """
241
+ result: Dict[str, Any] = {
242
+ "is_ready": False,
243
+ "criteria_met": {},
244
+ "issues": [],
245
+ "recommendations": [],
246
+ }
247
+
248
+ try:
249
+ spec_dir = self.specs_dir / spec_id
250
+ spec_file = spec_dir / "spec.md"
251
+
252
+ if not spec_file.exists():
253
+ issues_list = result["issues"]
254
+ if isinstance(issues_list, list):
255
+ issues_list.append(f"SPEC file not found: {spec_file}")
256
+ return result
257
+
258
+ # Check implementation status
259
+ criteria_checks: Dict[str, bool] = {}
260
+
261
+ # Check for code implementation
262
+ spec_dir = spec_file.parent
263
+ src_dir = spec_dir.parent.parent / "src"
264
+ criteria_checks["code_implemented"] = src_dir.exists() and len(list(src_dir.rglob("*.py"))) > 0
265
+ if not criteria_checks["code_implemented"]:
266
+ issues_list = result["issues"]
267
+ if isinstance(issues_list, list):
268
+ issues_list.append("No source code files found")
269
+
270
+ # Check for test implementation
271
+ test_dir = spec_dir.parent.parent / "tests"
272
+ test_files = list(test_dir.rglob("test_*.py")) if test_dir.exists() else []
273
+ criteria_checks["test_implemented"] = len(test_files) > 0
274
+ if not criteria_checks["test_implemented"]:
275
+ issues_list = result["issues"]
276
+ if isinstance(issues_list, list):
277
+ issues_list.append("No test files found")
278
+
279
+ # Check for acceptance criteria
280
+ criteria_checks["tasks_completed"] = self._check_acceptance_criteria(spec_file)
281
+ if not criteria_checks["tasks_completed"]:
282
+ issues_list = result["issues"]
283
+ if isinstance(issues_list, list):
284
+ issues_list.append("Missing acceptance criteria section")
285
+
286
+ # 4. Acceptance criteria present
287
+ criteria_checks["has_acceptance_criteria"] = self._check_acceptance_criteria(spec_file)
288
+ if (
289
+ not criteria_checks["has_acceptance_criteria"]
290
+ and self.validation_criteria["require_acceptance_criteria"]
291
+ ):
292
+ issues_list = result["issues"]
293
+ if isinstance(issues_list, list):
294
+ issues_list.append("Missing acceptance criteria section")
295
+
296
+ # 5. Documentation sync
297
+ criteria_checks["docs_synced"] = self._check_documentation_sync(spec_id)
298
+ if not criteria_checks["docs_synced"]:
299
+ recs_list = result["recommendations"]
300
+ if isinstance(recs_list, list):
301
+ recs_list.append("Consider running /moai:3-sync to update documentation")
302
+
303
+ result["criteria_met"] = criteria_checks
304
+ result["is_ready"] = all(criteria_checks.values())
305
+
306
+ # Add recommendations
307
+ if result["is_ready"]:
308
+ recs_list = result["recommendations"]
309
+ if isinstance(recs_list, list):
310
+ recs_list.append("SPEC is ready for completion. Consider updating status to 'completed'")
311
+
312
+ except Exception as e:
313
+ logger.error(f"Error validating SPEC {spec_id}: {e}")
314
+ issues_list = result["issues"]
315
+ if isinstance(issues_list, list):
316
+ issues_list.append(f"Validation error: {e}")
317
+
318
+ return result
319
+
320
+ def batch_update_completed_specs(self) -> Dict[str, List[str]]:
321
+ """Batch update all draft SPECs that have completed implementations
322
+
323
+ Returns:
324
+ Dictionary with update results:
325
+ {
326
+ 'updated': List[str], # Successfully updated SPEC IDs
327
+ 'failed': List[str], # Failed SPEC IDs with errors
328
+ 'skipped': List[str] # Incomplete SPEC IDs
329
+ }
330
+ """
331
+ results: Dict[str, List[str]] = {"updated": [], "failed": [], "skipped": []}
332
+
333
+ draft_specs = self.detect_draft_specs()
334
+ logger.info(f"Checking {len(draft_specs)} draft SPECs for completion")
335
+
336
+ for spec_id in draft_specs:
337
+ try:
338
+ # Validate first
339
+ validation = self.validate_spec_for_completion(spec_id)
340
+
341
+ if validation["is_ready"]:
342
+ # Update status
343
+ if self.update_spec_status(spec_id, "completed"):
344
+ updated_list = results["updated"]
345
+ if isinstance(updated_list, list):
346
+ updated_list.append(spec_id)
347
+ logger.info(f"Updated SPEC {spec_id} to completed")
348
+ else:
349
+ failed_list = results["failed"]
350
+ if isinstance(failed_list, list):
351
+ failed_list.append(spec_id)
352
+ logger.error(f"Failed to update SPEC {spec_id}")
353
+ else:
354
+ skipped_list = results["skipped"]
355
+ if isinstance(skipped_list, list):
356
+ skipped_list.append(spec_id)
357
+ logger.debug(f"SPEC {spec_id} not ready for completion: {validation['issues']}")
358
+
359
+ except Exception as e:
360
+ failed_list = results["failed"]
361
+ if isinstance(failed_list, list):
362
+ failed_list.append(spec_id)
363
+ logger.error(f"Error processing SPEC {spec_id}: {e}")
364
+
365
+ logger.info(
366
+ f"Batch update complete: {len(results['updated'])} updated, "
367
+ f"{len(results['failed'])} failed, "
368
+ f"{len(results['skipped'])} skipped"
369
+ )
370
+ return results
371
+
372
+ # Private helper methods
373
+
374
+ def _check_acceptance_criteria(self, spec_file: Path) -> bool:
375
+ """
376
+ Check if SPEC file contains acceptance criteria
377
+
378
+ Args:
379
+ spec_file: Path to SPEC file
380
+
381
+ Returns:
382
+ True if acceptance criteria present
383
+ """
384
+ try:
385
+ with open(spec_file, "r", encoding="utf-8") as f:
386
+ content = f.read()
387
+
388
+ # Look for acceptance criteria section
389
+ acceptance_patterns = [
390
+ r"##\s*Acceptance\s+Criteria",
391
+ r"###\s*Acceptance\s+Criteria",
392
+ r"##\s*验收\s+标准",
393
+ r"###\s*验收\s+标准",
394
+ ]
395
+
396
+ for pattern in acceptance_patterns:
397
+ if re.search(pattern, content, re.IGNORECASE):
398
+ return True
399
+
400
+ return False
401
+
402
+ except Exception as e:
403
+ logger.error(f"Error checking acceptance criteria in {spec_file}: {e}")
404
+ return False
405
+
406
+ def _check_documentation_sync(self, spec_id: str) -> bool:
407
+ """
408
+ Check if documentation is synchronized with implementation
409
+
410
+ Args:
411
+ spec_id: The SPEC identifier
412
+
413
+ Returns:
414
+ True if documentation appears synchronized
415
+ """
416
+ try:
417
+ # Simple heuristic: check if docs exist and are recent
418
+ docs_dir = self.project_root / "docs"
419
+ if not docs_dir.exists():
420
+ return True # No docs to sync
421
+
422
+ # Check if there are any doc files related to this SPEC
423
+ spec_docs = list(docs_dir.rglob(f"*{spec_id.lower()}*"))
424
+ if not spec_docs:
425
+ return True # No specific docs for this SPEC
426
+
427
+ # Basic check - assume docs are in sync if they exist
428
+ return True
429
+
430
+ except Exception as e:
431
+ logger.error(f"Error checking documentation sync for {spec_id}: {e}")
432
+ return False
433
+
434
+ def _run_additional_validations(self, spec_id: str) -> bool:
435
+ """Run additional validation checks for SPEC completion
436
+
437
+ Args:
438
+ spec_id: The SPEC identifier
439
+
440
+ Returns:
441
+ True if all additional validations pass
442
+ """
443
+ # Add any additional validation logic here
444
+ # For now, return True as default
445
+ return True
446
+
447
+ def _bump_version(self, current_version: str) -> str:
448
+ """Bump version to indicate completion
449
+
450
+ Args:
451
+ current_version: Current version string
452
+
453
+ Returns:
454
+ New version string
455
+ """
456
+ try:
457
+ # Parse current version - strip quotes if present
458
+ version = str(current_version).strip("\"'")
459
+
460
+ if version.startswith("0."):
461
+ # Major version bump for completion
462
+ return "1.0.0"
463
+ else:
464
+ # Minor version bump for updates
465
+ parts = version.split(".")
466
+ if len(parts) >= 2:
467
+ try:
468
+ minor = int(parts[1]) + 1
469
+ return f"{parts[0]}.{minor}.0"
470
+ except ValueError:
471
+ # If parsing fails, default to 1.0.0
472
+ return "1.0.0"
473
+ else:
474
+ return f"{version}.1"
475
+
476
+ except Exception:
477
+ # Fallback to 1.0.0
478
+ return "1.0.0"
@@ -0,0 +1,7 @@
1
+ """Template management module."""
2
+
3
+ from moai_adk.core.template.backup import TemplateBackup
4
+ from moai_adk.core.template.merger import TemplateMerger
5
+ from moai_adk.core.template.processor import TemplateProcessor
6
+
7
+ __all__ = ["TemplateProcessor", "TemplateBackup", "TemplateMerger"]
@@ -0,0 +1,174 @@
1
+ """Template backup manager (SPEC-INIT-003 v0.3.0).
2
+
3
+ Creates and manages backups to protect user data during template updates.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ import re
9
+ import shutil
10
+ from datetime import datetime
11
+ from pathlib import Path
12
+
13
+
14
+ class TemplateBackup:
15
+ """Create and manage template backups."""
16
+
17
+ # Paths excluded from backups (protect user data)
18
+ BACKUP_EXCLUDE_DIRS = [
19
+ "specs", # User SPEC documents
20
+ "reports", # User reports
21
+ ]
22
+
23
+ def __init__(self, target_path: Path) -> None:
24
+ """Initialize the backup manager.
25
+
26
+ Args:
27
+ target_path: Project path (absolute).
28
+ """
29
+ self.target_path = target_path.resolve()
30
+
31
+ @property
32
+ def backup_dir(self) -> Path:
33
+ """Get the backup directory path.
34
+
35
+ Returns:
36
+ Path to .moai-backups directory.
37
+ """
38
+ return self.target_path / ".moai-backups"
39
+
40
+ def has_existing_files(self) -> bool:
41
+ """Check whether backup-worthy files already exist.
42
+
43
+ Returns:
44
+ True when any tracked file exists.
45
+ """
46
+ return any((self.target_path / item).exists() for item in [".moai", ".claude", ".github", "CLAUDE.md"])
47
+
48
+ def create_backup(self) -> Path:
49
+ """Create a timestamped backup under .moai-backups/.
50
+
51
+ Creates a new timestamped backup directory for each update.
52
+ Maintains backward compatibility by supporting both new and legacy structures.
53
+
54
+ Returns:
55
+ Path to timestamped backup directory (e.g., .moai-backups/20241201_143022/).
56
+ """
57
+ # Generate timestamp for backup directory name
58
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
59
+ backup_path = self.target_path / ".moai-backups" / timestamp
60
+
61
+ backup_path.mkdir(parents=True, exist_ok=True)
62
+
63
+ # Copy backup targets
64
+ for item in [".moai", ".claude", ".github", "CLAUDE.md"]:
65
+ src = self.target_path / item
66
+ if not src.exists():
67
+ continue
68
+
69
+ dst = backup_path / item
70
+
71
+ if item == ".moai":
72
+ # Copy while skipping protected paths
73
+ self._copy_exclude_protected(src, dst)
74
+ elif src.is_dir():
75
+ shutil.copytree(src, dst, dirs_exist_ok=True)
76
+ else:
77
+ shutil.copy2(src, dst)
78
+
79
+ return backup_path
80
+
81
+ def get_latest_backup(self) -> Path | None:
82
+ """Get the most recent backup, supporting both new and legacy structures.
83
+
84
+ Searches for backups in order of preference:
85
+ 1. Latest timestamped backup (new structure)
86
+ 2. Legacy backup/ directory (old structure)
87
+
88
+ Returns:
89
+ Path to the most recent backup directory, or None if no backups exist.
90
+ """
91
+ # Check for new timestamped backups first
92
+ backup_dir = self.target_path / ".moai-backups"
93
+ if backup_dir.exists():
94
+ # Match pattern: YYYYMMDD_HHMMSS (8 digits + underscore + 6 digits)
95
+ timestamp_pattern = re.compile(r"^\d{8}_\d{6}$")
96
+ timestamped_backups = [d for d in backup_dir.iterdir() if d.is_dir() and timestamp_pattern.match(d.name)]
97
+
98
+ if timestamped_backups:
99
+ # Sort by name (timestamp) and return the latest
100
+ latest_backup = max(timestamped_backups, key=lambda x: x.name)
101
+ return latest_backup
102
+
103
+ # Fall back to legacy backup/ directory
104
+ legacy_backup = backup_dir / "backup"
105
+ if legacy_backup.exists():
106
+ return legacy_backup
107
+
108
+ return None
109
+
110
+ def _copy_exclude_protected(self, src: Path, dst: Path) -> None:
111
+ """Copy backup content while excluding protected paths.
112
+
113
+ Args:
114
+ src: Source directory.
115
+ dst: Destination directory.
116
+ """
117
+ dst.mkdir(parents=True, exist_ok=True)
118
+
119
+ for item in src.rglob("*"):
120
+ rel_path = item.relative_to(src)
121
+ rel_path_str = str(rel_path)
122
+
123
+ # Skip excluded paths
124
+ if any(rel_path_str.startswith(exclude_dir) for exclude_dir in self.BACKUP_EXCLUDE_DIRS):
125
+ continue
126
+
127
+ dst_item = dst / rel_path
128
+ if item.is_file():
129
+ dst_item.parent.mkdir(parents=True, exist_ok=True)
130
+ shutil.copy2(item, dst_item)
131
+ elif item.is_dir():
132
+ dst_item.mkdir(parents=True, exist_ok=True)
133
+
134
+ def restore_backup(self, backup_path: Path | None = None) -> None:
135
+ """Restore project files from backup.
136
+
137
+ Restores .moai, .claude, .github directories and CLAUDE.md file
138
+ from a backup created by create_backup().
139
+ Supports both new timestamped and legacy backup structures.
140
+
141
+ Args:
142
+ backup_path: Backup path to restore from.
143
+ If None, automatically finds the latest backup.
144
+
145
+ Raises:
146
+ FileNotFoundError: When no backup is found.
147
+ """
148
+ if backup_path is None:
149
+ backup_path = self.get_latest_backup()
150
+
151
+ if backup_path is None or not backup_path.exists():
152
+ raise FileNotFoundError(f"Backup not found: {backup_path}")
153
+
154
+ # Restore each item from backup
155
+ for item in [".moai", ".claude", ".github", "CLAUDE.md"]:
156
+ src = backup_path / item
157
+ dst = self.target_path / item
158
+
159
+ # Skip if not in backup
160
+ if not src.exists():
161
+ continue
162
+
163
+ # Remove current version
164
+ if dst.exists():
165
+ if dst.is_dir():
166
+ shutil.rmtree(dst)
167
+ else:
168
+ dst.unlink()
169
+
170
+ # Restore from backup
171
+ if src.is_dir():
172
+ shutil.copytree(src, dst, dirs_exist_ok=True)
173
+ else:
174
+ shutil.copy2(src, dst)