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
@@ -0,0 +1,228 @@
1
+ """
2
+ Main version migration orchestrator for MoAI-ADK
3
+
4
+ Coordinates version detection, backup creation, file migration,
5
+ and cleanup processes for automatic project upgrades.
6
+ """
7
+
8
+ import logging
9
+ from pathlib import Path
10
+ from typing import Dict
11
+
12
+ from .backup_manager import BackupManager
13
+ from .file_migrator import FileMigrator
14
+ from .version_detector import VersionDetector
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+
19
+ class VersionMigrator:
20
+ """Main migration orchestrator for MoAI-ADK version upgrades"""
21
+
22
+ def __init__(self, project_root: Path):
23
+ """
24
+ Initialize version migrator
25
+
26
+ Args:
27
+ project_root: Root directory of the project
28
+ """
29
+ self.project_root = Path(project_root)
30
+ self.detector = VersionDetector(project_root)
31
+ self.backup_manager = BackupManager(project_root)
32
+ self.file_migrator = FileMigrator(project_root)
33
+
34
+ def detect_version(self) -> str:
35
+ """
36
+ Detect current project version
37
+
38
+ Returns:
39
+ Version string (e.g., "0.23.0", "0.24.0+", "unknown")
40
+ """
41
+ return self.detector.detect_version()
42
+
43
+ def needs_migration(self) -> bool:
44
+ """
45
+ Check if project needs migration
46
+
47
+ Returns:
48
+ True if migration is needed, False otherwise
49
+ """
50
+ return self.detector.needs_migration()
51
+
52
+ def get_migration_info(self) -> Dict[str, any]:
53
+ """
54
+ Get detailed migration information
55
+
56
+ Returns:
57
+ Dictionary with migration details
58
+ """
59
+ version = self.detector.detect_version()
60
+ needs_migration = self.detector.needs_migration()
61
+ plan = self.detector.get_migration_plan()
62
+
63
+ return {
64
+ "current_version": version,
65
+ "needs_migration": needs_migration,
66
+ "target_version": "0.24.0" if needs_migration else version,
67
+ "migration_plan": plan,
68
+ "file_count": len(plan.get("move", [])),
69
+ }
70
+
71
+ def migrate_to_v024(self, dry_run: bool = False, cleanup: bool = True) -> bool:
72
+ """
73
+ Migrate project from v0.23.0 to v0.24.0
74
+
75
+ Args:
76
+ dry_run: If True, only show what would be done
77
+ cleanup: If True, remove old files after successful migration
78
+
79
+ Returns:
80
+ True if migration was successful, False otherwise
81
+ """
82
+ if not self.needs_migration():
83
+ logger.info("✅ Project is already up to date")
84
+ return True
85
+
86
+ if dry_run:
87
+ logger.info("🔍 DRY RUN MODE - No changes will be made")
88
+ self._show_migration_plan()
89
+ return True
90
+
91
+ logger.info("🚀 Starting migration to v0.24.0...")
92
+
93
+ try:
94
+ # Step 1: Create backup
95
+ logger.info("\n💾 Step 1: Creating backup...")
96
+ backup_path = self.backup_manager.create_backup("pre_v024_migration")
97
+ logger.info(f"✅ Backup created: {backup_path}")
98
+
99
+ # Step 2: Get migration plan
100
+ logger.info("\n📋 Step 2: Analyzing migration requirements...")
101
+ plan = self.detector.get_migration_plan()
102
+ logger.info(f" - {len(plan['create'])} directories to create")
103
+ logger.info(f" - {len(plan['move'])} files to move")
104
+
105
+ # Step 3: Execute migration
106
+ logger.info("\n🔄 Step 3: Executing migration...")
107
+ results = self.file_migrator.execute_migration_plan(plan)
108
+
109
+ if not results["success"]:
110
+ logger.error("❌ Migration failed with errors:")
111
+ for error in results["errors"]:
112
+ logger.error(f" - {error}")
113
+ logger.info(f"\n🔙 Rolling back using backup: {backup_path}")
114
+ self.backup_manager.restore_backup(backup_path)
115
+ return False
116
+
117
+ logger.info("✅ Migration completed successfully!")
118
+ logger.info(f" - {results['created_dirs']} directories created")
119
+ logger.info(f" - {results['moved_files']} files moved")
120
+
121
+ # Step 4: Verify migration
122
+ logger.info("\n🔍 Step 4: Verifying migration...")
123
+ if self._verify_migration():
124
+ logger.info("✅ Verification passed")
125
+
126
+ # Step 5: Cleanup (optional)
127
+ if cleanup:
128
+ logger.info("\n🗑️ Step 5: Cleaning up old files...")
129
+ cleaned = self.file_migrator.cleanup_old_files(plan["cleanup"])
130
+ logger.info(f"✅ Cleaned up {cleaned} old files")
131
+ else:
132
+ logger.info("\n⏭️ Step 5: Skipped cleanup (old files preserved)")
133
+
134
+ logger.info("\n✨ Migration to v0.24.0 completed successfully!")
135
+ return True
136
+ else:
137
+ logger.error("❌ Verification failed")
138
+ logger.info(f"🔙 Rolling back using backup: {backup_path}")
139
+ self.backup_manager.restore_backup(backup_path)
140
+ return False
141
+
142
+ except Exception as e:
143
+ logger.error(f"❌ Migration failed with exception: {e}")
144
+ logger.info("🔙 Attempting rollback...")
145
+ try:
146
+ latest_backup = self.backup_manager.get_latest_backup()
147
+ if latest_backup:
148
+ self.backup_manager.restore_backup(latest_backup)
149
+ logger.info("✅ Rollback completed")
150
+ except Exception as rollback_error:
151
+ logger.error(f"❌ Rollback failed: {rollback_error}")
152
+ return False
153
+
154
+ def _show_migration_plan(self) -> None:
155
+ """Display migration plan without executing"""
156
+ plan = self.detector.get_migration_plan()
157
+
158
+ print("\n📋 Migration Plan:")
159
+ print("\n📁 Directories to create:")
160
+ for directory in plan.get("create", []):
161
+ print(f" + {directory}")
162
+
163
+ print("\n📄 Files to move:")
164
+ for move_op in plan.get("move", []):
165
+ print(f" • {move_op['description']}")
166
+ print(f" {move_op['from']} → {move_op['to']}")
167
+
168
+ print("\n🗑️ Files to cleanup after migration:")
169
+ for cleanup_file in plan.get("cleanup", []):
170
+ print(f" - {cleanup_file}")
171
+
172
+ def _verify_migration(self) -> bool:
173
+ """
174
+ Verify migration was successful
175
+
176
+ Returns:
177
+ True if verification passed
178
+ """
179
+ # Check that new config exists
180
+ new_config = self.project_root / ".moai" / "config" / "config.json"
181
+ if not new_config.exists():
182
+ logger.error("Verification failed: new config.json not found")
183
+ return False
184
+
185
+ # Check that new config directory exists
186
+ config_dir = self.project_root / ".moai" / "config"
187
+ if not config_dir.is_dir():
188
+ logger.error("Verification failed: config directory not found")
189
+ return False
190
+
191
+ logger.debug("All verification checks passed")
192
+ return True
193
+
194
+ def check_status(self) -> Dict[str, any]:
195
+ """
196
+ Check migration status and return detailed information
197
+
198
+ Returns:
199
+ Dictionary with status information
200
+ """
201
+ version_info = self.detector.get_version_info()
202
+ migration_info = self.get_migration_info()
203
+ backups = self.backup_manager.list_backups()
204
+
205
+ return {
206
+ "version": version_info,
207
+ "migration": migration_info,
208
+ "backups": {
209
+ "count": len(backups),
210
+ "latest": backups[0] if backups else None,
211
+ },
212
+ }
213
+
214
+ def rollback_to_latest_backup(self) -> bool:
215
+ """
216
+ Rollback to the most recent backup
217
+
218
+ Returns:
219
+ True if rollback was successful
220
+ """
221
+ latest_backup = self.backup_manager.get_latest_backup()
222
+
223
+ if not latest_backup:
224
+ logger.error("No backup found to rollback to")
225
+ return False
226
+
227
+ logger.info(f"🔙 Rolling back to backup: {latest_backup}")
228
+ return self.backup_manager.restore_backup(latest_backup)
@@ -0,0 +1,6 @@
1
+ """
2
+ Performance optimization module for MoAI-ADK.
3
+
4
+ This module provides parallel processing capabilities and caching systems
5
+ to improve performance of various operations.
6
+ """
@@ -0,0 +1,318 @@
1
+ """
2
+ Cache System
3
+
4
+ Provides persistent caching capabilities with TTL support for improved performance.
5
+ """
6
+
7
+ import json
8
+ import os
9
+ import time
10
+ from typing import Any, Dict, List, Optional
11
+
12
+
13
+ class CacheSystem:
14
+ """
15
+ A persistent cache system with TTL support.
16
+
17
+ This class provides file-based caching with support for time-to-live,
18
+ multiple operations, persistence across instances, and thread safety.
19
+ """
20
+
21
+ def __init__(self, cache_dir: Optional[str] = None, auto_cleanup: bool = True):
22
+ """
23
+ Initialize the cache system.
24
+
25
+ Args:
26
+ cache_dir: Directory to store cache files. If None, uses default temp directory.
27
+ auto_cleanup: Whether to automatically clean up expired files on operations
28
+ """
29
+ self.auto_cleanup = auto_cleanup
30
+
31
+ if cache_dir is None:
32
+ import tempfile
33
+
34
+ self.cache_dir = os.path.join(tempfile.gettempdir(), "moai_adk_cache")
35
+ else:
36
+ self.cache_dir = cache_dir
37
+
38
+ # Cache file extension
39
+ self.file_extension = ".cache"
40
+
41
+ # Create cache directory if it doesn't exist
42
+ self._ensure_cache_dir()
43
+
44
+ def _ensure_cache_dir(self) -> None:
45
+ """Ensure cache directory exists."""
46
+ try:
47
+ os.makedirs(self.cache_dir, exist_ok=True)
48
+ except OSError as e:
49
+ raise OSError(f"Failed to create cache directory {self.cache_dir}: {e}")
50
+
51
+ def _validate_key(self, key: str) -> str:
52
+ """
53
+ Validate and sanitize cache key.
54
+
55
+ Args:
56
+ key: Raw cache key
57
+
58
+ Returns:
59
+ Sanitized key suitable for filename
60
+ """
61
+ if not isinstance(key, str):
62
+ raise TypeError("Cache key must be a string")
63
+
64
+ if not key or key.isspace():
65
+ raise ValueError("Cache key cannot be empty")
66
+
67
+ # Sanitize key for safe filename usage
68
+ safe_key = key.replace("/", "_").replace("\\", "_")
69
+ if safe_key != key:
70
+ return safe_key
71
+
72
+ return key
73
+
74
+ def _get_file_path(self, key: str) -> str:
75
+ """Get file path for a given cache key."""
76
+ safe_key = self._validate_key(key)
77
+ return os.path.join(self.cache_dir, f"{safe_key}{self.file_extension}")
78
+
79
+ def _is_expired(self, data: Dict[str, Any]) -> bool:
80
+ """Check if cache data is expired."""
81
+ if "expires_at" not in data:
82
+ return False
83
+
84
+ return time.time() > data["expires_at"]
85
+
86
+ def _cleanup_expired_files(self) -> None:
87
+ """Remove expired cache files."""
88
+ current_time = time.time()
89
+ for file_name in os.listdir(self.cache_dir):
90
+ if file_name.endswith(self.file_extension):
91
+ file_path = os.path.join(self.cache_dir, file_name)
92
+ try:
93
+ with open(file_path, "r") as f:
94
+ data = json.load(f)
95
+
96
+ if self._is_expired(data):
97
+ os.remove(file_path)
98
+ except (json.JSONDecodeError, KeyError, OSError):
99
+ # Remove corrupted files too
100
+ try:
101
+ os.remove(file_path)
102
+ except OSError:
103
+ pass
104
+
105
+ def _write_data(self, file_path: str, data: Dict[str, Any]) -> None:
106
+ """Write data to file with error handling."""
107
+ try:
108
+ with open(file_path, "w") as f:
109
+ json.dump(data, f, indent=2)
110
+ except (OSError, TypeError) as e:
111
+ raise OSError(f"Failed to write cache file {file_path}: {e}")
112
+
113
+ def _read_data(self, file_path: str) -> Optional[Dict[str, Any]]:
114
+ """Read data from file with error handling."""
115
+ if not os.path.exists(file_path):
116
+ return None
117
+
118
+ try:
119
+ with open(file_path, "r") as f:
120
+ return json.load(f)
121
+ except (json.JSONDecodeError, OSError):
122
+ # File is corrupted, remove it
123
+ try:
124
+ os.remove(file_path)
125
+ except OSError:
126
+ pass
127
+ return None
128
+
129
+ def set(self, key: str, value: Any, ttl: Optional[float] = None) -> None:
130
+ """
131
+ Set a value in the cache.
132
+
133
+ Args:
134
+ key: Cache key
135
+ value: Value to cache (must be JSON serializable)
136
+ ttl: Time to live in seconds (optional)
137
+
138
+ Raises:
139
+ TypeError: If value is not JSON serializable
140
+ OSError: If file operations fail
141
+ """
142
+ # Validate JSON serializability
143
+ try:
144
+ json.dumps(value)
145
+ except (TypeError, ValueError) as e:
146
+ raise TypeError(f"Cache value must be JSON serializable: {e}")
147
+
148
+ data = {"value": value, "created_at": time.time()}
149
+
150
+ if ttl is not None:
151
+ if not isinstance(ttl, (int, float)) or ttl < 0:
152
+ raise ValueError("TTL must be a positive number")
153
+ data["expires_at"] = data["created_at"] + ttl
154
+
155
+ file_path = self._get_file_path(key)
156
+ self._write_data(file_path, data)
157
+
158
+ # Auto-cleanup if enabled
159
+ if self.auto_cleanup:
160
+ self._cleanup_expired_files()
161
+
162
+ def get(self, key: str) -> Optional[Any]:
163
+ """
164
+ Get a value from the cache.
165
+
166
+ Args:
167
+ key: Cache key
168
+
169
+ Returns:
170
+ Cached value or None if not found or expired
171
+ """
172
+ file_path = self._get_file_path(key)
173
+ data = self._read_data(file_path)
174
+
175
+ if data is None:
176
+ return None
177
+
178
+ # Check expiration
179
+ if self._is_expired(data):
180
+ try:
181
+ os.remove(file_path)
182
+ except OSError:
183
+ pass
184
+ return None
185
+
186
+ return data["value"]
187
+
188
+ def delete(self, key: str) -> bool:
189
+ """
190
+ Delete a value from the cache.
191
+
192
+ Args:
193
+ key: Cache key
194
+
195
+ Returns:
196
+ True if file was deleted, False if it didn't exist
197
+ """
198
+ file_path = self._get_file_path(key)
199
+ try:
200
+ os.remove(file_path)
201
+ return True
202
+ except OSError:
203
+ return False
204
+
205
+ def clear(self) -> int:
206
+ """
207
+ Clear all values from the cache.
208
+
209
+ Returns:
210
+ Number of files removed
211
+ """
212
+ count = 0
213
+ for file_name in os.listdir(self.cache_dir):
214
+ if file_name.endswith(self.file_extension):
215
+ file_path = os.path.join(self.cache_dir, file_name)
216
+ try:
217
+ os.remove(file_path)
218
+ count += 1
219
+ except OSError:
220
+ continue
221
+ return count
222
+
223
+ def exists(self, key: str) -> bool:
224
+ """
225
+ Check if a key exists in the cache.
226
+
227
+ Args:
228
+ key: Cache key
229
+
230
+ Returns:
231
+ True if key exists and is not expired, False otherwise
232
+ """
233
+ return self.get(key) is not None
234
+
235
+ def size(self) -> int:
236
+ """
237
+ Get the number of items in the cache.
238
+
239
+ Returns:
240
+ Number of non-expired cache items
241
+ """
242
+ count = 0
243
+ for file_name in os.listdir(self.cache_dir):
244
+ if file_name.endswith(self.file_extension):
245
+ file_path = os.path.join(self.cache_dir, file_name)
246
+ key = file_name[: -len(self.file_extension)] # Remove extension
247
+
248
+ if self.exists(key):
249
+ count += 1
250
+ return count
251
+
252
+ def set_if_not_exists(
253
+ self, key: str, value: Any, ttl: Optional[float] = None
254
+ ) -> bool:
255
+ """
256
+ Set a value only if the key doesn't exist.
257
+
258
+ Args:
259
+ key: Cache key
260
+ value: Value to cache
261
+ ttl: Time to live in seconds (optional)
262
+
263
+ Returns:
264
+ True if value was set, False if key already existed
265
+ """
266
+ if self.exists(key):
267
+ return False
268
+
269
+ self.set(key, value, ttl)
270
+ return True
271
+
272
+ def get_multiple(self, keys: List[str]) -> Dict[str, Optional[Any]]:
273
+ """
274
+ Get multiple values from the cache.
275
+
276
+ Args:
277
+ keys: List of cache keys
278
+
279
+ Returns:
280
+ Dictionary mapping keys to values (or None)
281
+ """
282
+ if not isinstance(keys, list):
283
+ raise TypeError("keys must be a list")
284
+
285
+ result = {}
286
+ for key in keys:
287
+ if not isinstance(key, str):
288
+ raise TypeError("All keys must be strings")
289
+ result[key] = self.get(key)
290
+ return result
291
+
292
+ def get_stats(self) -> Dict[str, Any]:
293
+ """
294
+ Get cache statistics.
295
+
296
+ Returns:
297
+ Dictionary with cache statistics
298
+ """
299
+ total_files = 0
300
+ expired_files = 0
301
+ current_time = time.time()
302
+
303
+ for file_name in os.listdir(self.cache_dir):
304
+ if file_name.endswith(self.file_extension):
305
+ total_files += 1
306
+ file_path = os.path.join(self.cache_dir, file_name)
307
+ data = self._read_data(file_path)
308
+
309
+ if data and self._is_expired(data):
310
+ expired_files += 1
311
+
312
+ return {
313
+ "total_files": total_files,
314
+ "expired_files": expired_files,
315
+ "valid_files": total_files - expired_files,
316
+ "cache_directory": self.cache_dir,
317
+ "auto_cleanup_enabled": self.auto_cleanup,
318
+ }
@@ -0,0 +1,116 @@
1
+ """
2
+ Parallel Processing Core
3
+
4
+ Provides efficient parallel processing capabilities for concurrent task execution.
5
+ """
6
+
7
+ import asyncio
8
+ from typing import Any, Callable, Coroutine, Dict, List, Optional, Union
9
+
10
+
11
+ class ParallelProcessor:
12
+ """
13
+ A parallel processor for executing tasks concurrently with configurable limits.
14
+
15
+ This class provides a high-level interface for running multiple async tasks
16
+ in parallel with optional progress tracking and error handling.
17
+ """
18
+
19
+ def __init__(self, max_workers: Optional[int] = None):
20
+ """
21
+ Initialize the parallel processor.
22
+
23
+ Args:
24
+ max_workers: Maximum number of concurrent tasks. If None, defaults to CPU count.
25
+ """
26
+ self.max_workers = max_workers
27
+
28
+ async def process_tasks(
29
+ self,
30
+ tasks: List[Callable],
31
+ progress_callback: Optional[Callable[[int, int], None]] = None,
32
+ ) -> List[Dict[str, Any]]:
33
+ """
34
+ Process multiple tasks concurrently.
35
+
36
+ Args:
37
+ tasks: List of async task functions or coroutines to execute
38
+ progress_callback: Optional callback for progress updates (completed, total)
39
+
40
+ Returns:
41
+ List of results from all completed tasks in the same order as input
42
+
43
+ Raises:
44
+ Exception: If any task raises an exception
45
+ """
46
+ if not tasks:
47
+ return []
48
+
49
+ results = []
50
+ completed_count = 0
51
+
52
+ # Validate input
53
+ self._validate_tasks(tasks)
54
+
55
+ # Initialize progress tracking
56
+ self._update_progress(progress_callback, completed_count, len(tasks))
57
+
58
+ # Process tasks concurrently
59
+ for task in tasks:
60
+ try:
61
+ # Get coroutine from task
62
+ coroutine = self._get_coroutine(task)
63
+
64
+ # Execute the task and get result
65
+ result = await coroutine
66
+ results.append(result)
67
+ completed_count += 1
68
+
69
+ # Update progress
70
+ self._update_progress(progress_callback, completed_count, len(tasks))
71
+
72
+ except Exception as e:
73
+ # Add context to the exception
74
+ raise type(e)(f"Task failed: {str(e)}") from e
75
+
76
+ return results
77
+
78
+ def _validate_tasks(self, tasks: List[Callable]) -> None:
79
+ """Validate that all tasks are callable or coroutines."""
80
+ if not isinstance(tasks, list):
81
+ raise TypeError("tasks must be a list")
82
+
83
+ for i, task in enumerate(tasks):
84
+ if not callable(task) and not asyncio.iscoroutine(task):
85
+ raise TypeError(f"Task at index {i} is not callable or a coroutine")
86
+
87
+ def _get_coroutine(self, task: Union[Callable, Coroutine]) -> Coroutine:
88
+ """Extract coroutine from task function or return coroutine directly."""
89
+ if asyncio.iscoroutine(task):
90
+ return task
91
+
92
+ if callable(task):
93
+ try:
94
+ result = task()
95
+ if asyncio.iscoroutine(result):
96
+ return result
97
+ else:
98
+ raise TypeError("Task function must return a coroutine")
99
+ except Exception as e:
100
+ raise TypeError(f"Failed to execute task function: {str(e)}")
101
+
102
+ raise TypeError(f"Task must be callable or a coroutine, got {type(task)}")
103
+
104
+ def _update_progress(
105
+ self,
106
+ progress_callback: Optional[Callable[[int, int], None]],
107
+ completed: int,
108
+ total: int,
109
+ ) -> None:
110
+ """Update progress callback if provided."""
111
+ if progress_callback is not None:
112
+ try:
113
+ progress_callback(completed, total)
114
+ except Exception as e:
115
+ # Log progress callback error but don't fail the entire process
116
+ print(f"Warning: Progress callback failed: {str(e)}")
@@ -1,2 +1 @@
1
- # @CODE:PY314-001 | SPEC: SPEC-PY314-001.md | TEST: tests/unit/test_foundation.py
2
1
  """Project module: initialization and management"""
@@ -1,4 +1,3 @@
1
- # @CODE:INIT-003:BACKUP | SPEC: .moai/specs/SPEC-INIT-003/spec.md | TEST: tests/unit/test_backup_utils.py
2
1
  """Backup utility module (SPEC-INIT-003 v0.3.0)
3
2
 
4
3
  Selective backup strategy:
@@ -10,7 +9,7 @@ from pathlib import Path
10
9
 
11
10
  # Backup targets (OR condition - back up when any exist)
12
11
  BACKUP_TARGETS = [
13
- ".moai/config.json",
12
+ ".moai/config/config.json",
14
13
  ".moai/project/",
15
14
  ".moai/memory/",
16
15
  ".claude/",
@@ -58,8 +57,6 @@ def get_backup_targets(project_path: Path) -> list[str]:
58
57
  return targets
59
58
 
60
59
 
61
-
62
-
63
60
  def is_protected_path(rel_path: Path) -> bool:
64
61
  """Check whether the path is protected.
65
62
 
@@ -70,6 +67,4 @@ def is_protected_path(rel_path: Path) -> bool:
70
67
  True when the path should be excluded from backups.
71
68
  """
72
69
  rel_str = str(rel_path).replace("\\", "/")
73
- return any(
74
- rel_str.startswith(p.lstrip("./").rstrip("/")) for p in PROTECTED_PATHS
75
- )
70
+ return any(rel_str.startswith(p.lstrip("./").rstrip("/")) for p in PROTECTED_PATHS)