popeye-cli 1.5.0 → 1.6.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 (161) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +50 -8
  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 +10 -0
  80. package/dist/state/index.js.map +1 -1
  81. package/dist/types/workflow.d.ts +6 -0
  82. package/dist/types/workflow.d.ts.map +1 -1
  83. package/dist/types/workflow.js +2 -0
  84. package/dist/types/workflow.js.map +1 -1
  85. package/dist/upgrade/handlers.d.ts +15 -0
  86. package/dist/upgrade/handlers.d.ts.map +1 -1
  87. package/dist/upgrade/handlers.js +52 -0
  88. package/dist/upgrade/handlers.js.map +1 -1
  89. package/dist/workflow/auto-fix-bundler.d.ts +37 -0
  90. package/dist/workflow/auto-fix-bundler.d.ts.map +1 -0
  91. package/dist/workflow/auto-fix-bundler.js +320 -0
  92. package/dist/workflow/auto-fix-bundler.js.map +1 -0
  93. package/dist/workflow/auto-fix.d.ts.map +1 -1
  94. package/dist/workflow/auto-fix.js +10 -3
  95. package/dist/workflow/auto-fix.js.map +1 -1
  96. package/dist/workflow/index.d.ts +1 -0
  97. package/dist/workflow/index.d.ts.map +1 -1
  98. package/dist/workflow/index.js +12 -0
  99. package/dist/workflow/index.js.map +1 -1
  100. package/dist/workflow/overview.d.ts.map +1 -1
  101. package/dist/workflow/overview.js +4 -0
  102. package/dist/workflow/overview.js.map +1 -1
  103. package/dist/workflow/plan-mode.d.ts +4 -3
  104. package/dist/workflow/plan-mode.d.ts.map +1 -1
  105. package/dist/workflow/plan-mode.js +69 -5
  106. package/dist/workflow/plan-mode.js.map +1 -1
  107. package/dist/workflow/website-strategy.d.ts +9 -0
  108. package/dist/workflow/website-strategy.d.ts.map +1 -1
  109. package/dist/workflow/website-strategy.js +73 -1
  110. package/dist/workflow/website-strategy.js.map +1 -1
  111. package/dist/workflow/website-updater.d.ts.map +1 -1
  112. package/dist/workflow/website-updater.js +15 -4
  113. package/dist/workflow/website-updater.js.map +1 -1
  114. package/package.json +1 -1
  115. package/src/cli/commands/create.ts +58 -4
  116. package/src/cli/interactive.ts +96 -7
  117. package/src/generators/all.ts +44 -332
  118. package/src/generators/doc-parser.ts +87 -10
  119. package/src/generators/frontend-design-analyzer.ts +261 -0
  120. package/src/generators/shared-packages.ts +500 -0
  121. package/src/generators/templates/index.ts +4 -0
  122. package/src/generators/templates/website-components.ts +36 -11
  123. package/src/generators/templates/website-config.ts +166 -13
  124. package/src/generators/templates/website-landing.ts +331 -0
  125. package/src/generators/templates/website-layout.ts +443 -0
  126. package/src/generators/templates/website-pricing.ts +330 -0
  127. package/src/generators/templates/website-sections.ts +541 -0
  128. package/src/generators/templates/website.ts +38 -851
  129. package/src/generators/website-content-scanner.ts +208 -0
  130. package/src/generators/website-context.ts +248 -20
  131. package/src/generators/website-debug.ts +130 -0
  132. package/src/generators/website.ts +71 -3
  133. package/src/generators/workspace-root.ts +113 -0
  134. package/src/state/index.ts +14 -0
  135. package/src/types/workflow.ts +6 -0
  136. package/src/upgrade/handlers.ts +65 -0
  137. package/src/workflow/auto-fix-bundler.ts +392 -0
  138. package/src/workflow/auto-fix.ts +11 -3
  139. package/src/workflow/index.ts +12 -0
  140. package/src/workflow/overview.ts +6 -0
  141. package/src/workflow/plan-mode.ts +81 -7
  142. package/src/workflow/website-strategy.ts +75 -1
  143. package/src/workflow/website-updater.ts +17 -6
  144. package/tests/cli/project-naming.test.ts +136 -0
  145. package/tests/generators/doc-parser.test.ts +121 -0
  146. package/tests/generators/frontend-design-analyzer.test.ts +90 -0
  147. package/tests/generators/quality-gate.test.ts +183 -0
  148. package/tests/generators/shared-packages.test.ts +83 -0
  149. package/tests/generators/website-components.test.ts +1 -1
  150. package/tests/generators/website-config.test.ts +84 -0
  151. package/tests/generators/website-content-scanner.test.ts +181 -0
  152. package/tests/generators/website-context.test.ts +109 -0
  153. package/tests/generators/website-debug.test.ts +77 -0
  154. package/tests/generators/website-landing.test.ts +188 -0
  155. package/tests/generators/website-pricing.test.ts +98 -0
  156. package/tests/generators/website-sections.test.ts +245 -0
  157. package/tests/generators/workspace-root.test.ts +105 -0
  158. package/tests/upgrade/handlers.test.ts +162 -0
  159. package/tests/workflow/auto-fix-bundler.test.ts +242 -0
  160. package/tests/workflow/plan-mode.test.ts +111 -1
  161. package/tests/workflow/website-strategy.test.ts +55 -0
@@ -1 +1 @@
1
- {"version":3,"file":"website.js","sourceRoot":"","sources":["../../../src/generators/templates/website.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"website.js","sourceRoot":"","sources":["../../../src/generators/templates/website.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,qCAAqC;AACrC,OAAO,EAAE,0BAA0B,EAAE,kCAAkC,EAAE,MAAM,sBAAsB,CAAC;AAGtG,0CAA0C;AAC1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAElE,6BAA6B;AAC7B,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAE7B,8BAA8B;AAC9B,OAAO,EACL,cAAc,EACd,eAAe,EACf,yBAAyB,EACzB,8BAA8B,EAC9B,yBAAyB,EACzB,oBAAoB,EACpB,0BAA0B,EAC1B,4BAA4B,EAC5B,kBAAkB,GACnB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Post-generation content scanner
3
+ * Scans generated website files for known placeholder fingerprints
4
+ * and reports quality issues as warnings
5
+ */
6
+ /**
7
+ * A single scan issue found in a generated file
8
+ */
9
+ export interface ScanIssue {
10
+ /** Relative file path within the website directory */
11
+ file: string;
12
+ /** Human-readable description of the issue */
13
+ message: string;
14
+ /** Severity: error = likely broken, warning = looks generic */
15
+ severity: 'error' | 'warning';
16
+ /** Line number where the issue was found (approximate) */
17
+ line?: number;
18
+ }
19
+ /**
20
+ * Result of scanning generated website content
21
+ */
22
+ export interface ScanResult {
23
+ /** All issues found across scanned files */
24
+ issues: ScanIssue[];
25
+ /** Number of files scanned */
26
+ filesScanned: number;
27
+ /** Content quality score 0-100 based on issues found */
28
+ score: number;
29
+ }
30
+ /**
31
+ * Scan generated website files for placeholder fingerprints
32
+ *
33
+ * @param websiteDir - The website project directory to scan
34
+ * @returns Scan result with issues and quality score
35
+ */
36
+ export declare function scanGeneratedContent(websiteDir: string): Promise<ScanResult>;
37
+ //# sourceMappingURL=website-content-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"website-content-scanner.d.ts","sourceRoot":"","sources":["../../src/generators/website-content-scanner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,4CAA4C;IAC5C,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;CACf;AA4HD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA4ClF"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Post-generation content scanner
3
+ * Scans generated website files for known placeholder fingerprints
4
+ * and reports quality issues as warnings
5
+ */
6
+ import { promises as fs } from 'node:fs';
7
+ import path from 'node:path';
8
+ /**
9
+ * Known placeholder patterns to detect in generated files
10
+ */
11
+ const PLACEHOLDER_PATTERNS = [
12
+ {
13
+ pattern: /\/\*\s*TODO[^*]*\*\//,
14
+ message: 'Contains TODO block comment',
15
+ severity: 'error',
16
+ },
17
+ {
18
+ pattern: /\{\/\*\s*TODO[^*]*\*\/\}/,
19
+ message: 'Contains JSX TODO comment',
20
+ severity: 'error',
21
+ },
22
+ {
23
+ pattern: /\/\/\s*TODO\b/,
24
+ message: 'Contains TODO line comment',
25
+ severity: 'error',
26
+ },
27
+ {
28
+ pattern: /Build something amazing/,
29
+ message: 'Default tagline "Build something amazing"',
30
+ severity: 'warning',
31
+ },
32
+ {
33
+ pattern: /Your modern web application/,
34
+ message: 'Generic description "Your modern web application"',
35
+ severity: 'warning',
36
+ },
37
+ {
38
+ pattern: /Lorem ipsum/i,
39
+ message: 'Contains lorem ipsum placeholder text',
40
+ severity: 'error',
41
+ },
42
+ {
43
+ pattern: /\$29(?:\/mo)?/,
44
+ message: 'Default pricing amount ($29/mo)',
45
+ severity: 'warning',
46
+ },
47
+ ];
48
+ /**
49
+ * Multi-line patterns checked against the full file content
50
+ * These detect combinations that indicate default/template content
51
+ */
52
+ const COMPOSITE_PATTERNS = [
53
+ {
54
+ pattern: /name:\s*['"]Starter['"][\s\S]{0,500}name:\s*['"]Pro['"][\s\S]{0,500}name:\s*['"]Enterprise['"]/,
55
+ message: 'Default pricing tiers (Starter/Pro/Enterprise)',
56
+ severity: 'warning',
57
+ },
58
+ {
59
+ pattern: /title:\s*['"]Sign Up['"][\s\S]{0,500}title:\s*['"]Configure['"][\s\S]{0,500}title:\s*['"]Deploy['"]/,
60
+ message: 'Default "How It Works" steps (Sign Up/Configure/Deploy)',
61
+ severity: 'warning',
62
+ },
63
+ ];
64
+ /**
65
+ * File extensions to scan within the website directory
66
+ */
67
+ const SCANNABLE_EXTENSIONS = new Set(['.tsx', '.ts', '.jsx', '.js', '.css']);
68
+ /**
69
+ * Directories to skip during scanning
70
+ */
71
+ const SKIP_DIRS = new Set(['node_modules', '.next', 'dist', 'build', 'coverage']);
72
+ /**
73
+ * Recursively collect scannable files from a directory
74
+ *
75
+ * @param dir - Directory to scan
76
+ * @param baseDir - Base directory for relative path calculation
77
+ * @returns Array of absolute file paths
78
+ */
79
+ async function collectFiles(dir, baseDir) {
80
+ const results = [];
81
+ try {
82
+ const entries = await fs.readdir(dir, { withFileTypes: true });
83
+ for (const entry of entries) {
84
+ if (entry.isDirectory()) {
85
+ if (SKIP_DIRS.has(entry.name))
86
+ continue;
87
+ const subFiles = await collectFiles(path.join(dir, entry.name), baseDir);
88
+ results.push(...subFiles);
89
+ }
90
+ else if (entry.isFile()) {
91
+ const ext = path.extname(entry.name);
92
+ if (SCANNABLE_EXTENSIONS.has(ext)) {
93
+ results.push(path.join(dir, entry.name));
94
+ }
95
+ }
96
+ }
97
+ }
98
+ catch {
99
+ // Directory not accessible, skip
100
+ }
101
+ return results;
102
+ }
103
+ /**
104
+ * Find the approximate line number for a regex match in content
105
+ *
106
+ * @param content - File content
107
+ * @param pattern - Pattern to search for
108
+ * @returns Line number (1-based) or undefined
109
+ */
110
+ function findLineNumber(content, pattern) {
111
+ const match = content.match(pattern);
112
+ if (!match || match.index === undefined)
113
+ return undefined;
114
+ const beforeMatch = content.slice(0, match.index);
115
+ return beforeMatch.split('\n').length;
116
+ }
117
+ /**
118
+ * Scan generated website files for placeholder fingerprints
119
+ *
120
+ * @param websiteDir - The website project directory to scan
121
+ * @returns Scan result with issues and quality score
122
+ */
123
+ export async function scanGeneratedContent(websiteDir) {
124
+ const issues = [];
125
+ const files = await collectFiles(path.join(websiteDir, 'src'), websiteDir);
126
+ let score = 100;
127
+ for (const filePath of files) {
128
+ try {
129
+ const content = await fs.readFile(filePath, 'utf-8');
130
+ const relativePath = path.relative(websiteDir, filePath);
131
+ // Check per-line patterns
132
+ for (const { pattern, message, severity } of PLACEHOLDER_PATTERNS) {
133
+ if (pattern.test(content)) {
134
+ issues.push({
135
+ file: relativePath,
136
+ message,
137
+ severity,
138
+ line: findLineNumber(content, pattern),
139
+ });
140
+ score -= severity === 'error' ? 15 : 5;
141
+ }
142
+ }
143
+ // Check composite (multi-line) patterns
144
+ for (const { pattern, message, severity } of COMPOSITE_PATTERNS) {
145
+ if (pattern.test(content)) {
146
+ issues.push({
147
+ file: relativePath,
148
+ message,
149
+ severity,
150
+ });
151
+ score -= severity === 'error' ? 15 : 5;
152
+ }
153
+ }
154
+ }
155
+ catch {
156
+ // Skip unreadable files
157
+ }
158
+ }
159
+ return {
160
+ issues,
161
+ filesScanned: files.length,
162
+ score: Math.max(0, Math.min(100, score)),
163
+ };
164
+ }
165
+ //# sourceMappingURL=website-content-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"website-content-scanner.js","sourceRoot":"","sources":["../../src/generators/website-content-scanner.ts"],"names":[],"mappings":"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"}
@@ -37,7 +37,8 @@ export interface WebsiteContentContext {
37
37
  }
38
38
  /**
39
39
  * Resolve brand assets into a deterministic contract
40
- * Searches for logo/favicon in project directory, sets canonical output paths
40
+ * Searches for logo/favicon in project directory and workspace root,
41
+ * sets canonical output paths
41
42
  *
42
43
  * @param cwd - Directory to scan for brand assets
43
44
  * @param brandContext - Optional existing brand context from state
@@ -56,6 +57,7 @@ export declare function resolveBrandAssets(cwd: string, brandContext?: {
56
57
  export declare function discoverProjectDocs(cwd: string): Promise<string[]>;
57
58
  /**
58
59
  * Find brand assets (logo files) in a directory
60
+ * Also searches workspace root and parent directories
59
61
  *
60
62
  * @param cwd - Directory to scan for brand assets
61
63
  * @returns Object with optional logoPath
@@ -67,7 +69,7 @@ export declare function findBrandAssets(cwd: string): Promise<{
67
69
  * Read and concatenate project documentation files
68
70
  *
69
71
  * @param docPaths - Array of absolute paths to doc files
70
- * @param maxLength - Maximum combined length (default 15000 chars)
72
+ * @param maxLength - Maximum combined length (default 25000 chars)
71
73
  * @returns Combined documentation content with file headers
72
74
  */
73
75
  export declare function readProjectDocs(docPaths: string[], maxLength?: number): Promise<string>;
@@ -80,4 +82,38 @@ export declare function readProjectDocs(docPaths: string[], maxLength?: number):
80
82
  * @returns Structured content context for website templates
81
83
  */
82
84
  export declare function buildWebsiteContext(cwd: string, projectName: string, specification?: string): Promise<WebsiteContentContext>;
85
+ /**
86
+ * Result of soft (non-throwing) website context validation
87
+ */
88
+ export interface ValidationResult {
89
+ /** Whether the context is sufficient for generation (no blocking issues) */
90
+ passed: boolean;
91
+ /** Blocking problems that prevent quality generation */
92
+ issues: string[];
93
+ /** Non-blocking concerns about content quality */
94
+ warnings: string[];
95
+ /** Content quality score 0-100, deducted for each default/missing piece */
96
+ contentScore: number;
97
+ }
98
+ /**
99
+ * Validate website content context without throwing
100
+ * Returns structured result with issues, warnings, and a content quality score
101
+ *
102
+ * @param context - The built website content context
103
+ * @param projectName - The project name for validation
104
+ * @returns Validation result with issues, warnings, and score
105
+ */
106
+ export declare function validateWebsiteContext(context: WebsiteContentContext, _projectName: string): ValidationResult;
107
+ /**
108
+ * Validate website content context and throw if insufficient
109
+ * Prevents generation of generic websites with placeholder content
110
+ *
111
+ * @param context - The built website content context
112
+ * @param projectName - The project name for validation
113
+ * @throws Error with actionable message if context is insufficient
114
+ */
115
+ export declare function validateWebsiteContextOrThrow(context: WebsiteContentContext, projectName: string): {
116
+ passed: boolean;
117
+ issues: string[];
118
+ };
83
119
  //# sourceMappingURL=website-context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"website-context.d.ts","sourceRoot":"","sources":["../../src/generators/website-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,OAAO,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEjG;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,OAAO,CAAC,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;IACH,KAAK,CAAC,EAAE;QACN,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,8EAA8E;IAC9E,WAAW,CAAC,EAAE,mBAAmB,CAAC;CACnC;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,YAAY,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D,OAAO,CAAC,mBAAmB,CAAC,CAU9B;AA6BD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAiDxE;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAsBhC;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,GAAE,MAAc,GACxB,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,qBAAqB,CAAC,CA6BhC"}
1
+ {"version":3,"file":"website-context.d.ts","sourceRoot":"","sources":["../../src/generators/website-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,OAAO,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAKjG;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,OAAO,CAAC,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;IACH,KAAK,CAAC,EAAE;QACN,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,8EAA8E;IAC9E,WAAW,CAAC,EAAE,mBAAmB,CAAC;CACnC;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,YAAY,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D,OAAO,CAAC,mBAAmB,CAAC,CAU9B;AA6BD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA2BxE;AAyDD;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAShC;AA6BD;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,GAAE,MAAc,GACxB,OAAO,CAAC,MAAM,CAAC,CA6BjB;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,qBAAqB,CAAC,CA6BhC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4EAA4E;IAC5E,MAAM,EAAE,OAAO,CAAC;IAChB,wDAAwD;IACxD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,2EAA2E;IAC3E,YAAY,EAAE,MAAM,CAAC;CACtB;AAQD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,qBAAqB,EAC9B,YAAY,EAAE,MAAM,GACnB,gBAAgB,CAgHlB;AAED;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,qBAAqB,EAC9B,WAAW,EAAE,MAAM,GAClB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAYvC"}
@@ -6,9 +6,13 @@
6
6
  import { promises as fs } from 'node:fs';
7
7
  import path from 'node:path';
8
8
  import { stripCodeFences, extractProductName, extractTagline, extractDescription, extractFeatures, extractPricing, extractPrimaryColor, } from './doc-parser.js';
9
+ import { getScanDirectories } from './workspace-root.js';
10
+ /** Per-file character cap to prevent a single large doc from consuming the budget */
11
+ const PER_FILE_CAP = 8000;
9
12
  /**
10
13
  * Resolve brand assets into a deterministic contract
11
- * Searches for logo/favicon in project directory, sets canonical output paths
14
+ * Searches for logo/favicon in project directory and workspace root,
15
+ * sets canonical output paths
12
16
  *
13
17
  * @param cwd - Directory to scan for brand assets
14
18
  * @param brandContext - Optional existing brand context from state
@@ -56,9 +60,51 @@ const EXCLUDED_DIRS = [
56
60
  * @returns Array of absolute paths to discovered doc files
57
61
  */
58
62
  export async function discoverProjectDocs(cwd) {
63
+ const scanDirs = await getScanDirectories(cwd);
64
+ const allDocs = [];
65
+ const seenPaths = new Set();
66
+ for (const dir of scanDirs) {
67
+ const found = await scanDirectoryForDocs(dir);
68
+ for (const docPath of found) {
69
+ const resolved = path.resolve(docPath);
70
+ if (!seenPaths.has(resolved)) {
71
+ seenPaths.add(resolved);
72
+ allDocs.push(resolved);
73
+ }
74
+ }
75
+ }
76
+ // Sort: brand/color docs first, then spec, then pricing, then others
77
+ // Reason: ensures critical brand context isn't truncated by the maxLength cap
78
+ allDocs.sort((a, b) => {
79
+ const nameA = path.basename(a).toLowerCase();
80
+ const nameB = path.basename(b).toLowerCase();
81
+ const priorityA = getDocPriority(nameA);
82
+ const priorityB = getDocPriority(nameB);
83
+ return priorityA - priorityB;
84
+ });
85
+ return allDocs;
86
+ }
87
+ /**
88
+ * Get sort priority for a doc file (lower = higher priority)
89
+ */
90
+ function getDocPriority(fileName) {
91
+ if (/color|brand/.test(fileName))
92
+ return 0;
93
+ if (/spec/.test(fileName))
94
+ return 1;
95
+ if (/pricing/.test(fileName))
96
+ return 2;
97
+ if (/feature/.test(fileName))
98
+ return 3;
99
+ return 4;
100
+ }
101
+ /**
102
+ * Scan a single directory for doc files (flat + docs/ subdirectory)
103
+ */
104
+ async function scanDirectoryForDocs(dir) {
59
105
  const docs = [];
60
106
  try {
61
- const entries = await fs.readdir(cwd, { withFileTypes: true });
107
+ const entries = await fs.readdir(dir, { withFileTypes: true });
62
108
  for (const entry of entries) {
63
109
  if (entry.isDirectory() && EXCLUDED_DIRS.includes(entry.name)) {
64
110
  continue;
@@ -66,18 +112,18 @@ export async function discoverProjectDocs(cwd) {
66
112
  if (entry.isFile() && entry.name.endsWith('.md')) {
67
113
  const matches = DOC_PATTERNS.some((pattern) => pattern.test(entry.name));
68
114
  if (matches) {
69
- docs.push(path.join(cwd, entry.name));
115
+ docs.push(path.join(dir, entry.name));
70
116
  }
71
117
  }
72
118
  // Check one level of subdirectories (e.g., docs/)
73
119
  if (entry.isDirectory() && entry.name === 'docs') {
74
120
  try {
75
- const subEntries = await fs.readdir(path.join(cwd, entry.name), {
121
+ const subEntries = await fs.readdir(path.join(dir, entry.name), {
76
122
  withFileTypes: true,
77
123
  });
78
124
  for (const subEntry of subEntries) {
79
125
  if (subEntry.isFile() && subEntry.name.endsWith('.md')) {
80
- docs.push(path.join(cwd, entry.name, subEntry.name));
126
+ docs.push(path.join(dir, entry.name, subEntry.name));
81
127
  }
82
128
  }
83
129
  }
@@ -90,27 +136,31 @@ export async function discoverProjectDocs(cwd) {
90
136
  catch {
91
137
  // Directory not accessible
92
138
  }
93
- // Sort: color/brand docs first (small but critical), then others
94
- // This ensures brand context isn't truncated by the maxLength cap
95
- docs.sort((a, b) => {
96
- const nameA = path.basename(a).toLowerCase();
97
- const nameB = path.basename(b).toLowerCase();
98
- const priorityA = /color|brand/.test(nameA) ? 0 : 1;
99
- const priorityB = /color|brand/.test(nameB) ? 0 : 1;
100
- return priorityA - priorityB;
101
- });
102
139
  return docs;
103
140
  }
104
141
  /**
105
142
  * Find brand assets (logo files) in a directory
143
+ * Also searches workspace root and parent directories
106
144
  *
107
145
  * @param cwd - Directory to scan for brand assets
108
146
  * @returns Object with optional logoPath
109
147
  */
110
148
  export async function findBrandAssets(cwd) {
149
+ const scanDirs = await getScanDirectories(cwd);
150
+ for (const dir of scanDirs) {
151
+ const result = await scanDirectoryForLogo(dir);
152
+ if (result.logoPath)
153
+ return result;
154
+ }
155
+ return {};
156
+ }
157
+ /**
158
+ * Scan a single directory for logo files
159
+ */
160
+ async function scanDirectoryForLogo(dir) {
111
161
  const logoExtensions = ['.png', '.svg', '.jpg', '.jpeg', '.webp'];
112
162
  try {
113
- const entries = await fs.readdir(cwd, { withFileTypes: true });
163
+ const entries = await fs.readdir(dir, { withFileTypes: true });
114
164
  for (const entry of entries) {
115
165
  if (!entry.isFile())
116
166
  continue;
@@ -118,7 +168,7 @@ export async function findBrandAssets(cwd) {
118
168
  const hasLogoInName = lowerName.includes('logo');
119
169
  const hasValidExt = logoExtensions.some((ext) => lowerName.endsWith(ext));
120
170
  if (hasLogoInName && hasValidExt) {
121
- return { logoPath: path.join(cwd, entry.name) };
171
+ return { logoPath: path.join(dir, entry.name) };
122
172
  }
123
173
  }
124
174
  }
@@ -131,19 +181,23 @@ export async function findBrandAssets(cwd) {
131
181
  * Read and concatenate project documentation files
132
182
  *
133
183
  * @param docPaths - Array of absolute paths to doc files
134
- * @param maxLength - Maximum combined length (default 15000 chars)
184
+ * @param maxLength - Maximum combined length (default 25000 chars)
135
185
  * @returns Combined documentation content with file headers
136
186
  */
137
- export async function readProjectDocs(docPaths, maxLength = 15000) {
187
+ export async function readProjectDocs(docPaths, maxLength = 25000) {
138
188
  const sections = [];
139
189
  let totalLength = 0;
140
190
  for (const docPath of docPaths) {
141
191
  if (totalLength >= maxLength)
142
192
  break;
143
193
  try {
144
- const content = await fs.readFile(docPath, 'utf-8');
194
+ let content = await fs.readFile(docPath, 'utf-8');
145
195
  const fileName = path.basename(docPath);
146
196
  const header = `--- ${fileName} ---`;
197
+ // Per-file cap to prevent a single large doc from consuming the budget
198
+ if (content.length > PER_FILE_CAP) {
199
+ content = content.slice(0, PER_FILE_CAP) + '...';
200
+ }
147
201
  const remaining = maxLength - totalLength;
148
202
  const trimmedContent = content.length > remaining ? content.slice(0, remaining) + '...' : content;
149
203
  sections.push(`${header}\n${trimmedContent}`);
@@ -187,4 +241,110 @@ export async function buildWebsiteContext(cwd, projectName, specification) {
187
241
  }
188
242
  return context;
189
243
  }
244
+ /** Default pricing tier names that indicate placeholder content */
245
+ const DEFAULT_PRICING_NAMES = ['starter', 'free', 'pro', 'enterprise'];
246
+ /** Default pricing amounts that indicate placeholder content */
247
+ const DEFAULT_PRICING_AMOUNTS = ['$0', '$29', '$99', 'custom', 'free'];
248
+ /**
249
+ * Validate website content context without throwing
250
+ * Returns structured result with issues, warnings, and a content quality score
251
+ *
252
+ * @param context - The built website content context
253
+ * @param projectName - The project name for validation
254
+ * @returns Validation result with issues, warnings, and score
255
+ */
256
+ export function validateWebsiteContext(context, _projectName) {
257
+ const issues = [];
258
+ const warnings = [];
259
+ let contentScore = 100;
260
+ // Suspicious product name (looks like a directory name with hyphens/underscores)
261
+ const suspiciousNames = ['my-app', 'my-project', 'project', 'app', 'website', 'frontend'];
262
+ if (/^[a-z]+-[a-z]+(-[a-z]+)*$/.test(context.productName) ||
263
+ suspiciousNames.includes(context.productName.toLowerCase())) {
264
+ issues.push(`Product name "${context.productName}" looks like a directory name, not a product. ` +
265
+ `Provide .md docs with "# ProductName -- tagline" heading.`);
266
+ contentScore -= 25;
267
+ }
268
+ // No docs found at all
269
+ if (!context.rawDocs || context.rawDocs.length < 100) {
270
+ issues.push('No project documentation found. Place .md files (spec, pricing, brand) ' +
271
+ 'in the project directory or its parent.');
272
+ contentScore -= 30;
273
+ }
274
+ // No features extracted
275
+ if (context.features.length === 0) {
276
+ issues.push('No product features extracted from docs. Add a "## Features" section to your spec.');
277
+ contentScore -= 20;
278
+ }
279
+ // Strategy validation
280
+ if (!context.strategy) {
281
+ issues.push('Website strategy missing. Strategy generation may have failed or been skipped.');
282
+ contentScore -= 15;
283
+ }
284
+ // Brand color validation: brand/color docs exist but no color extracted
285
+ if (!context.brand?.primaryColor && context.rawDocs && /color|brand/i.test(context.rawDocs)) {
286
+ issues.push('Brand/color docs found but no primary color extracted. Check color doc format.');
287
+ contentScore -= 5;
288
+ }
289
+ // Logo found but output path not resolved
290
+ if (context.brand?.logoPath && !context.brandAssets?.logoOutputPath) {
291
+ issues.push('Logo found but output path not resolved. Call resolveBrandAssets().');
292
+ contentScore -= 5;
293
+ }
294
+ // --- Non-blocking warnings ---
295
+ // Default pricing tiers detection
296
+ if (context.pricing && context.pricing.length > 0) {
297
+ const tierNames = context.pricing.map((t) => t.name.toLowerCase());
298
+ const tierPrices = context.pricing.map((t) => t.price.toLowerCase().replace(/\/mo.*/, ''));
299
+ const nameMatches = tierNames.filter((n) => DEFAULT_PRICING_NAMES.includes(n));
300
+ const priceMatches = tierPrices.filter((p) => DEFAULT_PRICING_AMOUNTS.includes(p));
301
+ // Reason: if most tier names AND prices match defaults, it's likely placeholder content
302
+ if (nameMatches.length >= 2 && priceMatches.length >= 2) {
303
+ warnings.push('Pricing tiers appear to use default values (Starter/Pro/Enterprise at $0/$29/Custom). ' +
304
+ 'Add a pricing section to your docs for accurate tiers.');
305
+ contentScore -= 10;
306
+ }
307
+ }
308
+ // Missing tagline
309
+ if (!context.tagline) {
310
+ warnings.push('No tagline extracted from docs. Footer and meta tags will use generic defaults. ' +
311
+ 'Add "# ProductName -- Your tagline here" to your spec.');
312
+ contentScore -= 5;
313
+ }
314
+ // Missing description
315
+ if (!context.description) {
316
+ warnings.push('No product description extracted. Meta description will use generic text.');
317
+ contentScore -= 5;
318
+ }
319
+ // No brand color at all (not just missing from color docs)
320
+ if (!context.brand?.primaryColor && !(context.rawDocs && /color|brand/i.test(context.rawDocs))) {
321
+ warnings.push('No brand color found. Website will use default color scheme.');
322
+ contentScore -= 5;
323
+ }
324
+ // Clamp score to 0-100
325
+ contentScore = Math.max(0, Math.min(100, contentScore));
326
+ return {
327
+ passed: issues.length === 0,
328
+ issues,
329
+ warnings,
330
+ contentScore,
331
+ };
332
+ }
333
+ /**
334
+ * Validate website content context and throw if insufficient
335
+ * Prevents generation of generic websites with placeholder content
336
+ *
337
+ * @param context - The built website content context
338
+ * @param projectName - The project name for validation
339
+ * @throws Error with actionable message if context is insufficient
340
+ */
341
+ export function validateWebsiteContextOrThrow(context, projectName) {
342
+ const result = validateWebsiteContext(context, projectName);
343
+ if (!result.passed) {
344
+ throw new Error(`Website generation blocked - insufficient project context:\n` +
345
+ result.issues.map((i) => ` - ${i}`).join('\n') +
346
+ `\n\nFix these issues and re-run. Use POPEYE_DEBUG_WEBSITE=1 to see discovery details.`);
347
+ }
348
+ return { passed: true, issues: [] };
349
+ }
190
350
  //# sourceMappingURL=website-context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"website-context.js","sourceRoot":"","sources":["../../src/generators/website-context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"website-context.js","sourceRoot":"","sources":["../../src/generators/website-context.ts"],"names":[],"mappings":"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"}