moai-adk 0.15.1__py3-none-any.whl → 0.25.4__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 (417) hide show
  1. moai_adk/__init__.py +1 -2
  2. moai_adk/__main__.py +85 -2
  3. moai_adk/cli/__init__.py +0 -1
  4. moai_adk/cli/commands/__init__.py +0 -1
  5. moai_adk/cli/commands/analyze.py +127 -0
  6. moai_adk/cli/commands/backup.py +5 -3
  7. moai_adk/cli/commands/doctor.py +35 -11
  8. moai_adk/cli/commands/improve_user_experience.py +348 -0
  9. moai_adk/cli/commands/init.py +150 -23
  10. moai_adk/cli/commands/language.py +269 -0
  11. moai_adk/cli/commands/migrate.py +158 -0
  12. moai_adk/cli/commands/status.py +13 -12
  13. moai_adk/cli/commands/update.py +364 -60
  14. moai_adk/cli/commands/validate_links.py +118 -0
  15. moai_adk/cli/main.py +3 -2
  16. moai_adk/cli/prompts/init_prompts.py +79 -82
  17. moai_adk/core/__init__.py +0 -1
  18. moai_adk/core/analysis/__init__.py +9 -0
  19. moai_adk/core/analysis/session_analyzer.py +439 -0
  20. moai_adk/core/claude_integration.py +421 -0
  21. moai_adk/core/command_helpers.py +270 -0
  22. moai_adk/core/config/__init__.py +6 -0
  23. moai_adk/core/config/auto_spec_config.py +346 -0
  24. moai_adk/core/config/migration.py +133 -12
  25. moai_adk/core/context_manager.py +279 -0
  26. moai_adk/core/diagnostics/slash_commands.py +0 -1
  27. moai_adk/core/error_recovery_system.py +1289 -0
  28. moai_adk/core/git/__init__.py +0 -1
  29. moai_adk/core/git/branch.py +0 -1
  30. moai_adk/core/git/branch_manager.py +4 -4
  31. moai_adk/core/git/checkpoint.py +1 -5
  32. moai_adk/core/git/commit.py +0 -1
  33. moai_adk/core/git/event_detector.py +3 -5
  34. moai_adk/core/git/manager.py +0 -1
  35. moai_adk/core/hooks/post_tool_auto_spec_completion.py +925 -0
  36. moai_adk/core/integration/__init__.py +22 -0
  37. moai_adk/core/integration/engine.py +169 -0
  38. moai_adk/core/integration/integration_tester.py +225 -0
  39. moai_adk/core/integration/models.py +88 -0
  40. moai_adk/core/integration/utils.py +211 -0
  41. moai_adk/core/issue_creator.py +28 -18
  42. moai_adk/core/language_config.py +202 -0
  43. moai_adk/core/language_validator.py +556 -0
  44. moai_adk/core/mcp/setup.py +113 -0
  45. moai_adk/core/migration/__init__.py +18 -0
  46. moai_adk/core/migration/backup_manager.py +208 -0
  47. moai_adk/core/migration/file_migrator.py +218 -0
  48. moai_adk/core/migration/version_detector.py +143 -0
  49. moai_adk/core/migration/version_migrator.py +228 -0
  50. moai_adk/core/performance/__init__.py +6 -0
  51. moai_adk/core/performance/cache_system.py +318 -0
  52. moai_adk/core/performance/parallel_processor.py +116 -0
  53. moai_adk/core/project/__init__.py +0 -1
  54. moai_adk/core/project/backup_utils.py +2 -7
  55. moai_adk/core/project/checker.py +3 -3
  56. moai_adk/core/project/detector.py +20 -40
  57. moai_adk/core/project/initializer.py +42 -17
  58. moai_adk/core/project/phase_executor.py +415 -58
  59. moai_adk/core/project/validator.py +6 -25
  60. moai_adk/core/quality/__init__.py +1 -1
  61. moai_adk/core/quality/trust_checker.py +64 -110
  62. moai_adk/core/quality/validators/__init__.py +1 -1
  63. moai_adk/core/quality/validators/base_validator.py +1 -1
  64. moai_adk/core/rollback_manager.py +993 -0
  65. moai_adk/core/session_manager.py +667 -0
  66. moai_adk/core/spec/confidence_scoring.py +749 -0
  67. moai_adk/core/spec/ears_template_engine.py +1182 -0
  68. moai_adk/core/spec/quality_validator.py +721 -0
  69. moai_adk/core/spec_status_manager.py +488 -0
  70. moai_adk/core/template/__init__.py +0 -1
  71. moai_adk/core/template/backup.py +41 -1
  72. moai_adk/core/template/config.py +11 -12
  73. moai_adk/core/template/languages.py +0 -1
  74. moai_adk/core/template/merger.py +79 -22
  75. moai_adk/core/template/processor.py +614 -40
  76. moai_adk/core/template_engine.py +36 -27
  77. moai_adk/foundation/git/commit_templates.py +565 -0
  78. moai_adk/foundation/trust/trust_principles.py +725 -0
  79. moai_adk/foundation/trust/validation_checklist.py +1678 -0
  80. moai_adk/statusline/__init__.py +38 -0
  81. moai_adk/statusline/alfred_detector.py +107 -0
  82. moai_adk/statusline/config.py +364 -0
  83. moai_adk/statusline/enhanced_output_style_detector.py +364 -0
  84. moai_adk/statusline/git_collector.py +190 -0
  85. moai_adk/statusline/main.py +228 -0
  86. moai_adk/statusline/metrics_tracker.py +78 -0
  87. moai_adk/statusline/renderer.py +327 -0
  88. moai_adk/statusline/update_checker.py +135 -0
  89. moai_adk/statusline/version_reader.py +647 -0
  90. moai_adk/templates/.git-hooks/pre-commit +66 -0
  91. moai_adk/templates/.git-hooks/pre-push +116 -4
  92. moai_adk/templates/.github/workflows/moai-gitflow.yml +1 -7
  93. moai_adk/templates/.github/workflows/spec-issue-sync.yml +0 -1
  94. moai_adk/templates/.gitignore +44 -0
  95. moai_adk/templates/.mcp.json +22 -0
  96. moai_adk/templates/CLAUDE.md +450 -1071
  97. moai_adk/utils/__init__.py +0 -1
  98. moai_adk/utils/banner.py +0 -1
  99. moai_adk/utils/common.py +308 -0
  100. moai_adk/utils/link_validator.py +249 -0
  101. moai_adk/utils/logger.py +4 -9
  102. moai_adk/utils/safe_file_reader.py +210 -0
  103. moai_adk/utils/user_experience.py +531 -0
  104. moai_adk-0.25.4.dist-info/METADATA +2279 -0
  105. moai_adk-0.25.4.dist-info/RECORD +112 -0
  106. moai_adk/core/tags/__init__.py +0 -86
  107. moai_adk/core/tags/ci_validator.py +0 -463
  108. moai_adk/core/tags/cli.py +0 -283
  109. moai_adk/core/tags/generator.py +0 -109
  110. moai_adk/core/tags/inserter.py +0 -99
  111. moai_adk/core/tags/mapper.py +0 -126
  112. moai_adk/core/tags/parser.py +0 -76
  113. moai_adk/core/tags/pre_commit_validator.py +0 -393
  114. moai_adk/core/tags/reporter.py +0 -956
  115. moai_adk/core/tags/tags.py +0 -149
  116. moai_adk/core/tags/validator.py +0 -897
  117. moai_adk/templates/.claude/agents/alfred/backend-expert.md +0 -319
  118. moai_adk/templates/.claude/agents/alfred/cc-manager.md +0 -316
  119. moai_adk/templates/.claude/agents/alfred/debug-helper.md +0 -208
  120. moai_adk/templates/.claude/agents/alfred/devops-expert.md +0 -464
  121. moai_adk/templates/.claude/agents/alfred/doc-syncer.md +0 -214
  122. moai_adk/templates/.claude/agents/alfred/frontend-expert.md +0 -357
  123. moai_adk/templates/.claude/agents/alfred/git-manager.md +0 -406
  124. moai_adk/templates/.claude/agents/alfred/implementation-planner.md +0 -423
  125. moai_adk/templates/.claude/agents/alfred/project-manager.md +0 -312
  126. moai_adk/templates/.claude/agents/alfred/quality-gate.md +0 -343
  127. moai_adk/templates/.claude/agents/alfred/skill-factory.md +0 -865
  128. moai_adk/templates/.claude/agents/alfred/spec-builder.md +0 -426
  129. moai_adk/templates/.claude/agents/alfred/tag-agent.md +0 -361
  130. moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +0 -428
  131. moai_adk/templates/.claude/agents/alfred/trust-checker.md +0 -375
  132. moai_adk/templates/.claude/agents/alfred/ui-ux-expert.md +0 -571
  133. moai_adk/templates/.claude/commands/alfred/0-project.md +0 -1854
  134. moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -880
  135. moai_adk/templates/.claude/commands/alfred/2-run.md +0 -793
  136. moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -1084
  137. moai_adk/templates/.claude/commands/alfred/9-feedback.md +0 -149
  138. moai_adk/templates/.claude/hooks/alfred/core/project.py +0 -748
  139. moai_adk/templates/.claude/hooks/alfred/core/timeout.py +0 -136
  140. moai_adk/templates/.claude/hooks/alfred/core/ttl_cache.py +0 -108
  141. moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +0 -198
  142. moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +0 -29
  143. moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +0 -94
  144. moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +0 -100
  145. moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +0 -94
  146. moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +0 -94
  147. moai_adk/templates/.claude/hooks/alfred/shared/core/__init__.py +0 -170
  148. moai_adk/templates/.claude/hooks/alfred/shared/core/checkpoint.py +0 -271
  149. moai_adk/templates/.claude/hooks/alfred/shared/core/context.py +0 -67
  150. moai_adk/templates/.claude/hooks/alfred/shared/core/project.py +0 -749
  151. moai_adk/templates/.claude/hooks/alfred/shared/core/tags.py +0 -230
  152. moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +0 -198
  153. moai_adk/templates/.claude/hooks/alfred/shared/handlers/__init__.py +0 -21
  154. moai_adk/templates/.claude/hooks/alfred/shared/handlers/notification.py +0 -154
  155. moai_adk/templates/.claude/hooks/alfred/shared/handlers/session.py +0 -174
  156. moai_adk/templates/.claude/hooks/alfred/shared/handlers/tool.py +0 -87
  157. moai_adk/templates/.claude/hooks/alfred/shared/handlers/user.py +0 -61
  158. moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +0 -112
  159. moai_adk/templates/.claude/hooks/alfred/utils/__init__.py +0 -1
  160. moai_adk/templates/.claude/hooks/alfred/utils/timeout.py +0 -161
  161. moai_adk/templates/.claude/settings.json +0 -144
  162. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/SKILL.md +0 -70
  163. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/examples.md +0 -62
  164. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/reference.md +0 -242
  165. moai_adk/templates/.claude/skills/moai-alfred-config-schema/SKILL.md +0 -56
  166. moai_adk/templates/.claude/skills/moai-alfred-config-schema/examples.md +0 -28
  167. moai_adk/templates/.claude/skills/moai-alfred-config-schema/reference.md +0 -444
  168. moai_adk/templates/.claude/skills/moai-alfred-context-budget/SKILL.md +0 -62
  169. moai_adk/templates/.claude/skills/moai-alfred-context-budget/examples.md +0 -28
  170. moai_adk/templates/.claude/skills/moai-alfred-context-budget/reference.md +0 -405
  171. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/SKILL.md +0 -51
  172. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/examples.md +0 -355
  173. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/reference.md +0 -239
  174. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -113
  175. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/examples.md +0 -29
  176. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/reference.md +0 -28
  177. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/SKILL.md +0 -323
  178. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/examples.md +0 -286
  179. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/reference.md +0 -126
  180. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -122
  181. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/examples.md +0 -29
  182. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/reference.md +0 -29
  183. moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/SKILL.md +0 -74
  184. moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/examples.md +0 -4
  185. moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/reference.md +0 -269
  186. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/SKILL.md +0 -237
  187. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/examples.md +0 -615
  188. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/reference.md +0 -653
  189. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/SKILL.md +0 -19
  190. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/examples.md +0 -4
  191. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/reference.md +0 -150
  192. moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +0 -113
  193. moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +0 -29
  194. moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +0 -28
  195. moai_adk/templates/.claude/skills/moai-alfred-persona-roles/SKILL.md +0 -198
  196. moai_adk/templates/.claude/skills/moai-alfred-persona-roles/examples.md +0 -431
  197. moai_adk/templates/.claude/skills/moai-alfred-persona-roles/reference.md +0 -141
  198. moai_adk/templates/.claude/skills/moai-alfred-practices/SKILL.md +0 -89
  199. moai_adk/templates/.claude/skills/moai-alfred-practices/examples.md +0 -122
  200. moai_adk/templates/.claude/skills/moai-alfred-practices/reference.md +0 -369
  201. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/SKILL.md +0 -508
  202. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/examples.md +0 -481
  203. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/reference.md +0 -100
  204. moai_adk/templates/.claude/skills/moai-alfred-reporting/SKILL.md +0 -273
  205. moai_adk/templates/.claude/skills/moai-alfred-rules/SKILL.md +0 -77
  206. moai_adk/templates/.claude/skills/moai-alfred-rules/examples.md +0 -265
  207. moai_adk/templates/.claude/skills/moai-alfred-rules/reference.md +0 -539
  208. moai_adk/templates/.claude/skills/moai-alfred-session-state/SKILL.md +0 -19
  209. moai_adk/templates/.claude/skills/moai-alfred-session-state/examples.md +0 -4
  210. moai_adk/templates/.claude/skills/moai-alfred-session-state/reference.md +0 -84
  211. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/README.md +0 -137
  212. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/SKILL.md +0 -219
  213. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples/validate-spec.sh +0 -161
  214. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples.md +0 -541
  215. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/reference.md +0 -622
  216. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/SKILL.md +0 -115
  217. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/examples.md +0 -4
  218. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/reference.md +0 -348
  219. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -113
  220. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/examples.md +0 -29
  221. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/reference.md +0 -28
  222. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -113
  223. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/examples.md +0 -29
  224. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/reference.md +0 -28
  225. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/SKILL.md +0 -19
  226. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/examples.md +0 -4
  227. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/reference.md +0 -211
  228. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -113
  229. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/examples.md +0 -29
  230. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/reference.md +0 -28
  231. moai_adk/templates/.claude/skills/moai-alfred-workflow/SKILL.md +0 -288
  232. moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +0 -269
  233. moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +0 -32
  234. moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +0 -298
  235. moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +0 -26
  236. moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +0 -307
  237. moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +0 -21
  238. moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +0 -252
  239. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +0 -19
  240. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +0 -19
  241. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +0 -24
  242. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +0 -199
  243. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +0 -39
  244. moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +0 -316
  245. moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +0 -18
  246. moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +0 -263
  247. moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +0 -30
  248. moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/SKILL.md +0 -19
  249. moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/examples.md +0 -4
  250. moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/reference.md +0 -218
  251. moai_adk/templates/.claude/skills/moai-cc-skill-factory/CHECKLIST.md +0 -482
  252. moai_adk/templates/.claude/skills/moai-cc-skill-factory/EXAMPLES.md +0 -278
  253. moai_adk/templates/.claude/skills/moai-cc-skill-factory/INTERACTIVE-DISCOVERY.md +0 -524
  254. moai_adk/templates/.claude/skills/moai-cc-skill-factory/METADATA.md +0 -477
  255. moai_adk/templates/.claude/skills/moai-cc-skill-factory/PARALLEL-ANALYSIS-REPORT.md +0 -429
  256. moai_adk/templates/.claude/skills/moai-cc-skill-factory/PYTHON-VERSION-MATRIX.md +0 -391
  257. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-FACTORY-WORKFLOW.md +0 -431
  258. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-UPDATE-ADVISOR.md +0 -577
  259. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL.md +0 -271
  260. moai_adk/templates/.claude/skills/moai-cc-skill-factory/STEP-BY-STEP-GUIDE.md +0 -466
  261. moai_adk/templates/.claude/skills/moai-cc-skill-factory/STRUCTURE.md +0 -583
  262. moai_adk/templates/.claude/skills/moai-cc-skill-factory/WEB-RESEARCH.md +0 -526
  263. moai_adk/templates/.claude/skills/moai-cc-skill-factory/reference.md +0 -465
  264. moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/generate-structure.sh +0 -328
  265. moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/validate-skill.sh +0 -312
  266. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/SKILL_TEMPLATE.md +0 -245
  267. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/examples-template.md +0 -285
  268. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/reference-template.md +0 -278
  269. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/scripts-template.sh +0 -303
  270. moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +0 -291
  271. moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +0 -15
  272. moai_adk/templates/.claude/skills/moai-design-systems/SKILL.md +0 -802
  273. moai_adk/templates/.claude/skills/moai-design-systems/examples.md +0 -1238
  274. moai_adk/templates/.claude/skills/moai-design-systems/reference.md +0 -673
  275. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +0 -290
  276. moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +0 -1633
  277. moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +0 -660
  278. moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +0 -123
  279. moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +0 -29
  280. moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +0 -30
  281. moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +0 -123
  282. moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +0 -29
  283. moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +0 -30
  284. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +0 -123
  285. moai_adk/templates/.claude/skills/moai-domain-database/examples.md +0 -29
  286. moai_adk/templates/.claude/skills/moai-domain-database/reference.md +0 -30
  287. moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +0 -124
  288. moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +0 -29
  289. moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +0 -31
  290. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +0 -128
  291. moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +0 -29
  292. moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +0 -31
  293. moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +0 -123
  294. moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +0 -29
  295. moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +0 -30
  296. moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +0 -123
  297. moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +0 -29
  298. moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +0 -30
  299. moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +0 -123
  300. moai_adk/templates/.claude/skills/moai-domain-security/examples.md +0 -29
  301. moai_adk/templates/.claude/skills/moai-domain-security/reference.md +0 -30
  302. moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +0 -123
  303. moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +0 -29
  304. moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +0 -30
  305. moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +0 -303
  306. moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +0 -1064
  307. moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +0 -1047
  308. moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +0 -113
  309. moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +0 -29
  310. moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +0 -28
  311. moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +0 -113
  312. moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +0 -29
  313. moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +0 -28
  314. moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +0 -113
  315. moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +0 -29
  316. moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +0 -28
  317. moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +0 -116
  318. moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +0 -29
  319. moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +0 -28
  320. moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +0 -122
  321. moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +0 -29
  322. moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +0 -29
  323. moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +0 -113
  324. moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +0 -29
  325. moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +0 -28
  326. moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +0 -113
  327. moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +0 -29
  328. moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +0 -28
  329. moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +0 -113
  330. moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +0 -29
  331. moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +0 -28
  332. moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +0 -307
  333. moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
  334. moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +0 -1099
  335. moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +0 -124
  336. moai_adk/templates/.claude/skills/moai-lang-c/examples.md +0 -29
  337. moai_adk/templates/.claude/skills/moai-lang-c/reference.md +0 -31
  338. moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +0 -124
  339. moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +0 -29
  340. moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +0 -31
  341. moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +0 -123
  342. moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +0 -29
  343. moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +0 -30
  344. moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +0 -123
  345. moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +0 -29
  346. moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +0 -30
  347. moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +0 -127
  348. moai_adk/templates/.claude/skills/moai-lang-go/examples.md +0 -29
  349. moai_adk/templates/.claude/skills/moai-lang-go/reference.md +0 -31
  350. moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +0 -126
  351. moai_adk/templates/.claude/skills/moai-lang-java/examples.md +0 -29
  352. moai_adk/templates/.claude/skills/moai-lang-java/reference.md +0 -31
  353. moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +0 -125
  354. moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +0 -29
  355. moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +0 -32
  356. moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +0 -124
  357. moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +0 -29
  358. moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +0 -31
  359. moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +0 -126
  360. moai_adk/templates/.claude/skills/moai-lang-php/examples.md +0 -29
  361. moai_adk/templates/.claude/skills/moai-lang-php/reference.md +0 -30
  362. moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +0 -433
  363. moai_adk/templates/.claude/skills/moai-lang-python/examples.md +0 -624
  364. moai_adk/templates/.claude/skills/moai-lang-python/reference.md +0 -316
  365. moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +0 -123
  366. moai_adk/templates/.claude/skills/moai-lang-r/examples.md +0 -29
  367. moai_adk/templates/.claude/skills/moai-lang-r/reference.md +0 -30
  368. moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +0 -124
  369. moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +0 -29
  370. moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +0 -31
  371. moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +0 -127
  372. moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +0 -29
  373. moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +0 -31
  374. moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +0 -125
  375. moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +0 -29
  376. moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +0 -30
  377. moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +0 -123
  378. moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +0 -29
  379. moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +0 -30
  380. moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +0 -124
  381. moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +0 -29
  382. moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +0 -31
  383. moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +0 -123
  384. moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +0 -29
  385. moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +0 -30
  386. moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +0 -133
  387. moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +0 -29
  388. moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +0 -34
  389. moai_adk/templates/.claude/skills/moai-project-documentation.md +0 -622
  390. moai_adk/templates/.github/workflows/c-tag-validation.yml +0 -11
  391. moai_adk/templates/.github/workflows/cpp-tag-validation.yml +0 -11
  392. moai_adk/templates/.github/workflows/csharp-tag-validation.yml +0 -11
  393. moai_adk/templates/.github/workflows/dart-tag-validation.yml +0 -11
  394. moai_adk/templates/.github/workflows/go-tag-validation.yml +0 -130
  395. moai_adk/templates/.github/workflows/java-tag-validation.yml +0 -11
  396. moai_adk/templates/.github/workflows/javascript-tag-validation.yml +0 -135
  397. moai_adk/templates/.github/workflows/kotlin-tag-validation.yml +0 -11
  398. moai_adk/templates/.github/workflows/php-tag-validation.yml +0 -11
  399. moai_adk/templates/.github/workflows/python-tag-validation.yml +0 -118
  400. moai_adk/templates/.github/workflows/release.yml +0 -118
  401. moai_adk/templates/.github/workflows/ruby-tag-validation.yml +0 -11
  402. moai_adk/templates/.github/workflows/rust-tag-validation.yml +0 -11
  403. moai_adk/templates/.github/workflows/shell-tag-validation.yml +0 -11
  404. moai_adk/templates/.github/workflows/swift-tag-validation.yml +0 -11
  405. moai_adk/templates/.github/workflows/tag-report.yml +0 -269
  406. moai_adk/templates/.github/workflows/tag-validation.yml +0 -186
  407. moai_adk/templates/.github/workflows/typescript-tag-validation.yml +0 -154
  408. moai_adk/templates/.moai/config.json +0 -115
  409. moai_adk/templates/workflows/go-tag-validation.yml +0 -30
  410. moai_adk/templates/workflows/javascript-tag-validation.yml +0 -41
  411. moai_adk/templates/workflows/python-tag-validation.yml +0 -42
  412. moai_adk/templates/workflows/typescript-tag-validation.yml +0 -31
  413. moai_adk-0.15.1.dist-info/METADATA +0 -3094
  414. moai_adk-0.15.1.dist-info/RECORD +0 -365
  415. {moai_adk-0.15.1.dist-info → moai_adk-0.25.4.dist-info}/WHEEL +0 -0
  416. {moai_adk-0.15.1.dist-info → moai_adk-0.25.4.dist-info}/entry_points.txt +0 -0
  417. {moai_adk-0.15.1.dist-info → moai_adk-0.25.4.dist-info}/licenses/LICENSE +0 -0
@@ -1,5 +1,4 @@
1
- # @CODE:INIT-003:PHASE | SPEC: .moai/specs/SPEC-INIT-003/spec.md | TEST: tests/unit/test_init_reinit.py
2
- # @CODE:TEST-COVERAGE-001 | SPEC: SPEC-TEST-COVERAGE-001.md | TEST: tests/unit/test_phase_executor.py
1
+ # type: ignore
3
2
  """Phase-based installation executor (SPEC-INIT-003 v0.4.2)
4
3
 
5
4
  Runs the project initialization across five phases:
@@ -13,6 +12,8 @@ Test coverage includes 5-phase integration tests with backup, configuration, and
13
12
  """
14
13
 
15
14
  import json
15
+ import logging
16
+ import platform
16
17
  import shutil
17
18
  import subprocess
18
19
  from collections.abc import Callable
@@ -30,6 +31,7 @@ from moai_adk.core.project.backup_utils import (
30
31
  )
31
32
  from moai_adk.core.project.validator import ProjectValidator
32
33
  from moai_adk.core.template.processor import TemplateProcessor
34
+ from moai_adk.statusline.version_reader import VersionConfig, VersionReader
33
35
 
34
36
  console = Console()
35
37
 
@@ -46,6 +48,8 @@ class PhaseExecutor:
46
48
  3. Resource: Copy template resources.
47
49
  4. Configuration: Generate configuration files.
48
50
  5. Validation: Perform final checks.
51
+
52
+ Enhanced with improved version reading and context management.
49
53
  """
50
54
 
51
55
  # Required directory structure
@@ -69,6 +73,186 @@ class PhaseExecutor:
69
73
  self.validator = validator
70
74
  self.total_phases = 5
71
75
  self.current_phase = 0
76
+ self._version_reader: VersionReader | None = None
77
+
78
+ def _get_version_reader(self) -> VersionReader:
79
+ """
80
+ Get or create version reader instance.
81
+
82
+ Returns:
83
+ VersionReader instance with enhanced configuration
84
+ """
85
+ if self._version_reader is None:
86
+ config = VersionConfig(
87
+ cache_ttl_seconds=120, # Longer cache for phase execution
88
+ fallback_version=__version__,
89
+ version_format_regex=r"^v?(\d+\.\d+\.\d+(-[a-zA-Z0-9]+)?)$",
90
+ cache_enabled=True,
91
+ debug_mode=False,
92
+ )
93
+ self._version_reader = VersionReader(config)
94
+ return self._version_reader
95
+
96
+ def _get_enhanced_version_context(self) -> dict[str, str]:
97
+ """
98
+ Get enhanced version context with fallback strategies and comprehensive configuration.
99
+
100
+ Returns:
101
+ Dictionary containing version-related template variables with enhanced formatting
102
+ """
103
+ version_context = {}
104
+ logger = logging.getLogger(__name__)
105
+
106
+ try:
107
+ version_reader = self._get_version_reader()
108
+ moai_version = version_reader.get_version()
109
+
110
+ # Enhanced version context with multiple format options
111
+ version_context["MOAI_VERSION"] = moai_version
112
+ version_context["MOAI_VERSION_SHORT"] = self._format_short_version(
113
+ moai_version
114
+ )
115
+ version_context["MOAI_VERSION_DISPLAY"] = self._format_display_version(
116
+ moai_version
117
+ )
118
+ version_context["MOAI_VERSION_TRIMMED"] = self._format_trimmed_version(
119
+ moai_version, max_length=10
120
+ )
121
+ version_context["MOAI_VERSION_SEMVER"] = self._format_semver_version(
122
+ moai_version
123
+ )
124
+ version_context["MOAI_VERSION_VALID"] = (
125
+ "true" if moai_version != "unknown" else "false"
126
+ )
127
+ version_context["MOAI_VERSION_SOURCE"] = self._get_version_source(
128
+ version_reader
129
+ )
130
+
131
+ # Add performance metrics for debugging
132
+ cache_age = version_reader.get_cache_age_seconds()
133
+ if cache_age is not None:
134
+ version_context["MOAI_VERSION_CACHE_AGE"] = f"{cache_age:.2f}s"
135
+ else:
136
+ version_context["MOAI_VERSION_CACHE_AGE"] = "uncached"
137
+
138
+ except Exception as e:
139
+ logger.warning(f"Failed to read version for context: {e}")
140
+ # Use fallback version with comprehensive fallback formatting
141
+ fallback_version = __version__
142
+ version_context["MOAI_VERSION"] = fallback_version
143
+ version_context["MOAI_VERSION_SHORT"] = self._format_short_version(
144
+ fallback_version
145
+ )
146
+ version_context["MOAI_VERSION_DISPLAY"] = self._format_display_version(
147
+ fallback_version
148
+ )
149
+ version_context["MOAI_VERSION_TRIMMED"] = self._format_trimmed_version(
150
+ fallback_version, max_length=10
151
+ )
152
+ version_context["MOAI_VERSION_SEMVER"] = self._format_semver_version(
153
+ fallback_version
154
+ )
155
+ version_context["MOAI_VERSION_VALID"] = "true"
156
+ version_context["MOAI_VERSION_SOURCE"] = "fallback_package"
157
+ version_context["MOAI_VERSION_CACHE_AGE"] = "unavailable"
158
+
159
+ return version_context
160
+
161
+ def _format_short_version(self, version: str) -> str:
162
+ """
163
+ Format short version by removing 'v' prefix if present.
164
+
165
+ Args:
166
+ version: Version string
167
+
168
+ Returns:
169
+ Short version string
170
+ """
171
+ return version[1:] if version.startswith("v") else version
172
+
173
+ def _format_display_version(self, version: str) -> str:
174
+ """
175
+ Format display version with proper formatting.
176
+
177
+ Args:
178
+ version: Version string
179
+
180
+ Returns:
181
+ Display version string
182
+ """
183
+ if version == "unknown":
184
+ return "MoAI-ADK unknown version"
185
+ elif version.startswith("v"):
186
+ return f"MoAI-ADK {version}"
187
+ else:
188
+ return f"MoAI-ADK v{version}"
189
+
190
+ def _format_trimmed_version(self, version: str, max_length: int = 10) -> str:
191
+ """
192
+ Format version with maximum length, suitable for UI displays.
193
+
194
+ Args:
195
+ version: Version string
196
+ max_length: Maximum allowed length for the version string
197
+
198
+ Returns:
199
+ Trimmed version string
200
+ """
201
+ if version == "unknown":
202
+ return "unknown"
203
+
204
+ # Remove 'v' prefix for trimming
205
+ clean_version = version[1:] if version.startswith("v") else version
206
+
207
+ # Trim if necessary
208
+ if len(clean_version) > max_length:
209
+ return clean_version[:max_length]
210
+ return clean_version
211
+
212
+ def _format_semver_version(self, version: str) -> str:
213
+ """
214
+ Format version as semantic version with major.minor.patch structure.
215
+
216
+ Args:
217
+ version: Version string
218
+
219
+ Returns:
220
+ Semantic version string
221
+ """
222
+ if version == "unknown":
223
+ return "0.0.0"
224
+
225
+ # Remove 'v' prefix and extract semantic version
226
+ clean_version = version[1:] if version.startswith("v") else version
227
+
228
+ # Extract core semantic version (remove pre-release and build metadata)
229
+ import re
230
+
231
+ semver_match = re.match(r"^(\d+\.\d+\.\d+)", clean_version)
232
+ if semver_match:
233
+ return semver_match.group(1)
234
+ return "0.0.0"
235
+
236
+ def _get_version_source(self, version_reader: VersionReader) -> str:
237
+ """
238
+ Determine the source of the version information.
239
+
240
+ Args:
241
+ version_reader: VersionReader instance
242
+
243
+ Returns:
244
+ String indicating version source
245
+ """
246
+ config = version_reader.get_config()
247
+
248
+ # Check if we have a cached version (most likely from config)
249
+ cache_age = version_reader.get_cache_age_seconds()
250
+ if cache_age is not None and cache_age < config.cache_ttl_seconds:
251
+ return "config_cached"
252
+ elif cache_age is not None:
253
+ return "config_stale"
254
+ else:
255
+ return config.fallback_version
72
256
 
73
257
  def execute_preparation_phase(
74
258
  self,
@@ -84,9 +268,7 @@ class PhaseExecutor:
84
268
  progress_callback: Optional progress callback.
85
269
  """
86
270
  self.current_phase = 1
87
- self._report_progress(
88
- "Phase 1: Preparation and backup...", progress_callback
89
- )
271
+ self._report_progress("Phase 1: Preparation and backup...", progress_callback)
90
272
 
91
273
  # Validate system requirements
92
274
  self.validator.validate_system_requirements()
@@ -135,22 +317,29 @@ class PhaseExecutor:
135
317
  List of created files or directories.
136
318
  """
137
319
  self.current_phase = 3
138
- self._report_progress(
139
- "Phase 3: Installing resources...", progress_callback
140
- )
320
+ self._report_progress("Phase 3: Installing resources...", progress_callback)
141
321
 
142
322
  # Copy resources via TemplateProcessor in silent mode
143
323
  processor = TemplateProcessor(project_path)
144
324
 
145
325
  # Set template variable context (if provided)
146
326
  if config:
147
- # @TAG:LANG-FIX-001:PY-CONFIG | Read language from nested config structure
148
327
  language_config: dict[str, Any] = config.get("language", {})
149
328
  if not isinstance(language_config, dict):
150
329
  language_config = {}
151
330
 
331
+ # Detect OS for cross-platform Hook path configuration
332
+ hook_project_dir = (
333
+ "%CLAUDE_PROJECT_DIR%"
334
+ if platform.system() == "Windows"
335
+ else "$CLAUDE_PROJECT_DIR"
336
+ )
337
+
338
+ # Get enhanced version context with fallback strategies
339
+ version_context = self._get_enhanced_version_context()
340
+
152
341
  context = {
153
- "MOAI_VERSION": __version__,
342
+ **version_context,
154
343
  "CREATION_TIMESTAMP": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
155
344
  "PROJECT_NAME": config.get("name", "unknown"),
156
345
  "PROJECT_DESCRIPTION": config.get("description", ""),
@@ -158,13 +347,20 @@ class PhaseExecutor:
158
347
  "PROJECT_VERSION": config.get("version", "0.1.0"),
159
348
  "PROJECT_OWNER": config.get("author", "@user"),
160
349
  "AUTHOR": config.get("author", "@user"),
161
- "CONVERSATION_LANGUAGE": language_config.get("conversation_language", "en"),
162
- "CONVERSATION_LANGUAGE_NAME": language_config.get("conversation_language_name", "English"),
350
+ "CONVERSATION_LANGUAGE": language_config.get(
351
+ "conversation_language", "en"
352
+ ),
353
+ "CONVERSATION_LANGUAGE_NAME": language_config.get(
354
+ "conversation_language_name", "English"
355
+ ),
163
356
  "CODEBASE_LANGUAGE": config.get("language", "generic"),
357
+ "PROJECT_DIR": hook_project_dir,
164
358
  }
165
359
  processor.set_context(context)
166
360
 
167
- processor.copy_templates(backup=False, silent=True) # Avoid progress bar conflicts
361
+ processor.copy_templates(
362
+ backup=False, silent=True
363
+ ) # Avoid progress bar conflicts
168
364
 
169
365
  # Return a simplified list of generated assets
170
366
  return [
@@ -196,57 +392,220 @@ class PhaseExecutor:
196
392
  "Phase 4: Generating configurations...", progress_callback
197
393
  )
198
394
 
395
+ logger = logging.getLogger(__name__)
396
+
199
397
  # Read existing config to preserve user settings (Issue #165)
200
- config_path = project_path / ".moai" / "config.json"
398
+ config_path = project_path / ".moai" / "config" / "config.json"
201
399
  existing_config: dict[str, Any] = {}
202
400
  if config_path.exists():
203
401
  try:
204
402
  with open(config_path, "r", encoding="utf-8") as f:
205
403
  existing_config = json.load(f)
206
- except (json.JSONDecodeError, OSError):
207
- # If config reading fails, start fresh
404
+ logger.debug(f"Successfully read existing config from {config_path}")
405
+ except (json.JSONDecodeError, OSError) as e:
406
+ logger.warning(f"Failed to read existing config: {e}. Starting fresh.")
208
407
  existing_config = {}
209
408
 
210
- # Merge user settings from existing config (preserve customization)
211
- if existing_config:
212
- # Preserve user.nickname if it exists
213
- if "user" in existing_config and isinstance(existing_config.get("user"), dict):
214
- if "user" not in config:
215
- config["user"] = {}
216
- user_config = config["user"]
217
- if isinstance(user_config, dict):
218
- existing_user = existing_config["user"]
219
- if isinstance(existing_user, dict) and "nickname" in existing_user:
220
- user_config["nickname"] = existing_user["nickname"]
221
-
222
- # Preserve language settings if they exist
223
- if "language" in existing_config and isinstance(existing_config.get("language"), dict):
224
- if "language" not in config:
225
- config["language"] = {}
226
- lang_config = config["language"]
227
- if isinstance(lang_config, dict):
228
- existing_lang = existing_config["language"]
229
- if isinstance(existing_lang, dict):
230
- # Preserve conversation_language settings
231
- if "conversation_language" in existing_lang:
232
- lang_config["conversation_language"] = existing_lang["conversation_language"]
233
- if "conversation_language_name" in existing_lang:
234
- lang_config["conversation_language_name"] = existing_lang["conversation_language_name"]
235
-
236
- # Ensure project section exists and set defaults
237
- if "project" not in config:
238
- config["project"] = {}
239
- # Type guard for mypy
240
- project_config = config["project"]
241
- if isinstance(project_config, dict):
242
- project_config["optimized"] = False # Default value
243
-
244
- # Write config.json
245
- with open(config_path, "w", encoding="utf-8") as f:
246
- json.dump(config, f, indent=2, ensure_ascii=False)
409
+ # Enhanced config merging with comprehensive version preservation
410
+ merged_config = self._merge_configuration_preserving_versions(
411
+ config, existing_config
412
+ )
413
+
414
+ # Enhanced version handling using VersionReader for consistency
415
+ try:
416
+ version_reader = self._get_version_reader()
417
+ current_config_version = version_reader.get_version()
418
+
419
+ # Ensure version consistency across the merged config
420
+ self._ensure_version_consistency(
421
+ merged_config, current_config_version, existing_config
422
+ )
423
+
424
+ logger.debug(
425
+ f"Version consistency check completed. Current version: {current_config_version}"
426
+ )
427
+ except Exception as e:
428
+ logger.warning(
429
+ f"Version consistency check failed: {e}. Using fallback version."
430
+ )
431
+ merged_config["moai"]["version"] = __version__
432
+
433
+ # Write final config with enhanced formatting
434
+ self._write_configuration_file(config_path, merged_config)
435
+ logger.info(f"Configuration file written to {config_path}")
247
436
 
248
437
  return [str(config_path)]
249
438
 
439
+ def _merge_configuration_preserving_versions(
440
+ self, new_config: dict[str, Any], existing_config: dict[str, Any]
441
+ ) -> dict[str, Any]:
442
+ """
443
+ Merge configurations while preserving user settings and version information.
444
+
445
+ Args:
446
+ new_config: New configuration from initialization
447
+ existing_config: Existing configuration from project
448
+
449
+ Returns:
450
+ Merged configuration dictionary
451
+ """
452
+ logger = logging.getLogger(__name__)
453
+ merged_config = new_config.copy()
454
+
455
+ # Define configuration sections with their merge strategies
456
+ config_sections = {
457
+ "moai": {"preserve_all": True, "priority": "user"},
458
+ "user": {"preserve_keys": ["nickname"], "priority": "user"},
459
+ "language": {
460
+ "preserve_keys": [],
461
+ "priority": "new",
462
+ }, # Use new language config during init
463
+ "project": {"preserve_keys": [], "priority": "new"},
464
+ "git": {"preserve_keys": [], "priority": "new"},
465
+ }
466
+
467
+ for section_name, strategy in config_sections.items():
468
+ if section_name in existing_config:
469
+ logger.debug(f"Merging section: {section_name}")
470
+ self._merge_config_section(
471
+ merged_config, existing_config, section_name, strategy
472
+ )
473
+
474
+ return merged_config
475
+
476
+ def _merge_config_section(
477
+ self,
478
+ merged_config: dict[str, Any],
479
+ existing_config: dict[str, Any],
480
+ section_name: str,
481
+ strategy: dict[str, Any],
482
+ ) -> None:
483
+ """
484
+ Merge a specific configuration section.
485
+
486
+ Args:
487
+ merged_config: Target configuration to merge into
488
+ existing_config: Source configuration to merge from
489
+ section_name: Name of the section to merge
490
+ strategy: Merge strategy for this section
491
+ """
492
+ logger = logging.getLogger(__name__)
493
+ if section_name not in merged_config:
494
+ merged_config[section_name] = {}
495
+
496
+ section_config = merged_config[section_name]
497
+ existing_section = existing_config[section_name]
498
+
499
+ if strategy["priority"] == "user":
500
+ # User priority: preserve existing values
501
+ preserve_keys = strategy.get("preserve_keys", [])
502
+ # Convert frozenset to list if needed
503
+ if isinstance(preserve_keys, frozenset):
504
+ preserve_keys = list(preserve_keys)
505
+ elif not isinstance(preserve_keys, list):
506
+ preserve_keys = list(preserve_keys) if preserve_keys else []
507
+
508
+ for key, value in existing_section.items():
509
+ if strategy.get("preserve_all", False) or key in preserve_keys:
510
+ section_config[key] = value
511
+ logger.debug(f"Preserved {section_name}.{key} = {value}")
512
+ else:
513
+ # New priority: keep new config, but don't overwrite if exists
514
+ for key, value in existing_section.items():
515
+ if key not in section_config:
516
+ section_config[key] = value
517
+ logger.debug(f"Inherited {section_name}.{key} = {value}")
518
+
519
+ def _ensure_version_consistency(
520
+ self,
521
+ config: dict[str, Any],
522
+ current_version: str,
523
+ existing_config: dict[str, Any],
524
+ ) -> None:
525
+ """
526
+ Ensure version consistency across the configuration.
527
+
528
+ Args:
529
+ config: Configuration to update
530
+ current_version: Current version from VersionReader
531
+ existing_config: Existing configuration for reference
532
+ """
533
+ logger = logging.getLogger(__name__)
534
+
535
+ # Ensure moai section exists
536
+ if "moai" not in config:
537
+ config["moai"] = {}
538
+
539
+ # Version field priority strategy:
540
+ # 1. User explicitly set in existing config -> preserve
541
+ # 2. Version from config file -> use
542
+ # 3. Current version from VersionReader -> use
543
+ # 4. Package version -> fallback
544
+
545
+ existing_moai = existing_config.get("moai", {})
546
+ config_moai = config["moai"]
547
+
548
+ # Check if user explicitly set a version in existing config
549
+ if "version" in existing_moai:
550
+ user_version = existing_moai["version"]
551
+ logger.debug(f"User explicitly set version: {user_version}")
552
+ config_moai["version"] = user_version
553
+ elif "version" in config_moai:
554
+ # Version already in new config, validate it
555
+ config_version = config_moai["version"]
556
+ if config_version == "unknown" or not self._is_valid_version_format(
557
+ config_version
558
+ ):
559
+ logger.debug(
560
+ f"Invalid config version {config_version}, updating to current: {current_version}"
561
+ )
562
+ config_moai["version"] = current_version
563
+ else:
564
+ # No version found, use current version
565
+ logger.debug(f"No version found, setting to current: {current_version}")
566
+ config_moai["version"] = current_version
567
+
568
+ def _is_valid_version_format(self, version: str) -> bool:
569
+ """
570
+ Check if version format is valid.
571
+
572
+ Args:
573
+ version: Version string to validate
574
+
575
+ Returns:
576
+ True if version format is valid
577
+ """
578
+ import re
579
+
580
+ pattern = r"^v?(\d+\.\d+\.\d+(-[a-zA-Z0-9]+)?)$"
581
+ return bool(re.match(pattern, version))
582
+
583
+ def _write_configuration_file(
584
+ self, config_path: Path, config: dict[str, Any]
585
+ ) -> None:
586
+ """
587
+ Write configuration file with enhanced formatting and error handling.
588
+
589
+ Args:
590
+ config_path: Path to write configuration file
591
+ config: Configuration dictionary to write
592
+ """
593
+ logger = logging.getLogger(__name__)
594
+
595
+ try:
596
+ # Ensure parent directory exists
597
+ config_path.parent.mkdir(parents=True, exist_ok=True)
598
+
599
+ # Write with enhanced formatting
600
+ with open(config_path, "w", encoding="utf-8") as f:
601
+ json.dump(config, f, indent=2, ensure_ascii=False)
602
+
603
+ logger.info(f"Configuration successfully written to {config_path}")
604
+
605
+ except Exception as e:
606
+ logger.error(f"Failed to write configuration file: {e}")
607
+ raise
608
+
250
609
  def execute_validation_phase(
251
610
  self,
252
611
  project_path: Path,
@@ -255,8 +614,6 @@ class PhaseExecutor:
255
614
  ) -> None:
256
615
  """Phase 5: validation and wrap-up.
257
616
 
258
- @CODE:INIT-PHASE-001 | Phase 5 verification logic
259
- @REQ:VALIDATION-001 | SPEC-INIT-004: Verify required files after initialization completion
260
617
 
261
618
  Args:
262
619
  project_path: Project path.
@@ -294,6 +651,8 @@ class PhaseExecutor:
294
651
  if backup_path.exists():
295
652
  shutil.rmtree(backup_path)
296
653
 
654
+ # Create backup directories
655
+ backups_dir.mkdir(parents=True, exist_ok=True)
297
656
  backup_path.mkdir(parents=True, exist_ok=True)
298
657
 
299
658
  # Collect backup targets
@@ -360,9 +719,7 @@ class PhaseExecutor:
360
719
  # Only log on error; failures are non-fatal
361
720
  pass
362
721
 
363
- def _report_progress(
364
- self, message: str, callback: ProgressCallback | None
365
- ) -> None:
722
+ def _report_progress(self, message: str, callback: ProgressCallback | None) -> None:
366
723
  """Report progress.
367
724
 
368
725
  Args:
@@ -1,7 +1,3 @@
1
- # @CODE:CORE-PROJECT-003 | SPEC: SPEC-CORE-PROJECT-001.md, SPEC-INIT-004.md
2
- # @CODE:INIT-004:VALIDATION | Chain: SPEC-INIT-004 -> CODE-INIT-004 -> TEST-INIT-004
3
- # @REQ:VALIDATION-001 | SPEC-INIT-004: Initial verification after installation completion
4
- # @SPEC:VERIFICATION-001 | SPEC-INIT-004: Verification logic implementation
5
1
  """Project initialization validation module.
6
2
 
7
3
  Validates system requirements and installation results.
@@ -10,11 +6,6 @@ SPEC-INIT-004 Enhancement:
10
6
  - Alfred command files validation (Phase 5)
11
7
  - Explicit missing files reporting
12
8
  - Required files verification checklist
13
-
14
- TAG Chain:
15
- SPEC-INIT-004 (spec.md)
16
- └─> @CODE:INIT-004:VALIDATION (this file)
17
- └─> @TEST:INIT-004:VALIDATION (test_validator.py)
18
9
  """
19
10
 
20
11
  import shutil
@@ -42,7 +33,7 @@ class ProjectValidator:
42
33
 
43
34
  # Required files
44
35
  REQUIRED_FILES = [
45
- ".moai/config.json",
36
+ ".moai/config/config.json",
46
37
  "CLAUDE.md",
47
38
  ]
48
39
 
@@ -87,20 +78,17 @@ class ProjectValidator:
87
78
 
88
79
  # Parent directory must exist
89
80
  if not project_path.parent.exists():
90
- raise ValidationError(f"Parent directory does not exist: {project_path.parent}")
81
+ raise ValidationError(
82
+ f"Parent directory does not exist: {project_path.parent}"
83
+ )
91
84
 
92
85
  # Prevent initialization inside the MoAI-ADK package
93
86
  if self._is_inside_moai_package(project_path):
94
- raise ValidationError(
95
- "Cannot initialize inside MoAI-ADK package directory"
96
- )
87
+ raise ValidationError("Cannot initialize inside MoAI-ADK package directory")
97
88
 
98
89
  def validate_installation(self, project_path: Path) -> None:
99
90
  """Validate installation results.
100
91
 
101
- @CODE:INIT-004:VERIFY-001 | Verification of all required files upon successful completion
102
- @SPEC:VERIFICATION-001 | SPEC-INIT-004: Verification checklist implementation
103
- @REQ:VALIDATION-001 | UR-003: All required files verified after init completes
104
92
 
105
93
  Args:
106
94
  project_path: Project path.
@@ -109,22 +97,17 @@ class ProjectValidator:
109
97
  ValidationError: Raised when installation was incomplete.
110
98
  """
111
99
  # Verify required directories
112
- # @CODE:INIT-004:VALIDATION-001 | Core project structure validation
113
100
  for directory in self.REQUIRED_DIRECTORIES:
114
101
  dir_path = project_path / directory
115
102
  if not dir_path.exists():
116
103
  raise ValidationError(f"Required directory not found: {directory}")
117
104
 
118
105
  # Verify required files
119
- # @CODE:INIT-004:VALIDATION-002 | Required configuration files validation
120
106
  for file in self.REQUIRED_FILES:
121
107
  file_path = project_path / file
122
108
  if not file_path.exists():
123
109
  raise ValidationError(f"Required file not found: {file}")
124
110
 
125
- # @CODE:INIT-004:VERIFY-002 | Verify required Alfred command files (SPEC-INIT-004)
126
- # @REQ:COMMAND-GENERATION-001 | All 4 Alfred command files must be created
127
- # @CODE:INIT-004:ALFRED-VALIDATION | Alfred command file integrity check
128
111
  alfred_dir = project_path / ".claude" / "commands" / "alfred"
129
112
  missing_commands = []
130
113
  for cmd in self.REQUIRED_ALFRED_COMMANDS:
@@ -134,8 +117,6 @@ class ProjectValidator:
134
117
 
135
118
  if missing_commands:
136
119
  missing_list = ", ".join(missing_commands)
137
- # @SPEC:ERROR-HANDLING-001 | Clear error messages upon missing files
138
- # @CODE:INIT-004:ERROR-MESSAGE | Clear reporting of missing Alfred command files
139
120
  raise ValidationError(
140
121
  f"Required Alfred command files not found: {missing_list}"
141
122
  )
@@ -156,7 +137,7 @@ class ProjectValidator:
156
137
  if pyproject.exists():
157
138
  try:
158
139
  content = pyproject.read_text(encoding="utf-8")
159
- if "name = \"moai-adk\"" in content or 'name = "moai-adk"' in content:
140
+ if 'name = "moai-adk"' in content or 'name = "moai-adk"' in content:
160
141
  return True
161
142
  except Exception:
162
143
  pass
@@ -1,4 +1,4 @@
1
- # @CODE:TRUST-001 | SPEC: SPEC-TRUST-001/spec.md | TEST: tests/unit/core/quality/
1
+ # type: ignore
2
2
  """TRUST principle automated validation system"""
3
3
 
4
4
  from moai_adk.core.quality.trust_checker import TrustChecker