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 @@
1
+ """Project module: initialization and management"""
@@ -0,0 +1,70 @@
1
+ """Backup utility module (SPEC-INIT-003 v0.3.0)
2
+
3
+ Selective backup strategy:
4
+ - Back up only the required files (OR condition)
5
+ - Backup path: .moai-backups/backup/ (v0.4.2)
6
+ """
7
+
8
+ from pathlib import Path
9
+
10
+ # Backup targets (OR condition - back up when any exist)
11
+ BACKUP_TARGETS = [
12
+ ".moai/config/config.json",
13
+ ".moai/project/",
14
+ ".moai/memory/",
15
+ ".claude/",
16
+ ".github/",
17
+ "CLAUDE.md",
18
+ ]
19
+
20
+ # User data protection paths (excluded from backups)
21
+ PROTECTED_PATHS = [
22
+ ".moai/specs/",
23
+ ".moai/reports/",
24
+ ]
25
+
26
+
27
+ def has_any_moai_files(project_path: Path) -> bool:
28
+ """Check whether any MoAI-ADK files exist (OR condition).
29
+
30
+ Args:
31
+ project_path: Project path.
32
+
33
+ Returns:
34
+ True when any backup target exists.
35
+ """
36
+ for target in BACKUP_TARGETS:
37
+ target_path = project_path / target
38
+ if target_path.exists():
39
+ return True
40
+ return False
41
+
42
+
43
+ def get_backup_targets(project_path: Path) -> list[str]:
44
+ """Return existing backup targets.
45
+
46
+ Args:
47
+ project_path: Project path.
48
+
49
+ Returns:
50
+ List of backup targets that exist.
51
+ """
52
+ targets: list[str] = []
53
+ for target in BACKUP_TARGETS:
54
+ target_path = project_path / target
55
+ if target_path.exists():
56
+ targets.append(target)
57
+ return targets
58
+
59
+
60
+ def is_protected_path(rel_path: Path) -> bool:
61
+ """Check whether the path is protected.
62
+
63
+ Args:
64
+ rel_path: Relative path.
65
+
66
+ Returns:
67
+ True when the path should be excluded from backups.
68
+ """
69
+ rel_str = str(rel_path).replace("\\", "/")
70
+ return any(rel_str.startswith(p.lstrip("./").rstrip("/")) for p in PROTECTED_PATHS)
@@ -0,0 +1,300 @@
1
+ """System requirements validation module.
2
+
3
+ Checks whether required and optional tools are installed.
4
+ """
5
+
6
+ import platform
7
+ import shutil
8
+ import subprocess
9
+ import sys
10
+ from pathlib import Path
11
+
12
+
13
+ class SystemChecker:
14
+ """Validate system requirements."""
15
+
16
+ REQUIRED_TOOLS: dict[str, str] = {
17
+ "git": "git --version",
18
+ "python": "python3 --version",
19
+ }
20
+
21
+ OPTIONAL_TOOLS: dict[str, str] = {
22
+ "gh": "gh --version",
23
+ "docker": "docker --version",
24
+ }
25
+
26
+ LANGUAGE_TOOLS: dict[str, dict[str, list[str]]] = {
27
+ "python": {
28
+ "required": ["python3", "pip"],
29
+ "recommended": ["pytest", "mypy", "ruff"],
30
+ "optional": ["black", "pylint"],
31
+ },
32
+ "typescript": {
33
+ "required": ["node", "npm"],
34
+ "recommended": ["vitest", "biome"],
35
+ "optional": ["typescript", "eslint"],
36
+ },
37
+ "javascript": {
38
+ "required": ["node", "npm"],
39
+ "recommended": ["jest", "eslint"],
40
+ "optional": ["prettier", "webpack"],
41
+ },
42
+ "java": {
43
+ "required": ["java", "javac"],
44
+ "recommended": ["maven", "gradle"],
45
+ "optional": ["junit", "checkstyle"],
46
+ },
47
+ "go": {
48
+ "required": ["go"],
49
+ "recommended": ["golangci-lint", "gofmt"],
50
+ "optional": ["delve", "gopls"],
51
+ },
52
+ "rust": {
53
+ "required": ["rustc", "cargo"],
54
+ "recommended": ["rustfmt", "clippy"],
55
+ "optional": ["rust-analyzer", "cargo-audit"],
56
+ },
57
+ "dart": {
58
+ "required": ["dart"],
59
+ "recommended": ["flutter", "dart_test"],
60
+ "optional": ["dartfmt", "dartanalyzer"],
61
+ },
62
+ "swift": {
63
+ "required": ["swift", "swiftc"],
64
+ "recommended": ["xcrun", "swift-format"],
65
+ "optional": ["swiftlint", "sourcekit-lsp"],
66
+ },
67
+ "kotlin": {
68
+ "required": ["kotlin", "kotlinc"],
69
+ "recommended": ["gradle", "ktlint"],
70
+ "optional": ["detekt", "kotlin-language-server"],
71
+ },
72
+ "csharp": {
73
+ "required": ["dotnet"],
74
+ "recommended": ["msbuild", "nuget"],
75
+ "optional": ["csharpier", "roslyn"],
76
+ },
77
+ "php": {
78
+ "required": ["php"],
79
+ "recommended": ["composer", "phpunit"],
80
+ "optional": ["psalm", "phpstan"],
81
+ },
82
+ "ruby": {
83
+ "required": ["ruby", "gem"],
84
+ "recommended": ["bundler", "rspec"],
85
+ "optional": ["rubocop", "solargraph"],
86
+ },
87
+ "elixir": {
88
+ "required": ["elixir", "mix"],
89
+ "recommended": ["hex", "dialyzer"],
90
+ "optional": ["credo", "ex_unit"],
91
+ },
92
+ "scala": {
93
+ "required": ["scala", "scalac"],
94
+ "recommended": ["sbt", "scalatest"],
95
+ "optional": ["scalafmt", "metals"],
96
+ },
97
+ "clojure": {
98
+ "required": ["clojure", "clj"],
99
+ "recommended": ["leiningen", "clojure.test"],
100
+ "optional": ["cider", "clj-kondo"],
101
+ },
102
+ "haskell": {
103
+ "required": ["ghc", "ghci"],
104
+ "recommended": ["cabal", "stack"],
105
+ "optional": ["hlint", "haskell-language-server"],
106
+ },
107
+ "c": {
108
+ "required": ["gcc", "make"],
109
+ "recommended": ["clang", "cmake"],
110
+ "optional": ["gdb", "valgrind"],
111
+ },
112
+ "cpp": {
113
+ "required": ["g++", "make"],
114
+ "recommended": ["clang++", "cmake"],
115
+ "optional": ["gdb", "cppcheck"],
116
+ },
117
+ "lua": {
118
+ "required": ["lua"],
119
+ "recommended": ["luarocks", "busted"],
120
+ "optional": ["luacheck", "lua-language-server"],
121
+ },
122
+ "ocaml": {
123
+ "required": ["ocaml", "opam"],
124
+ "recommended": ["dune", "ocamlformat"],
125
+ "optional": ["merlin", "ocp-indent"],
126
+ },
127
+ }
128
+
129
+ def check_all(self) -> dict[str, bool]:
130
+ """Validate every tool.
131
+
132
+ Returns:
133
+ Dictionary mapping tool names to availability.
134
+ """
135
+ result = {}
136
+
137
+ # Check required tools
138
+ for tool, command in self.REQUIRED_TOOLS.items():
139
+ result[tool] = self._check_tool(command)
140
+
141
+ # Check optional tools
142
+ for tool, command in self.OPTIONAL_TOOLS.items():
143
+ result[tool] = self._check_tool(command)
144
+
145
+ return result
146
+
147
+ def _check_tool(self, command: str) -> bool:
148
+ """Check an individual tool.
149
+
150
+ Args:
151
+ command: Command to run (e.g., "git --version").
152
+
153
+ Returns:
154
+ True when the tool is available.
155
+ """
156
+ if not command:
157
+ return False
158
+
159
+ try:
160
+ # Extract the tool name (first token)
161
+ tool_name = command.split()[0]
162
+ # Determine availability via shutil.which
163
+ return shutil.which(tool_name) is not None
164
+ except Exception:
165
+ return False
166
+
167
+ def check_language_tools(self, language: str | None) -> dict[str, bool]:
168
+ """Validate toolchains by language.
169
+
170
+ Args:
171
+ language: Programming language name (e.g., "python", "typescript").
172
+
173
+ Returns:
174
+ Dictionary mapping tool names to availability.
175
+ """
176
+ # Guard clause: no language specified
177
+ if not language:
178
+ return {}
179
+
180
+ language_lower = language.lower()
181
+
182
+ # Guard clause: unsupported language
183
+ if language_lower not in self.LANGUAGE_TOOLS:
184
+ return {}
185
+
186
+ # Retrieve tool configuration for the language
187
+ tools_config = self.LANGUAGE_TOOLS[language_lower]
188
+
189
+ # Evaluate tools by category and collect results
190
+ result: dict[str, bool] = {}
191
+ for category in ["required", "recommended", "optional"]:
192
+ tools = tools_config.get(category, [])
193
+ for tool in tools:
194
+ result[tool] = self._is_tool_available(tool)
195
+
196
+ return result
197
+
198
+ def _is_tool_available(self, tool: str) -> bool:
199
+ """Check whether a tool is available (helper).
200
+
201
+ Args:
202
+ tool: Tool name.
203
+
204
+ Returns:
205
+ True when the tool is available.
206
+ """
207
+ return shutil.which(tool) is not None
208
+
209
+ def get_tool_version(self, tool: str | None) -> str | None:
210
+ """Retrieve tool version information.
211
+
212
+ Args:
213
+ tool: Tool name (for example, "python3", "node").
214
+
215
+ Returns:
216
+ Version string or None when the tool is unavailable.
217
+ """
218
+ # Guard clause: unspecified or unavailable tool
219
+ if not tool or not self._is_tool_available(tool):
220
+ return None
221
+
222
+ try:
223
+ # Call the tool with --version to obtain the version string
224
+ result = subprocess.run(
225
+ [tool, "--version"],
226
+ capture_output=True,
227
+ text=True,
228
+ timeout=2, # 2-second timeout to respect performance constraints
229
+ check=False,
230
+ )
231
+
232
+ # Return the version when the command succeeds
233
+ if result.returncode == 0 and result.stdout:
234
+ return self._extract_version_line(result.stdout)
235
+
236
+ return None
237
+
238
+ except (subprocess.TimeoutExpired, OSError):
239
+ # Gracefully handle timeout and OS errors
240
+ return None
241
+
242
+ def _extract_version_line(self, version_output: str) -> str:
243
+ """Extract the first line from version output (helper).
244
+
245
+ Args:
246
+ version_output: Output captured from the --version command.
247
+
248
+ Returns:
249
+ First line containing version information.
250
+ """
251
+ return version_output.strip().split("\n")[0]
252
+
253
+
254
+ def check_environment() -> dict[str, bool]:
255
+ """Validate the overall environment (used by the CLI doctor command).
256
+
257
+ Returns:
258
+ Mapping from check description to boolean status.
259
+ """
260
+ return {
261
+ "Python >= 3.11": sys.version_info >= (3, 11),
262
+ "Git installed": shutil.which("git") is not None,
263
+ "Project structure (.moai/)": Path(".moai").exists(),
264
+ "Config file (.moai/config/config.yaml)": Path(".moai/config/config.yaml").exists(),
265
+ }
266
+
267
+
268
+ def get_platform_specific_message(unix_message: str, windows_message: str) -> str:
269
+ """Return platform-specific message.
270
+
271
+ Args:
272
+ unix_message: Message for Unix/Linux/macOS.
273
+ windows_message: Message for Windows.
274
+
275
+ Returns:
276
+ Platform-appropriate message.
277
+
278
+ Examples:
279
+ >>> get_platform_specific_message("chmod 755 .moai", "Check directory permissions")
280
+ 'chmod 755 .moai' # on Unix/Linux/macOS
281
+ >>> get_platform_specific_message("chmod 755 .moai", "Check directory permissions")
282
+ 'Check directory permissions' # on Windows
283
+ """
284
+ if platform.system() == "Windows":
285
+ return windows_message
286
+ return unix_message
287
+
288
+
289
+ def get_permission_fix_message(path: str) -> str:
290
+ """Get platform-specific permission fix message.
291
+
292
+ Args:
293
+ path: Path to fix permissions for.
294
+
295
+ Returns:
296
+ Platform-specific fix instructions.
297
+ """
298
+ if platform.system() == "Windows":
299
+ return f"Run with administrator privileges or verify permissions in the properties of the '{path}' directory"
300
+ return f"Run 'chmod 755 {path}' and try again"
@@ -0,0 +1,293 @@
1
+ # TEST: tests/unit/test_language_detector_extended.py
2
+ """Language detector module.
3
+
4
+ Automatically detects 20 programming languages.
5
+
6
+ Extended detection supports:
7
+ - 11 new languages: Ruby, PHP, Java, Rust, Dart, Swift, Kotlin, C#, C, C++, Shell
8
+ - 5 build tool detection: Maven, Gradle, CMake, SPM, dotnet
9
+ - Package manager detection: bundle, composer, cargo
10
+ - Priority conflict resolution for multi-language projects
11
+ """
12
+
13
+ from pathlib import Path
14
+
15
+
16
+ class LanguageDetector:
17
+ """Automatically detect up to 20 programming languages.
18
+
19
+ Prioritizes framework-specific files (e.g., Laravel, Django) over
20
+ generic language files to improve accuracy in mixed-language projects.
21
+ """
22
+
23
+ LANGUAGE_PATTERNS = {
24
+ # Priority order (highest to lowest):
25
+ # 1. Rust, 2. Dart, 3. Swift, 4. Kotlin, 5. C#, 6. Java, 7. Ruby, 8. PHP
26
+ # 9. Go, 10. Python, 11. TypeScript, 12. JavaScript, 13. C++, 14. C, 15. Shell
27
+ "rust": ["*.rs", "Cargo.toml"],
28
+ "dart": ["*.dart", "pubspec.yaml"],
29
+ "swift": ["*.swift", "Package.swift"],
30
+ "kotlin": ["*.kt", "build.gradle.kts"],
31
+ "csharp": ["*.cs", "*.csproj"],
32
+ "java": ["*.java", "pom.xml", "build.gradle"],
33
+ # Ruby moved for priority (Rails detection)
34
+ "ruby": [
35
+ "*.rb",
36
+ "Gemfile",
37
+ "Gemfile.lock", # Bundler: lock file (unique to Ruby)
38
+ "config/routes.rb", # Rails: routing file (unique identifier)
39
+ "app/controllers/", # Rails: controller directory
40
+ "Rakefile", # Rails/Ruby: task file
41
+ ],
42
+ # PHP after Ruby (Laravel detection)
43
+ "php": [
44
+ "*.php",
45
+ "composer.json",
46
+ "artisan", # Laravel: CLI tool (unique identifier)
47
+ "app/", # Laravel: application directory
48
+ "bootstrap/laravel.php", # Laravel: bootstrap file
49
+ ],
50
+ "go": ["*.go", "go.mod"],
51
+ "python": ["*.py", "pyproject.toml", "requirements.txt", "setup.py"],
52
+ "typescript": ["*.ts", "tsconfig.json"],
53
+ "javascript": ["*.js", "package.json"],
54
+ "cpp": ["*.cpp", "CMakeLists.txt"],
55
+ "c": ["*.c", "Makefile"],
56
+ "shell": ["*.sh", "*.bash"],
57
+ # Additional languages (lower priority)
58
+ "elixir": ["*.ex", "mix.exs"],
59
+ "scala": ["*.scala", "build.sbt"],
60
+ "clojure": ["*.clj", "project.clj"],
61
+ "haskell": ["*.hs", "*.cabal"],
62
+ "lua": ["*.lua"],
63
+ }
64
+
65
+ def detect(self, path: str | Path = ".") -> str | None:
66
+ """Detect a single language (in priority order).
67
+
68
+ Args:
69
+ path: Directory to inspect.
70
+
71
+ Returns:
72
+ Detected language name (lowercase) or None.
73
+ """
74
+ path = Path(path)
75
+
76
+ # Inspect each language in priority order
77
+ for language, patterns in self.LANGUAGE_PATTERNS.items():
78
+ if self._check_patterns(path, patterns):
79
+ return language
80
+
81
+ return None
82
+
83
+ def detect_multiple(self, path: str | Path = ".") -> list[str]:
84
+ """Detect multiple languages.
85
+
86
+ Args:
87
+ path: Directory to inspect.
88
+
89
+ Returns:
90
+ List of all detected language names.
91
+ """
92
+ path = Path(path)
93
+ detected = []
94
+
95
+ for language, patterns in self.LANGUAGE_PATTERNS.items():
96
+ if self._check_patterns(path, patterns):
97
+ detected.append(language)
98
+
99
+ return detected
100
+
101
+ def _check_patterns(self, path: Path, patterns: list[str]) -> bool:
102
+ """Check whether any pattern matches.
103
+
104
+ Args:
105
+ path: Directory to inspect.
106
+ patterns: List of glob patterns.
107
+
108
+ Returns:
109
+ True when any pattern matches.
110
+ """
111
+ for pattern in patterns:
112
+ # Extension pattern (e.g., *.py)
113
+ if pattern.startswith("*."):
114
+ if list(path.rglob(pattern)):
115
+ return True
116
+ # Specific file name (e.g., pyproject.toml)
117
+ else:
118
+ if (path / pattern).exists():
119
+ return True
120
+
121
+ return False
122
+
123
+ def get_workflow_template_path(self, language: str) -> str:
124
+ """Get the GitHub Actions workflow template path for a language.
125
+
126
+
127
+ Args:
128
+ language: Programming language name (lowercase).
129
+
130
+ Returns:
131
+ Workflow template file path relative to templates directory.
132
+
133
+ Raises:
134
+ ValueError: If language is not supported for workflows.
135
+ """
136
+ # Language-specific workflow template mapping
137
+ workflow_templates = {
138
+ "python": "python-tag-validation.yml",
139
+ "javascript": "javascript-tag-validation.yml",
140
+ "typescript": "typescript-tag-validation.yml",
141
+ "go": "go-tag-validation.yml",
142
+ }
143
+
144
+ if language not in workflow_templates:
145
+ raise ValueError(f"Language '{language}' is not supported for workflows")
146
+
147
+ return workflow_templates[language]
148
+
149
+ def detect_package_manager(self, path: str | Path = ".") -> str | None:
150
+ """Detect the package manager for the detected language.
151
+
152
+
153
+ Args:
154
+ path: Directory to inspect.
155
+
156
+ Returns:
157
+ Package manager name or None if not detected.
158
+ """
159
+ path = Path(path)
160
+
161
+ # Ruby
162
+ if (path / "Gemfile").exists():
163
+ return "bundle"
164
+
165
+ # PHP
166
+ if (path / "composer.json").exists():
167
+ return "composer"
168
+
169
+ # Java/Kotlin
170
+ if (path / "pom.xml").exists():
171
+ return "maven"
172
+ if (path / "build.gradle").exists() or (path / "build.gradle.kts").exists():
173
+ return "gradle"
174
+
175
+ # Rust
176
+ if (path / "Cargo.toml").exists():
177
+ return "cargo"
178
+
179
+ # Dart/Flutter
180
+ if (path / "pubspec.yaml").exists():
181
+ return "dart_pub"
182
+
183
+ # Swift
184
+ if (path / "Package.swift").exists():
185
+ return "spm"
186
+
187
+ # C#
188
+ if list(path.glob("*.csproj")) or list(path.glob("*.sln")):
189
+ return "dotnet"
190
+
191
+ # Python
192
+ if (path / "pyproject.toml").exists():
193
+ return "pip"
194
+
195
+ # JavaScript/TypeScript (check in priority order)
196
+ # Check for lock files and package managers
197
+ if (path / "bun.lockb").exists():
198
+ return "bun"
199
+ elif (path / "pnpm-lock.yaml").exists():
200
+ return "pnpm"
201
+ elif (path / "yarn.lock").exists():
202
+ return "yarn"
203
+ elif (path / "package-lock.json").exists():
204
+ return "npm"
205
+ elif (path / "package.json").exists():
206
+ # Default to npm for package.json without lock files
207
+ return "npm"
208
+
209
+ # Go
210
+ if (path / "go.mod").exists():
211
+ return "go_modules"
212
+
213
+ return None
214
+
215
+ def detect_build_tool(self, path: str | Path = ".", language: str | None = None) -> str | None:
216
+ """Detect the build tool for the detected language.
217
+
218
+
219
+ Args:
220
+ path: Directory to inspect.
221
+ language: Optional language hint for disambiguation.
222
+
223
+ Returns:
224
+ Build tool name or None if not detected.
225
+ """
226
+ path = Path(path)
227
+
228
+ # C/C++
229
+ if (path / "CMakeLists.txt").exists():
230
+ return "cmake"
231
+ if (path / "Makefile").exists():
232
+ return "make"
233
+
234
+ # Java/Kotlin
235
+ if language in ["java", "kotlin"]:
236
+ if (path / "pom.xml").exists():
237
+ return "maven"
238
+ if (path / "build.gradle").exists() or (path / "build.gradle.kts").exists():
239
+ return "gradle"
240
+
241
+ # Rust
242
+ if (path / "Cargo.toml").exists():
243
+ return "cargo"
244
+
245
+ # Swift
246
+ if (path / "Package.swift").exists():
247
+ return "spm"
248
+ if list(path.glob("*.xcodeproj")) or list(path.glob("*.xcworkspace")):
249
+ return "xcode"
250
+
251
+ # C#
252
+ if list(path.glob("*.csproj")) or list(path.glob("*.sln")):
253
+ return "dotnet"
254
+
255
+ return None
256
+
257
+ def get_supported_languages_for_workflows(self) -> list[str]:
258
+ """Get the list of languages with dedicated CI/CD workflow support.
259
+
260
+
261
+ Returns:
262
+ List of supported language names (15 total).
263
+ """
264
+ return [
265
+ "python",
266
+ "javascript",
267
+ "typescript",
268
+ "go",
269
+ "ruby",
270
+ "php",
271
+ "java",
272
+ "rust",
273
+ "dart",
274
+ "swift",
275
+ "kotlin",
276
+ "csharp",
277
+ "c",
278
+ "cpp",
279
+ "shell",
280
+ ]
281
+
282
+
283
+ def detect_project_language(path: str | Path = ".") -> str | None:
284
+ """Detect the project language (helper).
285
+
286
+ Args:
287
+ path: Directory to inspect (default: current directory).
288
+
289
+ Returns:
290
+ Detected language name (lowercase) or None.
291
+ """
292
+ detector = LanguageDetector()
293
+ return detector.detect(path)