create-auto-app 0.11.9 → 0.11.11

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,6 +1,6 @@
1
1
  {
2
2
  "variant": "specs",
3
- "flows": [
3
+ "narratives": [
4
4
  {
5
5
  "name": "Todo Dashboard",
6
6
  "id": "AUTO-H6i9Rs2Gz",
@@ -47,46 +47,6 @@
47
47
  }
48
48
  }
49
49
  },
50
- {
51
- "name": "Completion Progress Ring",
52
- "id": "AUTO-P9l2Vv5Jz",
53
- "type": "experience",
54
- "client": {
55
- "specs": {
56
- "name": "",
57
- "rules": [
58
- "display circular progress ring with gradient stroke",
59
- "show completion percentage prominently in center",
60
- "animate progress changes with smooth easing",
61
- "display total task count below percentage",
62
- "use vibrant colors for high completion rates",
63
- "show subtle pulse animation on milestone achievements",
64
- "position prominently at top of dashboard or sidebar"
65
- ]
66
- }
67
- }
68
- },
69
- {
70
- "name": "Quick Add Todo Widget",
71
- "id": "AUTO-Q0m3Ww6Kz",
72
- "type": "experience",
73
- "client": {
74
- "specs": {
75
- "name": "",
76
- "rules": [
77
- "display floating action button with plus icon",
78
- "position fixed in bottom-right corner for easy access",
79
- "expand into input form with smooth scale animation on click",
80
- "include elegant input field with placeholder text",
81
- "show submit button with icon when text is entered",
82
- "support keyboard shortcut (Ctrl/Cmd + K) to focus input",
83
- "auto-focus input when opened",
84
- "clear and collapse after successful task addition",
85
- "show loading state during task submission"
86
- ]
87
- }
88
- }
89
- },
90
50
  {
91
51
  "name": "Statistics Dashboard",
92
52
  "id": "AUTO-S1n4Xx7Lz",
@@ -174,7 +134,7 @@
174
134
  "name": "",
175
135
  "rules": [
176
136
  "trigger confetti animation when task is completed",
177
- "show satisfying checkmark animation",
137
+ "show satisfying check mark animation",
178
138
  "play subtle success sound effect (optional, user configurable)",
179
139
  "display special animation for completing all tasks",
180
140
  "show streak celebration for consecutive daily completions",
@@ -220,9 +180,49 @@
220
180
  ]
221
181
  }
222
182
  }
183
+ },
184
+ {
185
+ "name": "Completion Progress Ring",
186
+ "id": "AUTO-P9l2Vv5Jz",
187
+ "type": "experience",
188
+ "client": {
189
+ "specs": {
190
+ "name": "",
191
+ "rules": [
192
+ "display circular progress ring with gradient stroke",
193
+ "show completion percentage prominently in center",
194
+ "animate progress changes with smooth easing",
195
+ "display total task count below percentage",
196
+ "use vibrant colors for high completion rates",
197
+ "show subtle pulse animation on milestone achievements",
198
+ "position prominently at top of dashboard or sidebar"
199
+ ]
200
+ }
201
+ }
202
+ },
203
+ {
204
+ "name": "Quick Add Todo Widget",
205
+ "id": "AUTO-Q0m3Ww6Kz",
206
+ "type": "experience",
207
+ "client": {
208
+ "specs": {
209
+ "name": "",
210
+ "rules": [
211
+ "display floating action button with plus icon",
212
+ "position fixed in bottom-right corner for easy access",
213
+ "expand into input form with smooth scale animation on click",
214
+ "include elegant input field with placeholder text",
215
+ "show submit button with icon when text is entered",
216
+ "support keyboard shortcut (Ctrl/Cmd + K) to focus input",
217
+ "auto-focus input when opened",
218
+ "clear and collapse after successful task addition",
219
+ "show loading state during task submission"
220
+ ]
221
+ }
222
+ }
223
223
  }
224
224
  ],
225
- "sourceFile": "/Users/sam/WebstormProjects/top/auto-engineer-3/examples/kanban-todo/flows/homepage.flow.ts"
225
+ "sourceFile": "/Users/sam/WebstormProjects/top/auto-engineer-2/examples/kanban-todo/narratives/homepage.narrative.ts"
226
226
  },
227
227
  {
228
228
  "name": "App Structure",
@@ -481,7 +481,7 @@
481
481
  }
482
482
  }
483
483
  ],
484
- "sourceFile": "/Users/sam/WebstormProjects/top/auto-engineer-3/examples/kanban-todo/flows/structure.flow.ts"
484
+ "sourceFile": "/Users/sam/WebstormProjects/top/auto-engineer-2/examples/kanban-todo/narratives/structure.narrative.ts"
485
485
  },
486
486
  {
487
487
  "name": "Todo List",
@@ -829,16 +829,6 @@
829
829
  "addedAt": "2030-01-01T09:00:00.000Z",
830
830
  "completedAt": null
831
831
  }
832
- },
833
- {
834
- "stateRef": "TodoState",
835
- "exampleData": {
836
- "todoId": "todo-002",
837
- "description": "Write report",
838
- "status": "completed",
839
- "addedAt": "2030-01-01T09:10:00.000Z",
840
- "completedAt": "2030-01-01T11:00:00.000Z"
841
- }
842
832
  }
843
833
  ]
844
834
  }
@@ -959,7 +949,7 @@
959
949
  }
960
950
  }
961
951
  ],
962
- "sourceFile": "/Users/sam/WebstormProjects/top/auto-engineer-3/examples/kanban-todo/flows/todo-list.flow.ts"
952
+ "sourceFile": "/Users/sam/WebstormProjects/top/auto-engineer-2/examples/kanban-todo/narratives/todo-list.narrative.ts"
963
953
  }
964
954
  ],
965
955
  "messages": [
@@ -1,4 +1,4 @@
1
1
  .context
2
- server
3
- client
2
+ server*
3
+ client*
4
4
  /.context/
@@ -1,5 +1,5 @@
1
1
  import { autoConfig, on, dispatch } from '@auto-engineer/cli';
2
- import type { ExportSchemaEvents } from '@auto-engineer/flow';
2
+ import type { ExportSchemaEvents } from '@auto-engineer/narrative';
3
3
  import type {
4
4
  GenerateServerCommand,
5
5
  GenerateServerEvents,
@@ -18,9 +18,27 @@ import type { GenerateIACommand, GenerateIAEvents } from '@auto-engineer/informa
18
18
  import type { ImplementClientCommand } from '@auto-engineer/frontend-implementer';
19
19
  import type { GenerateClientCommand, GenerateClientEvents } from '@auto-engineer/frontend-generator-react-graphql';
20
20
  import type { CheckClientEvents } from '@auto-engineer/frontend-checks';
21
+ import type {
22
+ ImplementComponentCommand,
23
+ ComponentImplementedEvent,
24
+ ComponentImplementationFailedEvent,
25
+ } from '@auto-engineer/component-implementer';
26
+ import * as path from 'path';
27
+ import createDebug from 'debug';
28
+
29
+ const debug = createDebug('auto:config:component');
21
30
 
22
31
  const sliceRetryState = new Map<string, number>();
23
- const MAX_RETRIES = 3;
32
+ const MAX_RETRIES = 4;
33
+
34
+ type ComponentType = 'molecule' | 'organism' | 'page';
35
+ const componentPhaseOrder: ComponentType[] = ['molecule', 'organism', 'page'];
36
+
37
+ let clientComponents: Array<{ type: string; filePath: string }> = [];
38
+ let clientTargetDir = '';
39
+ const processedComponents = new Set<string>();
40
+ const dispatchedPhases = new Set<string>();
41
+ const failedComponents = new Set<string>();
24
42
 
25
43
  interface CheckFailures {
26
44
  testsCheckFailed?: TestsCheckFailedEvent;
@@ -43,9 +61,10 @@ export default autoConfig({
43
61
  '@auto-engineer/server-checks',
44
62
  '@auto-engineer/design-system-importer',
45
63
  '@auto-engineer/server-generator-apollo-emmett',
46
- '@auto-engineer/flow',
64
+ '@auto-engineer/narrative',
47
65
  '@auto-engineer/frontend-checks',
48
66
  '@auto-engineer/frontend-implementer',
67
+ '@auto-engineer/component-implementer',
49
68
  '@auto-engineer/information-architect',
50
69
  '@auto-engineer/frontend-generator-react-graphql',
51
70
  '@auto-engineer/server-implementer',
@@ -55,6 +74,53 @@ export default autoConfig({
55
74
  // 'test:types': checkTypesCommandHandler,
56
75
  },
57
76
  pipeline: () => {
77
+ function getComponentsOfType(type: string) {
78
+ return clientComponents.filter((c) => c.type === type);
79
+ }
80
+
81
+ function areAllProcessed(type: string): boolean {
82
+ const components = getComponentsOfType(type);
83
+ if (components.length === 0) return false;
84
+
85
+ const allDone = components.every((c) => processedComponents.has(c.filePath) || failedComponents.has(c.filePath));
86
+
87
+ if (!allDone) return false;
88
+
89
+ const anyFailed = components.some((c) => failedComponents.has(c.filePath));
90
+
91
+ return !anyFailed;
92
+ }
93
+
94
+ function dispatchComponentsOfType(type: ComponentType) {
95
+ const components = getComponentsOfType(type);
96
+ const commands = components.map((component) => {
97
+ const componentName = path.basename(component.filePath).replace('.tsx', '');
98
+ return dispatch<ImplementComponentCommand>('ImplementComponent', {
99
+ projectDir: clientTargetDir,
100
+ iaSchemeDir: './.context',
101
+ designSystemPath: './.context/design-system.md',
102
+ componentType: type,
103
+ filePath: component.filePath,
104
+ componentName,
105
+ });
106
+ });
107
+ return dispatch.parallel(commands);
108
+ }
109
+
110
+ function tryAdvanceToNextPhase() {
111
+ for (let i = 0; i < componentPhaseOrder.length - 1; i++) {
112
+ const currentPhase = componentPhaseOrder[i];
113
+ const nextPhase = componentPhaseOrder[i + 1];
114
+ const allProcessed = areAllProcessed(currentPhase);
115
+ const alreadyDispatched = dispatchedPhases.has(nextPhase);
116
+ if (allProcessed && !alreadyDispatched) {
117
+ dispatchedPhases.add(nextPhase);
118
+ return dispatchComponentsOfType(nextPhase);
119
+ }
120
+ }
121
+ return [];
122
+ }
123
+
58
124
  on<ExportSchemaEvents>('SchemaExported', () =>
59
125
  dispatch<GenerateServerCommand>('GenerateServer', {
60
126
  modelPath: './.context/schema.json',
@@ -144,13 +210,75 @@ export default autoConfig({
144
210
  }),
145
211
  );
146
212
 
147
- on<GenerateClientEvents>('ClientGenerated', () =>
148
- dispatch<ImplementClientCommand>('ImplementClient', {
149
- projectDir: './client',
150
- iaSchemeDir: './.context',
151
- designSystemPath: './.context/design-system.md',
152
- }),
153
- );
213
+ on<GenerateClientEvents>('ClientGenerated', (e) => {
214
+ if (e.type !== 'ClientGenerated') return;
215
+
216
+ if (e.data === null || e.data === undefined || !Array.isArray(e.data.components)) {
217
+ return [
218
+ dispatch<ImplementComponentCommand>('ImplementComponent', {
219
+ projectDir: './client',
220
+ iaSchemeDir: './.context',
221
+ designSystemPath: './.context/design-system.md',
222
+ componentType: 'molecule',
223
+ filePath: 'client/src/components/molecules/Example.tsx',
224
+ componentName: 'Example.tsx',
225
+ }),
226
+ ];
227
+ }
228
+
229
+ debug('ClientGenerated event received');
230
+ debug('Total components: %d', e.data.components.length);
231
+ debug(
232
+ 'Component types: %o',
233
+ e.data.components.map((c) => c.type),
234
+ );
235
+
236
+ clientComponents = e.data.components;
237
+ clientTargetDir = e.data.targetDir;
238
+ processedComponents.clear();
239
+ dispatchedPhases.clear();
240
+ failedComponents.clear();
241
+
242
+ const molecules = clientComponents.filter((c) => c.type === 'molecule');
243
+ debug('Found %d molecules', molecules.length);
244
+ debug(
245
+ 'Molecule paths: %o',
246
+ molecules.map((m) => m.filePath),
247
+ );
248
+
249
+ dispatchedPhases.add('molecule');
250
+
251
+ const commands = molecules.map((component) => {
252
+ const componentName = path.basename(component.filePath).replace('.tsx', '');
253
+ return dispatch<ImplementComponentCommand>('ImplementComponent', {
254
+ projectDir: clientTargetDir,
255
+ iaSchemeDir: './.context',
256
+ designSystemPath: './.context/design-system.md',
257
+ componentType: 'molecule',
258
+ filePath: component.filePath,
259
+ componentName,
260
+ });
261
+ });
262
+
263
+ return dispatch.parallel(commands);
264
+ });
265
+
266
+ const handleComponentProcessed = (e: ComponentImplementedEvent | ComponentImplementationFailedEvent) => {
267
+ if (e.data === null || e.data === undefined || e.data.filePath === null || e.data.filePath === undefined) {
268
+ return [];
269
+ }
270
+
271
+ if (e.type === 'ComponentImplemented') {
272
+ processedComponents.add(e.data.filePath);
273
+ } else {
274
+ failedComponents.add(e.data.filePath);
275
+ }
276
+
277
+ return tryAdvanceToNextPhase();
278
+ };
279
+
280
+ on<ComponentImplementedEvent>('ComponentImplemented', handleComponentProcessed);
281
+ on<ComponentImplementationFailedEvent>('ComponentImplementationFailed', handleComponentProcessed);
154
282
 
155
283
  // on<ImplementClientEvents>('ClientImplemented', () =>
156
284
  // dispatch<CheckClientCommand>('CheckClient', {
@@ -235,7 +363,7 @@ function collectErrorMessages(failures: CheckFailures): string {
235
363
 
236
364
  rm -rf server client .context/schema.json .context/schema.graphql .context/auto-ia-scheme.json
237
365
  pnpm auto export:schema
238
- pnpm auto generate:ia --output-dir=./.context --flow-files=./flows/questionnaires.flow.ts
366
+ pnpm auto generate:ia --output-dir=./.context --flow-files=./narratives/questionnaires.narrative.ts
239
367
  pnpm auto generate:server --schema-path=./.context/schema.json --destination=.
240
368
  pnpm auto generate:client --starter-dir=../../packages/frontend-generator-react-graphql/shadcn-starter --target-dir=./client --ia-schema-path=./.context/auto-ia-scheme.json --gql-schema-path=./.context/schema.graphql --figma-variables-path=./.context/figma-file.json
241
369
  pnpm auto implement:client --project-dir=./questionnaires/client --ia-scheme-dir=./questionnaires/.context --design-system-path=./questionnaires/.context/design-system.md
@@ -248,7 +376,7 @@ pnpm auto generate:server --schema-path=./.context/schema.json --destination=.
248
376
  pnpm auto generate:client --starter-dir=/Users/sam/WebstormProjects/top/auto-engineer/packages/frontend-generator-react-graphql/shadcn-starter --target-dir=./client --ia-schema-path=./.context/auto-ia-scheme.json --gql-schema-path=./.context/schema.graphql --figma-variables-path=./.context/figma-file.json
249
377
 
250
378
  // run this per slice in parallel
251
- pnpm auto implement:slice --slice-path=./questionnaires/server/src/domain/flows/questionnaires/submits-the-questionnaire
379
+ pnpm auto implement:slice --slice-path=./questionnaires/server/src/domain/narratives/questionnaires/submits-the-questionnaire
252
380
  // add checks
253
381
  // add retry logic tore-implement failed slices with a retry count
254
382
 
@@ -271,7 +399,7 @@ pnpm -w build &&\
271
399
  rm -rf server client .context/schema.json .context/schema.graphql .context/auto-ia-scheme.json &&\
272
400
  DEBUG=* pnpm auto export:schema &&\
273
401
  DEBUG=* pnpm auto generate:server --schema-path=./.context/schema.json --destination=. &&\
274
- DEBUG=* pnpm auto generate:ia --output-dir=./.context --flow-files=./flows/questionnaires.flow.ts &&\
402
+ DEBUG=* pnpm auto generate:ia --output-dir=./.context --flow-files=./narratives/questionnaires.narrative.ts &&\
275
403
  DEBUG=* pnpm auto generate:client --starter-dir=../../packages/frontend-generator-react-graphql/shadcn-starter --target-dir=./client --ia-schema-path=./.context/auto-ia-scheme.json --gql-schema-path=./.context/schema.graphql --figma-variables-path=./.context/figma-file.json
276
404
 
277
405
 
@@ -0,0 +1,24 @@
1
+ # Logs
2
+ logs
3
+ *.log
4
+ npm-debug.log*
5
+ yarn-debug.log*
6
+ yarn-error.log*
7
+ pnpm-debug.log*
8
+ lerna-debug.log*
9
+
10
+ node_modules
11
+ dist
12
+ dist-ssr
13
+ *.local
14
+
15
+ # Editor directories and files
16
+ .vscode/*
17
+ !.vscode/extensions.json
18
+ .idea
19
+ .DS_Store
20
+ *.suo
21
+ *.ntvs*
22
+ *.njsproj
23
+ *.sln
24
+ *.sw?
@@ -1,6 +1,5 @@
1
- import { experience, flow, should, specs } from '@auto-engineer/flow';
2
-
3
- flow('Todo Dashboard', 'AUTO-H6i9Rs2Gz', () => {
1
+ import { experience, narrative, should, specs } from '@auto-engineer/narrative';
2
+ narrative('Todo Dashboard', 'AUTO-H6i9Rs2Gz', () => {
4
3
  experience('Kanban Board View', 'AUTO-K7j0St3Hz').client(() => {
5
4
  specs(() => {
6
5
  should('display three distinct columns: To Do, In Progress, and Done');
@@ -15,7 +14,6 @@ flow('Todo Dashboard', 'AUTO-H6i9Rs2Gz', () => {
15
14
  should('maintain consistent card spacing and grid alignment');
16
15
  });
17
16
  });
18
-
19
17
  experience('Task Cards', 'AUTO-T8k1Uu4Iz').client(() => {
20
18
  specs(() => {
21
19
  should('display task description with clear readable typography');
@@ -28,33 +26,6 @@ flow('Todo Dashboard', 'AUTO-H6i9Rs2Gz', () => {
28
26
  should('use gradient borders matching task status');
29
27
  });
30
28
  });
31
-
32
- experience('Completion Progress Ring', 'AUTO-P9l2Vv5Jz').client(() => {
33
- specs(() => {
34
- should('display circular progress ring with gradient stroke');
35
- should('show completion percentage prominently in center');
36
- should('animate progress changes with smooth easing');
37
- should('display total task count below percentage');
38
- should('use vibrant colors for high completion rates');
39
- should('show subtle pulse animation on milestone achievements');
40
- should('position prominently at top of dashboard or sidebar');
41
- });
42
- });
43
-
44
- experience('Quick Add Todo Widget', 'AUTO-Q0m3Ww6Kz').client(() => {
45
- specs(() => {
46
- should('display floating action button with plus icon');
47
- should('position fixed in bottom-right corner for easy access');
48
- should('expand into input form with smooth scale animation on click');
49
- should('include elegant input field with placeholder text');
50
- should('show submit button with icon when text is entered');
51
- should('support keyboard shortcut (Ctrl/Cmd + K) to focus input');
52
- should('auto-focus input when opened');
53
- should('clear and collapse after successful task addition');
54
- should('show loading state during task submission');
55
- });
56
- });
57
-
58
29
  experience('Statistics Dashboard', 'AUTO-S1n4Xx7Lz').client(() => {
59
30
  specs(() => {
60
31
  should('show total tasks count with large prominent number');
@@ -67,7 +38,6 @@ flow('Todo Dashboard', 'AUTO-H6i9Rs2Gz', () => {
67
38
  should('animate number changes with counting effect');
68
39
  });
69
40
  });
70
-
71
41
  experience('Recent Activity Feed', 'AUTO-R2o5Yy8Mz').client(() => {
72
42
  specs(() => {
73
43
  should('display recent task completions in chronological order');
@@ -80,7 +50,6 @@ flow('Todo Dashboard', 'AUTO-H6i9Rs2Gz', () => {
80
50
  should('auto-scroll new completions into view with smooth animation');
81
51
  });
82
52
  });
83
-
84
53
  experience('View Toggle Controls', 'AUTO-V3p6Zz9Nz').client(() => {
85
54
  specs(() => {
86
55
  should('provide toggle between Kanban and List views');
@@ -92,7 +61,6 @@ flow('Todo Dashboard', 'AUTO-H6i9Rs2Gz', () => {
92
61
  should('remember user preference in local storage');
93
62
  });
94
63
  });
95
-
96
64
  experience('Theme Toggle', 'AUTO-T4q7Aa0Oz').client(() => {
97
65
  specs(() => {
98
66
  should('support light and dark theme modes');
@@ -104,11 +72,10 @@ flow('Todo Dashboard', 'AUTO-H6i9Rs2Gz', () => {
104
72
  should('use system preference as default');
105
73
  });
106
74
  });
107
-
108
75
  experience('Celebration Animations', 'AUTO-C5r8Bb1Pz').client(() => {
109
76
  specs(() => {
110
77
  should('trigger confetti animation when task is completed');
111
- should('show satisfying checkmark animation');
78
+ should('show satisfying check mark animation');
112
79
  should('play subtle success sound effect (optional, user configurable)');
113
80
  should('display special animation for completing all tasks');
114
81
  should('show streak celebration for consecutive daily completions');
@@ -116,7 +83,6 @@ flow('Todo Dashboard', 'AUTO-H6i9Rs2Gz', () => {
116
83
  should('respect reduced motion preferences for accessibility');
117
84
  });
118
85
  });
119
-
120
86
  experience('Column Management', 'AUTO-M6s9Cc2Qz').client(() => {
121
87
  specs(() => {
122
88
  should('allow reordering tasks within same column via drag-and-drop');
@@ -128,7 +94,6 @@ flow('Todo Dashboard', 'AUTO-H6i9Rs2Gz', () => {
128
94
  should('maintain smooth 60fps animations during all interactions');
129
95
  });
130
96
  });
131
-
132
97
  experience('Empty States', 'AUTO-E7t0Dd3Rz').client(() => {
133
98
  specs(() => {
134
99
  should('display welcoming illustration when no tasks exist');
@@ -139,4 +104,28 @@ flow('Todo Dashboard', 'AUTO-H6i9Rs2Gz', () => {
139
104
  should('include helpful tips for new users');
140
105
  });
141
106
  });
107
+ experience('Completion Progress Ring', 'AUTO-P9l2Vv5Jz').client(() => {
108
+ specs(() => {
109
+ should('display circular progress ring with gradient stroke');
110
+ should('show completion percentage prominently in center');
111
+ should('animate progress changes with smooth easing');
112
+ should('display total task count below percentage');
113
+ should('use vibrant colors for high completion rates');
114
+ should('show subtle pulse animation on milestone achievements');
115
+ should('position prominently at top of dashboard or sidebar');
116
+ });
117
+ });
118
+ experience('Quick Add Todo Widget', 'AUTO-Q0m3Ww6Kz').client(() => {
119
+ specs(() => {
120
+ should('display floating action button with plus icon');
121
+ should('position fixed in bottom-right corner for easy access');
122
+ should('expand into input form with smooth scale animation on click');
123
+ should('include elegant input field with placeholder text');
124
+ should('show submit button with icon when text is entered');
125
+ should('support keyboard shortcut (Ctrl/Cmd + K) to focus input');
126
+ should('auto-focus input when opened');
127
+ should('clear and collapse after successful task addition');
128
+ should('show loading state during task submission');
129
+ });
130
+ });
142
131
  });
@@ -1,6 +1,5 @@
1
- import { experience, flow, should, specs } from '@auto-engineer/flow';
2
-
3
- flow('App Structure', 'AUTO-A8u1Ee4Sz', () => {
1
+ import { experience, narrative, should, specs } from '@auto-engineer/narrative';
2
+ narrative('App Structure', 'AUTO-A8u1Ee4Sz', () => {
4
3
  experience('Application Layout', 'AUTO-L9v2Ff5Tz').client(() => {
5
4
  specs(() => {
6
5
  should('display clean top navigation bar spanning full width');
@@ -12,7 +11,6 @@ flow('App Structure', 'AUTO-A8u1Ee4Sz', () => {
12
11
  should('apply subtle shadow to separate top bar from content');
13
12
  });
14
13
  });
15
-
16
14
  experience('Main Content Area', 'AUTO-C0w3Gg6Uz').client(() => {
17
15
  specs(() => {
18
16
  should('occupy full viewport height below top bar');
@@ -24,7 +22,6 @@ flow('App Structure', 'AUTO-A8u1Ee4Sz', () => {
24
22
  should('use CSS Grid for Kanban column layout');
25
23
  });
26
24
  });
27
-
28
25
  experience('Kanban Board Container', 'AUTO-K1x4Hh7Vz').client(() => {
29
26
  specs(() => {
30
27
  should('display three equal-width columns in desktop view');
@@ -36,7 +33,6 @@ flow('App Structure', 'AUTO-A8u1Ee4Sz', () => {
36
33
  should('show subtle scrollbar styling matching theme');
37
34
  });
38
35
  });
39
-
40
36
  experience('Column Headers', 'AUTO-H2y5Ii8Wz').client(() => {
41
37
  specs(() => {
42
38
  should('display column title with clear typography');
@@ -47,7 +43,6 @@ flow('App Structure', 'AUTO-A8u1Ee4Sz', () => {
47
43
  should('maintain consistent height across all columns');
48
44
  });
49
45
  });
50
-
51
46
  experience('Floating Action Button', 'AUTO-F3z6Jj9Xz').client(() => {
52
47
  specs(() => {
53
48
  should('position fixed in bottom-right corner of viewport');
@@ -61,7 +56,6 @@ flow('App Structure', 'AUTO-A8u1Ee4Sz', () => {
61
56
  should('hide on mobile when keyboard is visible');
62
57
  });
63
58
  });
64
-
65
59
  experience('Statistics Sidebar', 'AUTO-S4a7Kk0Yz').client(() => {
66
60
  specs(() => {
67
61
  should('display on right side of screen in desktop view');
@@ -74,7 +68,6 @@ flow('App Structure', 'AUTO-A8u1Ee4Sz', () => {
74
68
  should('support toggle to show/hide for more workspace');
75
69
  });
76
70
  });
77
-
78
71
  experience('Task Detail Panel', 'AUTO-D5b8Ll1Zz').client(() => {
79
72
  specs(() => {
80
73
  should('slide in from right side when task is clicked');
@@ -87,7 +80,6 @@ flow('App Structure', 'AUTO-A8u1Ee4Sz', () => {
87
80
  should('trap focus within panel when open for accessibility');
88
81
  });
89
82
  });
90
-
91
83
  experience('Search Overlay', 'AUTO-S6c9Mm2Az').client(() => {
92
84
  specs(() => {
93
85
  should('trigger with keyboard shortcut Cmd/Ctrl + K');
@@ -100,7 +92,6 @@ flow('App Structure', 'AUTO-A8u1Ee4Sz', () => {
100
92
  should('focus input automatically when opened');
101
93
  });
102
94
  });
103
-
104
95
  experience('Mobile Navigation', 'AUTO-M7d0Nn3Bz').client(() => {
105
96
  specs(() => {
106
97
  should('collapse top bar controls into hamburger menu on small screens');
@@ -112,7 +103,6 @@ flow('App Structure', 'AUTO-A8u1Ee4Sz', () => {
112
103
  should('apply safe area insets for notched devices');
113
104
  });
114
105
  });
115
-
116
106
  experience('Responsive Breakpoints', 'AUTO-R8e1Oo4Cz').client(() => {
117
107
  specs(() => {
118
108
  should('support desktop layout for screens 1024px and wider');
@@ -124,7 +114,6 @@ flow('App Structure', 'AUTO-A8u1Ee4Sz', () => {
124
114
  should('test on common device dimensions for consistency');
125
115
  });
126
116
  });
127
-
128
117
  experience('Loading States', 'AUTO-L9f2Pp5Dz').client(() => {
129
118
  specs(() => {
130
119
  should('show skeleton loaders for initial page load');
@@ -136,7 +125,6 @@ flow('App Structure', 'AUTO-A8u1Ee4Sz', () => {
136
125
  should('provide timeout fallback with retry option');
137
126
  });
138
127
  });
139
-
140
128
  experience('Error States', 'AUTO-E0g3Qq6Ez').client(() => {
141
129
  specs(() => {
142
130
  should('display inline error messages near relevant fields');
@@ -148,7 +136,6 @@ flow('App Structure', 'AUTO-A8u1Ee4Sz', () => {
148
136
  should('support error boundary for graceful failure recovery');
149
137
  });
150
138
  });
151
-
152
139
  experience('Accessibility Features', 'AUTO-A1h4Rr7Fz').client(() => {
153
140
  specs(() => {
154
141
  should('support full keyboard navigation throughout app');