popeye-cli 1.5.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +184 -31
  3. package/dist/cli/commands/create.d.ts.map +1 -1
  4. package/dist/cli/commands/create.js +54 -4
  5. package/dist/cli/commands/create.js.map +1 -1
  6. package/dist/cli/interactive.d.ts +29 -0
  7. package/dist/cli/interactive.d.ts.map +1 -1
  8. package/dist/cli/interactive.js +90 -7
  9. package/dist/cli/interactive.js.map +1 -1
  10. package/dist/generators/all.d.ts +4 -1
  11. package/dist/generators/all.d.ts.map +1 -1
  12. package/dist/generators/all.js +36 -316
  13. package/dist/generators/all.js.map +1 -1
  14. package/dist/generators/doc-parser.d.ts +18 -3
  15. package/dist/generators/doc-parser.d.ts.map +1 -1
  16. package/dist/generators/doc-parser.js +81 -10
  17. package/dist/generators/doc-parser.js.map +1 -1
  18. package/dist/generators/frontend-design-analyzer.d.ts +30 -0
  19. package/dist/generators/frontend-design-analyzer.d.ts.map +1 -0
  20. package/dist/generators/frontend-design-analyzer.js +208 -0
  21. package/dist/generators/frontend-design-analyzer.js.map +1 -0
  22. package/dist/generators/shared-packages.d.ts +45 -0
  23. package/dist/generators/shared-packages.d.ts.map +1 -0
  24. package/dist/generators/shared-packages.js +456 -0
  25. package/dist/generators/shared-packages.js.map +1 -0
  26. package/dist/generators/templates/index.d.ts +4 -0
  27. package/dist/generators/templates/index.d.ts.map +1 -1
  28. package/dist/generators/templates/index.js +4 -0
  29. package/dist/generators/templates/index.js.map +1 -1
  30. package/dist/generators/templates/website-components.d.ts.map +1 -1
  31. package/dist/generators/templates/website-components.js +36 -11
  32. package/dist/generators/templates/website-components.js.map +1 -1
  33. package/dist/generators/templates/website-config.d.ts +15 -1
  34. package/dist/generators/templates/website-config.d.ts.map +1 -1
  35. package/dist/generators/templates/website-config.js +155 -13
  36. package/dist/generators/templates/website-config.js.map +1 -1
  37. package/dist/generators/templates/website-landing.d.ts +24 -0
  38. package/dist/generators/templates/website-landing.d.ts.map +1 -0
  39. package/dist/generators/templates/website-landing.js +276 -0
  40. package/dist/generators/templates/website-landing.js.map +1 -0
  41. package/dist/generators/templates/website-layout.d.ts +42 -0
  42. package/dist/generators/templates/website-layout.d.ts.map +1 -0
  43. package/dist/generators/templates/website-layout.js +408 -0
  44. package/dist/generators/templates/website-layout.js.map +1 -0
  45. package/dist/generators/templates/website-pricing.d.ts +11 -0
  46. package/dist/generators/templates/website-pricing.d.ts.map +1 -0
  47. package/dist/generators/templates/website-pricing.js +313 -0
  48. package/dist/generators/templates/website-pricing.js.map +1 -0
  49. package/dist/generators/templates/website-sections.d.ts +102 -0
  50. package/dist/generators/templates/website-sections.d.ts.map +1 -0
  51. package/dist/generators/templates/website-sections.js +444 -0
  52. package/dist/generators/templates/website-sections.js.map +1 -0
  53. package/dist/generators/templates/website.d.ts +10 -50
  54. package/dist/generators/templates/website.d.ts.map +1 -1
  55. package/dist/generators/templates/website.js +12 -788
  56. package/dist/generators/templates/website.js.map +1 -1
  57. package/dist/generators/website-content-scanner.d.ts +37 -0
  58. package/dist/generators/website-content-scanner.d.ts.map +1 -0
  59. package/dist/generators/website-content-scanner.js +165 -0
  60. package/dist/generators/website-content-scanner.js.map +1 -0
  61. package/dist/generators/website-context.d.ts +38 -2
  62. package/dist/generators/website-context.d.ts.map +1 -1
  63. package/dist/generators/website-context.js +179 -19
  64. package/dist/generators/website-context.js.map +1 -1
  65. package/dist/generators/website-debug.d.ts +68 -0
  66. package/dist/generators/website-debug.d.ts.map +1 -0
  67. package/dist/generators/website-debug.js +93 -0
  68. package/dist/generators/website-debug.js.map +1 -0
  69. package/dist/generators/website.d.ts +2 -0
  70. package/dist/generators/website.d.ts.map +1 -1
  71. package/dist/generators/website.js +66 -4
  72. package/dist/generators/website.js.map +1 -1
  73. package/dist/generators/workspace-root.d.ts +27 -0
  74. package/dist/generators/workspace-root.d.ts.map +1 -0
  75. package/dist/generators/workspace-root.js +100 -0
  76. package/dist/generators/workspace-root.js.map +1 -0
  77. package/dist/state/index.d.ts +8 -0
  78. package/dist/state/index.d.ts.map +1 -1
  79. package/dist/state/index.js +11 -0
  80. package/dist/state/index.js.map +1 -1
  81. package/dist/types/consensus.d.ts +3 -0
  82. package/dist/types/consensus.d.ts.map +1 -1
  83. package/dist/types/consensus.js +1 -0
  84. package/dist/types/consensus.js.map +1 -1
  85. package/dist/types/index.d.ts +1 -0
  86. package/dist/types/index.d.ts.map +1 -1
  87. package/dist/types/index.js +2 -0
  88. package/dist/types/index.js.map +1 -1
  89. package/dist/types/tester.d.ts +138 -0
  90. package/dist/types/tester.d.ts.map +1 -0
  91. package/dist/types/tester.js +110 -0
  92. package/dist/types/tester.js.map +1 -0
  93. package/dist/types/workflow.d.ts +151 -0
  94. package/dist/types/workflow.d.ts.map +1 -1
  95. package/dist/types/workflow.js +14 -0
  96. package/dist/types/workflow.js.map +1 -1
  97. package/dist/upgrade/handlers.d.ts +15 -0
  98. package/dist/upgrade/handlers.d.ts.map +1 -1
  99. package/dist/upgrade/handlers.js +52 -0
  100. package/dist/upgrade/handlers.js.map +1 -1
  101. package/dist/workflow/auto-fix-bundler.d.ts +37 -0
  102. package/dist/workflow/auto-fix-bundler.d.ts.map +1 -0
  103. package/dist/workflow/auto-fix-bundler.js +320 -0
  104. package/dist/workflow/auto-fix-bundler.js.map +1 -0
  105. package/dist/workflow/auto-fix.d.ts.map +1 -1
  106. package/dist/workflow/auto-fix.js +10 -3
  107. package/dist/workflow/auto-fix.js.map +1 -1
  108. package/dist/workflow/execution-mode.js +2 -2
  109. package/dist/workflow/execution-mode.js.map +1 -1
  110. package/dist/workflow/index.d.ts +2 -0
  111. package/dist/workflow/index.d.ts.map +1 -1
  112. package/dist/workflow/index.js +13 -0
  113. package/dist/workflow/index.js.map +1 -1
  114. package/dist/workflow/overview.d.ts.map +1 -1
  115. package/dist/workflow/overview.js +4 -0
  116. package/dist/workflow/overview.js.map +1 -1
  117. package/dist/workflow/plan-mode.d.ts +4 -3
  118. package/dist/workflow/plan-mode.d.ts.map +1 -1
  119. package/dist/workflow/plan-mode.js +69 -5
  120. package/dist/workflow/plan-mode.js.map +1 -1
  121. package/dist/workflow/task-workflow.d.ts +5 -0
  122. package/dist/workflow/task-workflow.d.ts.map +1 -1
  123. package/dist/workflow/task-workflow.js +172 -6
  124. package/dist/workflow/task-workflow.js.map +1 -1
  125. package/dist/workflow/tester.d.ts +120 -0
  126. package/dist/workflow/tester.d.ts.map +1 -0
  127. package/dist/workflow/tester.js +589 -0
  128. package/dist/workflow/tester.js.map +1 -0
  129. package/dist/workflow/website-strategy.d.ts +9 -0
  130. package/dist/workflow/website-strategy.d.ts.map +1 -1
  131. package/dist/workflow/website-strategy.js +73 -1
  132. package/dist/workflow/website-strategy.js.map +1 -1
  133. package/dist/workflow/website-updater.d.ts.map +1 -1
  134. package/dist/workflow/website-updater.js +15 -4
  135. package/dist/workflow/website-updater.js.map +1 -1
  136. package/dist/workflow/workflow-logger.d.ts +1 -1
  137. package/dist/workflow/workflow-logger.d.ts.map +1 -1
  138. package/dist/workflow/workflow-logger.js.map +1 -1
  139. package/package.json +1 -1
  140. package/src/cli/commands/create.ts +58 -4
  141. package/src/cli/interactive.ts +96 -7
  142. package/src/generators/all.ts +44 -332
  143. package/src/generators/doc-parser.ts +87 -10
  144. package/src/generators/frontend-design-analyzer.ts +261 -0
  145. package/src/generators/shared-packages.ts +500 -0
  146. package/src/generators/templates/index.ts +4 -0
  147. package/src/generators/templates/website-components.ts +36 -11
  148. package/src/generators/templates/website-config.ts +166 -13
  149. package/src/generators/templates/website-landing.ts +331 -0
  150. package/src/generators/templates/website-layout.ts +443 -0
  151. package/src/generators/templates/website-pricing.ts +330 -0
  152. package/src/generators/templates/website-sections.ts +541 -0
  153. package/src/generators/templates/website.ts +38 -851
  154. package/src/generators/website-content-scanner.ts +208 -0
  155. package/src/generators/website-context.ts +248 -20
  156. package/src/generators/website-debug.ts +130 -0
  157. package/src/generators/website.ts +71 -3
  158. package/src/generators/workspace-root.ts +113 -0
  159. package/src/state/index.ts +15 -0
  160. package/src/types/consensus.ts +3 -0
  161. package/src/types/index.ts +21 -0
  162. package/src/types/tester.ts +136 -0
  163. package/src/types/workflow.ts +32 -0
  164. package/src/upgrade/handlers.ts +65 -0
  165. package/src/workflow/auto-fix-bundler.ts +392 -0
  166. package/src/workflow/auto-fix.ts +11 -3
  167. package/src/workflow/execution-mode.ts +2 -2
  168. package/src/workflow/index.ts +13 -0
  169. package/src/workflow/overview.ts +6 -0
  170. package/src/workflow/plan-mode.ts +81 -7
  171. package/src/workflow/task-workflow.ts +227 -5
  172. package/src/workflow/tester.ts +723 -0
  173. package/src/workflow/website-strategy.ts +75 -1
  174. package/src/workflow/website-updater.ts +17 -6
  175. package/src/workflow/workflow-logger.ts +2 -0
  176. package/tests/cli/project-naming.test.ts +136 -0
  177. package/tests/generators/doc-parser.test.ts +121 -0
  178. package/tests/generators/frontend-design-analyzer.test.ts +90 -0
  179. package/tests/generators/quality-gate.test.ts +183 -0
  180. package/tests/generators/shared-packages.test.ts +83 -0
  181. package/tests/generators/website-components.test.ts +1 -1
  182. package/tests/generators/website-config.test.ts +84 -0
  183. package/tests/generators/website-content-scanner.test.ts +181 -0
  184. package/tests/generators/website-context.test.ts +109 -0
  185. package/tests/generators/website-debug.test.ts +77 -0
  186. package/tests/generators/website-landing.test.ts +188 -0
  187. package/tests/generators/website-pricing.test.ts +98 -0
  188. package/tests/generators/website-sections.test.ts +245 -0
  189. package/tests/generators/workspace-root.test.ts +105 -0
  190. package/tests/types/tester.test.ts +174 -0
  191. package/tests/upgrade/handlers.test.ts +162 -0
  192. package/tests/workflow/auto-fix-bundler.test.ts +242 -0
  193. package/tests/workflow/plan-mode.test.ts +111 -1
  194. package/tests/workflow/tester.test.ts +401 -0
  195. package/tests/workflow/website-strategy.test.ts +55 -0
@@ -6,6 +6,8 @@ import { promises as fs } from 'node:fs';
6
6
  import path from 'node:path';
7
7
  import { generateFullstackProject } from './fullstack.js';
8
8
  import { generateWebsiteProject } from './website.js';
9
+ import { buildWebsiteContext, validateWebsiteContext } from './website-context.js';
10
+ import { generateDesignTokensPackage as generateDesignTokensPackageImpl, generateUiPackage as generateUiPackageImpl, } from './shared-packages.js';
9
11
  /**
10
12
  * Create a directory if it doesn't exist
11
13
  */
@@ -310,325 +312,17 @@ Generated by [Popeye CLI](https://github.com/popeye-cli/popeye)
310
312
  }
311
313
  /**
312
314
  * Generate design tokens package
315
+ * Delegates to shared-packages.ts with optional brand color passthrough
313
316
  */
314
- export function generateDesignTokensPackage(projectName) {
315
- return {
316
- files: [
317
- {
318
- path: 'package.json',
319
- content: JSON.stringify({
320
- name: `@${projectName}/design-tokens`,
321
- version: '1.0.0',
322
- type: 'module',
323
- main: './dist/index.js',
324
- types: './dist/index.d.ts',
325
- exports: {
326
- '.': './dist/index.js',
327
- './tailwind': './dist/tailwind-preset.js',
328
- },
329
- scripts: {
330
- build: 'tsc',
331
- dev: 'tsc --watch',
332
- },
333
- devDependencies: {
334
- typescript: '^5.3.3',
335
- },
336
- }, null, 2),
337
- },
338
- {
339
- path: 'tsconfig.json',
340
- content: JSON.stringify({
341
- compilerOptions: {
342
- target: 'ES2020',
343
- module: 'ESNext',
344
- moduleResolution: 'bundler',
345
- declaration: true,
346
- outDir: './dist',
347
- strict: true,
348
- esModuleInterop: true,
349
- skipLibCheck: true,
350
- },
351
- include: ['src'],
352
- }, null, 2),
353
- },
354
- {
355
- path: 'src/index.ts',
356
- content: `/**
357
- * Design tokens for ${projectName}
358
- */
359
-
360
- export * from './colors.js';
361
- export * from './typography.js';
362
- `,
363
- },
364
- {
365
- path: 'src/colors.ts',
366
- content: `/**
367
- * Color palette
368
- */
369
-
370
- export const colors = {
371
- primary: {
372
- 50: '#f0f9ff',
373
- 100: '#e0f2fe',
374
- 200: '#bae6fd',
375
- 300: '#7dd3fc',
376
- 400: '#38bdf8',
377
- 500: '#0ea5e9',
378
- 600: '#0284c7',
379
- 700: '#0369a1',
380
- 800: '#075985',
381
- 900: '#0c4a6e',
382
- },
383
- secondary: {
384
- 50: '#f8fafc',
385
- 100: '#f1f5f9',
386
- 200: '#e2e8f0',
387
- 300: '#cbd5e1',
388
- 400: '#94a3b8',
389
- 500: '#64748b',
390
- 600: '#475569',
391
- 700: '#334155',
392
- 800: '#1e293b',
393
- 900: '#0f172a',
394
- },
395
- } as const;
396
-
397
- export type ColorScale = typeof colors.primary;
398
- export type Colors = typeof colors;
399
- `,
400
- },
401
- {
402
- path: 'src/typography.ts',
403
- content: `/**
404
- * Typography settings
405
- */
406
-
407
- export const typography = {
408
- fontFamily: {
409
- sans: ['Inter', 'system-ui', 'sans-serif'],
410
- mono: ['JetBrains Mono', 'Fira Code', 'monospace'],
411
- },
412
- fontSize: {
413
- xs: ['0.75rem', { lineHeight: '1rem' }],
414
- sm: ['0.875rem', { lineHeight: '1.25rem' }],
415
- base: ['1rem', { lineHeight: '1.5rem' }],
416
- lg: ['1.125rem', { lineHeight: '1.75rem' }],
417
- xl: ['1.25rem', { lineHeight: '1.75rem' }],
418
- '2xl': ['1.5rem', { lineHeight: '2rem' }],
419
- '3xl': ['1.875rem', { lineHeight: '2.25rem' }],
420
- '4xl': ['2.25rem', { lineHeight: '2.5rem' }],
421
- '5xl': ['3rem', { lineHeight: '1' }],
422
- '6xl': ['3.75rem', { lineHeight: '1' }],
423
- },
424
- } as const;
425
-
426
- export type Typography = typeof typography;
427
- `,
428
- },
429
- {
430
- path: 'src/tailwind-preset.ts',
431
- content: `/**
432
- * Tailwind CSS preset with design tokens
433
- */
434
-
435
- import { colors } from './colors.js';
436
- import { typography } from './typography.js';
437
-
438
- export const preset = {
439
- theme: {
440
- extend: {
441
- colors,
442
- fontFamily: typography.fontFamily,
443
- fontSize: typography.fontSize,
444
- },
445
- },
446
- };
447
-
448
- export default preset;
449
- `,
450
- },
451
- ],
452
- };
317
+ export function generateDesignTokensPackage(projectName, brandColors) {
318
+ return generateDesignTokensPackageImpl(projectName, brandColors);
453
319
  }
454
320
  /**
455
321
  * Generate UI components package
322
+ * Delegates to shared-packages.ts
456
323
  */
457
324
  export function generateUiPackage(projectName) {
458
- return {
459
- files: [
460
- {
461
- path: 'package.json',
462
- content: JSON.stringify({
463
- name: `@${projectName}/ui`,
464
- version: '1.0.0',
465
- type: 'module',
466
- main: './dist/index.js',
467
- types: './dist/index.d.ts',
468
- exports: {
469
- '.': './dist/index.js',
470
- './button': './dist/button.js',
471
- './card': './dist/card.js',
472
- },
473
- scripts: {
474
- build: 'tsc',
475
- dev: 'tsc --watch',
476
- },
477
- dependencies: {
478
- clsx: '^2.1.0',
479
- 'tailwind-merge': '^2.2.0',
480
- },
481
- peerDependencies: {
482
- react: '>=18.0.0',
483
- 'react-dom': '>=18.0.0',
484
- },
485
- devDependencies: {
486
- '@types/react': '^18.2.0',
487
- '@types/react-dom': '^18.2.0',
488
- typescript: '^5.3.3',
489
- },
490
- }, null, 2),
491
- },
492
- {
493
- path: 'tsconfig.json',
494
- content: JSON.stringify({
495
- compilerOptions: {
496
- target: 'ES2020',
497
- module: 'ESNext',
498
- moduleResolution: 'bundler',
499
- declaration: true,
500
- outDir: './dist',
501
- strict: true,
502
- esModuleInterop: true,
503
- skipLibCheck: true,
504
- jsx: 'react-jsx',
505
- },
506
- include: ['src'],
507
- }, null, 2),
508
- },
509
- {
510
- path: 'src/index.ts',
511
- content: `/**
512
- * Shared UI components for ${projectName}
513
- */
514
-
515
- export * from './button.js';
516
- export * from './card.js';
517
- export * from './utils.js';
518
- `,
519
- },
520
- {
521
- path: 'src/utils.ts',
522
- content: `import { clsx, type ClassValue } from 'clsx';
523
- import { twMerge } from 'tailwind-merge';
524
-
525
- export function cn(...inputs: ClassValue[]) {
526
- return twMerge(clsx(inputs));
527
- }
528
- `,
529
- },
530
- {
531
- path: 'src/button.tsx',
532
- content: `import * as React from 'react';
533
- import { cn } from './utils.js';
534
-
535
- export interface ButtonProps
536
- extends React.ButtonHTMLAttributes<HTMLButtonElement> {
537
- variant?: 'primary' | 'secondary' | 'outline' | 'ghost';
538
- size?: 'sm' | 'md' | 'lg';
539
- }
540
-
541
- export const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
542
- ({ className, variant = 'primary', size = 'md', ...props }, ref) => {
543
- return (
544
- <button
545
- className={cn(
546
- 'inline-flex items-center justify-center rounded-md font-medium transition-colors',
547
- 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2',
548
- 'disabled:pointer-events-none disabled:opacity-50',
549
- {
550
- // Variants
551
- 'bg-primary-600 text-white hover:bg-primary-500': variant === 'primary',
552
- 'bg-secondary-100 text-secondary-900 hover:bg-secondary-200': variant === 'secondary',
553
- 'border border-secondary-300 bg-transparent hover:bg-secondary-50': variant === 'outline',
554
- 'bg-transparent hover:bg-secondary-100': variant === 'ghost',
555
- // Sizes
556
- 'h-8 px-3 text-sm': size === 'sm',
557
- 'h-10 px-4 text-sm': size === 'md',
558
- 'h-12 px-6 text-base': size === 'lg',
559
- },
560
- className
561
- )}
562
- ref={ref}
563
- {...props}
564
- />
565
- );
566
- }
567
- );
568
-
569
- Button.displayName = 'Button';
570
- `,
571
- },
572
- {
573
- path: 'src/card.tsx',
574
- content: `import * as React from 'react';
575
- import { cn } from './utils.js';
576
-
577
- export interface CardProps extends React.HTMLAttributes<HTMLDivElement> {}
578
-
579
- export const Card = React.forwardRef<HTMLDivElement, CardProps>(
580
- ({ className, ...props }, ref) => (
581
- <div
582
- ref={ref}
583
- className={cn(
584
- 'rounded-lg border border-secondary-200 bg-white shadow-sm',
585
- className
586
- )}
587
- {...props}
588
- />
589
- )
590
- );
591
-
592
- Card.displayName = 'Card';
593
-
594
- export const CardHeader = React.forwardRef<
595
- HTMLDivElement,
596
- React.HTMLAttributes<HTMLDivElement>
597
- >(({ className, ...props }, ref) => (
598
- <div
599
- ref={ref}
600
- className={cn('flex flex-col space-y-1.5 p-6', className)}
601
- {...props}
602
- />
603
- ));
604
-
605
- CardHeader.displayName = 'CardHeader';
606
-
607
- export const CardTitle = React.forwardRef<
608
- HTMLParagraphElement,
609
- React.HTMLAttributes<HTMLHeadingElement>
610
- >(({ className, ...props }, ref) => (
611
- <h3
612
- ref={ref}
613
- className={cn('text-lg font-semibold leading-none tracking-tight', className)}
614
- {...props}
615
- />
616
- ));
617
-
618
- CardTitle.displayName = 'CardTitle';
619
-
620
- export const CardContent = React.forwardRef<
621
- HTMLDivElement,
622
- React.HTMLAttributes<HTMLDivElement>
623
- >(({ className, ...props }, ref) => (
624
- <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />
625
- ));
626
-
627
- CardContent.displayName = 'CardContent';
628
- `,
629
- },
630
- ],
631
- };
325
+ return generateUiPackageImpl(projectName);
632
326
  }
633
327
  /**
634
328
  * Generate a complete "all" project (FE + BE + Website)
@@ -649,6 +343,29 @@ export async function generateAllProject(spec, outputDir, options = {}) {
649
343
  await ensureDir(path.join(projectDir, 'packages', 'ui', 'src'));
650
344
  await ensureDir(path.join(projectDir, 'packages', 'contracts'));
651
345
  await ensureDir(path.join(projectDir, '.popeye'));
346
+ // Auto-build content context if not provided
347
+ let contentContext = options.contentContext;
348
+ let contextWarning;
349
+ if (!contentContext) {
350
+ try {
351
+ contentContext = await buildWebsiteContext(projectDir, projectName);
352
+ }
353
+ catch (e) {
354
+ contextWarning = e instanceof Error ? e.message : 'Unknown error building website context';
355
+ // Proceed with defaults, but warning is logged below
356
+ }
357
+ }
358
+ if (contextWarning) {
359
+ // Log warning so user sees it, but don't block generation
360
+ console.warn(`[website-context] Warning: ${contextWarning}`);
361
+ }
362
+ // Soft validation: log quality issues without blocking monorepo generation
363
+ if (contentContext) {
364
+ const validation = validateWebsiteContext(contentContext, projectName);
365
+ for (const issue of [...validation.issues, ...validation.warnings]) {
366
+ console.warn(`[website-context] ${issue}`);
367
+ }
368
+ }
652
369
  // Generate fullstack first (creates apps/frontend and apps/backend)
653
370
  const fullstackResult = await generateFullstackProject(spec, outputDir);
654
371
  if (!fullstackResult.success) {
@@ -661,7 +378,7 @@ export async function generateAllProject(spec, outputDir, options = {}) {
661
378
  workspaceMode: true,
662
379
  skipDocker: false, // Website needs its own Dockerfile
663
380
  skipReadme: false,
664
- contentContext: options.contentContext,
381
+ contentContext: contentContext,
665
382
  });
666
383
  if (!websiteResult.success) {
667
384
  return {
@@ -670,8 +387,11 @@ export async function generateAllProject(spec, outputDir, options = {}) {
670
387
  };
671
388
  }
672
389
  filesCreated.push(...websiteResult.filesCreated);
673
- // Generate shared packages
674
- const designTokens = generateDesignTokensPackage(projectName);
390
+ // Generate shared packages (pass brand colors if available)
391
+ const brandColors = contentContext?.brand?.primaryColor
392
+ ? { primaryColor: contentContext.brand.primaryColor }
393
+ : undefined;
394
+ const designTokens = generateDesignTokensPackage(projectName, brandColors);
675
395
  for (const file of designTokens.files) {
676
396
  const filePath = path.join(projectDir, 'packages', 'design-tokens', file.path);
677
397
  await ensureDir(path.dirname(filePath));
@@ -1 +1 @@
1
- {"version":3,"file":"all.js","sourceRoot":"","sources":["../../src/generators/all.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AActD;;GAEG;AACH,KAAK,UAAU,SAAS,CAAC,OAAe;IACtC,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAe;IACxD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,WAAmB;IAC1D,MAAM,WAAW,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAErD,MAAM,MAAM,GAAoB;QAC9B,OAAO,EAAE,KAAK;QACd,IAAI,EAAE;YACJ,QAAQ,EAAE;gBACR,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,eAAe;gBACrB,QAAQ,EAAE,YAAY;gBACtB,QAAQ,EAAE;oBACR,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,cAAc;oBACpB,KAAK,EAAE,eAAe;oBACtB,GAAG,EAAE,aAAa;oBAClB,SAAS,EAAE,mBAAmB;iBAC/B;gBACD,MAAM,EAAE;oBACN,UAAU,EAAE,0BAA0B;oBACtC,SAAS,EAAE,GAAG,WAAW,WAAW;oBACpC,OAAO,EAAE,eAAe;iBACzB;gBACD,SAAS,EAAE,CAAC,wBAAwB,EAAE,aAAa,CAAC;gBACpD,YAAY,EAAE,CAAC,mBAAmB,CAAC;gBACnC,MAAM,EAAE,sBAAsB;aAC/B;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,cAAc;gBACpB,QAAQ,EAAE,QAAQ;gBAClB,QAAQ,EAAE;oBACR,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,cAAc;oBACpB,KAAK,EAAE,kBAAkB;oBACzB,GAAG,EAAE,eAAe,WAAW,gCAAgC;iBAChE;gBACD,MAAM,EAAE;oBACN,UAAU,EAAE,yBAAyB;oBACrC,SAAS,EAAE,GAAG,WAAW,UAAU;oBACnC,OAAO,EAAE,cAAc;iBACxB;gBACD,YAAY,EAAE,CAAC,kBAAkB,CAAC;aACnC;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,cAAc;gBACpB,QAAQ,EAAE,YAAY;gBACtB,QAAQ,EAAE;oBACR,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,cAAc;oBACpB,KAAK,EAAE,eAAe;oBACtB,GAAG,EAAE,aAAa;oBAClB,SAAS,EAAE,mBAAmB;iBAC/B;gBACD,MAAM,EAAE;oBACN,UAAU,EAAE,yBAAyB;oBACrC,SAAS,EAAE,GAAG,WAAW,UAAU;oBACnC,OAAO,EAAE,cAAc;iBACxB;gBACD,SAAS,EAAE,CAAC,wBAAwB,CAAC;gBACrC,YAAY,EAAE,CAAC,kBAAkB,CAAC;aACnC;SACF;QACD,MAAM,EAAE;YACN,SAAS,EAAE,oBAAoB;YAC/B,EAAE,EAAE,aAAa;YACjB,YAAY,EAAE,wBAAwB;SACvC;QACD,QAAQ,EAAE;YACR,OAAO,EAAE,qEAAqE;YAC9E,OAAO,EAAE,2EAA2E;YACpF,QAAQ,EACN,oHAAoH;YACtH,MAAM,EACJ,yGAAyG;SAC5G;QACD,MAAM,EAAE;YACN,WAAW,EAAE,iCAAiC;YAC9C,kBAAkB,EAAE,IAAI;SACzB;KACF,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,WAAmB;IACzD,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,IAAI,EAAE,IAAI,WAAW,OAAO;QAC5B,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC;QACpC,OAAO,EAAE;YACP,GAAG,EAAE,2EAA2E;YAChF,SAAS,EACP,yGAAyG;YAC3G,KAAK,EACH,oHAAoH;YACtH,IAAI,EAAE,wCAAwC;YAC9C,UAAU,EAAE,qEAAqE;YACjF,IAAI,EAAE,wCAAwC;YAC9C,UAAU,EAAE,2EAA2E;YACvF,SAAS,EAAE,6CAA6C;SACzD;QACD,eAAe,EAAE;YACf,YAAY,EAAE,QAAQ;SACvB;QACD,OAAO,EAAE;YACP,IAAI,EAAE,UAAU;SACjB;KACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,WAAmB;IAC1D,OAAO;;;;;;;;;;;;;;UAcC,WAAW;;;;;;;;;;;;;;;UAeX,WAAW;;;;;;;;;;;;UAYX,WAAW;;;IAGjB,WAAW;;;;;CAKd,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,WAAmB,EAAE,IAAY;IAC9D,MAAM,KAAK,GAAG,WAAW;SACtB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAClD,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,OAAO,KAAK,KAAK;;EAEjB,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+EJ,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BZ,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,WAAmB;IAG7D,OAAO;QACL,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,IAAI,CAAC,SAAS,CACrB;oBACE,IAAI,EAAE,IAAI,WAAW,gBAAgB;oBACrC,OAAO,EAAE,OAAO;oBAChB,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,iBAAiB;oBACvB,KAAK,EAAE,mBAAmB;oBAC1B,OAAO,EAAE;wBACP,GAAG,EAAE,iBAAiB;wBACtB,YAAY,EAAE,2BAA2B;qBAC1C;oBACD,OAAO,EAAE;wBACP,KAAK,EAAE,KAAK;wBACZ,GAAG,EAAE,aAAa;qBACnB;oBACD,eAAe,EAAE;wBACf,UAAU,EAAE,QAAQ;qBACrB;iBACF,EACD,IAAI,EACJ,CAAC,CACF;aACF;YACD;gBACE,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,IAAI,CAAC,SAAS,CACrB;oBACE,eAAe,EAAE;wBACf,MAAM,EAAE,QAAQ;wBAChB,MAAM,EAAE,QAAQ;wBAChB,gBAAgB,EAAE,SAAS;wBAC3B,WAAW,EAAE,IAAI;wBACjB,MAAM,EAAE,QAAQ;wBAChB,MAAM,EAAE,IAAI;wBACZ,eAAe,EAAE,IAAI;wBACrB,YAAY,EAAE,IAAI;qBACnB;oBACD,OAAO,EAAE,CAAC,KAAK,CAAC;iBACjB,EACD,IAAI,EACJ,CAAC,CACF;aACF;YACD;gBACE,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE;uBACM,WAAW;;;;;CAKjC;aACM;YACD;gBACE,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiChB;aACM;YACD;gBACE,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;CAwBhB;aACM;YACD;gBACE,IAAI,EAAE,wBAAwB;gBAC9B,OAAO,EAAE;;;;;;;;;;;;;;;;;;CAkBhB;aACM;SACF;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IAGnD,OAAO;QACL,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,IAAI,CAAC,SAAS,CACrB;oBACE,IAAI,EAAE,IAAI,WAAW,KAAK;oBAC1B,OAAO,EAAE,OAAO;oBAChB,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,iBAAiB;oBACvB,KAAK,EAAE,mBAAmB;oBAC1B,OAAO,EAAE;wBACP,GAAG,EAAE,iBAAiB;wBACtB,UAAU,EAAE,kBAAkB;wBAC9B,QAAQ,EAAE,gBAAgB;qBAC3B;oBACD,OAAO,EAAE;wBACP,KAAK,EAAE,KAAK;wBACZ,GAAG,EAAE,aAAa;qBACnB;oBACD,YAAY,EAAE;wBACZ,IAAI,EAAE,QAAQ;wBACd,gBAAgB,EAAE,QAAQ;qBAC3B;oBACD,gBAAgB,EAAE;wBAChB,KAAK,EAAE,UAAU;wBACjB,WAAW,EAAE,UAAU;qBACxB;oBACD,eAAe,EAAE;wBACf,cAAc,EAAE,SAAS;wBACzB,kBAAkB,EAAE,SAAS;wBAC7B,UAAU,EAAE,QAAQ;qBACrB;iBACF,EACD,IAAI,EACJ,CAAC,CACF;aACF;YACD;gBACE,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,IAAI,CAAC,SAAS,CACrB;oBACE,eAAe,EAAE;wBACf,MAAM,EAAE,QAAQ;wBAChB,MAAM,EAAE,QAAQ;wBAChB,gBAAgB,EAAE,SAAS;wBAC3B,WAAW,EAAE,IAAI;wBACjB,MAAM,EAAE,QAAQ;wBAChB,MAAM,EAAE,IAAI;wBACZ,eAAe,EAAE,IAAI;wBACrB,YAAY,EAAE,IAAI;wBAClB,GAAG,EAAE,WAAW;qBACjB;oBACD,OAAO,EAAE,CAAC,KAAK,CAAC;iBACjB,EACD,IAAI,EACJ,CAAC,CACF;aACF;YACD;gBACE,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE;8BACa,WAAW;;;;;;CAMxC;aACM;YACD;gBACE,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE;;;;;;CAMhB;aACM;YACD;gBACE,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsChB;aACM;YACD;gBACE,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsDhB;aACM;SACF;KACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAiB,EACjB,SAAiB,EACjB,UAA+B,EAAE;IAEjC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC;IAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACrD,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,IAAI,CAAC;QACH,wBAAwB;QACxB,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC;QAC5B,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;QACnD,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;QAC3E,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QAChE,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;QAChE,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;QAElD,oEAAoE;QACpE,MAAM,eAAe,GAAG,MAAM,wBAAwB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACxE,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;YAC7B,OAAO,eAAe,CAAC;QACzB,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;QAEnD,uBAAuB;QACvB,MAAM,aAAa,GAAG,MAAM,sBAAsB,CAAC,IAAI,EAAE,UAAU,EAAE;YACnE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC;YACjD,aAAa,EAAE,IAAI;YACnB,UAAU,EAAE,KAAK,EAAE,mCAAmC;YACtD,UAAU,EAAE,KAAK;YACjB,cAAc,EAAE,OAAO,CAAC,cAAc;SACvC,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO;gBACL,GAAG,aAAa;gBAChB,YAAY;aACb,CAAC;QACJ,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QAEjD,2BAA2B;QAC3B,MAAM,YAAY,GAAG,2BAA2B,CAAC,WAAW,CAAC,CAAC;QAC9D,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/E,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YACxC,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACxC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,SAAS,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACjD,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACpE,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YACxC,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACxC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAED,wBAAwB;QACxB,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QAChF,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;QAE9E,wCAAwC;QACxC,MAAM,SAAS,GAA6C;YAC1D,qCAAqC;YACrC;gBACE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC;gBAC3C,OAAO,EAAE,uBAAuB,CAAC,WAAW,CAAC;aAC9C;YACD,mBAAmB;YACnB;gBACE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,gBAAgB,CAAC;gBACxD,OAAO,EAAE,wBAAwB,CAAC,WAAW,CAAC;aAC/C;YACD,+CAA+C;YAC/C;gBACE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,oBAAoB,CAAC;gBACjD,OAAO,EAAE,wBAAwB,CAAC,WAAW,CAAC;aAC/C;YACD;gBACE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,oBAAoB,CAAC;gBACpE,OAAO,EAAE,wBAAwB,CAAC,WAAW,CAAC;aAC/C;YACD,SAAS;YACT;gBACE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC;gBACxC,OAAO,EAAE,qBAAqB,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC;aACvD;SACF,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACzC,qDAAqD;YACrD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,UAAU;YACV,YAAY;SACb,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,UAAU;YACV,YAAY;YACZ,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IACpD,MAAM,WAAW,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAErD,OAAO;QACL,OAAO;QACP,cAAc;QACd,wBAAwB;QACxB,sBAAsB;QACtB,iCAAiC;QACjC,oBAAoB;QACpB,WAAW;QACX,YAAY;QACZ,cAAc;QACd,sBAAsB;QACtB,+BAA+B;QAC/B,4BAA4B;QAC5B,4BAA4B;QAC5B,2BAA2B;QAC3B,8BAA8B;QAC9B,6BAA6B;QAC7B,oBAAoB,WAAW,UAAU;QACzC,UAAU;QACV,2BAA2B;QAC3B,8BAA8B;QAC9B,iCAAiC;QACjC,+BAA+B;QAC/B,iCAAiC;QACjC,gCAAgC;QAChC,kBAAkB;QAClB,qCAAqC;QACrC,qCAAqC;QACrC,sCAAsC;QACtC,+CAA+C;QAC/C,0BAA0B;QAC1B,0BAA0B;QAC1B,4BAA4B;QAC5B,0BAA0B;QAC1B,6BAA6B;KAC9B,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAAkB;IAIzD,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,MAAM,aAAa,GAAG;QACpB,OAAO;QACP,cAAc;QACd,wBAAwB;QACxB,oBAAoB;QACpB,WAAW;QACX,WAAW;QACX,4BAA4B;QAC5B,mBAAmB;QACnB,UAAU;QACV,6BAA6B;QAC7B,kBAAkB;QAClB,UAAU;QACV,2BAA2B;QAC3B,iCAAiC;QACjC,iCAAiC;QACjC,kBAAkB;QAClB,qCAAqC;QACrC,0BAA0B;KAC3B,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,YAAY,CAAC,MAAM,KAAK,CAAC;QAChC,YAAY;KACb,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"all.js","sourceRoot":"","sources":["../../src/generators/all.ts"],"names":[],"mappings":"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"}
@@ -8,9 +8,23 @@
8
8
  export declare function stripCodeFences(text: string): string;
9
9
  /**
10
10
  * Extract the real product name from docs or specification
11
- * Finds all "# Name — tagline" headings and picks the shortest (most likely the product name)
11
+ *
12
+ * Priority chain (first match wins):
13
+ * 1. Parsed docs: "# ProductName -- tagline" heading (picks shortest)
14
+ * 2. Specification: "# ProductName" heading
15
+ * 3. Specification: "Product:" / "Name:" / "App:" label
16
+ * 4. package.json "name" field from workspace root (passed via specification context)
17
+ * 5. undefined (caller falls back to directory name)
12
18
  */
13
- export declare function extractProductName(docs: string, specification?: string): string | undefined;
19
+ export declare function extractProductName(docs: string, specification?: string, packageJsonName?: string): string | undefined;
20
+ /**
21
+ * Check if a product name looks like a directory name rather than a real product name
22
+ * Used by the quality gate to flag suspicious names
23
+ *
24
+ * @param name - The product name to check
25
+ * @returns True if the name looks suspicious (likely a directory name)
26
+ */
27
+ export declare function isSuspiciousProductName(name: string): boolean;
14
28
  /**
15
29
  * Extract a tagline from docs (text after em-dash in first heading)
16
30
  * When productName is provided, prefer tagline from the heading containing that name
@@ -22,7 +36,8 @@ export declare function extractTagline(docs: string, productName?: string): stri
22
36
  export declare function extractDescription(docs: string, specification?: string): string | undefined;
23
37
  /**
24
38
  * Extract features from docs and specification
25
- * Looks for bullet/numbered lists in sections about features, principles, capabilities
39
+ * Docs-first: extracts from docs only; falls back to specification if empty
40
+ * Filters out dev-task items (implement, fix, refactor, etc.)
26
41
  */
27
42
  export declare function extractFeatures(docs: string, specification?: string): Array<{
28
43
  title: string;
@@ -1 +1 @@
1
- {"version":3,"file":"doc-parser.d.ts","sourceRoot":"","sources":["../../src/generators/doc-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA0B3F;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAyBrF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiC3F;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,MAAM,GACrB,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAwE/C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,GACX,KAAK,CAAC;IACP,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAC7C,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACxC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACjC,CAAC,GAAG,SAAS,CAwHb;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA6BpE"}
1
+ {"version":3,"file":"doc-parser.d.ts","sourceRoot":"","sources":["../../src/generators/doc-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,MAAM,EACtB,eAAe,CAAC,EAAE,MAAM,GACvB,MAAM,GAAG,SAAS,CAmDpB;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAM7D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAyBrF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiC3F;AAKD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,MAAM,GACrB,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAW/C;AAsFD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,GACX,KAAK,CAAC;IACP,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAC7C,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACxC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACjC,CAAC,GAAG,SAAS,CAwHb;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA6BpE"}
@@ -21,34 +21,80 @@ export function stripCodeFences(text) {
21
21
  }
22
22
  /**
23
23
  * Extract the real product name from docs or specification
24
- * Finds all "# Name — tagline" headings and picks the shortest (most likely the product name)
24
+ *
25
+ * Priority chain (first match wins):
26
+ * 1. Parsed docs: "# ProductName -- tagline" heading (picks shortest)
27
+ * 2. Specification: "# ProductName" heading
28
+ * 3. Specification: "Product:" / "Name:" / "App:" label
29
+ * 4. package.json "name" field from workspace root (passed via specification context)
30
+ * 5. undefined (caller falls back to directory name)
25
31
  */
26
- export function extractProductName(docs, specification) {
27
- // Collect all "# Name tagline" headings, pick the shortest name
32
+ export function extractProductName(docs, specification, packageJsonName) {
33
+ // 1. Collect all "# Name -- tagline" headings, pick the shortest name
28
34
  // Reason: sub-documents like "Gateco UI Color System" are longer than "Gateco"
29
- const headingPattern = /^#\s+([A-Z][a-zA-Z0-9]+(?:[ \t]+[A-Z][a-zA-Z0-9]+)*)(?:[ \t]*[—\-–|:][ \t])/gm;
35
+ const headingPattern = /^#\s+([A-Z][a-zA-Z0-9]+(?:[ \t]+[A-Z][a-zA-Z0-9]+)*)(?:[ \t]*(?:--|[—–|:])[ \t])/gm;
30
36
  const candidates = [];
31
37
  let match;
32
38
  while ((match = headingPattern.exec(docs)) !== null) {
33
39
  candidates.push(match[1].trim());
34
40
  }
35
41
  if (candidates.length > 0) {
36
- // Prefer shortest name (product name is typically 1-2 words)
37
42
  candidates.sort((a, b) => a.length - b.length);
38
43
  return candidates[0];
39
44
  }
40
- // Pattern: "**Project Name**: ProductName" in specification
45
+ // 2. "# ProductName" heading in specification (standalone heading, not sub-doc)
46
+ // Reason: Exclude common section headings like "Overview", "Introduction", "Summary"
47
+ if (specification) {
48
+ const commonHeadings = /^(Overview|Introduction|Summary|Features|Architecture|Requirements|Setup|Installation|Configuration|Specification|Appendix|Conclusion|References)$/i;
49
+ const specHeading = specification.match(/^#\s+([A-Z][a-zA-Z0-9]+(?:\s+[A-Z][a-zA-Z0-9]+)*)\s*$/m);
50
+ if (specHeading && !commonHeadings.test(specHeading[1].trim())) {
51
+ return specHeading[1].trim();
52
+ }
53
+ }
54
+ // 3. "Product:" / "Name:" / "App:" label in specification
41
55
  if (specification) {
42
56
  const nameMatch = specification.match(/\*\*Project\s+Name\*\*:\s*(.+)/i);
43
57
  if (nameMatch)
44
58
  return nameMatch[1].trim();
59
+ const labelMatch = specification.match(/(?:^|\n)\s*(?:Product|Name|App)\s*:\s*(.+)/i);
60
+ if (labelMatch) {
61
+ const value = labelMatch[1].trim().replace(/\*\*/g, '');
62
+ if (value.length > 0 && value.length < 60)
63
+ return value;
64
+ }
45
65
  }
46
- // Pattern: "# ProductName" in spec/product doc sections only
66
+ // 4. "# ProductName" in spec/product doc sections only
47
67
  const sectionHeading = docs.match(/^---\s+\S*(?:spec|product)\S*\s+---\n#\s+([A-Z][a-zA-Z0-9]+)/im);
48
68
  if (sectionHeading)
49
69
  return sectionHeading[1].trim();
70
+ // 5. package.json name (strip @scope/ prefix and convert to title case)
71
+ if (packageJsonName) {
72
+ const cleaned = packageJsonName
73
+ .replace(/^@[^/]+\//, '') // Strip scope
74
+ .replace(/[-_]/g, ' ')
75
+ .replace(/\b\w/g, (c) => c.toUpperCase())
76
+ .trim();
77
+ if (cleaned.length > 0)
78
+ return cleaned;
79
+ }
50
80
  return undefined;
51
81
  }
82
+ /**
83
+ * Check if a product name looks like a directory name rather than a real product name
84
+ * Used by the quality gate to flag suspicious names
85
+ *
86
+ * @param name - The product name to check
87
+ * @returns True if the name looks suspicious (likely a directory name)
88
+ */
89
+ export function isSuspiciousProductName(name) {
90
+ const suspiciousNames = ['my-app', 'my-project', 'project', 'app', 'website', 'frontend'];
91
+ if (suspiciousNames.includes(name.toLowerCase()))
92
+ return true;
93
+ // Hyphenated lowercase strings like "read-all-files" are likely directory names
94
+ if (/^[a-z]+-[a-z]+(-[a-z]+)*$/.test(name))
95
+ return true;
96
+ return false;
97
+ }
52
98
  /**
53
99
  * Extract a tagline from docs (text after em-dash in first heading)
54
100
  * When productName is provided, prefer tagline from the heading containing that name
@@ -117,13 +163,29 @@ export function extractDescription(docs, specification) {
117
163
  }
118
164
  return undefined;
119
165
  }
166
+ /** Regex to filter out dev-task items that aren't real product features */
167
+ const DEV_TASK_VERBS = /^(?:implement|fix|refactor|add tests|upgrade|migrate|configure|setup|install|deploy|debug|create|build|write|update|remove|delete)/i;
120
168
  /**
121
169
  * Extract features from docs and specification
122
- * Looks for bullet/numbered lists in sections about features, principles, capabilities
170
+ * Docs-first: extracts from docs only; falls back to specification if empty
171
+ * Filters out dev-task items (implement, fix, refactor, etc.)
123
172
  */
124
173
  export function extractFeatures(docs, specification) {
174
+ // Docs-first: try docs only, then fall back to spec
175
+ // Reason: specification often contains dev tasks, not user-facing features
176
+ const docsFeatures = extractFeaturesFromSource(docs);
177
+ if (docsFeatures.length > 0)
178
+ return docsFeatures;
179
+ if (specification) {
180
+ return extractFeaturesFromSource(specification);
181
+ }
182
+ return [];
183
+ }
184
+ /**
185
+ * Extract features from a single text source
186
+ */
187
+ function extractFeaturesFromSource(source) {
125
188
  const features = [];
126
- const source = docs + '\n' + (specification || '');
127
189
  // Split into sections by heading
128
190
  const sectionPattern = /^#{1,3}\s+(.+)$/gm;
129
191
  const sections = [];
@@ -159,14 +221,20 @@ export function extractFeatures(docs, specification) {
159
221
  // Try "**bold title** - description" pattern
160
222
  const boldWithDesc = text.match(/^\*\*(.+?)\*\*\s*[-–:]\s*(.+)/);
161
223
  if (boldWithDesc) {
224
+ const title = boldWithDesc[1].trim();
225
+ // Filter out dev-task items
226
+ if (DEV_TASK_VERBS.test(title))
227
+ continue;
162
228
  features.push({
163
- title: boldWithDesc[1].trim(),
229
+ title,
164
230
  description: boldWithDesc[2].trim().slice(0, 150),
165
231
  });
166
232
  }
167
233
  else if (/^\*\*.+\*\*/.test(text)) {
168
234
  // Bold title with no trailing description: "**Vector DB agnostic**"
169
235
  const title = text.replace(/\*\*/g, '').trim();
236
+ if (DEV_TASK_VERBS.test(title))
237
+ continue;
170
238
  if (title.length > 3 && title.length < 80) {
171
239
  features.push({ title, description: title });
172
240
  }
@@ -175,6 +243,9 @@ export function extractFeatures(docs, specification) {
175
243
  const cleaned = text.replace(/\*\*/g, '');
176
244
  // Split on sentence-level delimiters only; keep hyphens in compound words
177
245
  const titlePart = cleaned.split(/[.,:;—–]/)[0].trim();
246
+ // Filter out dev-task items
247
+ if (DEV_TASK_VERBS.test(titlePart))
248
+ continue;
178
249
  if (titlePart.length > 3 && titlePart.length < 60) {
179
250
  features.push({
180
251
  title: titlePart,