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

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

Potentially problematic release.


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

Files changed (378) hide show
  1. moai_adk/__init__.py +2 -5
  2. moai_adk/__main__.py +114 -82
  3. moai_adk/cli/__init__.py +6 -1
  4. moai_adk/cli/commands/__init__.py +1 -3
  5. moai_adk/cli/commands/analyze.py +5 -16
  6. moai_adk/cli/commands/doctor.py +6 -18
  7. moai_adk/cli/commands/init.py +56 -125
  8. moai_adk/cli/commands/language.py +14 -35
  9. moai_adk/cli/commands/status.py +9 -15
  10. moai_adk/cli/commands/update.py +1555 -190
  11. moai_adk/cli/prompts/init_prompts.py +112 -56
  12. moai_adk/cli/spec_status.py +263 -0
  13. moai_adk/cli/ui/__init__.py +44 -0
  14. moai_adk/cli/ui/progress.py +422 -0
  15. moai_adk/cli/ui/prompts.py +389 -0
  16. moai_adk/cli/ui/theme.py +129 -0
  17. moai_adk/cli/worktree/__init__.py +27 -0
  18. moai_adk/cli/worktree/__main__.py +31 -0
  19. moai_adk/cli/worktree/cli.py +672 -0
  20. moai_adk/cli/worktree/exceptions.py +89 -0
  21. moai_adk/cli/worktree/manager.py +490 -0
  22. moai_adk/cli/worktree/models.py +65 -0
  23. moai_adk/cli/worktree/registry.py +128 -0
  24. moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
  25. moai_adk/core/analysis/session_analyzer.py +17 -56
  26. moai_adk/core/claude_integration.py +26 -54
  27. moai_adk/core/command_helpers.py +10 -10
  28. moai_adk/core/comprehensive_monitoring_system.py +1183 -0
  29. moai_adk/core/config/auto_spec_config.py +5 -11
  30. moai_adk/core/config/migration.py +19 -9
  31. moai_adk/core/config/unified.py +436 -0
  32. moai_adk/core/context_manager.py +6 -12
  33. moai_adk/core/enterprise_features.py +1404 -0
  34. moai_adk/core/error_recovery_system.py +725 -112
  35. moai_adk/core/event_driven_hook_system.py +1371 -0
  36. moai_adk/core/git/__init__.py +8 -0
  37. moai_adk/core/git/branch_manager.py +3 -11
  38. moai_adk/core/git/checkpoint.py +1 -3
  39. moai_adk/core/git/conflict_detector.py +413 -0
  40. moai_adk/core/git/manager.py +91 -1
  41. moai_adk/core/hooks/post_tool_auto_spec_completion.py +56 -80
  42. moai_adk/core/input_validation_middleware.py +1006 -0
  43. moai_adk/core/integration/engine.py +6 -18
  44. moai_adk/core/integration/integration_tester.py +10 -9
  45. moai_adk/core/integration/utils.py +1 -1
  46. moai_adk/core/issue_creator.py +10 -28
  47. moai_adk/core/jit_context_loader.py +956 -0
  48. moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
  49. moai_adk/core/language_config_resolver.py +485 -0
  50. moai_adk/core/language_validator.py +28 -41
  51. moai_adk/core/mcp/setup.py +15 -12
  52. moai_adk/core/merge/__init__.py +9 -0
  53. moai_adk/core/merge/analyzer.py +481 -0
  54. moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
  55. moai_adk/core/migration/backup_manager.py +78 -9
  56. moai_adk/core/migration/custom_element_scanner.py +358 -0
  57. moai_adk/core/migration/file_migrator.py +8 -17
  58. moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
  59. moai_adk/core/migration/selective_restorer.py +470 -0
  60. moai_adk/core/migration/template_utils.py +74 -0
  61. moai_adk/core/migration/user_selection_ui.py +338 -0
  62. moai_adk/core/migration/version_detector.py +6 -10
  63. moai_adk/core/migration/version_migrator.py +3 -3
  64. moai_adk/core/performance/cache_system.py +8 -10
  65. moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
  66. moai_adk/core/project/checker.py +2 -4
  67. moai_adk/core/project/detector.py +1 -3
  68. moai_adk/core/project/initializer.py +135 -23
  69. moai_adk/core/project/phase_executor.py +54 -81
  70. moai_adk/core/project/validator.py +6 -12
  71. moai_adk/core/quality/trust_checker.py +9 -27
  72. moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
  73. moai_adk/core/robust_json_parser.py +611 -0
  74. moai_adk/core/rollback_manager.py +73 -148
  75. moai_adk/core/session_manager.py +10 -26
  76. moai_adk/core/skill_loading_system.py +579 -0
  77. moai_adk/core/spec/confidence_scoring.py +31 -100
  78. moai_adk/core/spec/ears_template_engine.py +351 -286
  79. moai_adk/core/spec/quality_validator.py +35 -69
  80. moai_adk/core/spec_status_manager.py +64 -74
  81. moai_adk/core/template/backup.py +45 -20
  82. moai_adk/core/template/config.py +112 -39
  83. moai_adk/core/template/merger.py +11 -19
  84. moai_adk/core/template/processor.py +253 -149
  85. moai_adk/core/template_engine.py +73 -40
  86. moai_adk/core/template_variable_synchronizer.py +417 -0
  87. moai_adk/core/unified_permission_manager.py +745 -0
  88. moai_adk/core/user_behavior_analytics.py +851 -0
  89. moai_adk/core/version_sync.py +429 -0
  90. moai_adk/foundation/__init__.py +56 -0
  91. moai_adk/foundation/backend.py +1027 -0
  92. moai_adk/foundation/database.py +1115 -0
  93. moai_adk/foundation/devops.py +1585 -0
  94. moai_adk/foundation/ears.py +431 -0
  95. moai_adk/foundation/frontend.py +870 -0
  96. moai_adk/foundation/git/commit_templates.py +4 -12
  97. moai_adk/foundation/git.py +376 -0
  98. moai_adk/foundation/langs.py +484 -0
  99. moai_adk/foundation/ml_ops.py +1162 -0
  100. moai_adk/foundation/testing.py +1524 -0
  101. moai_adk/foundation/trust/trust_principles.py +23 -72
  102. moai_adk/foundation/trust/validation_checklist.py +57 -162
  103. moai_adk/project/__init__.py +0 -0
  104. moai_adk/project/configuration.py +1084 -0
  105. moai_adk/project/documentation.py +566 -0
  106. moai_adk/project/schema.py +447 -0
  107. moai_adk/statusline/alfred_detector.py +1 -3
  108. moai_adk/statusline/config.py +13 -4
  109. moai_adk/statusline/enhanced_output_style_detector.py +23 -15
  110. moai_adk/statusline/main.py +51 -15
  111. moai_adk/statusline/renderer.py +104 -48
  112. moai_adk/statusline/update_checker.py +3 -9
  113. moai_adk/statusline/version_reader.py +140 -46
  114. moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
  115. moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
  116. moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
  117. moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
  118. moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
  119. moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
  120. moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
  121. moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
  122. moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
  123. moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
  124. moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
  125. moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
  126. moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
  127. moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
  128. moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
  129. moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
  130. moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
  131. moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
  132. moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
  133. moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
  134. moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
  135. moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
  136. moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
  137. moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
  138. moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
  139. moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
  140. moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
  141. moai_adk/templates/.claude/commands/moai/3-sync.md +993 -0
  142. moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
  143. moai_adk/templates/.claude/hooks/__init__.py +8 -0
  144. moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
  145. moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
  146. moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
  147. moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
  148. moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
  149. moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
  150. moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
  151. moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
  152. moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
  153. moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
  154. moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
  155. moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
  156. moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
  157. moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
  158. moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
  159. moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
  160. moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +921 -0
  161. moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
  162. moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
  163. moai_adk/templates/.claude/settings.json +172 -0
  164. moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -0
  165. moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
  166. moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
  167. moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
  168. moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
  169. moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
  170. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +319 -0
  171. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +320 -0
  172. moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
  173. moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
  174. moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
  175. moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
  176. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +496 -0
  177. moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -0
  178. moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
  179. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
  180. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
  181. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
  182. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
  183. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
  184. moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
  185. moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +491 -0
  186. moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
  187. moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
  188. moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
  189. moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
  190. moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
  191. moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
  192. moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +201 -0
  193. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
  194. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
  195. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
  196. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
  197. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
  198. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
  199. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
  200. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
  201. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
  202. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
  203. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
  204. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
  205. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
  206. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
  207. moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +438 -0
  208. moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -0
  209. moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
  210. moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +346 -0
  211. moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
  212. moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
  213. moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
  214. moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
  215. moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
  216. moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
  217. moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
  218. moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
  219. moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +362 -0
  220. moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
  221. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
  222. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
  223. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
  224. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
  225. moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
  226. moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
  227. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
  228. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
  229. moai_adk/templates/.claude/skills/moai-integration-mcp/SKILL.md +352 -0
  230. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
  231. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
  232. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
  233. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
  234. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
  235. moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
  236. moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
  237. moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
  238. moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
  239. moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -0
  240. moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
  241. moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
  242. moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
  243. moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
  244. moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +316 -0
  245. moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
  246. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
  247. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
  248. moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
  249. moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
  250. moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
  251. moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
  252. moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
  253. moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
  254. moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
  255. moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +370 -0
  256. moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
  257. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
  258. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
  259. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
  260. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
  261. moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
  262. moai_adk/templates/.claude/skills/moai-platform-baas/README.md +186 -0
  263. moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
  264. moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
  265. moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
  266. moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
  267. moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
  268. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
  269. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
  270. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
  271. moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
  272. moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -0
  273. moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
  274. moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
  275. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
  276. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
  277. moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
  278. moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +135 -0
  279. moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
  280. moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
  281. moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
  282. moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
  283. moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
  284. moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
  285. moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
  286. moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
  287. moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
  288. moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
  289. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
  290. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -0
  291. moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
  292. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
  293. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
  294. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +71 -0
  295. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
  296. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
  297. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
  298. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
  299. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
  300. moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
  301. moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +374 -0
  302. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
  303. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
  304. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
  305. moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
  306. moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -0
  307. moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
  308. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
  309. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
  310. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
  311. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
  312. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
  313. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
  314. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
  315. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
  316. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
  317. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
  318. moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
  319. moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
  320. moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
  321. moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
  322. moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
  323. moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +410 -0
  324. moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
  325. moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
  326. moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
  327. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
  328. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
  329. moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
  330. moai_adk/templates/.git-hooks/pre-commit +103 -41
  331. moai_adk/templates/.git-hooks/pre-push +116 -21
  332. moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
  333. moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
  334. moai_adk/templates/.gitignore +184 -44
  335. moai_adk/templates/.mcp.json +7 -9
  336. moai_adk/templates/.moai/cache/personalization.json +10 -0
  337. moai_adk/templates/.moai/config/config.yaml +344 -0
  338. moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
  339. moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
  340. moai_adk/templates/.moai/config/presets/team.yaml +33 -0
  341. moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
  342. moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
  343. moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
  344. moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
  345. moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
  346. moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
  347. moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -0
  348. moai_adk/templates/.moai/config/sections/language.yaml +11 -0
  349. moai_adk/templates/.moai/config/sections/project.yaml +13 -0
  350. moai_adk/templates/.moai/config/sections/quality.yaml +15 -0
  351. moai_adk/templates/.moai/config/sections/system.yaml +14 -0
  352. moai_adk/templates/.moai/config/sections/user.yaml +5 -0
  353. moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
  354. moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
  355. moai_adk/templates/CLAUDE.md +382 -501
  356. moai_adk/utils/__init__.py +24 -1
  357. moai_adk/utils/banner.py +7 -10
  358. moai_adk/utils/common.py +16 -30
  359. moai_adk/utils/link_validator.py +4 -12
  360. moai_adk/utils/safe_file_reader.py +2 -6
  361. moai_adk/utils/timeout.py +160 -0
  362. moai_adk/utils/toon_utils.py +256 -0
  363. moai_adk/version.py +22 -0
  364. moai_adk-0.32.8.dist-info/METADATA +2478 -0
  365. moai_adk-0.32.8.dist-info/RECORD +396 -0
  366. {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
  367. {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
  368. moai_adk/cli/commands/backup.py +0 -82
  369. moai_adk/cli/commands/improve_user_experience.py +0 -348
  370. moai_adk/cli/commands/migrate.py +0 -158
  371. moai_adk/cli/commands/validate_links.py +0 -118
  372. moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -413
  373. moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
  374. moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
  375. moai_adk/utils/user_experience.py +0 -531
  376. moai_adk-0.25.4.dist-info/METADATA +0 -2279
  377. moai_adk-0.25.4.dist-info/RECORD +0 -112
  378. {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,317 @@
1
+ #!/usr/bin/env python3
2
+ """Language Configuration Validator for MoAI-ADK
3
+
4
+ Validates language configuration settings and ensures proper functionality.
5
+ Provides detailed diagnostics for language-related issues.
6
+ """
7
+
8
+ import json
9
+ import sys
10
+ from pathlib import Path
11
+ from typing import Any, Dict, List
12
+
13
+
14
+ def load_config() -> Dict[str, Any]:
15
+ """Load configuration from .moai/config/config.json
16
+
17
+ Returns:
18
+ Configuration dictionary or empty dict if not found
19
+ """
20
+ config_path = Path(".moai/config/config.json")
21
+
22
+ if not config_path.exists():
23
+ return {"error": "Configuration file not found"}
24
+
25
+ try:
26
+ with open(config_path, "r", encoding="utf-8") as f:
27
+ return json.load(f)
28
+ except json.JSONDecodeError as e:
29
+ return {"error": f"JSON decode error: {e}"}
30
+ except Exception as e:
31
+ return {"error": f"File read error: {e}"}
32
+
33
+
34
+ def validate_language_config(config: Dict[str, Any]) -> Dict[str, Any]:
35
+ """Validate language configuration
36
+
37
+ Args:
38
+ config: Configuration dictionary
39
+
40
+ Returns:
41
+ Validation result with status and details
42
+ """
43
+ warnings: List[str] = []
44
+ errors: List[str] = []
45
+ result: Dict[str, Any] = {
46
+ "valid": True,
47
+ "warnings": warnings,
48
+ "errors": errors,
49
+ "language_info": {},
50
+ }
51
+
52
+ # Check if language section exists
53
+ if "language" not in config:
54
+ result["valid"] = False
55
+ errors.append("Missing 'language' configuration section")
56
+ return result
57
+
58
+ lang_config = config.get("language", {})
59
+
60
+ # Validate conversation_language
61
+ conversation_lang = lang_config.get("conversation_language", "en")
62
+ if not conversation_lang:
63
+ result["valid"] = False
64
+ errors.append("conversation_language is empty or missing")
65
+ elif conversation_lang not in ["ko", "en", "ja", "zh"]:
66
+ warnings.append(
67
+ f"conversation_language '{conversation_lang}' is not officially supported (supported: ko, en, ja, zh)"
68
+ )
69
+
70
+ # Validate conversation_language_name
71
+ lang_name = lang_config.get("conversation_language_name", "")
72
+ if not lang_name:
73
+ result["valid"] = False
74
+ errors.append("conversation_language_name is empty or missing")
75
+ elif conversation_lang == "ko" and lang_name != "Korean":
76
+ warnings.append(f"conversation_language_name '{lang_name}' doesn't match 'Korean' for Korean language")
77
+ elif conversation_lang == "en" and lang_name != "English":
78
+ warnings.append(f"conversation_language_name '{lang_name}' doesn't match 'English' for English language")
79
+ elif conversation_lang == "ja" and lang_name != "Japanese":
80
+ warnings.append(f"conversation_language_name '{lang_name}' doesn't match 'Japanese' for Japanese language")
81
+ elif conversation_lang == "zh" and lang_name != "Chinese":
82
+ warnings.append(f"conversation_language_name '{lang_name}' doesn't match 'Chinese' for Chinese language")
83
+
84
+ # Validate agent_prompt_language
85
+ agent_lang = lang_config.get("agent_prompt_language", conversation_lang)
86
+ if agent_lang != conversation_lang:
87
+ warnings.append(
88
+ f"agent_prompt_language '{agent_lang}' differs from conversation_language '{conversation_lang}'"
89
+ )
90
+
91
+ # Store language info
92
+ result["language_info"] = {
93
+ "conversation_language": conversation_lang,
94
+ "conversation_language_name": lang_name,
95
+ "agent_prompt_language": agent_lang,
96
+ "primary_language": conversation_lang,
97
+ "is_korean": conversation_lang == "ko",
98
+ "is_english": conversation_lang == "en",
99
+ "is_japanese": conversation_lang == "ja",
100
+ "is_chinese": conversation_lang == "zh",
101
+ "is_multilingual": conversation_lang in ["ko", "ja", "zh"],
102
+ }
103
+
104
+ return result
105
+
106
+
107
+ def validate_output_style_compatibility() -> Dict[str, Any]:
108
+ """Validate if output style supports language configuration
109
+
110
+ Returns:
111
+ Compatibility check results
112
+ """
113
+ recommendations: List[str] = []
114
+ result: Dict[str, Any] = {
115
+ "r2d2_exists": False,
116
+ "language_support_present": False,
117
+ "config_reading_present": False,
118
+ "recommendations": recommendations,
119
+ }
120
+
121
+ # Check if R2-D2 output style exists
122
+ r2d2_path = Path(".claude/output-styles/moai/r2d2.md")
123
+ result["r2d2_exists"] = r2d2_path.exists()
124
+
125
+ if r2d2_path.exists():
126
+ try:
127
+ with open(r2d2_path, "r", encoding="utf-8") as f:
128
+ content = f.read()
129
+
130
+ # Check for language support indicators
131
+ language_keywords = [
132
+ "conversation_language",
133
+ "language.conversation_language",
134
+ "한국어",
135
+ "Korean",
136
+ "Language Configuration",
137
+ ]
138
+
139
+ result["language_support_present"] = any(keyword in content for keyword in language_keywords)
140
+ result["config_reading_present"] = ".moai/config/config.json" in content
141
+
142
+ if not result["language_support_present"]:
143
+ recommendations.append("Add language support documentation to R2-D2 output style")
144
+
145
+ if not result["config_reading_present"]:
146
+ recommendations.append("Add config.json reading instructions to R2-D2 output style")
147
+
148
+ except Exception as e:
149
+ result["error"] = f"Error reading R2-D2 output style: {e}"
150
+ else:
151
+ recommendations.append("R2-D2 output style not found - ensure proper installation")
152
+
153
+ return result
154
+
155
+
156
+ def validate_session_start_hook() -> Dict[str, Any]:
157
+ """Validate if SessionStart hook displays language info
158
+
159
+ Returns:
160
+ Hook validation results
161
+ """
162
+ recommendations: List[str] = []
163
+ result: Dict[str, Any] = {
164
+ "hook_exists": False,
165
+ "language_display_present": False,
166
+ "recommendations": recommendations,
167
+ }
168
+
169
+ hook_path = Path(".claude/hooks/moai/session_start__show_project_info.py")
170
+ result["hook_exists"] = hook_path.exists()
171
+
172
+ if hook_path.exists():
173
+ try:
174
+ with open(hook_path, "r", encoding="utf-8") as f:
175
+ content = f.read()
176
+
177
+ # Check for language display functionality
178
+ language_indicators = [
179
+ "get_language_info",
180
+ "conversation_language",
181
+ "language_name",
182
+ "Language:",
183
+ ]
184
+
185
+ result["language_display_present"] = any(indicator in content for indicator in language_indicators)
186
+
187
+ if not result["language_display_present"]:
188
+ recommendations.append("Add language info display to SessionStart hook")
189
+
190
+ except Exception as e:
191
+ result["error"] = f"Error reading SessionStart hook: {e}"
192
+ else:
193
+ recommendations.append("SessionStart hook not found - ensure proper installation")
194
+
195
+ return result
196
+
197
+
198
+ def generate_validation_report() -> str:
199
+ """Generate comprehensive language validation report
200
+
201
+ Returns:
202
+ Formatted validation report string
203
+ """
204
+ report_lines = ["🌐 Language Configuration Validation Report", "=" * 50]
205
+
206
+ # Load and validate config
207
+ config = load_config()
208
+ if "error" in config:
209
+ report_lines.append(f"❌ Config Error: {config['error']}")
210
+ return "\n".join(report_lines)
211
+
212
+ validation = validate_language_config(config)
213
+ language_info = validation["language_info"]
214
+
215
+ # Current configuration status
216
+ report_lines.extend(
217
+ [
218
+ "",
219
+ "📋 Current Configuration:",
220
+ f" • Language: {language_info.get('conversation_language_name', 'Unknown')} "
221
+ f"({language_info.get('conversation_language', 'Unknown')})",
222
+ f" • Agent Language: {language_info.get('agent_prompt_language', 'Unknown')}",
223
+ f" • Korean Mode: {'✅ Active' if language_info.get('is_korean') else '❌ Inactive'}",
224
+ f" • Config Valid: {'✅ Valid' if validation['valid'] else '❌ Invalid'}",
225
+ ]
226
+ )
227
+
228
+ # Errors and warnings
229
+ if validation["errors"]:
230
+ report_lines.extend(["", "❌ Errors:"])
231
+ for error in validation["errors"]:
232
+ report_lines.append(f" • {error}")
233
+
234
+ if validation["warnings"]:
235
+ report_lines.extend(["", "⚠️ Warnings:"])
236
+ for warning in validation["warnings"]:
237
+ report_lines.append(f" • {warning}")
238
+
239
+ # Output style compatibility
240
+ report_lines.extend(["", "🔧 Output Style Compatibility:"])
241
+ output_check = validate_output_style_compatibility()
242
+ report_lines.extend(
243
+ [
244
+ f" • R2-D2 Output Style: {'✅ Found' if output_check['r2d2_exists'] else '❌ Missing'}",
245
+ f" • Language Support: {'✅ Present' if output_check['language_support_present'] else '❌ Missing'}",
246
+ f" • Config Reading: {'✅ Present' if output_check['config_reading_present'] else '❌ Missing'}",
247
+ ]
248
+ )
249
+
250
+ if output_check.get("recommendations"):
251
+ report_lines.extend(["", " Recommendations:"])
252
+ for rec in output_check["recommendations"]:
253
+ report_lines.append(f" • {rec}")
254
+
255
+ # SessionStart hook check
256
+ report_lines.extend(["", "🎣 SessionStart Hook:"])
257
+ hook_check = validate_session_start_hook()
258
+ report_lines.extend(
259
+ [
260
+ f" • Hook Exists: {'✅ Found' if hook_check['hook_exists'] else '❌ Missing'}",
261
+ f" • Language Display: {'✅ Present' if hook_check['language_display_present'] else '❌ Missing'}",
262
+ ]
263
+ )
264
+
265
+ if hook_check.get("recommendations"):
266
+ report_lines.extend(["", " Recommendations:"])
267
+ for rec in hook_check["recommendations"]:
268
+ report_lines.append(f" • {rec}")
269
+
270
+ # Overall status
271
+ report_lines.extend(["", "📊 Overall Status:"])
272
+ all_good = (
273
+ validation["valid"]
274
+ and not validation["errors"]
275
+ and output_check["r2d2_exists"]
276
+ and output_check["language_support_present"]
277
+ and hook_check["hook_exists"]
278
+ and hook_check["language_display_present"]
279
+ )
280
+
281
+ if all_good:
282
+ report_lines.append("✅ Language configuration is fully functional!")
283
+ if language_info.get("is_korean"):
284
+ report_lines.append("🇰🇷 Korean language responses should work correctly.")
285
+ else:
286
+ report_lines.append("🌐 English language responses configured.")
287
+ else:
288
+ report_lines.append("⚠️ Issues found that may prevent proper language functionality.")
289
+ report_lines.append(" See recommendations above for fixes.")
290
+
291
+ return "\n".join(report_lines)
292
+
293
+
294
+ def main() -> None:
295
+ """Main entry point for language configuration validator"""
296
+ try:
297
+ report = generate_validation_report()
298
+ print(report)
299
+
300
+ # Exit with appropriate code
301
+ config = load_config()
302
+ if "error" in config:
303
+ sys.exit(2) # Config error
304
+ else:
305
+ validation = validate_language_config(config)
306
+ if not validation["valid"]:
307
+ sys.exit(1) # Config invalid
308
+ else:
309
+ sys.exit(0) # Success
310
+
311
+ except Exception as e:
312
+ print(f"❌ Language validation error: {e}")
313
+ sys.exit(3)
314
+
315
+
316
+ if __name__ == "__main__":
317
+ main()
@@ -0,0 +1,102 @@
1
+ """
2
+ Hook model classes - Data structures for hook payloads and results.
3
+
4
+ Provides HookPayload and HookResult classes used by hook handlers
5
+ to process events and return execution results to Claude Code.
6
+ """
7
+
8
+ from dataclasses import asdict, dataclass
9
+ from typing import Any, Dict, List, Optional
10
+
11
+
12
+ class HookPayload(dict):
13
+ """
14
+ A dictionary subclass for hook event payloads.
15
+
16
+ Provides dict-like access to hook event data with .get() method support.
17
+ Used to pass event data from Claude Code to hook handlers.
18
+
19
+ Example:
20
+ payload = HookPayload({
21
+ "tool": "Read",
22
+ "cwd": "/path/to/project",
23
+ "userPrompt": "Read the file"
24
+ })
25
+
26
+ tool_name = payload.get("tool", "")
27
+ working_dir = payload.get("cwd", ".")
28
+ """
29
+
30
+ def __init__(self, data: Optional[Dict[str, Any]] = None):
31
+ """Initialize HookPayload with optional data dictionary."""
32
+ super().__init__(data or {})
33
+
34
+ def get(self, key: str, default: Any = None) -> Any:
35
+ """Get value from payload with optional default."""
36
+ return super().get(key, default)
37
+
38
+ def __setitem__(self, key: str, value: Any) -> None:
39
+ """Set value in payload."""
40
+ super().__setitem__(key, value)
41
+
42
+ def update(self, other: Dict[str, Any]) -> None: # type: ignore[override]
43
+ """Update payload with another dictionary."""
44
+ super().update(other)
45
+
46
+
47
+ @dataclass
48
+ class HookResult:
49
+ """
50
+ A class representing the result of a hook execution.
51
+
52
+ Used by hook handlers to return execution results, messages, and metadata
53
+ back to Claude Code. Supports JSON serialization via to_dict() method.
54
+
55
+ Attributes:
56
+ system_message (Optional[str]): Message to display to user
57
+ continue_execution (bool): Whether to continue execution (default: True)
58
+ context_files (List[str]): List of context file paths to load
59
+ hook_specific_output (Optional[Dict[str, Any]]): Hook-specific data
60
+ block_execution (bool): Whether to block execution (default: False)
61
+
62
+ Example:
63
+ # Simple result with just a message
64
+ return HookResult(system_message="Operation completed")
65
+
66
+ # Result with context files
67
+ return HookResult(
68
+ system_message="Loaded 3 context files",
69
+ context_files=["README.md", "config.json"]
70
+ )
71
+
72
+ # Result that stops execution
73
+ return HookResult(
74
+ system_message="Dangerous operation blocked",
75
+ continue_execution=False,
76
+ block_execution=True
77
+ )
78
+ """
79
+
80
+ system_message: Optional[str] = None
81
+ continue_execution: bool = True
82
+ context_files: List[str] = None
83
+ hook_specific_output: Optional[Dict[str, Any]] = None
84
+ block_execution: bool = False
85
+
86
+ def __post_init__(self):
87
+ """Post-initialization to set default values."""
88
+ if self.context_files is None:
89
+ self.context_files = []
90
+ if self.hook_specific_output is None:
91
+ self.hook_specific_output = {}
92
+
93
+ def to_dict(self) -> Dict[str, Any]:
94
+ """
95
+ Convert HookResult to a dictionary for JSON serialization.
96
+
97
+ Returns:
98
+ Dict[str, Any]: Dictionary representation of the HookResult
99
+ """
100
+ result = asdict(self)
101
+ # Remove empty/None values to keep output clean
102
+ return {k: v for k, v in result.items() if v or v is False or v == 0}
@@ -0,0 +1,28 @@
1
+ """Path utility functions for MoAI-ADK hooks"""
2
+
3
+ from pathlib import Path
4
+
5
+
6
+ def find_project_root() -> Path:
7
+ """
8
+ Find project root by locating .moai directory.
9
+
10
+ Starts from current file location and traverses upward
11
+ until .moai directory is found.
12
+
13
+ Returns:
14
+ Path: Project root directory containing .moai/
15
+
16
+ Fallback:
17
+ Returns Path.cwd() if .moai not found
18
+ """
19
+ current = Path(__file__).resolve().parent
20
+
21
+ # Traverse upward to find .moai directory
22
+ while current != current.parent:
23
+ if (current / ".moai").is_dir():
24
+ return current
25
+ current = current.parent
26
+
27
+ # Fallback to current working directory
28
+ return Path.cwd()