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

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

Potentially problematic release.


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

Files changed (378) hide show
  1. moai_adk/__init__.py +2 -5
  2. moai_adk/__main__.py +114 -82
  3. moai_adk/cli/__init__.py +6 -1
  4. moai_adk/cli/commands/__init__.py +1 -3
  5. moai_adk/cli/commands/analyze.py +5 -16
  6. moai_adk/cli/commands/doctor.py +6 -18
  7. moai_adk/cli/commands/init.py +56 -125
  8. moai_adk/cli/commands/language.py +14 -35
  9. moai_adk/cli/commands/status.py +9 -15
  10. moai_adk/cli/commands/update.py +1555 -190
  11. moai_adk/cli/prompts/init_prompts.py +112 -56
  12. moai_adk/cli/spec_status.py +263 -0
  13. moai_adk/cli/ui/__init__.py +44 -0
  14. moai_adk/cli/ui/progress.py +422 -0
  15. moai_adk/cli/ui/prompts.py +389 -0
  16. moai_adk/cli/ui/theme.py +129 -0
  17. moai_adk/cli/worktree/__init__.py +27 -0
  18. moai_adk/cli/worktree/__main__.py +31 -0
  19. moai_adk/cli/worktree/cli.py +672 -0
  20. moai_adk/cli/worktree/exceptions.py +89 -0
  21. moai_adk/cli/worktree/manager.py +490 -0
  22. moai_adk/cli/worktree/models.py +65 -0
  23. moai_adk/cli/worktree/registry.py +128 -0
  24. moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
  25. moai_adk/core/analysis/session_analyzer.py +17 -56
  26. moai_adk/core/claude_integration.py +26 -54
  27. moai_adk/core/command_helpers.py +10 -10
  28. moai_adk/core/comprehensive_monitoring_system.py +1183 -0
  29. moai_adk/core/config/auto_spec_config.py +5 -11
  30. moai_adk/core/config/migration.py +19 -9
  31. moai_adk/core/config/unified.py +436 -0
  32. moai_adk/core/context_manager.py +6 -12
  33. moai_adk/core/enterprise_features.py +1404 -0
  34. moai_adk/core/error_recovery_system.py +725 -112
  35. moai_adk/core/event_driven_hook_system.py +1371 -0
  36. moai_adk/core/git/__init__.py +8 -0
  37. moai_adk/core/git/branch_manager.py +3 -11
  38. moai_adk/core/git/checkpoint.py +1 -3
  39. moai_adk/core/git/conflict_detector.py +413 -0
  40. moai_adk/core/git/manager.py +91 -1
  41. moai_adk/core/hooks/post_tool_auto_spec_completion.py +56 -80
  42. moai_adk/core/input_validation_middleware.py +1006 -0
  43. moai_adk/core/integration/engine.py +6 -18
  44. moai_adk/core/integration/integration_tester.py +10 -9
  45. moai_adk/core/integration/utils.py +1 -1
  46. moai_adk/core/issue_creator.py +10 -28
  47. moai_adk/core/jit_context_loader.py +956 -0
  48. moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
  49. moai_adk/core/language_config_resolver.py +485 -0
  50. moai_adk/core/language_validator.py +28 -41
  51. moai_adk/core/mcp/setup.py +15 -12
  52. moai_adk/core/merge/__init__.py +9 -0
  53. moai_adk/core/merge/analyzer.py +481 -0
  54. moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
  55. moai_adk/core/migration/backup_manager.py +78 -9
  56. moai_adk/core/migration/custom_element_scanner.py +358 -0
  57. moai_adk/core/migration/file_migrator.py +8 -17
  58. moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
  59. moai_adk/core/migration/selective_restorer.py +470 -0
  60. moai_adk/core/migration/template_utils.py +74 -0
  61. moai_adk/core/migration/user_selection_ui.py +338 -0
  62. moai_adk/core/migration/version_detector.py +6 -10
  63. moai_adk/core/migration/version_migrator.py +3 -3
  64. moai_adk/core/performance/cache_system.py +8 -10
  65. moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
  66. moai_adk/core/project/checker.py +2 -4
  67. moai_adk/core/project/detector.py +1 -3
  68. moai_adk/core/project/initializer.py +135 -23
  69. moai_adk/core/project/phase_executor.py +54 -81
  70. moai_adk/core/project/validator.py +6 -12
  71. moai_adk/core/quality/trust_checker.py +9 -27
  72. moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
  73. moai_adk/core/robust_json_parser.py +611 -0
  74. moai_adk/core/rollback_manager.py +73 -148
  75. moai_adk/core/session_manager.py +10 -26
  76. moai_adk/core/skill_loading_system.py +579 -0
  77. moai_adk/core/spec/confidence_scoring.py +31 -100
  78. moai_adk/core/spec/ears_template_engine.py +351 -286
  79. moai_adk/core/spec/quality_validator.py +35 -69
  80. moai_adk/core/spec_status_manager.py +64 -74
  81. moai_adk/core/template/backup.py +45 -20
  82. moai_adk/core/template/config.py +112 -39
  83. moai_adk/core/template/merger.py +11 -19
  84. moai_adk/core/template/processor.py +253 -149
  85. moai_adk/core/template_engine.py +73 -40
  86. moai_adk/core/template_variable_synchronizer.py +417 -0
  87. moai_adk/core/unified_permission_manager.py +745 -0
  88. moai_adk/core/user_behavior_analytics.py +851 -0
  89. moai_adk/core/version_sync.py +429 -0
  90. moai_adk/foundation/__init__.py +56 -0
  91. moai_adk/foundation/backend.py +1027 -0
  92. moai_adk/foundation/database.py +1115 -0
  93. moai_adk/foundation/devops.py +1585 -0
  94. moai_adk/foundation/ears.py +431 -0
  95. moai_adk/foundation/frontend.py +870 -0
  96. moai_adk/foundation/git/commit_templates.py +4 -12
  97. moai_adk/foundation/git.py +376 -0
  98. moai_adk/foundation/langs.py +484 -0
  99. moai_adk/foundation/ml_ops.py +1162 -0
  100. moai_adk/foundation/testing.py +1524 -0
  101. moai_adk/foundation/trust/trust_principles.py +23 -72
  102. moai_adk/foundation/trust/validation_checklist.py +57 -162
  103. moai_adk/project/__init__.py +0 -0
  104. moai_adk/project/configuration.py +1084 -0
  105. moai_adk/project/documentation.py +566 -0
  106. moai_adk/project/schema.py +447 -0
  107. moai_adk/statusline/alfred_detector.py +1 -3
  108. moai_adk/statusline/config.py +13 -4
  109. moai_adk/statusline/enhanced_output_style_detector.py +23 -15
  110. moai_adk/statusline/main.py +51 -15
  111. moai_adk/statusline/renderer.py +104 -48
  112. moai_adk/statusline/update_checker.py +3 -9
  113. moai_adk/statusline/version_reader.py +140 -46
  114. moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
  115. moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
  116. moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
  117. moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
  118. moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
  119. moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
  120. moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
  121. moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
  122. moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
  123. moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
  124. moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
  125. moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
  126. moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
  127. moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
  128. moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
  129. moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
  130. moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
  131. moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
  132. moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
  133. moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
  134. moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
  135. moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
  136. moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
  137. moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
  138. moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
  139. moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
  140. moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
  141. moai_adk/templates/.claude/commands/moai/3-sync.md +993 -0
  142. moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
  143. moai_adk/templates/.claude/hooks/__init__.py +8 -0
  144. moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
  145. moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
  146. moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
  147. moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
  148. moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
  149. moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
  150. moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
  151. moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
  152. moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
  153. moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
  154. moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
  155. moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
  156. moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
  157. moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
  158. moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
  159. moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
  160. moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +921 -0
  161. moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
  162. moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
  163. moai_adk/templates/.claude/settings.json +172 -0
  164. moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -0
  165. moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
  166. moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
  167. moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
  168. moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
  169. moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
  170. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +319 -0
  171. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +320 -0
  172. moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
  173. moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
  174. moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
  175. moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
  176. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +496 -0
  177. moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -0
  178. moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
  179. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
  180. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
  181. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
  182. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
  183. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
  184. moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
  185. moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +491 -0
  186. moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
  187. moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
  188. moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
  189. moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
  190. moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
  191. moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
  192. moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +201 -0
  193. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
  194. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
  195. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
  196. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
  197. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
  198. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
  199. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
  200. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
  201. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
  202. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
  203. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
  204. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
  205. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
  206. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
  207. moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +438 -0
  208. moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -0
  209. moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
  210. moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +346 -0
  211. moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
  212. moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
  213. moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
  214. moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
  215. moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
  216. moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
  217. moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
  218. moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
  219. moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +362 -0
  220. moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
  221. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
  222. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
  223. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
  224. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
  225. moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
  226. moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
  227. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
  228. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
  229. moai_adk/templates/.claude/skills/moai-integration-mcp/SKILL.md +352 -0
  230. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
  231. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
  232. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
  233. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
  234. moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
  235. moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
  236. moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
  237. moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
  238. moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
  239. moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -0
  240. moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
  241. moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
  242. moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
  243. moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
  244. moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +316 -0
  245. moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
  246. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
  247. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
  248. moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
  249. moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
  250. moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
  251. moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
  252. moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
  253. moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
  254. moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
  255. moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +370 -0
  256. moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
  257. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
  258. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
  259. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
  260. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
  261. moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
  262. moai_adk/templates/.claude/skills/moai-platform-baas/README.md +186 -0
  263. moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
  264. moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
  265. moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
  266. moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
  267. moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
  268. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
  269. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
  270. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
  271. moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
  272. moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -0
  273. moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
  274. moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
  275. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
  276. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
  277. moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
  278. moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +135 -0
  279. moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
  280. moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
  281. moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
  282. moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
  283. moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
  284. moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
  285. moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
  286. moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
  287. moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
  288. moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
  289. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
  290. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -0
  291. moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
  292. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
  293. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
  294. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +71 -0
  295. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
  296. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
  297. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
  298. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
  299. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
  300. moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
  301. moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +374 -0
  302. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
  303. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
  304. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
  305. moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
  306. moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -0
  307. moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
  308. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
  309. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
  310. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
  311. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
  312. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
  313. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
  314. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
  315. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
  316. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
  317. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
  318. moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
  319. moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
  320. moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
  321. moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
  322. moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
  323. moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +410 -0
  324. moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
  325. moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
  326. moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
  327. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
  328. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
  329. moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
  330. moai_adk/templates/.git-hooks/pre-commit +103 -41
  331. moai_adk/templates/.git-hooks/pre-push +116 -21
  332. moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
  333. moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
  334. moai_adk/templates/.gitignore +184 -44
  335. moai_adk/templates/.mcp.json +7 -9
  336. moai_adk/templates/.moai/cache/personalization.json +10 -0
  337. moai_adk/templates/.moai/config/config.yaml +344 -0
  338. moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
  339. moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
  340. moai_adk/templates/.moai/config/presets/team.yaml +33 -0
  341. moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
  342. moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
  343. moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
  344. moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
  345. moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
  346. moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
  347. moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -0
  348. moai_adk/templates/.moai/config/sections/language.yaml +11 -0
  349. moai_adk/templates/.moai/config/sections/project.yaml +13 -0
  350. moai_adk/templates/.moai/config/sections/quality.yaml +15 -0
  351. moai_adk/templates/.moai/config/sections/system.yaml +14 -0
  352. moai_adk/templates/.moai/config/sections/user.yaml +5 -0
  353. moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
  354. moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
  355. moai_adk/templates/CLAUDE.md +382 -501
  356. moai_adk/utils/__init__.py +24 -1
  357. moai_adk/utils/banner.py +7 -10
  358. moai_adk/utils/common.py +16 -30
  359. moai_adk/utils/link_validator.py +4 -12
  360. moai_adk/utils/safe_file_reader.py +2 -6
  361. moai_adk/utils/timeout.py +160 -0
  362. moai_adk/utils/toon_utils.py +256 -0
  363. moai_adk/version.py +22 -0
  364. moai_adk-0.32.8.dist-info/METADATA +2478 -0
  365. moai_adk-0.32.8.dist-info/RECORD +396 -0
  366. {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
  367. {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
  368. moai_adk/cli/commands/backup.py +0 -82
  369. moai_adk/cli/commands/improve_user_experience.py +0 -348
  370. moai_adk/cli/commands/migrate.py +0 -158
  371. moai_adk/cli/commands/validate_links.py +0 -118
  372. moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -413
  373. moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
  374. moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
  375. moai_adk/utils/user_experience.py +0 -531
  376. moai_adk-0.25.4.dist-info/METADATA +0 -2279
  377. moai_adk-0.25.4.dist-info/RECORD +0 -112
  378. {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,338 @@
1
+ """User Selection UI for MoAI-ADK Custom Element Restoration
2
+
3
+ This module provides enhanced CLI-based user interface for selecting custom elements
4
+ to restore from backup during MoAI-ADK updates. It features:
5
+
6
+ - Interactive checkbox selection with arrow key navigation (preferred)
7
+ - Fallback to numbered selection when curses is not available
8
+ - Category grouping (Agents, Commands, Skills, Hooks)
9
+ - Proper element preservation (unselected elements remain intact)
10
+ """
11
+
12
+ from pathlib import Path
13
+ from typing import Any, Dict, List, Optional
14
+
15
+ from .custom_element_scanner import create_custom_element_scanner
16
+
17
+
18
+ class UserSelectionUI:
19
+ """Enhanced CLI-based user interface for selecting custom elements to restore.
20
+
21
+ This class provides an improved CLI interface with interactive checkbox selection
22
+ when available, falling back to numbered selection when curses is not supported.
23
+ It properly preserves unselected elements and includes all categories.
24
+ """
25
+
26
+ def __init__(self, project_path: str | Path):
27
+ """Initialize the user selection UI.
28
+
29
+ Args:
30
+ project_path: Path to the MoAI-ADK project directory
31
+ """
32
+ self.project_path = Path(project_path).resolve()
33
+ self.scanner = create_custom_element_scanner(self.project_path)
34
+
35
+ # Try to import interactive UI, fall back to basic UI if not available
36
+ try:
37
+ from .interactive_checkbox_ui import create_interactive_checkbox_ui
38
+
39
+ self.interactive_ui = create_interactive_checkbox_ui(self.project_path)
40
+ self.use_interactive = True
41
+ except Exception:
42
+ self.interactive_ui = None
43
+ self.use_interactive = False
44
+
45
+ def prompt_user_selection(self, backup_available: bool = True) -> Optional[List[str]]:
46
+ """Prompt user to select custom elements for restoration.
47
+
48
+ Args:
49
+ backup_available: Whether backup is available for restoration
50
+
51
+ Returns:
52
+ List of selected element paths, or None if no selection made
53
+ or no elements available
54
+
55
+ Example:
56
+ >>> ui = UserSelectionUI("/project")
57
+ >>> selected = ui.prompt_user_selection()
58
+ >>> print(f"Selected {len(selected)} elements")
59
+ """
60
+ # Try interactive UI first
61
+ if self.use_interactive and self.interactive_ui:
62
+ try:
63
+ return self.interactive_ui.prompt_user_selection(backup_available)
64
+ except Exception as e:
65
+ print(f"⚠️ Interactive UI failed: {e}")
66
+ print("Falling back to basic selection mode...")
67
+
68
+ # Fallback to basic selection
69
+ return self._basic_selection_mode(backup_available)
70
+
71
+ def _basic_selection_mode(self, backup_available: bool) -> Optional[List[str]]:
72
+ """Basic numbered selection mode (fallback when interactive UI not available).
73
+
74
+ Args:
75
+ backup_available: Whether backup is available for restoration
76
+
77
+ Returns:
78
+ List of selected element paths, or None if cancelled
79
+ """
80
+ # Get custom elements organized by category
81
+ elements_by_category = self._get_elements_by_category()
82
+
83
+ # No custom elements found
84
+ if not any(elements_by_category.values()):
85
+ print("\n✅ No custom elements found in project.")
86
+ print(" All elements are part of the official MoAI-ADK template.")
87
+ return None
88
+
89
+ # Display elements by category
90
+ print("\n" + "=" * 60)
91
+ print("🔍 Custom Elements Detected (Basic Mode)")
92
+ print("=" * 60)
93
+ print("These elements are not part of the official MoAI-ADK template:")
94
+ print()
95
+
96
+ element_index = 1
97
+ element_map = {} # Map index to element path
98
+
99
+ for category, elements in elements_by_category.items():
100
+ if not elements:
101
+ continue
102
+
103
+ print(f"\n📁 {category} ({len(elements)}):")
104
+ for element in elements:
105
+ status = "✓ Available" if backup_available else "⚠ No backup"
106
+ print(f" {element_index:2d}. {element['name']:<35} {status}")
107
+ element_map[element_index] = element["path"]
108
+ element_index += 1
109
+
110
+ # Show selection instructions
111
+ print()
112
+ if not backup_available:
113
+ print("⚠️ No backup available. Cannot restore custom elements.")
114
+ print("💡 Run 'moai-adk update' without --force to create a backup first.")
115
+ return None
116
+
117
+ print("💡 Selection Instructions:")
118
+ print(" • Enter numbers separated by commas (e.g., 1,3,5)")
119
+ print(" • Use 'all' to select all elements")
120
+ print(" • Press Enter with empty input to cancel")
121
+
122
+ # Get user input
123
+ try:
124
+ user_input = input("\nSelect elements to restore: ").strip()
125
+ except (KeyboardInterrupt, EOFError):
126
+ print("\n⚠️ Selection cancelled.")
127
+ return None
128
+
129
+ # Process user input
130
+ if not user_input:
131
+ print("No elements selected.")
132
+ return None
133
+
134
+ # Check for "all" shortcut
135
+ if user_input.lower() == "all":
136
+ all_elements = list(element_map.values())
137
+ # Ask for confirmation when selecting all elements
138
+ if self.confirm_selection(all_elements):
139
+ return all_elements
140
+ else:
141
+ return None
142
+
143
+ # Parse numbered selection
144
+ selected_elements = []
145
+ try:
146
+ indices = [int(x.strip()) for x in user_input.split(",") if x.strip()]
147
+ for idx in indices:
148
+ if idx in element_map:
149
+ selected_elements.append(element_map[idx])
150
+ else:
151
+ print(f"⚠️ Invalid number: {idx}")
152
+ except ValueError:
153
+ print("⚠️ Invalid input. Please enter numbers separated by commas.")
154
+ return None
155
+
156
+ if not selected_elements:
157
+ print("No valid selections made.")
158
+ return None
159
+
160
+ # Ask for confirmation
161
+ if self.confirm_selection(selected_elements):
162
+ return selected_elements
163
+ else:
164
+ return None
165
+
166
+ def _get_elements_by_category(self) -> Dict[str, List[Dict]]:
167
+ """Organize custom elements by category.
168
+
169
+ Returns:
170
+ Dictionary mapping category names to lists of elements
171
+ """
172
+ custom_elements = self.scanner.scan_custom_elements()
173
+ organized: Dict[str, List[Dict[str, Any]]] = {
174
+ "Agents": [],
175
+ "Commands": [],
176
+ "Skills": [],
177
+ "Hooks": [],
178
+ }
179
+
180
+ # Add skills (which are directories)
181
+ if "skills" in custom_elements:
182
+ for skill in custom_elements["skills"]:
183
+ organized["Skills"].append({"name": skill.name, "path": str(skill.path), "type": "skill"})
184
+
185
+ # Add file-based elements
186
+ for element_type in ["agents", "commands", "hooks"]:
187
+ if element_type in custom_elements:
188
+ category_name = element_type.capitalize()
189
+ for element_path in custom_elements[element_type]:
190
+ element_name = Path(element_path).name
191
+ organized[category_name].append(
192
+ {
193
+ "name": element_name,
194
+ "path": str(element_path),
195
+ "type": element_type.rstrip("s"), # Remove plural 's'
196
+ }
197
+ )
198
+
199
+ return organized
200
+
201
+ def _parse_selection(self, user_input: str, custom_elements: List[Dict[str, str]]) -> List[str]:
202
+ """Parse user selection input with enhanced support for multiple separators.
203
+
204
+ Args:
205
+ user_input: User's input string (can use commas, spaces, semicolons, etc.)
206
+ custom_elements: List of available custom elements
207
+
208
+ Returns:
209
+ List of selected element paths
210
+ """
211
+ selected_paths = []
212
+
213
+ # Enhanced parsing: handle multiple separator types (comma, space, semicolon, backslash)
214
+ import re
215
+
216
+ # Split by common separators and clean up
217
+ selections = re.split(r"[,\s;\\]+", user_input.strip())
218
+ selections = [s.strip() for s in selections if s.strip()]
219
+
220
+ for selection in selections:
221
+ try:
222
+ # Parse as number
223
+ index = int(selection)
224
+ # Find element with this index (1-based)
225
+ for element in custom_elements:
226
+ if element["index"] == index:
227
+ selected_paths.append(element["path"])
228
+ break
229
+ else:
230
+ print(f"⚠️ Invalid selection: {selection} (not in available list)")
231
+ except ValueError:
232
+ # Try to parse as element name (for enhanced UX)
233
+ found = False
234
+ for element in custom_elements:
235
+ if (
236
+ selection.lower() in element["name"].lower()
237
+ or selection.lower() in element["display_name"].lower()
238
+ ):
239
+ selected_paths.append(element["path"])
240
+ found = True
241
+ break
242
+
243
+ if not found:
244
+ print(f"⚠️ Invalid selection: {selection} (not a number or matching element name)")
245
+
246
+ return selected_paths
247
+
248
+ def confirm_selection(self, selected_elements: List[str]) -> bool:
249
+ """Confirm user's selection before proceeding with restoration.
250
+
251
+ Args:
252
+ selected_elements: List of selected element paths
253
+
254
+ Returns:
255
+ True if user confirms, False otherwise
256
+ """
257
+ print("\n📋 Selection Summary:")
258
+ print("-" * 40)
259
+ for i, element_path in enumerate(selected_elements, 1):
260
+ element_name = Path(element_path).name
261
+ element_type = self._get_element_type(element_path)
262
+ print(f" {i}. {element_name} ({element_type})")
263
+
264
+ print("-" * 40)
265
+ print(f"Total elements selected: {len(selected_elements)}")
266
+
267
+ try:
268
+ confirm = input("\nConfirm restoration? (y/N): ").strip().lower()
269
+ return confirm in ["y", "yes", ""]
270
+ except (KeyboardInterrupt, EOFError):
271
+ print("\n⚠️ Restoration cancelled.")
272
+ return False
273
+
274
+ def _get_element_type(self, element_path: str) -> str:
275
+ """Get element type from path.
276
+
277
+ Args:
278
+ element_path: Path to element
279
+
280
+ Returns:
281
+ Element type string (agent, command, skill, hook)
282
+ """
283
+ path = Path(element_path)
284
+ parts = path.parts
285
+
286
+ if "agents" in parts:
287
+ return "agent"
288
+ elif "commands" in parts:
289
+ return "command"
290
+ elif "skills" in parts:
291
+ return "skill"
292
+ elif "hooks" in parts:
293
+ return "hook"
294
+ else:
295
+ return "unknown"
296
+
297
+
298
+ def display_selection_instructions():
299
+ """Display instructions for using the enhanced selection interface."""
300
+ print(
301
+ """
302
+ 📖 Enhanced Selection Instructions:
303
+ • Enter numbers separated by spaces, commas, semicolons (e.g., 1 3,4 or 1;3\\4)
304
+ • Use 'all' to select all elements
305
+ • Try partial names for convenience (e.g., 'yoda' or 'agent')
306
+ • Press Enter with empty input to cancel
307
+ • Use Ctrl+C to interrupt selection
308
+
309
+ 📂 Element Types:
310
+ • agent: Custom agent for specific tasks
311
+ • command: Custom slash command for workflows
312
+ • skill: Custom skill with enhanced capabilities
313
+ • hook: Custom hook for system integration
314
+
315
+ 💡 Pro Tips:
316
+ • Mixed separators work: "1,3;5\\7"
317
+ • Partial name matching: "my-agen" matches "my-agent"
318
+ • Case insensitive: "YODA" matches "yoda"
319
+ """
320
+ )
321
+
322
+
323
+ def create_user_selection_ui(project_path: str | Path) -> UserSelectionUI:
324
+ """Factory function to create a UserSelectionUI.
325
+
326
+ Args:
327
+ project_path: Path to the MoAI-ADK project directory
328
+
329
+ Returns:
330
+ Configured UserSelectionUI instance
331
+
332
+ Example:
333
+ >>> ui = create_user_selection_ui("/path/to/project")
334
+ >>> selected = ui.prompt_user_selection()
335
+ >>> if selected:
336
+ >>> ui.confirm_selection(selected)
337
+ """
338
+ return UserSelectionUI(Path(project_path).resolve())
@@ -8,7 +8,7 @@ which migrations are needed.
8
8
  import json
9
9
  import logging
10
10
  from pathlib import Path
11
- from typing import Dict, List, Optional
11
+ from typing import Any, Dict
12
12
 
13
13
  logger = logging.getLogger(__name__)
14
14
 
@@ -27,9 +27,7 @@ class VersionDetector:
27
27
  self.old_config = self.project_root / ".moai" / "config.json"
28
28
  self.new_config = self.project_root / ".moai" / "config" / "config.json"
29
29
  self.old_statusline = self.project_root / ".claude" / "statusline-config.yaml"
30
- self.new_statusline = (
31
- self.project_root / ".moai" / "config" / "statusline-config.yaml"
32
- )
30
+ self.new_statusline = self.project_root / ".moai" / "config" / "statusline-config.yaml"
33
31
 
34
32
  def detect_version(self) -> str:
35
33
  """
@@ -76,7 +74,7 @@ class VersionDetector:
76
74
  # Version 0.23.0 or earlier needs migration
77
75
  return True
78
76
 
79
- def get_migration_plan(self) -> Dict[str, List[Dict[str, str]]]:
77
+ def get_migration_plan(self) -> Dict[str, Any]:
80
78
  """
81
79
  Get detailed migration plan
82
80
 
@@ -88,7 +86,7 @@ class VersionDetector:
88
86
  "cleanup": ["old_file1", "old_file2"]
89
87
  }
90
88
  """
91
- plan = {"move": [], "create": [], "cleanup": []}
89
+ plan: Dict[str, Any] = {"move": [], "create": [], "cleanup": []}
92
90
 
93
91
  if not self.needs_migration():
94
92
  return plan
@@ -120,13 +118,11 @@ class VersionDetector:
120
118
  if self.old_config.exists():
121
119
  plan["cleanup"].append(str(self.old_config.relative_to(self.project_root)))
122
120
  if self.old_statusline.exists():
123
- plan["cleanup"].append(
124
- str(self.old_statusline.relative_to(self.project_root))
125
- )
121
+ plan["cleanup"].append(str(self.old_statusline.relative_to(self.project_root)))
126
122
 
127
123
  return plan
128
124
 
129
- def get_version_info(self) -> Dict[str, Optional[str]]:
125
+ def get_version_info(self) -> Dict[str, Any]:
130
126
  """
131
127
  Get detailed version information
132
128
 
@@ -7,7 +7,7 @@ and cleanup processes for automatic project upgrades.
7
7
 
8
8
  import logging
9
9
  from pathlib import Path
10
- from typing import Dict
10
+ from typing import Any, Dict
11
11
 
12
12
  from .backup_manager import BackupManager
13
13
  from .file_migrator import FileMigrator
@@ -49,7 +49,7 @@ class VersionMigrator:
49
49
  """
50
50
  return self.detector.needs_migration()
51
51
 
52
- def get_migration_info(self) -> Dict[str, any]:
52
+ def get_migration_info(self) -> Dict[str, Any]:
53
53
  """
54
54
  Get detailed migration information
55
55
 
@@ -191,7 +191,7 @@ class VersionMigrator:
191
191
  logger.debug("All verification checks passed")
192
192
  return True
193
193
 
194
- def check_status(self) -> Dict[str, any]:
194
+ def check_status(self) -> Dict[str, Any]:
195
195
  """
196
196
  Check migration status and return detailed information
197
197
 
@@ -85,12 +85,12 @@ class CacheSystem:
85
85
 
86
86
  def _cleanup_expired_files(self) -> None:
87
87
  """Remove expired cache files."""
88
- current_time = time.time()
88
+ time.time()
89
89
  for file_name in os.listdir(self.cache_dir):
90
90
  if file_name.endswith(self.file_extension):
91
91
  file_path = os.path.join(self.cache_dir, file_name)
92
92
  try:
93
- with open(file_path, "r") as f:
93
+ with open(file_path, "r", encoding="utf-8") as f:
94
94
  data = json.load(f)
95
95
 
96
96
  if self._is_expired(data):
@@ -105,8 +105,8 @@ class CacheSystem:
105
105
  def _write_data(self, file_path: str, data: Dict[str, Any]) -> None:
106
106
  """Write data to file with error handling."""
107
107
  try:
108
- with open(file_path, "w") as f:
109
- json.dump(data, f, indent=2)
108
+ with open(file_path, "w", encoding="utf-8") as f:
109
+ json.dump(data, f, indent=2, ensure_ascii=False)
110
110
  except (OSError, TypeError) as e:
111
111
  raise OSError(f"Failed to write cache file {file_path}: {e}")
112
112
 
@@ -116,7 +116,7 @@ class CacheSystem:
116
116
  return None
117
117
 
118
118
  try:
119
- with open(file_path, "r") as f:
119
+ with open(file_path, "r", encoding="utf-8") as f:
120
120
  return json.load(f)
121
121
  except (json.JSONDecodeError, OSError):
122
122
  # File is corrupted, remove it
@@ -242,16 +242,14 @@ class CacheSystem:
242
242
  count = 0
243
243
  for file_name in os.listdir(self.cache_dir):
244
244
  if file_name.endswith(self.file_extension):
245
- file_path = os.path.join(self.cache_dir, file_name)
245
+ os.path.join(self.cache_dir, file_name)
246
246
  key = file_name[: -len(self.file_extension)] # Remove extension
247
247
 
248
248
  if self.exists(key):
249
249
  count += 1
250
250
  return count
251
251
 
252
- def set_if_not_exists(
253
- self, key: str, value: Any, ttl: Optional[float] = None
254
- ) -> bool:
252
+ def set_if_not_exists(self, key: str, value: Any, ttl: Optional[float] = None) -> bool:
255
253
  """
256
254
  Set a value only if the key doesn't exist.
257
255
 
@@ -298,7 +296,7 @@ class CacheSystem:
298
296
  """
299
297
  total_files = 0
300
298
  expired_files = 0
301
- current_time = time.time()
299
+ time.time()
302
300
 
303
301
  for file_name in os.listdir(self.cache_dir):
304
302
  if file_name.endswith(self.file_extension):