maxsim-flutter 1.19.0 → 1.20.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.
@@ -1 +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"}
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;AAoBzD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAiC3D"}
@@ -1,3 +1,12 @@
1
+ function ac(description) {
2
+ return { description };
3
+ }
4
+ function prefixedStories(inputs, phase, prefix) {
5
+ return inputs.map((story, i) => ({
6
+ ...story,
7
+ id: `P${phase}-${prefix}-${String(i + 1).padStart(3, '0')}`,
8
+ }));
9
+ }
1
10
  /**
2
11
  * Generates a prd.json for the scaffolded Flutter project.
3
12
  * Stories are organized into three phases:
@@ -6,36 +15,51 @@
6
15
  * Phase 3 - Integration and end-to-end testing
7
16
  */
8
17
  export function generatePrd(context) {
9
- const rawStories = [
10
- ...generatePhase1Stories(context),
11
- ...generatePhase2Stories(context),
12
- ...generatePhase3Stories(context),
18
+ const phase1Stories = prefixedStories(buildPhase1Inputs(context), 1, 'CORE');
19
+ const phase1Ids = phase1Stories.map((s) => s.id);
20
+ const phase2Stories = buildPhase2Stories(context, phase1Ids);
21
+ const phase3Stories = buildPhase3Stories(context, phase1Ids, phase2Stories);
22
+ const phases = [
23
+ {
24
+ phase: 1,
25
+ title: 'Core Setup',
26
+ description: 'Core app structure, routing, and state management',
27
+ },
28
+ {
29
+ phase: 2,
30
+ title: 'Module Features',
31
+ description: 'Module-specific features conditional on enabled configuration',
32
+ },
33
+ {
34
+ phase: 3,
35
+ title: 'Integration & Quality',
36
+ description: 'Integration testing and final quality audit',
37
+ },
13
38
  ];
14
- // Assign sequential IDs
15
- const numbered = rawStories.map((story, index) => ({
16
- ...story,
17
- id: `S-${String(index + 1).padStart(3, '0')}`,
18
- }));
19
39
  const prd = {
20
- version: '1.0.0',
40
+ version: '2.0.0',
21
41
  project: context.projectName,
22
- stories: numbered,
42
+ generatedAt: new Date().toISOString(),
43
+ phases,
44
+ stories: [...phase1Stories, ...phase2Stories, ...phase3Stories],
23
45
  };
24
46
  return JSON.stringify(prd, null, 2) + '\n';
25
47
  }
26
- function generatePhase1Stories(context) {
48
+ function buildPhase1Inputs(context) {
27
49
  return [
28
50
  {
29
51
  phase: 1,
30
52
  priority: 'P0',
31
53
  title: 'Setup Clean Architecture project structure',
32
54
  description: `Verify and finalize the scaffolded project structure for ${context.projectName}. Ensure all directories follow Clean Architecture conventions with domain, data, and presentation layers per feature. Configure analysis_options.yaml with appropriate lint rules.`,
55
+ storyPoints: 3,
56
+ dependencies: [],
33
57
  acceptanceCriteria: [
34
- '`lib/features/` directory exists with at minimum a `home` feature',
35
- 'Each feature contains `domain/`, `data/`, and `presentation/` subdirectories',
36
- '`lib/core/` contains router, theme, and providers directories',
37
- '`flutter analyze` reports zero errors',
38
- '`dart format --set-exit-if-changed .` passes',
58
+ ac('`lib/features/` directory exists with at minimum a `home` feature'),
59
+ ac('Each feature contains `domain/`, `data/`, and `presentation/` subdirectories'),
60
+ ac('`lib/core/` contains router, theme, and providers directories'),
61
+ ac('`flutter analyze` reports zero errors'),
62
+ ac('`dart format --set-exit-if-changed .` passes'),
39
63
  ],
40
64
  passes: false,
41
65
  },
@@ -44,12 +68,14 @@ function generatePhase1Stories(context) {
44
68
  priority: 'P0',
45
69
  title: 'Configure go_router with type-safe routes',
46
70
  description: 'Set up go_router in `lib/core/router/app_router.dart` using TypedGoRoute annotations. Define initial route to HomeRoute. Register the router as a Riverpod provider. Run build_runner to generate route code.',
71
+ storyPoints: 5,
72
+ dependencies: [],
47
73
  acceptanceCriteria: [
48
- '`lib/core/router/app_router.dart` exists with GoRouter configuration',
49
- 'Router is exposed as a Riverpod provider (`routerProvider`)',
50
- '`HomeRoute` is defined with `@TypedGoRoute(path: \'/\')`',
51
- '`lib/core/router/app_router.g.dart` is generated by build_runner',
52
- '`flutter analyze` reports zero errors',
74
+ ac('`lib/core/router/app_router.dart` exists with GoRouter configuration'),
75
+ ac('Router is exposed as a Riverpod provider (`routerProvider`)'),
76
+ ac('`HomeRoute` is defined with `@TypedGoRoute(path: \'/\')`'),
77
+ ac('`lib/core/router/app_router.g.dart` is generated by build_runner'),
78
+ ac('`flutter analyze` reports zero errors'),
53
79
  ],
54
80
  passes: false,
55
81
  },
@@ -58,11 +84,13 @@ function generatePhase1Stories(context) {
58
84
  priority: 'P0',
59
85
  title: 'Configure Riverpod ProviderScope and global providers',
60
86
  description: 'Ensure `main.dart` wraps the app in `ProviderScope`. Set up `lib/core/providers/app_providers.dart` as a barrel export for all core providers. Verify the app boots without errors.',
87
+ storyPoints: 3,
88
+ dependencies: [],
61
89
  acceptanceCriteria: [
62
- '`main.dart` wraps `runApp` with `ProviderScope`',
63
- '`lib/core/providers/app_providers.dart` exports core providers',
64
- 'App compiles and runs without errors',
65
- '`flutter analyze` reports zero errors',
90
+ ac('`main.dart` wraps `runApp` with `ProviderScope`'),
91
+ ac('`lib/core/providers/app_providers.dart` exports core providers'),
92
+ ac('App compiles and runs without errors'),
93
+ ac('`flutter analyze` reports zero errors'),
66
94
  ],
67
95
  passes: false,
68
96
  },
@@ -71,186 +99,263 @@ function generatePhase1Stories(context) {
71
99
  priority: 'P1',
72
100
  title: `Implement ${context.projectName} home screen`,
73
101
  description: `Build the initial home screen at \`lib/features/home/presentation/pages/home_page.dart\`. The page should use ConsumerWidget and display the project name. Wire it up to the \`/\` route in app_router.`,
102
+ storyPoints: 2,
103
+ dependencies: [],
74
104
  acceptanceCriteria: [
75
- '`home_page.dart` exists and extends `ConsumerWidget`',
76
- 'Home page displays the app name or a welcome message',
77
- 'Route `/` navigates to the home page',
78
- 'Widget test in `test/features/home/` passes',
79
- '`flutter test` passes all tests',
105
+ ac('`home_page.dart` exists and extends `ConsumerWidget`'),
106
+ ac('Home page displays the app name or a welcome message'),
107
+ ac('Route `/` navigates to the home page'),
108
+ ac('Widget test in `test/features/home/` passes'),
109
+ ac('`flutter test` passes all tests'),
80
110
  ],
81
111
  passes: false,
82
112
  },
83
113
  ];
84
114
  }
85
- function generatePhase2Stories(context) {
115
+ function buildPhase2Stories(context, phase1Ids) {
86
116
  const stories = [];
117
+ const coreSetupId = phase1Ids[0]; // P1-CORE-001
118
+ const routerId = phase1Ids[1]; // P1-CORE-002
119
+ const riverpodId = phase1Ids[2]; // P1-CORE-003
87
120
  if (context.modules.auth) {
88
121
  const provider = context.modules.auth.provider;
89
- const providerLabel = provider === 'firebase' ? 'Firebase Auth' : provider === 'supabase' ? 'Supabase Auth' : 'custom auth';
90
- stories.push({
91
- phase: 2,
92
- priority: 'P0',
93
- title: `Implement authentication with ${providerLabel}`,
94
- description: `Build the auth feature in \`lib/features/auth/\` following Clean Architecture. Domain layer: \`AuthRepository\` interface and \`User\` entity. Data layer: \`${capitalize(provider)}AuthDataSource\` and \`AuthRepositoryImpl\`. Presentation layer: \`authRepositoryProvider\`, login page, register page. Add auth guard to go_router redirect.`,
95
- acceptanceCriteria: [
96
- '`lib/features/auth/domain/repositories/auth_repository.dart` defines `AuthRepository` interface',
97
- '`lib/features/auth/domain/entities/user.dart` defines `User` entity with freezed',
98
- 'Auth repository implementation connects to ' + providerLabel,
99
- '`/login` and `/register` routes exist and render auth pages',
100
- 'Auth guard in go_router redirects unauthenticated users to `/login`',
101
- 'Unit tests for auth use cases pass',
102
- '`flutter analyze` reports zero errors',
103
- ],
104
- passes: false,
105
- });
122
+ const providerLabel = provider === 'firebase'
123
+ ? 'Firebase Auth'
124
+ : provider === 'supabase'
125
+ ? 'Supabase Auth'
126
+ : 'custom auth';
127
+ const inputs = [
128
+ {
129
+ phase: 2,
130
+ priority: 'P0',
131
+ module: 'auth',
132
+ title: `Implement authentication with ${providerLabel}`,
133
+ description: `Build the auth feature in \`lib/features/auth/\` following Clean Architecture. Domain layer: \`AuthRepository\` interface and \`User\` entity. Data layer: \`${capitalize(provider)}AuthDataSource\` and \`AuthRepositoryImpl\`. Presentation layer: \`authRepositoryProvider\`, login page, register page. Add auth guard to go_router redirect.`,
134
+ storyPoints: 8,
135
+ dependencies: [coreSetupId, routerId, riverpodId],
136
+ acceptanceCriteria: [
137
+ ac('`lib/features/auth/domain/repositories/auth_repository.dart` defines `AuthRepository` interface'),
138
+ ac('`lib/features/auth/domain/entities/user.dart` defines `User` entity with freezed'),
139
+ ac('Auth repository implementation connects to ' + providerLabel),
140
+ ac('`/login` and `/register` routes exist and render auth pages'),
141
+ ac('Auth guard in go_router redirects unauthenticated users to `/login`'),
142
+ ac('Unit tests for auth use cases pass'),
143
+ ac('`flutter analyze` reports zero errors'),
144
+ ],
145
+ passes: false,
146
+ },
147
+ ];
148
+ stories.push(...prefixedStories(inputs, 2, 'AUTH'));
106
149
  }
107
150
  if (context.modules.api) {
108
151
  const baseUrl = context.modules.api.baseUrl ?? 'API_BASE_URL env variable';
109
- stories.push({
110
- phase: 2,
111
- priority: 'P1',
112
- title: 'Implement API client with Dio and interceptors',
113
- description: `Configure a Dio HTTP client in \`lib/features/api/\`. Base URL: ${baseUrl}. Add interceptors for auth token injection, retry on transient failures, and request logging. Expose via \`dioClientProvider\`. Define \`ApiException\` for typed error handling.`,
114
- acceptanceCriteria: [
115
- '`dioClientProvider` is a Riverpod Provider returning a configured `Dio` instance',
116
- 'Auth interceptor injects Bearer token from auth state (if auth module is enabled)',
117
- 'Retry interceptor handles 5xx errors with exponential backoff',
118
- '`ApiException` maps HTTP status codes to typed errors',
119
- 'Unit tests for interceptors pass',
120
- '`flutter analyze` reports zero errors',
121
- ],
122
- passes: false,
123
- });
152
+ const inputs = [
153
+ {
154
+ phase: 2,
155
+ priority: 'P1',
156
+ module: 'api',
157
+ title: 'Implement API client with Dio and interceptors',
158
+ description: `Configure a Dio HTTP client in \`lib/features/api/\`. Base URL: ${baseUrl}. Add interceptors for auth token injection, retry on transient failures, and request logging. Expose via \`dioClientProvider\`. Define \`ApiException\` for typed error handling.`,
159
+ storyPoints: 5,
160
+ dependencies: [coreSetupId, riverpodId],
161
+ acceptanceCriteria: [
162
+ ac('`dioClientProvider` is a Riverpod Provider returning a configured `Dio` instance'),
163
+ ac('Auth interceptor injects Bearer token from auth state (if auth module is enabled)'),
164
+ ac('Retry interceptor handles 5xx errors with exponential backoff'),
165
+ ac('`ApiException` maps HTTP status codes to typed errors'),
166
+ ac('Unit tests for interceptors pass'),
167
+ ac('`flutter analyze` reports zero errors'),
168
+ ],
169
+ passes: false,
170
+ },
171
+ ];
172
+ stories.push(...prefixedStories(inputs, 2, 'API'));
124
173
  }
125
174
  if (context.modules.database) {
126
175
  const engine = context.modules.database.engine;
127
176
  const engineLabel = engine === 'drift' ? 'Drift (SQLite)' : engine === 'hive' ? 'Hive' : 'Isar';
128
- stories.push({
129
- phase: 2,
130
- priority: 'P1',
131
- title: `Configure local database with ${engineLabel}`,
132
- description: `Set up ${engineLabel} in \`lib/features/database/\`. Define initial schema/collections. Expose database via \`databaseProvider\`. Add initialization in main.dart before runApp. Run build_runner to generate database code.`,
133
- acceptanceCriteria: [
134
- `${engineLabel} is initialized before the app starts`,
135
- '`databaseProvider` exposes the database instance via Riverpod',
136
- engine === 'drift' ? '`AppDatabase` class with at least one table defined' : `${engineLabel} adapter/collection defined`,
137
- 'build_runner generates code without conflicts',
138
- 'Unit test verifies database can be opened and written to',
139
- '`flutter analyze` reports zero errors',
140
- ],
141
- passes: false,
142
- });
177
+ const inputs = [
178
+ {
179
+ phase: 2,
180
+ priority: 'P1',
181
+ module: 'database',
182
+ title: `Configure local database with ${engineLabel}`,
183
+ description: `Set up ${engineLabel} in \`lib/features/database/\`. Define initial schema/collections. Expose database via \`databaseProvider\`. Add initialization in main.dart before runApp. Run build_runner to generate database code.`,
184
+ storyPoints: 5,
185
+ dependencies: [coreSetupId, riverpodId],
186
+ acceptanceCriteria: [
187
+ ac(`${engineLabel} is initialized before the app starts`),
188
+ ac('`databaseProvider` exposes the database instance via Riverpod'),
189
+ ac(engine === 'drift'
190
+ ? '`AppDatabase` class with at least one table defined'
191
+ : `${engineLabel} adapter/collection defined`),
192
+ ac('build_runner generates code without conflicts'),
193
+ ac('Unit test verifies database can be opened and written to'),
194
+ ac('`flutter analyze` reports zero errors'),
195
+ ],
196
+ passes: false,
197
+ },
198
+ ];
199
+ stories.push(...prefixedStories(inputs, 2, 'DB'));
143
200
  }
144
201
  if (context.modules.i18n) {
145
202
  const { defaultLocale, supportedLocales } = context.modules.i18n;
146
- stories.push({
147
- phase: 2,
148
- priority: 'P1',
149
- title: 'Implement internationalization with flutter_localizations',
150
- description: `Set up i18n in \`lib/core/l10n/\`. Create ARB files for: ${supportedLocales.join(', ')} (default: ${defaultLocale}). Run \`flutter gen-l10n\` to generate \`AppLocalizations\`. Update MaterialApp to include localization delegates.`,
151
- acceptanceCriteria: [
152
- `ARB files exist for all supported locales: ${supportedLocales.join(', ')}`,
153
- '`AppLocalizations` is generated and available via `AppLocalizations.of(context)!`',
154
- 'MaterialApp includes `AppLocalizations.delegate` and `supportedLocales`',
155
- 'At minimum, app title and home screen greeting are localized',
156
- '`flutter analyze` reports zero errors',
157
- ],
158
- passes: false,
159
- });
203
+ const inputs = [
204
+ {
205
+ phase: 2,
206
+ priority: 'P1',
207
+ module: 'i18n',
208
+ title: 'Implement internationalization with flutter_localizations',
209
+ description: `Set up i18n in \`lib/core/l10n/\`. Create ARB files for: ${supportedLocales.join(', ')} (default: ${defaultLocale}). Run \`flutter gen-l10n\` to generate \`AppLocalizations\`. Update MaterialApp to include localization delegates.`,
210
+ storyPoints: 3,
211
+ dependencies: [coreSetupId],
212
+ acceptanceCriteria: [
213
+ ac(`ARB files exist for all supported locales: ${supportedLocales.join(', ')}`),
214
+ ac('`AppLocalizations` is generated and available via `AppLocalizations.of(context)!`'),
215
+ ac('MaterialApp includes `AppLocalizations.delegate` and `supportedLocales`'),
216
+ ac('At minimum, app title and home screen greeting are localized'),
217
+ ac('`flutter analyze` reports zero errors'),
218
+ ],
219
+ passes: false,
220
+ },
221
+ ];
222
+ stories.push(...prefixedStories(inputs, 2, 'I18N'));
160
223
  }
161
224
  if (context.modules.theme) {
162
225
  const { seedColor, darkMode } = context.modules.theme;
163
226
  const seedNote = seedColor ? `seed color ${seedColor}` : 'default purple seed color';
164
- stories.push({
165
- phase: 2,
166
- priority: 'P1',
167
- title: 'Implement Material 3 theme system',
168
- description: `Build the theme in \`lib/core/theme/app_theme.dart\` using Material 3 ColorScheme.fromSeed with ${seedNote}. ${darkMode ? 'Support both light and dark themes via `appThemeModeProvider`.' : 'Light theme only.'} Apply Google Fonts (Inter) as the default text theme.`,
169
- acceptanceCriteria: [
170
- '`AppTheme.light()` returns a `ThemeData` with Material 3 enabled',
171
- darkMode ? '`AppTheme.dark()` returns a dark `ThemeData`' : 'Light theme applied consistently',
172
- darkMode ? '`appThemeModeProvider` toggles between light and dark modes' : 'Theme applied to MaterialApp',
173
- 'Google Fonts Inter is applied as the text theme',
174
- '`flutter analyze` reports zero errors',
175
- ],
176
- passes: false,
177
- });
227
+ const inputs = [
228
+ {
229
+ phase: 2,
230
+ priority: 'P1',
231
+ module: 'theme',
232
+ title: 'Implement Material 3 theme system',
233
+ description: `Build the theme in \`lib/core/theme/app_theme.dart\` using Material 3 ColorScheme.fromSeed with ${seedNote}. ${darkMode ? 'Support both light and dark themes via `appThemeModeProvider`.' : 'Light theme only.'} Apply Google Fonts (Inter) as the default text theme.`,
234
+ storyPoints: 3,
235
+ dependencies: [coreSetupId],
236
+ acceptanceCriteria: [
237
+ ac('`AppTheme.light()` returns a `ThemeData` with Material 3 enabled'),
238
+ ac(darkMode
239
+ ? '`AppTheme.dark()` returns a dark `ThemeData`'
240
+ : 'Light theme applied consistently'),
241
+ ac(darkMode
242
+ ? '`appThemeModeProvider` toggles between light and dark modes'
243
+ : 'Theme applied to MaterialApp'),
244
+ ac('Google Fonts Inter is applied as the text theme'),
245
+ ac('`flutter analyze` reports zero errors'),
246
+ ],
247
+ passes: false,
248
+ },
249
+ ];
250
+ stories.push(...prefixedStories(inputs, 2, 'THEME'));
178
251
  }
179
252
  if (context.modules.push) {
180
253
  const provider = context.modules.push.provider;
181
254
  const providerLabel = provider === 'firebase' ? 'Firebase Cloud Messaging' : 'OneSignal';
182
- stories.push({
183
- phase: 2,
184
- priority: 'P2',
185
- title: `Implement push notifications with ${providerLabel}`,
186
- description: `Configure ${providerLabel} in \`lib/features/push/\`. Request notification permissions at app startup. Handle foreground, background, and terminated state notifications. Expose push token via \`pushTokenProvider\`.`,
187
- acceptanceCriteria: [
188
- `${providerLabel} is initialized before the app starts`,
189
- 'Notification permission is requested on first launch',
190
- 'Foreground notification handler displays an in-app notification',
191
- 'Background/terminated notification tap navigates to correct screen',
192
- '`pushTokenProvider` returns the device token as a Future<String?>',
193
- '`flutter analyze` reports zero errors',
194
- ],
195
- passes: false,
196
- });
255
+ const inputs = [
256
+ {
257
+ phase: 2,
258
+ priority: 'P2',
259
+ module: 'push',
260
+ title: `Implement push notifications with ${providerLabel}`,
261
+ description: `Configure ${providerLabel} in \`lib/features/push/\`. Request notification permissions at app startup. Handle foreground, background, and terminated state notifications. Expose push token via \`pushTokenProvider\`.`,
262
+ storyPoints: 5,
263
+ dependencies: [coreSetupId, riverpodId],
264
+ acceptanceCriteria: [
265
+ ac(`${providerLabel} is initialized before the app starts`),
266
+ ac('Notification permission is requested on first launch'),
267
+ ac('Foreground notification handler displays an in-app notification'),
268
+ ac('Background/terminated notification tap navigates to correct screen'),
269
+ ac('`pushTokenProvider` returns the device token as a Future<String?>'),
270
+ ac('`flutter analyze` reports zero errors'),
271
+ ],
272
+ passes: false,
273
+ },
274
+ ];
275
+ stories.push(...prefixedStories(inputs, 2, 'PUSH'));
197
276
  }
198
277
  if (context.modules.analytics) {
199
- stories.push({
200
- phase: 2,
201
- priority: 'P2',
202
- title: 'Implement analytics event tracking',
203
- description: 'Create `AnalyticsService` abstraction in `lib/features/analytics/`. Implement a GoRouter observer that tracks screen views automatically. Provide `analyticsServiceProvider` for logging custom events. Log app open event on startup.',
204
- acceptanceCriteria: [
205
- '`AnalyticsService` interface defines `logEvent(name, params)` and `logScreen(name)`',
206
- 'GoRouter observer automatically tracks screen navigation',
207
- '`analyticsServiceProvider` exposes the `AnalyticsService`',
208
- 'App open event is logged on startup',
209
- 'Unit tests mock `AnalyticsService` and verify event calls',
210
- '`flutter analyze` reports zero errors',
211
- ],
212
- passes: false,
213
- });
278
+ const inputs = [
279
+ {
280
+ phase: 2,
281
+ priority: 'P2',
282
+ module: 'analytics',
283
+ title: 'Implement analytics event tracking',
284
+ description: 'Create `AnalyticsService` abstraction in `lib/features/analytics/`. Implement a GoRouter observer that tracks screen views automatically. Provide `analyticsServiceProvider` for logging custom events. Log app open event on startup.',
285
+ storyPoints: 3,
286
+ dependencies: [coreSetupId, routerId],
287
+ acceptanceCriteria: [
288
+ ac('`AnalyticsService` interface defines `logEvent(name, params)` and `logScreen(name)`'),
289
+ ac('GoRouter observer automatically tracks screen navigation'),
290
+ ac('`analyticsServiceProvider` exposes the `AnalyticsService`'),
291
+ ac('App open event is logged on startup'),
292
+ ac('Unit tests mock `AnalyticsService` and verify event calls'),
293
+ ac('`flutter analyze` reports zero errors'),
294
+ ],
295
+ passes: false,
296
+ },
297
+ ];
298
+ stories.push(...prefixedStories(inputs, 2, 'ANLT'));
214
299
  }
215
300
  if (context.modules.cicd) {
216
301
  const providerLabel = context.modules.cicd.provider;
217
- stories.push({
218
- phase: 2,
219
- priority: 'P2',
220
- title: `Configure ${capitalize(providerLabel)} CI/CD pipeline`,
221
- description: `Set up CI/CD pipeline for ${capitalize(providerLabel)}. Pipeline should run on every push: (1) flutter analyze, (2) flutter test, (3) flutter build. Cache Flutter SDK and pub dependencies for speed.`,
222
- acceptanceCriteria: [
223
- providerLabel === 'github' ? '`.github/workflows/ci.yml` exists and is valid YAML' : providerLabel === 'gitlab' ? '`.gitlab-ci.yml` exists and is valid YAML' : '`bitbucket-pipelines.yml` exists and is valid YAML',
224
- 'Pipeline includes analyze, test, and build stages/jobs',
225
- 'Flutter pub cache is configured for fast runs',
226
- 'Pipeline triggers on push to main and pull requests',
227
- '`flutter analyze` reports zero errors in CI config files',
228
- ],
229
- passes: false,
230
- });
302
+ const inputs = [
303
+ {
304
+ phase: 2,
305
+ priority: 'P2',
306
+ module: 'cicd',
307
+ title: `Configure ${capitalize(providerLabel)} CI/CD pipeline`,
308
+ description: `Set up CI/CD pipeline for ${capitalize(providerLabel)}. Pipeline should run on every push: (1) flutter analyze, (2) flutter test, (3) flutter build. Cache Flutter SDK and pub dependencies for speed.`,
309
+ storyPoints: 2,
310
+ dependencies: [coreSetupId],
311
+ acceptanceCriteria: [
312
+ ac(providerLabel === 'github'
313
+ ? '`.github/workflows/ci.yml` exists and is valid YAML'
314
+ : providerLabel === 'gitlab'
315
+ ? '`.gitlab-ci.yml` exists and is valid YAML'
316
+ : '`bitbucket-pipelines.yml` exists and is valid YAML'),
317
+ ac('Pipeline includes analyze, test, and build stages/jobs'),
318
+ ac('Flutter pub cache is configured for fast runs'),
319
+ ac('Pipeline triggers on push to main and pull requests'),
320
+ ac('`flutter analyze` reports zero errors in CI config files'),
321
+ ],
322
+ passes: false,
323
+ },
324
+ ];
325
+ stories.push(...prefixedStories(inputs, 2, 'CICD'));
231
326
  }
232
327
  if (context.modules.deepLinking) {
233
328
  const { scheme, host } = context.modules.deepLinking;
234
329
  const linkExample = scheme && host ? `${scheme}://${host}` : 'app://example.com';
235
- stories.push({
236
- phase: 2,
237
- priority: 'P2',
238
- title: 'Implement deep linking with app_links',
239
- description: `Configure deep links using \`app_links\` package. Handle Universal Links (iOS) and App Links (Android). Integrate with go_router for automatic route resolution. Example link: \`${linkExample}\`.`,
240
- acceptanceCriteria: [
241
- '`app_links` is initialized at app startup',
242
- 'Incoming deep links are forwarded to go_router for navigation',
243
- scheme ? `Custom scheme \`${scheme}://\` is handled` : 'Deep link scheme is configured in platform files',
244
- host ? `Host \`${host}\` is configured for Universal/App Links` : 'Host is configured in platform-specific files',
245
- 'Widget test verifies deep link navigation',
246
- '`flutter analyze` reports zero errors',
247
- ],
248
- passes: false,
249
- });
330
+ const inputs = [
331
+ {
332
+ phase: 2,
333
+ priority: 'P2',
334
+ module: 'deepLinking',
335
+ title: 'Implement deep linking with app_links',
336
+ description: `Configure deep links using \`app_links\` package. Handle Universal Links (iOS) and App Links (Android). Integrate with go_router for automatic route resolution. Example link: \`${linkExample}\`.`,
337
+ storyPoints: 5,
338
+ dependencies: [coreSetupId, routerId],
339
+ acceptanceCriteria: [
340
+ ac('`app_links` is initialized at app startup'),
341
+ ac('Incoming deep links are forwarded to go_router for navigation'),
342
+ ac(scheme
343
+ ? `Custom scheme \`${scheme}://\` is handled`
344
+ : 'Deep link scheme is configured in platform files'),
345
+ ac(host
346
+ ? `Host \`${host}\` is configured for Universal/App Links`
347
+ : 'Host is configured in platform-specific files'),
348
+ ac('Widget test verifies deep link navigation'),
349
+ ac('`flutter analyze` reports zero errors'),
350
+ ],
351
+ passes: false,
352
+ },
353
+ ];
354
+ stories.push(...prefixedStories(inputs, 2, 'LINK'));
250
355
  }
251
356
  return stories;
252
357
  }
253
- function generatePhase3Stories(context) {
358
+ function buildPhase3Stories(context, phase1Ids, phase2Stories) {
254
359
  const enabledModules = [];
255
360
  if (context.modules.auth)
256
361
  enabledModules.push('auth');
@@ -258,18 +363,21 @@ function generatePhase3Stories(context) {
258
363
  enabledModules.push('api');
259
364
  if (context.modules.database)
260
365
  enabledModules.push('database');
261
- return [
366
+ const allPrecedingIds = [...phase1Ids, ...phase2Stories.map((s) => s.id)];
367
+ const inputs = [
262
368
  {
263
369
  phase: 3,
264
370
  priority: 'P1',
265
371
  title: 'Write integration tests for core user flows',
266
372
  description: `Write integration tests covering the main user journeys in ${context.projectName}. ${enabledModules.length > 0 ? `Test flows involving: ${enabledModules.join(', ')}.` : 'Test home screen navigation and basic app flows.'} Use \`integration_test\` package with \`flutter_test\`.`,
373
+ storyPoints: 5,
374
+ dependencies: allPrecedingIds,
267
375
  acceptanceCriteria: [
268
- '`integration_test/` directory exists with at least one integration test file',
269
- 'Tests cover the happy path for core user journeys',
270
- 'Tests use `WidgetTester` for UI interactions',
271
- '`flutter test integration_test/` passes all tests',
272
- 'Test coverage report shows >70% coverage for presentation layer',
376
+ ac('`integration_test/` directory exists with at least one integration test file'),
377
+ ac('Tests cover the happy path for core user journeys'),
378
+ ac('Tests use `WidgetTester` for UI interactions'),
379
+ ac('`flutter test integration_test/` passes all tests'),
380
+ ac('Test coverage report shows >70% coverage for presentation layer'),
273
381
  ],
274
382
  passes: false,
275
383
  },
@@ -278,16 +386,19 @@ function generatePhase3Stories(context) {
278
386
  priority: 'P2',
279
387
  title: 'Final quality audit and documentation',
280
388
  description: `Perform a final quality pass on all code in ${context.projectName}. Fix any remaining analyzer warnings. Ensure all public APIs have dartdoc comments. Verify README.md documents how to run the app and run tests.`,
389
+ storyPoints: 2,
390
+ dependencies: ['P3-QA-001'],
281
391
  acceptanceCriteria: [
282
- '`flutter analyze` reports zero errors AND zero warnings',
283
- '`flutter test` passes all tests',
284
- '`dart format --set-exit-if-changed .` passes',
285
- 'README.md includes setup instructions and how to run the app',
286
- 'All public provider declarations have dartdoc comments',
392
+ ac('`flutter analyze` reports zero errors AND zero warnings'),
393
+ ac('`flutter test` passes all tests'),
394
+ ac('`dart format --set-exit-if-changed .` passes'),
395
+ ac('README.md includes setup instructions and how to run the app'),
396
+ ac('All public provider declarations have dartdoc comments'),
287
397
  ],
288
398
  passes: false,
289
399
  },
290
400
  ];
401
+ return prefixedStories(inputs, 3, 'QA');
291
402
  }
292
403
  function capitalize(str) {
293
404
  return str.charAt(0).toUpperCase() + str.slice(1);
@@ -1 +1 @@
1
- {"version":3,"file":"prd-generator.js","sourceRoot":"","sources":["../../src/claude-setup/prd-generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prd-generator.js","sourceRoot":"","sources":["../../src/claude-setup/prd-generator.ts"],"names":[],"mappings":"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"}
@@ -35,13 +35,13 @@ export declare const PrdStorySchema: z.ZodObject<{
35
35
  phase: number;
36
36
  priority: "P0" | "P1" | "P2" | "P3";
37
37
  title: string;
38
+ storyPoints: 1 | 2 | 3 | 5 | 8 | 13;
39
+ dependencies: string[];
38
40
  acceptanceCriteria: {
39
41
  description: string;
40
42
  predicate?: string | undefined;
41
43
  }[];
42
44
  passes: boolean;
43
- dependencies: string[];
44
- storyPoints: 1 | 2 | 3 | 5 | 8 | 13;
45
45
  module?: string | undefined;
46
46
  }, {
47
47
  description: string;
@@ -49,13 +49,13 @@ export declare const PrdStorySchema: z.ZodObject<{
49
49
  phase: number;
50
50
  priority: "P0" | "P1" | "P2" | "P3";
51
51
  title: string;
52
+ storyPoints: number;
53
+ dependencies: string[];
52
54
  acceptanceCriteria: {
53
55
  description: string;
54
56
  predicate?: string | undefined;
55
57
  }[];
56
58
  passes: boolean;
57
- dependencies: string[];
58
- storyPoints: number;
59
59
  module?: string | undefined;
60
60
  }>;
61
61
  declare const PrdPhaseSchema: z.ZodObject<{
@@ -114,13 +114,13 @@ export declare const PrdSchema: z.ZodObject<{
114
114
  phase: number;
115
115
  priority: "P0" | "P1" | "P2" | "P3";
116
116
  title: string;
117
+ storyPoints: 1 | 2 | 3 | 5 | 8 | 13;
118
+ dependencies: string[];
117
119
  acceptanceCriteria: {
118
120
  description: string;
119
121
  predicate?: string | undefined;
120
122
  }[];
121
123
  passes: boolean;
122
- dependencies: string[];
123
- storyPoints: 1 | 2 | 3 | 5 | 8 | 13;
124
124
  module?: string | undefined;
125
125
  }, {
126
126
  description: string;
@@ -128,13 +128,13 @@ export declare const PrdSchema: z.ZodObject<{
128
128
  phase: number;
129
129
  priority: "P0" | "P1" | "P2" | "P3";
130
130
  title: string;
131
+ storyPoints: number;
132
+ dependencies: string[];
131
133
  acceptanceCriteria: {
132
134
  description: string;
133
135
  predicate?: string | undefined;
134
136
  }[];
135
137
  passes: boolean;
136
- dependencies: string[];
137
- storyPoints: number;
138
138
  module?: string | undefined;
139
139
  }>, "many">;
140
140
  }, "strip", z.ZodTypeAny, {
@@ -146,13 +146,13 @@ export declare const PrdSchema: z.ZodObject<{
146
146
  phase: number;
147
147
  priority: "P0" | "P1" | "P2" | "P3";
148
148
  title: string;
149
+ storyPoints: 1 | 2 | 3 | 5 | 8 | 13;
150
+ dependencies: string[];
149
151
  acceptanceCriteria: {
150
152
  description: string;
151
153
  predicate?: string | undefined;
152
154
  }[];
153
155
  passes: boolean;
154
- dependencies: string[];
155
- storyPoints: 1 | 2 | 3 | 5 | 8 | 13;
156
156
  module?: string | undefined;
157
157
  }[];
158
158
  generatedAt?: string | undefined;
@@ -170,13 +170,13 @@ export declare const PrdSchema: z.ZodObject<{
170
170
  phase: number;
171
171
  priority: "P0" | "P1" | "P2" | "P3";
172
172
  title: string;
173
+ storyPoints: number;
174
+ dependencies: string[];
173
175
  acceptanceCriteria: {
174
176
  description: string;
175
177
  predicate?: string | undefined;
176
178
  }[];
177
179
  passes: boolean;
178
- dependencies: string[];
179
- storyPoints: number;
180
180
  module?: string | undefined;
181
181
  }[];
182
182
  generatedAt?: string | undefined;
@@ -0,0 +1,11 @@
1
+ export interface ResolvedClaudeOptions {
2
+ claudeMd: boolean;
3
+ rules: boolean;
4
+ agents: boolean;
5
+ hooks: boolean;
6
+ skills: boolean;
7
+ commands: boolean;
8
+ mcp: boolean;
9
+ }
10
+ export declare function resolvePreset(preset?: 'minimal' | 'standard' | 'full', overrides?: Partial<ResolvedClaudeOptions>): ResolvedClaudeOptions;
11
+ //# sourceMappingURL=preset-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset-resolver.d.ts","sourceRoot":"","sources":["../../src/claude-setup/preset-resolver.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,GAAG,EAAE,OAAO,CAAC;CACd;AAgCD,wBAAgB,aAAa,CAC3B,MAAM,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,MAAM,EACxC,SAAS,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACzC,qBAAqB,CAYvB"}
@@ -0,0 +1,43 @@
1
+ const PRESETS = {
2
+ minimal: {
3
+ claudeMd: true,
4
+ rules: true,
5
+ agents: false,
6
+ hooks: false,
7
+ skills: false,
8
+ commands: false,
9
+ mcp: false,
10
+ },
11
+ standard: {
12
+ claudeMd: true,
13
+ rules: true,
14
+ agents: true,
15
+ hooks: true,
16
+ skills: true,
17
+ commands: true,
18
+ mcp: false,
19
+ },
20
+ full: {
21
+ claudeMd: true,
22
+ rules: true,
23
+ agents: true,
24
+ hooks: true,
25
+ skills: true,
26
+ commands: true,
27
+ mcp: true,
28
+ },
29
+ };
30
+ export function resolvePreset(preset, overrides) {
31
+ const base = PRESETS[preset ?? 'standard'];
32
+ if (!overrides)
33
+ return { ...base };
34
+ const result = { ...base };
35
+ for (const key of Object.keys(overrides)) {
36
+ const value = overrides[key];
37
+ if (value !== undefined) {
38
+ result[key] = value;
39
+ }
40
+ }
41
+ return result;
42
+ }
43
+ //# sourceMappingURL=preset-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset-resolver.js","sourceRoot":"","sources":["../../src/claude-setup/preset-resolver.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,GAAmE;IAC9E,OAAO,EAAE;QACP,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,KAAK;QACf,GAAG,EAAE,KAAK;KACX;IACD,QAAQ,EAAE;QACR,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE,KAAK;KACX;IACD,IAAI,EAAE;QACJ,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;QACd,GAAG,EAAE,IAAI;KACV;CACF,CAAC;AAEF,MAAM,UAAU,aAAa,CAC3B,MAAwC,EACxC,SAA0C;IAE1C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,CAAC,CAAC;IAC3C,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;IAEnC,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAoC,EAAE,CAAC;QAC5E,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "maxsim-flutter",
3
- "version": "1.19.0",
3
+ "version": "1.20.0",
4
4
  "description": "AI-powered Flutter app scaffolding with Clean Architecture, Riverpod, and autonomous development via Ralph",
5
5
  "type": "module",
6
6
  "bin": {