popeye-cli 1.4.7 → 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.
- package/CHANGELOG.md +54 -0
- package/README.md +264 -63
- package/dist/adapters/gemini.d.ts +1 -0
- package/dist/adapters/gemini.d.ts.map +1 -1
- package/dist/adapters/gemini.js +9 -4
- package/dist/adapters/gemini.js.map +1 -1
- package/dist/adapters/grok.d.ts +1 -0
- package/dist/adapters/grok.d.ts.map +1 -1
- package/dist/adapters/grok.js +9 -4
- package/dist/adapters/grok.js.map +1 -1
- package/dist/adapters/openai.d.ts +1 -1
- package/dist/adapters/openai.d.ts.map +1 -1
- package/dist/adapters/openai.js +35 -9
- package/dist/adapters/openai.js.map +1 -1
- package/dist/cli/commands/create.d.ts.map +1 -1
- package/dist/cli/commands/create.js +54 -4
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/interactive.d.ts +29 -0
- package/dist/cli/interactive.d.ts.map +1 -1
- package/dist/cli/interactive.js +132 -7
- package/dist/cli/interactive.js.map +1 -1
- package/dist/generators/all.d.ts +8 -2
- package/dist/generators/all.d.ts.map +1 -1
- package/dist/generators/all.js +37 -316
- package/dist/generators/all.js.map +1 -1
- package/dist/generators/doc-parser.d.ts +64 -0
- package/dist/generators/doc-parser.d.ts.map +1 -0
- package/dist/generators/doc-parser.js +407 -0
- package/dist/generators/doc-parser.js.map +1 -0
- package/dist/generators/frontend-design-analyzer.d.ts +30 -0
- package/dist/generators/frontend-design-analyzer.d.ts.map +1 -0
- package/dist/generators/frontend-design-analyzer.js +208 -0
- package/dist/generators/frontend-design-analyzer.js.map +1 -0
- package/dist/generators/shared-packages.d.ts +45 -0
- package/dist/generators/shared-packages.d.ts.map +1 -0
- package/dist/generators/shared-packages.js +456 -0
- package/dist/generators/shared-packages.js.map +1 -0
- package/dist/generators/templates/index.d.ts +8 -0
- package/dist/generators/templates/index.d.ts.map +1 -1
- package/dist/generators/templates/index.js +8 -0
- package/dist/generators/templates/index.js.map +1 -1
- package/dist/generators/templates/website-components.d.ts +33 -0
- package/dist/generators/templates/website-components.d.ts.map +1 -0
- package/dist/generators/templates/website-components.js +303 -0
- package/dist/generators/templates/website-components.js.map +1 -0
- package/dist/generators/templates/website-config.d.ts +55 -0
- package/dist/generators/templates/website-config.d.ts.map +1 -0
- package/dist/generators/templates/website-config.js +425 -0
- package/dist/generators/templates/website-config.js.map +1 -0
- package/dist/generators/templates/website-conversion.d.ts +27 -0
- package/dist/generators/templates/website-conversion.d.ts.map +1 -0
- package/dist/generators/templates/website-conversion.js +326 -0
- package/dist/generators/templates/website-conversion.js.map +1 -0
- package/dist/generators/templates/website-landing.d.ts +24 -0
- package/dist/generators/templates/website-landing.d.ts.map +1 -0
- package/dist/generators/templates/website-landing.js +276 -0
- package/dist/generators/templates/website-landing.js.map +1 -0
- package/dist/generators/templates/website-layout.d.ts +42 -0
- package/dist/generators/templates/website-layout.d.ts.map +1 -0
- package/dist/generators/templates/website-layout.js +408 -0
- package/dist/generators/templates/website-layout.js.map +1 -0
- package/dist/generators/templates/website-pricing.d.ts +11 -0
- package/dist/generators/templates/website-pricing.d.ts.map +1 -0
- package/dist/generators/templates/website-pricing.js +313 -0
- package/dist/generators/templates/website-pricing.js.map +1 -0
- package/dist/generators/templates/website-sections.d.ts +102 -0
- package/dist/generators/templates/website-sections.d.ts.map +1 -0
- package/dist/generators/templates/website-sections.js +444 -0
- package/dist/generators/templates/website-sections.js.map +1 -0
- package/dist/generators/templates/website-seo.d.ts +76 -0
- package/dist/generators/templates/website-seo.d.ts.map +1 -0
- package/dist/generators/templates/website-seo.js +326 -0
- package/dist/generators/templates/website-seo.js.map +1 -0
- package/dist/generators/templates/website.d.ts +10 -83
- package/dist/generators/templates/website.d.ts.map +1 -1
- package/dist/generators/templates/website.js +12 -875
- package/dist/generators/templates/website.js.map +1 -1
- package/dist/generators/website-content-scanner.d.ts +37 -0
- package/dist/generators/website-content-scanner.d.ts.map +1 -0
- package/dist/generators/website-content-scanner.js +165 -0
- package/dist/generators/website-content-scanner.js.map +1 -0
- package/dist/generators/website-context.d.ts +119 -0
- package/dist/generators/website-context.d.ts.map +1 -0
- package/dist/generators/website-context.js +350 -0
- package/dist/generators/website-context.js.map +1 -0
- package/dist/generators/website-debug.d.ts +68 -0
- package/dist/generators/website-debug.d.ts.map +1 -0
- package/dist/generators/website-debug.js +93 -0
- package/dist/generators/website-debug.js.map +1 -0
- package/dist/generators/website.d.ts +5 -0
- package/dist/generators/website.d.ts.map +1 -1
- package/dist/generators/website.js +136 -11
- package/dist/generators/website.js.map +1 -1
- package/dist/generators/workspace-root.d.ts +27 -0
- package/dist/generators/workspace-root.d.ts.map +1 -0
- package/dist/generators/workspace-root.js +100 -0
- package/dist/generators/workspace-root.js.map +1 -0
- package/dist/state/index.d.ts +35 -0
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +40 -0
- package/dist/state/index.js.map +1 -1
- package/dist/types/consensus.d.ts +3 -0
- package/dist/types/consensus.d.ts.map +1 -1
- package/dist/types/consensus.js +1 -0
- package/dist/types/consensus.js.map +1 -1
- package/dist/types/website-strategy.d.ts +263 -0
- package/dist/types/website-strategy.d.ts.map +1 -0
- package/dist/types/website-strategy.js +105 -0
- package/dist/types/website-strategy.js.map +1 -0
- package/dist/types/workflow.d.ts +21 -0
- package/dist/types/workflow.d.ts.map +1 -1
- package/dist/types/workflow.js +8 -0
- package/dist/types/workflow.js.map +1 -1
- package/dist/upgrade/handlers.d.ts +15 -0
- package/dist/upgrade/handlers.d.ts.map +1 -1
- package/dist/upgrade/handlers.js +52 -0
- package/dist/upgrade/handlers.js.map +1 -1
- package/dist/workflow/auto-fix-bundler.d.ts +37 -0
- package/dist/workflow/auto-fix-bundler.d.ts.map +1 -0
- package/dist/workflow/auto-fix-bundler.js +320 -0
- package/dist/workflow/auto-fix-bundler.js.map +1 -0
- package/dist/workflow/auto-fix.d.ts.map +1 -1
- package/dist/workflow/auto-fix.js +10 -3
- package/dist/workflow/auto-fix.js.map +1 -1
- package/dist/workflow/consensus.d.ts.map +1 -1
- package/dist/workflow/consensus.js +2 -0
- package/dist/workflow/consensus.js.map +1 -1
- package/dist/workflow/execution-mode.d.ts.map +1 -1
- package/dist/workflow/execution-mode.js +18 -0
- package/dist/workflow/execution-mode.js.map +1 -1
- package/dist/workflow/index.d.ts +4 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +37 -0
- package/dist/workflow/index.js.map +1 -1
- package/dist/workflow/overview.d.ts +89 -0
- package/dist/workflow/overview.d.ts.map +1 -0
- package/dist/workflow/overview.js +358 -0
- package/dist/workflow/overview.js.map +1 -0
- package/dist/workflow/plan-mode.d.ts +6 -4
- package/dist/workflow/plan-mode.d.ts.map +1 -1
- package/dist/workflow/plan-mode.js +148 -6
- package/dist/workflow/plan-mode.js.map +1 -1
- package/dist/workflow/website-strategy.d.ts +79 -0
- package/dist/workflow/website-strategy.d.ts.map +1 -0
- package/dist/workflow/website-strategy.js +310 -0
- package/dist/workflow/website-strategy.js.map +1 -0
- package/dist/workflow/website-updater.d.ts +17 -0
- package/dist/workflow/website-updater.d.ts.map +1 -0
- package/dist/workflow/website-updater.js +116 -0
- package/dist/workflow/website-updater.js.map +1 -0
- package/dist/workflow/workflow-logger.d.ts +1 -1
- package/dist/workflow/workflow-logger.d.ts.map +1 -1
- package/dist/workflow/workflow-logger.js.map +1 -1
- package/package.json +1 -1
- package/src/adapters/gemini.ts +10 -4
- package/src/adapters/grok.ts +10 -4
- package/src/adapters/openai.ts +38 -6
- package/src/cli/commands/create.ts +58 -4
- package/src/cli/interactive.ts +143 -7
- package/src/generators/all.ts +49 -332
- package/src/generators/doc-parser.ts +449 -0
- package/src/generators/frontend-design-analyzer.ts +261 -0
- package/src/generators/shared-packages.ts +500 -0
- package/src/generators/templates/index.ts +8 -0
- package/src/generators/templates/website-components.ts +330 -0
- package/src/generators/templates/website-config.ts +444 -0
- package/src/generators/templates/website-conversion.ts +341 -0
- package/src/generators/templates/website-landing.ts +331 -0
- package/src/generators/templates/website-layout.ts +443 -0
- package/src/generators/templates/website-pricing.ts +330 -0
- package/src/generators/templates/website-sections.ts +541 -0
- package/src/generators/templates/website-seo.ts +370 -0
- package/src/generators/templates/website.ts +38 -905
- package/src/generators/website-content-scanner.ts +208 -0
- package/src/generators/website-context.ts +493 -0
- package/src/generators/website-debug.ts +130 -0
- package/src/generators/website.ts +178 -20
- package/src/generators/workspace-root.ts +113 -0
- package/src/state/index.ts +56 -0
- package/src/types/consensus.ts +3 -0
- package/src/types/website-strategy.ts +243 -0
- package/src/types/workflow.ts +21 -0
- package/src/upgrade/handlers.ts +65 -0
- package/src/workflow/auto-fix-bundler.ts +392 -0
- package/src/workflow/auto-fix.ts +11 -3
- package/src/workflow/consensus.ts +2 -0
- package/src/workflow/execution-mode.ts +21 -0
- package/src/workflow/index.ts +37 -0
- package/src/workflow/overview.ts +475 -0
- package/src/workflow/plan-mode.ts +193 -8
- package/src/workflow/website-strategy.ts +379 -0
- package/src/workflow/website-updater.ts +142 -0
- package/src/workflow/workflow-logger.ts +1 -0
- package/tests/adapters/persona-switching.test.ts +63 -0
- package/tests/cli/project-naming.test.ts +136 -0
- package/tests/generators/doc-parser.test.ts +121 -0
- package/tests/generators/frontend-design-analyzer.test.ts +90 -0
- package/tests/generators/quality-gate.test.ts +183 -0
- package/tests/generators/shared-packages.test.ts +83 -0
- package/tests/generators/website-components.test.ts +159 -0
- package/tests/generators/website-config.test.ts +84 -0
- package/tests/generators/website-content-scanner.test.ts +181 -0
- package/tests/generators/website-context.test.ts +331 -0
- package/tests/generators/website-debug.test.ts +77 -0
- package/tests/generators/website-landing.test.ts +188 -0
- package/tests/generators/website-pricing.test.ts +98 -0
- package/tests/generators/website-sections.test.ts +245 -0
- package/tests/generators/website-seo-quality.test.ts +246 -0
- package/tests/generators/workspace-root.test.ts +105 -0
- package/tests/upgrade/handlers.test.ts +162 -0
- package/tests/workflow/auto-fix-bundler.test.ts +242 -0
- package/tests/workflow/overview.test.ts +392 -0
- package/tests/workflow/plan-mode.test.ts +111 -1
- package/tests/workflow/website-strategy.test.ts +246 -0
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Website strategy generator
|
|
3
|
+
* AI-powered marketing strategy creation from product context,
|
|
4
|
+
* with caching via input hash and file-based storage
|
|
5
|
+
*/
|
|
6
|
+
import { promises as fs } from 'node:fs';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import { createHash } from 'node:crypto';
|
|
9
|
+
import { WebsiteStrategySchema } from '../types/website-strategy.js';
|
|
10
|
+
import { createClient } from '../adapters/openai.js';
|
|
11
|
+
/** File name for persisted strategy */
|
|
12
|
+
const STRATEGY_FILE = 'website-strategy.json';
|
|
13
|
+
/**
|
|
14
|
+
* Generate a website marketing strategy from product context
|
|
15
|
+
*
|
|
16
|
+
* @param input - Strategy generation inputs
|
|
17
|
+
* @param onProgress - Optional progress callback
|
|
18
|
+
* @returns Strategy document with metadata
|
|
19
|
+
*/
|
|
20
|
+
export async function generateWebsiteStrategy(input, onProgress) {
|
|
21
|
+
onProgress?.('Analyzing product context for strategy...');
|
|
22
|
+
const client = await createClient();
|
|
23
|
+
const competitorsBlock = input.competitors && input.competitors.length > 0
|
|
24
|
+
? `\n\nKNOWN COMPETITORS (user-supplied):\n${input.competitors.map(c => `- ${c}`).join('\n')}`
|
|
25
|
+
: '';
|
|
26
|
+
const keywordsBlock = input.keywords && input.keywords.length > 0
|
|
27
|
+
? `\n\nTARGET KEYWORDS (user-supplied):\n${input.keywords.map(k => `- ${k}`).join('\n')}`
|
|
28
|
+
: '';
|
|
29
|
+
const marketNotesBlock = input.marketNotes
|
|
30
|
+
? `\n\nMARKET NOTES FROM USER:\n${input.marketNotes}`
|
|
31
|
+
: '';
|
|
32
|
+
const prompt = `You are a Senior Product Marketing Strategist and SEO expert.
|
|
33
|
+
Analyze the following product documentation and generate a complete website marketing strategy.
|
|
34
|
+
|
|
35
|
+
PRODUCT NAME: ${input.projectName}
|
|
36
|
+
|
|
37
|
+
PRODUCT DOCUMENTATION:
|
|
38
|
+
${packProductContext(input.productContext)}
|
|
39
|
+
${competitorsBlock}${keywordsBlock}${marketNotesBlock}
|
|
40
|
+
|
|
41
|
+
Generate a JSON response matching this exact structure:
|
|
42
|
+
{
|
|
43
|
+
"icp": {
|
|
44
|
+
"primaryPersona": "string - describe the ideal customer",
|
|
45
|
+
"painPoints": ["array of pain points this product solves"],
|
|
46
|
+
"goals": ["array of goals the customer has"],
|
|
47
|
+
"objections": ["array of common objections/concerns"]
|
|
48
|
+
},
|
|
49
|
+
"positioning": {
|
|
50
|
+
"category": "product category",
|
|
51
|
+
"differentiators": ["what makes this unique"],
|
|
52
|
+
"valueProposition": "one-sentence value prop",
|
|
53
|
+
"proofPoints": ["evidence that supports the value prop"]
|
|
54
|
+
},
|
|
55
|
+
"messaging": {
|
|
56
|
+
"headline": "primary H1 headline for landing page",
|
|
57
|
+
"subheadline": "supporting subheadline",
|
|
58
|
+
"elevatorPitch": "30-second pitch",
|
|
59
|
+
"longDescription": "2-3 sentence detailed description"
|
|
60
|
+
},
|
|
61
|
+
"seoStrategy": {
|
|
62
|
+
"primaryKeywords": ["3-5 primary keywords"],
|
|
63
|
+
"secondaryKeywords": ["5-8 secondary keywords"],
|
|
64
|
+
"longTailKeywords": ["5-10 long-tail keyword phrases"],
|
|
65
|
+
"titleTemplates": {"home": "title", "pricing": "title", ...},
|
|
66
|
+
"metaDescriptions": {"home": "description", "pricing": "description", ...}
|
|
67
|
+
},
|
|
68
|
+
"siteArchitecture": {
|
|
69
|
+
"pages": [
|
|
70
|
+
{
|
|
71
|
+
"path": "/",
|
|
72
|
+
"title": "Home",
|
|
73
|
+
"purpose": "primary landing and conversion",
|
|
74
|
+
"pageType": "landing",
|
|
75
|
+
"sections": ["hero", "features", "social-proof", "cta"],
|
|
76
|
+
"seoKeywords": ["keyword1"],
|
|
77
|
+
"conversionGoal": "sign up for trial"
|
|
78
|
+
}
|
|
79
|
+
],
|
|
80
|
+
"navigation": [{"label": "Home", "href": "/"}],
|
|
81
|
+
"footerSections": [{"title": "Product", "links": [{"label": "Features", "href": "/#features"}]}]
|
|
82
|
+
},
|
|
83
|
+
"conversionStrategy": {
|
|
84
|
+
"primaryCta": {"text": "Get Started", "href": "/pricing"},
|
|
85
|
+
"secondaryCta": {"text": "Learn More", "href": "/docs"},
|
|
86
|
+
"trustSignals": ["signal 1"],
|
|
87
|
+
"socialProof": ["proof point 1"],
|
|
88
|
+
"leadCapture": "webhook"
|
|
89
|
+
},
|
|
90
|
+
"competitiveContext": {
|
|
91
|
+
"category": "product category",
|
|
92
|
+
"competitors": ["only competitors from user input or clearly mentioned in docs"],
|
|
93
|
+
"differentiators": ["competitive advantages"]
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
IMPORTANT RULES:
|
|
98
|
+
1. For competitors: ONLY use competitors provided in the input or clearly mentioned in the product docs. Do NOT invent competitors you are unsure about.
|
|
99
|
+
2. For keywords: If keywords are provided, use them. Otherwise, infer from product capabilities.
|
|
100
|
+
3. Every page must have a clear conversion goal.
|
|
101
|
+
4. Headlines must be specific to the product, not generic marketing copy.
|
|
102
|
+
5. Always include at minimum: landing, pricing pages.
|
|
103
|
+
6. Site architecture should have realistic navigation and footer sections.
|
|
104
|
+
|
|
105
|
+
Respond with ONLY valid JSON, no markdown code fences or explanation.`;
|
|
106
|
+
onProgress?.('Generating website strategy via AI...');
|
|
107
|
+
const completion = await client.chat.completions.create({
|
|
108
|
+
model: 'gpt-4o',
|
|
109
|
+
messages: [{ role: 'user', content: prompt }],
|
|
110
|
+
temperature: 0.4,
|
|
111
|
+
max_tokens: 4096,
|
|
112
|
+
response_format: { type: 'json_object' },
|
|
113
|
+
});
|
|
114
|
+
const rawResponse = completion.choices[0]?.message?.content || '{}';
|
|
115
|
+
onProgress?.('Validating strategy schema...');
|
|
116
|
+
let parsed;
|
|
117
|
+
try {
|
|
118
|
+
parsed = JSON.parse(rawResponse);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
throw new Error('Strategy generation returned invalid JSON');
|
|
122
|
+
}
|
|
123
|
+
const result = WebsiteStrategySchema.safeParse(parsed);
|
|
124
|
+
if (!result.success) {
|
|
125
|
+
const issues = result.error.issues.map(i => `${i.path.join('.')}: ${i.message}`).join(', ');
|
|
126
|
+
throw new Error(`Strategy validation failed: ${issues}`);
|
|
127
|
+
}
|
|
128
|
+
const strategy = result.data;
|
|
129
|
+
const inputHash = computeInputHash(input);
|
|
130
|
+
const metadata = {
|
|
131
|
+
inputHash,
|
|
132
|
+
generatedAt: new Date().toISOString(),
|
|
133
|
+
version: 1,
|
|
134
|
+
};
|
|
135
|
+
return { strategy, metadata };
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Format strategy for injection into plan context
|
|
139
|
+
* Returns a structured text block, NOT appended to specification
|
|
140
|
+
*
|
|
141
|
+
* @param strategy - The strategy document
|
|
142
|
+
* @returns Formatted context string
|
|
143
|
+
*/
|
|
144
|
+
export function formatStrategyForPlanContext(strategy) {
|
|
145
|
+
const lines = [];
|
|
146
|
+
lines.push(`### Target Customer`);
|
|
147
|
+
lines.push(`- Persona: ${strategy.icp.primaryPersona}`);
|
|
148
|
+
lines.push(`- Pain points: ${strategy.icp.painPoints.join(', ')}`);
|
|
149
|
+
lines.push('');
|
|
150
|
+
lines.push(`### Positioning`);
|
|
151
|
+
lines.push(`- Category: ${strategy.positioning.category}`);
|
|
152
|
+
lines.push(`- Value proposition: ${strategy.positioning.valueProposition}`);
|
|
153
|
+
lines.push(`- Differentiators: ${strategy.positioning.differentiators.join(', ')}`);
|
|
154
|
+
lines.push('');
|
|
155
|
+
lines.push(`### Messaging`);
|
|
156
|
+
lines.push(`- Headline: ${strategy.messaging.headline}`);
|
|
157
|
+
lines.push(`- Subheadline: ${strategy.messaging.subheadline}`);
|
|
158
|
+
lines.push('');
|
|
159
|
+
lines.push(`### SEO Keywords`);
|
|
160
|
+
lines.push(`- Primary: ${strategy.seoStrategy.primaryKeywords.join(', ')}`);
|
|
161
|
+
lines.push(`- Secondary: ${strategy.seoStrategy.secondaryKeywords.join(', ')}`);
|
|
162
|
+
lines.push('');
|
|
163
|
+
lines.push(`### Site Architecture`);
|
|
164
|
+
for (const page of strategy.siteArchitecture.pages) {
|
|
165
|
+
lines.push(`- ${page.path} (${page.pageType}): ${page.purpose}`);
|
|
166
|
+
}
|
|
167
|
+
lines.push('');
|
|
168
|
+
lines.push(`### Conversion Strategy`);
|
|
169
|
+
lines.push(`- Primary CTA: "${strategy.conversionStrategy.primaryCta.text}" -> ${strategy.conversionStrategy.primaryCta.href}`);
|
|
170
|
+
lines.push(`- Secondary CTA: "${strategy.conversionStrategy.secondaryCta.text}" -> ${strategy.conversionStrategy.secondaryCta.href}`);
|
|
171
|
+
lines.push(`- Trust signals: ${strategy.conversionStrategy.trustSignals.join(', ')}`);
|
|
172
|
+
lines.push(`- Lead capture: ${strategy.conversionStrategy.leadCapture}`);
|
|
173
|
+
return lines.join('\n');
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Store website strategy to .popeye/ directory
|
|
177
|
+
*
|
|
178
|
+
* @param projectDir - Project directory (contains .popeye/)
|
|
179
|
+
* @param strategy - Strategy document
|
|
180
|
+
* @param metadata - Strategy metadata
|
|
181
|
+
*/
|
|
182
|
+
export async function storeWebsiteStrategy(projectDir, strategy, metadata) {
|
|
183
|
+
const popeyeDir = path.join(projectDir, '.popeye');
|
|
184
|
+
await fs.mkdir(popeyeDir, { recursive: true });
|
|
185
|
+
const filePath = path.join(popeyeDir, STRATEGY_FILE);
|
|
186
|
+
const content = JSON.stringify({ strategy, metadata }, null, 2);
|
|
187
|
+
await fs.writeFile(filePath, content, 'utf-8');
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Load website strategy from .popeye/ directory
|
|
191
|
+
*
|
|
192
|
+
* @param projectDir - Project directory
|
|
193
|
+
* @returns Strategy and metadata, or null if not found
|
|
194
|
+
*/
|
|
195
|
+
export async function loadWebsiteStrategy(projectDir) {
|
|
196
|
+
const filePath = path.join(projectDir, '.popeye', STRATEGY_FILE);
|
|
197
|
+
try {
|
|
198
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
199
|
+
const parsed = JSON.parse(content);
|
|
200
|
+
const strategyResult = WebsiteStrategySchema.safeParse(parsed.strategy);
|
|
201
|
+
if (!strategyResult.success)
|
|
202
|
+
return null;
|
|
203
|
+
return {
|
|
204
|
+
strategy: strategyResult.data,
|
|
205
|
+
metadata: parsed.metadata,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Check if a stored strategy is stale by comparing input hashes
|
|
214
|
+
*
|
|
215
|
+
* @param projectDir - Project directory
|
|
216
|
+
* @param currentInput - Current strategy input
|
|
217
|
+
* @returns True if strategy is stale or missing
|
|
218
|
+
*/
|
|
219
|
+
export async function isStrategyStale(projectDir, currentInput) {
|
|
220
|
+
const stored = await loadWebsiteStrategy(projectDir);
|
|
221
|
+
if (!stored)
|
|
222
|
+
return true;
|
|
223
|
+
const currentHash = computeInputHash(currentInput);
|
|
224
|
+
return stored.metadata.inputHash !== currentHash;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Pack product context into a budget with priority-based ordering
|
|
228
|
+
* Ensures high-priority docs (spec, pricing, brand) are included first
|
|
229
|
+
*
|
|
230
|
+
* @param productContext - Raw concatenated docs with "--- filename ---" headers
|
|
231
|
+
* @param budget - Maximum character budget (default 16000)
|
|
232
|
+
* @returns Packed context string within budget
|
|
233
|
+
*/
|
|
234
|
+
export function packProductContext(productContext, budget = 16000) {
|
|
235
|
+
// Split by doc headers (--- filename ---)
|
|
236
|
+
const headerPattern = /^---\s+(.+?)\s+---$/gm;
|
|
237
|
+
const sections = [];
|
|
238
|
+
let lastIndex = 0;
|
|
239
|
+
let lastHeader = '';
|
|
240
|
+
let match;
|
|
241
|
+
while ((match = headerPattern.exec(productContext)) !== null) {
|
|
242
|
+
if (lastIndex > 0) {
|
|
243
|
+
sections.push({
|
|
244
|
+
header: lastHeader,
|
|
245
|
+
content: productContext.slice(lastIndex, match.index).trim(),
|
|
246
|
+
priority: getDocSortPriority(lastHeader),
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
lastHeader = match[0];
|
|
250
|
+
lastIndex = match.index + match[0].length;
|
|
251
|
+
}
|
|
252
|
+
// Push the last section
|
|
253
|
+
if (lastIndex > 0 && lastIndex < productContext.length) {
|
|
254
|
+
sections.push({
|
|
255
|
+
header: lastHeader,
|
|
256
|
+
content: productContext.slice(lastIndex).trim(),
|
|
257
|
+
priority: getDocSortPriority(lastHeader),
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
// If no headers found, return the raw context trimmed to budget
|
|
261
|
+
if (sections.length === 0) {
|
|
262
|
+
return productContext.slice(0, budget);
|
|
263
|
+
}
|
|
264
|
+
// Sort by priority (lower = more important)
|
|
265
|
+
sections.sort((a, b) => a.priority - b.priority);
|
|
266
|
+
// Pack into budget
|
|
267
|
+
let packed = '';
|
|
268
|
+
for (const section of sections) {
|
|
269
|
+
const block = `${section.header}\n${section.content}\n\n`;
|
|
270
|
+
if (packed.length + block.length <= budget) {
|
|
271
|
+
packed += block;
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
const remaining = budget - packed.length;
|
|
275
|
+
if (remaining > 200) {
|
|
276
|
+
packed += `${section.header}\n${section.content.slice(0, remaining - section.header.length - 10)}...\n`;
|
|
277
|
+
}
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return packed.trim();
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Get sort priority for a doc section header (lower = higher priority)
|
|
285
|
+
*/
|
|
286
|
+
function getDocSortPriority(header) {
|
|
287
|
+
const lower = header.toLowerCase();
|
|
288
|
+
if (/spec/i.test(lower))
|
|
289
|
+
return 1;
|
|
290
|
+
if (/pricing/i.test(lower))
|
|
291
|
+
return 2;
|
|
292
|
+
if (/color|brand/i.test(lower))
|
|
293
|
+
return 3;
|
|
294
|
+
if (/feature/i.test(lower))
|
|
295
|
+
return 4;
|
|
296
|
+
return 5;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Compute SHA-256 hash of strategy inputs for staleness detection
|
|
300
|
+
*/
|
|
301
|
+
function computeInputHash(input) {
|
|
302
|
+
const data = [
|
|
303
|
+
input.productContext,
|
|
304
|
+
input.projectName,
|
|
305
|
+
(input.competitors || []).sort().join(','),
|
|
306
|
+
(input.keywords || []).sort().join(','),
|
|
307
|
+
].join('|');
|
|
308
|
+
return createHash('sha256').update(data).digest('hex');
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=website-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"website-strategy.js","sourceRoot":"","sources":["../../src/workflow/website-strategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Website content updater
|
|
3
|
+
* Refreshes website template content after plan mode succeeds,
|
|
4
|
+
* using the expanded specification and discovered user docs
|
|
5
|
+
*/
|
|
6
|
+
import type { ProjectState } from '../types/workflow.js';
|
|
7
|
+
import type { OutputLanguage } from '../types/project.js';
|
|
8
|
+
/**
|
|
9
|
+
* Update website content files with project context after plan mode
|
|
10
|
+
*
|
|
11
|
+
* @param projectDir - The project directory
|
|
12
|
+
* @param state - Current project state (with specification, userDocs, brandContext)
|
|
13
|
+
* @param language - Project language type
|
|
14
|
+
* @param onProgress - Optional progress callback
|
|
15
|
+
*/
|
|
16
|
+
export declare function updateWebsiteContent(projectDir: string, state: ProjectState, language: OutputLanguage, onProgress?: (message: string) => void): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=website-updater.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"website-updater.d.ts","sourceRoot":"","sources":["../../src/workflow/website-updater.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAgB1D;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,cAAc,EACxB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,IAAI,CAAC,CAuGf"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Website content updater
|
|
3
|
+
* Refreshes website template content after plan mode succeeds,
|
|
4
|
+
* using the expanded specification and discovered user docs
|
|
5
|
+
*/
|
|
6
|
+
import { promises as fs } from 'node:fs';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import { isWorkspace } from '../types/project.js';
|
|
9
|
+
import { buildWebsiteContext, resolveBrandAssets, validateWebsiteContext } from '../generators/website-context.js';
|
|
10
|
+
import { resolveWorkspaceRoot } from '../generators/workspace-root.js';
|
|
11
|
+
import { generateWebsiteLandingPage } from '../generators/templates/website-landing.js';
|
|
12
|
+
import { generateWebsitePricingPage } from '../generators/templates/website-pricing.js';
|
|
13
|
+
import { generateWebsiteLayout, generateWebsiteGlobalsCss, } from '../generators/templates/website-layout.js';
|
|
14
|
+
import { generateWebsiteHeader, generateWebsiteFooter, } from '../generators/templates/website-components.js';
|
|
15
|
+
import { loadWebsiteStrategy } from './website-strategy.js';
|
|
16
|
+
/**
|
|
17
|
+
* Update website content files with project context after plan mode
|
|
18
|
+
*
|
|
19
|
+
* @param projectDir - The project directory
|
|
20
|
+
* @param state - Current project state (with specification, userDocs, brandContext)
|
|
21
|
+
* @param language - Project language type
|
|
22
|
+
* @param onProgress - Optional progress callback
|
|
23
|
+
*/
|
|
24
|
+
export async function updateWebsiteContent(projectDir, state, language, onProgress) {
|
|
25
|
+
// Determine website directory based on project type
|
|
26
|
+
const websiteDir = isWorkspace(language)
|
|
27
|
+
? path.join(projectDir, 'apps', 'website')
|
|
28
|
+
: projectDir;
|
|
29
|
+
// Check if website directory exists
|
|
30
|
+
try {
|
|
31
|
+
await fs.access(websiteDir);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
onProgress?.('Website directory not found, skipping content update');
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// Build content context from user docs and specification
|
|
38
|
+
const parentDir = path.dirname(projectDir);
|
|
39
|
+
const context = await buildWebsiteContext(parentDir, state.name, state.specification);
|
|
40
|
+
// Apply brand context from state if available
|
|
41
|
+
if (state.brandContext?.primaryColor) {
|
|
42
|
+
context.brand = {
|
|
43
|
+
...context.brand,
|
|
44
|
+
primaryColor: state.brandContext.primaryColor,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
if (state.brandContext?.logoPath) {
|
|
48
|
+
context.brand = {
|
|
49
|
+
...context.brand,
|
|
50
|
+
logoPath: state.brandContext.logoPath,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// Resolve brand assets using workspace root for proper logo resolution
|
|
54
|
+
const workspaceRoot = await resolveWorkspaceRoot(parentDir);
|
|
55
|
+
context.brandAssets = await resolveBrandAssets(workspaceRoot, context.brand);
|
|
56
|
+
// Load website strategy if available
|
|
57
|
+
const strategyData = await loadWebsiteStrategy(projectDir);
|
|
58
|
+
if (strategyData) {
|
|
59
|
+
context.strategy = strategyData.strategy;
|
|
60
|
+
onProgress?.('Loaded website strategy for content update');
|
|
61
|
+
}
|
|
62
|
+
// Soft validation: report quality issues via progress callback
|
|
63
|
+
const validation = validateWebsiteContext(context, state.name);
|
|
64
|
+
for (const msg of [...validation.issues, ...validation.warnings]) {
|
|
65
|
+
onProgress?.(`[quality-gate] ${msg}`);
|
|
66
|
+
}
|
|
67
|
+
onProgress?.('Updating website content with project context...');
|
|
68
|
+
// Re-generate content files
|
|
69
|
+
const updates = [
|
|
70
|
+
{
|
|
71
|
+
path: path.join(websiteDir, 'src', 'app', 'page.tsx'),
|
|
72
|
+
content: generateWebsiteLandingPage(state.name, context),
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
path: path.join(websiteDir, 'src', 'app', 'pricing', 'page.tsx'),
|
|
76
|
+
content: generateWebsitePricingPage(state.name, context),
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
path: path.join(websiteDir, 'src', 'app', 'layout.tsx'),
|
|
80
|
+
content: generateWebsiteLayout(state.name, context),
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
path: path.join(websiteDir, 'src', 'app', 'globals.css'),
|
|
84
|
+
content: generateWebsiteGlobalsCss(context),
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
path: path.join(websiteDir, 'src', 'components', 'Header.tsx'),
|
|
88
|
+
content: generateWebsiteHeader(state.name, context, context.strategy),
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
path: path.join(websiteDir, 'src', 'components', 'Footer.tsx'),
|
|
92
|
+
content: generateWebsiteFooter(state.name, context, context.strategy),
|
|
93
|
+
},
|
|
94
|
+
];
|
|
95
|
+
for (const update of updates) {
|
|
96
|
+
try {
|
|
97
|
+
await fs.writeFile(update.path, update.content, 'utf-8');
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// Non-blocking: individual file update failures should not stop the workflow
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Copy logo to public/brand/ if brand context has one
|
|
104
|
+
if (context.brand?.logoPath) {
|
|
105
|
+
try {
|
|
106
|
+
const logoExt = path.extname(context.brand.logoPath);
|
|
107
|
+
const destPath = path.join(websiteDir, 'public', 'brand', `logo${logoExt}`);
|
|
108
|
+
await fs.copyFile(context.brand.logoPath, destPath);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// Non-blocking
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
onProgress?.('Website content updated with project context');
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=website-updater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"website-updater.js","sourceRoot":"","sources":["../../src/workflow/website-updater.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,7 @@ export type LogLevel = 'info' | 'warn' | 'error' | 'success' | 'debug';
|
|
|
20
20
|
/**
|
|
21
21
|
* Workflow stages for categorization
|
|
22
22
|
*/
|
|
23
|
-
export type WorkflowStage = 'init' | 'plan-generation' | 'plan-parsing' | 'consensus' | 'arbitration' | 'execution' | 'task' | 'milestone' | 'testing' | 'verification' | 'ui-design' | 'ui-setup' | 'completion';
|
|
23
|
+
export type WorkflowStage = 'init' | 'plan-generation' | 'plan-parsing' | 'consensus' | 'arbitration' | 'execution' | 'task' | 'milestone' | 'testing' | 'verification' | 'ui-design' | 'ui-setup' | 'website-strategy' | 'completion';
|
|
24
24
|
/**
|
|
25
25
|
* Workflow logger class that persists logs to the project's docs folder
|
|
26
26
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-logger.d.ts","sourceRoot":"","sources":["../../src/workflow/workflow-logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,EAAE,QAAQ,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAEvE;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,iBAAiB,GACjB,cAAc,GACd,WAAW,GACX,aAAa,GACb,WAAW,GACX,MAAM,GACN,WAAW,GACX,SAAS,GACT,cAAc,GACd,WAAW,GACX,UAAU,GACV,YAAY,CAAC;AAEjB;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,WAAW,CAAkB;gBAEzB,UAAU,EAAE,MAAM;IAK9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBjC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAoCxB;;OAEG;IACG,GAAG,CACP,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,KAAK,GAAE,QAAiB,GACvB,OAAO,CAAC,IAAI,CAAC;IAgBhB;;OAEG;IACG,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/G;;OAEG;IACG,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/G;;OAEG;IACG,KAAK,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhH;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlH;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1G;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7G;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1H;;OAEG;YACW,OAAO;IASrB;;OAEG;IACH,OAAO,CAAC,cAAc;IA6DtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAepB;;OAEG;IACH,UAAU,IAAI,QAAQ,EAAE;IAIxB;;OAEG;IACH,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,QAAQ,EAAE;IAIpD;;OAEG;IACH,SAAS,IAAI,QAAQ,EAAE;IAIvB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B;AAOD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,CAQpE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,KAAK,GAAE,QAAiB,GACvB,OAAO,CAAC,IAAI,CAAC,CAGf"}
|
|
1
|
+
{"version":3,"file":"workflow-logger.d.ts","sourceRoot":"","sources":["../../src/workflow/workflow-logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-logger.js","sourceRoot":"","sources":["../../src/workflow/workflow-logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"workflow-logger.js","sourceRoot":"","sources":["../../src/workflow/workflow-logger.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/adapters/gemini.ts
CHANGED
|
@@ -45,18 +45,19 @@ export async function createClient(): Promise<GoogleGenerativeAI> {
|
|
|
45
45
|
export async function requestConsensus(
|
|
46
46
|
plan: string,
|
|
47
47
|
context: string,
|
|
48
|
-
config: { model?: GeminiModel; temperature?: number; maxTokens?: number } = {}
|
|
48
|
+
config: { model?: GeminiModel; temperature?: number; maxTokens?: number; reviewerPersona?: string } = {}
|
|
49
49
|
): Promise<ConsensusResult> {
|
|
50
50
|
const {
|
|
51
51
|
model = DEFAULT_GEMINI_CONFIG.model,
|
|
52
52
|
temperature = DEFAULT_GEMINI_CONFIG.temperature,
|
|
53
53
|
maxTokens = DEFAULT_GEMINI_CONFIG.maxTokens,
|
|
54
|
+
reviewerPersona,
|
|
54
55
|
} = config;
|
|
55
56
|
|
|
56
57
|
const client = await createClient();
|
|
57
58
|
const generativeModel = client.getGenerativeModel({ model });
|
|
58
59
|
|
|
59
|
-
const prompt = buildConsensusPrompt(plan, context);
|
|
60
|
+
const prompt = buildConsensusPrompt(plan, context, reviewerPersona);
|
|
60
61
|
|
|
61
62
|
try {
|
|
62
63
|
const result = await generativeModel.generateContent({
|
|
@@ -116,9 +117,14 @@ export async function requestArbitration(
|
|
|
116
117
|
|
|
117
118
|
/**
|
|
118
119
|
* Build the consensus review prompt
|
|
120
|
+
*
|
|
121
|
+
* @param plan - The plan to review
|
|
122
|
+
* @param context - Project context
|
|
123
|
+
* @param persona - Optional custom reviewer persona
|
|
119
124
|
*/
|
|
120
|
-
function buildConsensusPrompt(plan: string, context: string): string {
|
|
121
|
-
|
|
125
|
+
function buildConsensusPrompt(plan: string, context: string, persona?: string): string {
|
|
126
|
+
const reviewerRole = persona || 'a senior software architect';
|
|
127
|
+
return `You are ${reviewerRole} reviewing a development plan.
|
|
122
128
|
Analyze the following plan for completeness, correctness, and feasibility.
|
|
123
129
|
|
|
124
130
|
PROJECT CONTEXT:
|
package/src/adapters/grok.ts
CHANGED
|
@@ -47,16 +47,17 @@ export async function createClient(): Promise<OpenAI> {
|
|
|
47
47
|
export async function requestConsensus(
|
|
48
48
|
plan: string,
|
|
49
49
|
context: string,
|
|
50
|
-
config: { model?: string; temperature?: number; maxTokens?: number } = {}
|
|
50
|
+
config: { model?: string; temperature?: number; maxTokens?: number; reviewerPersona?: string } = {}
|
|
51
51
|
): Promise<ConsensusResult> {
|
|
52
52
|
const {
|
|
53
53
|
model = DEFAULT_GROK_CONFIG.model,
|
|
54
54
|
temperature = DEFAULT_GROK_CONFIG.temperature,
|
|
55
55
|
maxTokens = DEFAULT_GROK_CONFIG.maxTokens,
|
|
56
|
+
reviewerPersona,
|
|
56
57
|
} = config;
|
|
57
58
|
|
|
58
59
|
const client = await createClient();
|
|
59
|
-
const prompt = buildConsensusPrompt(plan, context);
|
|
60
|
+
const prompt = buildConsensusPrompt(plan, context, reviewerPersona);
|
|
60
61
|
|
|
61
62
|
try {
|
|
62
63
|
const completion = await client.chat.completions.create({
|
|
@@ -116,9 +117,14 @@ export async function requestArbitration(
|
|
|
116
117
|
|
|
117
118
|
/**
|
|
118
119
|
* Build the consensus review prompt
|
|
120
|
+
*
|
|
121
|
+
* @param plan - The plan to review
|
|
122
|
+
* @param context - Project context
|
|
123
|
+
* @param persona - Optional custom reviewer persona
|
|
119
124
|
*/
|
|
120
|
-
function buildConsensusPrompt(plan: string, context: string): string {
|
|
121
|
-
|
|
125
|
+
function buildConsensusPrompt(plan: string, context: string, persona?: string): string {
|
|
126
|
+
const reviewerRole = persona || 'a senior software architect';
|
|
127
|
+
return `You are ${reviewerRole} reviewing a development plan.
|
|
122
128
|
Analyze the following plan for completeness, correctness, and feasibility.
|
|
123
129
|
|
|
124
130
|
PROJECT CONTEXT:
|