create-auto-app 0.10.5 → 0.11.1

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.
@@ -0,0 +1,164 @@
1
+ import { experience, flow, should, specs } from '@auto-engineer/flow';
2
+
3
+ flow('App Structure', 'AUTO-A8u1Ee4Sz', () => {
4
+ experience('Application Layout', 'AUTO-L9v2Ff5Tz').client(() => {
5
+ specs(() => {
6
+ should('display clean top navigation bar spanning full width');
7
+ should('include app logo or name on left side of top bar');
8
+ should('show view toggle controls in center of top bar');
9
+ should('display theme toggle, search, and profile menu on right side');
10
+ should('use gradient or glass morphism effect for top bar');
11
+ should('maintain top bar fixed position during scroll');
12
+ should('apply subtle shadow to separate top bar from content');
13
+ });
14
+ });
15
+
16
+ experience('Main Content Area', 'AUTO-C0w3Gg6Uz').client(() => {
17
+ specs(() => {
18
+ should('occupy full viewport height below top bar');
19
+ should('apply subtle gradient or textured background');
20
+ should('center Kanban board with max-width container for large screens');
21
+ should('provide adequate padding around content on all sides');
22
+ should('support smooth transitions when switching between views');
23
+ should('maintain responsive layout for tablet and mobile devices');
24
+ should('use CSS Grid for Kanban column layout');
25
+ });
26
+ });
27
+
28
+ experience('Kanban Board Container', 'AUTO-K1x4Hh7Vz').client(() => {
29
+ specs(() => {
30
+ should('display three equal-width columns in desktop view');
31
+ should('apply consistent gap spacing between columns');
32
+ should('stack columns vertically on mobile devices');
33
+ should('support horizontal scrolling on smaller screens if needed');
34
+ should('maintain minimum column width for readability');
35
+ should('apply max-height with scroll for columns with many tasks');
36
+ should('show subtle scrollbar styling matching theme');
37
+ });
38
+ });
39
+
40
+ experience('Column Headers', 'AUTO-H2y5Ii8Wz').client(() => {
41
+ specs(() => {
42
+ should('display column title with clear typography');
43
+ should('show task count badge with colored background');
44
+ should('use gradient or accent colors per column type');
45
+ should('apply sticky positioning within scrollable columns');
46
+ should('include subtle shadow for depth');
47
+ should('maintain consistent height across all columns');
48
+ });
49
+ });
50
+
51
+ experience('Floating Action Button', 'AUTO-F3z6Jj9Xz').client(() => {
52
+ specs(() => {
53
+ should('position fixed in bottom-right corner of viewport');
54
+ should('display prominent plus icon or "Add" text');
55
+ should('use vibrant gradient or solid accent color');
56
+ should('apply circular shape with consistent size');
57
+ should('show shadow for elevation effect');
58
+ should('animate subtle pulse or glow on hover');
59
+ should('expand into input form with smooth scale animation on click');
60
+ should('maintain z-index above all other content');
61
+ should('hide on mobile when keyboard is visible');
62
+ });
63
+ });
64
+
65
+ experience('Statistics Sidebar', 'AUTO-S4a7Kk0Yz').client(() => {
66
+ specs(() => {
67
+ should('display on right side of screen in desktop view');
68
+ should('show progress ring at top of sidebar');
69
+ should('include statistics cards in vertical stack');
70
+ should('display recent activity feed below statistics');
71
+ should('apply glass morphism or card-based design');
72
+ should('collapse into expandable panel on tablet devices');
73
+ should('move to bottom sheet on mobile devices');
74
+ should('support toggle to show/hide for more workspace');
75
+ });
76
+ });
77
+
78
+ experience('Task Detail Panel', 'AUTO-D5b8Ll1Zz').client(() => {
79
+ specs(() => {
80
+ should('slide in from right side when task is clicked');
81
+ should('overlay main content with backdrop blur on mobile');
82
+ should('show full task information with edit capabilities');
83
+ should('include close button in top-right corner');
84
+ should('support swipe gesture to close on touch devices');
85
+ should('maintain consistent width on desktop');
86
+ should('animate slide-in/out with smooth easing');
87
+ should('trap focus within panel when open for accessibility');
88
+ });
89
+ });
90
+
91
+ experience('Search Overlay', 'AUTO-S6c9Mm2Az').client(() => {
92
+ specs(() => {
93
+ should('trigger with keyboard shortcut Cmd/Ctrl + K');
94
+ should('display centered modal overlay with backdrop blur');
95
+ should('show search input with large font size');
96
+ should('include recent searches or suggestions below input');
97
+ should('filter and display matching tasks in real-time');
98
+ should('support keyboard navigation through results');
99
+ should('close on Escape key or clicking backdrop');
100
+ should('focus input automatically when opened');
101
+ });
102
+ });
103
+
104
+ experience('Mobile Navigation', 'AUTO-M7d0Nn3Bz').client(() => {
105
+ specs(() => {
106
+ should('collapse top bar controls into hamburger menu on small screens');
107
+ should('show essential actions as bottom tab bar on mobile');
108
+ should('include tabs for: Kanban, Statistics, Add, Settings');
109
+ should('highlight active tab with accent color');
110
+ should('use icons for tabs with optional labels');
111
+ should('maintain fixed position at bottom of viewport');
112
+ should('apply safe area insets for notched devices');
113
+ });
114
+ });
115
+
116
+ experience('Responsive Breakpoints', 'AUTO-R8e1Oo4Cz').client(() => {
117
+ specs(() => {
118
+ should('support desktop layout for screens 1024px and wider');
119
+ should('adapt to tablet layout for screens 768px to 1023px');
120
+ should('optimize for mobile devices below 768px');
121
+ should('stack Kanban columns vertically on screens below 640px');
122
+ should('adjust font sizes and spacing for each breakpoint');
123
+ should('maintain touch-friendly tap targets on all devices');
124
+ should('test on common device dimensions for consistency');
125
+ });
126
+ });
127
+
128
+ experience('Loading States', 'AUTO-L9f2Pp5Dz').client(() => {
129
+ specs(() => {
130
+ should('show skeleton loaders for initial page load');
131
+ should('display shimmer effect on loading cards');
132
+ should('include spinner for async operations');
133
+ should('maintain layout stability during loading');
134
+ should('show optimistic UI updates for immediate feedback');
135
+ should('handle slow network conditions gracefully');
136
+ should('provide timeout fallback with retry option');
137
+ });
138
+ });
139
+
140
+ experience('Error States', 'AUTO-E0g3Qq6Ez').client(() => {
141
+ specs(() => {
142
+ should('display inline error messages near relevant fields');
143
+ should('show toast notifications for global errors');
144
+ should('include helpful error messages with suggested actions');
145
+ should('use consistent error styling with red accent color');
146
+ should('provide retry buttons for failed operations');
147
+ should('log errors to console for debugging');
148
+ should('support error boundary for graceful failure recovery');
149
+ });
150
+ });
151
+
152
+ experience('Accessibility Features', 'AUTO-A1h4Rr7Fz').client(() => {
153
+ specs(() => {
154
+ should('support full keyboard navigation throughout app');
155
+ should('provide ARIA labels for all interactive elements');
156
+ should('include skip links for main content areas');
157
+ should('maintain focus indicators with high contrast');
158
+ should('support screen reader announcements for dynamic changes');
159
+ should('respect prefers-reduced-motion for animations');
160
+ should('ensure color contrast meets WCAG AA standards');
161
+ should('provide alt text for all decorative images and icons');
162
+ });
163
+ });
164
+ });
@@ -0,0 +1,367 @@
1
+ import {
2
+ command,
3
+ query,
4
+ flow,
5
+ should,
6
+ specs,
7
+ rule,
8
+ example,
9
+ gql,
10
+ source,
11
+ data,
12
+ sink,
13
+ type Command,
14
+ type Event,
15
+ type State,
16
+ } from '@auto-engineer/flow';
17
+
18
+ type AddTodo = Command<
19
+ 'AddTodo',
20
+ {
21
+ todoId: string;
22
+ description: string;
23
+ }
24
+ >;
25
+
26
+ type TodoAdded = Event<
27
+ 'TodoAdded',
28
+ {
29
+ todoId: string;
30
+ description: string;
31
+ status: 'pending';
32
+ addedAt: Date;
33
+ }
34
+ >;
35
+
36
+ type MarkTodoInProgress = Command<
37
+ 'MarkTodoInProgress',
38
+ {
39
+ todoId: string;
40
+ }
41
+ >;
42
+
43
+ type TodoMarkedInProgress = Event<
44
+ 'TodoMarkedInProgress',
45
+ {
46
+ todoId: string;
47
+ markedAt: Date;
48
+ }
49
+ >;
50
+
51
+ type MarkTodoComplete = Command<
52
+ 'MarkTodoComplete',
53
+ {
54
+ todoId: string;
55
+ }
56
+ >;
57
+
58
+ type TodoMarkedComplete = Event<
59
+ 'TodoMarkedComplete',
60
+ {
61
+ todoId: string;
62
+ completedAt: Date;
63
+ }
64
+ >;
65
+
66
+ type TodoState = State<
67
+ 'TodoState',
68
+ {
69
+ todoId: string;
70
+ description: string;
71
+ status: 'pending' | 'in_progress' | 'completed';
72
+ addedAt: Date;
73
+ completedAt: Date | null;
74
+ }
75
+ >;
76
+
77
+ type TodoListSummary = State<
78
+ 'TodoListSummary',
79
+ {
80
+ summaryId: string;
81
+ totalTodos: number;
82
+ pendingCount: number;
83
+ inProgressCount: number;
84
+ completedCount: number;
85
+ completionPercentage: number;
86
+ }
87
+ >;
88
+
89
+ flow('Todo List', 'AUTO-T8dL3k9Xw', () => {
90
+ command('adds a new todo', 'AUTO-A1c4Mn7Bz')
91
+ .server(() => {
92
+ specs(() => {
93
+ rule('todos can be added to the list', 'AUTO-r1B2Cp8Y', () => {
94
+ example('adds a new todo successfully')
95
+ .when<AddTodo>({
96
+ todoId: 'todo-001',
97
+ description: 'Buy groceries',
98
+ })
99
+ .then<TodoAdded>({
100
+ todoId: 'todo-001',
101
+ description: 'Buy groceries',
102
+ status: 'pending',
103
+ addedAt: new Date('2030-01-01T09:00:00Z'),
104
+ });
105
+ });
106
+ });
107
+ data([sink().event('TodoAdded').toStream('todos')]);
108
+ })
109
+ .request(gql`
110
+ mutation AddTodo($input: AddTodoInput!) {
111
+ addTodo(input: $input) {
112
+ success
113
+ error {
114
+ type
115
+ message
116
+ }
117
+ }
118
+ }
119
+ `)
120
+ .client(() => {
121
+ specs('Add Todo', () => {
122
+ should('display a quick-add input field with floating action button');
123
+ should('show success animation when todo is added');
124
+ should('automatically place new todo in "To Do" column');
125
+ should('clear input field after successful addition');
126
+ should('focus back to input for quick consecutive additions');
127
+ });
128
+ });
129
+
130
+ command('moves todo to in progress', 'AUTO-M2d5No8Cz')
131
+ .server(() => {
132
+ specs(() => {
133
+ rule('todos can be moved to in progress', 'AUTO-r2C3Dq9Z', () => {
134
+ example('moves a pending todo to in progress')
135
+ .given<TodoAdded>({
136
+ todoId: 'todo-001',
137
+ description: 'Buy groceries',
138
+ status: 'pending',
139
+ addedAt: new Date('2030-01-01T09:00:00Z'),
140
+ })
141
+ .when<MarkTodoInProgress>({
142
+ todoId: 'todo-001',
143
+ })
144
+ .then<TodoMarkedInProgress>({
145
+ todoId: 'todo-001',
146
+ markedAt: new Date('2030-01-01T10:00:00Z'),
147
+ });
148
+ });
149
+ });
150
+ data([sink().event('TodoMarkedInProgress').toStream('todos')]);
151
+ })
152
+ .request(gql`
153
+ mutation MarkTodoInProgress($input: MarkTodoInProgressInput!) {
154
+ markTodoInProgress(input: $input) {
155
+ success
156
+ error {
157
+ type
158
+ message
159
+ }
160
+ }
161
+ }
162
+ `)
163
+ .client(() => {
164
+ specs('Move to In Progress', () => {
165
+ should('support drag-and-drop from "To Do" to "In Progress" column');
166
+ should('animate smooth transition between columns');
167
+ should('update column count badges in real-time');
168
+ should('show visual feedback during drag operation');
169
+ });
170
+ });
171
+
172
+ command('marks todo as complete', 'AUTO-C3e6Op9Dz')
173
+ .server(() => {
174
+ specs(() => {
175
+ rule('todos can be marked as complete', 'AUTO-r3D4Eq0A', () => {
176
+ example('marks an in-progress todo as complete')
177
+ .given<TodoAdded>({
178
+ todoId: 'todo-001',
179
+ description: 'Buy groceries',
180
+ status: 'pending',
181
+ addedAt: new Date('2030-01-01T09:00:00Z'),
182
+ })
183
+ .and<TodoMarkedInProgress>({
184
+ todoId: 'todo-001',
185
+ markedAt: new Date('2030-01-01T10:00:00Z'),
186
+ })
187
+ .when<MarkTodoComplete>({
188
+ todoId: 'todo-001',
189
+ })
190
+ .then<TodoMarkedComplete>({
191
+ todoId: 'todo-001',
192
+ completedAt: new Date('2030-01-01T11:00:00Z'),
193
+ });
194
+
195
+ example('marks a pending todo directly as complete')
196
+ .given<TodoAdded>({
197
+ todoId: 'todo-002',
198
+ description: 'Write report',
199
+ status: 'pending',
200
+ addedAt: new Date('2030-01-01T09:00:00Z'),
201
+ })
202
+ .when<MarkTodoComplete>({
203
+ todoId: 'todo-002',
204
+ })
205
+ .then<TodoMarkedComplete>({
206
+ todoId: 'todo-002',
207
+ completedAt: new Date('2030-01-01T11:30:00Z'),
208
+ });
209
+ });
210
+ });
211
+ data([sink().event('TodoMarkedComplete').toStream('todos')]);
212
+ })
213
+ .request(gql`
214
+ mutation MarkTodoComplete($input: MarkTodoCompleteInput!) {
215
+ markTodoComplete(input: $input) {
216
+ success
217
+ error {
218
+ type
219
+ message
220
+ }
221
+ }
222
+ }
223
+ `)
224
+ .client(() => {
225
+ specs('Complete Todo', () => {
226
+ should('support drag-and-drop to "Done" column');
227
+ should('show celebration animation on completion');
228
+ should('display visual confetti effect for milestone completions');
229
+ should('update completion percentage progress ring');
230
+ should('strike-through completed todo text with smooth animation');
231
+ should('show completion timestamp on hover');
232
+ });
233
+ });
234
+
235
+ query('views all todos', 'AUTO-V4f7Pq0Ez')
236
+ .server(() => {
237
+ specs(() => {
238
+ rule('all todos are displayed with their current status', 'AUTO-r4E5Fr1B', () => {
239
+ example('shows multiple todos in different states')
240
+ .given<TodoAdded>({
241
+ todoId: 'todo-001',
242
+ description: 'Buy groceries',
243
+ status: 'pending',
244
+ addedAt: new Date('2030-01-01T09:00:00Z'),
245
+ })
246
+ .and<TodoAdded>({
247
+ todoId: 'todo-002',
248
+ description: 'Write report',
249
+ status: 'pending',
250
+ addedAt: new Date('2030-01-01T09:10:00Z'),
251
+ })
252
+ .and<TodoMarkedInProgress>({
253
+ todoId: 'todo-001',
254
+ markedAt: new Date('2030-01-01T10:00:00Z'),
255
+ })
256
+ .and<TodoMarkedComplete>({
257
+ todoId: 'todo-002',
258
+ completedAt: new Date('2030-01-01T11:00:00Z'),
259
+ })
260
+ .when({})
261
+ .then<TodoState>({
262
+ todoId: 'todo-001',
263
+ description: 'Buy groceries',
264
+ status: 'in_progress',
265
+ addedAt: new Date('2030-01-01T09:00:00Z'),
266
+ completedAt: null,
267
+ })
268
+ .and<TodoState>({
269
+ todoId: 'todo-002',
270
+ description: 'Write report',
271
+ status: 'completed',
272
+ addedAt: new Date('2030-01-01T09:10:00Z'),
273
+ completedAt: new Date('2030-01-01T11:00:00Z'),
274
+ });
275
+ });
276
+ });
277
+ data([source().state('TodoState').fromProjection('Todos', 'todoId')]);
278
+ })
279
+ .request(gql`
280
+ query AllTodos {
281
+ todos {
282
+ todoId
283
+ description
284
+ status
285
+ addedAt
286
+ completedAt
287
+ }
288
+ }
289
+ `)
290
+ .client(() => {
291
+ specs('Todo List View', () => {
292
+ should('display todos organized in three columns: To Do, In Progress, Done');
293
+ should('show count badges on each column header');
294
+ should('support drag-and-drop between columns');
295
+ should('display empty state illustrations for empty columns');
296
+ should('show todo cards with glass morphism effect');
297
+ should('display subtle hover effects on todo cards');
298
+ should('support keyboard navigation between todos');
299
+ });
300
+ });
301
+
302
+ query('views completion summary', 'AUTO-S5g8Qr1Fz')
303
+ .server(() => {
304
+ specs(() => {
305
+ rule('summary shows overall todo list statistics', 'AUTO-r5F6Gs2C', () => {
306
+ example('calculates summary from multiple todos')
307
+ .given<TodoAdded>({
308
+ todoId: 'todo-001',
309
+ description: 'Buy groceries',
310
+ status: 'pending',
311
+ addedAt: new Date('2030-01-01T09:00:00Z'),
312
+ })
313
+ .and<TodoAdded>({
314
+ todoId: 'todo-002',
315
+ description: 'Write report',
316
+ status: 'pending',
317
+ addedAt: new Date('2030-01-01T09:10:00Z'),
318
+ })
319
+ .and<TodoAdded>({
320
+ todoId: 'todo-003',
321
+ description: 'Call client',
322
+ status: 'pending',
323
+ addedAt: new Date('2030-01-01T09:20:00Z'),
324
+ })
325
+ .and<TodoMarkedInProgress>({
326
+ todoId: 'todo-001',
327
+ markedAt: new Date('2030-01-01T10:00:00Z'),
328
+ })
329
+ .and<TodoMarkedComplete>({
330
+ todoId: 'todo-002',
331
+ completedAt: new Date('2030-01-01T11:00:00Z'),
332
+ })
333
+ .when({})
334
+ .then<TodoListSummary>({
335
+ summaryId: 'main-summary',
336
+ totalTodos: 3,
337
+ pendingCount: 1,
338
+ inProgressCount: 1,
339
+ completedCount: 1,
340
+ completionPercentage: 33,
341
+ });
342
+ });
343
+ });
344
+ data([source().state('TodoListSummary').fromProjection('TodoSummary', 'summaryId')]);
345
+ })
346
+ .request(gql`
347
+ query TodoListSummary {
348
+ todoListSummary {
349
+ totalTodos
350
+ pendingCount
351
+ inProgressCount
352
+ completedCount
353
+ completionPercentage
354
+ }
355
+ }
356
+ `)
357
+ .client(() => {
358
+ specs('Completion Summary', () => {
359
+ should('display circular progress ring showing completion percentage');
360
+ should('show total task count in center of progress ring');
361
+ should('display breakdown of pending, in-progress, and completed counts');
362
+ should('update progress ring with smooth animation on status changes');
363
+ should('use gradient colors for progress ring');
364
+ should('show daily completion goal progress');
365
+ });
366
+ });
367
+ });
@@ -1,10 +1,10 @@
1
1
  {
2
- "name": "finance-tracker",
2
+ "name": "todo-list",
3
3
  "private": true,
4
4
  "type": "module",
5
5
  "scripts": {
6
- "DISABLE-auto": "node ../../packages/cli/dist/bin/auto.js",
7
- "DISABLE-auto:debug": "DEBUG=flow:*,cli:*,auto*,ai*,-*file-syncer,-*flow* node ../../packages/cli/dist/bin/auto.js",
6
+ "auto": "node ../../packages/cli/dist/bin/auto.js",
7
+ "auto:debug": "DEBUG=flow:*,cli:*,auto*,ai*,-*file-syncer,-*flow* node ../../packages/cli/dist/bin/auto.js",
8
8
  "start": "dotenv -e .env -- pnpm --parallel start"
9
9
  },
10
10
  "dependencies": {
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "todo-list",
3
+ "displayName": "Todo List with Kanban",
4
+ "description": "Beautiful Kanban-style todo list with drag-and-drop and smooth animations",
5
+ "type": "template",
6
+ "preset": "full"
7
+ }
@@ -7,11 +7,9 @@
7
7
  "emitDecoratorMetadata": true,
8
8
  "experimentalDecorators": true,
9
9
  "outDir": "./dist",
10
- "rootDir": ".",
11
10
  "noEmit": false,
12
- "strict": true,
13
11
  "strictNullChecks": true
14
12
  },
15
- "include": ["flows/**/*", "vitest.config.ts"],
13
+ "include": ["**/*", "vitest.config.ts"],
16
14
  "exclude": ["dist", "node_modules"]
17
15
  }
@@ -1,74 +0,0 @@
1
- import { experience, flow, should, specs } from '@auto-engineer/flow';
2
- flow('Micro Personal Finance App', 'AUTO-ixiwHOw5J', () => {
3
- experience('App Structure', 'AUTO-WN9lxdNao').client(() => {
4
- specs('', () => {
5
- should('display persistent sidebar on left for navigation');
6
- should('sidebar includes links: Home, Add Expense, Charts, Subscriptions, Savings Jar, Budget, Expense History');
7
- should('highlight current active link in sidebar');
8
- should('sidebar collapsible for smaller screens');
9
- should('top bar includes app logo, profile menu, and notifications icon');
10
- should(
11
- 'bottom or top persistent bar shows global widgets: total spending, remaining budget, savings jar progress',
12
- );
13
- should('content area changes dynamically based on selected navigation link');
14
- should('maintain layout consistency across all screens');
15
- should('support responsive design with sidebar collapsing into hamburger menu on mobile');
16
- });
17
- });
18
- experience('Home Screen', 'AUTO-MJj0kM801').client(() => {
19
- specs('', () => {
20
- should('show today\u2019s spending summary and remaining budget');
21
- should('display recent expenses list');
22
- should('show visual progress of savings jar goal');
23
- should('quick access buttons for Add Expense, Charts, Subscriptions');
24
- });
25
- });
26
- experience('Add Expense', 'AUTO-ja4Y35TAK').client(() => {
27
- specs('', () => {
28
- should('allow entering expense amount, category, and note');
29
- should('show recent/frequent categories for quick selection');
30
- should('display confirmation toast after adding expense');
31
- should('update budget bar and charts in real-time');
32
- });
33
- });
34
- experience('Spending Charts', 'AUTO-3VZYky812').client(() => {
35
- specs('', () => {
36
- should('show daily and weekly spending charts');
37
- should('highlight categories with highest spend');
38
- should('allow filtering by category or date range');
39
- should('update dynamically when new expenses are added');
40
- });
41
- });
42
- experience('Manage Subscriptions', 'AUTO-AJEeeuqeT').client(() => {
43
- specs('', () => {
44
- should('list all active subscriptions with amount and renewal date');
45
- should('allow adding, editing, and removing subscriptions');
46
- should('show monthly summary of subscription spending');
47
- should('highlight upcoming renewals');
48
- });
49
- });
50
- experience('Round-Up Savings Jar', 'AUTO-5x0Vk8A3q').client(() => {
51
- specs('', () => {
52
- should('show current total and goal progress');
53
- should('allow changing the savings goal');
54
- should('automatically round up new expenses');
55
- should('display visual progress bar consistently in shell');
56
- });
57
- });
58
- experience('Budget Tracker', 'AUTO-xRpeVwyqT').client(() => {
59
- specs('', () => {
60
- should('allow setting monthly/weekly budget');
61
- should('show remaining budget as a progress bar');
62
- should('highlight overspending');
63
- should('update in real-time when expenses are added');
64
- });
65
- });
66
- experience('Expense Detail', 'AUTO-8aBiA4R37').client(() => {
67
- specs('', () => {
68
- should('allow viewing full expense history');
69
- should('filter by category, date, or amount');
70
- should('edit or delete individual expenses');
71
- should('show contribution of each expense to daily/weekly/monthly totals');
72
- });
73
- });
74
- });
@@ -1,34 +0,0 @@
1
- import { experience, flow, should, specs } from '@auto-engineer/flow';
2
- flow('Landing Page', 'AUTO-z8hpgv8UU', () => {
3
- experience('Landing Page', 'AUTO-Ke1xAjRsI').client(() => {
4
- specs('', () => {
5
- should('display app name and tagline prominently at top of page');
6
- should('show a hero image or illustration representing personal finance');
7
- should('include a primary call-to-action button to "Get Started" or "Sign Up"');
8
- should('include a secondary CTA to "Learn More"');
9
- should(
10
- 'list core features with icons: expense tracking, subscriptions, round-up savings, budget tracking, charts',
11
- );
12
- should('display brief descriptions under each feature');
13
- should('support horizontal scrolling or 3-column layout for desktop, stacked for mobile');
14
- should('show 2-3 user testimonials with names, photos, and quotes');
15
- should('highlight real benefits users have gained using the app');
16
- should('display simple pricing plans: Free, Premium');
17
- should('show plan features in a table or card layout');
18
- should('include CTA buttons for each plan: "Start Free" or "Upgrade"');
19
- should('include links to About, FAQ, Terms of Service, Privacy Policy, and Contact');
20
- should('display social media icons for Twitter, LinkedIn, etc.');
21
- should('support smooth scrolling to sections when clicking navigation links');
22
- should('be fully responsive for desktop, tablet, and mobile');
23
- });
24
- });
25
- experience('Onboarding', 'AUTO-krmQIPP30').client(() => {
26
- specs('', () => {
27
- should('allow user to set initial monthly budget');
28
- should('allow adding first expense');
29
- should('allow setting initial savings jar goal');
30
- should('show visual progress indicators as steps are completed');
31
- should('allow skipping onboarding to go directly to main app');
32
- });
33
- });
34
- });