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,436 @@
1
+ """
2
+ Unified Configuration Manager for MoAI-ADK
3
+
4
+ Thread-safe singleton configuration manager that consolidates all config management
5
+ patterns from across the codebase into a single, robust implementation.
6
+
7
+ Features:
8
+ - Thread-safe singleton with double-checked locking
9
+ - Lazy loading with in-memory caching
10
+ - Atomic writes with backup creation
11
+ - Schema validation support
12
+ - Smart defaults with auto-detection
13
+ - Deep merge for nested configs
14
+ - Configuration migration between versions
15
+ - Domain-specific facades for different subsystems
16
+
17
+ Design Philosophy:
18
+ - Single source of truth for `.moai/config/config.yaml` (with JSON fallback)
19
+ - Best patterns from StatuslineConfig, UnifiedConfigManager, ConfigurationManager
20
+ - Backward compatible with existing ConfigManager interfaces
21
+ - Performance optimized with caching and minimal I/O
22
+
23
+ Usage:
24
+ >>> from moai_adk.core.config.unified import get_unified_config
25
+ >>> config = get_unified_config()
26
+ >>> timeout = config.get("hooks.timeout_ms", 2000)
27
+ >>> config.update({"hooks.timeout_ms": 3000})
28
+ >>> config.save()
29
+ """
30
+
31
+ import json
32
+ import logging
33
+ import shutil
34
+ import threading
35
+ from datetime import datetime
36
+ from functools import lru_cache
37
+ from pathlib import Path
38
+ from typing import Any, Dict, Optional, Union
39
+
40
+ try:
41
+ import yaml
42
+
43
+ YAML_AVAILABLE = True
44
+ except ImportError:
45
+ YAML_AVAILABLE = False
46
+
47
+ logger = logging.getLogger(__name__)
48
+
49
+
50
+ class UnifiedConfigManager:
51
+ """
52
+ Thread-safe singleton configuration manager for MoAI-ADK.
53
+
54
+ This class consolidates all configuration management patterns from:
55
+ - StatuslineConfig: Thread-safe singleton pattern
56
+ - UnifiedConfigManager (skills): Backup, migration, validation
57
+ - ConfigurationManager (project): Smart defaults, auto-detection
58
+ - ConfigManager (hooks): Convenience functions
59
+
60
+ Attributes:
61
+ _instance: Singleton instance
62
+ _config: Cached configuration dictionary
63
+ _lock: Thread lock for singleton pattern
64
+ _config_path: Path to configuration file
65
+ _last_modified: Last modification timestamp for cache invalidation
66
+ """
67
+
68
+ _instance: Optional["UnifiedConfigManager"] = None
69
+ _config: Dict[str, Any] = {}
70
+ _lock = threading.Lock()
71
+ _config_path: Optional[Path] = None
72
+ _last_modified: Optional[float] = None
73
+
74
+ def __new__(cls, config_path: Optional[Union[str, Path]] = None):
75
+ """
76
+ Create or return singleton instance with double-checked locking.
77
+
78
+ Args:
79
+ config_path: Optional path to config file (default: .moai/config/config.json)
80
+
81
+ Returns:
82
+ UnifiedConfigManager: Singleton instance
83
+ """
84
+ # Double-checked locking pattern for thread-safe singleton
85
+ if cls._instance is None:
86
+ with cls._lock:
87
+ # Double-check after acquiring lock
88
+ if cls._instance is None:
89
+ cls._instance = super().__new__(cls)
90
+ cls._instance._initialize(config_path)
91
+ return cls._instance
92
+
93
+ def _initialize(self, config_path: Optional[Union[str, Path]] = None) -> None:
94
+ """
95
+ Initialize configuration manager (called once by singleton).
96
+
97
+ Args:
98
+ config_path: Optional path to config file
99
+ """
100
+ # Set config path with auto-detection
101
+ if config_path:
102
+ self._config_path = Path(config_path)
103
+ else:
104
+ # Auto-detect YAML (preferred) or JSON (fallback)
105
+ base_path = Path.cwd() / ".moai" / "config"
106
+ yaml_path = base_path / "config.yaml"
107
+ json_path = base_path / "config.json"
108
+
109
+ if YAML_AVAILABLE and yaml_path.exists():
110
+ self._config_path = yaml_path
111
+ elif json_path.exists():
112
+ self._config_path = json_path
113
+ else:
114
+ # Default to YAML for new projects
115
+ self._config_path = yaml_path if YAML_AVAILABLE else json_path
116
+
117
+ # Load configuration
118
+ self._load_config()
119
+
120
+ def _load_config(self) -> None:
121
+ """
122
+ Load configuration from file with caching.
123
+
124
+ Implements cache invalidation based on file modification time.
125
+ Falls back to default configuration if file doesn't exist.
126
+ Supports both YAML (preferred) and JSON (legacy) formats.
127
+ """
128
+ try:
129
+ # Check if file exists
130
+ if not self._config_path.exists():
131
+ logger.warning(f"Config file not found: {self._config_path}")
132
+ self._config = self._get_default_config()
133
+ return
134
+
135
+ # Check cache validity
136
+ current_mtime = self._config_path.stat().st_mtime
137
+ if self._last_modified and current_mtime == self._last_modified:
138
+ # Cache is still valid
139
+ return
140
+
141
+ # Load from file (auto-detect format)
142
+ with open(self._config_path, "r", encoding="utf-8") as f:
143
+ if self._config_path.suffix == ".yaml" or self._config_path.suffix == ".yml":
144
+ if not YAML_AVAILABLE:
145
+ raise ImportError("PyYAML is required for YAML config files. Install with: pip install pyyaml")
146
+ self._config = yaml.safe_load(f) or {}
147
+ else:
148
+ self._config = json.load(f)
149
+
150
+ # Update cache timestamp
151
+ self._last_modified = current_mtime
152
+
153
+ logger.debug(f"Loaded config from {self._config_path}")
154
+
155
+ except (
156
+ json.JSONDecodeError,
157
+ yaml.YAMLError if YAML_AVAILABLE else Exception,
158
+ OSError,
159
+ UnicodeDecodeError,
160
+ ) as e:
161
+ logger.error(f"Failed to load config: {e}")
162
+ self._config = self._get_default_config()
163
+
164
+ def get(self, key: str, default: Any = None) -> Any:
165
+ """
166
+ Get configuration value with dot-notation support.
167
+
168
+ Args:
169
+ key: Configuration key (supports dot notation, e.g., "hooks.timeout_ms")
170
+ default: Default value if key not found
171
+
172
+ Returns:
173
+ Configuration value or default
174
+
175
+ Examples:
176
+ >>> config.get("hooks.timeout_ms", 2000)
177
+ 2000
178
+ >>> config.get("project.name")
179
+ "MoAI-ADK"
180
+ """
181
+ # Reload if file changed
182
+ self._reload_if_modified()
183
+
184
+ # Navigate nested dict with dot notation
185
+ keys = key.split(".")
186
+ value = self._config
187
+
188
+ for k in keys:
189
+ if isinstance(value, dict):
190
+ value = value.get(k)
191
+ if value is None:
192
+ return default
193
+ else:
194
+ return default
195
+
196
+ return value if value is not None else default
197
+
198
+ def set(self, key: str, value: Any) -> None:
199
+ """
200
+ Set configuration value with dot-notation support.
201
+
202
+ Args:
203
+ key: Configuration key (supports dot notation)
204
+ value: Value to set
205
+
206
+ Examples:
207
+ >>> config.set("hooks.timeout_ms", 3000)
208
+ >>> config.set("project.name", "MyProject")
209
+ """
210
+ # Navigate to parent dict
211
+ keys = key.split(".")
212
+ target = self._config
213
+
214
+ for k in keys[:-1]:
215
+ if k not in target:
216
+ target[k] = {}
217
+ target = target[k]
218
+
219
+ # Set value
220
+ target[keys[-1]] = value
221
+
222
+ def update(self, updates: Dict[str, Any], deep_merge: bool = True) -> None:
223
+ """
224
+ Update configuration with dictionary.
225
+
226
+ Args:
227
+ updates: Dictionary of updates
228
+ deep_merge: If True, recursively merge nested dicts (default: True)
229
+
230
+ Examples:
231
+ >>> config.update({"hooks": {"timeout_ms": 3000}})
232
+ >>> config.update({"project.name": "MyProject"}, deep_merge=False)
233
+ """
234
+ if deep_merge:
235
+ self._config = self._deep_merge(self._config, updates)
236
+ else:
237
+ self._config.update(updates)
238
+
239
+ def save(self, backup: bool = True) -> bool:
240
+ """
241
+ Save configuration to file with atomic write.
242
+
243
+ Args:
244
+ backup: If True, create backup before saving (default: True)
245
+
246
+ Returns:
247
+ bool: True if save successful, False otherwise
248
+
249
+ Pattern: Temp file → Atomic rename (prevents corruption)
250
+ """
251
+ try:
252
+ # Create backup if requested
253
+ if backup and self._config_path.exists():
254
+ self._create_backup()
255
+
256
+ # Atomic write pattern: temp file → rename
257
+ temp_path = self._config_path.with_suffix(".tmp")
258
+
259
+ # Write to temp file (auto-detect format)
260
+ with open(temp_path, "w", encoding="utf-8") as f:
261
+ if self._config_path.suffix == ".yaml" or self._config_path.suffix == ".yml":
262
+ if not YAML_AVAILABLE:
263
+ raise ImportError("PyYAML is required for YAML config files. Install with: pip install pyyaml")
264
+ yaml.safe_dump(
265
+ self._config,
266
+ f,
267
+ default_flow_style=False,
268
+ allow_unicode=True,
269
+ sort_keys=False,
270
+ )
271
+ else:
272
+ json.dump(self._config, f, indent=2, ensure_ascii=False)
273
+
274
+ # Atomic rename
275
+ temp_path.replace(self._config_path)
276
+
277
+ # Update cache timestamp
278
+ self._last_modified = self._config_path.stat().st_mtime
279
+
280
+ logger.info(f"Saved config to {self._config_path}")
281
+ return True
282
+
283
+ except (OSError, PermissionError) as e:
284
+ logger.error(f"Failed to save config: {e}")
285
+ return False
286
+
287
+ def _create_backup(self) -> None:
288
+ """Create timestamped backup of config file."""
289
+ try:
290
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
291
+ backup_dir = self._config_path.parent / "backups"
292
+ backup_dir.mkdir(parents=True, exist_ok=True)
293
+
294
+ backup_path = backup_dir / f"config_backup_{timestamp}.json"
295
+ shutil.copy2(self._config_path, backup_path)
296
+
297
+ logger.debug(f"Created backup: {backup_path}")
298
+
299
+ except (OSError, PermissionError) as e:
300
+ logger.warning(f"Failed to create backup: {e}")
301
+
302
+ def _reload_if_modified(self) -> None:
303
+ """Reload config if file has been modified."""
304
+ try:
305
+ if self._config_path.exists():
306
+ current_mtime = self._config_path.stat().st_mtime
307
+ if self._last_modified is None or current_mtime != self._last_modified:
308
+ self._load_config()
309
+ except OSError:
310
+ pass
311
+
312
+ @staticmethod
313
+ def _deep_merge(base: Dict[str, Any], updates: Dict[str, Any]) -> Dict[str, Any]:
314
+ """
315
+ Recursively merge two dictionaries.
316
+
317
+ Args:
318
+ base: Base dictionary
319
+ updates: Updates to merge
320
+
321
+ Returns:
322
+ Merged dictionary
323
+ """
324
+ result = base.copy()
325
+
326
+ for key, value in updates.items():
327
+ if key in result and isinstance(result[key], dict) and isinstance(value, dict):
328
+ result[key] = UnifiedConfigManager._deep_merge(result[key], value)
329
+ else:
330
+ result[key] = value
331
+
332
+ return result
333
+
334
+ @staticmethod
335
+ def _get_default_config() -> Dict[str, Any]:
336
+ """
337
+ Get default configuration when file doesn't exist.
338
+
339
+ Returns:
340
+ Default configuration dictionary
341
+ """
342
+ return {
343
+ "moai": {"version": "0.28.0", "update_check_frequency": "daily"},
344
+ "project": {"name": "MyProject", "initialized": False},
345
+ "hooks": {"timeout_ms": 2000, "graceful_degradation": True},
346
+ "session": {"suppress_setup_messages": False},
347
+ "language": {"conversation_language": "en", "agent_prompt_language": "en"},
348
+ }
349
+
350
+ def get_all(self) -> Dict[str, Any]:
351
+ """
352
+ Get entire configuration dictionary.
353
+
354
+ Returns:
355
+ Complete configuration dictionary
356
+ """
357
+ self._reload_if_modified()
358
+ return self._config.copy()
359
+
360
+ def reset_to_defaults(self) -> None:
361
+ """Reset configuration to defaults without saving."""
362
+ self._config = self._get_default_config()
363
+
364
+
365
+ # Module-level singleton instance
366
+ _unified_config_instance: Optional[UnifiedConfigManager] = None
367
+
368
+
369
+ def get_unified_config(
370
+ config_path: Optional[Union[str, Path]] = None,
371
+ ) -> UnifiedConfigManager:
372
+ """
373
+ Get or create unified configuration manager instance.
374
+
375
+ Args:
376
+ config_path: Optional path to config file
377
+
378
+ Returns:
379
+ UnifiedConfigManager: Singleton instance
380
+
381
+ Examples:
382
+ >>> config = get_unified_config()
383
+ >>> timeout = config.get("hooks.timeout_ms", 2000)
384
+ """
385
+ global _unified_config_instance
386
+
387
+ if _unified_config_instance is None:
388
+ _unified_config_instance = UnifiedConfigManager(config_path)
389
+
390
+ return _unified_config_instance
391
+
392
+
393
+ # Convenience functions for common operations
394
+ @lru_cache(maxsize=1)
395
+ def get_config_path() -> Path:
396
+ """Get path to configuration file."""
397
+ return Path.cwd() / ".moai" / "config" / "config.json"
398
+
399
+
400
+ def get_config_value(key: str, default: Any = None) -> Any:
401
+ """
402
+ Get configuration value (convenience function).
403
+
404
+ Args:
405
+ key: Configuration key with dot notation
406
+ default: Default value if key not found
407
+
408
+ Returns:
409
+ Configuration value or default
410
+ """
411
+ return get_unified_config().get(key, default)
412
+
413
+
414
+ def set_config_value(key: str, value: Any) -> None:
415
+ """
416
+ Set configuration value (convenience function).
417
+
418
+ Args:
419
+ key: Configuration key with dot notation
420
+ value: Value to set
421
+ """
422
+ config = get_unified_config()
423
+ config.set(key, value)
424
+
425
+
426
+ def save_config(backup: bool = True) -> bool:
427
+ """
428
+ Save configuration (convenience function).
429
+
430
+ Args:
431
+ backup: Create backup before saving
432
+
433
+ Returns:
434
+ bool: True if successful
435
+ """
436
+ return get_unified_config().save(backup)
@@ -0,0 +1,273 @@
1
+ """
2
+ Context Management Module for Commands Layer
3
+
4
+ Provides utilities for:
5
+ 1. Path validation and absolute path conversion
6
+ 2. Atomic JSON file operations
7
+ 3. Phase result persistence and loading
8
+ 4. Template variable substitution
9
+ """
10
+
11
+ import json
12
+ import os
13
+ import re
14
+ import tempfile
15
+ from datetime import datetime, timezone
16
+ from typing import Any, Dict, Optional
17
+
18
+ # Constants
19
+ PROJECT_ROOT_SAFETY_MSG = "Path outside project root: {}"
20
+ PARENT_DIR_MISSING_MSG = "Parent directory not found: {}"
21
+
22
+
23
+ def _is_path_within_root(abs_path: str, project_root: str) -> bool:
24
+ """
25
+ Check if absolute path is within project root.
26
+
27
+ Resolves symlinks to prevent escape attacks.
28
+
29
+ Args:
30
+ abs_path: Absolute path to check
31
+ project_root: Project root directory
32
+
33
+ Returns:
34
+ True if path is within root, False otherwise
35
+ """
36
+ try:
37
+ real_abs_path = os.path.realpath(abs_path)
38
+ real_project_root = os.path.realpath(project_root)
39
+
40
+ return real_abs_path == real_project_root or real_abs_path.startswith(real_project_root + os.sep)
41
+ except OSError:
42
+ return False
43
+
44
+
45
+ def validate_and_convert_path(relative_path: str, project_root: str) -> str:
46
+ """
47
+ Convert relative path to absolute path and validate it.
48
+
49
+ Ensures path stays within project root and parent directories exist
50
+ for file paths.
51
+
52
+ Args:
53
+ relative_path: Path to validate and convert (relative or absolute)
54
+ project_root: Project root directory for relative path resolution
55
+
56
+ Returns:
57
+ Validated absolute path
58
+
59
+ Raises:
60
+ ValueError: If path is outside project root
61
+ FileNotFoundError: If parent directory doesn't exist for file paths
62
+ """
63
+ # Convert to absolute path
64
+ abs_path = os.path.abspath(os.path.join(project_root, relative_path))
65
+ project_root_abs = os.path.abspath(project_root)
66
+
67
+ # Security check: ensure path stays within project root
68
+ if not _is_path_within_root(abs_path, project_root_abs):
69
+ raise ValueError(PROJECT_ROOT_SAFETY_MSG.format(abs_path))
70
+
71
+ # If it's a directory and exists, return it
72
+ if os.path.isdir(abs_path):
73
+ return abs_path
74
+
75
+ # For files, check if parent directory exists
76
+ parent_dir = os.path.dirname(abs_path)
77
+ if not os.path.exists(parent_dir):
78
+ raise FileNotFoundError(PARENT_DIR_MISSING_MSG.format(parent_dir))
79
+
80
+ return abs_path
81
+
82
+
83
+ def _cleanup_temp_file(temp_fd: Optional[int], temp_path: Optional[str]) -> None:
84
+ """
85
+ Clean up temporary file handles and paths.
86
+
87
+ Silently ignores errors during cleanup.
88
+
89
+ Args:
90
+ temp_fd: File descriptor to close, or None
91
+ temp_path: Path to file to remove, or None
92
+ """
93
+ if temp_fd is not None:
94
+ try:
95
+ os.close(temp_fd)
96
+ except OSError:
97
+ pass
98
+
99
+ if temp_path and os.path.exists(temp_path):
100
+ try:
101
+ os.unlink(temp_path)
102
+ except OSError:
103
+ pass
104
+
105
+
106
+ def save_phase_result(data: Dict[str, Any], target_path: str) -> None:
107
+ """
108
+ Atomically save phase result to JSON file.
109
+
110
+ Uses temporary file and atomic rename to ensure data integrity
111
+ even if write fails midway.
112
+
113
+ Args:
114
+ data: Dictionary to save
115
+ target_path: Full path where JSON should be saved
116
+
117
+ Raises:
118
+ IOError: If write or rename fails
119
+ OSError: If directory is not writable
120
+ """
121
+ target_dir = os.path.dirname(target_path)
122
+ os.makedirs(target_dir, exist_ok=True)
123
+
124
+ # Atomic write using temp file
125
+ temp_fd = None
126
+ temp_path = None
127
+
128
+ try:
129
+ # Create temp file in target directory for atomic rename
130
+ temp_fd, temp_path = tempfile.mkstemp(dir=target_dir, prefix=".tmp_phase_", suffix=".json")
131
+
132
+ # Write JSON to temp file
133
+ with os.fdopen(temp_fd, "w", encoding="utf-8") as f:
134
+ json.dump(data, f, indent=2, ensure_ascii=False)
135
+
136
+ temp_fd = None # File handle is now closed
137
+
138
+ # Atomic rename
139
+ os.replace(temp_path, target_path)
140
+
141
+ except Exception as e:
142
+ _cleanup_temp_file(temp_fd, temp_path)
143
+ raise IOError(f"Failed to write {target_path}: {e}")
144
+
145
+
146
+ def load_phase_result(source_path: str) -> Dict[str, Any]:
147
+ """
148
+ Load phase result from JSON file.
149
+
150
+ Args:
151
+ source_path: Full path to JSON file to load
152
+
153
+ Returns:
154
+ Dictionary containing phase result
155
+
156
+ Raises:
157
+ FileNotFoundError: If file doesn't exist
158
+ json.JSONDecodeError: If file is not valid JSON
159
+ """
160
+ if not os.path.exists(source_path):
161
+ raise FileNotFoundError(f"Phase result file not found: {source_path}")
162
+
163
+ with open(source_path, "r", encoding="utf-8") as f:
164
+ data = json.load(f)
165
+
166
+ return data
167
+
168
+
169
+ def substitute_template_variables(text: str, context: Dict[str, str]) -> str:
170
+ """
171
+ Replace template variables in text with values from context.
172
+
173
+ Performs safe string substitution of {{VARIABLE}} placeholders.
174
+
175
+ Args:
176
+ text: Text containing {{VARIABLE}} placeholders
177
+ context: Dictionary mapping variable names to values
178
+
179
+ Returns:
180
+ Text with variables substituted
181
+ """
182
+ result = text
183
+
184
+ for key, value in context.items():
185
+ placeholder = f"{{{{{key}}}}}"
186
+ result = result.replace(placeholder, str(value))
187
+
188
+ return result
189
+
190
+
191
+ # Regex pattern for detecting unsubstituted template variables
192
+ # Matches {{VARIABLE}}, {{VAR_NAME}}, {{VAR1}}, etc.
193
+ TEMPLATE_VAR_PATTERN = r"\{\{[A-Z_][A-Z0-9_]*\}\}"
194
+
195
+
196
+ def validate_no_template_vars(text: str) -> None:
197
+ """
198
+ Validate that text contains no unsubstituted template variables.
199
+
200
+ Raises error if any {{VARIABLE}} patterns are found.
201
+
202
+ Args:
203
+ text: Text to validate
204
+
205
+ Raises:
206
+ ValueError: If unsubstituted variables are found
207
+ """
208
+ matches = re.findall(TEMPLATE_VAR_PATTERN, text)
209
+
210
+ if matches:
211
+ raise ValueError(f"Unsubstituted template variables found: {matches}")
212
+
213
+
214
+ class ContextManager:
215
+ """
216
+ Manages context passing and state persistence for Commands layer.
217
+
218
+ Handles saving and loading phase results, managing state directory,
219
+ and providing convenient access to command state.
220
+ """
221
+
222
+ def __init__(self, project_root: str):
223
+ """
224
+ Initialize ContextManager.
225
+
226
+ Args:
227
+ project_root: Root directory of the project
228
+ """
229
+ self.project_root = project_root
230
+ self.state_dir = os.path.join(project_root, ".moai", "memory", "command-state")
231
+ os.makedirs(self.state_dir, exist_ok=True)
232
+
233
+ def save_phase_result(self, data: Dict[str, Any]) -> str:
234
+ """
235
+ Save phase result with timestamp.
236
+
237
+ Args:
238
+ data: Phase result data
239
+
240
+ Returns:
241
+ Path to saved file
242
+ """
243
+ # Generate filename with timestamp
244
+ timestamp = datetime.now(timezone.utc).strftime("%Y%m%d-%H%M%S")
245
+ phase_name = data.get("phase", "unknown")
246
+ filename = f"{phase_name}-{timestamp}.json"
247
+ target_path = os.path.join(self.state_dir, filename)
248
+
249
+ save_phase_result(data, target_path)
250
+ return target_path
251
+
252
+ def load_latest_phase(self) -> Optional[Dict[str, Any]]:
253
+ """
254
+ Load the most recent phase result.
255
+
256
+ Returns:
257
+ Phase result dictionary or None if no phase files exist
258
+ """
259
+ # List all phase files
260
+ phase_files = sorted([f for f in os.listdir(self.state_dir) if f.endswith(".json")])
261
+
262
+ if not phase_files:
263
+ return None
264
+
265
+ # Load the latest (last in sorted order)
266
+ latest_file = phase_files[-1]
267
+ latest_path = os.path.join(self.state_dir, latest_file)
268
+
269
+ return load_phase_result(latest_path)
270
+
271
+ def get_state_dir(self) -> str:
272
+ """Get the command state directory path."""
273
+ return self.state_dir