moai-adk 0.8.0__py3-none-any.whl → 0.34.0__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.
Files changed (654) hide show
  1. moai_adk/__init__.py +2 -6
  2. moai_adk/__main__.py +136 -21
  3. moai_adk/cli/__init__.py +6 -2
  4. moai_adk/cli/commands/__init__.py +1 -4
  5. moai_adk/cli/commands/analyze.py +116 -0
  6. moai_adk/cli/commands/doctor.py +17 -5
  7. moai_adk/cli/commands/init.py +118 -48
  8. moai_adk/cli/commands/language.py +248 -0
  9. moai_adk/cli/commands/status.py +8 -13
  10. moai_adk/cli/commands/update.py +1978 -149
  11. moai_adk/cli/main.py +3 -2
  12. moai_adk/cli/prompts/init_prompts.py +144 -91
  13. moai_adk/cli/spec_status.py +263 -0
  14. moai_adk/cli/ui/__init__.py +44 -0
  15. moai_adk/cli/ui/progress.py +422 -0
  16. moai_adk/cli/ui/prompts.py +389 -0
  17. moai_adk/cli/ui/theme.py +129 -0
  18. moai_adk/cli/worktree/__init__.py +27 -0
  19. moai_adk/cli/worktree/__main__.py +31 -0
  20. moai_adk/cli/worktree/cli.py +683 -0
  21. moai_adk/cli/worktree/exceptions.py +89 -0
  22. moai_adk/cli/worktree/manager.py +493 -0
  23. moai_adk/cli/worktree/models.py +65 -0
  24. moai_adk/cli/worktree/registry.py +422 -0
  25. moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
  26. moai_adk/core/__init__.py +0 -1
  27. moai_adk/core/analysis/__init__.py +9 -0
  28. moai_adk/core/analysis/session_analyzer.py +400 -0
  29. moai_adk/core/claude_integration.py +393 -0
  30. moai_adk/core/command_helpers.py +270 -0
  31. moai_adk/core/comprehensive_monitoring_system.py +1183 -0
  32. moai_adk/core/config/__init__.py +6 -0
  33. moai_adk/core/config/auto_spec_config.py +340 -0
  34. moai_adk/core/config/migration.py +148 -17
  35. moai_adk/core/config/unified.py +436 -0
  36. moai_adk/core/context_manager.py +273 -0
  37. moai_adk/core/diagnostics/slash_commands.py +0 -1
  38. moai_adk/core/enterprise_features.py +1404 -0
  39. moai_adk/core/error_recovery_system.py +1902 -0
  40. moai_adk/core/event_driven_hook_system.py +1371 -0
  41. moai_adk/core/git/__init__.py +8 -1
  42. moai_adk/core/git/branch.py +0 -1
  43. moai_adk/core/git/branch_manager.py +2 -10
  44. moai_adk/core/git/checkpoint.py +1 -7
  45. moai_adk/core/git/commit.py +0 -1
  46. moai_adk/core/git/conflict_detector.py +413 -0
  47. moai_adk/core/git/event_detector.py +3 -5
  48. moai_adk/core/git/manager.py +91 -2
  49. moai_adk/core/hooks/post_tool_auto_spec_completion.py +901 -0
  50. moai_adk/core/input_validation_middleware.py +1006 -0
  51. moai_adk/core/integration/__init__.py +22 -0
  52. moai_adk/core/integration/engine.py +157 -0
  53. moai_adk/core/integration/integration_tester.py +226 -0
  54. moai_adk/core/integration/models.py +88 -0
  55. moai_adk/core/integration/utils.py +211 -0
  56. moai_adk/core/issue_creator.py +305 -0
  57. moai_adk/core/jit_context_loader.py +956 -0
  58. moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
  59. moai_adk/core/language_config.py +202 -0
  60. moai_adk/core/language_config_resolver.py +572 -0
  61. moai_adk/core/language_validator.py +543 -0
  62. moai_adk/core/mcp/setup.py +116 -0
  63. moai_adk/core/merge/__init__.py +9 -0
  64. moai_adk/core/merge/analyzer.py +481 -0
  65. moai_adk/core/migration/__init__.py +18 -0
  66. moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
  67. moai_adk/core/migration/backup_manager.py +277 -0
  68. moai_adk/core/migration/custom_element_scanner.py +358 -0
  69. moai_adk/core/migration/file_migrator.py +209 -0
  70. moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
  71. moai_adk/core/migration/selective_restorer.py +470 -0
  72. moai_adk/core/migration/template_utils.py +74 -0
  73. moai_adk/core/migration/user_selection_ui.py +338 -0
  74. moai_adk/core/migration/version_detector.py +139 -0
  75. moai_adk/core/migration/version_migrator.py +228 -0
  76. moai_adk/core/performance/__init__.py +6 -0
  77. moai_adk/core/performance/cache_system.py +316 -0
  78. moai_adk/core/performance/parallel_processor.py +116 -0
  79. moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
  80. moai_adk/core/project/__init__.py +0 -1
  81. moai_adk/core/project/backup_utils.py +2 -7
  82. moai_adk/core/project/checker.py +2 -4
  83. moai_adk/core/project/detector.py +189 -22
  84. moai_adk/core/project/initializer.py +218 -27
  85. moai_adk/core/project/phase_executor.py +416 -44
  86. moai_adk/core/project/validator.py +7 -32
  87. moai_adk/core/quality/__init__.py +1 -1
  88. moai_adk/core/quality/trust_checker.py +37 -101
  89. moai_adk/core/quality/validators/__init__.py +1 -1
  90. moai_adk/core/quality/validators/base_validator.py +1 -1
  91. moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
  92. moai_adk/core/robust_json_parser.py +611 -0
  93. moai_adk/core/rollback_manager.py +918 -0
  94. moai_adk/core/session_manager.py +651 -0
  95. moai_adk/core/skill_loading_system.py +579 -0
  96. moai_adk/core/spec/confidence_scoring.py +680 -0
  97. moai_adk/core/spec/ears_template_engine.py +1247 -0
  98. moai_adk/core/spec/quality_validator.py +687 -0
  99. moai_adk/core/spec_status_manager.py +478 -0
  100. moai_adk/core/template/__init__.py +0 -1
  101. moai_adk/core/template/backup.py +82 -17
  102. moai_adk/core/template/config.py +112 -40
  103. moai_adk/core/template/languages.py +0 -1
  104. moai_adk/core/template/merger.py +75 -26
  105. moai_adk/core/template/processor.py +750 -72
  106. moai_adk/core/template_engine.py +310 -0
  107. moai_adk/core/template_variable_synchronizer.py +417 -0
  108. moai_adk/core/unified_permission_manager.py +745 -0
  109. moai_adk/core/user_behavior_analytics.py +851 -0
  110. moai_adk/core/version_sync.py +429 -0
  111. moai_adk/foundation/__init__.py +56 -0
  112. moai_adk/foundation/backend.py +1027 -0
  113. moai_adk/foundation/database.py +1115 -0
  114. moai_adk/foundation/devops.py +1585 -0
  115. moai_adk/foundation/ears.py +431 -0
  116. moai_adk/foundation/frontend.py +870 -0
  117. moai_adk/foundation/git/commit_templates.py +557 -0
  118. moai_adk/foundation/git.py +376 -0
  119. moai_adk/foundation/langs.py +484 -0
  120. moai_adk/foundation/ml_ops.py +1162 -0
  121. moai_adk/foundation/testing.py +1524 -0
  122. moai_adk/foundation/trust/trust_principles.py +676 -0
  123. moai_adk/foundation/trust/validation_checklist.py +1573 -0
  124. moai_adk/project/__init__.py +0 -0
  125. moai_adk/project/configuration.py +1084 -0
  126. moai_adk/project/documentation.py +566 -0
  127. moai_adk/project/schema.py +447 -0
  128. moai_adk/statusline/__init__.py +38 -0
  129. moai_adk/statusline/alfred_detector.py +105 -0
  130. moai_adk/statusline/config.py +376 -0
  131. moai_adk/statusline/enhanced_output_style_detector.py +372 -0
  132. moai_adk/statusline/git_collector.py +190 -0
  133. moai_adk/statusline/main.py +322 -0
  134. moai_adk/statusline/metrics_tracker.py +78 -0
  135. moai_adk/statusline/renderer.py +343 -0
  136. moai_adk/statusline/update_checker.py +129 -0
  137. moai_adk/statusline/version_reader.py +741 -0
  138. moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +670 -0
  139. moai_adk/templates/.claude/agents/moai/builder-agent.md +474 -0
  140. moai_adk/templates/.claude/agents/moai/builder-command.md +1172 -0
  141. moai_adk/templates/.claude/agents/moai/builder-skill.md +666 -0
  142. moai_adk/templates/.claude/agents/moai/expert-backend.md +899 -0
  143. moai_adk/templates/.claude/agents/moai/expert-database.md +777 -0
  144. moai_adk/templates/.claude/agents/moai/expert-debug.md +401 -0
  145. moai_adk/templates/.claude/agents/moai/expert-devops.md +720 -0
  146. moai_adk/templates/.claude/agents/moai/expert-frontend.md +734 -0
  147. moai_adk/templates/.claude/agents/moai/expert-performance.md +657 -0
  148. moai_adk/templates/.claude/agents/moai/expert-security.md +509 -0
  149. moai_adk/templates/.claude/agents/moai/expert-testing.md +733 -0
  150. moai_adk/templates/.claude/agents/moai/expert-uiux.md +1041 -0
  151. moai_adk/templates/.claude/agents/moai/manager-claude-code.md +432 -0
  152. moai_adk/templates/.claude/agents/moai/manager-docs.md +573 -0
  153. moai_adk/templates/.claude/agents/moai/manager-git.md +1020 -0
  154. moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
  155. moai_adk/templates/.claude/agents/moai/manager-quality.md +624 -0
  156. moai_adk/templates/.claude/agents/moai/manager-spec.md +809 -0
  157. moai_adk/templates/.claude/agents/moai/manager-strategy.md +780 -0
  158. moai_adk/templates/.claude/agents/moai/manager-tdd.md +784 -0
  159. moai_adk/templates/.claude/agents/moai/mcp-context7.md +458 -0
  160. moai_adk/templates/.claude/agents/moai/mcp-figma.md +1607 -0
  161. moai_adk/templates/.claude/agents/moai/mcp-notion.md +789 -0
  162. moai_adk/templates/.claude/agents/moai/mcp-playwright.md +469 -0
  163. moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +1032 -0
  164. moai_adk/templates/.claude/commands/moai/0-project.md +1384 -0
  165. moai_adk/templates/.claude/commands/moai/1-plan.md +1427 -0
  166. moai_adk/templates/.claude/commands/moai/2-run.md +943 -0
  167. moai_adk/templates/.claude/commands/moai/3-sync.md +1324 -0
  168. moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
  169. moai_adk/templates/.claude/hooks/__init__.py +8 -0
  170. moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
  171. moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
  172. moai_adk/templates/.claude/hooks/{alfred/core → moai/lib}/checkpoint.py +10 -37
  173. moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
  174. moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
  175. moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
  176. moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
  177. moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
  178. moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
  179. moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
  180. moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
  181. moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
  182. moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
  183. moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
  184. moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
  185. moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
  186. moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +1075 -0
  187. moai_adk/templates/.claude/output-styles/moai/r2d2.md +560 -0
  188. moai_adk/templates/.claude/output-styles/moai/yoda.md +359 -0
  189. moai_adk/templates/.claude/settings.json +78 -50
  190. moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +438 -0
  191. moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -0
  192. moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +249 -0
  193. moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +406 -0
  194. moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
  195. moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
  196. moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
  197. moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
  198. moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
  199. moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +328 -0
  200. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +313 -283
  201. moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +610 -1525
  202. moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +423 -619
  203. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +295 -95
  204. moai_adk/templates/.claude/skills/moai-domain-database/examples.md +817 -16
  205. moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
  206. moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
  207. moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
  208. moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
  209. moai_adk/templates/.claude/skills/moai-domain-database/reference.md +532 -17
  210. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +470 -97
  211. moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +955 -16
  212. moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +651 -18
  213. moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +455 -0
  214. moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
  215. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
  216. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
  217. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
  218. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
  219. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
  220. moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
  221. moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +492 -0
  222. moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -0
  223. moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
  224. moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
  225. moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
  226. moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
  227. moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
  228. moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
  229. moai_adk/templates/.claude/skills/moai-formats-data/reference.md +585 -0
  230. moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +202 -0
  231. moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -0
  232. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
  233. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
  234. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
  235. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
  236. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
  237. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
  238. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
  239. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
  240. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
  241. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
  242. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
  243. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
  244. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
  245. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
  246. moai_adk/templates/.claude/skills/moai-foundation-claude/reference.md +209 -0
  247. moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +441 -0
  248. moai_adk/templates/.claude/skills/moai-foundation-context/examples.md +1048 -0
  249. moai_adk/templates/.claude/skills/moai-foundation-context/reference.md +246 -0
  250. moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +420 -0
  251. moai_adk/templates/.claude/skills/moai-foundation-core/examples.md +358 -0
  252. moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
  253. moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +359 -0
  254. moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
  255. moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
  256. moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
  257. moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
  258. moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
  259. moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
  260. moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
  261. moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
  262. moai_adk/templates/.claude/skills/moai-foundation-core/reference.md +478 -0
  263. moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +315 -0
  264. moai_adk/templates/.claude/skills/moai-foundation-philosopher/examples.md +228 -0
  265. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/assumption-matrix.md +80 -0
  266. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/cognitive-bias.md +199 -0
  267. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/first-principles.md +140 -0
  268. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/trade-off-analysis.md +154 -0
  269. moai_adk/templates/.claude/skills/moai-foundation-philosopher/reference.md +157 -0
  270. moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +364 -0
  271. moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
  272. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
  273. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
  274. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
  275. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
  276. moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
  277. moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
  278. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
  279. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
  280. moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +618 -93
  281. moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +446 -91
  282. moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +612 -0
  283. moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +477 -0
  284. moai_adk/templates/.claude/skills/moai-lang-flutter/examples.md +1090 -0
  285. moai_adk/templates/.claude/skills/moai-lang-flutter/reference.md +686 -0
  286. moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +346 -94
  287. moai_adk/templates/.claude/skills/moai-lang-go/examples.md +906 -16
  288. moai_adk/templates/.claude/skills/moai-lang-go/reference.md +721 -15
  289. moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +352 -91
  290. moai_adk/templates/.claude/skills/moai-lang-java/examples.md +851 -16
  291. moai_adk/templates/.claude/skills/moai-lang-java/reference.md +278 -18
  292. moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +344 -86
  293. moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +993 -16
  294. moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +549 -18
  295. moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +617 -96
  296. moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +364 -314
  297. moai_adk/templates/.claude/skills/moai-lang-python/examples.md +849 -496
  298. moai_adk/templates/.claude/skills/moai-lang-python/reference.md +731 -243
  299. moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +545 -89
  300. moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +650 -87
  301. moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +341 -93
  302. moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +646 -16
  303. moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +491 -18
  304. moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +463 -89
  305. moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +620 -16
  306. moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +410 -17
  307. moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +486 -112
  308. moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +905 -16
  309. moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +659 -17
  310. moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +333 -92
  311. moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +1076 -16
  312. moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +718 -21
  313. moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +300 -0
  314. moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
  315. moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
  316. moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
  317. moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
  318. moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +319 -0
  319. moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
  320. moai_adk/templates/.claude/skills/moai-library-nextra/examples.md +592 -0
  321. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
  322. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
  323. moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
  324. moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
  325. moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
  326. moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
  327. moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
  328. moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
  329. moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
  330. moai_adk/templates/.claude/skills/moai-library-nextra/reference.md +379 -0
  331. moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +372 -0
  332. moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
  333. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
  334. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
  335. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
  336. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
  337. moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
  338. moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +402 -0
  339. moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +607 -0
  340. moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +300 -0
  341. moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +537 -0
  342. moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +290 -0
  343. moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +390 -0
  344. moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +398 -0
  345. moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +379 -0
  346. moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +358 -0
  347. moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +467 -0
  348. moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +377 -0
  349. moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +466 -0
  350. moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +482 -0
  351. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +449 -0
  352. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
  353. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
  354. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
  355. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/reference.md +307 -0
  356. moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
  357. moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +390 -0
  358. moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
  359. moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
  360. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
  361. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
  362. moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
  363. moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +175 -0
  364. moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
  365. moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -0
  366. moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
  367. moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
  368. moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
  369. moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
  370. moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
  371. moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
  372. moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
  373. moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
  374. moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
  375. moai_adk/templates/.claude/skills/moai-workflow-project/reference.md +275 -0
  376. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
  377. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1462 -0
  378. moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
  379. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
  380. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
  381. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +92 -0
  382. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
  383. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
  384. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
  385. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
  386. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
  387. moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
  388. moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +534 -0
  389. moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
  390. moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
  391. moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +377 -0
  392. moai_adk/templates/.claude/skills/moai-workflow-templates/examples.md +552 -0
  393. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
  394. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
  395. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
  396. moai_adk/templates/.claude/skills/moai-workflow-templates/reference.md +346 -0
  397. moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
  398. moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +456 -0
  399. moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
  400. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
  401. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
  402. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
  403. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
  404. moai_adk/templates/.claude/skills/moai-workflow-testing/examples.md +672 -0
  405. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
  406. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
  407. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
  408. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
  409. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
  410. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
  411. moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
  412. moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
  413. moai_adk/templates/.claude/skills/moai-workflow-testing/reference.md +440 -0
  414. moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
  415. moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
  416. moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
  417. moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +411 -0
  418. moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
  419. moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
  420. moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
  421. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
  422. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
  423. moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
  424. moai_adk/templates/.git-hooks/pre-commit +128 -0
  425. moai_adk/templates/.git-hooks/pre-push +365 -0
  426. moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
  427. moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
  428. moai_adk/templates/.github/workflows/spec-issue-sync.yml +206 -36
  429. moai_adk/templates/.gitignore +194 -13
  430. moai_adk/templates/.mcp.json +31 -0
  431. moai_adk/templates/.moai/config/config.yaml +58 -0
  432. moai_adk/templates/.moai/config/questions/_schema.yaml +151 -0
  433. moai_adk/templates/.moai/config/questions/tab0-init.yaml +251 -0
  434. moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
  435. moai_adk/templates/.moai/config/questions/tab2-project.yaml +81 -0
  436. moai_adk/templates/.moai/config/questions/tab3-git.yaml +634 -0
  437. moai_adk/templates/.moai/config/questions/tab4-quality.yaml +170 -0
  438. moai_adk/templates/.moai/config/questions/tab5-system.yaml +87 -0
  439. moai_adk/templates/.moai/config/sections/git-strategy.yaml +116 -0
  440. moai_adk/templates/.moai/config/sections/language.yaml +11 -0
  441. moai_adk/templates/.moai/config/sections/project.yaml +13 -0
  442. moai_adk/templates/.moai/config/sections/quality.yaml +17 -0
  443. moai_adk/templates/.moai/config/sections/system.yaml +14 -0
  444. moai_adk/templates/.moai/config/sections/user.yaml +5 -0
  445. moai_adk/templates/.moai/config/statusline-config.yaml +92 -0
  446. moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
  447. moai_adk/templates/CLAUDE.md +571 -244
  448. moai_adk/utils/__init__.py +24 -2
  449. moai_adk/utils/banner.py +9 -13
  450. moai_adk/utils/common.py +294 -0
  451. moai_adk/utils/link_validator.py +241 -0
  452. moai_adk/utils/logger.py +4 -9
  453. moai_adk/utils/safe_file_reader.py +206 -0
  454. moai_adk/utils/timeout.py +160 -0
  455. moai_adk/utils/toon_utils.py +256 -0
  456. moai_adk/version.py +22 -0
  457. moai_adk-0.34.0.dist-info/METADATA +2999 -0
  458. moai_adk-0.34.0.dist-info/RECORD +463 -0
  459. {moai_adk-0.8.0.dist-info → moai_adk-0.34.0.dist-info}/WHEEL +1 -1
  460. {moai_adk-0.8.0.dist-info → moai_adk-0.34.0.dist-info}/entry_points.txt +1 -0
  461. moai_adk/cli/commands/backup.py +0 -80
  462. moai_adk/templates/.claude/agents/alfred/cc-manager.md +0 -293
  463. moai_adk/templates/.claude/agents/alfred/debug-helper.md +0 -196
  464. moai_adk/templates/.claude/agents/alfred/doc-syncer.md +0 -207
  465. moai_adk/templates/.claude/agents/alfred/git-manager.md +0 -375
  466. moai_adk/templates/.claude/agents/alfred/implementation-planner.md +0 -343
  467. moai_adk/templates/.claude/agents/alfred/project-manager.md +0 -246
  468. moai_adk/templates/.claude/agents/alfred/quality-gate.md +0 -320
  469. moai_adk/templates/.claude/agents/alfred/skill-factory.md +0 -837
  470. moai_adk/templates/.claude/agents/alfred/spec-builder.md +0 -272
  471. moai_adk/templates/.claude/agents/alfred/tag-agent.md +0 -265
  472. moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +0 -311
  473. moai_adk/templates/.claude/agents/alfred/trust-checker.md +0 -352
  474. moai_adk/templates/.claude/commands/alfred/0-project.md +0 -1184
  475. moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -665
  476. moai_adk/templates/.claude/commands/alfred/2-run.md +0 -488
  477. moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -623
  478. moai_adk/templates/.claude/hooks/alfred/HOOK_SCHEMA_VALIDATION.md +0 -313
  479. moai_adk/templates/.claude/hooks/alfred/README.md +0 -230
  480. moai_adk/templates/.claude/hooks/alfred/alfred_hooks.py +0 -174
  481. moai_adk/templates/.claude/hooks/alfred/core/__init__.py +0 -170
  482. moai_adk/templates/.claude/hooks/alfred/core/context.py +0 -67
  483. moai_adk/templates/.claude/hooks/alfred/core/project.py +0 -416
  484. moai_adk/templates/.claude/hooks/alfred/core/tags.py +0 -198
  485. moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +0 -21
  486. moai_adk/templates/.claude/hooks/alfred/handlers/notification.py +0 -25
  487. moai_adk/templates/.claude/hooks/alfred/handlers/session.py +0 -161
  488. moai_adk/templates/.claude/hooks/alfred/handlers/tool.py +0 -90
  489. moai_adk/templates/.claude/hooks/alfred/handlers/user.py +0 -42
  490. moai_adk/templates/.claude/hooks/alfred/test_hook_output.py +0 -175
  491. moai_adk/templates/.claude/output-styles/alfred/agentic-coding.md +0 -640
  492. moai_adk/templates/.claude/output-styles/alfred/moai-adk-learning.md +0 -696
  493. moai_adk/templates/.claude/output-styles/alfred/study-with-alfred.md +0 -474
  494. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -113
  495. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/examples.md +0 -29
  496. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/reference.md +0 -28
  497. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -122
  498. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/examples.md +0 -29
  499. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/reference.md +0 -29
  500. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/SKILL.md +0 -237
  501. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/examples.md +0 -615
  502. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/reference.md +0 -653
  503. moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +0 -113
  504. moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +0 -29
  505. moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +0 -28
  506. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -113
  507. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/examples.md +0 -29
  508. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/reference.md +0 -28
  509. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -113
  510. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/examples.md +0 -29
  511. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/reference.md +0 -28
  512. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -113
  513. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/examples.md +0 -29
  514. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/reference.md +0 -28
  515. moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +0 -269
  516. moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +0 -32
  517. moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +0 -298
  518. moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +0 -26
  519. moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +0 -307
  520. moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +0 -21
  521. moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +0 -252
  522. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +0 -19
  523. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +0 -19
  524. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +0 -24
  525. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +0 -199
  526. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +0 -39
  527. moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +0 -316
  528. moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +0 -18
  529. moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +0 -263
  530. moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +0 -30
  531. moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +0 -291
  532. moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +0 -15
  533. moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +0 -123
  534. moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +0 -29
  535. moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +0 -30
  536. moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +0 -123
  537. moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +0 -29
  538. moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +0 -30
  539. moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +0 -124
  540. moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +0 -29
  541. moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +0 -31
  542. moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +0 -123
  543. moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +0 -29
  544. moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +0 -30
  545. moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +0 -123
  546. moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +0 -29
  547. moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +0 -30
  548. moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +0 -123
  549. moai_adk/templates/.claude/skills/moai-domain-security/examples.md +0 -29
  550. moai_adk/templates/.claude/skills/moai-domain-security/reference.md +0 -30
  551. moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +0 -123
  552. moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +0 -29
  553. moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +0 -30
  554. moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +0 -303
  555. moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +0 -1064
  556. moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +0 -1047
  557. moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +0 -113
  558. moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +0 -29
  559. moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +0 -28
  560. moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +0 -113
  561. moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +0 -29
  562. moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +0 -28
  563. moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +0 -113
  564. moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +0 -29
  565. moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +0 -28
  566. moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +0 -113
  567. moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +0 -29
  568. moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +0 -28
  569. moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +0 -122
  570. moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +0 -29
  571. moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +0 -29
  572. moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +0 -113
  573. moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +0 -29
  574. moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +0 -28
  575. moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +0 -113
  576. moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +0 -29
  577. moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +0 -28
  578. moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +0 -113
  579. moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +0 -29
  580. moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +0 -28
  581. moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +0 -307
  582. moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
  583. moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +0 -1099
  584. moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +0 -124
  585. moai_adk/templates/.claude/skills/moai-lang-c/examples.md +0 -29
  586. moai_adk/templates/.claude/skills/moai-lang-c/reference.md +0 -31
  587. moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +0 -29
  588. moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +0 -31
  589. moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +0 -29
  590. moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +0 -30
  591. moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +0 -123
  592. moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +0 -29
  593. moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +0 -30
  594. moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +0 -125
  595. moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +0 -29
  596. moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +0 -32
  597. moai_adk/templates/.claude/skills/moai-lang-php/examples.md +0 -29
  598. moai_adk/templates/.claude/skills/moai-lang-php/reference.md +0 -30
  599. moai_adk/templates/.claude/skills/moai-lang-r/examples.md +0 -29
  600. moai_adk/templates/.claude/skills/moai-lang-r/reference.md +0 -30
  601. moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +0 -29
  602. moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +0 -31
  603. moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +0 -123
  604. moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +0 -29
  605. moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +0 -30
  606. moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +0 -124
  607. moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +0 -29
  608. moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +0 -31
  609. moai_adk/templates/.claude/skills/moai-skill-factory/CHECKLIST.md +0 -482
  610. moai_adk/templates/.claude/skills/moai-skill-factory/EXAMPLES.md +0 -278
  611. moai_adk/templates/.claude/skills/moai-skill-factory/INTERACTIVE-DISCOVERY.md +0 -524
  612. moai_adk/templates/.claude/skills/moai-skill-factory/METADATA.md +0 -477
  613. moai_adk/templates/.claude/skills/moai-skill-factory/PARALLEL-ANALYSIS-REPORT.md +0 -429
  614. moai_adk/templates/.claude/skills/moai-skill-factory/PYTHON-VERSION-MATRIX.md +0 -391
  615. moai_adk/templates/.claude/skills/moai-skill-factory/SKILL-FACTORY-WORKFLOW.md +0 -431
  616. moai_adk/templates/.claude/skills/moai-skill-factory/SKILL-UPDATE-ADVISOR.md +0 -577
  617. moai_adk/templates/.claude/skills/moai-skill-factory/SKILL.md +0 -271
  618. moai_adk/templates/.claude/skills/moai-skill-factory/STEP-BY-STEP-GUIDE.md +0 -466
  619. moai_adk/templates/.claude/skills/moai-skill-factory/STRUCTURE.md +0 -583
  620. moai_adk/templates/.claude/skills/moai-skill-factory/WEB-RESEARCH.md +0 -526
  621. moai_adk/templates/.claude/skills/moai-skill-factory/reference.md +0 -465
  622. moai_adk/templates/.claude/skills/moai-skill-factory/scripts/generate-structure.sh +0 -328
  623. moai_adk/templates/.claude/skills/moai-skill-factory/scripts/validate-skill.sh +0 -312
  624. moai_adk/templates/.claude/skills/moai-skill-factory/templates/SKILL_TEMPLATE.md +0 -245
  625. moai_adk/templates/.claude/skills/moai-skill-factory/templates/examples-template.md +0 -285
  626. moai_adk/templates/.claude/skills/moai-skill-factory/templates/reference-template.md +0 -278
  627. moai_adk/templates/.claude/skills/moai-skill-factory/templates/scripts-template.sh +0 -303
  628. moai_adk/templates/.claude/skills/moai-spec-authoring/README.md +0 -137
  629. moai_adk/templates/.claude/skills/moai-spec-authoring/SKILL.md +0 -218
  630. moai_adk/templates/.claude/skills/moai-spec-authoring/examples/validate-spec.sh +0 -161
  631. moai_adk/templates/.claude/skills/moai-spec-authoring/examples.md +0 -541
  632. moai_adk/templates/.claude/skills/moai-spec-authoring/reference.md +0 -622
  633. moai_adk/templates/.github/ISSUE_TEMPLATE/spec.yml +0 -176
  634. moai_adk/templates/.github/PULL_REQUEST_TEMPLATE.md +0 -69
  635. moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -256
  636. moai_adk/templates/.moai/config.json +0 -96
  637. moai_adk/templates/.moai/memory/CLAUDE-AGENTS-GUIDE.md +0 -208
  638. moai_adk/templates/.moai/memory/CLAUDE-PRACTICES.md +0 -369
  639. moai_adk/templates/.moai/memory/CLAUDE-RULES.md +0 -539
  640. moai_adk/templates/.moai/memory/CONFIG-SCHEMA.md +0 -444
  641. moai_adk/templates/.moai/memory/DEVELOPMENT-GUIDE.md +0 -344
  642. moai_adk/templates/.moai/memory/GITFLOW-PROTECTION-POLICY.md +0 -220
  643. moai_adk/templates/.moai/memory/SKILLS-DESCRIPTION-POLICY.md +0 -218
  644. moai_adk/templates/.moai/memory/SPEC-METADATA.md +0 -356
  645. moai_adk/templates/.moai/memory/config-schema.md +0 -444
  646. moai_adk/templates/.moai/memory/gitflow-protection-policy.md +0 -220
  647. moai_adk/templates/.moai/memory/spec-metadata.md +0 -356
  648. moai_adk/templates/.moai/project/product.md +0 -161
  649. moai_adk/templates/.moai/project/structure.md +0 -156
  650. moai_adk/templates/.moai/project/tech.md +0 -227
  651. moai_adk/templates/__init__.py +0 -2
  652. moai_adk-0.8.0.dist-info/METADATA +0 -1722
  653. moai_adk-0.8.0.dist-info/RECORD +0 -282
  654. {moai_adk-0.8.0.dist-info → moai_adk-0.34.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,768 @@
1
+ #!/usr/bin/env python3
2
+ """Project metadata utilities
3
+
4
+ Project information inquiry (language, Git, SPEC progress, etc.)
5
+ """
6
+
7
+ import json
8
+ import signal
9
+ import socket
10
+ import subprocess
11
+ from contextlib import contextmanager
12
+ from pathlib import Path
13
+ from typing import Any
14
+
15
+ import yaml
16
+
17
+ # Import TimeoutError from lib.timeout (canonical definition)
18
+ try:
19
+ from lib.timeout import TimeoutError # noqa: F401
20
+ except ImportError:
21
+ # Fallback if lib.timeout not available
22
+ class TimeoutError(Exception): # type: ignore[no-redef]
23
+ """Signal-based timeout exception"""
24
+
25
+ pass
26
+
27
+
28
+ # Cache directory for version check results
29
+ CACHE_DIR_NAME = ".moai/cache"
30
+
31
+
32
+ def find_project_root(start_path: str | Path = ".") -> Path:
33
+ """Find MoAI-ADK project root by searching upward for .moai/config/config.yaml
34
+
35
+ Traverses up the directory tree until it finds .moai/config/config.yaml or CLAUDE.md,
36
+ which indicates the project root. This ensures cache and other files are
37
+ always created in the correct location, regardless of where hooks execute.
38
+
39
+ Args:
40
+ start_path: Starting directory (default: current directory)
41
+
42
+ Returns:
43
+ Project root Path. If not found, returns start_path as absolute path.
44
+
45
+ Examples:
46
+ >>> find_project_root(".")
47
+ Path("/Users/user/my-project")
48
+ >>> find_project_root(".claude/hooks/alfred")
49
+ Path("/Users/user/my-project") # Found root 3 levels up
50
+
51
+ Notes:
52
+ - Searches for .moai/config/config.yaml first (most reliable)
53
+ - Falls back to CLAUDE.md if config.yaml not found
54
+ - Max depth: 10 levels up (prevent infinite loop)
55
+ - Returns absolute path for consistency
56
+
57
+ TDD History:
58
+ - RED: 4 test scenarios (root, nested, not found, symlinks)
59
+ - GREEN: Minimal upward search with .moai/config/config.yaml detection
60
+ - REFACTOR: Add CLAUDE.md fallback, max depth limit, absolute path return
61
+ """
62
+ current = Path(start_path).resolve()
63
+ max_depth = 10 # Prevent infinite loop
64
+
65
+ for _ in range(max_depth):
66
+ # Check for .moai/config/config.yaml (primary indicator)
67
+ if (current / ".moai" / "config" / "config.yaml").exists():
68
+ return current
69
+
70
+ # Check for CLAUDE.md (secondary indicator)
71
+ if (current / "CLAUDE.md").exists():
72
+ return current
73
+
74
+ # Move up one level
75
+ parent = current.parent
76
+ if parent == current: # Reached filesystem root
77
+ break
78
+ current = parent
79
+
80
+ # Not found - return start_path as absolute
81
+ return Path(start_path).resolve()
82
+
83
+
84
+ @contextmanager
85
+ def timeout_handler(seconds: int):
86
+ """Hard timeout using SIGALRM (works on Unix systems including macOS)
87
+
88
+ This uses kernel-level signal to interrupt ANY blocking operation,
89
+ even if subprocess.run() timeout fails on macOS.
90
+
91
+ Args:
92
+ seconds: Timeout duration in seconds
93
+
94
+ Raises:
95
+ TimeoutError: If operation exceeds timeout
96
+ """
97
+
98
+ def _handle_timeout(signum, frame):
99
+ raise TimeoutError(f"Operation timed out after {seconds} seconds")
100
+
101
+ # Set the signal handler
102
+ old_handler = signal.signal(signal.SIGALRM, _handle_timeout)
103
+ signal.alarm(seconds)
104
+ try:
105
+ yield
106
+ finally:
107
+ signal.alarm(0) # Disable alarm
108
+ signal.signal(signal.SIGALRM, old_handler)
109
+
110
+
111
+ def detect_language(cwd: str) -> str:
112
+ """Detect project language (supports 20 items languages)
113
+
114
+ Browse the File system to detect your project's main development language.
115
+ First, check configuration files such as pyproject.toml and tsconfig.json.
116
+ Apply TypeScript first principles (if tsconfig.json exists).
117
+
118
+ Args:
119
+ cwd: Project root directory path (both absolute and relative paths are possible)
120
+
121
+ Returns:
122
+ str: Detected language name (lowercase). If detection fails, "Unknown Language" is returned.
123
+ Supported languages: python, typescript, javascript, java, go, rust,
124
+ dart, swift, kotlin, php, ruby, elixir, scala,
125
+ clojure, cpp, c, csharp, haskell, shell, lua
126
+
127
+ Examples:
128
+ >>> detect_language("/path/to/python/project")
129
+ 'python'
130
+ >>> detect_language("/path/to/typescript/project")
131
+ 'typescript'
132
+ >>> detect_language("/path/to/unknown/project")
133
+ 'Unknown Language'
134
+
135
+ TDD History:
136
+ - RED: Write a 21 items language detection test (20 items language + 1 items unknown)
137
+ - GREEN: 20 items language + unknown implementation, all tests passed
138
+ - REFACTOR: Optimize file inspection order, apply TypeScript priority principle
139
+ """
140
+ cwd_path = Path(cwd)
141
+
142
+ # Language detection mapping
143
+ language_files = {
144
+ "pyproject.toml": "python",
145
+ "tsconfig.json": "typescript",
146
+ "package.json": "javascript",
147
+ "pom.xml": "java",
148
+ "go.mod": "go",
149
+ "Cargo.toml": "rust",
150
+ "pubspec.yaml": "dart",
151
+ "Package.swift": "swift",
152
+ "build.gradle.kts": "kotlin",
153
+ "composer.json": "php",
154
+ "Gemfile": "ruby",
155
+ "mix.exs": "elixir",
156
+ "build.sbt": "scala",
157
+ "project.clj": "clojure",
158
+ "CMakeLists.txt": "cpp",
159
+ "Makefile": "c",
160
+ }
161
+
162
+ # Check standard language files
163
+ for file_name, language in language_files.items():
164
+ if (cwd_path / file_name).exists():
165
+ # Special handling for package.json - prefer typescript if tsconfig exists
166
+ if file_name == "package.json" and (cwd_path / "tsconfig.json").exists():
167
+ return "typescript"
168
+ return language
169
+
170
+ # Check for C# project files (*.csproj)
171
+ if any(cwd_path.glob("*.csproj")):
172
+ return "csharp"
173
+
174
+ # Check for Haskell project files (*.cabal)
175
+ if any(cwd_path.glob("*.cabal")):
176
+ return "haskell"
177
+
178
+ # Check for Shell scripts (*.sh)
179
+ if any(cwd_path.glob("*.sh")):
180
+ return "shell"
181
+
182
+ # Check for Lua files (*.lua)
183
+ if any(cwd_path.glob("*.lua")):
184
+ return "lua"
185
+
186
+ return "Unknown Language"
187
+
188
+
189
+ def _run_git_command(args: list[str], cwd: str, timeout: int = 2) -> str:
190
+ """Git command execution with HARD timeout protection
191
+
192
+ Safely execute Git commands and return output.
193
+ Uses SIGALRM (kernel-level interrupt) to handle macOS subprocess timeout bug.
194
+ Eliminates code duplication and provides consistent error handling.
195
+
196
+ Args:
197
+ args: Git command argument list (git adds automatically)
198
+ cwd: Execution directory path
199
+ timeout: Timeout in seconds (default: 2 seconds)
200
+
201
+ Returns:
202
+ str: Git command output (stdout, removing leading and trailing spaces)
203
+
204
+ Raises:
205
+ subprocess.TimeoutExpired: Timeout exceeded (via TimeoutError)
206
+ subprocess.CalledProcessError: Git command failed
207
+
208
+ Examples:
209
+ >>> _run_git_command(["branch", "--show-current"], ".")
210
+ 'main'
211
+
212
+ TDD History:
213
+ - RED: Git command hang scenario test
214
+ - GREEN: SIGALRM-based timeout implementation
215
+ - REFACTOR: Exception conversion to subprocess.TimeoutExpired
216
+ """
217
+ try:
218
+ with timeout_handler(timeout):
219
+ result = subprocess.run(
220
+ ["git"] + args,
221
+ cwd=cwd,
222
+ capture_output=True,
223
+ text=True,
224
+ check=False, # Don't raise on non-zero exit - we'll check manually
225
+ )
226
+
227
+ # Check exit code manually
228
+ if result.returncode != 0:
229
+ raise subprocess.CalledProcessError(result.returncode, ["git"] + args, result.stdout, result.stderr)
230
+
231
+ return result.stdout.strip()
232
+
233
+ except TimeoutError:
234
+ # Convert to subprocess.TimeoutExpired for consistent error handling
235
+ raise subprocess.TimeoutExpired(["git"] + args, timeout)
236
+
237
+
238
+ def get_git_info(cwd: str) -> dict[str, Any]:
239
+ """Gather Git repository information
240
+
241
+ View the current status of a Git repository.
242
+ Returns the branch name, commit hash, number of changes, and last commit message.
243
+ If it is not a Git repository, it returns an empty dictionary.
244
+
245
+ Args:
246
+ cwd: Project root directory path
247
+
248
+ Returns:
249
+ Git information dictionary. Includes the following keys:
250
+ - branch: Current branch name (str)
251
+ - commit: Current commit hash (str, full hash)
252
+ - changes: Number of changed files (int, staged + unstaged)
253
+ - last_commit: Last commit message (str, subject only)
254
+
255
+ Empty dictionary {} if it is not a Git repository or the query fails.
256
+
257
+ Examples:
258
+ >>> get_git_info("/path/to/git/repo")
259
+ {'branch': 'main', 'commit': 'abc123...', 'changes': 3, 'last_commit': 'Fix bug'}
260
+ >>> get_git_info("/path/to/non-git")
261
+ {}
262
+
263
+ Notes:
264
+ - Timeout: 2 seconds for each Git command
265
+ - Security: Safe execution with subprocess.run(shell=False)
266
+ - Error handling: Returns an empty dictionary in case of all exceptions
267
+ - Commit message limited to 50 characters for display purposes
268
+
269
+ TDD History:
270
+ - RED: 3 items scenario test (Git repo, non-Git, error)
271
+ - GREEN: Implementation of subprocess-based Git command execution
272
+ - REFACTOR: Add timeout (2 seconds), strengthen exception handling, remove duplicates with helper function
273
+ - UPDATE: Added last_commit message field for SessionStart display
274
+ """
275
+ try:
276
+ # Check if it's a git repository
277
+ _run_git_command(["rev-parse", "--git-dir"], cwd)
278
+
279
+ # Get branch name, commit hash, and changes
280
+ branch = _run_git_command(["branch", "--show-current"], cwd)
281
+ commit = _run_git_command(["rev-parse", "HEAD"], cwd)
282
+ status_output = _run_git_command(["status", "--short"], cwd)
283
+ changes = len([line for line in status_output.splitlines() if line])
284
+
285
+ # Get last commit message (subject only, limited to 50 chars)
286
+ last_commit = _run_git_command(["log", "-1", "--format=%s"], cwd)
287
+ if len(last_commit) > 50:
288
+ last_commit = last_commit[:47] + "..."
289
+
290
+ return {
291
+ "branch": branch,
292
+ "commit": commit,
293
+ "changes": changes,
294
+ "last_commit": last_commit,
295
+ }
296
+
297
+ except (
298
+ subprocess.TimeoutExpired,
299
+ subprocess.CalledProcessError,
300
+ FileNotFoundError,
301
+ ):
302
+ return {}
303
+
304
+
305
+ def count_specs(cwd: str) -> dict[str, int]:
306
+ """SPEC File count and progress calculation
307
+
308
+ Browse the .moai/specs/ directory to find the number of SPEC Files and
309
+ Counts the number of SPECs with status: completed.
310
+
311
+ Args:
312
+ cwd: Project root directory path (or any subdirectory, will search upward)
313
+
314
+ Returns:
315
+ SPEC progress dictionary. Includes the following keys:
316
+ - completed: Number of completed SPECs (int)
317
+ - total: total number of SPECs (int)
318
+ - percentage: completion percentage (int, 0~100)
319
+
320
+ All 0 if .moai/specs/ directory does not exist
321
+
322
+ Examples:
323
+ >>> count_specs("/path/to/project")
324
+ {'completed': 2, 'total': 5, 'percentage': 40}
325
+ >>> count_specs("/path/to/no-specs")
326
+ {'completed': 0, 'total': 0, 'percentage': 0}
327
+
328
+ Notes:
329
+ - SPEC File Location: .moai/specs/SPEC-{ID}/spec.md
330
+ - Completion condition: Include "status: completed" in YAML front matter
331
+ - If parsing fails, the SPEC is considered incomplete.
332
+ - Automatically finds project root to locate .moai/specs/
333
+
334
+ TDD History:
335
+ - RED: 5 items scenario test (0/0, 2/5, 5/5, no directory, parsing error)
336
+ - GREEN: SPEC search with Path.iterdir(), YAML parsing implementation
337
+ - REFACTOR: Strengthened exception handling, improved percentage calculation safety
338
+ - UPDATE: Add project root detection for consistent path resolution
339
+ """
340
+ # Find project root to ensure we read specs from correct location
341
+ project_root = find_project_root(cwd)
342
+ specs_dir = project_root / ".moai" / "specs"
343
+
344
+ if not specs_dir.exists():
345
+ return {"completed": 0, "total": 0, "percentage": 0}
346
+
347
+ completed = 0
348
+ total = 0
349
+
350
+ for spec_dir in specs_dir.iterdir():
351
+ if not spec_dir.is_dir() or not spec_dir.name.startswith("SPEC-"):
352
+ continue
353
+
354
+ spec_file = spec_dir / "spec.md"
355
+ if not spec_file.exists():
356
+ continue
357
+
358
+ total += 1
359
+
360
+ # Parse YAML front matter
361
+ try:
362
+ content = spec_file.read_text()
363
+ if content.startswith("---"):
364
+ yaml_end = content.find("---", 3)
365
+ if yaml_end > 0:
366
+ yaml_content = content[3:yaml_end]
367
+ if "status: completed" in yaml_content:
368
+ completed += 1
369
+ except (OSError, UnicodeDecodeError):
370
+ # File read failure or encoding error - considered incomplete
371
+ pass
372
+
373
+ percentage = int(completed / total * 100) if total > 0 else 0
374
+
375
+ return {
376
+ "completed": completed,
377
+ "total": total,
378
+ "percentage": percentage,
379
+ }
380
+
381
+
382
+ def get_project_language(cwd: str) -> str:
383
+ """Determine the primary project language (prefers config.yaml).
384
+
385
+ Args:
386
+ cwd: Project root directory (or any subdirectory, will search upward).
387
+
388
+ Returns:
389
+ Language string in lower-case.
390
+
391
+ Notes:
392
+ - Reads ``.moai/config/config.yaml`` first for a quick answer.
393
+ - Falls back to ``detect_language`` if configuration is missing.
394
+ - Automatically finds project root to locate .moai/config/config.yaml
395
+ """
396
+ # Find project root to ensure we read config from correct location
397
+ project_root = find_project_root(cwd)
398
+ config_path = project_root / ".moai" / "config" / "config.yaml"
399
+ if config_path.exists():
400
+ try:
401
+ config = yaml.safe_load(config_path.read_text()) or {}
402
+ lang = config.get("language", "")
403
+ if lang:
404
+ return lang
405
+ except (OSError, yaml.YAMLError):
406
+ # Fall back to detection on parse errors
407
+ pass
408
+
409
+ # Fall back to the original language detection routine (use project root)
410
+ return detect_language(str(project_root))
411
+
412
+
413
+ def _validate_project_structure(cwd: str) -> bool:
414
+ """Validate that project has required MoAI-ADK structure
415
+
416
+ Args:
417
+ cwd: Project root directory path
418
+
419
+ Returns:
420
+ bool: True if .moai/config/config.yaml exists, False otherwise
421
+ """
422
+ project_root = find_project_root(cwd)
423
+ return (project_root / ".moai" / "config" / "config.yaml").exists()
424
+
425
+
426
+ def get_version_check_config(cwd: str) -> dict[str, Any]:
427
+ """Read version check configuration from .moai/config/config.yaml
428
+
429
+ Returns version check settings with sensible defaults.
430
+ Supports frequency-based cache TTL configuration.
431
+
432
+ Args:
433
+ cwd: Project root directory path
434
+
435
+ Returns:
436
+ dict with keys:
437
+ - "enabled": Boolean (default: True)
438
+ - "frequency": "always" | "daily" | "weekly" | "never" (default: "daily")
439
+ - "cache_ttl_hours": TTL in hours based on frequency
440
+
441
+ Frequency to TTL mapping:
442
+ - "always": 0 hours (no caching)
443
+ - "daily": 24 hours
444
+ - "weekly": 168 hours (7 days)
445
+ - "never": infinity (never check)
446
+
447
+ TDD History:
448
+ - RED: 8 test scenarios (defaults, custom, disabled, TTL, etc.)
449
+ - GREEN: Minimal config reading with defaults
450
+ - REFACTOR: Add validation and error handling
451
+ """
452
+ # TTL mapping by frequency
453
+ ttl_by_frequency = {"always": 0, "daily": 24, "weekly": 168, "never": float("inf")}
454
+
455
+ # Default configuration
456
+ defaults = {"enabled": True, "frequency": "daily", "cache_ttl_hours": 24}
457
+
458
+ # Find project root to ensure we read config from correct location
459
+ project_root = find_project_root(cwd)
460
+ config_path = project_root / ".moai" / "config" / "config.yaml"
461
+ if not config_path.exists():
462
+ return defaults
463
+
464
+ try:
465
+ config = yaml.safe_load(config_path.read_text()) or {}
466
+
467
+ # Extract moai.version_check section
468
+ moai_config = config.get("moai", {})
469
+ version_check_config = moai_config.get("version_check", {})
470
+
471
+ # Read enabled flag (default: True)
472
+ enabled = version_check_config.get("enabled", defaults["enabled"])
473
+
474
+ # Read frequency (default: "daily")
475
+ frequency = moai_config.get("update_check_frequency", defaults["frequency"])
476
+
477
+ # Validate frequency
478
+ if frequency not in ttl_by_frequency:
479
+ frequency = defaults["frequency"]
480
+
481
+ # Calculate TTL from frequency
482
+ cache_ttl_hours = ttl_by_frequency[frequency]
483
+
484
+ # Allow explicit cache_ttl_hours override
485
+ if "cache_ttl_hours" in version_check_config:
486
+ cache_ttl_hours = version_check_config["cache_ttl_hours"]
487
+
488
+ return {
489
+ "enabled": enabled,
490
+ "frequency": frequency,
491
+ "cache_ttl_hours": cache_ttl_hours,
492
+ }
493
+
494
+ except (OSError, json.JSONDecodeError, KeyError):
495
+ # Config read or parse error - return defaults
496
+ return defaults
497
+
498
+
499
+ def is_network_available(timeout_seconds: float = 0.1) -> bool:
500
+ """Quick network availability check using socket.
501
+
502
+ Does NOT check PyPI specifically, just basic connectivity.
503
+ Returns immediately on success (< 50ms typically).
504
+ Returns False on any error without raising exceptions.
505
+
506
+ Args:
507
+ timeout_seconds: Socket timeout in seconds (default 0.1s)
508
+
509
+ Returns:
510
+ True if network appears available, False otherwise
511
+
512
+ Examples:
513
+ >>> is_network_available()
514
+ True # Network is available
515
+ >>> is_network_available(timeout_seconds=0.001)
516
+ False # Timeout too short, returns False
517
+
518
+ TDD History:
519
+ - RED: 3 test scenarios (success, failure, timeout)
520
+ - GREEN: Minimal socket.create_connection implementation
521
+ - REFACTOR: Add error handling for all exception types
522
+ """
523
+ try:
524
+ # Try connecting to Google's public DNS server (8.8.8.8:53)
525
+ # This is a reliable host that's typically reachable
526
+ connection = socket.create_connection(("8.8.8.8", 53), timeout=timeout_seconds)
527
+ connection.close()
528
+ return True
529
+ except (socket.timeout, OSError, Exception):
530
+ # Any connection error means network is unavailable
531
+ # This includes: timeout, connection refused, network unreachable, etc.
532
+ return False
533
+
534
+
535
+ def is_major_version_change(current: str, latest: str) -> bool:
536
+ """Detect if version change is a major version bump.
537
+
538
+ A major version change is when the first (major) component increases:
539
+ - 0.8.1 → 1.0.0: True (0 → 1)
540
+ - 1.2.3 → 2.0.0: True (1 → 2)
541
+ - 0.8.1 → 0.9.0: False (0 → 0, minor changed)
542
+ - 1.2.3 → 1.3.0: False (1 → 1)
543
+
544
+ Args:
545
+ current: Current version string (e.g., "0.8.1")
546
+ latest: Latest version string (e.g., "1.0.0")
547
+
548
+ Returns:
549
+ True if major version increased, False otherwise
550
+
551
+ Examples:
552
+ >>> is_major_version_change("0.8.1", "1.0.0")
553
+ True
554
+ >>> is_major_version_change("0.8.1", "0.9.0")
555
+ False
556
+ >>> is_major_version_change("dev", "1.0.0")
557
+ False # Invalid versions return False
558
+
559
+ TDD History:
560
+ - RED: 4 test scenarios (0→1, 1→2, minor, invalid)
561
+ - GREEN: Minimal version parsing and comparison
562
+ - REFACTOR: Improve error handling for invalid versions
563
+ """
564
+ try:
565
+ # Parse version strings into integer components
566
+ current_parts = [int(x) for x in current.split(".")]
567
+ latest_parts = [int(x) for x in latest.split(".")]
568
+
569
+ # Compare major version (first component)
570
+ if len(current_parts) >= 1 and len(latest_parts) >= 1:
571
+ return latest_parts[0] > current_parts[0]
572
+
573
+ # If parsing succeeds but empty, no major change
574
+ return False
575
+
576
+ except (ValueError, AttributeError, IndexError):
577
+ # Invalid version format - return False (no exception)
578
+ return False
579
+
580
+
581
+ def get_package_version_info(cwd: str = ".") -> dict[str, Any]:
582
+ """Check MoAI-ADK current and latest version with caching and offline support.
583
+
584
+ ⭐ CRITICAL GUARANTEE: This function ALWAYS returns the current installed version.
585
+ Network failures, cache issues, and timeouts NEVER result in "unknown" version.
586
+
587
+ Execution flow:
588
+ 1. Get current installed version (ALWAYS succeeds) ← CRITICAL
589
+ 2. Build minimal result with current version
590
+ 3. Try to load from cache (< 50ms) - optional enhancement
591
+ 4. If cache valid, return cached latest info
592
+ 5. If cache invalid/miss, optionally query PyPI - optional enhancement
593
+ 6. Save result to cache for next time - optional
594
+
595
+ Args:
596
+ cwd: Project root directory (for cache location)
597
+
598
+ Returns:
599
+ dict with keys:
600
+ - "current": Current installed version (ALWAYS valid, never empty)
601
+ - "latest": Latest version available on PyPI (may be "unknown")
602
+ - "update_available": Boolean indicating if update is available
603
+ - "upgrade_command": Recommended upgrade command (if update available)
604
+ - "release_notes_url": URL to release notes
605
+ - "is_major_update": Boolean indicating major version change
606
+
607
+ Guarantees:
608
+ - Cache hit (< 24 hours): Returns in ~20ms, no network access ✓
609
+ - Cache miss + online: Query PyPI (1s timeout), cache result ✓
610
+ - Cache miss + offline: Return current version only (~100ms) ✓
611
+ - Network timeout: Returns current + "unknown" latest (~50ms) ✓
612
+ - Any exception: Always returns current version ✓
613
+
614
+ TDD History:
615
+ - RED: 5 test scenarios (network detection, cache integration, offline mode)
616
+ - GREEN: Integrate VersionCache with network detection
617
+ - REFACTOR: Extract cache directory constant, improve error handling
618
+ """
619
+ import importlib.util
620
+ import urllib.error
621
+ import urllib.request
622
+ from importlib.metadata import PackageNotFoundError, version
623
+
624
+ # Import VersionCache from the same directory (using dynamic import for testing compatibility)
625
+ try:
626
+ version_cache_path = Path(__file__).parent / "version_cache.py"
627
+ spec = importlib.util.spec_from_file_location("version_cache", version_cache_path)
628
+ if spec and spec.loader:
629
+ version_cache_module = importlib.util.module_from_spec(spec)
630
+ spec.loader.exec_module(version_cache_module)
631
+ version_cache_class = version_cache_module.VersionCache
632
+ else:
633
+ # Skip caching if module can't be loaded
634
+ version_cache_class = None
635
+ except (ImportError, OSError):
636
+ # Graceful degradation: skip caching on import errors
637
+ version_cache_class = None
638
+
639
+ # 1. Find project root (ensure cache is always in correct location)
640
+ # This prevents creating .moai/cache in wrong locations when hooks run
641
+ # from subdirectories like .claude/hooks/alfred/
642
+ project_root = find_project_root(cwd)
643
+
644
+ # 2. Initialize cache (skip if VersionCache couldn't be imported)
645
+ cache_dir = project_root / CACHE_DIR_NAME
646
+ version_cache = version_cache_class(cache_dir) if version_cache_class else None
647
+
648
+ # 2. Get current installed version first (needed for cache validation)
649
+ current_version = "unknown"
650
+ try:
651
+ current_version = version("moai-adk")
652
+ except PackageNotFoundError:
653
+ current_version = "dev"
654
+ # Dev mode - skip cache and return immediately
655
+ return {
656
+ "current": "dev",
657
+ "latest": "unknown",
658
+ "update_available": False,
659
+ "upgrade_command": "",
660
+ }
661
+
662
+ # 3. Try to load from cache (fast path with version validation)
663
+ if version_cache and version_cache.is_valid():
664
+ cached_info = version_cache.load()
665
+ if cached_info:
666
+ # Only use cache if the cached version matches current installed version
667
+ # This prevents stale cache when package is upgraded locally
668
+ if cached_info.get("current") == current_version:
669
+ # Ensure new fields exist for backward compatibility
670
+ if "release_notes_url" not in cached_info:
671
+ # Add missing fields to old cached data
672
+ cached_info.setdefault("release_notes_url", None)
673
+ cached_info.setdefault("is_major_update", False)
674
+ return cached_info
675
+ # else: cache is stale (version changed), fall through to re-check
676
+
677
+ # 4. Cache miss or stale - need to query PyPI
678
+ result = {
679
+ "current": current_version,
680
+ "latest": "unknown",
681
+ "update_available": False,
682
+ "upgrade_command": "",
683
+ }
684
+
685
+ # 5. Check if version check is enabled in config
686
+ config = get_version_check_config(cwd)
687
+ if not config["enabled"]:
688
+ # Version check disabled - return only current version
689
+ return result
690
+
691
+ # 6. Check network before PyPI query
692
+ if not is_network_available():
693
+ # Offline mode - return current version only
694
+ return result
695
+
696
+ # 7. Network available - query PyPI
697
+ pypi_data = None
698
+ try:
699
+ with timeout_handler(1):
700
+ url = "https://pypi.org/pypi/moai-adk/json"
701
+ headers = {"Accept": "application/json"}
702
+ req = urllib.request.Request(url, headers=headers)
703
+ with urllib.request.urlopen(req, timeout=0.8) as response:
704
+ pypi_data = json.load(response)
705
+ result["latest"] = pypi_data.get("info", {}).get("version", "unknown")
706
+
707
+ # Extract release notes URL from project_urls
708
+ try:
709
+ project_urls = pypi_data.get("info", {}).get("project_urls", {})
710
+ release_url = project_urls.get("Changelog", "")
711
+ if not release_url:
712
+ # Fallback to GitHub releases URL pattern
713
+ release_url = f"https://github.com/modu-ai/moai-adk/releases/tag/v{result['latest']}"
714
+ result["release_notes_url"] = release_url
715
+ except (KeyError, AttributeError, TypeError):
716
+ result["release_notes_url"] = None
717
+
718
+ except (urllib.error.URLError, TimeoutError, Exception):
719
+ # PyPI query failed - return current version
720
+ result["release_notes_url"] = None
721
+ pass
722
+
723
+ # 7. Compare versions (simple comparison)
724
+ if result["current"] != "unknown" and result["latest"] != "unknown":
725
+ try:
726
+ # Parse versions for comparison
727
+ current_str = str(result["current"])
728
+ latest_str = str(result["latest"])
729
+
730
+ current_parts = [int(x) for x in current_str.split(".")]
731
+ latest_parts = [int(x) for x in latest_str.split(".")]
732
+
733
+ # Pad shorter version with zeros
734
+ max_len = max(len(current_parts), len(latest_parts))
735
+ current_parts.extend([0] * (max_len - len(current_parts)))
736
+ latest_parts.extend([0] * (max_len - len(latest_parts)))
737
+
738
+ if latest_parts > current_parts:
739
+ result["update_available"] = True
740
+ result["upgrade_command"] = "uv tool upgrade moai-adk"
741
+
742
+ # Detect major version change
743
+ result["is_major_update"] = is_major_version_change(current_str, latest_str)
744
+ else:
745
+ result["is_major_update"] = False
746
+ except (ValueError, AttributeError):
747
+ # Version parsing failed - skip comparison
748
+ result["is_major_update"] = False
749
+ pass
750
+
751
+ # 8. Save result to cache (if caching is available)
752
+ if version_cache:
753
+ version_cache.save(result)
754
+
755
+ return result
756
+
757
+
758
+ __all__ = [
759
+ "find_project_root",
760
+ "detect_language",
761
+ "get_git_info",
762
+ "count_specs",
763
+ "get_project_language",
764
+ "get_version_check_config",
765
+ "is_network_available",
766
+ "is_major_version_change",
767
+ "get_package_version_info",
768
+ ]