moai-adk 0.8.0__py3-none-any.whl → 0.34.0__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.
Files changed (654) hide show
  1. moai_adk/__init__.py +2 -6
  2. moai_adk/__main__.py +136 -21
  3. moai_adk/cli/__init__.py +6 -2
  4. moai_adk/cli/commands/__init__.py +1 -4
  5. moai_adk/cli/commands/analyze.py +116 -0
  6. moai_adk/cli/commands/doctor.py +17 -5
  7. moai_adk/cli/commands/init.py +118 -48
  8. moai_adk/cli/commands/language.py +248 -0
  9. moai_adk/cli/commands/status.py +8 -13
  10. moai_adk/cli/commands/update.py +1978 -149
  11. moai_adk/cli/main.py +3 -2
  12. moai_adk/cli/prompts/init_prompts.py +144 -91
  13. moai_adk/cli/spec_status.py +263 -0
  14. moai_adk/cli/ui/__init__.py +44 -0
  15. moai_adk/cli/ui/progress.py +422 -0
  16. moai_adk/cli/ui/prompts.py +389 -0
  17. moai_adk/cli/ui/theme.py +129 -0
  18. moai_adk/cli/worktree/__init__.py +27 -0
  19. moai_adk/cli/worktree/__main__.py +31 -0
  20. moai_adk/cli/worktree/cli.py +683 -0
  21. moai_adk/cli/worktree/exceptions.py +89 -0
  22. moai_adk/cli/worktree/manager.py +493 -0
  23. moai_adk/cli/worktree/models.py +65 -0
  24. moai_adk/cli/worktree/registry.py +422 -0
  25. moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
  26. moai_adk/core/__init__.py +0 -1
  27. moai_adk/core/analysis/__init__.py +9 -0
  28. moai_adk/core/analysis/session_analyzer.py +400 -0
  29. moai_adk/core/claude_integration.py +393 -0
  30. moai_adk/core/command_helpers.py +270 -0
  31. moai_adk/core/comprehensive_monitoring_system.py +1183 -0
  32. moai_adk/core/config/__init__.py +6 -0
  33. moai_adk/core/config/auto_spec_config.py +340 -0
  34. moai_adk/core/config/migration.py +148 -17
  35. moai_adk/core/config/unified.py +436 -0
  36. moai_adk/core/context_manager.py +273 -0
  37. moai_adk/core/diagnostics/slash_commands.py +0 -1
  38. moai_adk/core/enterprise_features.py +1404 -0
  39. moai_adk/core/error_recovery_system.py +1902 -0
  40. moai_adk/core/event_driven_hook_system.py +1371 -0
  41. moai_adk/core/git/__init__.py +8 -1
  42. moai_adk/core/git/branch.py +0 -1
  43. moai_adk/core/git/branch_manager.py +2 -10
  44. moai_adk/core/git/checkpoint.py +1 -7
  45. moai_adk/core/git/commit.py +0 -1
  46. moai_adk/core/git/conflict_detector.py +413 -0
  47. moai_adk/core/git/event_detector.py +3 -5
  48. moai_adk/core/git/manager.py +91 -2
  49. moai_adk/core/hooks/post_tool_auto_spec_completion.py +901 -0
  50. moai_adk/core/input_validation_middleware.py +1006 -0
  51. moai_adk/core/integration/__init__.py +22 -0
  52. moai_adk/core/integration/engine.py +157 -0
  53. moai_adk/core/integration/integration_tester.py +226 -0
  54. moai_adk/core/integration/models.py +88 -0
  55. moai_adk/core/integration/utils.py +211 -0
  56. moai_adk/core/issue_creator.py +305 -0
  57. moai_adk/core/jit_context_loader.py +956 -0
  58. moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
  59. moai_adk/core/language_config.py +202 -0
  60. moai_adk/core/language_config_resolver.py +572 -0
  61. moai_adk/core/language_validator.py +543 -0
  62. moai_adk/core/mcp/setup.py +116 -0
  63. moai_adk/core/merge/__init__.py +9 -0
  64. moai_adk/core/merge/analyzer.py +481 -0
  65. moai_adk/core/migration/__init__.py +18 -0
  66. moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
  67. moai_adk/core/migration/backup_manager.py +277 -0
  68. moai_adk/core/migration/custom_element_scanner.py +358 -0
  69. moai_adk/core/migration/file_migrator.py +209 -0
  70. moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
  71. moai_adk/core/migration/selective_restorer.py +470 -0
  72. moai_adk/core/migration/template_utils.py +74 -0
  73. moai_adk/core/migration/user_selection_ui.py +338 -0
  74. moai_adk/core/migration/version_detector.py +139 -0
  75. moai_adk/core/migration/version_migrator.py +228 -0
  76. moai_adk/core/performance/__init__.py +6 -0
  77. moai_adk/core/performance/cache_system.py +316 -0
  78. moai_adk/core/performance/parallel_processor.py +116 -0
  79. moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
  80. moai_adk/core/project/__init__.py +0 -1
  81. moai_adk/core/project/backup_utils.py +2 -7
  82. moai_adk/core/project/checker.py +2 -4
  83. moai_adk/core/project/detector.py +189 -22
  84. moai_adk/core/project/initializer.py +218 -27
  85. moai_adk/core/project/phase_executor.py +416 -44
  86. moai_adk/core/project/validator.py +7 -32
  87. moai_adk/core/quality/__init__.py +1 -1
  88. moai_adk/core/quality/trust_checker.py +37 -101
  89. moai_adk/core/quality/validators/__init__.py +1 -1
  90. moai_adk/core/quality/validators/base_validator.py +1 -1
  91. moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
  92. moai_adk/core/robust_json_parser.py +611 -0
  93. moai_adk/core/rollback_manager.py +918 -0
  94. moai_adk/core/session_manager.py +651 -0
  95. moai_adk/core/skill_loading_system.py +579 -0
  96. moai_adk/core/spec/confidence_scoring.py +680 -0
  97. moai_adk/core/spec/ears_template_engine.py +1247 -0
  98. moai_adk/core/spec/quality_validator.py +687 -0
  99. moai_adk/core/spec_status_manager.py +478 -0
  100. moai_adk/core/template/__init__.py +0 -1
  101. moai_adk/core/template/backup.py +82 -17
  102. moai_adk/core/template/config.py +112 -40
  103. moai_adk/core/template/languages.py +0 -1
  104. moai_adk/core/template/merger.py +75 -26
  105. moai_adk/core/template/processor.py +750 -72
  106. moai_adk/core/template_engine.py +310 -0
  107. moai_adk/core/template_variable_synchronizer.py +417 -0
  108. moai_adk/core/unified_permission_manager.py +745 -0
  109. moai_adk/core/user_behavior_analytics.py +851 -0
  110. moai_adk/core/version_sync.py +429 -0
  111. moai_adk/foundation/__init__.py +56 -0
  112. moai_adk/foundation/backend.py +1027 -0
  113. moai_adk/foundation/database.py +1115 -0
  114. moai_adk/foundation/devops.py +1585 -0
  115. moai_adk/foundation/ears.py +431 -0
  116. moai_adk/foundation/frontend.py +870 -0
  117. moai_adk/foundation/git/commit_templates.py +557 -0
  118. moai_adk/foundation/git.py +376 -0
  119. moai_adk/foundation/langs.py +484 -0
  120. moai_adk/foundation/ml_ops.py +1162 -0
  121. moai_adk/foundation/testing.py +1524 -0
  122. moai_adk/foundation/trust/trust_principles.py +676 -0
  123. moai_adk/foundation/trust/validation_checklist.py +1573 -0
  124. moai_adk/project/__init__.py +0 -0
  125. moai_adk/project/configuration.py +1084 -0
  126. moai_adk/project/documentation.py +566 -0
  127. moai_adk/project/schema.py +447 -0
  128. moai_adk/statusline/__init__.py +38 -0
  129. moai_adk/statusline/alfred_detector.py +105 -0
  130. moai_adk/statusline/config.py +376 -0
  131. moai_adk/statusline/enhanced_output_style_detector.py +372 -0
  132. moai_adk/statusline/git_collector.py +190 -0
  133. moai_adk/statusline/main.py +322 -0
  134. moai_adk/statusline/metrics_tracker.py +78 -0
  135. moai_adk/statusline/renderer.py +343 -0
  136. moai_adk/statusline/update_checker.py +129 -0
  137. moai_adk/statusline/version_reader.py +741 -0
  138. moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +670 -0
  139. moai_adk/templates/.claude/agents/moai/builder-agent.md +474 -0
  140. moai_adk/templates/.claude/agents/moai/builder-command.md +1172 -0
  141. moai_adk/templates/.claude/agents/moai/builder-skill.md +666 -0
  142. moai_adk/templates/.claude/agents/moai/expert-backend.md +899 -0
  143. moai_adk/templates/.claude/agents/moai/expert-database.md +777 -0
  144. moai_adk/templates/.claude/agents/moai/expert-debug.md +401 -0
  145. moai_adk/templates/.claude/agents/moai/expert-devops.md +720 -0
  146. moai_adk/templates/.claude/agents/moai/expert-frontend.md +734 -0
  147. moai_adk/templates/.claude/agents/moai/expert-performance.md +657 -0
  148. moai_adk/templates/.claude/agents/moai/expert-security.md +509 -0
  149. moai_adk/templates/.claude/agents/moai/expert-testing.md +733 -0
  150. moai_adk/templates/.claude/agents/moai/expert-uiux.md +1041 -0
  151. moai_adk/templates/.claude/agents/moai/manager-claude-code.md +432 -0
  152. moai_adk/templates/.claude/agents/moai/manager-docs.md +573 -0
  153. moai_adk/templates/.claude/agents/moai/manager-git.md +1020 -0
  154. moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
  155. moai_adk/templates/.claude/agents/moai/manager-quality.md +624 -0
  156. moai_adk/templates/.claude/agents/moai/manager-spec.md +809 -0
  157. moai_adk/templates/.claude/agents/moai/manager-strategy.md +780 -0
  158. moai_adk/templates/.claude/agents/moai/manager-tdd.md +784 -0
  159. moai_adk/templates/.claude/agents/moai/mcp-context7.md +458 -0
  160. moai_adk/templates/.claude/agents/moai/mcp-figma.md +1607 -0
  161. moai_adk/templates/.claude/agents/moai/mcp-notion.md +789 -0
  162. moai_adk/templates/.claude/agents/moai/mcp-playwright.md +469 -0
  163. moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +1032 -0
  164. moai_adk/templates/.claude/commands/moai/0-project.md +1384 -0
  165. moai_adk/templates/.claude/commands/moai/1-plan.md +1427 -0
  166. moai_adk/templates/.claude/commands/moai/2-run.md +943 -0
  167. moai_adk/templates/.claude/commands/moai/3-sync.md +1324 -0
  168. moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
  169. moai_adk/templates/.claude/hooks/__init__.py +8 -0
  170. moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
  171. moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
  172. moai_adk/templates/.claude/hooks/{alfred/core → moai/lib}/checkpoint.py +10 -37
  173. moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
  174. moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
  175. moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
  176. moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
  177. moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
  178. moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
  179. moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
  180. moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
  181. moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
  182. moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
  183. moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
  184. moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
  185. moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
  186. moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +1075 -0
  187. moai_adk/templates/.claude/output-styles/moai/r2d2.md +560 -0
  188. moai_adk/templates/.claude/output-styles/moai/yoda.md +359 -0
  189. moai_adk/templates/.claude/settings.json +78 -50
  190. moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +438 -0
  191. moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -0
  192. moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +249 -0
  193. moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +406 -0
  194. moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
  195. moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
  196. moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
  197. moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
  198. moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
  199. moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +328 -0
  200. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +313 -283
  201. moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +610 -1525
  202. moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +423 -619
  203. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +295 -95
  204. moai_adk/templates/.claude/skills/moai-domain-database/examples.md +817 -16
  205. moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
  206. moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
  207. moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
  208. moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
  209. moai_adk/templates/.claude/skills/moai-domain-database/reference.md +532 -17
  210. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +470 -97
  211. moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +955 -16
  212. moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +651 -18
  213. moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +455 -0
  214. moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
  215. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
  216. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
  217. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
  218. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
  219. moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
  220. moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
  221. moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +492 -0
  222. moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -0
  223. moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
  224. moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
  225. moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
  226. moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
  227. moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
  228. moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
  229. moai_adk/templates/.claude/skills/moai-formats-data/reference.md +585 -0
  230. moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +202 -0
  231. moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -0
  232. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
  233. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
  234. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
  235. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
  236. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
  237. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
  238. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
  239. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
  240. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
  241. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
  242. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
  243. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
  244. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
  245. moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
  246. moai_adk/templates/.claude/skills/moai-foundation-claude/reference.md +209 -0
  247. moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +441 -0
  248. moai_adk/templates/.claude/skills/moai-foundation-context/examples.md +1048 -0
  249. moai_adk/templates/.claude/skills/moai-foundation-context/reference.md +246 -0
  250. moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +420 -0
  251. moai_adk/templates/.claude/skills/moai-foundation-core/examples.md +358 -0
  252. moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
  253. moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +359 -0
  254. moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
  255. moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
  256. moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
  257. moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
  258. moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
  259. moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
  260. moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
  261. moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
  262. moai_adk/templates/.claude/skills/moai-foundation-core/reference.md +478 -0
  263. moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +315 -0
  264. moai_adk/templates/.claude/skills/moai-foundation-philosopher/examples.md +228 -0
  265. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/assumption-matrix.md +80 -0
  266. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/cognitive-bias.md +199 -0
  267. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/first-principles.md +140 -0
  268. moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/trade-off-analysis.md +154 -0
  269. moai_adk/templates/.claude/skills/moai-foundation-philosopher/reference.md +157 -0
  270. moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +364 -0
  271. moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
  272. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
  273. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
  274. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
  275. moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
  276. moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
  277. moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
  278. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
  279. moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
  280. moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +618 -93
  281. moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +446 -91
  282. moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +612 -0
  283. moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +477 -0
  284. moai_adk/templates/.claude/skills/moai-lang-flutter/examples.md +1090 -0
  285. moai_adk/templates/.claude/skills/moai-lang-flutter/reference.md +686 -0
  286. moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +346 -94
  287. moai_adk/templates/.claude/skills/moai-lang-go/examples.md +906 -16
  288. moai_adk/templates/.claude/skills/moai-lang-go/reference.md +721 -15
  289. moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +352 -91
  290. moai_adk/templates/.claude/skills/moai-lang-java/examples.md +851 -16
  291. moai_adk/templates/.claude/skills/moai-lang-java/reference.md +278 -18
  292. moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +344 -86
  293. moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +993 -16
  294. moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +549 -18
  295. moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +617 -96
  296. moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +364 -314
  297. moai_adk/templates/.claude/skills/moai-lang-python/examples.md +849 -496
  298. moai_adk/templates/.claude/skills/moai-lang-python/reference.md +731 -243
  299. moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +545 -89
  300. moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +650 -87
  301. moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +341 -93
  302. moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +646 -16
  303. moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +491 -18
  304. moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +463 -89
  305. moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +620 -16
  306. moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +410 -17
  307. moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +486 -112
  308. moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +905 -16
  309. moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +659 -17
  310. moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +333 -92
  311. moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +1076 -16
  312. moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +718 -21
  313. moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +300 -0
  314. moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
  315. moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
  316. moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
  317. moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
  318. moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +319 -0
  319. moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
  320. moai_adk/templates/.claude/skills/moai-library-nextra/examples.md +592 -0
  321. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
  322. moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
  323. moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
  324. moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
  325. moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
  326. moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
  327. moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
  328. moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
  329. moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
  330. moai_adk/templates/.claude/skills/moai-library-nextra/reference.md +379 -0
  331. moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +372 -0
  332. moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
  333. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
  334. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
  335. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
  336. moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
  337. moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
  338. moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +402 -0
  339. moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +607 -0
  340. moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +300 -0
  341. moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +537 -0
  342. moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +290 -0
  343. moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +390 -0
  344. moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +398 -0
  345. moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +379 -0
  346. moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +358 -0
  347. moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +467 -0
  348. moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +377 -0
  349. moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +466 -0
  350. moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +482 -0
  351. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +449 -0
  352. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
  353. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
  354. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
  355. moai_adk/templates/.claude/skills/moai-workflow-jit-docs/reference.md +307 -0
  356. moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
  357. moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +390 -0
  358. moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
  359. moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
  360. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
  361. moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
  362. moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
  363. moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +175 -0
  364. moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
  365. moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -0
  366. moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
  367. moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
  368. moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
  369. moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
  370. moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
  371. moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
  372. moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
  373. moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
  374. moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
  375. moai_adk/templates/.claude/skills/moai-workflow-project/reference.md +275 -0
  376. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
  377. moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1462 -0
  378. moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
  379. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
  380. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
  381. moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +92 -0
  382. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
  383. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
  384. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
  385. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
  386. moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
  387. moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
  388. moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +534 -0
  389. moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
  390. moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
  391. moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +377 -0
  392. moai_adk/templates/.claude/skills/moai-workflow-templates/examples.md +552 -0
  393. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
  394. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
  395. moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
  396. moai_adk/templates/.claude/skills/moai-workflow-templates/reference.md +346 -0
  397. moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
  398. moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +456 -0
  399. moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
  400. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
  401. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
  402. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
  403. moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
  404. moai_adk/templates/.claude/skills/moai-workflow-testing/examples.md +672 -0
  405. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
  406. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
  407. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
  408. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
  409. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
  410. moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
  411. moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
  412. moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
  413. moai_adk/templates/.claude/skills/moai-workflow-testing/reference.md +440 -0
  414. moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
  415. moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
  416. moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
  417. moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +411 -0
  418. moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
  419. moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
  420. moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
  421. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
  422. moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
  423. moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
  424. moai_adk/templates/.git-hooks/pre-commit +128 -0
  425. moai_adk/templates/.git-hooks/pre-push +365 -0
  426. moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
  427. moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
  428. moai_adk/templates/.github/workflows/spec-issue-sync.yml +206 -36
  429. moai_adk/templates/.gitignore +194 -13
  430. moai_adk/templates/.mcp.json +31 -0
  431. moai_adk/templates/.moai/config/config.yaml +58 -0
  432. moai_adk/templates/.moai/config/questions/_schema.yaml +151 -0
  433. moai_adk/templates/.moai/config/questions/tab0-init.yaml +251 -0
  434. moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
  435. moai_adk/templates/.moai/config/questions/tab2-project.yaml +81 -0
  436. moai_adk/templates/.moai/config/questions/tab3-git.yaml +634 -0
  437. moai_adk/templates/.moai/config/questions/tab4-quality.yaml +170 -0
  438. moai_adk/templates/.moai/config/questions/tab5-system.yaml +87 -0
  439. moai_adk/templates/.moai/config/sections/git-strategy.yaml +116 -0
  440. moai_adk/templates/.moai/config/sections/language.yaml +11 -0
  441. moai_adk/templates/.moai/config/sections/project.yaml +13 -0
  442. moai_adk/templates/.moai/config/sections/quality.yaml +17 -0
  443. moai_adk/templates/.moai/config/sections/system.yaml +14 -0
  444. moai_adk/templates/.moai/config/sections/user.yaml +5 -0
  445. moai_adk/templates/.moai/config/statusline-config.yaml +92 -0
  446. moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
  447. moai_adk/templates/CLAUDE.md +571 -244
  448. moai_adk/utils/__init__.py +24 -2
  449. moai_adk/utils/banner.py +9 -13
  450. moai_adk/utils/common.py +294 -0
  451. moai_adk/utils/link_validator.py +241 -0
  452. moai_adk/utils/logger.py +4 -9
  453. moai_adk/utils/safe_file_reader.py +206 -0
  454. moai_adk/utils/timeout.py +160 -0
  455. moai_adk/utils/toon_utils.py +256 -0
  456. moai_adk/version.py +22 -0
  457. moai_adk-0.34.0.dist-info/METADATA +2999 -0
  458. moai_adk-0.34.0.dist-info/RECORD +463 -0
  459. {moai_adk-0.8.0.dist-info → moai_adk-0.34.0.dist-info}/WHEEL +1 -1
  460. {moai_adk-0.8.0.dist-info → moai_adk-0.34.0.dist-info}/entry_points.txt +1 -0
  461. moai_adk/cli/commands/backup.py +0 -80
  462. moai_adk/templates/.claude/agents/alfred/cc-manager.md +0 -293
  463. moai_adk/templates/.claude/agents/alfred/debug-helper.md +0 -196
  464. moai_adk/templates/.claude/agents/alfred/doc-syncer.md +0 -207
  465. moai_adk/templates/.claude/agents/alfred/git-manager.md +0 -375
  466. moai_adk/templates/.claude/agents/alfred/implementation-planner.md +0 -343
  467. moai_adk/templates/.claude/agents/alfred/project-manager.md +0 -246
  468. moai_adk/templates/.claude/agents/alfred/quality-gate.md +0 -320
  469. moai_adk/templates/.claude/agents/alfred/skill-factory.md +0 -837
  470. moai_adk/templates/.claude/agents/alfred/spec-builder.md +0 -272
  471. moai_adk/templates/.claude/agents/alfred/tag-agent.md +0 -265
  472. moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +0 -311
  473. moai_adk/templates/.claude/agents/alfred/trust-checker.md +0 -352
  474. moai_adk/templates/.claude/commands/alfred/0-project.md +0 -1184
  475. moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -665
  476. moai_adk/templates/.claude/commands/alfred/2-run.md +0 -488
  477. moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -623
  478. moai_adk/templates/.claude/hooks/alfred/HOOK_SCHEMA_VALIDATION.md +0 -313
  479. moai_adk/templates/.claude/hooks/alfred/README.md +0 -230
  480. moai_adk/templates/.claude/hooks/alfred/alfred_hooks.py +0 -174
  481. moai_adk/templates/.claude/hooks/alfred/core/__init__.py +0 -170
  482. moai_adk/templates/.claude/hooks/alfred/core/context.py +0 -67
  483. moai_adk/templates/.claude/hooks/alfred/core/project.py +0 -416
  484. moai_adk/templates/.claude/hooks/alfred/core/tags.py +0 -198
  485. moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +0 -21
  486. moai_adk/templates/.claude/hooks/alfred/handlers/notification.py +0 -25
  487. moai_adk/templates/.claude/hooks/alfred/handlers/session.py +0 -161
  488. moai_adk/templates/.claude/hooks/alfred/handlers/tool.py +0 -90
  489. moai_adk/templates/.claude/hooks/alfred/handlers/user.py +0 -42
  490. moai_adk/templates/.claude/hooks/alfred/test_hook_output.py +0 -175
  491. moai_adk/templates/.claude/output-styles/alfred/agentic-coding.md +0 -640
  492. moai_adk/templates/.claude/output-styles/alfred/moai-adk-learning.md +0 -696
  493. moai_adk/templates/.claude/output-styles/alfred/study-with-alfred.md +0 -474
  494. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -113
  495. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/examples.md +0 -29
  496. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/reference.md +0 -28
  497. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -122
  498. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/examples.md +0 -29
  499. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/reference.md +0 -29
  500. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/SKILL.md +0 -237
  501. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/examples.md +0 -615
  502. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/reference.md +0 -653
  503. moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +0 -113
  504. moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +0 -29
  505. moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +0 -28
  506. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -113
  507. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/examples.md +0 -29
  508. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/reference.md +0 -28
  509. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -113
  510. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/examples.md +0 -29
  511. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/reference.md +0 -28
  512. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -113
  513. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/examples.md +0 -29
  514. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/reference.md +0 -28
  515. moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +0 -269
  516. moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +0 -32
  517. moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +0 -298
  518. moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +0 -26
  519. moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +0 -307
  520. moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +0 -21
  521. moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +0 -252
  522. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +0 -19
  523. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +0 -19
  524. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +0 -24
  525. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +0 -199
  526. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +0 -39
  527. moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +0 -316
  528. moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +0 -18
  529. moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +0 -263
  530. moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +0 -30
  531. moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +0 -291
  532. moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +0 -15
  533. moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +0 -123
  534. moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +0 -29
  535. moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +0 -30
  536. moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +0 -123
  537. moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +0 -29
  538. moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +0 -30
  539. moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +0 -124
  540. moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +0 -29
  541. moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +0 -31
  542. moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +0 -123
  543. moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +0 -29
  544. moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +0 -30
  545. moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +0 -123
  546. moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +0 -29
  547. moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +0 -30
  548. moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +0 -123
  549. moai_adk/templates/.claude/skills/moai-domain-security/examples.md +0 -29
  550. moai_adk/templates/.claude/skills/moai-domain-security/reference.md +0 -30
  551. moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +0 -123
  552. moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +0 -29
  553. moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +0 -30
  554. moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +0 -303
  555. moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +0 -1064
  556. moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +0 -1047
  557. moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +0 -113
  558. moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +0 -29
  559. moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +0 -28
  560. moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +0 -113
  561. moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +0 -29
  562. moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +0 -28
  563. moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +0 -113
  564. moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +0 -29
  565. moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +0 -28
  566. moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +0 -113
  567. moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +0 -29
  568. moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +0 -28
  569. moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +0 -122
  570. moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +0 -29
  571. moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +0 -29
  572. moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +0 -113
  573. moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +0 -29
  574. moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +0 -28
  575. moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +0 -113
  576. moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +0 -29
  577. moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +0 -28
  578. moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +0 -113
  579. moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +0 -29
  580. moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +0 -28
  581. moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +0 -307
  582. moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
  583. moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +0 -1099
  584. moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +0 -124
  585. moai_adk/templates/.claude/skills/moai-lang-c/examples.md +0 -29
  586. moai_adk/templates/.claude/skills/moai-lang-c/reference.md +0 -31
  587. moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +0 -29
  588. moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +0 -31
  589. moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +0 -29
  590. moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +0 -30
  591. moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +0 -123
  592. moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +0 -29
  593. moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +0 -30
  594. moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +0 -125
  595. moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +0 -29
  596. moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +0 -32
  597. moai_adk/templates/.claude/skills/moai-lang-php/examples.md +0 -29
  598. moai_adk/templates/.claude/skills/moai-lang-php/reference.md +0 -30
  599. moai_adk/templates/.claude/skills/moai-lang-r/examples.md +0 -29
  600. moai_adk/templates/.claude/skills/moai-lang-r/reference.md +0 -30
  601. moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +0 -29
  602. moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +0 -31
  603. moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +0 -123
  604. moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +0 -29
  605. moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +0 -30
  606. moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +0 -124
  607. moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +0 -29
  608. moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +0 -31
  609. moai_adk/templates/.claude/skills/moai-skill-factory/CHECKLIST.md +0 -482
  610. moai_adk/templates/.claude/skills/moai-skill-factory/EXAMPLES.md +0 -278
  611. moai_adk/templates/.claude/skills/moai-skill-factory/INTERACTIVE-DISCOVERY.md +0 -524
  612. moai_adk/templates/.claude/skills/moai-skill-factory/METADATA.md +0 -477
  613. moai_adk/templates/.claude/skills/moai-skill-factory/PARALLEL-ANALYSIS-REPORT.md +0 -429
  614. moai_adk/templates/.claude/skills/moai-skill-factory/PYTHON-VERSION-MATRIX.md +0 -391
  615. moai_adk/templates/.claude/skills/moai-skill-factory/SKILL-FACTORY-WORKFLOW.md +0 -431
  616. moai_adk/templates/.claude/skills/moai-skill-factory/SKILL-UPDATE-ADVISOR.md +0 -577
  617. moai_adk/templates/.claude/skills/moai-skill-factory/SKILL.md +0 -271
  618. moai_adk/templates/.claude/skills/moai-skill-factory/STEP-BY-STEP-GUIDE.md +0 -466
  619. moai_adk/templates/.claude/skills/moai-skill-factory/STRUCTURE.md +0 -583
  620. moai_adk/templates/.claude/skills/moai-skill-factory/WEB-RESEARCH.md +0 -526
  621. moai_adk/templates/.claude/skills/moai-skill-factory/reference.md +0 -465
  622. moai_adk/templates/.claude/skills/moai-skill-factory/scripts/generate-structure.sh +0 -328
  623. moai_adk/templates/.claude/skills/moai-skill-factory/scripts/validate-skill.sh +0 -312
  624. moai_adk/templates/.claude/skills/moai-skill-factory/templates/SKILL_TEMPLATE.md +0 -245
  625. moai_adk/templates/.claude/skills/moai-skill-factory/templates/examples-template.md +0 -285
  626. moai_adk/templates/.claude/skills/moai-skill-factory/templates/reference-template.md +0 -278
  627. moai_adk/templates/.claude/skills/moai-skill-factory/templates/scripts-template.sh +0 -303
  628. moai_adk/templates/.claude/skills/moai-spec-authoring/README.md +0 -137
  629. moai_adk/templates/.claude/skills/moai-spec-authoring/SKILL.md +0 -218
  630. moai_adk/templates/.claude/skills/moai-spec-authoring/examples/validate-spec.sh +0 -161
  631. moai_adk/templates/.claude/skills/moai-spec-authoring/examples.md +0 -541
  632. moai_adk/templates/.claude/skills/moai-spec-authoring/reference.md +0 -622
  633. moai_adk/templates/.github/ISSUE_TEMPLATE/spec.yml +0 -176
  634. moai_adk/templates/.github/PULL_REQUEST_TEMPLATE.md +0 -69
  635. moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -256
  636. moai_adk/templates/.moai/config.json +0 -96
  637. moai_adk/templates/.moai/memory/CLAUDE-AGENTS-GUIDE.md +0 -208
  638. moai_adk/templates/.moai/memory/CLAUDE-PRACTICES.md +0 -369
  639. moai_adk/templates/.moai/memory/CLAUDE-RULES.md +0 -539
  640. moai_adk/templates/.moai/memory/CONFIG-SCHEMA.md +0 -444
  641. moai_adk/templates/.moai/memory/DEVELOPMENT-GUIDE.md +0 -344
  642. moai_adk/templates/.moai/memory/GITFLOW-PROTECTION-POLICY.md +0 -220
  643. moai_adk/templates/.moai/memory/SKILLS-DESCRIPTION-POLICY.md +0 -218
  644. moai_adk/templates/.moai/memory/SPEC-METADATA.md +0 -356
  645. moai_adk/templates/.moai/memory/config-schema.md +0 -444
  646. moai_adk/templates/.moai/memory/gitflow-protection-policy.md +0 -220
  647. moai_adk/templates/.moai/memory/spec-metadata.md +0 -356
  648. moai_adk/templates/.moai/project/product.md +0 -161
  649. moai_adk/templates/.moai/project/structure.md +0 -156
  650. moai_adk/templates/.moai/project/tech.md +0 -227
  651. moai_adk/templates/__init__.py +0 -2
  652. moai_adk-0.8.0.dist-info/METADATA +0 -1722
  653. moai_adk-0.8.0.dist-info/RECORD +0 -282
  654. {moai_adk-0.8.0.dist-info → moai_adk-0.34.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,1090 @@
1
+ # Flutter/Dart Examples
2
+
3
+ Production-ready code examples for Flutter cross-platform development.
4
+
5
+ ## Complete Feature: User Authentication
6
+
7
+ ### Full Authentication Flow with Riverpod
8
+
9
+ ```dart
10
+ // lib/features/auth/domain/entities/user.dart
11
+ class User {
12
+ final String id;
13
+ final String email;
14
+ final String name;
15
+ final String? avatarUrl;
16
+
17
+ const User({
18
+ required this.id,
19
+ required this.email,
20
+ required this.name,
21
+ this.avatarUrl,
22
+ });
23
+ }
24
+
25
+ class AuthTokens {
26
+ final String accessToken;
27
+ final String refreshToken;
28
+ final DateTime expiresAt;
29
+
30
+ const AuthTokens({
31
+ required this.accessToken,
32
+ required this.refreshToken,
33
+ required this.expiresAt,
34
+ });
35
+
36
+ bool get isExpired => DateTime.now().isAfter(expiresAt);
37
+ }
38
+
39
+ // lib/features/auth/domain/errors/auth_error.dart
40
+ sealed class AuthError implements Exception {
41
+ const AuthError();
42
+
43
+ String get message => switch (this) {
44
+ InvalidCredentialsError() => 'Invalid email or password',
45
+ NetworkError(:final cause) => 'Network error: $cause',
46
+ TokenExpiredError() => 'Session expired. Please login again',
47
+ UnauthorizedError() => 'Unauthorized access',
48
+ UnknownError(:final message) => message,
49
+ };
50
+ }
51
+
52
+ class InvalidCredentialsError extends AuthError {
53
+ const InvalidCredentialsError();
54
+ }
55
+
56
+ class NetworkError extends AuthError {
57
+ final Object cause;
58
+ const NetworkError(this.cause);
59
+ }
60
+
61
+ class TokenExpiredError extends AuthError {
62
+ const TokenExpiredError();
63
+ }
64
+
65
+ class UnauthorizedError extends AuthError {
66
+ const UnauthorizedError();
67
+ }
68
+
69
+ class UnknownError extends AuthError {
70
+ @override
71
+ final String message;
72
+ const UnknownError(this.message);
73
+ }
74
+
75
+ // lib/features/auth/domain/repositories/auth_repository.dart
76
+ abstract class AuthRepository {
77
+ Future<User> login(String email, String password);
78
+ Future<void> logout();
79
+ Future<User?> restoreSession();
80
+ Stream<User?> watchAuthState();
81
+ }
82
+
83
+ // lib/features/auth/data/models/user_model.dart
84
+ class UserModel extends User {
85
+ const UserModel({
86
+ required super.id,
87
+ required super.email,
88
+ required super.name,
89
+ super.avatarUrl,
90
+ });
91
+
92
+ factory UserModel.fromJson(Map<String, dynamic> json) => UserModel(
93
+ id: json['id'] as String,
94
+ email: json['email'] as String,
95
+ name: json['name'] as String,
96
+ avatarUrl: json['avatar_url'] as String?,
97
+ );
98
+
99
+ Map<String, dynamic> toJson() => {
100
+ 'id': id,
101
+ 'email': email,
102
+ 'name': name,
103
+ if (avatarUrl != null) 'avatar_url': avatarUrl,
104
+ };
105
+ }
106
+
107
+ class AuthTokensModel extends AuthTokens {
108
+ const AuthTokensModel({
109
+ required super.accessToken,
110
+ required super.refreshToken,
111
+ required super.expiresAt,
112
+ });
113
+
114
+ factory AuthTokensModel.fromJson(Map<String, dynamic> json) => AuthTokensModel(
115
+ accessToken: json['access_token'] as String,
116
+ refreshToken: json['refresh_token'] as String,
117
+ expiresAt: DateTime.parse(json['expires_at'] as String),
118
+ );
119
+
120
+ Map<String, dynamic> toJson() => {
121
+ 'access_token': accessToken,
122
+ 'refresh_token': refreshToken,
123
+ 'expires_at': expiresAt.toIso8601String(),
124
+ };
125
+ }
126
+
127
+ // lib/features/auth/data/datasources/auth_api.dart
128
+ class AuthApi {
129
+ final Dio _dio;
130
+
131
+ AuthApi(this._dio);
132
+
133
+ Future<AuthTokensModel> login(String email, String password) async {
134
+ final response = await _dio.post('/auth/login', data: {
135
+ 'email': email,
136
+ 'password': password,
137
+ });
138
+ return AuthTokensModel.fromJson(response.data);
139
+ }
140
+
141
+ Future<AuthTokensModel> refreshToken(String refreshToken) async {
142
+ final response = await _dio.post('/auth/refresh', data: {
143
+ 'refresh_token': refreshToken,
144
+ });
145
+ return AuthTokensModel.fromJson(response.data);
146
+ }
147
+
148
+ Future<UserModel> getUser(String accessToken) async {
149
+ final response = await _dio.get(
150
+ '/auth/me',
151
+ options: Options(headers: {'Authorization': 'Bearer $accessToken'}),
152
+ );
153
+ return UserModel.fromJson(response.data);
154
+ }
155
+
156
+ Future<void> logout(String accessToken) async {
157
+ await _dio.post(
158
+ '/auth/logout',
159
+ options: Options(headers: {'Authorization': 'Bearer $accessToken'}),
160
+ );
161
+ }
162
+ }
163
+
164
+ // lib/features/auth/data/datasources/secure_storage.dart
165
+ class SecureStorage {
166
+ static const _tokensKey = 'auth_tokens';
167
+ final FlutterSecureStorage _storage;
168
+
169
+ SecureStorage(this._storage);
170
+
171
+ Future<AuthTokensModel?> getTokens() async {
172
+ final json = await _storage.read(key: _tokensKey);
173
+ if (json == null) return null;
174
+ return AuthTokensModel.fromJson(jsonDecode(json));
175
+ }
176
+
177
+ Future<void> saveTokens(AuthTokensModel tokens) async {
178
+ await _storage.write(
179
+ key: _tokensKey,
180
+ value: jsonEncode(tokens.toJson()),
181
+ );
182
+ }
183
+
184
+ Future<void> clearTokens() async {
185
+ await _storage.delete(key: _tokensKey);
186
+ }
187
+ }
188
+
189
+ // lib/features/auth/data/repositories/auth_repository_impl.dart
190
+ class AuthRepositoryImpl implements AuthRepository {
191
+ final AuthApi _api;
192
+ final SecureStorage _storage;
193
+ final _authStateController = StreamController<User?>.broadcast();
194
+
195
+ AuthRepositoryImpl(this._api, this._storage);
196
+
197
+ @override
198
+ Stream<User?> watchAuthState() => _authStateController.stream;
199
+
200
+ @override
201
+ Future<User> login(String email, String password) async {
202
+ try {
203
+ final tokens = await _api.login(email, password);
204
+ await _storage.saveTokens(tokens);
205
+
206
+ final user = await _api.getUser(tokens.accessToken);
207
+ _authStateController.add(user);
208
+
209
+ return user;
210
+ } on DioException catch (e) {
211
+ throw _mapDioError(e);
212
+ }
213
+ }
214
+
215
+ @override
216
+ Future<void> logout() async {
217
+ try {
218
+ final tokens = await _storage.getTokens();
219
+ if (tokens != null) {
220
+ await _api.logout(tokens.accessToken).catchError((_) {});
221
+ }
222
+ } finally {
223
+ await _storage.clearTokens();
224
+ _authStateController.add(null);
225
+ }
226
+ }
227
+
228
+ @override
229
+ Future<User?> restoreSession() async {
230
+ final tokens = await _storage.getTokens();
231
+ if (tokens == null) return null;
232
+
233
+ try {
234
+ AuthTokensModel activeTokens = tokens;
235
+
236
+ if (tokens.isExpired) {
237
+ activeTokens = await _api.refreshToken(tokens.refreshToken);
238
+ await _storage.saveTokens(activeTokens);
239
+ }
240
+
241
+ final user = await _api.getUser(activeTokens.accessToken);
242
+ _authStateController.add(user);
243
+ return user;
244
+ } on DioException catch (e) {
245
+ if (e.response?.statusCode == 401) {
246
+ await _storage.clearTokens();
247
+ _authStateController.add(null);
248
+ return null;
249
+ }
250
+ throw _mapDioError(e);
251
+ }
252
+ }
253
+
254
+ AuthError _mapDioError(DioException e) {
255
+ if (e.type == DioExceptionType.connectionError ||
256
+ e.type == DioExceptionType.connectionTimeout) {
257
+ return NetworkError(e);
258
+ }
259
+
260
+ final statusCode = e.response?.statusCode;
261
+ return switch (statusCode) {
262
+ 401 => const InvalidCredentialsError(),
263
+ 403 => const UnauthorizedError(),
264
+ _ => UnknownError(e.message ?? 'Unknown error'),
265
+ };
266
+ }
267
+ }
268
+
269
+ // lib/features/auth/presentation/providers/auth_provider.dart
270
+ part 'auth_provider.g.dart';
271
+
272
+ @riverpod
273
+ AuthRepository authRepository(Ref ref) {
274
+ return AuthRepositoryImpl(
275
+ ref.read(authApiProvider),
276
+ ref.read(secureStorageProvider),
277
+ );
278
+ }
279
+
280
+ @riverpod
281
+ Stream<User?> authState(Ref ref) {
282
+ return ref.watch(authRepositoryProvider).watchAuthState();
283
+ }
284
+
285
+ @riverpod
286
+ class AuthController extends _$AuthController {
287
+ @override
288
+ FutureOr<User?> build() async {
289
+ return ref.read(authRepositoryProvider).restoreSession();
290
+ }
291
+
292
+ Future<void> login(String email, String password) async {
293
+ state = const AsyncLoading();
294
+ state = await AsyncValue.guard(
295
+ () => ref.read(authRepositoryProvider).login(email, password),
296
+ );
297
+ }
298
+
299
+ Future<void> logout() async {
300
+ await ref.read(authRepositoryProvider).logout();
301
+ state = const AsyncData(null);
302
+ }
303
+ }
304
+
305
+ // lib/features/auth/presentation/screens/login_screen.dart
306
+ class LoginScreen extends ConsumerStatefulWidget {
307
+ const LoginScreen({super.key});
308
+
309
+ @override
310
+ ConsumerState<LoginScreen> createState() => _LoginScreenState();
311
+ }
312
+
313
+ class _LoginScreenState extends ConsumerState<LoginScreen> {
314
+ final _formKey = GlobalKey<FormState>();
315
+ final _emailController = TextEditingController();
316
+ final _passwordController = TextEditingController();
317
+ bool _obscurePassword = true;
318
+
319
+ @override
320
+ void dispose() {
321
+ _emailController.dispose();
322
+ _passwordController.dispose();
323
+ super.dispose();
324
+ }
325
+
326
+ Future<void> _handleLogin() async {
327
+ if (!_formKey.currentState!.validate()) return;
328
+
329
+ await ref.read(authControllerProvider.notifier).login(
330
+ _emailController.text.trim(),
331
+ _passwordController.text,
332
+ );
333
+ }
334
+
335
+ @override
336
+ Widget build(BuildContext context) {
337
+ final authState = ref.watch(authControllerProvider);
338
+ final theme = Theme.of(context);
339
+
340
+ // Listen for auth state changes
341
+ ref.listen(authControllerProvider, (prev, next) {
342
+ next.whenOrNull(
343
+ data: (user) {
344
+ if (user != null) {
345
+ context.go('/home');
346
+ }
347
+ },
348
+ error: (error, _) {
349
+ final message = error is AuthError
350
+ ? error.message
351
+ : 'An unexpected error occurred';
352
+
353
+ ScaffoldMessenger.of(context).showSnackBar(
354
+ SnackBar(
355
+ content: Text(message),
356
+ backgroundColor: theme.colorScheme.error,
357
+ ),
358
+ );
359
+ },
360
+ );
361
+ });
362
+
363
+ return Scaffold(
364
+ body: SafeArea(
365
+ child: SingleChildScrollView(
366
+ padding: const EdgeInsets.all(24),
367
+ child: Form(
368
+ key: _formKey,
369
+ child: Column(
370
+ crossAxisAlignment: CrossAxisAlignment.stretch,
371
+ children: [
372
+ const SizedBox(height: 48),
373
+
374
+ // Header
375
+ Text(
376
+ 'Welcome Back',
377
+ style: theme.textTheme.headlineLarge,
378
+ textAlign: TextAlign.center,
379
+ ),
380
+ const SizedBox(height: 8),
381
+ Text(
382
+ 'Sign in to continue',
383
+ style: theme.textTheme.bodyLarge?.copyWith(
384
+ color: theme.colorScheme.onSurfaceVariant,
385
+ ),
386
+ textAlign: TextAlign.center,
387
+ ),
388
+ const SizedBox(height: 48),
389
+
390
+ // Email field
391
+ TextFormField(
392
+ controller: _emailController,
393
+ keyboardType: TextInputType.emailAddress,
394
+ textInputAction: TextInputAction.next,
395
+ decoration: const InputDecoration(
396
+ labelText: 'Email',
397
+ prefixIcon: Icon(Icons.email_outlined),
398
+ border: OutlineInputBorder(),
399
+ ),
400
+ validator: (value) {
401
+ if (value == null || value.isEmpty) {
402
+ return 'Please enter your email';
403
+ }
404
+ if (!value.contains('@') || !value.contains('.')) {
405
+ return 'Please enter a valid email';
406
+ }
407
+ return null;
408
+ },
409
+ ),
410
+ const SizedBox(height: 16),
411
+
412
+ // Password field
413
+ TextFormField(
414
+ controller: _passwordController,
415
+ obscureText: _obscurePassword,
416
+ textInputAction: TextInputAction.done,
417
+ onFieldSubmitted: (_) => _handleLogin(),
418
+ decoration: InputDecoration(
419
+ labelText: 'Password',
420
+ prefixIcon: const Icon(Icons.lock_outlined),
421
+ suffixIcon: IconButton(
422
+ icon: Icon(
423
+ _obscurePassword
424
+ ? Icons.visibility_outlined
425
+ : Icons.visibility_off_outlined,
426
+ ),
427
+ onPressed: () {
428
+ setState(() => _obscurePassword = !_obscurePassword);
429
+ },
430
+ ),
431
+ border: const OutlineInputBorder(),
432
+ ),
433
+ validator: (value) {
434
+ if (value == null || value.isEmpty) {
435
+ return 'Please enter your password';
436
+ }
437
+ if (value.length < 6) {
438
+ return 'Password must be at least 6 characters';
439
+ }
440
+ return null;
441
+ },
442
+ ),
443
+ const SizedBox(height: 8),
444
+
445
+ // Forgot password
446
+ Align(
447
+ alignment: Alignment.centerRight,
448
+ child: TextButton(
449
+ onPressed: () => context.push('/forgot-password'),
450
+ child: const Text('Forgot Password?'),
451
+ ),
452
+ ),
453
+ const SizedBox(height: 24),
454
+
455
+ // Login button
456
+ FilledButton(
457
+ onPressed: authState.isLoading ? null : _handleLogin,
458
+ style: FilledButton.styleFrom(
459
+ minimumSize: const Size.fromHeight(56),
460
+ ),
461
+ child: authState.isLoading
462
+ ? const SizedBox(
463
+ height: 24,
464
+ width: 24,
465
+ child: CircularProgressIndicator(strokeWidth: 2),
466
+ )
467
+ : const Text('Sign In'),
468
+ ),
469
+ const SizedBox(height: 24),
470
+
471
+ // Register link
472
+ Row(
473
+ mainAxisAlignment: MainAxisAlignment.center,
474
+ children: [
475
+ Text(
476
+ "Don't have an account?",
477
+ style: theme.textTheme.bodyMedium,
478
+ ),
479
+ TextButton(
480
+ onPressed: () => context.push('/register'),
481
+ child: const Text('Sign Up'),
482
+ ),
483
+ ],
484
+ ),
485
+ ],
486
+ ),
487
+ ),
488
+ ),
489
+ ),
490
+ );
491
+ }
492
+ }
493
+ ```
494
+
495
+ ## Network Layer
496
+
497
+ ### Dio Client with Interceptors
498
+
499
+ ```dart
500
+ // lib/core/network/api_client.dart
501
+ class ApiClient {
502
+ late final Dio _dio;
503
+ final SecureStorage _storage;
504
+
505
+ ApiClient({
506
+ required String baseUrl,
507
+ required SecureStorage storage,
508
+ }) : _storage = storage {
509
+ _dio = Dio(BaseOptions(
510
+ baseUrl: baseUrl,
511
+ connectTimeout: const Duration(seconds: 30),
512
+ receiveTimeout: const Duration(seconds: 30),
513
+ headers: {
514
+ 'Content-Type': 'application/json',
515
+ 'Accept': 'application/json',
516
+ },
517
+ ));
518
+
519
+ _dio.interceptors.addAll([
520
+ AuthInterceptor(_storage, _dio),
521
+ LogInterceptor(
522
+ requestBody: true,
523
+ responseBody: true,
524
+ logPrint: (log) => debugPrint(log.toString()),
525
+ ),
526
+ RetryInterceptor(_dio),
527
+ ]);
528
+ }
529
+
530
+ Future<T> get<T>(
531
+ String path, {
532
+ Map<String, dynamic>? queryParameters,
533
+ required T Function(dynamic) fromJson,
534
+ }) async {
535
+ final response = await _dio.get(path, queryParameters: queryParameters);
536
+ return fromJson(response.data);
537
+ }
538
+
539
+ Future<T> post<T>(
540
+ String path, {
541
+ dynamic data,
542
+ required T Function(dynamic) fromJson,
543
+ }) async {
544
+ final response = await _dio.post(path, data: data);
545
+ return fromJson(response.data);
546
+ }
547
+
548
+ Future<T> put<T>(
549
+ String path, {
550
+ dynamic data,
551
+ required T Function(dynamic) fromJson,
552
+ }) async {
553
+ final response = await _dio.put(path, data: data);
554
+ return fromJson(response.data);
555
+ }
556
+
557
+ Future<void> delete(String path) async {
558
+ await _dio.delete(path);
559
+ }
560
+ }
561
+
562
+ // lib/core/network/interceptors/auth_interceptor.dart
563
+ class AuthInterceptor extends Interceptor {
564
+ final SecureStorage _storage;
565
+ final Dio _dio;
566
+ bool _isRefreshing = false;
567
+ final _pendingRequests = <({RequestOptions options, ErrorInterceptorHandler handler})>[];
568
+
569
+ AuthInterceptor(this._storage, this._dio);
570
+
571
+ @override
572
+ Future<void> onRequest(
573
+ RequestOptions options,
574
+ RequestInterceptorHandler handler,
575
+ ) async {
576
+ final tokens = await _storage.getTokens();
577
+ if (tokens != null) {
578
+ options.headers['Authorization'] = 'Bearer ${tokens.accessToken}';
579
+ }
580
+ handler.next(options);
581
+ }
582
+
583
+ @override
584
+ Future<void> onError(
585
+ DioException err,
586
+ ErrorInterceptorHandler handler,
587
+ ) async {
588
+ if (err.response?.statusCode != 401) {
589
+ return handler.next(err);
590
+ }
591
+
592
+ // Queue the request if already refreshing
593
+ if (_isRefreshing) {
594
+ _pendingRequests.add((options: err.requestOptions, handler: handler));
595
+ return;
596
+ }
597
+
598
+ _isRefreshing = true;
599
+
600
+ try {
601
+ final tokens = await _storage.getTokens();
602
+ if (tokens == null) {
603
+ return handler.next(err);
604
+ }
605
+
606
+ // Refresh token
607
+ final response = await _dio.post(
608
+ '/auth/refresh',
609
+ data: {'refresh_token': tokens.refreshToken},
610
+ options: Options(headers: {'Authorization': null}),
611
+ );
612
+
613
+ final newTokens = AuthTokensModel.fromJson(response.data);
614
+ await _storage.saveTokens(newTokens);
615
+
616
+ // Retry original request
617
+ final retryResponse = await _retryRequest(err.requestOptions, newTokens);
618
+ handler.resolve(retryResponse);
619
+
620
+ // Retry pending requests
621
+ for (final pending in _pendingRequests) {
622
+ final response = await _retryRequest(pending.options, newTokens);
623
+ pending.handler.resolve(response);
624
+ }
625
+ } on DioException catch (e) {
626
+ // Refresh failed - clear tokens and reject all pending
627
+ await _storage.clearTokens();
628
+ handler.next(e);
629
+
630
+ for (final pending in _pendingRequests) {
631
+ pending.handler.next(e);
632
+ }
633
+ } finally {
634
+ _isRefreshing = false;
635
+ _pendingRequests.clear();
636
+ }
637
+ }
638
+
639
+ Future<Response> _retryRequest(
640
+ RequestOptions options,
641
+ AuthTokensModel tokens,
642
+ ) async {
643
+ options.headers['Authorization'] = 'Bearer ${tokens.accessToken}';
644
+ return _dio.fetch(options);
645
+ }
646
+ }
647
+
648
+ // lib/core/network/interceptors/retry_interceptor.dart
649
+ class RetryInterceptor extends Interceptor {
650
+ final Dio _dio;
651
+ final int maxRetries;
652
+ final Duration retryDelay;
653
+
654
+ RetryInterceptor(
655
+ this._dio, {
656
+ this.maxRetries = 3,
657
+ this.retryDelay = const Duration(seconds: 1),
658
+ });
659
+
660
+ @override
661
+ Future<void> onError(
662
+ DioException err,
663
+ ErrorInterceptorHandler handler,
664
+ ) async {
665
+ final shouldRetry = _shouldRetry(err);
666
+ final retryCount = err.requestOptions.extra['retryCount'] ?? 0;
667
+
668
+ if (!shouldRetry || retryCount >= maxRetries) {
669
+ return handler.next(err);
670
+ }
671
+
672
+ await Future.delayed(retryDelay * (retryCount + 1));
673
+
674
+ try {
675
+ err.requestOptions.extra['retryCount'] = retryCount + 1;
676
+ final response = await _dio.fetch(err.requestOptions);
677
+ handler.resolve(response);
678
+ } on DioException catch (e) {
679
+ handler.next(e);
680
+ }
681
+ }
682
+
683
+ bool _shouldRetry(DioException err) {
684
+ return err.type == DioExceptionType.connectionTimeout ||
685
+ err.type == DioExceptionType.sendTimeout ||
686
+ err.type == DioExceptionType.receiveTimeout ||
687
+ (err.response?.statusCode != null &&
688
+ err.response!.statusCode! >= 500);
689
+ }
690
+ }
691
+ ```
692
+
693
+ ## Platform Channels
694
+
695
+ ### Complete Native Bridge
696
+
697
+ ```dart
698
+ // lib/core/platform/native_bridge.dart
699
+ class NativeBridge {
700
+ static const _methodChannel = MethodChannel('com.example.app/native');
701
+ static const _eventChannel = EventChannel('com.example.app/events');
702
+
703
+ // Singleton pattern
704
+ static final NativeBridge _instance = NativeBridge._();
705
+ static NativeBridge get instance => _instance;
706
+ NativeBridge._() {
707
+ _setupMethodCallHandler();
708
+ }
709
+
710
+ // Method calls
711
+ Future<String> getPlatformVersion() async {
712
+ try {
713
+ final version = await _methodChannel.invokeMethod<String>('getPlatformVersion');
714
+ return version ?? 'Unknown';
715
+ } on PlatformException catch (e) {
716
+ throw NativeBridgeException('Failed to get platform version: ${e.message}');
717
+ }
718
+ }
719
+
720
+ Future<DeviceInfo> getDeviceInfo() async {
721
+ try {
722
+ final result = await _methodChannel.invokeMapMethod<String, dynamic>('getDeviceInfo');
723
+ return DeviceInfo.fromMap(result ?? {});
724
+ } on PlatformException catch (e) {
725
+ throw NativeBridgeException('Failed to get device info: ${e.message}');
726
+ }
727
+ }
728
+
729
+ Future<void> shareContent({
730
+ required String text,
731
+ String? title,
732
+ String? url,
733
+ }) async {
734
+ try {
735
+ await _methodChannel.invokeMethod('share', {
736
+ 'text': text,
737
+ if (title != null) 'title': title,
738
+ if (url != null) 'url': url,
739
+ });
740
+ } on PlatformException catch (e) {
741
+ throw NativeBridgeException('Failed to share: ${e.message}');
742
+ }
743
+ }
744
+
745
+ Future<bool> requestPermission(PermissionType type) async {
746
+ try {
747
+ final result = await _methodChannel.invokeMethod<bool>(
748
+ 'requestPermission',
749
+ {'type': type.name},
750
+ );
751
+ return result ?? false;
752
+ } on PlatformException catch (e) {
753
+ throw NativeBridgeException('Failed to request permission: ${e.message}');
754
+ }
755
+ }
756
+
757
+ // Event streams
758
+ Stream<BatteryState> watchBatteryState() {
759
+ return _eventChannel.receiveBroadcastStream('battery').map((event) {
760
+ final data = event as Map<dynamic, dynamic>;
761
+ return BatteryState(
762
+ level: data['level'] as int,
763
+ isCharging: data['isCharging'] as bool,
764
+ );
765
+ });
766
+ }
767
+
768
+ Stream<ConnectivityState> watchConnectivity() {
769
+ return _eventChannel.receiveBroadcastStream('connectivity').map((event) {
770
+ final data = event as Map<dynamic, dynamic>;
771
+ return ConnectivityState(
772
+ isConnected: data['isConnected'] as bool,
773
+ type: ConnectivityType.values.byName(data['type'] as String),
774
+ );
775
+ });
776
+ }
777
+
778
+ // Bidirectional communication
779
+ void _setupMethodCallHandler() {
780
+ _methodChannel.setMethodCallHandler((call) async {
781
+ switch (call.method) {
782
+ case 'onDeepLink':
783
+ final url = call.arguments as String;
784
+ _handleDeepLink(url);
785
+ return true;
786
+ case 'onPushNotification':
787
+ final data = call.arguments as Map<dynamic, dynamic>;
788
+ _handlePushNotification(data.cast<String, dynamic>());
789
+ return true;
790
+ default:
791
+ throw MissingPluginException('Method not implemented: ${call.method}');
792
+ }
793
+ });
794
+ }
795
+
796
+ void _handleDeepLink(String url) {
797
+ // Handle deep link
798
+ debugPrint('Received deep link: $url');
799
+ }
800
+
801
+ void _handlePushNotification(Map<String, dynamic> data) {
802
+ // Handle push notification
803
+ debugPrint('Received notification: $data');
804
+ }
805
+ }
806
+
807
+ // Models
808
+ class DeviceInfo {
809
+ final String platform;
810
+ final String version;
811
+ final String model;
812
+ final String manufacturer;
813
+
814
+ const DeviceInfo({
815
+ required this.platform,
816
+ required this.version,
817
+ required this.model,
818
+ required this.manufacturer,
819
+ });
820
+
821
+ factory DeviceInfo.fromMap(Map<String, dynamic> map) => DeviceInfo(
822
+ platform: map['platform'] as String? ?? 'unknown',
823
+ version: map['version'] as String? ?? 'unknown',
824
+ model: map['model'] as String? ?? 'unknown',
825
+ manufacturer: map['manufacturer'] as String? ?? 'unknown',
826
+ );
827
+ }
828
+
829
+ class BatteryState {
830
+ final int level;
831
+ final bool isCharging;
832
+ const BatteryState({required this.level, required this.isCharging});
833
+ }
834
+
835
+ class ConnectivityState {
836
+ final bool isConnected;
837
+ final ConnectivityType type;
838
+ const ConnectivityState({required this.isConnected, required this.type});
839
+ }
840
+
841
+ enum ConnectivityType { none, wifi, mobile, ethernet }
842
+ enum PermissionType { camera, microphone, location, storage, notifications }
843
+
844
+ class NativeBridgeException implements Exception {
845
+ final String message;
846
+ const NativeBridgeException(this.message);
847
+
848
+ @override
849
+ String toString() => 'NativeBridgeException: $message';
850
+ }
851
+ ```
852
+
853
+ ## Testing Examples
854
+
855
+ ### Widget Tests with Riverpod
856
+
857
+ ```dart
858
+ // test/features/auth/presentation/screens/login_screen_test.dart
859
+ import 'package:flutter_test/flutter_test.dart';
860
+ import 'package:flutter_riverpod/flutter_riverpod.dart';
861
+ import 'package:mocktail/mocktail.dart';
862
+
863
+ class MockAuthRepository extends Mock implements AuthRepository {}
864
+
865
+ void main() {
866
+ late ProviderContainer container;
867
+ late MockAuthRepository mockAuthRepository;
868
+
869
+ setUp(() {
870
+ mockAuthRepository = MockAuthRepository();
871
+
872
+ // Default mock behavior
873
+ when(() => mockAuthRepository.restoreSession())
874
+ .thenAnswer((_) async => null);
875
+ when(() => mockAuthRepository.watchAuthState())
876
+ .thenAnswer((_) => const Stream.empty());
877
+
878
+ container = ProviderContainer(overrides: [
879
+ authRepositoryProvider.overrideWithValue(mockAuthRepository),
880
+ ]);
881
+ });
882
+
883
+ tearDown(() => container.dispose());
884
+
885
+ Widget buildTestWidget() {
886
+ return UncontrolledProviderScope(
887
+ container: container,
888
+ child: MaterialApp(
889
+ home: const LoginScreen(),
890
+ ),
891
+ );
892
+ }
893
+
894
+ group('LoginScreen', () {
895
+ testWidgets('renders email and password fields', (tester) async {
896
+ await tester.pumpWidget(buildTestWidget());
897
+
898
+ expect(find.byType(TextFormField), findsNWidgets(2));
899
+ expect(find.text('Email'), findsOneWidget);
900
+ expect(find.text('Password'), findsOneWidget);
901
+ });
902
+
903
+ testWidgets('shows validation errors for empty fields', (tester) async {
904
+ await tester.pumpWidget(buildTestWidget());
905
+
906
+ await tester.tap(find.byType(FilledButton));
907
+ await tester.pump();
908
+
909
+ expect(find.text('Please enter your email'), findsOneWidget);
910
+ expect(find.text('Please enter your password'), findsOneWidget);
911
+ });
912
+
913
+ testWidgets('shows validation error for invalid email', (tester) async {
914
+ await tester.pumpWidget(buildTestWidget());
915
+
916
+ await tester.enterText(
917
+ find.widgetWithText(TextFormField, 'Email'),
918
+ 'invalid-email',
919
+ );
920
+ await tester.enterText(
921
+ find.widgetWithText(TextFormField, 'Password'),
922
+ 'password123',
923
+ );
924
+
925
+ await tester.tap(find.byType(FilledButton));
926
+ await tester.pump();
927
+
928
+ expect(find.text('Please enter a valid email'), findsOneWidget);
929
+ });
930
+
931
+ testWidgets('calls login when form is valid', (tester) async {
932
+ when(() => mockAuthRepository.login(any(), any()))
933
+ .thenAnswer((_) async => const User(
934
+ id: '1',
935
+ email: 'test@example.com',
936
+ name: 'Test User',
937
+ ));
938
+
939
+ await tester.pumpWidget(buildTestWidget());
940
+
941
+ await tester.enterText(
942
+ find.widgetWithText(TextFormField, 'Email'),
943
+ 'test@example.com',
944
+ );
945
+ await tester.enterText(
946
+ find.widgetWithText(TextFormField, 'Password'),
947
+ 'password123',
948
+ );
949
+
950
+ await tester.tap(find.byType(FilledButton));
951
+ await tester.pump();
952
+
953
+ verify(() => mockAuthRepository.login('test@example.com', 'password123'))
954
+ .called(1);
955
+ });
956
+
957
+ testWidgets('shows loading indicator during login', (tester) async {
958
+ when(() => mockAuthRepository.login(any(), any()))
959
+ .thenAnswer((_) async {
960
+ await Future.delayed(const Duration(seconds: 2));
961
+ return const User(
962
+ id: '1',
963
+ email: 'test@example.com',
964
+ name: 'Test User',
965
+ );
966
+ });
967
+
968
+ await tester.pumpWidget(buildTestWidget());
969
+
970
+ await tester.enterText(
971
+ find.widgetWithText(TextFormField, 'Email'),
972
+ 'test@example.com',
973
+ );
974
+ await tester.enterText(
975
+ find.widgetWithText(TextFormField, 'Password'),
976
+ 'password123',
977
+ );
978
+
979
+ await tester.tap(find.byType(FilledButton));
980
+ await tester.pump();
981
+
982
+ expect(find.byType(CircularProgressIndicator), findsOneWidget);
983
+ });
984
+
985
+ testWidgets('shows error snackbar on login failure', (tester) async {
986
+ when(() => mockAuthRepository.login(any(), any()))
987
+ .thenThrow(const InvalidCredentialsError());
988
+
989
+ await tester.pumpWidget(buildTestWidget());
990
+
991
+ await tester.enterText(
992
+ find.widgetWithText(TextFormField, 'Email'),
993
+ 'test@example.com',
994
+ );
995
+ await tester.enterText(
996
+ find.widgetWithText(TextFormField, 'Password'),
997
+ 'wrongpassword',
998
+ );
999
+
1000
+ await tester.tap(find.byType(FilledButton));
1001
+ await tester.pumpAndSettle();
1002
+
1003
+ expect(find.byType(SnackBar), findsOneWidget);
1004
+ expect(find.text('Invalid email or password'), findsOneWidget);
1005
+ });
1006
+ });
1007
+ }
1008
+ ```
1009
+
1010
+ ### Integration Tests
1011
+
1012
+ ```dart
1013
+ // integration_test/auth_flow_test.dart
1014
+ import 'package:flutter_test/flutter_test.dart';
1015
+ import 'package:integration_test/integration_test.dart';
1016
+
1017
+ void main() {
1018
+ IntegrationTestWidgetsFlutterBinding.ensureInitialized();
1019
+
1020
+ group('Authentication Flow', () {
1021
+ testWidgets('complete login and logout flow', (tester) async {
1022
+ await tester.pumpWidget(const MyApp());
1023
+ await tester.pumpAndSettle();
1024
+
1025
+ // Verify we're on login screen
1026
+ expect(find.text('Welcome Back'), findsOneWidget);
1027
+
1028
+ // Enter credentials
1029
+ await tester.enterText(
1030
+ find.byKey(const Key('email_field')),
1031
+ 'test@example.com',
1032
+ );
1033
+ await tester.enterText(
1034
+ find.byKey(const Key('password_field')),
1035
+ 'password123',
1036
+ );
1037
+
1038
+ // Tap login
1039
+ await tester.tap(find.byKey(const Key('login_button')));
1040
+ await tester.pumpAndSettle();
1041
+
1042
+ // Verify navigation to home
1043
+ expect(find.byType(HomeScreen), findsOneWidget);
1044
+ expect(find.text('Test User'), findsOneWidget);
1045
+
1046
+ // Navigate to profile
1047
+ await tester.tap(find.byIcon(Icons.person));
1048
+ await tester.pumpAndSettle();
1049
+
1050
+ // Tap logout
1051
+ await tester.tap(find.text('Logout'));
1052
+ await tester.pumpAndSettle();
1053
+
1054
+ // Verify back on login screen
1055
+ expect(find.text('Welcome Back'), findsOneWidget);
1056
+ });
1057
+
1058
+ testWidgets('session restoration on app restart', (tester) async {
1059
+ // First launch - login
1060
+ await tester.pumpWidget(const MyApp());
1061
+ await tester.pumpAndSettle();
1062
+
1063
+ await tester.enterText(
1064
+ find.byKey(const Key('email_field')),
1065
+ 'test@example.com',
1066
+ );
1067
+ await tester.enterText(
1068
+ find.byKey(const Key('password_field')),
1069
+ 'password123',
1070
+ );
1071
+ await tester.tap(find.byKey(const Key('login_button')));
1072
+ await tester.pumpAndSettle();
1073
+
1074
+ expect(find.byType(HomeScreen), findsOneWidget);
1075
+
1076
+ // Simulate app restart
1077
+ await tester.pumpWidget(const MyApp());
1078
+ await tester.pumpAndSettle();
1079
+
1080
+ // Should restore session and show home
1081
+ expect(find.byType(HomeScreen), findsOneWidget);
1082
+ });
1083
+ });
1084
+ }
1085
+ ```
1086
+
1087
+ ---
1088
+
1089
+ Version: 1.0.0
1090
+ Last Updated: 2025-12-07