moai-adk 0.25.4__py3-none-any.whl → 0.32.8__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (378) hide show
  1. moai_adk/__init__.py +2 -5
  2. moai_adk/__main__.py +114 -82
  3. moai_adk/cli/__init__.py +6 -1
  4. moai_adk/cli/commands/__init__.py +1 -3
  5. moai_adk/cli/commands/analyze.py +5 -16
  6. moai_adk/cli/commands/doctor.py +6 -18
  7. moai_adk/cli/commands/init.py +56 -125
  8. moai_adk/cli/commands/language.py +14 -35
  9. moai_adk/cli/commands/status.py +9 -15
  10. moai_adk/cli/commands/update.py +1555 -190
  11. moai_adk/cli/prompts/init_prompts.py +112 -56
  12. moai_adk/cli/spec_status.py +263 -0
  13. moai_adk/cli/ui/__init__.py +44 -0
  14. moai_adk/cli/ui/progress.py +422 -0
  15. moai_adk/cli/ui/prompts.py +389 -0
  16. moai_adk/cli/ui/theme.py +129 -0
  17. moai_adk/cli/worktree/__init__.py +27 -0
  18. moai_adk/cli/worktree/__main__.py +31 -0
  19. moai_adk/cli/worktree/cli.py +672 -0
  20. moai_adk/cli/worktree/exceptions.py +89 -0
  21. moai_adk/cli/worktree/manager.py +490 -0
  22. moai_adk/cli/worktree/models.py +65 -0
  23. moai_adk/cli/worktree/registry.py +128 -0
  24. moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
  25. moai_adk/core/analysis/session_analyzer.py +17 -56
  26. moai_adk/core/claude_integration.py +26 -54
  27. moai_adk/core/command_helpers.py +10 -10
  28. moai_adk/core/comprehensive_monitoring_system.py +1183 -0
  29. moai_adk/core/config/auto_spec_config.py +5 -11
  30. moai_adk/core/config/migration.py +19 -9
  31. moai_adk/core/config/unified.py +436 -0
  32. moai_adk/core/context_manager.py +6 -12
  33. moai_adk/core/enterprise_features.py +1404 -0
  34. moai_adk/core/error_recovery_system.py +725 -112
  35. moai_adk/core/event_driven_hook_system.py +1371 -0
  36. moai_adk/core/git/__init__.py +8 -0
  37. moai_adk/core/git/branch_manager.py +3 -11
  38. moai_adk/core/git/checkpoint.py +1 -3
  39. moai_adk/core/git/conflict_detector.py +413 -0
  40. moai_adk/core/git/manager.py +91 -1
  41. moai_adk/core/hooks/post_tool_auto_spec_completion.py +56 -80
  42. moai_adk/core/input_validation_middleware.py +1006 -0
  43. moai_adk/core/integration/engine.py +6 -18
  44. moai_adk/core/integration/integration_tester.py +10 -9
  45. moai_adk/core/integration/utils.py +1 -1
  46. moai_adk/core/issue_creator.py +10 -28
  47. moai_adk/core/jit_context_loader.py +956 -0
  48. moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
  49. moai_adk/core/language_config_resolver.py +485 -0
  50. moai_adk/core/language_validator.py +28 -41
  51. moai_adk/core/mcp/setup.py +15 -12
  52. moai_adk/core/merge/__init__.py +9 -0
  53. moai_adk/core/merge/analyzer.py +481 -0
  54. moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
  55. moai_adk/core/migration/backup_manager.py +78 -9
  56. moai_adk/core/migration/custom_element_scanner.py +358 -0
  57. moai_adk/core/migration/file_migrator.py +8 -17
  58. moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
  59. moai_adk/core/migration/selective_restorer.py +470 -0
  60. moai_adk/core/migration/template_utils.py +74 -0
  61. moai_adk/core/migration/user_selection_ui.py +338 -0
  62. moai_adk/core/migration/version_detector.py +6 -10
  63. moai_adk/core/migration/version_migrator.py +3 -3
  64. moai_adk/core/performance/cache_system.py +8 -10
  65. moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
  66. moai_adk/core/project/checker.py +2 -4
  67. moai_adk/core/project/detector.py +1 -3
  68. moai_adk/core/project/initializer.py +135 -23
  69. moai_adk/core/project/phase_executor.py +54 -81
  70. moai_adk/core/project/validator.py +6 -12
  71. moai_adk/core/quality/trust_checker.py +9 -27
  72. moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
  73. moai_adk/core/robust_json_parser.py +611 -0
  74. moai_adk/core/rollback_manager.py +73 -148
  75. moai_adk/core/session_manager.py +10 -26
  76. moai_adk/core/skill_loading_system.py +579 -0
  77. moai_adk/core/spec/confidence_scoring.py +31 -100
  78. moai_adk/core/spec/ears_template_engine.py +351 -286
  79. moai_adk/core/spec/quality_validator.py +35 -69
  80. moai_adk/core/spec_status_manager.py +64 -74
  81. moai_adk/core/template/backup.py +45 -20
  82. moai_adk/core/template/config.py +112 -39
  83. moai_adk/core/template/merger.py +11 -19
  84. moai_adk/core/template/processor.py +253 -149
  85. moai_adk/core/template_engine.py +73 -40
  86. moai_adk/core/template_variable_synchronizer.py +417 -0
  87. moai_adk/core/unified_permission_manager.py +745 -0
  88. moai_adk/core/user_behavior_analytics.py +851 -0
  89. moai_adk/core/version_sync.py +429 -0
  90. moai_adk/foundation/__init__.py +56 -0
  91. moai_adk/foundation/backend.py +1027 -0
  92. moai_adk/foundation/database.py +1115 -0
  93. moai_adk/foundation/devops.py +1585 -0
  94. moai_adk/foundation/ears.py +431 -0
  95. moai_adk/foundation/frontend.py +870 -0
  96. moai_adk/foundation/git/commit_templates.py +4 -12
  97. moai_adk/foundation/git.py +376 -0
  98. moai_adk/foundation/langs.py +484 -0
  99. moai_adk/foundation/ml_ops.py +1162 -0
  100. moai_adk/foundation/testing.py +1524 -0
  101. moai_adk/foundation/trust/trust_principles.py +23 -72
  102. moai_adk/foundation/trust/validation_checklist.py +57 -162
  103. moai_adk/project/__init__.py +0 -0
  104. moai_adk/project/configuration.py +1084 -0
  105. moai_adk/project/documentation.py +566 -0
  106. moai_adk/project/schema.py +447 -0
  107. moai_adk/statusline/alfred_detector.py +1 -3
  108. moai_adk/statusline/config.py +13 -4
  109. moai_adk/statusline/enhanced_output_style_detector.py +23 -15
  110. moai_adk/statusline/main.py +51 -15
  111. moai_adk/statusline/renderer.py +104 -48
  112. moai_adk/statusline/update_checker.py +3 -9
  113. moai_adk/statusline/version_reader.py +140 -46
  114. moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
  115. moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
  116. moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
  117. moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
  118. moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
  119. moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
  120. moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
  121. moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
  122. moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
  123. moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
  124. moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
  125. moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
  126. moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
  127. moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
  128. moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
  129. moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
  130. moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
  131. moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
  132. moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
  133. moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
  134. moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
  135. moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
  136. moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
  137. moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
  138. moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
  139. moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
  140. moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
  141. moai_adk/templates/.claude/commands/moai/3-sync.md +993 -0
  142. moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
  143. moai_adk/templates/.claude/hooks/__init__.py +8 -0
  144. moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
  145. moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
  146. moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
  147. moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
  148. moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
  149. moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
  150. moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
  151. moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
  152. moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
  153. moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
  154. moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
  155. moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
  156. moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
  157. moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
  158. moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
  159. moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
  160. moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +921 -0
  161. moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
  162. moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
  163. moai_adk/templates/.claude/settings.json +172 -0
  164. moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -0
  165. moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
  166. moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
  167. moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
  168. moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
  169. moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
  170. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +319 -0
  171. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +320 -0
  172. moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
  173. moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
  174. moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
  175. moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
  176. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +496 -0
  177. moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -0
  178. moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
  179. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
  180. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
  181. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
  182. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
  183. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
  184. moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
  185. moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +491 -0
  186. moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
  187. moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
  188. moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
  189. moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
  190. moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
  191. moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
  192. moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +201 -0
  193. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
  194. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
  195. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
  196. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
  197. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
  198. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
  199. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
  200. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
  201. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
  202. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
  203. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
  204. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
  205. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
  206. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
  207. moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +438 -0
  208. moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -0
  209. moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
  210. moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +346 -0
  211. moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
  212. moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
  213. moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
  214. moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
  215. moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
  216. moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
  217. moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
  218. moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
  219. moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +362 -0
  220. moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
  221. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
  222. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
  223. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
  224. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
  225. moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
  226. moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
  227. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
  228. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
  229. moai_adk/templates/.claude/skills/moai-integration-mcp/SKILL.md +352 -0
  230. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
  231. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
  232. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
  233. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
  234. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
  235. moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
  236. moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
  237. moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
  238. moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
  239. moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -0
  240. moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
  241. moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
  242. moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
  243. moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
  244. moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +316 -0
  245. moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
  246. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
  247. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
  248. moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
  249. moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
  250. moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
  251. moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
  252. moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
  253. moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
  254. moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
  255. moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +370 -0
  256. moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
  257. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
  258. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
  259. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
  260. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
  261. moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
  262. moai_adk/templates/.claude/skills/moai-platform-baas/README.md +186 -0
  263. moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
  264. moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
  265. moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
  266. moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
  267. moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
  268. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
  269. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
  270. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
  271. moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
  272. moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -0
  273. moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
  274. moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
  275. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
  276. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
  277. moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
  278. moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +135 -0
  279. moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
  280. moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
  281. moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
  282. moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
  283. moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
  284. moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
  285. moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
  286. moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
  287. moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
  288. moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
  289. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
  290. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -0
  291. moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
  292. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
  293. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
  294. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +71 -0
  295. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
  296. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
  297. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
  298. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
  299. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
  300. moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
  301. moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +374 -0
  302. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
  303. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
  304. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
  305. moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
  306. moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -0
  307. moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
  308. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
  309. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
  310. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
  311. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
  312. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
  313. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
  314. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
  315. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
  316. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
  317. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
  318. moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
  319. moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
  320. moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
  321. moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
  322. moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
  323. moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +410 -0
  324. moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
  325. moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
  326. moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
  327. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
  328. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
  329. moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
  330. moai_adk/templates/.git-hooks/pre-commit +103 -41
  331. moai_adk/templates/.git-hooks/pre-push +116 -21
  332. moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
  333. moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
  334. moai_adk/templates/.gitignore +184 -44
  335. moai_adk/templates/.mcp.json +7 -9
  336. moai_adk/templates/.moai/cache/personalization.json +10 -0
  337. moai_adk/templates/.moai/config/config.yaml +344 -0
  338. moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
  339. moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
  340. moai_adk/templates/.moai/config/presets/team.yaml +33 -0
  341. moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
  342. moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
  343. moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
  344. moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
  345. moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
  346. moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
  347. moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -0
  348. moai_adk/templates/.moai/config/sections/language.yaml +11 -0
  349. moai_adk/templates/.moai/config/sections/project.yaml +13 -0
  350. moai_adk/templates/.moai/config/sections/quality.yaml +15 -0
  351. moai_adk/templates/.moai/config/sections/system.yaml +14 -0
  352. moai_adk/templates/.moai/config/sections/user.yaml +5 -0
  353. moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
  354. moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
  355. moai_adk/templates/CLAUDE.md +382 -501
  356. moai_adk/utils/__init__.py +24 -1
  357. moai_adk/utils/banner.py +7 -10
  358. moai_adk/utils/common.py +16 -30
  359. moai_adk/utils/link_validator.py +4 -12
  360. moai_adk/utils/safe_file_reader.py +2 -6
  361. moai_adk/utils/timeout.py +160 -0
  362. moai_adk/utils/toon_utils.py +256 -0
  363. moai_adk/version.py +22 -0
  364. moai_adk-0.32.8.dist-info/METADATA +2478 -0
  365. moai_adk-0.32.8.dist-info/RECORD +396 -0
  366. {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
  367. {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
  368. moai_adk/cli/commands/backup.py +0 -82
  369. moai_adk/cli/commands/improve_user_experience.py +0 -348
  370. moai_adk/cli/commands/migrate.py +0 -158
  371. moai_adk/cli/commands/validate_links.py +0 -118
  372. moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -413
  373. moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
  374. moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
  375. moai_adk/utils/user_experience.py +0 -531
  376. moai_adk-0.25.4.dist-info/METADATA +0 -2279
  377. moai_adk-0.25.4.dist-info/RECORD +0 -112
  378. {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,485 @@
1
+ """
2
+ MoAI-ADK Language Configuration Resolver
3
+
4
+ Centralized system for resolving language configuration from multiple sources:
5
+ 1. Environment variables (highest priority)
6
+ 2. Configuration file (.moai/config/config.json)
7
+ 3. Default values (fallback)
8
+
9
+ This module provides a unified interface for all language-related configuration
10
+ needs across the MoAI-ADK system.
11
+ """
12
+
13
+ import json
14
+ import os
15
+ from pathlib import Path
16
+ from typing import Any, Dict, Optional
17
+
18
+ try:
19
+ import yaml
20
+
21
+ YAML_AVAILABLE = True
22
+ except ImportError:
23
+ YAML_AVAILABLE = False
24
+
25
+
26
+ class LanguageConfigResolver:
27
+ """
28
+ Resolves language configuration from environment variables and config files
29
+ with proper priority handling and validation.
30
+ """
31
+
32
+ # Dynamic language name generation - no fixed language map
33
+ # All languages are supported dynamically based on language codes
34
+
35
+ # Default configuration
36
+ DEFAULT_CONFIG = {
37
+ "user_name": "",
38
+ "conversation_language": "en",
39
+ "conversation_language_name": "English",
40
+ "agent_prompt_language": "en",
41
+ "git_commit_messages": "en",
42
+ "code_comments": "en",
43
+ "documentation": "en",
44
+ "error_messages": "en",
45
+ "config_source": "default",
46
+ }
47
+
48
+ def __init__(self, project_root: Optional[str] = None):
49
+ """
50
+ Initialize the resolver with project root path.
51
+
52
+ Args:
53
+ project_root: Root directory of the project. If None, uses current working directory.
54
+ """
55
+ self.project_root = Path(project_root) if project_root else Path.cwd()
56
+
57
+ # Auto-detect YAML (preferred) or JSON (fallback)
58
+ yaml_path = self.project_root / ".moai" / "config" / "config.yaml"
59
+ json_path = self.project_root / ".moai" / "config" / "config.json"
60
+
61
+ if YAML_AVAILABLE and yaml_path.exists():
62
+ self.config_file_path = yaml_path
63
+ elif json_path.exists():
64
+ self.config_file_path = json_path
65
+ else:
66
+ # Default to YAML for new projects
67
+ self.config_file_path = yaml_path if YAML_AVAILABLE else json_path
68
+
69
+ self._cached_config: Optional[Dict[str, Any]] = None
70
+
71
+ def resolve_config(self, force_refresh: bool = False) -> Dict[str, Any]:
72
+ """
73
+ Resolve the complete language configuration from all sources.
74
+
75
+ Args:
76
+ force_refresh: Force refresh of cached configuration
77
+
78
+ Returns:
79
+ Dictionary containing resolved language configuration
80
+ """
81
+ if self._cached_config is None or force_refresh:
82
+ self._cached_config = self._build_config()
83
+
84
+ return self._cached_config.copy()
85
+
86
+ def _build_config(self) -> Dict[str, Any]:
87
+ """
88
+ Build configuration by merging sources with proper priority.
89
+
90
+ Priority Order:
91
+ 1. Environment variables (highest)
92
+ 2. Configuration file
93
+ 3. Default values (lowest)
94
+ """
95
+ # Start with defaults
96
+ config = self.DEFAULT_CONFIG.copy()
97
+
98
+ # Load config file if exists
99
+ file_config = self._load_config_file()
100
+ if file_config:
101
+ config.update(file_config)
102
+
103
+ # Override with environment variables (highest priority)
104
+ env_config = self._load_env_config()
105
+ if env_config:
106
+ config.update(env_config)
107
+ config["config_source"] = "environment"
108
+ elif file_config:
109
+ config["config_source"] = "config_file"
110
+ else:
111
+ config["config_source"] = "default"
112
+
113
+ # Ensure consistency
114
+ config = self._ensure_consistency(config)
115
+
116
+ return config
117
+
118
+ def _load_config_file(self) -> Optional[Dict[str, Any]]:
119
+ """
120
+ Load configuration from .moai/config/config.yaml or config.json file.
121
+
122
+ Returns:
123
+ Configuration dictionary or None if file doesn't exist
124
+ """
125
+ try:
126
+ if not self.config_file_path.exists():
127
+ return None
128
+
129
+ with open(self.config_file_path, "r", encoding="utf-8") as f:
130
+ if self.config_file_path.suffix in [".yaml", ".yml"]:
131
+ if not YAML_AVAILABLE:
132
+ print(f"Warning: PyYAML not available, skipping {self.config_file_path}")
133
+ return None
134
+ full_config = yaml.safe_load(f) or {}
135
+ else:
136
+ full_config = json.load(f)
137
+
138
+ # Extract only relevant fields
139
+ config = {}
140
+
141
+ # User name
142
+ user_config = full_config.get("user", {})
143
+ if "name" in user_config:
144
+ config["user_name"] = user_config["name"]
145
+
146
+ # GitHub profile name (stored separately, not as user name fallback)
147
+ github_config = full_config.get("github", {})
148
+ if "profile_name" in github_config:
149
+ config["github_profile_name"] = github_config["profile_name"]
150
+
151
+ # Language settings
152
+ language_config = full_config.get("language", {})
153
+ if "conversation_language" in language_config:
154
+ config["conversation_language"] = language_config["conversation_language"]
155
+
156
+ if "conversation_language_name" in language_config:
157
+ config["conversation_language_name"] = language_config["conversation_language_name"]
158
+
159
+ if "agent_prompt_language" in language_config:
160
+ config["agent_prompt_language"] = language_config["agent_prompt_language"]
161
+
162
+ if "git_commit_messages" in language_config:
163
+ config["git_commit_messages"] = language_config["git_commit_messages"]
164
+
165
+ if "code_comments" in language_config:
166
+ config["code_comments"] = language_config["code_comments"]
167
+
168
+ if "documentation" in language_config:
169
+ config["documentation"] = language_config["documentation"]
170
+
171
+ if "error_messages" in language_config:
172
+ config["error_messages"] = language_config["error_messages"]
173
+
174
+ return config
175
+
176
+ except (
177
+ json.JSONDecodeError,
178
+ yaml.YAMLError if YAML_AVAILABLE else Exception,
179
+ IOError,
180
+ KeyError,
181
+ ) as e:
182
+ # Log error but don't fail - fall back to defaults
183
+ print(f"Warning: Failed to load config file {self.config_file_path}: {e}")
184
+ return None
185
+
186
+ def _load_env_config(self) -> Optional[Dict[str, Any]]:
187
+ """
188
+ Load configuration from environment variables.
189
+
190
+ Returns:
191
+ Configuration dictionary or None if no environment variables set
192
+ """
193
+ env_config = {}
194
+
195
+ # User name
196
+ user_name = os.getenv("MOAI_USER_NAME")
197
+ if user_name:
198
+ env_config["user_name"] = user_name
199
+
200
+ # Conversation language
201
+ conv_lang = os.getenv("MOAI_CONVERSATION_LANG")
202
+ if conv_lang:
203
+ env_config["conversation_language"] = conv_lang
204
+
205
+ # Agent prompt language
206
+ agent_lang = os.getenv("MOAI_AGENT_PROMPT_LANG")
207
+ if agent_lang:
208
+ env_config["agent_prompt_language"] = agent_lang
209
+
210
+ # Language name (if not provided, will be auto-generated)
211
+ lang_name = os.getenv("MOAI_CONVERSATION_LANG_NAME")
212
+ if lang_name:
213
+ env_config["conversation_language_name"] = lang_name
214
+
215
+ return env_config if env_config else None
216
+
217
+ def _ensure_consistency(self, config: Dict[str, Any]) -> Dict[str, Any]:
218
+ """
219
+ Ensure configuration consistency and auto-generate derived values.
220
+
221
+ Args:
222
+ config: Configuration dictionary to normalize
223
+
224
+ Returns:
225
+ Normalized configuration dictionary
226
+ """
227
+ # Always auto-generate language name based on conversation language
228
+ conv_lang = config.get("conversation_language", "en")
229
+ config["conversation_language_name"] = self.get_language_name(conv_lang)
230
+
231
+ # Ensure agent prompt language defaults to conversation language
232
+ if not config.get("agent_prompt_language"):
233
+ config["agent_prompt_language"] = conv_lang
234
+
235
+ # Validate language codes - all languages are now supported dynamically
236
+ # No validation needed - all language codes are accepted
237
+
238
+ return config
239
+
240
+ def get_language_name(self, language_code: str) -> str:
241
+ """
242
+ Get display name for a language code dynamically.
243
+
244
+ Args:
245
+ language_code: Language code (two-letter or three-letter)
246
+
247
+ Returns:
248
+ Display name for the language (English name)
249
+ """
250
+ if not language_code:
251
+ return "Unknown"
252
+
253
+ # Common language name mappings for well-known codes
254
+ common_names = {
255
+ "ko": "Korean",
256
+ "en": "English",
257
+ "ja": "Japanese",
258
+ "zh": "Chinese",
259
+ "es": "Spanish",
260
+ "fr": "French",
261
+ "de": "German",
262
+ "ru": "Russian",
263
+ "pt": "Portuguese",
264
+ "it": "Italian",
265
+ "ar": "Arabic",
266
+ "hi": "Hindi",
267
+ "th": "Thai",
268
+ "vi": "Vietnamese",
269
+ "id": "Indonesian",
270
+ "ms": "Malay",
271
+ "tr": "Turkish",
272
+ "pl": "Polish",
273
+ "nl": "Dutch",
274
+ "sv": "Swedish",
275
+ "da": "Danish",
276
+ "no": "Norwegian",
277
+ "fi": "Finnish",
278
+ "he": "Hebrew",
279
+ "el": "Greek",
280
+ "hu": "Hungarian",
281
+ "cs": "Czech",
282
+ "sk": "Slovak",
283
+ "ro": "Romanian",
284
+ "bg": "Bulgarian",
285
+ "hr": "Croatian",
286
+ "sr": "Serbian",
287
+ "sl": "Slovenian",
288
+ "et": "Estonian",
289
+ "lv": "Latvian",
290
+ "lt": "Lithuanian",
291
+ "uk": "Ukrainian",
292
+ "be": "Belarusian",
293
+ "ka": "Georgian",
294
+ "am": "Amharic",
295
+ "sw": "Swahili",
296
+ "zu": "Zulu",
297
+ "af": "Afrikaans",
298
+ "is": "Icelandic",
299
+ "mt": "Maltese",
300
+ "cy": "Welsh",
301
+ "ga": "Irish",
302
+ "gd": "Scottish Gaelic",
303
+ "eu": "Basque",
304
+ "ca": "Catalan",
305
+ "gl": "Galician",
306
+ "mk": "Macedonian",
307
+ "sq": "Albanian",
308
+ "bn": "Bengali",
309
+ "ta": "Tamil",
310
+ "te": "Telugu",
311
+ "ml": "Malayalam",
312
+ "kn": "Kannada",
313
+ "gu": "Gujarati",
314
+ "pa": "Punjabi",
315
+ "mr": "Marathi",
316
+ "ne": "Nepali",
317
+ "si": "Sinhala",
318
+ "my": "Myanmar (Burmese)",
319
+ "km": "Khmer",
320
+ "lo": "Lao",
321
+ "mn": "Mongolian",
322
+ "hy": "Armenian",
323
+ "az": "Azerbaijani",
324
+ "kk": "Kazakh",
325
+ "ky": "Kyrgyz",
326
+ "uz": "Uzbek",
327
+ "tg": "Tajik",
328
+ "tk": "Turkmen",
329
+ "ps": "Pashto",
330
+ "sd": "Sindhi",
331
+ "ur": "Urdu",
332
+ }
333
+
334
+ # Normalize language code
335
+ normalized_code = self._standardize_language_code(language_code.lower())
336
+
337
+ # Return known name or generate from language code
338
+ if normalized_code in common_names:
339
+ return common_names[normalized_code]
340
+ else:
341
+ # Generate English name from language code (capitalize first letter)
342
+ return normalized_code.title() if normalized_code else "Unknown"
343
+
344
+ def _standardize_language_code(self, language_code: str) -> str:
345
+ """
346
+ Standardize language code to common format.
347
+
348
+ Args:
349
+ language_code: Input language code
350
+
351
+ Returns:
352
+ Standardized language code
353
+ """
354
+ if not language_code:
355
+ return ""
356
+
357
+ # Handle common variations
358
+ code = language_code.lower().strip()
359
+
360
+ # Convert common variants to standard codes
361
+ standardizations = {
362
+ "zh-cn": "zh",
363
+ "zh-tw": "zh",
364
+ "zh-hk": "zh",
365
+ "en-us": "en",
366
+ "en-gb": "en",
367
+ "ko-kr": "ko",
368
+ "ja-jp": "ja",
369
+ "es-es": "es",
370
+ "es-mx": "es",
371
+ "pt-br": "pt",
372
+ "pt-pt": "pt",
373
+ "fr-fr": "fr",
374
+ "de-de": "de",
375
+ "it-it": "it",
376
+ "ru-ru": "ru",
377
+ }
378
+
379
+ return standardizations.get(code, code[:2]) # Return first 2 chars if not in standardizations
380
+
381
+ def is_korean_language(self, config: Optional[Dict[str, Any]] = None) -> bool:
382
+ """
383
+ Check if the resolved configuration uses Korean language.
384
+
385
+ Args:
386
+ config: Optional configuration dictionary. If None, uses resolved config.
387
+
388
+ Returns:
389
+ True if Korean language, False otherwise
390
+ """
391
+ if config is None:
392
+ config = self.resolve_config()
393
+
394
+ return config.get("conversation_language") == "ko"
395
+
396
+ def get_personalized_greeting(self, config: Optional[Dict[str, Any]] = None) -> str:
397
+ """
398
+ Get personalized greeting based on user name and language.
399
+
400
+ Args:
401
+ config: Optional configuration dictionary. If None, uses resolved config.
402
+
403
+ Returns:
404
+ Personalized greeting string
405
+ """
406
+ if config is None:
407
+ config = self.resolve_config()
408
+
409
+ user_name = config.get("user_name", "").strip()
410
+ is_korean = self.is_korean_language(config)
411
+
412
+ if user_name:
413
+ if is_korean:
414
+ return f"{user_name}님"
415
+ else:
416
+ return user_name
417
+
418
+ return ""
419
+
420
+ def export_template_variables(self, config: Optional[Dict[str, Any]] = None) -> Dict[str, str]:
421
+ """
422
+ Export configuration as template variables for substitution.
423
+
424
+ Args:
425
+ config: Optional configuration dictionary. If None, uses resolved config.
426
+
427
+ Returns:
428
+ Dictionary of template variables
429
+ """
430
+ if config is None:
431
+ config = self.resolve_config()
432
+
433
+ return {
434
+ "CONVERSATION_LANGUAGE": config["conversation_language"],
435
+ "CONVERSATION_LANGUAGE_NAME": config["conversation_language_name"],
436
+ "AGENT_PROMPT_LANGUAGE": config["agent_prompt_language"],
437
+ "GIT_COMMIT_MESSAGES_LANGUAGE": config["git_commit_messages"],
438
+ "CODE_COMMENTS_LANGUAGE": config["code_comments"],
439
+ "DOCUMENTATION_LANGUAGE": config["documentation"],
440
+ "ERROR_MESSAGES_LANGUAGE": config["error_messages"],
441
+ "USER_NAME": config["user_name"],
442
+ "PERSONALIZED_GREETING": self.get_personalized_greeting(config),
443
+ "CONFIG_SOURCE": config["config_source"],
444
+ }
445
+
446
+ def clear_cache(self):
447
+ """Clear any cached configuration."""
448
+ self._cached_config = None
449
+
450
+
451
+ # Global resolver instance
452
+ _resolver_instance: Optional[LanguageConfigResolver] = None
453
+
454
+
455
+ def get_resolver(project_root: Optional[str] = None) -> LanguageConfigResolver:
456
+ """
457
+ Get the global language configuration resolver instance.
458
+
459
+ Args:
460
+ project_root: Project root directory
461
+
462
+ Returns:
463
+ LanguageConfigResolver instance
464
+ """
465
+ global _resolver_instance
466
+
467
+ if _resolver_instance is None or (project_root and project_root != str(_resolver_instance.project_root)):
468
+ _resolver_instance = LanguageConfigResolver(project_root)
469
+
470
+ return _resolver_instance
471
+
472
+
473
+ def resolve_language_config(project_root: Optional[str] = None, force_refresh: bool = False) -> Dict[str, Any]:
474
+ """
475
+ Convenience function to resolve language configuration.
476
+
477
+ Args:
478
+ project_root: Project root directory
479
+ force_refresh: Force refresh of cached configuration
480
+
481
+ Returns:
482
+ Resolved language configuration
483
+ """
484
+ resolver = get_resolver(project_root)
485
+ return resolver.resolve_config(force_refresh)
@@ -8,31 +8,32 @@ Provides comprehensive language validation capabilities for programming language
8
8
  from pathlib import Path
9
9
  from typing import Any, Dict, List, Optional, Set, Tuple
10
10
 
11
+
11
12
  # Language detector functionality removed due to missing dependency
12
13
  # Using simplified language detection for now
13
14
  def get_all_supported_languages():
14
15
  """Get all supported programming languages."""
15
16
  return {"python", "javascript", "typescript", "java", "go", "rust", "cpp", "c"}
16
17
 
18
+
17
19
  def get_language_by_file_extension(extension: str) -> Optional[str]:
18
20
  """Get programming language by file extension."""
19
- from pathlib import Path
20
21
 
21
22
  # Handle Path objects and strings
22
- if hasattr(extension, 'suffix'):
23
+ if hasattr(extension, "suffix"):
23
24
  # Path object
24
25
  ext = extension.suffix.lower()
25
26
  else:
26
27
  # String - extract extension
27
28
  ext = str(extension).lower()
28
- if not ext.startswith('.'):
29
+ if not ext.startswith("."):
29
30
  # Extract extension from filename
30
- if '.' in ext:
31
- ext = '.' + ext.split('.')[-1]
31
+ if "." in ext:
32
+ ext = "." + ext.split(".")[-1]
32
33
  else:
33
- ext = ''
34
+ ext = ""
34
35
 
35
- EXTENSION_MAP = {
36
+ EXTENSION_MAP = { # noqa: N806 - intentional constant naming
36
37
  ".py": "python",
37
38
  ".js": "javascript",
38
39
  ".ts": "typescript",
@@ -46,17 +47,20 @@ def get_language_by_file_extension(extension: str) -> Optional[str]:
46
47
  }
47
48
  return EXTENSION_MAP.get(ext)
48
49
 
50
+
49
51
  def is_code_directory(path: str) -> bool:
50
52
  """Check if directory is a code directory."""
51
53
  code_dirs = {"src", "lib", "app", "components", "modules", "packages"}
52
54
  return any(dir_name in path for dir_name in code_dirs)
53
55
 
56
+
54
57
  LANGUAGE_DIRECTORY_MAP = {
55
58
  "python": ["src", "tests", "examples"],
56
59
  "javascript": ["src", "lib", "packages"],
57
60
  "typescript": ["src", "lib", "packages"],
58
61
  }
59
62
 
63
+
60
64
  def get_exclude_patterns():
61
65
  """Get patterns to exclude from language detection."""
62
66
  return ["*.pyc", "*.pyo", "__pycache__", ".git", "node_modules", ".venv"]
@@ -127,8 +131,8 @@ class LanguageValidator:
127
131
  self.supported_languages = set(lang.lower() for lang in supported_languages)
128
132
 
129
133
  # Compile regex patterns for efficient matching
130
- self._directory_patterns = {}
131
- self._exclude_patterns_cache = {}
134
+ self._directory_patterns: Dict[str, Any] = {}
135
+ self._exclude_patterns_cache: Dict[str, Any] = {}
132
136
 
133
137
  # Initialize analysis cache for statistics tracking
134
138
  self._analysis_cache = {
@@ -137,9 +141,7 @@ class LanguageValidator:
137
141
  "supported_languages_found": 0,
138
142
  }
139
143
 
140
- def _validate_and_normalize_input(
141
- self, value: Any, input_type: str
142
- ) -> Optional[Any]:
144
+ def _validate_and_normalize_input(self, value: Any, input_type: str) -> Optional[Any]:
143
145
  """
144
146
  Validate and normalize input values.
145
147
 
@@ -243,11 +245,11 @@ class LanguageValidator:
243
245
  if normalized_lang in LANGUAGE_DIRECTORY_MAP:
244
246
  dirs = LANGUAGE_DIRECTORY_MAP[normalized_lang].copy()
245
247
  # Add trailing slash for consistency with test expectations
246
- return [f"{dir}/" if not dir.endswith('/') else dir for dir in dirs]
248
+ return [f"{dir}/" if not dir.endswith("/") else dir for dir in dirs]
247
249
 
248
250
  # Return default Python directories as fallback with trailing slashes
249
251
  default_dirs = LANGUAGE_DIRECTORY_MAP.get("python", [])
250
- return [f"{dir}/" if not dir.endswith('/') else dir for dir in default_dirs]
252
+ return [f"{dir}/" if not dir.endswith("/") else dir for dir in default_dirs]
251
253
 
252
254
  def get_file_extensions(self, language: str) -> List[str]:
253
255
  """
@@ -324,7 +326,7 @@ class LanguageValidator:
324
326
  return config_patterns[filename]
325
327
 
326
328
  # Extract extension and try normal detection
327
- extension = Path(filename).suffix.lower()
329
+ Path(filename).suffix.lower()
328
330
  return self.detect_language_from_extension(filename)
329
331
 
330
332
  def validate_file_extension(self, file_path: Any, language: str) -> bool:
@@ -376,9 +378,7 @@ class LanguageValidator:
376
378
 
377
379
  return language.strip().lower()
378
380
 
379
- def validate_project_configuration(
380
- self, config: Dict[str, Any]
381
- ) -> Tuple[bool, List[str]]:
381
+ def validate_project_configuration(self, config: Dict[str, Any]) -> Tuple[bool, List[str]]:
382
382
  """
383
383
  Validate project configuration for language support.
384
384
 
@@ -425,18 +425,13 @@ class LanguageValidator:
425
425
  return False, issues
426
426
 
427
427
  # Additional validation for empty strings and whitespace-only names
428
- if (
429
- isinstance(project_config["name"], str)
430
- and not project_config["name"].strip()
431
- ):
428
+ if isinstance(project_config["name"], str) and not project_config["name"].strip():
432
429
  issues.append("Project name cannot be empty or contain only whitespace")
433
430
  return False, issues
434
431
 
435
432
  return True, issues
436
433
 
437
- def validate_project_structure(
438
- self, project_files: Dict[str, bool], language: str
439
- ) -> Tuple[bool, List[str]]:
434
+ def validate_project_structure(self, project_files: Dict[str, bool], language: str) -> Tuple[bool, List[str]]:
440
435
  """
441
436
  Validate project structure for a specific language.
442
437
 
@@ -448,12 +443,8 @@ class LanguageValidator:
448
443
  Tuple of (is_valid, issues) where is_valid is boolean and issues is list of strings.
449
444
  """
450
445
  if self.auto_validate:
451
- validated_project_files = self._validate_and_normalize_input(
452
- project_files, "dict"
453
- )
454
- validated_language = self._validate_and_normalize_input(
455
- language, "language"
456
- )
446
+ validated_project_files = self._validate_and_normalize_input(project_files, "dict")
447
+ validated_language = self._validate_and_normalize_input(language, "language")
457
448
  if validated_project_files is None or validated_language is None:
458
449
  return False, ["Invalid input format for project structure validation"]
459
450
 
@@ -461,7 +452,7 @@ class LanguageValidator:
461
452
  expected_dirs = self.get_expected_directories(language)
462
453
 
463
454
  # Group files by directory
464
- files_by_dir = {}
455
+ files_by_dir: Dict[str, List[str]] = {}
465
456
  for file_path, is_source in project_files.items():
466
457
  if is_source: # Only validate source files
467
458
  dir_path = str(Path(file_path).parent) + "/"
@@ -478,18 +469,14 @@ class LanguageValidator:
478
469
  break
479
470
 
480
471
  if not found_files_in_dir and expected_dir != "{package_name}/":
481
- issues.append(
482
- f"No source files found in expected directory: {expected_dir}"
483
- )
472
+ issues.append(f"No source files found in expected directory: {expected_dir}")
484
473
 
485
474
  # Check for files in unexpected directories
486
- config = {} # Using empty config for default exclude patterns
487
- exclude_patterns = get_exclude_patterns(config)
488
-
475
+ # Note: Using simplified check since is_code_directory signature changed
489
476
  for file_path, is_source in project_files.items():
490
477
  if is_source:
491
- path_obj = Path(file_path)
492
- if not is_code_directory(path_obj, config, language):
478
+ path_str = str(file_path)
479
+ if not is_code_directory(path_str):
493
480
  issues.append(f"Source file in unexpected location: {file_path}")
494
481
 
495
482
  return len(issues) == 0, issues
@@ -511,7 +498,7 @@ class LanguageValidator:
511
498
  else:
512
499
  validated_files = files
513
500
 
514
- stats = {}
501
+ stats: Dict[str, int] = {}
515
502
  total_files = 0
516
503
  detected_extensions = set()
517
504