create-auto-app 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/dist/index.js +189 -85
  2. package/dist/index.js.map +1 -1
  3. package/package.json +1 -1
  4. package/templates/shopping-app/.context/auto-ia-scheme.json +175 -0
  5. package/templates/shopping-app/.context/design-system.md +118 -0
  6. package/templates/shopping-app/.context/figma-variables.json +14448 -0
  7. package/templates/shopping-app/.context/schema.graphql +46 -0
  8. package/templates/shopping-app/.context/schema.json +583 -0
  9. package/templates/shopping-app/.context/shadcn-filter.ts +31 -0
  10. package/templates/shopping-app/.env +8 -0
  11. package/templates/shopping-app/auto.config.ts +21 -0
  12. package/templates/shopping-app/client/auto-configure.ts +107 -0
  13. package/templates/shopping-app/client/codegen.ts +16 -0
  14. package/templates/shopping-app/client/components.json +20 -0
  15. package/templates/shopping-app/client/design-system-principles.md +19 -0
  16. package/templates/shopping-app/client/eslint.config.ts +57 -0
  17. package/templates/shopping-app/client/index.html +26 -0
  18. package/templates/shopping-app/client/package.json +100 -0
  19. package/templates/shopping-app/client/postcss.config.js +6 -0
  20. package/templates/shopping-app/client/public/favicon.ico +0 -0
  21. package/templates/shopping-app/client/schema.graphql +46 -0
  22. package/templates/shopping-app/client/src/App.css +42 -0
  23. package/templates/shopping-app/client/src/App.tsx +20 -0
  24. package/templates/shopping-app/client/src/apolloClient.ts +8 -0
  25. package/templates/shopping-app/client/src/components/atoms/accordion.tsx +51 -0
  26. package/templates/shopping-app/client/src/components/atoms/alert-dialog.tsx +111 -0
  27. package/templates/shopping-app/client/src/components/atoms/alert.tsx +49 -0
  28. package/templates/shopping-app/client/src/components/atoms/aspect-ratio.tsx +7 -0
  29. package/templates/shopping-app/client/src/components/atoms/avatar.tsx +32 -0
  30. package/templates/shopping-app/client/src/components/atoms/badge.tsx +36 -0
  31. package/templates/shopping-app/client/src/components/atoms/breadcrumb.tsx +92 -0
  32. package/templates/shopping-app/client/src/components/atoms/button.tsx +50 -0
  33. package/templates/shopping-app/client/src/components/atoms/calendar.tsx +156 -0
  34. package/templates/shopping-app/client/src/components/atoms/card.tsx +56 -0
  35. package/templates/shopping-app/client/src/components/atoms/carousel.tsx +214 -0
  36. package/templates/shopping-app/client/src/components/atoms/chart.tsx +290 -0
  37. package/templates/shopping-app/client/src/components/atoms/checkbox.tsx +27 -0
  38. package/templates/shopping-app/client/src/components/atoms/collapsible.tsx +15 -0
  39. package/templates/shopping-app/client/src/components/atoms/command.tsx +135 -0
  40. package/templates/shopping-app/client/src/components/atoms/context-menu.tsx +209 -0
  41. package/templates/shopping-app/client/src/components/atoms/dialog.tsx +123 -0
  42. package/templates/shopping-app/client/src/components/atoms/drawer.tsx +106 -0
  43. package/templates/shopping-app/client/src/components/atoms/dropdown-menu.tsx +217 -0
  44. package/templates/shopping-app/client/src/components/atoms/hover-card.tsx +36 -0
  45. package/templates/shopping-app/client/src/components/atoms/input-otp.tsx +66 -0
  46. package/templates/shopping-app/client/src/components/atoms/input.tsx +21 -0
  47. package/templates/shopping-app/client/src/components/atoms/label.tsx +19 -0
  48. package/templates/shopping-app/client/src/components/atoms/logo.tsx +33 -0
  49. package/templates/shopping-app/client/src/components/atoms/menubar.tsx +234 -0
  50. package/templates/shopping-app/client/src/components/atoms/navigation-menu.tsx +142 -0
  51. package/templates/shopping-app/client/src/components/atoms/pagination.tsx +100 -0
  52. package/templates/shopping-app/client/src/components/atoms/popover.tsx +40 -0
  53. package/templates/shopping-app/client/src/components/atoms/progress.tsx +22 -0
  54. package/templates/shopping-app/client/src/components/atoms/radio-group.tsx +31 -0
  55. package/templates/shopping-app/client/src/components/atoms/resizable.tsx +46 -0
  56. package/templates/shopping-app/client/src/components/atoms/scroll-area.tsx +46 -0
  57. package/templates/shopping-app/client/src/components/atoms/select.tsx +158 -0
  58. package/templates/shopping-app/client/src/components/atoms/separator.tsx +26 -0
  59. package/templates/shopping-app/client/src/components/atoms/sheet.tsx +101 -0
  60. package/templates/shopping-app/client/src/components/atoms/sidebar.tsx +675 -0
  61. package/templates/shopping-app/client/src/components/atoms/skeleton.tsx +7 -0
  62. package/templates/shopping-app/client/src/components/atoms/slider.tsx +54 -0
  63. package/templates/shopping-app/client/src/components/atoms/sonner.tsx +23 -0
  64. package/templates/shopping-app/client/src/components/atoms/switch.tsx +26 -0
  65. package/templates/shopping-app/client/src/components/atoms/table.tsx +73 -0
  66. package/templates/shopping-app/client/src/components/atoms/tabs.tsx +40 -0
  67. package/templates/shopping-app/client/src/components/atoms/textarea.tsx +18 -0
  68. package/templates/shopping-app/client/src/components/atoms/toggle-group.tsx +65 -0
  69. package/templates/shopping-app/client/src/components/atoms/toggle.tsx +39 -0
  70. package/templates/shopping-app/client/src/components/atoms/tooltip.tsx +48 -0
  71. package/templates/shopping-app/client/src/components/molecules/QuantitySelector.tsx +8 -0
  72. package/templates/shopping-app/client/src/components/molecules/ShoppingCriteriaForm.tsx +8 -0
  73. package/templates/shopping-app/client/src/components/molecules/SuggestedItemCard.tsx +10 -0
  74. package/templates/shopping-app/client/src/components/organisms/AssistantChatInterface.tsx +14 -0
  75. package/templates/shopping-app/client/src/components/organisms/PageHeader.tsx +6 -0
  76. package/templates/shopping-app/client/src/components/organisms/SuggestedItemsList.tsx +15 -0
  77. package/templates/shopping-app/client/src/gql/fragment-masking.ts +48 -0
  78. package/templates/shopping-app/client/src/gql/gql.ts +47 -0
  79. package/templates/shopping-app/client/src/gql/graphql.ts +106 -0
  80. package/templates/shopping-app/client/src/gql/index.ts +2 -0
  81. package/templates/shopping-app/client/src/graphql/mutations.ts +13 -0
  82. package/templates/shopping-app/client/src/graphql/queries.ts +14 -0
  83. package/templates/shopping-app/client/src/hooks/use-mobile.tsx +19 -0
  84. package/templates/shopping-app/client/src/hooks/use-toast.ts +186 -0
  85. package/templates/shopping-app/client/src/index.css +153 -0
  86. package/templates/shopping-app/client/src/lib/utils.ts +6 -0
  87. package/templates/shopping-app/client/src/main.tsx +5 -0
  88. package/templates/shopping-app/client/src/mockApolloClient.ts +93 -0
  89. package/templates/shopping-app/client/src/pages/AssistantChatPage.tsx +8 -0
  90. package/templates/shopping-app/client/src/pages/Index.tsx +10 -0
  91. package/templates/shopping-app/client/src/pages/NotFound.tsx +22 -0
  92. package/templates/shopping-app/client/src/pages/SuggestedItemsPage.tsx +8 -0
  93. package/templates/shopping-app/client/tailwind.config.ts +92 -0
  94. package/templates/shopping-app/client/tsconfig.json +49 -0
  95. package/templates/shopping-app/client/vite.config.ts +17 -0
  96. package/templates/shopping-app/flows/shopping-assistant.flow.ts +369 -0
  97. package/templates/shopping-app/package.json +25 -0
  98. package/templates/shopping-app/pnpm-workspace.yaml +2 -0
  99. package/templates/shopping-app/server/package.json +25 -0
  100. package/templates/shopping-app/server/scripts/generate-schema.ts +31 -0
  101. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/accepts-items-and-adds-to-their-cart/commands.ts +8 -0
  102. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/accepts-items-and-adds-to-their-cart/decide.specs.ts +46 -0
  103. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/accepts-items-and-adds-to-their-cart/decide.ts +36 -0
  104. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/accepts-items-and-adds-to-their-cart/events.ts +10 -0
  105. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/accepts-items-and-adds-to-their-cart/evolve.ts +28 -0
  106. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/accepts-items-and-adds-to-their-cart/handle.ts +31 -0
  107. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/accepts-items-and-adds-to-their-cart/mutation.resolver.ts +29 -0
  108. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/accepts-items-and-adds-to-their-cart/register.ts +10 -0
  109. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/accepts-items-and-adds-to-their-cart/state.ts +47 -0
  110. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/creates-a-chat-session-/react.specs.ts +63 -0
  111. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/creates-a-chat-session-/react.ts +49 -0
  112. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/creates-a-chat-session-/register.ts +31 -0
  113. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/enters-shopping-criteria-into-assistant/commands.ts +8 -0
  114. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/enters-shopping-criteria-into-assistant/decide.specs.ts +38 -0
  115. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/enters-shopping-criteria-into-assistant/decide.ts +36 -0
  116. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/enters-shopping-criteria-into-assistant/events.ts +10 -0
  117. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/enters-shopping-criteria-into-assistant/evolve.ts +28 -0
  118. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/enters-shopping-criteria-into-assistant/handle.ts +31 -0
  119. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/enters-shopping-criteria-into-assistant/mutation.resolver.ts +30 -0
  120. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/enters-shopping-criteria-into-assistant/register.ts +10 -0
  121. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/enters-shopping-criteria-into-assistant/state.ts +47 -0
  122. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/selects-items-relevant-to-the-shopping-criteria-/commands.ts +8 -0
  123. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/selects-items-relevant-to-the-shopping-criteria-/decide.specs.ts +61 -0
  124. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/selects-items-relevant-to-the-shopping-criteria-/decide.ts +45 -0
  125. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/selects-items-relevant-to-the-shopping-criteria-/events.ts +14 -0
  126. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/selects-items-relevant-to-the-shopping-criteria-/evolve.ts +28 -0
  127. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/selects-items-relevant-to-the-shopping-criteria-/handle.ts +59 -0
  128. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/selects-items-relevant-to-the-shopping-criteria-/mutation.resolver.ts +30 -0
  129. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/selects-items-relevant-to-the-shopping-criteria-/register.ts +10 -0
  130. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/selects-items-relevant-to-the-shopping-criteria-/state.ts +47 -0
  131. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/views-suggested-items/projection.specs.ts +94 -0
  132. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/views-suggested-items/projection.ts +40 -0
  133. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/views-suggested-items/query.resolver.ts +59 -0
  134. package/templates/shopping-app/server/src/domain/flows/seasonal-assistant/views-suggested-items/state.ts +9 -0
  135. package/templates/shopping-app/server/src/domain/shared/ReadModel.d.ts +10 -0
  136. package/templates/shopping-app/server/src/domain/shared/ReadModel.d.ts.map +1 -0
  137. package/templates/shopping-app/server/src/domain/shared/ReadModel.js +19 -0
  138. package/templates/shopping-app/server/src/domain/shared/ReadModel.js.map +1 -0
  139. package/templates/shopping-app/server/src/domain/shared/ReadModel.ts +26 -0
  140. package/templates/shopping-app/server/src/domain/shared/index.d.ts +5 -0
  141. package/templates/shopping-app/server/src/domain/shared/index.d.ts.map +1 -0
  142. package/templates/shopping-app/server/src/domain/shared/index.js +5 -0
  143. package/templates/shopping-app/server/src/domain/shared/index.js.map +1 -0
  144. package/templates/shopping-app/server/src/domain/shared/index.ts +4 -0
  145. package/templates/shopping-app/server/src/domain/shared/reactorSpecification.d.ts +35 -0
  146. package/templates/shopping-app/server/src/domain/shared/reactorSpecification.d.ts.map +1 -0
  147. package/templates/shopping-app/server/src/domain/shared/reactorSpecification.js +155 -0
  148. package/templates/shopping-app/server/src/domain/shared/reactorSpecification.js.map +1 -0
  149. package/templates/shopping-app/server/src/domain/shared/reactorSpecification.ts +257 -0
  150. package/templates/shopping-app/server/src/domain/shared/sendCommand.d.ts +4 -0
  151. package/templates/shopping-app/server/src/domain/shared/sendCommand.d.ts.map +1 -0
  152. package/templates/shopping-app/server/src/domain/shared/sendCommand.js +17 -0
  153. package/templates/shopping-app/server/src/domain/shared/sendCommand.js.map +1 -0
  154. package/templates/shopping-app/server/src/domain/shared/sendCommand.ts +21 -0
  155. package/templates/shopping-app/server/src/domain/shared/types.d.ts +19 -0
  156. package/templates/shopping-app/server/src/domain/shared/types.d.ts.map +1 -0
  157. package/templates/shopping-app/server/src/domain/shared/types.js +39 -0
  158. package/templates/shopping-app/server/src/domain/shared/types.js.map +1 -0
  159. package/templates/shopping-app/server/src/domain/shared/types.ts +31 -0
  160. package/templates/shopping-app/server/src/integrations/ai-integration.ts +76 -0
  161. package/templates/shopping-app/server/src/integrations/cart-integration.ts +178 -0
  162. package/templates/shopping-app/server/src/integrations/index.ts +3 -0
  163. package/templates/shopping-app/server/src/integrations/product-catalogue-integration.ts +363 -0
  164. package/templates/shopping-app/server/src/server.ts +43 -0
  165. package/templates/shopping-app/server/src/utils/index.d.ts +4 -0
  166. package/templates/shopping-app/server/src/utils/index.d.ts.map +1 -0
  167. package/templates/shopping-app/server/src/utils/index.js +4 -0
  168. package/templates/shopping-app/server/src/utils/index.js.map +1 -0
  169. package/templates/shopping-app/server/src/utils/index.ts +3 -0
  170. package/templates/shopping-app/server/src/utils/loadProjections.d.ts +3 -0
  171. package/templates/shopping-app/server/src/utils/loadProjections.d.ts.map +1 -0
  172. package/templates/shopping-app/server/src/utils/loadProjections.js +23 -0
  173. package/templates/shopping-app/server/src/utils/loadProjections.js.map +1 -0
  174. package/templates/shopping-app/server/src/utils/loadProjections.ts +30 -0
  175. package/templates/shopping-app/server/src/utils/loadRegisterFiles.d.ts +6 -0
  176. package/templates/shopping-app/server/src/utils/loadRegisterFiles.d.ts.map +1 -0
  177. package/templates/shopping-app/server/src/utils/loadRegisterFiles.js +28 -0
  178. package/templates/shopping-app/server/src/utils/loadRegisterFiles.js.map +1 -0
  179. package/templates/shopping-app/server/src/utils/loadRegisterFiles.ts +41 -0
  180. package/templates/shopping-app/server/src/utils/loadResolvers.d.ts +5 -0
  181. package/templates/shopping-app/server/src/utils/loadResolvers.d.ts.map +1 -0
  182. package/templates/shopping-app/server/src/utils/loadResolvers.js +27 -0
  183. package/templates/shopping-app/server/src/utils/loadResolvers.js.map +1 -0
  184. package/templates/shopping-app/server/src/utils/loadResolvers.ts +36 -0
  185. package/templates/shopping-app/server/tsconfig.json +19 -0
  186. package/templates/shopping-app/server/vitest.config.ts +7 -0
  187. package/templates/shopping-app/tsconfig.json +21 -0
@@ -0,0 +1,92 @@
1
+ import type { Config } from 'tailwindcss';
2
+ import tailwindAnimate from 'tailwindcss-animate';
3
+
4
+ export default {
5
+ darkMode: ['class'],
6
+ content: ['./pages/**/*.{ts,tsx}', './components/**/*.{ts,tsx}', './app/**/*.{ts,tsx}', './src/**/*.{ts,tsx}'],
7
+ prefix: '',
8
+ theme: {
9
+ container: {
10
+ center: true,
11
+ padding: '2rem',
12
+ screens: {
13
+ '2xl': '1400px',
14
+ },
15
+ },
16
+ extend: {
17
+ colors: {
18
+ border: 'hsl(var(--border))',
19
+ input: 'hsl(var(--input))',
20
+ ring: 'hsl(var(--ring))',
21
+ background: 'hsl(var(--background))',
22
+ foreground: 'hsl(var(--foreground))',
23
+ primary: {
24
+ DEFAULT: 'hsl(var(--primary))',
25
+ foreground: 'hsl(var(--primary-foreground))',
26
+ },
27
+ secondary: {
28
+ DEFAULT: 'hsl(var(--secondary))',
29
+ foreground: 'hsl(var(--secondary-foreground))',
30
+ },
31
+ destructive: {
32
+ DEFAULT: 'hsl(var(--destructive))',
33
+ foreground: 'hsl(var(--destructive-foreground))',
34
+ },
35
+ muted: {
36
+ DEFAULT: 'hsl(var(--muted))',
37
+ foreground: 'hsl(var(--muted-foreground))',
38
+ },
39
+ accent: {
40
+ DEFAULT: 'hsl(var(--accent))',
41
+ foreground: 'hsl(var(--accent-foreground))',
42
+ },
43
+ popover: {
44
+ DEFAULT: 'hsl(var(--popover))',
45
+ foreground: 'hsl(var(--popover-foreground))',
46
+ },
47
+ card: {
48
+ DEFAULT: 'hsl(var(--card))',
49
+ foreground: 'hsl(var(--card-foreground))',
50
+ },
51
+ sidebar: {
52
+ DEFAULT: 'hsl(var(--sidebar-background))',
53
+ foreground: 'hsl(var(--sidebar-foreground))',
54
+ primary: 'hsl(var(--sidebar-primary))',
55
+ 'primary-foreground': 'hsl(var(--sidebar-primary-foreground))',
56
+ accent: 'hsl(var(--sidebar-accent))',
57
+ 'accent-foreground': 'hsl(var(--sidebar-accent-foreground))',
58
+ border: 'hsl(var(--sidebar-border))',
59
+ ring: 'hsl(var(--sidebar-ring))',
60
+ },
61
+ },
62
+ borderRadius: {
63
+ lg: 'var(--radius)',
64
+ md: 'calc(var(--radius) - 2px)',
65
+ sm: 'calc(var(--radius) - 4px)',
66
+ },
67
+ keyframes: {
68
+ 'accordion-down': {
69
+ from: {
70
+ height: '0',
71
+ },
72
+ to: {
73
+ height: 'var(--radix-accordion-content-height)',
74
+ },
75
+ },
76
+ 'accordion-up': {
77
+ from: {
78
+ height: 'var(--radix-accordion-content-height)',
79
+ },
80
+ to: {
81
+ height: '0',
82
+ },
83
+ },
84
+ },
85
+ animation: {
86
+ 'accordion-down': 'accordion-down 0.2s ease-out',
87
+ 'accordion-up': 'accordion-up 0.2s ease-out',
88
+ },
89
+ },
90
+ },
91
+ plugins: [tailwindAnimate],
92
+ } satisfies Config;
@@ -0,0 +1,49 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "lib": ["ES2023", "DOM", "DOM.Iterable"],
5
+ "module": "ESNext",
6
+ "moduleResolution": "node",
7
+ "isolatedModules": true,
8
+ "moduleDetection": "force",
9
+ "noEmit": true,
10
+ "jsx": "react-jsx",
11
+ "jsxImportSource": "react",
12
+
13
+ /* Type Safety */
14
+ "strict": false,
15
+ "strictNullChecks": false,
16
+ "strictFunctionTypes": false,
17
+ "strictBindCallApply": false,
18
+ "strictPropertyInitialization": false,
19
+ "noImplicitAny": false,
20
+ "noImplicitThis": false,
21
+ // "alwaysStrict": true,
22
+
23
+ /* Quality Checks */
24
+ "noUnusedLocals": false,
25
+ "noUnusedParameters": false,
26
+ "noFallthroughCasesInSwitch": false,
27
+ "noImplicitReturns": false,
28
+ "exactOptionalPropertyTypes": false,
29
+ "forceConsistentCasingInFileNames": false,
30
+ "skipLibCheck": true,
31
+ "skipDefaultLibCheck": true,
32
+ "allowSyntheticDefaultImports": true,
33
+
34
+ /* Paths / Aliases */
35
+ "baseUrl": ".",
36
+ "paths": {
37
+ "@/*": ["./src/*"]
38
+ }
39
+ },
40
+ "include": [
41
+ "src/**/*",
42
+ "vite.config.ts",
43
+ "codegen.ts",
44
+ "tailwind.config.ts",
45
+ "eslint.config.ts",
46
+ "auto-configure.ts"
47
+ ],
48
+ "exclude": ["node_modules/**", "dist"]
49
+ }
@@ -0,0 +1,17 @@
1
+ import { defineConfig } from 'vite';
2
+ import react from '@vitejs/plugin-react';
3
+ import path from 'path';
4
+
5
+ // https://vitejs.dev/config/
6
+ export default defineConfig(({ mode }) => ({
7
+ server: {
8
+ host: '::',
9
+ port: 8080,
10
+ },
11
+ plugins: [react()],
12
+ resolve: {
13
+ alias: {
14
+ '@': path.resolve(__dirname, './src'),
15
+ },
16
+ },
17
+ }));
@@ -0,0 +1,369 @@
1
+ import {
2
+ commandSlice,
3
+ querySlice,
4
+ reactSlice,
5
+ flow,
6
+ createBuilders,
7
+ should,
8
+ given,
9
+ when,
10
+ specs,
11
+ gql,
12
+ source,
13
+ data,
14
+ sink,
15
+ type Command,
16
+ type Event,
17
+ type State,
18
+ registerIntegrations,
19
+ } from '@auto-engineer/flowlang';
20
+
21
+ import { AI, ProductCatalog, type DoChat, type ChatCompleted, type Products } from '../server/src/integrations';
22
+
23
+ registerIntegrations(ProductCatalog, AI);
24
+
25
+ type ShoppingCriteriaEntered = Event<
26
+ 'ShoppingCriteriaEntered',
27
+ {
28
+ sessionId: string;
29
+ criteria: string;
30
+ timestamp: Date;
31
+ }
32
+ >;
33
+
34
+ type ItemsAddedToCart = Event<
35
+ 'ItemsAddedToCart',
36
+ {
37
+ sessionId: string;
38
+ items: { productId: string; quantity: number }[];
39
+ timestamp: Date;
40
+ }
41
+ >;
42
+
43
+ type EnterShoppingCriteria = Command<
44
+ 'EnterShoppingCriteria',
45
+ {
46
+ sessionId: string;
47
+ criteria: string;
48
+ }
49
+ >;
50
+
51
+ type SuggestedItems = State<
52
+ 'SuggestedItems',
53
+ {
54
+ sessionId: string;
55
+ items: { productId: string; name: string; quantity: number; reason: string }[];
56
+ }
57
+ >;
58
+
59
+ type SuggestShoppingItems = Command<
60
+ 'SuggestShoppingItems',
61
+ {
62
+ sessionId: string;
63
+ prompt: string;
64
+ }
65
+ >;
66
+
67
+ type ShoppingItemsSuggested = Event<
68
+ 'ShoppingItemsSuggested',
69
+ {
70
+ sessionId: string;
71
+ suggestedItems: { productId: string; name: string; quantity: number; reason: string }[];
72
+ }
73
+ >;
74
+
75
+ type AddItemsToCart = Command<
76
+ 'AddItemsToCart',
77
+ {
78
+ sessionId: string;
79
+ items: { productId: string; quantity: number }[];
80
+ }
81
+ >;
82
+
83
+ const { Events, Commands, State } = createBuilders()
84
+ .events<ShoppingCriteriaEntered | ShoppingItemsSuggested | ChatCompleted | ItemsAddedToCart>()
85
+ .commands<EnterShoppingCriteria | SuggestShoppingItems | DoChat | AddItemsToCart>()
86
+ .state<{
87
+ Products: Products['data'];
88
+ SuggestedItems: SuggestedItems['data'];
89
+ }>();
90
+
91
+ flow('Seasonal Assistant', () => {
92
+ commandSlice('enters shopping criteria into assistant')
93
+ .client(() => {
94
+ specs('Assistant Chat Interface', () => {
95
+ should('allow shopper to describe their shopping needs in natural language');
96
+ should('provide a text input for entering criteria');
97
+ should('show examples of what to include (age, interests, budget)');
98
+ should('show a button to submit the criteria');
99
+ should('generate a persisted session id for a visit');
100
+ should('show the header on top of the page');
101
+ });
102
+ })
103
+ .request(gql`
104
+ mutation EnterShoppingCriteria($input: EnterShoppingCriteriaInput!) {
105
+ enterShoppingCriteria(input: $input) {
106
+ success
107
+ error {
108
+ type
109
+ message
110
+ }
111
+ }
112
+ }
113
+ `)
114
+ .server(() => {
115
+ data([sink().event('ShoppingCriteriaEntered').toStream('shopping-session-${sessionId}')]);
116
+ specs('When shopper submits criteria, a shopping session is started', () => {
117
+ when(
118
+ Commands.EnterShoppingCriteria({
119
+ sessionId: 'shopper-123',
120
+ criteria:
121
+ 'I need back-to-school items for my 7-year-old daughter who loves soccer and crafts, and my 12-year-old son who is into computers and Magic the Gathering.',
122
+ }),
123
+ ).then([
124
+ Events.ShoppingCriteriaEntered({
125
+ sessionId: 'shopper-123',
126
+ criteria:
127
+ 'I need back-to-school items for my 7-year-old daughter who loves soccer and crafts, and my 12-year-old son who is into computers and Magic the Gathering.',
128
+ timestamp: new Date(),
129
+ }),
130
+ ]);
131
+ });
132
+ });
133
+
134
+ reactSlice('creates a chat session ').server(() => {
135
+ specs('When shopping criteria are entered, request wishlist creation', () => {
136
+ when([
137
+ Events.ShoppingCriteriaEntered({
138
+ sessionId: 'session-abc',
139
+ criteria:
140
+ 'I need back-to-school items for my 7-year-old daughter who loves soccer and crafts, and my 12-year-old son who is into computers and Magic the Gathering.',
141
+ timestamp: new Date(),
142
+ }),
143
+ ]).then([
144
+ Commands.SuggestShoppingItems({
145
+ sessionId: 'session-abc',
146
+ prompt:
147
+ 'I need back-to-school items for my 7-year-old daughter who loves soccer and crafts, and my 12-year-old son who is into computers and Magic the Gathering.',
148
+ }),
149
+ ]);
150
+ });
151
+ });
152
+
153
+ commandSlice('selects items relevant to the shopping criteria ').server(() => {
154
+ data([
155
+ sink()
156
+ .command('SuggestShoppingItems')
157
+ .toIntegration(AI, 'DoChat', 'command')
158
+ .withState(source().state('Products').fromIntegration(ProductCatalog))
159
+ .additionalInstructions(
160
+ 'add the following to the DoChat: schemaName: Products, systemPrompt: use the PRODUCT_CATALOGUE_PRODUCTS MCP tool to get product data',
161
+ ),
162
+ sink().event('ShoppingItemsSuggested').toStream('shopping-session-${sessionId}'),
163
+ ]);
164
+
165
+ specs('When chat is triggered, AI suggests items based on product catalog', () => {
166
+ given([
167
+ State.Products({
168
+ products: [
169
+ {
170
+ productId: 'prod-soccer-ball',
171
+ name: 'Super Soccer Ball',
172
+ category: 'Sports',
173
+ price: 10,
174
+ tags: ['soccer', 'sports'],
175
+ imageUrl: 'https://example.com/soccer-ball.jpg',
176
+ },
177
+ {
178
+ productId: 'prod-craft-kit',
179
+ name: 'Deluxe Craft Kit',
180
+ category: 'Arts & Crafts',
181
+ price: 25,
182
+ tags: ['crafts', 'art', 'creative'],
183
+ imageUrl: 'https://example.com/craft-kit.jpg',
184
+ },
185
+ {
186
+ productId: 'prod-laptop-bag',
187
+ name: 'Tech Laptop Backpack',
188
+ category: 'School Supplies',
189
+ price: 45,
190
+ tags: ['computers', 'tech', 'school'],
191
+ imageUrl: 'https://example.com/laptop-bag.jpg',
192
+ },
193
+ {
194
+ productId: 'prod-mtg-starter',
195
+ name: 'Magic the Gathering Starter Set',
196
+ category: 'Games',
197
+ price: 30,
198
+ tags: ['magic', 'tcg', 'games'],
199
+ imageUrl: 'https://example.com/mtg-starter.jpg',
200
+ },
201
+ ],
202
+ }),
203
+ ])
204
+ .when(
205
+ Commands.SuggestShoppingItems({
206
+ sessionId: 'session-abc',
207
+ prompt:
208
+ 'I need back-to-school items for my 7-year-old daughter who loves soccer and crafts, and my 12-year-old son who is into computers and Magic the Gathering.',
209
+ }),
210
+ )
211
+ .then([
212
+ Events.ShoppingItemsSuggested({
213
+ sessionId: 'session-abc',
214
+ suggestedItems: [
215
+ {
216
+ productId: 'prod-soccer-ball',
217
+ name: 'Super Soccer Ball',
218
+ quantity: 1,
219
+ reason: 'Perfect for your daughter who loves soccer',
220
+ },
221
+ {
222
+ productId: 'prod-craft-kit',
223
+ name: 'Deluxe Craft Kit',
224
+ quantity: 1,
225
+ reason: 'Great for creative activities and crafts',
226
+ },
227
+ {
228
+ productId: 'prod-laptop-bag',
229
+ name: 'Tech Laptop Backpack',
230
+ quantity: 1,
231
+ reason: `Essential for your son's school computer needs`,
232
+ },
233
+ {
234
+ productId: 'prod-mtg-starter',
235
+ name: 'Magic the Gathering Starter Set',
236
+ quantity: 1,
237
+ reason: 'Ideal starter set for Magic the Gathering enthusiasts',
238
+ },
239
+ ],
240
+ }),
241
+ ]);
242
+ });
243
+ });
244
+
245
+ querySlice('views suggested items')
246
+ .request(gql`
247
+ query GetSuggestedItems($sessionId: ID!) {
248
+ suggestedItems(sessionId: $sessionId) {
249
+ items {
250
+ productId
251
+ name
252
+ quantity
253
+ reason
254
+ }
255
+ }
256
+ }
257
+ `)
258
+ .client(() => {
259
+ specs('Suggested Items Screen', () => {
260
+ should('display all suggested items with names and reasons');
261
+ should('show quantity selectors for each item');
262
+ should('have an "Add to Cart" button for selected items');
263
+ should('allow removing items from the suggestions');
264
+ });
265
+ })
266
+ .server(() => {
267
+ data([source().state('SuggestedItems').fromProjection('SuggestedItemsProjection', 'sessionId')]);
268
+
269
+ specs('Suggested items are available for viewing', () => {
270
+ given([
271
+ Events.ShoppingItemsSuggested({
272
+ sessionId: 'session-abc',
273
+ suggestedItems: [
274
+ {
275
+ productId: 'prod-soccer-ball',
276
+ name: 'Super Soccer Ball',
277
+ quantity: 1,
278
+ reason: 'Perfect for your daughter who loves soccer',
279
+ },
280
+ {
281
+ productId: 'prod-craft-kit',
282
+ name: 'Deluxe Craft Kit',
283
+ quantity: 1,
284
+ reason: 'Great for creative activities and crafts',
285
+ },
286
+ {
287
+ productId: 'prod-laptop-bag',
288
+ name: 'Tech Laptop Backpack',
289
+ quantity: 1,
290
+ reason: `Essential for your son's school computer needs`,
291
+ },
292
+ {
293
+ productId: 'prod-mtg-starter',
294
+ name: 'Magic the Gathering Starter Set',
295
+ quantity: 1,
296
+ reason: 'Ideal starter set for Magic the Gathering enthusiasts',
297
+ },
298
+ ],
299
+ }),
300
+ ]).then([
301
+ State.SuggestedItems({
302
+ sessionId: 'session-abc',
303
+ items: [
304
+ {
305
+ productId: 'prod-soccer-ball',
306
+ name: 'Super Soccer Ball',
307
+ quantity: 1,
308
+ reason: 'Perfect for your daughter who loves soccer',
309
+ },
310
+ {
311
+ productId: 'prod-craft-kit',
312
+ name: 'Deluxe Craft Kit',
313
+ quantity: 1,
314
+ reason: 'Great for creative activities and crafts',
315
+ },
316
+ {
317
+ productId: 'prod-laptop-bag',
318
+ name: 'Tech Laptop Backpack',
319
+ quantity: 1,
320
+ reason: `Essential for your son's school computer needs`,
321
+ },
322
+ {
323
+ productId: 'prod-mtg-starter',
324
+ name: 'Magic the Gathering Starter Set',
325
+ quantity: 1,
326
+ reason: 'Ideal starter set for Magic the Gathering enthusiasts',
327
+ },
328
+ ],
329
+ }),
330
+ ]);
331
+ });
332
+ });
333
+
334
+ commandSlice('accepts items and adds to their cart')
335
+ .client(() => {
336
+ specs('Suggested Items Screen', () => {
337
+ should('allow selecting specific items to add');
338
+ should('update quantities before adding to cart');
339
+ should('provide feedback when items are added');
340
+ });
341
+ })
342
+ .server(() => {
343
+ data([sink().event('ItemsAddedToCart').toStream('shopping-session-${sessionId}')]);
344
+ specs('When shopper accepts items, they are added to cart', () => {
345
+ when(
346
+ Commands.AddItemsToCart({
347
+ sessionId: 'session-abc',
348
+ items: [
349
+ { productId: 'prod-soccer-ball', quantity: 1 },
350
+ { productId: 'prod-craft-kit', quantity: 1 },
351
+ { productId: 'prod-laptop-bag', quantity: 1 },
352
+ { productId: 'prod-mtg-starter', quantity: 1 },
353
+ ],
354
+ }),
355
+ ).then([
356
+ Events.ItemsAddedToCart({
357
+ sessionId: 'session-abc',
358
+ items: [
359
+ { productId: 'prod-soccer-ball', quantity: 1 },
360
+ { productId: 'prod-craft-kit', quantity: 1 },
361
+ { productId: 'prod-laptop-bag', quantity: 1 },
362
+ { productId: 'prod-mtg-starter', quantity: 1 },
363
+ ],
364
+ timestamp: new Date(),
365
+ }),
366
+ ]);
367
+ });
368
+ });
369
+ });
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "shopping-assistant",
3
+ "type": "module",
4
+ "scripts": {
5
+ "start": "dotenv -e .env -- pnpm --parallel start",
6
+ "build": "pnpm --parallel build"
7
+ },
8
+ "dependencies": {
9
+ "@auto-engineer/message-bus": "latest",
10
+ "@auto-engineer/backend-checks": "latest",
11
+ "@auto-engineer/design-system-importer": "latest",
12
+ "@auto-engineer/emmett-generator": "latest",
13
+ "@auto-engineer/flowlang": "latest",
14
+ "@auto-engineer/frontend-checks": "latest",
15
+ "@auto-engineer/frontend-implementation": "latest",
16
+ "@auto-engineer/information-architect": "latest",
17
+ "@auto-engineer/react-graphql-generator": "latest",
18
+ "@auto-engineer/server-implementer": "latest"
19
+ },
20
+ "devDependencies": {
21
+ "dotenv": "^16.4.5",
22
+ "dotenv-cli": "^9.0.0",
23
+ "tsx": "^3.12.7"
24
+ }
25
+ }
@@ -0,0 +1,2 @@
1
+ packages:
2
+ - '*'
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "generated-server",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "start": "tsx --no-deprecation src/server.ts",
8
+ "type-check": "tsc --noEmit",
9
+ "test": "vitest run",
10
+ "dev": "tsx --no-deprecation src/server.ts"
11
+ },
12
+ "dependencies": {
13
+ "@auto-engineer/ai-gateway": "latest",
14
+ "@auto-engineer/flowlang": "latest",
15
+ "axios": "^1.11.0",
16
+ "@event-driven-io/emmett": "^0.38.2",
17
+ "type-graphql": "^2.0.0-rc.2",
18
+ "graphql": "^16.11.0",
19
+ "fast-glob": "^3.3.3",
20
+ "reflect-metadata": "^0.2.2",
21
+ "apollo-server": "^3.13.0",
22
+ "uuid": "^10.0.0"
23
+ },
24
+ "devDependencies": {}
25
+ }
@@ -0,0 +1,31 @@
1
+ import 'reflect-metadata';
2
+ import { buildSchema } from 'type-graphql';
3
+ import { printSchema } from 'graphql';
4
+ import { writeFile } from 'fs/promises';
5
+ import * as path from 'path';
6
+ import { loadResolvers } from '../src/utils/loadResolvers.js';
7
+
8
+ async function main() {
9
+ try {
10
+ const resolvers = await loadResolvers('src/domain/flows/**/*.resolver.{ts,js}');
11
+ const schema = await buildSchema({
12
+ resolvers: resolvers as any,
13
+ emitSchemaFile: false,
14
+ });
15
+ const printedSchema = printSchema(schema);
16
+
17
+ const contextDir = path.resolve('/Users/sam/WebstormProjects/top/my-shop', '.context');
18
+ const schemaPath = path.join(contextDir, 'schema.graphql');
19
+ await writeFile(schemaPath, printedSchema, 'utf-8');
20
+
21
+ console.log(`✅ GraphQL schema generated at: ${schemaPath}`);
22
+ } catch (error) {
23
+ console.error(`❌ GraphQL schema generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
24
+ process.exit(1);
25
+ }
26
+ }
27
+
28
+ main().catch((err) => {
29
+ console.error(err);
30
+ process.exit(1);
31
+ });
@@ -0,0 +1,8 @@
1
+ import { Command } from "@event-driven-io/emmett";
2
+ export type AddItemsToCart = Command<
3
+ "AddItemsToCart",
4
+ {
5
+ sessionId: string;
6
+ items: Array<{ productId: string; quantity: number }>;
7
+ }
8
+ >;
@@ -0,0 +1,46 @@
1
+ import { describe, it } from "vitest";
2
+ import { DeciderSpecification } from "@event-driven-io/emmett";
3
+ import { decide } from "./decide";
4
+ import { evolve } from "./evolve";
5
+ import { initialState } from "./state";
6
+
7
+ describe("Seasonal Assistant | accepts items and adds to their cart", () => {
8
+ const given = DeciderSpecification.for({
9
+ decide,
10
+ evolve,
11
+ initialState,
12
+ });
13
+
14
+ it("should emit ItemsAddedToCart for valid AddItemsToCart", () => {
15
+ given([])
16
+ .when({
17
+ type: "AddItemsToCart",
18
+ data: {
19
+ sessionId: "session-abc",
20
+ items: [
21
+ { productId: "prod-soccer-ball", quantity: 1 },
22
+ { productId: "prod-craft-kit", quantity: 1 },
23
+ { productId: "prod-laptop-bag", quantity: 1 },
24
+ { productId: "prod-mtg-starter", quantity: 1 },
25
+ ],
26
+ },
27
+ metadata: { now: new Date() },
28
+ })
29
+
30
+ .then([
31
+ {
32
+ type: "ItemsAddedToCart",
33
+ data: {
34
+ sessionId: "session-abc",
35
+ items: [
36
+ { productId: "prod-soccer-ball", quantity: 1 },
37
+ { productId: "prod-craft-kit", quantity: 1 },
38
+ { productId: "prod-laptop-bag", quantity: 1 },
39
+ { productId: "prod-mtg-starter", quantity: 1 },
40
+ ],
41
+ timestamp: new Date("2025-08-28T04:56:47.409Z"),
42
+ },
43
+ },
44
+ ]);
45
+ });
46
+ });