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.
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -2
- package/dist/src/index.js.map +1 -1
- package/package.json +2 -2
- package/templates/kanban-todo/.context/auto-ia-scheme.json +151 -166
- package/templates/kanban-todo/.context/schema.graphql +17 -11
- package/templates/kanban-todo/.context/schema.json +45 -55
- package/templates/kanban-todo/.gitignore +2 -2
- package/templates/kanban-todo/auto.config.ts +141 -13
- package/templates/kanban-todo/client2/.gitignore +24 -0
- package/templates/kanban-todo/{flows/homepage.flow.ts → narratives/homepage.narrative.ts} +27 -38
- package/templates/kanban-todo/{flows/structure.flow.ts → narratives/structure.narrative.ts} +2 -15
- package/templates/kanban-todo/{flows/todo-list.flow.ts → narratives/todo-list.narrative.ts} +163 -210
- package/templates/kanban-todo/package.json +2 -1
- package/templates/questionnaires/auto.config.ts +6 -5
- package/templates/questionnaires/{flows/homepage.flow.ts → narratives/homepage.narrative.ts} +8 -8
- package/templates/questionnaires/{flows/questionnaires.flow.ts → narratives/questionnaires.narrative.ts} +3 -3
- package/templates/questionnaires/{flows/structure.flow.ts → narratives/structure.narrative.ts} +2 -2
- package/templates/questionnaires/package.json +1 -1
- package/templates/questionnaires/.claude/settings.local.json +0 -7
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"variant": "specs",
|
|
3
|
-
"
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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,5 +1,5 @@
|
|
|
1
1
|
import { autoConfig, on, dispatch } from '@auto-engineer/cli';
|
|
2
|
-
import type { ExportSchemaEvents } from '@auto-engineer/
|
|
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 =
|
|
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/
|
|
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
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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=./
|
|
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/
|
|
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=./
|
|
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,
|
|
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
|
|
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,
|
|
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');
|