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,1083 @@
1
+ #!/usr/bin/env python3
2
+ # SessionStart Hook: Enhanced Project Information
3
+ """SessionStart Hook: Enhanced Project Information
4
+
5
+ Claude Code Event: SessionStart
6
+ Purpose: Display enhanced project status with Git info, test status, and SPEC progress
7
+ Execution: Triggered automatically when Claude Code session begins
8
+
9
+ Enhanced Features:
10
+ - Optimized timeout handling with unified manager
11
+ - Efficient Git operations with connection pooling and caching
12
+ - Enhanced error handling with graceful degradation
13
+ - Resource monitoring and cleanup
14
+ - Risk assessment with performance metrics
15
+ """
16
+
17
+ import json
18
+ import logging
19
+ import sys
20
+ from datetime import datetime
21
+ from pathlib import Path
22
+ from typing import Any, Dict
23
+
24
+ # Setup import path for shared modules
25
+ HOOKS_DIR = Path(__file__).parent
26
+ LIB_DIR = HOOKS_DIR / "lib"
27
+ if str(LIB_DIR) not in sys.path:
28
+ sys.path.insert(0, str(LIB_DIR))
29
+
30
+ # Import path utils for project root resolution
31
+ from lib.path_utils import find_project_root # noqa: E402
32
+
33
+ # Import unified timeout manager and Git operations manager
34
+ try:
35
+ from lib.git_operations_manager import GitOperationType, get_git_manager
36
+ from lib.timeout import TimeoutError as PlatformTimeoutError
37
+ from lib.unified_timeout_manager import (
38
+ HookTimeoutConfig,
39
+ HookTimeoutError,
40
+ TimeoutPolicy,
41
+ get_timeout_manager,
42
+ hook_timeout_context,
43
+ )
44
+ except ImportError:
45
+ # Fallback implementations if new modules not available
46
+
47
+ def get_timeout_manager():
48
+ return None
49
+
50
+ def hook_timeout_context(hook_name, config=None):
51
+ import contextlib
52
+
53
+ @contextlib.contextmanager
54
+ def dummy_context():
55
+ yield
56
+
57
+ return dummy_context()
58
+
59
+ class HookTimeoutConfig: # type: ignore[no-redef]
60
+ def __init__(self, **kwargs):
61
+ pass
62
+
63
+ class TimeoutPolicy: # type: ignore[no-redef]
64
+ FAST = "fast"
65
+ NORMAL = "normal"
66
+ SLOW = "slow"
67
+
68
+ class HookTimeoutError(Exception): # type: ignore[no-redef]
69
+ pass
70
+
71
+ def get_git_manager():
72
+ return None
73
+
74
+ class GitOperationType: # type: ignore[no-redef]
75
+ BRANCH = "branch"
76
+ LOG = "log"
77
+ STATUS = "status"
78
+
79
+ class PlatformTimeoutError(Exception): # type: ignore[no-redef]
80
+ pass
81
+
82
+
83
+ # Import config cache
84
+ try:
85
+ from core.config_cache import get_cached_config, get_cached_spec_progress
86
+ except ImportError:
87
+ # Fallback to direct functions if cache not available
88
+ # Try PyYAML first, then use simple parser
89
+ try:
90
+ import yaml as yaml_fallback
91
+
92
+ HAS_YAML_FALLBACK = True
93
+ except ImportError:
94
+ HAS_YAML_FALLBACK = False
95
+
96
+ def _simple_yaml_parse(content: str) -> dict:
97
+ """Simple YAML parser for basic key-value configs without PyYAML dependency.
98
+
99
+ Handles:
100
+ - Top-level keys with nested values
101
+ - String values (quoted or unquoted)
102
+ - Boolean values (true/false)
103
+ - Numeric values
104
+ - Comments (lines starting with #)
105
+
106
+ Does NOT handle:
107
+ - Lists
108
+ - Complex nested structures beyond 2 levels
109
+ - Multi-line strings
110
+ """
111
+ result = {}
112
+ current_section = None
113
+ lines = content.split("\n")
114
+
115
+ for line in lines:
116
+ # Skip empty lines and comments
117
+ stripped = line.strip()
118
+ if not stripped or stripped.startswith("#"):
119
+ continue
120
+
121
+ # Count leading spaces for indentation
122
+ indent = len(line) - len(line.lstrip())
123
+
124
+ # Check if this is a key-value pair
125
+ if ":" in stripped:
126
+ key_part, _, value_part = stripped.partition(":")
127
+ key = key_part.strip()
128
+ value = value_part.strip()
129
+
130
+ # Handle quoted strings first - extract value within quotes
131
+ if value.startswith('"'):
132
+ # Find the closing quote
133
+ close_quote = value.find('"', 1)
134
+ if close_quote > 0:
135
+ value = value[1:close_quote]
136
+ elif value.startswith("'"):
137
+ # Find the closing quote
138
+ close_quote = value.find("'", 1)
139
+ if close_quote > 0:
140
+ value = value[1:close_quote]
141
+ else:
142
+ # Remove inline comments for unquoted values
143
+ if "#" in value:
144
+ value = value.split("#")[0].strip()
145
+
146
+ # Top-level key (no indentation or minimal indentation)
147
+ if indent == 0:
148
+ if value:
149
+ # Simple key: value
150
+ result[key] = _parse_simple_value(value)
151
+ else:
152
+ # Section header (e.g., "user:", "language:")
153
+ current_section = key
154
+ result[current_section] = {}
155
+ elif current_section and indent > 0:
156
+ # Nested key under current section
157
+ if value:
158
+ result[current_section][key] = _parse_simple_value(value)
159
+ else:
160
+ # Nested section (2-level nesting)
161
+ result[current_section][key] = {}
162
+
163
+ return result
164
+
165
+ def _parse_simple_value(value: str):
166
+ """Parse a simple value string into appropriate Python type."""
167
+ if not value:
168
+ return ""
169
+
170
+ # Boolean
171
+ if value.lower() == "true":
172
+ return True
173
+ if value.lower() == "false":
174
+ return False
175
+
176
+ # Numeric
177
+ try:
178
+ if "." in value:
179
+ return float(value)
180
+ return int(value)
181
+ except ValueError:
182
+ pass
183
+
184
+ return value
185
+
186
+ def _merge_configs(base: dict, override: dict) -> dict:
187
+ """Recursively merge two configuration dictionaries."""
188
+ result = base.copy()
189
+ for key, value in override.items():
190
+ if key in result and isinstance(result[key], dict) and isinstance(value, dict):
191
+ result[key] = _merge_configs(result[key], value)
192
+ else:
193
+ result[key] = value
194
+ return result
195
+
196
+ def _load_yaml_file(file_path: Path) -> dict:
197
+ """Load a YAML file using PyYAML or simple parser."""
198
+ if not file_path.exists():
199
+ return {}
200
+ try:
201
+ content = file_path.read_text(encoding="utf-8")
202
+ if HAS_YAML_FALLBACK:
203
+ return yaml_fallback.safe_load(content) or {}
204
+ else:
205
+ return _simple_yaml_parse(content)
206
+ except Exception:
207
+ return {}
208
+
209
+ def get_cached_config():
210
+ """Load config with section file merging for complete configuration.
211
+
212
+ FIX #245/#243: Properly loads both config.yaml AND section files,
213
+ merging them to provide complete configuration data.
214
+
215
+ Priority (highest to lowest):
216
+ 1. Section files (.moai/config/sections/*.yaml)
217
+ 2. Main config file (.moai/config/config.yaml)
218
+ """
219
+ project_root = find_project_root()
220
+ config_dir = project_root / ".moai" / "config"
221
+
222
+ # Start with main config file
223
+ main_config_path = config_dir / "config.yaml"
224
+ config = _load_yaml_file(main_config_path)
225
+
226
+ # If main config failed, try JSON fallback
227
+ if not config:
228
+ json_config_path = config_dir / "config.json"
229
+ if json_config_path.exists():
230
+ try:
231
+ config = json.loads(json_config_path.read_text(encoding="utf-8"))
232
+ except (json.JSONDecodeError, OSError):
233
+ config = {}
234
+
235
+ # Merge section files (they take priority for their specific keys)
236
+ sections_dir = config_dir / "sections"
237
+ if sections_dir.exists():
238
+ section_files = [
239
+ ("user.yaml", "user"),
240
+ ("language.yaml", "language"),
241
+ ("git-strategy.yaml", "git_strategy"),
242
+ ("project.yaml", "project"),
243
+ ("quality.yaml", "quality"),
244
+ ("system.yaml", "system"),
245
+ ]
246
+
247
+ for filename, key in section_files:
248
+ section_path = sections_dir / filename
249
+ section_data = _load_yaml_file(section_path)
250
+ if section_data:
251
+ # Merge section data into config
252
+ config = _merge_configs(config, section_data)
253
+
254
+ return config if config else None
255
+
256
+ def get_cached_spec_progress():
257
+ """Get SPEC progress information - FIXED to use YAML frontmatter parsing"""
258
+ # FIX #3: Use absolute path from find_project_root() to ensure current project only
259
+ project_root = find_project_root()
260
+ specs_dir = project_root / ".moai" / "specs"
261
+
262
+ if not specs_dir.exists():
263
+ return {"completed": 0, "total": 0, "percentage": 0}
264
+ try:
265
+ # Only scan SPEC folders in THIS project's .moai/specs/ directory
266
+ spec_folders = [d for d in specs_dir.iterdir() if d.is_dir() and d.name.startswith("SPEC-")]
267
+ total = len(spec_folders)
268
+
269
+ # FIX: Parse YAML frontmatter to check for status: completed
270
+ completed = 0
271
+ for folder in spec_folders:
272
+ spec_file = folder / "spec.md"
273
+ if not spec_file.exists():
274
+ continue
275
+
276
+ try:
277
+ # Read spec.md content
278
+ content = spec_file.read_text(encoding="utf-8")
279
+
280
+ # Parse YAML frontmatter (between --- delimiters)
281
+ if content.startswith("---"):
282
+ yaml_end = content.find("---", 3)
283
+ if yaml_end > 0:
284
+ yaml_content = content[3:yaml_end]
285
+ # Check for status: completed (with or without quotes)
286
+ if "status: completed" in yaml_content or 'status: "completed"' in yaml_content:
287
+ completed += 1
288
+ except (OSError, UnicodeDecodeError):
289
+ # File read failure or encoding error - considered incomplete
290
+ pass
291
+
292
+ percentage = (completed / total * 100) if total > 0 else 0
293
+ return {
294
+ "completed": completed,
295
+ "total": total,
296
+ "percentage": round(percentage, 0),
297
+ }
298
+ except (OSError, PermissionError):
299
+ # Directory access or permission errors
300
+ return {"completed": 0, "total": 0, "percentage": 0}
301
+
302
+
303
+ def should_show_setup_messages() -> bool:
304
+ """Determine whether to show setup completion messages (cached version).
305
+
306
+ Logic:
307
+ 1. Read .moai/config/config.yaml (using cache)
308
+ 2. Check session.suppress_setup_messages flag
309
+ 3. If suppress_setup_messages is False, always show messages
310
+ 4. If suppress_setup_messages is True:
311
+ - Check if more than 7 days have passed since suppression
312
+ - Show messages if time threshold exceeded
313
+
314
+ Uses ConfigCache to avoid repeated config file reads.
315
+
316
+ Returns:
317
+ bool: True if messages should be shown, False otherwise
318
+ """
319
+ config = get_cached_config()
320
+
321
+ # If config doesn't exist, show messages
322
+ if not config:
323
+ return True
324
+
325
+ # Check project initialization status
326
+ if not config.get("project", {}).get("initialized", False):
327
+ return True
328
+
329
+ # Check suppress_setup_messages flag
330
+ session_config = config.get("session", {})
331
+ suppress = session_config.get("suppress_setup_messages", False)
332
+
333
+ if not suppress:
334
+ # Flag is False, show messages
335
+ return True
336
+
337
+ # Flag is True, check time threshold (7 days)
338
+ suppressed_at_str = session_config.get("setup_messages_suppressed_at")
339
+ if not suppressed_at_str:
340
+ # No timestamp recorded, show messages
341
+ return True
342
+
343
+ try:
344
+ suppressed_at = datetime.fromisoformat(suppressed_at_str)
345
+ now = datetime.now(suppressed_at.tzinfo) if suppressed_at.tzinfo else datetime.now()
346
+ days_passed = (now - suppressed_at).days
347
+
348
+ # Show messages if more than 7 days have passed
349
+ return days_passed >= 7
350
+ except (ValueError, TypeError):
351
+ # If timestamp is invalid, show messages
352
+ return True
353
+
354
+
355
+ def check_git_initialized() -> bool:
356
+ """Check if git repository is initialized
357
+
358
+ Returns:
359
+ bool: True if .git directory exists, False otherwise
360
+ """
361
+ try:
362
+ project_root = find_project_root()
363
+ git_dir = project_root / ".git"
364
+ return git_dir.exists() and git_dir.is_dir()
365
+ except Exception:
366
+ return False
367
+
368
+
369
+ def get_git_info() -> Dict[str, Any]:
370
+ """Get comprehensive git information using optimized Git operations manager
371
+
372
+ FIXED: Handles git not initialized state properly
373
+ - Branch: Shows helpful message if git not initialized
374
+ - Last Commit: Shows helpful message if git not initialized or no commits
375
+
376
+ Uses connection pooling, caching, and parallel execution for optimal performance.
377
+ Falls back to basic implementation if Git manager unavailable.
378
+ """
379
+ # FIX #1 and #4: Check if git is initialized first
380
+ if not check_git_initialized():
381
+ return {
382
+ "branch": "Git not initialized → Run 'moai-adk init' to set up Git repository",
383
+ "last_commit": "Git not initialized → Run 'moai-adk init' to set up Git repository",
384
+ "commit_time": "",
385
+ "changes": 0,
386
+ "git_initialized": False,
387
+ }
388
+
389
+ git_manager = get_git_manager()
390
+ if git_manager:
391
+ try:
392
+ # Use optimized Git manager
393
+ project_info = git_manager.get_project_info(use_cache=True)
394
+ branch = project_info.get("branch", "unknown")
395
+ last_commit = project_info.get("last_commit", "unknown")
396
+
397
+ # FIX #1: Handle empty branch (no commits yet)
398
+ if not branch or branch == "unknown":
399
+ branch = "No commits yet → Make your first commit"
400
+
401
+ # FIX #4: Handle no commits case
402
+ if not last_commit or last_commit == "unknown":
403
+ last_commit = "No commits yet"
404
+
405
+ return {
406
+ "branch": branch,
407
+ "last_commit": last_commit,
408
+ "commit_time": project_info.get("commit_time", "unknown"),
409
+ "changes": project_info.get("changes", 0),
410
+ "fetch_time": project_info.get("fetch_time", ""),
411
+ "git_initialized": True,
412
+ }
413
+ except Exception as e:
414
+ logging.warning(f"Git manager failed, falling back: {e}")
415
+
416
+ # Fallback to basic Git operations
417
+ try:
418
+ from concurrent.futures import ThreadPoolExecutor, as_completed
419
+
420
+ # Define git commands to run in parallel
421
+ git_commands = [
422
+ (["git", "branch", "--show-current"], "branch"),
423
+ (["git", "rev-parse", "--abbrev-ref", "HEAD"], "head_ref"),
424
+ (["git", "rev-parse", "--short", "HEAD"], "head_commit"),
425
+ (["git", "log", "--pretty=format:%h %s", "-1"], "last_commit"),
426
+ (["git", "log", "--pretty=format:%ar", "-1"], "commit_time"),
427
+ (["git", "status", "--porcelain"], "changes_raw"),
428
+ ]
429
+
430
+ # Execute git commands in parallel
431
+ results = {}
432
+ with ThreadPoolExecutor(max_workers=4) as executor:
433
+ # Submit all tasks
434
+ futures = {executor.submit(_run_git_command_fallback, cmd): key for cmd, key in git_commands}
435
+
436
+ # Collect results as they complete
437
+ for future in as_completed(futures):
438
+ key = futures[future]
439
+ try:
440
+ results[key] = future.result()
441
+ except (TimeoutError, RuntimeError):
442
+ # Future execution timeout or runtime errors
443
+ results[key] = ""
444
+
445
+ # Process results with proper handling for empty values
446
+ branch = results.get("branch", "")
447
+ head_ref = results.get("head_ref", "")
448
+ head_commit = results.get("head_commit", "")
449
+ last_commit = results.get("last_commit", "")
450
+
451
+ # FIX: Detect detached HEAD state
452
+ if not branch and head_ref == "HEAD":
453
+ # Detached HEAD state - show commit hash
454
+ branch = f"HEAD detached at {head_commit}"
455
+ elif not branch:
456
+ # No commits yet
457
+ branch = "No commits yet → Make your first commit"
458
+
459
+ # FIX #4: Handle no commits case
460
+ if not last_commit:
461
+ last_commit = "No commits yet"
462
+
463
+ return {
464
+ "branch": branch,
465
+ "last_commit": last_commit,
466
+ "commit_time": results.get("commit_time", ""),
467
+ "changes": (len(results.get("changes_raw", "").splitlines()) if results.get("changes_raw") else 0),
468
+ "git_initialized": True,
469
+ }
470
+
471
+ except (RuntimeError, OSError, TimeoutError):
472
+ # ThreadPoolExecutor, git command, or timeout errors
473
+ return {
474
+ "branch": "Error reading git info",
475
+ "last_commit": "Error reading git info",
476
+ "commit_time": "",
477
+ "changes": 0,
478
+ "git_initialized": True,
479
+ }
480
+
481
+
482
+ def _run_git_command_fallback(cmd: list[str]) -> str:
483
+ """Fallback git command execution"""
484
+ try:
485
+ import subprocess
486
+
487
+ result = subprocess.run(cmd, capture_output=True, text=True, timeout=3)
488
+ return result.stdout.strip() if result.returncode == 0 else ""
489
+ except (
490
+ subprocess.TimeoutExpired,
491
+ subprocess.SubprocessError,
492
+ FileNotFoundError,
493
+ OSError,
494
+ ):
495
+ # Git command timeout, subprocess error, or git not found
496
+ return ""
497
+
498
+
499
+ def get_git_strategy_info(config: dict) -> dict:
500
+ """Get git strategy information from config
501
+
502
+ FIX #2: NEW FEATURE - Display git strategy information
503
+
504
+ Args:
505
+ config: Configuration dictionary
506
+
507
+ Returns:
508
+ Dictionary with git_flow and auto_branch information
509
+ """
510
+ if not config:
511
+ return {"git_flow": "unknown", "auto_branch": "unknown"}
512
+
513
+ git_strategy = config.get("git_strategy", {})
514
+ mode = git_strategy.get("mode", "manual")
515
+
516
+ # Get auto_branch setting from branch_creation config
517
+ branch_creation = git_strategy.get("branch_creation", {})
518
+ auto_enabled = branch_creation.get("auto_enabled", False)
519
+
520
+ # Determine auto_branch display
521
+ auto_branch_display = "Yes" if auto_enabled else "No"
522
+
523
+ return {"git_flow": mode, "auto_branch": auto_branch_display}
524
+
525
+
526
+ def _parse_version(version_str: str) -> tuple[int, ...]:
527
+ """Parse version string to comparable tuple
528
+
529
+ Args:
530
+ version_str: Version string (e.g., "0.25.4")
531
+
532
+ Returns:
533
+ Tuple of integers for comparison (e.g., (0, 25, 4))
534
+ """
535
+ try:
536
+ import re
537
+
538
+ clean = version_str.lstrip("v")
539
+ parts = [int(x) for x in re.split(r"[^\d]+", clean) if x.isdigit()]
540
+ return tuple(parts) if parts else (0,)
541
+ except (ValueError, AttributeError, TypeError):
542
+ # Version parsing errors (invalid format, None input, type mismatch)
543
+ return (0,)
544
+
545
+
546
+ def _is_newer_version(newer: str, older: str) -> bool:
547
+ """Compare two versions (semantic versioning)
548
+
549
+ Args:
550
+ newer: Version that might be newer
551
+ older: Version that might be older
552
+
553
+ Returns:
554
+ True if newer > older
555
+ """
556
+ newer_parts = _parse_version(newer)
557
+ older_parts = _parse_version(older)
558
+ return newer_parts > older_parts
559
+
560
+
561
+ def check_version_update() -> tuple[str, bool]:
562
+ """Check if version update is available (fast version using cached data)
563
+
564
+ Reuses PyPI cache from Phase 1 (config_health_check.py).
565
+ Falls back to importlib.metadata for installed version.
566
+
567
+ Returns:
568
+ (status_indicator, has_update)
569
+ - status_indicator: "(latest)", "(dev)" or "⬆️ X.X.X available"
570
+ - has_update: True if update available
571
+ """
572
+ try:
573
+ import importlib.metadata
574
+
575
+ # Get installed version (fast, ~6ms)
576
+ try:
577
+ installed_version = importlib.metadata.version("moai-adk")
578
+ except importlib.metadata.PackageNotFoundError:
579
+ return "(latest)", False
580
+
581
+ # Try to load cached PyPI version from Phase 1
582
+ version_cache_file = find_project_root() / ".moai" / "cache" / "version-check.json"
583
+ latest_version = None
584
+
585
+ if version_cache_file.exists():
586
+ try:
587
+ cache_data = json.loads(version_cache_file.read_text())
588
+ latest_version = cache_data.get("latest")
589
+ except (json.JSONDecodeError, OSError, UnicodeDecodeError):
590
+ # Cache file read or JSON parsing errors
591
+ pass
592
+
593
+ # If no cache or cache is stale, skip check (avoid slow subprocess)
594
+ if not latest_version:
595
+ return "(latest)", False
596
+
597
+ # Compare versions with semantic versioning
598
+ if _is_newer_version(latest_version, installed_version):
599
+ # PyPI has newer version (use update icon instead of warning)
600
+ return f"⬆️ {latest_version} available", True
601
+ elif _is_newer_version(installed_version, latest_version):
602
+ # Local version is newer (development version)
603
+ return "(dev)", False
604
+ else:
605
+ # Same version
606
+ return "(latest)", False
607
+
608
+ except (ImportError, AttributeError, TypeError):
609
+ # Import errors or unexpected type/attribute errors
610
+ return "(latest)", False
611
+
612
+
613
+ def get_test_info() -> dict[str, Any]:
614
+ """Get test coverage and status information
615
+
616
+ NOTE: SessionStart hook must complete quickly (<0.5s).
617
+ Running pytest is too slow (5+ seconds), so we skip it and return unknown status.
618
+ Users can run tests manually with: pytest --cov
619
+
620
+ To check test status, use: /moai:test-status (future feature)
621
+ """
622
+ # Skip pytest execution - it's too slow for SessionStart
623
+ return {"coverage": "unknown", "status": "❓"}
624
+
625
+
626
+ def get_spec_progress() -> dict[str, Any]:
627
+ """Get SPEC progress information (cached version)
628
+
629
+ Uses ConfigCache to avoid repeated filesystem scans.
630
+ Cache is valid for 5 minutes or until .moai/specs/ is modified.
631
+
632
+ Returns:
633
+ Dict with keys: completed, total, percentage
634
+ """
635
+ return get_cached_spec_progress()
636
+
637
+
638
+ def calculate_risk(git_info: dict, spec_progress: dict, test_info: dict) -> str:
639
+ """Calculate overall project risk level"""
640
+ risk_score = 0
641
+
642
+ # Git changes contribute to risk
643
+ if git_info["changes"] > 20:
644
+ risk_score += 10
645
+ elif git_info["changes"] > 10:
646
+ risk_score += 5
647
+
648
+ # SPEC progress contributes to risk
649
+ if spec_progress["percentage"] < 50:
650
+ risk_score += 15
651
+ elif spec_progress["percentage"] < 80:
652
+ risk_score += 8
653
+
654
+ # Test status contributes to risk
655
+ if test_info["status"] != "✅":
656
+ risk_score += 12
657
+ elif test_info["coverage"] == "unknown":
658
+ risk_score += 5
659
+
660
+ # Determine risk level
661
+ if risk_score >= 20:
662
+ return "HIGH"
663
+ elif risk_score >= 10:
664
+ return "MEDIUM"
665
+ else:
666
+ return "LOW"
667
+
668
+
669
+ def format_project_metadata() -> str:
670
+ """Format project metadata information as a string.
671
+
672
+ Returns:
673
+ Formatted project metadata string with version and Git info
674
+ """
675
+ moai_version = "unknown"
676
+ config = get_cached_config()
677
+ if config:
678
+ moai_version = config.get("moai", {}).get("version", "unknown")
679
+
680
+ version_status, _has_update = check_version_update()
681
+ return f"📦 Version: {moai_version} {version_status}"
682
+
683
+
684
+ def get_language_info(config: dict) -> dict:
685
+ """Get language configuration information
686
+
687
+ Args:
688
+ config: Configuration dictionary
689
+
690
+ Returns:
691
+ Dictionary with language info including display name and status
692
+ """
693
+ if not config:
694
+ return {
695
+ "conversation_language": "en",
696
+ "language_name": "English",
697
+ "status": "⚠️ No config",
698
+ }
699
+
700
+ lang_config = config.get("language", {})
701
+ conversation_lang = lang_config.get("conversation_language", "en")
702
+ lang_name = lang_config.get("conversation_language_name", "Unknown")
703
+
704
+ # Language status indicator (removed Active indicator for cleaner output)
705
+ return {"conversation_language": conversation_lang, "language_name": lang_name}
706
+
707
+
708
+ def load_user_personalization() -> dict:
709
+ """Load user personalization settings using centralized language configuration resolver
710
+
711
+ FIX #5: Check for template variables and provide setup guidance
712
+
713
+ Uses the new LanguageConfigResolver which provides:
714
+ - Environment variable priority handling
715
+ - Configuration file integration
716
+ - Consistency validation and auto-correction
717
+ - Template variable export capabilities
718
+
719
+ Returns:
720
+ Dictionary with user personalization information
721
+ """
722
+ try:
723
+ # Import the centralized language configuration resolver
724
+ from src.moai_adk.core.language_config_resolver import get_resolver
725
+
726
+ # Get resolver instance and resolve configuration
727
+ resolver = get_resolver(str(find_project_root()))
728
+ config = resolver.resolve_config()
729
+
730
+ # FIX #5: Check if USER_NAME is a template variable or empty
731
+ user_name = config.get("user_name", "")
732
+ has_valid_name = user_name and not user_name.startswith("{{") and not user_name.endswith("}}")
733
+
734
+ # Build personalization info using resolved configuration
735
+ personalization = {
736
+ "user_name": user_name if has_valid_name else "",
737
+ "conversation_language": config.get("conversation_language", "en"),
738
+ "conversation_language_name": config.get("conversation_language_name", "English"),
739
+ "agent_prompt_language": config.get("agent_prompt_language", "en"),
740
+ "is_korean": config.get("conversation_language") == "ko",
741
+ "has_personalization": has_valid_name,
742
+ "config_source": config.get("config_source", "default"),
743
+ "personalized_greeting": (resolver.get_personalized_greeting(config) if has_valid_name else ""),
744
+ "needs_setup": not has_valid_name, # FIX #5: Flag for setup guidance
745
+ }
746
+
747
+ # Export template variables for other system components
748
+ template_vars = resolver.export_template_variables(config)
749
+
750
+ # Store resolved configuration for session-wide access
751
+ personalization_cache_file = find_project_root() / ".moai" / "cache" / "personalization.json"
752
+ try:
753
+ personalization_cache_file.parent.mkdir(parents=True, exist_ok=True)
754
+
755
+ # Store both personalization info and template variables
756
+ cache_data = {
757
+ "personalization": personalization,
758
+ "template_variables": template_vars,
759
+ "resolved_at": datetime.now().isoformat(),
760
+ "config_source": config.get("config_source", "default"),
761
+ }
762
+ personalization_cache_file.write_text(json.dumps(cache_data, ensure_ascii=False, indent=2))
763
+
764
+ except (OSError, PermissionError):
765
+ # Cache write errors are non-critical
766
+ pass
767
+
768
+ return personalization
769
+
770
+ except ImportError:
771
+ # Fallback to basic implementation if resolver not available
772
+ import os
773
+
774
+ # Load config from cache or direct file
775
+ config = get_cached_config()
776
+
777
+ # Environment variables take priority
778
+ user_name = os.getenv("MOAI_USER_NAME")
779
+ conversation_lang = os.getenv("MOAI_CONVERSATION_LANG")
780
+
781
+ # Fallback to config file if environment variables not set
782
+ if user_name is None and config:
783
+ user_name = config.get("user", {}).get("name", "")
784
+
785
+ if conversation_lang is None and config:
786
+ conversation_lang = config.get("language", {}).get("conversation_language", "en")
787
+
788
+ # FIX #5: Check if USER_NAME is a template variable or empty
789
+ has_valid_name = user_name and not user_name.startswith("{{") and not user_name.endswith("}}")
790
+
791
+ # Get language name
792
+ lang_name_map = {
793
+ "ko": "Korean",
794
+ "en": "English",
795
+ "ja": "Japanese",
796
+ "zh": "Chinese",
797
+ "es": "Spanish",
798
+ "fr": "French",
799
+ "de": "German",
800
+ "ru": "Russian",
801
+ }
802
+ lang_name = lang_name_map.get(conversation_lang, "Unknown")
803
+
804
+ # Build personalization info
805
+ personalization = {
806
+ "user_name": user_name if has_valid_name else "",
807
+ "conversation_language": conversation_lang or "en",
808
+ "conversation_language_name": lang_name,
809
+ "is_korean": conversation_lang == "ko",
810
+ "has_personalization": has_valid_name,
811
+ "config_source": "fallback",
812
+ "personalized_greeting": (
813
+ f"{user_name}님"
814
+ if has_valid_name and conversation_lang == "ko"
815
+ else user_name
816
+ if has_valid_name
817
+ else ""
818
+ ),
819
+ "needs_setup": not has_valid_name, # FIX #5: Flag for setup guidance
820
+ }
821
+
822
+ # Store for session-wide access
823
+ personalization_cache_file = find_project_root() / ".moai" / "cache" / "personalization.json"
824
+ try:
825
+ personalization_cache_file.parent.mkdir(parents=True, exist_ok=True)
826
+ personalization_cache_file.write_text(json.dumps(personalization, ensure_ascii=False, indent=2))
827
+ except (OSError, PermissionError):
828
+ # Cache write errors are non-critical
829
+ pass
830
+
831
+ return personalization
832
+
833
+
834
+ def format_session_output() -> str:
835
+ """Format the complete session start output with proper line alignment (optimized).
836
+
837
+ Uses caches for config and SPEC progress to minimize file I/O.
838
+ Parallel git command execution for fast data gathering.
839
+ """
840
+ # Gather information (in parallel for git, cached for config/SPEC)
841
+ git_info = get_git_info()
842
+
843
+ # Get config for language and version info
844
+ config = get_cached_config()
845
+
846
+ # Load user personalization settings
847
+ personalization = load_user_personalization()
848
+
849
+ # Get MoAI version from installed package (not config.json)
850
+ try:
851
+ from moai_adk import __version__ as installed_version
852
+
853
+ moai_version = installed_version
854
+ except ImportError:
855
+ # Fallback to config version if package import fails
856
+ moai_version = "unknown"
857
+ if config:
858
+ moai_version = config.get("moai", {}).get("version", "unknown")
859
+
860
+ # Get language info
861
+ lang_info = get_language_info(config)
862
+
863
+ # FIX #2: Get git strategy info
864
+ git_strategy = get_git_strategy_info(config)
865
+
866
+ # Check for version updates (uses Phase 1 cache)
867
+ version_status, _has_update = check_version_update()
868
+
869
+ # Format output with each item on separate line (reordered per user request)
870
+ output = [
871
+ "🚀 MoAI-ADK Session Started",
872
+ f" 📦 Version: {moai_version} {version_status}",
873
+ f" 🔄 Changes: {git_info['changes']}",
874
+ f" 🌿 Branch: {git_info['branch']}",
875
+ # FIX #2: Add Git Strategy information
876
+ f" 🔧 Github-Flow: {git_strategy['git_flow']} | Auto Branch: {git_strategy['auto_branch']}",
877
+ f" 🔨 Last Commit: {git_info['last_commit']}",
878
+ f" 🌐 Language: {lang_info['language_name']} ({lang_info['conversation_language']})",
879
+ ]
880
+
881
+ # FIX #5: Add personalization or setup guidance (never show template variables)
882
+ if personalization.get("needs_setup", False):
883
+ # Show setup guidance (based on conversation_language)
884
+ if personalization["is_korean"]:
885
+ output.append(
886
+ " 👋 환영합니다! 프로젝트를 시작하기 전에 "
887
+ "'/moai:0-project setting' 명령어로 사용자 이름과 설정을 구성해주세요"
888
+ )
889
+ else:
890
+ output.append(
891
+ " 👋 Welcome! Before starting, please run '/moai:0-project setting' "
892
+ "to configure your name and project settings"
893
+ )
894
+ elif personalization["has_personalization"]:
895
+ user_greeting = personalization.get("personalized_greeting", "")
896
+ if user_greeting:
897
+ if personalization["is_korean"]:
898
+ greeting = f" 👋 다시 오신 것을 환영합니다, {user_greeting}!"
899
+ else:
900
+ greeting = f" 👋 Welcome back, {user_greeting}!"
901
+ else:
902
+ if personalization["is_korean"]:
903
+ greeting = f" 👋 다시 오신 것을 환영합니다, {personalization['user_name']}님!"
904
+ else:
905
+ greeting = f" 👋 Welcome back, {personalization['user_name']}!"
906
+ output.append(greeting)
907
+
908
+ # Configuration source is now handled silently for cleaner output
909
+ # Users can check configuration using dedicated tools if needed
910
+
911
+ return "\n".join(output)
912
+
913
+
914
+ def main() -> None:
915
+ """Main entry point for enhanced SessionStart hook
916
+
917
+ Displays enhanced project information including:
918
+ - Programming language and version
919
+ - Git branch, changes, and last commit with time
920
+ - Git strategy (mode and auto_branch setting)
921
+ - SPEC progress (completed/total)
922
+ - Test coverage and status
923
+ - Risk assessment
924
+
925
+ Features:
926
+ - Optimized timeout handling with unified manager
927
+ - Enhanced error handling with graceful degradation
928
+ - Resource monitoring and cleanup
929
+ - Retry mechanisms for transient failures
930
+
931
+ Exit Codes:
932
+ 0: Success
933
+ 1: Error (timeout, JSON parse failure, handler exception)
934
+ """
935
+ # Configure timeout for session start hook
936
+ timeout_config = HookTimeoutConfig(
937
+ policy=TimeoutPolicy.NORMAL,
938
+ custom_timeout_ms=5000, # 5 seconds
939
+ retry_count=1,
940
+ retry_delay_ms=200,
941
+ graceful_degradation=True,
942
+ memory_limit_mb=100, # Optional memory limit
943
+ )
944
+
945
+ def execute_session_start():
946
+ """Execute session start logic with proper error handling"""
947
+ # Read JSON payload from stdin (for compatibility)
948
+ # Handle Docker/non-interactive environments by checking TTY
949
+ input_data = sys.stdin.read() if not sys.stdin.isatty() else "{}"
950
+ json.loads(input_data) if input_data.strip() else {}
951
+
952
+ # Check if setup messages should be shown
953
+ show_messages = should_show_setup_messages()
954
+
955
+ # Generate enhanced session output (conditionally)
956
+ session_output = format_session_output() if show_messages else ""
957
+
958
+ # Return as system message
959
+ result: Dict[str, Any] = {
960
+ "continue": True,
961
+ "systemMessage": session_output,
962
+ "performance": {
963
+ "git_manager_used": get_git_manager() is not None,
964
+ "timeout_manager_used": get_timeout_manager() is not None,
965
+ },
966
+ }
967
+
968
+ return result
969
+
970
+ # Use unified timeout manager if available
971
+ timeout_manager = get_timeout_manager()
972
+ if timeout_manager:
973
+ try:
974
+ result = timeout_manager.execute_with_timeout(
975
+ "session_start__show_project_info",
976
+ execute_session_start,
977
+ config=timeout_config,
978
+ )
979
+
980
+ print(json.dumps(result, ensure_ascii=False))
981
+ sys.exit(0)
982
+
983
+ except HookTimeoutError as e:
984
+ # Enhanced timeout error handling
985
+ timeout_response: Dict[str, Any] = {
986
+ "continue": True,
987
+ "systemMessage": "⚠️ Session start timeout - continuing without project info",
988
+ "error_details": {
989
+ "hook_id": e.hook_id,
990
+ "timeout_seconds": e.timeout_seconds,
991
+ "execution_time": e.execution_time,
992
+ "will_retry": e.will_retry,
993
+ },
994
+ }
995
+ print(json.dumps(timeout_response, ensure_ascii=False))
996
+ print(f"SessionStart hook timeout: {e}", file=sys.stderr)
997
+ sys.exit(1)
998
+
999
+ except Exception as e:
1000
+ # Enhanced error handling with context
1001
+ error_response: Dict[str, Any] = {
1002
+ "continue": True,
1003
+ "systemMessage": "⚠️ Session start encountered an error - continuing",
1004
+ "error_details": {
1005
+ "error_type": type(e).__name__,
1006
+ "message": str(e),
1007
+ "graceful_degradation": True,
1008
+ },
1009
+ }
1010
+ print(json.dumps(error_response, ensure_ascii=False))
1011
+ print(f"SessionStart error: {e}", file=sys.stderr)
1012
+ sys.exit(1)
1013
+
1014
+ else:
1015
+ # Fallback to legacy timeout handling
1016
+ try:
1017
+ from lib.timeout import CrossPlatformTimeout
1018
+ from lib.timeout import TimeoutError as PlatformTimeoutError
1019
+
1020
+ # Set 5-second timeout
1021
+ timeout = CrossPlatformTimeout(5)
1022
+ timeout.start()
1023
+
1024
+ try:
1025
+ result = execute_session_start()
1026
+ print(json.dumps(result))
1027
+ sys.exit(0)
1028
+
1029
+ except PlatformTimeoutError:
1030
+ # Timeout - return minimal valid response
1031
+ timeout_response_legacy: Dict[str, Any] = {
1032
+ "continue": True,
1033
+ "systemMessage": "⚠️ Session start timeout - continuing without project info",
1034
+ }
1035
+ print(json.dumps(timeout_response_legacy))
1036
+ print("SessionStart hook timeout after 5 seconds", file=sys.stderr)
1037
+ sys.exit(1)
1038
+
1039
+ finally:
1040
+ # Always cancel timeout
1041
+ timeout.cancel()
1042
+
1043
+ except ImportError:
1044
+ # No timeout handling available
1045
+ try:
1046
+ result = execute_session_start()
1047
+ print(json.dumps(result))
1048
+ sys.exit(0)
1049
+ except Exception as e:
1050
+ print(
1051
+ json.dumps(
1052
+ {
1053
+ "continue": True,
1054
+ "systemMessage": "⚠️ Session start completed with errors",
1055
+ "error": str(e),
1056
+ }
1057
+ )
1058
+ )
1059
+ sys.exit(0)
1060
+
1061
+ except json.JSONDecodeError as e:
1062
+ # JSON parse error
1063
+ json_error_response: Dict[str, Any] = {
1064
+ "continue": True,
1065
+ "hookSpecificOutput": {"error": f"JSON parse error: {e}"},
1066
+ }
1067
+ print(json.dumps(json_error_response))
1068
+ print(f"SessionStart JSON parse error: {e}", file=sys.stderr)
1069
+ sys.exit(1)
1070
+
1071
+ except Exception as e:
1072
+ # Unexpected error
1073
+ general_error_response: Dict[str, Any] = {
1074
+ "continue": True,
1075
+ "hookSpecificOutput": {"error": f"SessionStart error: {e}"},
1076
+ }
1077
+ print(json.dumps(general_error_response))
1078
+ print(f"SessionStart unexpected error: {e}", file=sys.stderr)
1079
+ sys.exit(1)
1080
+
1081
+
1082
+ if __name__ == "__main__":
1083
+ main()