maxsim-flutter 1.0.0

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 (281) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/LICENSE +21 -0
  3. package/README.md +445 -0
  4. package/claude-plugin/.claude-plugin/plugin.json +46 -0
  5. package/claude-plugin/agents/flutter-setup-agent.md +54 -0
  6. package/claude-plugin/commands/flutter-add.md +32 -0
  7. package/claude-plugin/commands/flutter-create.md +28 -0
  8. package/claude-plugin/commands/flutter-migrate.md +28 -0
  9. package/claude-plugin/skills/flutter-scaffolding/SKILL.md +109 -0
  10. package/dist/claude-setup/agent-writer.d.ts +21 -0
  11. package/dist/claude-setup/agent-writer.d.ts.map +1 -0
  12. package/dist/claude-setup/agent-writer.js +365 -0
  13. package/dist/claude-setup/agent-writer.js.map +1 -0
  14. package/dist/claude-setup/claude-md-generator.d.ts +7 -0
  15. package/dist/claude-setup/claude-md-generator.d.ts.map +1 -0
  16. package/dist/claude-setup/claude-md-generator.js +428 -0
  17. package/dist/claude-setup/claude-md-generator.js.map +1 -0
  18. package/dist/claude-setup/commands-writer.d.ts +7 -0
  19. package/dist/claude-setup/commands-writer.d.ts.map +1 -0
  20. package/dist/claude-setup/commands-writer.js +303 -0
  21. package/dist/claude-setup/commands-writer.js.map +1 -0
  22. package/dist/claude-setup/hooks-writer.d.ts +3 -0
  23. package/dist/claude-setup/hooks-writer.d.ts.map +1 -0
  24. package/dist/claude-setup/hooks-writer.js +34 -0
  25. package/dist/claude-setup/hooks-writer.js.map +1 -0
  26. package/dist/claude-setup/index.d.ts +10 -0
  27. package/dist/claude-setup/index.d.ts.map +1 -0
  28. package/dist/claude-setup/index.js +9 -0
  29. package/dist/claude-setup/index.js.map +1 -0
  30. package/dist/claude-setup/mcp-config-writer.d.ts +3 -0
  31. package/dist/claude-setup/mcp-config-writer.d.ts.map +1 -0
  32. package/dist/claude-setup/mcp-config-writer.js +42 -0
  33. package/dist/claude-setup/mcp-config-writer.js.map +1 -0
  34. package/dist/claude-setup/plugin-assembler.d.ts +2 -0
  35. package/dist/claude-setup/plugin-assembler.d.ts.map +1 -0
  36. package/dist/claude-setup/plugin-assembler.js +3 -0
  37. package/dist/claude-setup/plugin-assembler.js.map +1 -0
  38. package/dist/claude-setup/prd-generator.d.ts +10 -0
  39. package/dist/claude-setup/prd-generator.d.ts.map +1 -0
  40. package/dist/claude-setup/prd-generator.js +295 -0
  41. package/dist/claude-setup/prd-generator.js.map +1 -0
  42. package/dist/claude-setup/setup-orchestrator.d.ts +11 -0
  43. package/dist/claude-setup/setup-orchestrator.d.ts.map +1 -0
  44. package/dist/claude-setup/setup-orchestrator.js +46 -0
  45. package/dist/claude-setup/setup-orchestrator.js.map +1 -0
  46. package/dist/claude-setup/skill-writer.d.ts +3 -0
  47. package/dist/claude-setup/skill-writer.d.ts.map +1 -0
  48. package/dist/claude-setup/skill-writer.js +256 -0
  49. package/dist/claude-setup/skill-writer.js.map +1 -0
  50. package/dist/cli/commands/add.d.ts +16 -0
  51. package/dist/cli/commands/add.d.ts.map +1 -0
  52. package/dist/cli/commands/add.js +414 -0
  53. package/dist/cli/commands/add.js.map +1 -0
  54. package/dist/cli/commands/create.d.ts +3 -0
  55. package/dist/cli/commands/create.d.ts.map +1 -0
  56. package/dist/cli/commands/create.js +161 -0
  57. package/dist/cli/commands/create.js.map +1 -0
  58. package/dist/cli/commands/list.d.ts +12 -0
  59. package/dist/cli/commands/list.d.ts.map +1 -0
  60. package/dist/cli/commands/list.js +148 -0
  61. package/dist/cli/commands/list.js.map +1 -0
  62. package/dist/cli/commands/migrate.d.ts +3 -0
  63. package/dist/cli/commands/migrate.d.ts.map +1 -0
  64. package/dist/cli/commands/migrate.js +332 -0
  65. package/dist/cli/commands/migrate.js.map +1 -0
  66. package/dist/cli/index.d.ts +3 -0
  67. package/dist/cli/index.d.ts.map +1 -0
  68. package/dist/cli/index.js +34 -0
  69. package/dist/cli/index.js.map +1 -0
  70. package/dist/cli/ui/prompts.d.ts +9 -0
  71. package/dist/cli/ui/prompts.d.ts.map +1 -0
  72. package/dist/cli/ui/prompts.js +74 -0
  73. package/dist/cli/ui/prompts.js.map +1 -0
  74. package/dist/cli/ui/spinner.d.ts +2 -0
  75. package/dist/cli/ui/spinner.d.ts.map +1 -0
  76. package/dist/cli/ui/spinner.js +5 -0
  77. package/dist/cli/ui/spinner.js.map +1 -0
  78. package/dist/cli/version-check.d.ts +7 -0
  79. package/dist/cli/version-check.d.ts.map +1 -0
  80. package/dist/cli/version-check.js +92 -0
  81. package/dist/cli/version-check.js.map +1 -0
  82. package/dist/core/config/defaults.d.ts +3 -0
  83. package/dist/core/config/defaults.d.ts.map +1 -0
  84. package/dist/core/config/defaults.js +21 -0
  85. package/dist/core/config/defaults.js.map +1 -0
  86. package/dist/core/config/loader.d.ts +4 -0
  87. package/dist/core/config/loader.d.ts.map +1 -0
  88. package/dist/core/config/loader.js +38 -0
  89. package/dist/core/config/loader.js.map +1 -0
  90. package/dist/core/config/schema.d.ts +406 -0
  91. package/dist/core/config/schema.d.ts.map +1 -0
  92. package/dist/core/config/schema.js +119 -0
  93. package/dist/core/config/schema.js.map +1 -0
  94. package/dist/core/context.d.ts +57 -0
  95. package/dist/core/context.d.ts.map +1 -0
  96. package/dist/core/context.js +99 -0
  97. package/dist/core/context.js.map +1 -0
  98. package/dist/core/detector.d.ts +28 -0
  99. package/dist/core/detector.d.ts.map +1 -0
  100. package/dist/core/detector.js +200 -0
  101. package/dist/core/detector.js.map +1 -0
  102. package/dist/core/validator.d.ts +7 -0
  103. package/dist/core/validator.d.ts.map +1 -0
  104. package/dist/core/validator.js +35 -0
  105. package/dist/core/validator.js.map +1 -0
  106. package/dist/index.d.ts +21 -0
  107. package/dist/index.d.ts.map +1 -0
  108. package/dist/index.js +14 -0
  109. package/dist/index.js.map +1 -0
  110. package/dist/modules/composer.d.ts +50 -0
  111. package/dist/modules/composer.d.ts.map +1 -0
  112. package/dist/modules/composer.js +122 -0
  113. package/dist/modules/composer.js.map +1 -0
  114. package/dist/modules/definitions/analytics/module.d.ts +7 -0
  115. package/dist/modules/definitions/analytics/module.d.ts.map +1 -0
  116. package/dist/modules/definitions/analytics/module.js +28 -0
  117. package/dist/modules/definitions/analytics/module.js.map +1 -0
  118. package/dist/modules/definitions/api/module.d.ts +7 -0
  119. package/dist/modules/definitions/api/module.d.ts.map +1 -0
  120. package/dist/modules/definitions/api/module.js +41 -0
  121. package/dist/modules/definitions/api/module.js.map +1 -0
  122. package/dist/modules/definitions/auth/module.d.ts +7 -0
  123. package/dist/modules/definitions/auth/module.d.ts.map +1 -0
  124. package/dist/modules/definitions/auth/module.js +53 -0
  125. package/dist/modules/definitions/auth/module.js.map +1 -0
  126. package/dist/modules/definitions/cicd/module.d.ts +7 -0
  127. package/dist/modules/definitions/cicd/module.d.ts.map +1 -0
  128. package/dist/modules/definitions/cicd/module.js +34 -0
  129. package/dist/modules/definitions/cicd/module.js.map +1 -0
  130. package/dist/modules/definitions/core/module.d.ts +7 -0
  131. package/dist/modules/definitions/core/module.d.ts.map +1 -0
  132. package/dist/modules/definitions/core/module.js +31 -0
  133. package/dist/modules/definitions/core/module.js.map +1 -0
  134. package/dist/modules/definitions/database/module.d.ts +8 -0
  135. package/dist/modules/definitions/database/module.d.ts.map +1 -0
  136. package/dist/modules/definitions/database/module.js +47 -0
  137. package/dist/modules/definitions/database/module.js.map +1 -0
  138. package/dist/modules/definitions/deep-linking/module.d.ts +7 -0
  139. package/dist/modules/definitions/deep-linking/module.d.ts.map +1 -0
  140. package/dist/modules/definitions/deep-linking/module.js +48 -0
  141. package/dist/modules/definitions/deep-linking/module.js.map +1 -0
  142. package/dist/modules/definitions/i18n/module.d.ts +7 -0
  143. package/dist/modules/definitions/i18n/module.d.ts.map +1 -0
  144. package/dist/modules/definitions/i18n/module.js +37 -0
  145. package/dist/modules/definitions/i18n/module.js.map +1 -0
  146. package/dist/modules/definitions/push/module.d.ts +7 -0
  147. package/dist/modules/definitions/push/module.d.ts.map +1 -0
  148. package/dist/modules/definitions/push/module.js +40 -0
  149. package/dist/modules/definitions/push/module.js.map +1 -0
  150. package/dist/modules/definitions/theme/module.d.ts +7 -0
  151. package/dist/modules/definitions/theme/module.d.ts.map +1 -0
  152. package/dist/modules/definitions/theme/module.js +42 -0
  153. package/dist/modules/definitions/theme/module.js.map +1 -0
  154. package/dist/modules/registry.d.ts +50 -0
  155. package/dist/modules/registry.d.ts.map +1 -0
  156. package/dist/modules/registry.js +104 -0
  157. package/dist/modules/registry.js.map +1 -0
  158. package/dist/modules/resolver.d.ts +42 -0
  159. package/dist/modules/resolver.d.ts.map +1 -0
  160. package/dist/modules/resolver.js +140 -0
  161. package/dist/modules/resolver.js.map +1 -0
  162. package/dist/ralph/prd-generator.d.ts +2 -0
  163. package/dist/ralph/prd-generator.d.ts.map +1 -0
  164. package/dist/ralph/prd-generator.js +3 -0
  165. package/dist/ralph/prd-generator.js.map +1 -0
  166. package/dist/ralph/ralph-converter.d.ts +2 -0
  167. package/dist/ralph/ralph-converter.d.ts.map +1 -0
  168. package/dist/ralph/ralph-converter.js +3 -0
  169. package/dist/ralph/ralph-converter.js.map +1 -0
  170. package/dist/ralph/story-sizer.d.ts +2 -0
  171. package/dist/ralph/story-sizer.d.ts.map +1 -0
  172. package/dist/ralph/story-sizer.js +3 -0
  173. package/dist/ralph/story-sizer.js.map +1 -0
  174. package/dist/scaffold/engine.d.ts +40 -0
  175. package/dist/scaffold/engine.d.ts.map +1 -0
  176. package/dist/scaffold/engine.js +233 -0
  177. package/dist/scaffold/engine.js.map +1 -0
  178. package/dist/scaffold/file-writer.d.ts +22 -0
  179. package/dist/scaffold/file-writer.d.ts.map +1 -0
  180. package/dist/scaffold/file-writer.js +68 -0
  181. package/dist/scaffold/file-writer.js.map +1 -0
  182. package/dist/scaffold/post-processors/build-runner.d.ts +2 -0
  183. package/dist/scaffold/post-processors/build-runner.d.ts.map +1 -0
  184. package/dist/scaffold/post-processors/build-runner.js +5 -0
  185. package/dist/scaffold/post-processors/build-runner.js.map +1 -0
  186. package/dist/scaffold/post-processors/dart-format.d.ts +2 -0
  187. package/dist/scaffold/post-processors/dart-format.d.ts.map +1 -0
  188. package/dist/scaffold/post-processors/dart-format.js +5 -0
  189. package/dist/scaffold/post-processors/dart-format.js.map +1 -0
  190. package/dist/scaffold/post-processors/flutter-pub-get.d.ts +2 -0
  191. package/dist/scaffold/post-processors/flutter-pub-get.d.ts.map +1 -0
  192. package/dist/scaffold/post-processors/flutter-pub-get.js +5 -0
  193. package/dist/scaffold/post-processors/flutter-pub-get.js.map +1 -0
  194. package/dist/scaffold/renderer.d.ts +20 -0
  195. package/dist/scaffold/renderer.d.ts.map +1 -0
  196. package/dist/scaffold/renderer.js +75 -0
  197. package/dist/scaffold/renderer.js.map +1 -0
  198. package/dist/scaffold/template-helpers.d.ts +25 -0
  199. package/dist/scaffold/template-helpers.d.ts.map +1 -0
  200. package/dist/scaffold/template-helpers.js +115 -0
  201. package/dist/scaffold/template-helpers.js.map +1 -0
  202. package/dist/types/config.d.ts +4 -0
  203. package/dist/types/config.d.ts.map +1 -0
  204. package/dist/types/config.js +2 -0
  205. package/dist/types/config.js.map +1 -0
  206. package/dist/types/module.d.ts +85 -0
  207. package/dist/types/module.d.ts.map +1 -0
  208. package/dist/types/module.js +2 -0
  209. package/dist/types/module.js.map +1 -0
  210. package/dist/types/project.d.ts +13 -0
  211. package/dist/types/project.d.ts.map +1 -0
  212. package/dist/types/project.js +2 -0
  213. package/dist/types/project.js.map +1 -0
  214. package/package.json +80 -0
  215. package/templates/core/analysis_options.yaml.hbs +21 -0
  216. package/templates/core/lib/app.dart.hbs +20 -0
  217. package/templates/core/lib/core/providers/app_providers.dart.hbs +3 -0
  218. package/templates/core/lib/core/router/app_router.dart.hbs +19 -0
  219. package/templates/core/lib/core/theme/app_theme.dart.hbs +15 -0
  220. package/templates/core/lib/features/home/data/models/.gitkeep +0 -0
  221. package/templates/core/lib/features/home/data/repositories/.gitkeep +0 -0
  222. package/templates/core/lib/features/home/domain/entities/.gitkeep +0 -0
  223. package/templates/core/lib/features/home/domain/repositories/.gitkeep +0 -0
  224. package/templates/core/lib/features/home/presentation/pages/home_page.dart.hbs +18 -0
  225. package/templates/core/lib/features/home/presentation/widgets/.gitkeep +0 -0
  226. package/templates/core/lib/main.dart.hbs +11 -0
  227. package/templates/core/pubspec.yaml.hbs +30 -0
  228. package/templates/core/test/widget_test.dart.hbs +16 -0
  229. package/templates/modules/analytics/lib/features/analytics/data/observers/analytics_route_observer.dart.hbs +53 -0
  230. package/templates/modules/analytics/lib/features/analytics/data/services/firebase_analytics_service.dart.hbs +39 -0
  231. package/templates/modules/analytics/lib/features/analytics/domain/services/analytics_service.dart.hbs +25 -0
  232. package/templates/modules/analytics/lib/features/analytics/presentation/providers/analytics_provider.dart.hbs +17 -0
  233. package/templates/modules/analytics/pubspec.partial.yaml +2 -0
  234. package/templates/modules/api/lib/features/api/data/datasources/api_client.dart.hbs +171 -0
  235. package/templates/modules/api/lib/features/api/data/interceptors/auth_interceptor.dart.hbs +25 -0
  236. package/templates/modules/api/lib/features/api/data/interceptors/retry_interceptor.dart.hbs +42 -0
  237. package/templates/modules/api/lib/features/api/data/repositories/api_repository_impl.dart.hbs +21 -0
  238. package/templates/modules/api/lib/features/api/domain/exceptions/api_exception.dart.hbs +31 -0
  239. package/templates/modules/api/lib/features/api/domain/repositories/api_repository.dart.hbs +8 -0
  240. package/templates/modules/api/lib/features/api/presentation/providers/api_provider.dart.hbs +17 -0
  241. package/templates/modules/api/pubspec.partial.yaml +7 -0
  242. package/templates/modules/auth/lib/features/auth/data/datasources/auth_remote_datasource.dart.hbs +181 -0
  243. package/templates/modules/auth/lib/features/auth/data/models/auth_user_model.dart.hbs +27 -0
  244. package/templates/modules/auth/lib/features/auth/data/repositories/auth_repository_impl.dart.hbs +49 -0
  245. package/templates/modules/auth/lib/features/auth/domain/entities/user_entity.dart.hbs +18 -0
  246. package/templates/modules/auth/lib/features/auth/domain/repositories/auth_repository.dart.hbs +22 -0
  247. package/templates/modules/auth/lib/features/auth/domain/usecases/register_usecase.dart.hbs +20 -0
  248. package/templates/modules/auth/lib/features/auth/domain/usecases/sign_in_usecase.dart.hbs +15 -0
  249. package/templates/modules/auth/lib/features/auth/domain/usecases/sign_out_usecase.dart.hbs +11 -0
  250. package/templates/modules/auth/lib/features/auth/presentation/pages/login_page.dart.hbs +118 -0
  251. package/templates/modules/auth/lib/features/auth/presentation/pages/register_page.dart.hbs +131 -0
  252. package/templates/modules/auth/lib/features/auth/presentation/providers/auth_provider.dart.hbs +31 -0
  253. package/templates/modules/auth/pubspec.partial.yaml +13 -0
  254. package/templates/modules/cicd/.github/workflows/ci.yml.hbs +45 -0
  255. package/templates/modules/cicd/.gitlab-ci.yml.hbs +53 -0
  256. package/templates/modules/cicd/bitbucket-pipelines.yml.hbs +39 -0
  257. package/templates/modules/cicd/pubspec.partial.yaml +1 -0
  258. package/templates/modules/database/lib/features/database/data/datasources/database_datasource.dart.hbs +115 -0
  259. package/templates/modules/database/lib/features/database/data/repositories/database_repository_impl.dart.hbs +73 -0
  260. package/templates/modules/database/lib/features/database/domain/repositories/database_repository.dart.hbs +10 -0
  261. package/templates/modules/database/lib/features/database/presentation/providers/database_provider.dart.hbs +43 -0
  262. package/templates/modules/database/pubspec.partial.yaml +27 -0
  263. package/templates/modules/deep-linking/lib/features/deep_linking/data/datasources/deep_link_datasource.dart.hbs +18 -0
  264. package/templates/modules/deep-linking/lib/features/deep_linking/data/repositories/deep_link_repository_impl.dart.hbs +14 -0
  265. package/templates/modules/deep-linking/lib/features/deep_linking/domain/repositories/deep_link_repository.dart.hbs +7 -0
  266. package/templates/modules/deep-linking/lib/features/deep_linking/presentation/providers/deep_link_provider.dart.hbs +57 -0
  267. package/templates/modules/deep-linking/pubspec.partial.yaml +2 -0
  268. package/templates/modules/i18n/l10n.yaml.hbs +5 -0
  269. package/templates/modules/i18n/lib/core/l10n/l10n_config.dart.hbs +29 -0
  270. package/templates/modules/i18n/lib/core/l10n/l10n_provider.dart.hbs +20 -0
  271. package/templates/modules/i18n/lib/l10n/app_de.arb.hbs +27 -0
  272. package/templates/modules/i18n/lib/l10n/app_en.arb.hbs +27 -0
  273. package/templates/modules/i18n/pubspec.partial.yaml +7 -0
  274. package/templates/modules/push/lib/features/push/data/datasources/push_datasource.dart.hbs +124 -0
  275. package/templates/modules/push/lib/features/push/data/repositories/push_repository_impl.dart.hbs +28 -0
  276. package/templates/modules/push/lib/features/push/domain/repositories/push_repository.dart.hbs +31 -0
  277. package/templates/modules/push/lib/features/push/presentation/providers/push_provider.dart.hbs +34 -0
  278. package/templates/modules/push/pubspec.partial.yaml +8 -0
  279. package/templates/modules/theme/lib/core/theme/app_theme.dart.hbs +74 -0
  280. package/templates/modules/theme/lib/core/theme/theme_provider.dart.hbs +46 -0
  281. package/templates/modules/theme/pubspec.partial.yaml +2 -0
@@ -0,0 +1,303 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'node:path';
3
+ /**
4
+ * Writes Claude Code slash command files for a scaffolded Flutter project.
5
+ * Commands provide step-by-step guidance for common development tasks.
6
+ */
7
+ export async function writeCommands(context, outputPath) {
8
+ const commandsDir = path.join(outputPath, '.claude', 'commands');
9
+ await fs.ensureDir(commandsDir);
10
+ await Promise.all([
11
+ fs.writeFile(path.join(commandsDir, 'add-feature.md'), generateAddFeatureCommand(context)),
12
+ fs.writeFile(path.join(commandsDir, 'analyze.md'), generateAnalyzeCommand()),
13
+ ]);
14
+ }
15
+ function generateAddFeatureCommand(context) {
16
+ const routerNote = context.modules.auth
17
+ ? `
18
+ ### Route Guard (if feature is protected)
19
+
20
+ Add an auth redirect in \`app_router.dart\`:
21
+
22
+ \`\`\`dart
23
+ redirect: (context, state) {
24
+ final isLoggedIn = ref.read(isLoggedInProvider);
25
+ if (!isLoggedIn && state.matchedLocation.startsWith('/<feature-path>')) {
26
+ return '/auth/login';
27
+ }
28
+ return null;
29
+ },
30
+ \`\`\`
31
+ `
32
+ : '';
33
+ const i18nNote = context.modules.i18n
34
+ ? `
35
+ ### Localization
36
+
37
+ Add new strings to \`lib/l10n/app_en.arb\` (and other locale files), then run:
38
+
39
+ \`\`\`bash
40
+ flutter gen-l10n
41
+ \`\`\`
42
+ `
43
+ : '';
44
+ return `# Add Feature
45
+
46
+ Add a new feature to this Flutter project following Clean Architecture.
47
+
48
+ ## Steps
49
+
50
+ ### 1. Create Feature Directory Structure
51
+
52
+ \`\`\`bash
53
+ mkdir -p lib/features/<name>/{domain/{entities,repositories,usecases},data/{datasources,models,repositories},presentation/{pages,widgets,providers}}
54
+ \`\`\`
55
+
56
+ ### 2. Domain Layer — Define Entities
57
+
58
+ Create \`lib/features/<name>/domain/entities/<name>.dart\`:
59
+
60
+ \`\`\`dart
61
+ import 'package:freezed_annotation/freezed_annotation.dart';
62
+
63
+ part '<name>.freezed.dart';
64
+
65
+ @freezed
66
+ class <Name> with _$<Name> {
67
+ const factory <Name>({
68
+ required String id,
69
+ // Add fields here
70
+ }) = _<Name>;
71
+ }
72
+ \`\`\`
73
+
74
+ ### 3. Domain Layer — Repository Interface
75
+
76
+ Create \`lib/features/<name>/domain/repositories/<name>_repository.dart\`:
77
+
78
+ \`\`\`dart
79
+ abstract class <Name>Repository {
80
+ Future<List<<Name>>> getAll();
81
+ Future<<Name>?> getById(String id);
82
+ Future<void> save(<Name> item);
83
+ Future<void> delete(String id);
84
+ }
85
+ \`\`\`
86
+
87
+ ### 4. Domain Layer — Use Cases
88
+
89
+ Create use case files in \`lib/features/<name>/domain/usecases/\`:
90
+
91
+ \`\`\`dart
92
+ // get_<name>_use_case.dart
93
+ class Get<Name>UseCase {
94
+ const Get<Name>UseCase(this._repository);
95
+ final <Name>Repository _repository;
96
+
97
+ Future<List<<Name>>> call() => _repository.getAll();
98
+ }
99
+ \`\`\`
100
+
101
+ ### 5. Data Layer — Model with Serialization
102
+
103
+ Create \`lib/features/<name>/data/models/<name>_model.dart\`:
104
+
105
+ \`\`\`dart
106
+ import 'package:freezed_annotation/freezed_annotation.dart';
107
+ import '../../domain/entities/<name>.dart';
108
+
109
+ part '<name>_model.freezed.dart';
110
+ part '<name>_model.g.dart';
111
+
112
+ @freezed
113
+ class <Name>Model with _$<Name>Model {
114
+ const factory <Name>Model({
115
+ required String id,
116
+ // Mirror entity fields, add JSON annotations as needed
117
+ }) = _<Name>Model;
118
+
119
+ factory <Name>Model.fromJson(Map<String, dynamic> json) =>
120
+ _$<Name>ModelFromJson(json);
121
+ }
122
+
123
+ extension <Name>ModelX on <Name>Model {
124
+ <Name> toDomain() => <Name>(id: id);
125
+ }
126
+ \`\`\`
127
+
128
+ ### 6. Data Layer — Data Source and Repository Impl
129
+
130
+ Create the data source and repository implementation, then run code generation:
131
+
132
+ \`\`\`bash
133
+ dart run build_runner build --delete-conflicting-outputs
134
+ \`\`\`
135
+
136
+ ### 7. Presentation Layer — Providers
137
+
138
+ Create \`lib/features/<name>/presentation/providers/<name>_providers.dart\`:
139
+
140
+ \`\`\`dart
141
+ import 'package:flutter_riverpod/flutter_riverpod.dart';
142
+ import '../../domain/entities/<name>.dart';
143
+ import '../../data/repositories/<name>_repository_impl.dart';
144
+
145
+ final <name>RepositoryProvider = Provider<<Name>Repository>((ref) {
146
+ return <Name>RepositoryImpl(/* data source */);
147
+ });
148
+
149
+ final <name>ListProvider = AsyncNotifierProvider<<Name>ListNotifier, List<<Name>>>(() {
150
+ return <Name>ListNotifier();
151
+ });
152
+
153
+ class <Name>ListNotifier extends AsyncNotifier<List<<Name>>> {
154
+ @override
155
+ Future<List<<Name>>> build() async {
156
+ return ref.watch(<name>RepositoryProvider).getAll();
157
+ }
158
+ }
159
+ \`\`\`
160
+
161
+ ### 8. Presentation Layer — Page and Widgets
162
+
163
+ Create pages in \`lib/features/<name>/presentation/pages/\` using \`ConsumerWidget\`:
164
+
165
+ \`\`\`dart
166
+ class <Name>Page extends ConsumerWidget {
167
+ const <Name>Page({super.key});
168
+
169
+ @override
170
+ Widget build(BuildContext context, WidgetRef ref) {
171
+ final items = ref.watch(<name>ListProvider);
172
+ return Scaffold(
173
+ appBar: AppBar(title: const Text('<Name>')),
174
+ body: items.when(
175
+ data: (list) => ListView.builder(
176
+ itemCount: list.length,
177
+ itemBuilder: (context, i) => ListTile(title: Text(list[i].id)),
178
+ ),
179
+ loading: () => const Center(child: CircularProgressIndicator()),
180
+ error: (e, _) => Center(child: Text('Error: $e')),
181
+ ),
182
+ );
183
+ }
184
+ }
185
+ \`\`\`
186
+
187
+ ### 9. Add Route to app_router.dart
188
+
189
+ \`\`\`dart
190
+ @TypedGoRoute<<Name>Route>(path: '/<name>')
191
+ @immutable
192
+ class <Name>Route extends GoRouteData {
193
+ const <Name>Route();
194
+
195
+ @override
196
+ Widget build(BuildContext context, GoRouterState state) => const <Name>Page();
197
+ }
198
+ \`\`\`
199
+
200
+ Run code generation again after adding routes:
201
+ \`\`\`bash
202
+ dart run build_runner build --delete-conflicting-outputs
203
+ \`\`\`
204
+ ${routerNote}${i18nNote}
205
+ ### 10. Write Tests
206
+
207
+ Create tests in \`test/features/<name>/\`:
208
+
209
+ \`\`\`bash
210
+ mkdir -p test/features/<name>/{domain,data,presentation}
211
+ \`\`\`
212
+
213
+ Run all tests to verify:
214
+ \`\`\`bash
215
+ flutter test
216
+ \`\`\`
217
+ `;
218
+ }
219
+ function generateAnalyzeCommand() {
220
+ return `# Analyze
221
+
222
+ Run Flutter static analysis and interpret the results.
223
+
224
+ ## Run Analysis
225
+
226
+ \`\`\`bash
227
+ flutter analyze
228
+ \`\`\`
229
+
230
+ ## Interpret Results
231
+
232
+ ### Error Severity Levels
233
+
234
+ | Level | Meaning | Action Required |
235
+ |-------|---------|-----------------|
236
+ | \`error\` | Code will not compile or has critical issues | Must fix before building |
237
+ | \`warning\` | Potential runtime issues or bad practices | Should fix |
238
+ | \`info\` | Style suggestions | Fix when convenient |
239
+
240
+ ### Common Errors and Fixes
241
+
242
+ **Missing return type**
243
+ \`\`\`
244
+ info - lib/foo.dart:5:3 - Missing return type annotation
245
+ \`\`\`
246
+ Fix: Add explicit return type to the function.
247
+
248
+ **Unused import**
249
+ \`\`\`
250
+ info - lib/foo.dart:1:1 - Unused import: 'package:...'
251
+ \`\`\`
252
+ Fix: Remove the unused import line.
253
+
254
+ **Undefined name**
255
+ \`\`\`
256
+ error - lib/foo.dart:10:5 - Undefined name 'MyClass'
257
+ \`\`\`
258
+ Fix: Add the missing import or check for typos.
259
+
260
+ **Dead code**
261
+ \`\`\`
262
+ hint - lib/foo.dart:20:5 - Dead code
263
+ \`\`\`
264
+ Fix: Remove unreachable code after a return statement.
265
+
266
+ **Type mismatch**
267
+ \`\`\`
268
+ error - lib/foo.dart:15:12 - A value of type 'String' can't be assigned to a variable of type 'int'
269
+ \`\`\`
270
+ Fix: Ensure type consistency, add explicit casts if necessary.
271
+
272
+ **Missing await**
273
+ \`\`\`
274
+ warning - lib/foo.dart:8:3 - Missing 'await' before 'Future'
275
+ \`\`\`
276
+ Fix: Add \`await\` to the async call.
277
+
278
+ ## Fix All Auto-fixable Issues
279
+
280
+ \`\`\`bash
281
+ dart fix --apply
282
+ \`\`\`
283
+
284
+ ## Format Code
285
+
286
+ \`\`\`bash
287
+ dart format .
288
+ \`\`\`
289
+
290
+ ## Run Tests After Fixing
291
+
292
+ \`\`\`bash
293
+ flutter test
294
+ \`\`\`
295
+
296
+ ## Full Quality Check
297
+
298
+ \`\`\`bash
299
+ flutter analyze && flutter test && dart format --set-exit-if-changed .
300
+ \`\`\`
301
+ `;
302
+ }
303
+ //# sourceMappingURL=commands-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands-writer.js","sourceRoot":"","sources":["../../src/claude-setup/commands-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAuB,EAAE,UAAkB;IAC7E,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACjE,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAEhC,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,EAAE,yBAAyB,CAAC,OAAO,CAAC,CAAC;QAC1F,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,sBAAsB,EAAE,CAAC;KAC7E,CAAC,CAAC;AACL,CAAC;AAED,SAAS,yBAAyB,CAAC,OAAuB;IACxD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI;QACrC,CAAC,CAAC;;;;;;;;;;;;;;CAcL;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI;QACnC,CAAC,CAAC;;;;;;;;CAQL;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgKP,UAAU,GAAG,QAAQ;;;;;;;;;;;;;CAatB,CAAC;AACF,CAAC;AAED,SAAS,sBAAsB;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiFR,CAAC;AACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ProjectContext } from '../core/context.js';
2
+ export declare function writeHooks(context: ProjectContext, outputPath: string): Promise<void>;
3
+ //# sourceMappingURL=hooks-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-writer.d.ts","sourceRoot":"","sources":["../../src/claude-setup/hooks-writer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAmBzD,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC3F"}
@@ -0,0 +1,34 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'node:path';
3
+ export async function writeHooks(context, outputPath) {
4
+ const claudeDir = path.join(outputPath, '.claude');
5
+ await fs.ensureDir(claudeDir);
6
+ const hooks = {
7
+ TaskCompleted: [
8
+ {
9
+ hooks: [
10
+ {
11
+ type: 'command',
12
+ command: 'flutter analyze && flutter test',
13
+ },
14
+ ],
15
+ },
16
+ ],
17
+ };
18
+ if (context.claude?.agentTeams) {
19
+ hooks.TeammateIdle = [
20
+ {
21
+ hooks: [
22
+ {
23
+ type: 'command',
24
+ command: 'git diff --stat HEAD && git status --porcelain',
25
+ },
26
+ ],
27
+ },
28
+ ];
29
+ }
30
+ const config = { hooks };
31
+ const settingsPath = path.join(claudeDir, 'settings.local.json');
32
+ await fs.writeFile(settingsPath, JSON.stringify(config, null, 2) + '\n');
33
+ }
34
+ //# sourceMappingURL=hooks-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-writer.js","sourceRoot":"","sources":["../../src/claude-setup/hooks-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAoB7B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAuB,EAAE,UAAkB;IAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAE9B,MAAM,KAAK,GAAyB;QAClC,aAAa,EAAE;YACb;gBACE,KAAK,EAAE;oBACL;wBACE,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,iCAAiC;qBAC3C;iBACF;aACF;SACF;KACF,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;QAC/B,KAAK,CAAC,YAAY,GAAG;YACnB;gBACE,KAAK,EAAE;oBACL;wBACE,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,gDAAgD;qBAC1D;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAgB,EAAE,KAAK,EAAE,CAAC;IAEtC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;IACjE,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { generateClaudeMd } from './claude-md-generator.js';
2
+ export { writeAgents, buildAgentDefinitions } from './agent-writer.js';
3
+ export { writeSkills } from './skill-writer.js';
4
+ export { writeHooks } from './hooks-writer.js';
5
+ export { writeMcpConfig } from './mcp-config-writer.js';
6
+ export { writeCommands } from './commands-writer.js';
7
+ export { generatePrd } from './prd-generator.js';
8
+ export { runClaudeSetup } from './setup-orchestrator.js';
9
+ export type { ClaudeSetupResult } from './setup-orchestrator.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/claude-setup/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { generateClaudeMd } from './claude-md-generator.js';
2
+ export { writeAgents, buildAgentDefinitions } from './agent-writer.js';
3
+ export { writeSkills } from './skill-writer.js';
4
+ export { writeHooks } from './hooks-writer.js';
5
+ export { writeMcpConfig } from './mcp-config-writer.js';
6
+ export { writeCommands } from './commands-writer.js';
7
+ export { generatePrd } from './prd-generator.js';
8
+ export { runClaudeSetup } from './setup-orchestrator.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/claude-setup/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ProjectContext } from '../core/context.js';
2
+ export declare function writeMcpConfig(context: ProjectContext, outputPath: string): Promise<void>;
3
+ //# sourceMappingURL=mcp-config-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config-writer.d.ts","sourceRoot":"","sources":["../../src/claude-setup/mcp-config-writer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAYzD,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/F"}
@@ -0,0 +1,42 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'node:path';
3
+ export async function writeMcpConfig(context, outputPath) {
4
+ const config = buildMcpConfig(context);
5
+ const mcpPath = path.join(outputPath, '.mcp.json');
6
+ await fs.writeFile(mcpPath, JSON.stringify(config, null, 2) + '\n');
7
+ }
8
+ function buildMcpConfig(context) {
9
+ const servers = {};
10
+ if (needsFirebaseMcp(context)) {
11
+ servers['firebase'] = {
12
+ command: 'npx',
13
+ args: ['-y', '@firebase/mcp'],
14
+ };
15
+ }
16
+ if (needsSupabaseMcp(context)) {
17
+ servers['supabase'] = {
18
+ command: 'npx',
19
+ args: ['-y', '@supabase/mcp-server-supabase@latest'],
20
+ env: {
21
+ SUPABASE_ACCESS_TOKEN: '',
22
+ },
23
+ };
24
+ }
25
+ return { mcpServers: servers };
26
+ }
27
+ function needsFirebaseMcp(context) {
28
+ if (context.modules.auth && context.modules.auth.provider === 'firebase') {
29
+ return true;
30
+ }
31
+ if (context.modules.push && context.modules.push.provider === 'firebase') {
32
+ return true;
33
+ }
34
+ if (context.modules.analytics !== false && context.modules.analytics) {
35
+ return true;
36
+ }
37
+ return false;
38
+ }
39
+ function needsSupabaseMcp(context) {
40
+ return !!(context.modules.auth && context.modules.auth.provider === 'supabase');
41
+ }
42
+ //# sourceMappingURL=mcp-config-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config-writer.js","sourceRoot":"","sources":["../../src/claude-setup/mcp-config-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAa7B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAuB,EAAE,UAAkB;IAC9E,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACnD,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,cAAc,CAAC,OAAuB;IAC7C,MAAM,OAAO,GAAoC,EAAE,CAAC;IAEpD,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,UAAU,CAAC,GAAG;YACpB,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC;SAC9B,CAAC;IACJ,CAAC;IAED,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,UAAU,CAAC,GAAG;YACpB,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,CAAC,IAAI,EAAE,sCAAsC,CAAC;YACpD,GAAG,EAAE;gBACH,qBAAqB,EAAE,EAAE;aAC1B;SACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAuB;IAC/C,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,KAAK,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAuB;IAC/C,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;AAClF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plugin-assembler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-assembler.d.ts","sourceRoot":"","sources":["../../src/claude-setup/plugin-assembler.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export {};
2
+ // Plugin assembler - to be implemented by P3-005
3
+ //# sourceMappingURL=plugin-assembler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-assembler.js","sourceRoot":"","sources":["../../src/claude-setup/plugin-assembler.ts"],"names":[],"mappings":";AAAA,iDAAiD"}
@@ -0,0 +1,10 @@
1
+ import type { ProjectContext } from '../core/context.js';
2
+ /**
3
+ * Generates a prd.json for the scaffolded Flutter project.
4
+ * Stories are organized into three phases:
5
+ * Phase 1 - Core app setup and basic navigation
6
+ * Phase 2 - Module-specific features (conditional on enabled modules)
7
+ * Phase 3 - Integration and end-to-end testing
8
+ */
9
+ export declare function generatePrd(context: ProjectContext): string;
10
+ //# sourceMappingURL=prd-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prd-generator.d.ts","sourceRoot":"","sources":["../../src/claude-setup/prd-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAkBzD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAoB3D"}