codebakers 2.0.1 → 2.0.3

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codebakers",
3
- "version": "2.0.1",
3
+ "version": "2.0.3",
4
4
  "description": "AI dev team that follows the rules. Build apps from anywhere with pattern enforcement.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -0,0 +1,699 @@
1
+ import * as p from '@clack/prompts';
2
+ import chalk from 'chalk';
3
+ import * as fs from 'fs-extra';
4
+ import * as path from 'path';
5
+ import Anthropic from '@anthropic-ai/sdk';
6
+ import { Config } from '../utils/config.js';
7
+
8
+ interface ProjectBrief {
9
+ name: string;
10
+ idea: string;
11
+ targetAudience: string;
12
+ problem: string;
13
+ solution: string;
14
+ competitors: string;
15
+ monetization: string;
16
+ timeline: string;
17
+ budget: string;
18
+ techPreferences: string;
19
+ }
20
+
21
+ interface AdvisorFeedback {
22
+ advisor: string;
23
+ role: string;
24
+ icon: string;
25
+ feedback: string;
26
+ recommendations: string[];
27
+ questions: string[];
28
+ risks: string[];
29
+ score: number;
30
+ }
31
+
32
+ interface DreamTeamReport {
33
+ projectName: string;
34
+ brief: ProjectBrief;
35
+ advisorFeedback: AdvisorFeedback[];
36
+ overallScore: number;
37
+ goNoGo: 'GO' | 'CAUTION' | 'PIVOT';
38
+ executiveSummary: string;
39
+ marketingPlan: {
40
+ positioning: string;
41
+ targetSegments: string[];
42
+ channels: string[];
43
+ launchStrategy: string;
44
+ contentPlan: string[];
45
+ socialMediaPlan: {
46
+ platforms: string[];
47
+ postFrequency: string;
48
+ contentTypes: string[];
49
+ };
50
+ budget: string;
51
+ };
52
+ technicalPlan: {
53
+ architecture: string;
54
+ stack: string[];
55
+ phases: Array<{ name: string; duration: string; deliverables: string[] }>;
56
+ mvpFeatures: string[];
57
+ futureFeatures: string[];
58
+ };
59
+ uxPlan: {
60
+ userPersonas: Array<{ name: string; description: string; goals: string[] }>;
61
+ userJourneys: string[];
62
+ keyScreens: string[];
63
+ designPrinciples: string[];
64
+ };
65
+ businessPlan: {
66
+ revenueModel: string;
67
+ pricing: string;
68
+ projections: { month: number; users: number; revenue: number }[];
69
+ kpis: string[];
70
+ risks: Array<{ risk: string; mitigation: string }>;
71
+ };
72
+ actionItems: Array<{ priority: 'HIGH' | 'MEDIUM' | 'LOW'; task: string; owner: string }>;
73
+ }
74
+
75
+ const DREAM_TEAM = [
76
+ {
77
+ name: 'Sarah Chen',
78
+ role: 'CEO & Strategist',
79
+ icon: '👩‍💼',
80
+ expertise: 'Business strategy, market positioning, fundraising, go-to-market',
81
+ personality: 'Direct, strategic thinker, asks hard questions about market fit and business viability',
82
+ },
83
+ {
84
+ name: 'Marcus Johnson',
85
+ role: 'Full Stack Engineer',
86
+ icon: '👨‍💻',
87
+ expertise: 'System architecture, scalability, tech stack selection, development timeline',
88
+ personality: 'Pragmatic, focused on what can actually be built, warns about technical debt',
89
+ },
90
+ {
91
+ name: 'Elena Rodriguez',
92
+ role: 'UX/UI Specialist',
93
+ icon: '👩‍🎨',
94
+ expertise: 'User research, interface design, user journeys, accessibility, design systems',
95
+ personality: 'User-obsessed, pushes back on features that hurt UX, advocates for simplicity',
96
+ },
97
+ {
98
+ name: 'David Park',
99
+ role: 'Marketing Director',
100
+ icon: '📣',
101
+ expertise: 'Growth strategy, content marketing, social media, brand positioning, launch campaigns',
102
+ personality: 'Creative, data-driven, thinks about virality and word-of-mouth',
103
+ },
104
+ {
105
+ name: 'Aisha Patel',
106
+ role: 'Product Manager',
107
+ icon: '📋',
108
+ expertise: 'Feature prioritization, roadmaps, user stories, MVP scoping, competitive analysis',
109
+ personality: 'Organized, balances user needs with business goals, ruthless prioritizer',
110
+ },
111
+ ];
112
+
113
+ export async function advisorsCommand(): Promise<void> {
114
+ const config = new Config();
115
+
116
+ if (!config.isConfigured()) {
117
+ p.log.error('Please run `codebakers setup` first.');
118
+ return;
119
+ }
120
+
121
+ const anthropicCreds = config.getCredentials('anthropic');
122
+ if (!anthropicCreds?.apiKey) {
123
+ p.log.error('Anthropic API key not configured.');
124
+ return;
125
+ }
126
+
127
+ console.log(chalk.cyan(`
128
+ ╭─────────────────────────────────────────────────────────────────╮
129
+ │ │
130
+ │ 🌟 CODEBAKERS DREAM TEAM ADVISORS 🌟 │
131
+ │ │
132
+ │ Meet your advisory board: │
133
+ │ │
134
+ │ 👩‍💼 Sarah Chen - CEO & Strategist │
135
+ │ 👨‍💻 Marcus Johnson - Full Stack Engineer │
136
+ │ 👩‍🎨 Elena Rodriguez - UX/UI Specialist │
137
+ │ 📣 David Park - Marketing Director │
138
+ │ 📋 Aisha Patel - Product Manager │
139
+ │ │
140
+ │ They'll interview you about your project, provide expert │
141
+ │ feedback, and create a comprehensive plan including: │
142
+ │ │
143
+ │ • Technical architecture & implementation plan │
144
+ │ • Marketing & social media strategy │
145
+ │ • UX/UI recommendations & user journeys │
146
+ │ • Business model & revenue projections │
147
+ │ • Risk assessment & mitigation strategies │
148
+ │ • Prioritized action items │
149
+ │ │
150
+ │ 📄 You'll receive a complete PDF report at the end. │
151
+ │ │
152
+ ╰─────────────────────────────────────────────────────────────────╯
153
+ `));
154
+
155
+ const start = await p.confirm({
156
+ message: 'Ready to meet the Dream Team?',
157
+ initialValue: true,
158
+ });
159
+
160
+ if (!start || p.isCancel(start)) {
161
+ p.cancel('Maybe next time!');
162
+ return;
163
+ }
164
+
165
+ // Collect project brief through interview
166
+ const brief = await conductInterview();
167
+ if (!brief) return;
168
+
169
+ const anthropic = new Anthropic({ apiKey: anthropicCreds.apiKey });
170
+
171
+ // Get feedback from each advisor
172
+ console.log(chalk.bold('\n\n🎯 The Dream Team is reviewing your project...\n'));
173
+
174
+ const advisorFeedback: AdvisorFeedback[] = [];
175
+
176
+ for (const advisor of DREAM_TEAM) {
177
+ const spinner = p.spinner();
178
+ spinner.start(`${advisor.icon} ${advisor.name} is analyzing...`);
179
+
180
+ const feedback = await getAdvisorFeedback(anthropic, advisor, brief);
181
+ advisorFeedback.push(feedback);
182
+
183
+ spinner.stop(`${advisor.icon} ${advisor.name} complete`);
184
+
185
+ // Show quick summary
186
+ console.log(chalk.dim(` Score: ${feedback.score}/10 - "${feedback.feedback.slice(0, 80)}..."\n`));
187
+ }
188
+
189
+ // Generate comprehensive report
190
+ const spinner = p.spinner();
191
+ spinner.start('Generating comprehensive report...');
192
+
193
+ const report = await generateReport(anthropic, brief, advisorFeedback);
194
+
195
+ spinner.stop('Report generated');
196
+
197
+ // Display summary
198
+ displayReportSummary(report);
199
+
200
+ // Save report
201
+ const savePath = await saveReport(report, brief.name);
202
+
203
+ p.outro(chalk.green(`
204
+ ✓ Dream Team consultation complete!
205
+
206
+ 📄 Full report saved to: ${savePath}
207
+
208
+ ${chalk.bold('Next steps:')}
209
+ ${chalk.cyan(`codebakers prd ${savePath.replace('.pdf', '.md')}`)} - Build from this plan
210
+ ${chalk.cyan('codebakers init')} - Start with standard setup
211
+ `));
212
+ }
213
+
214
+ async function conductInterview(): Promise<ProjectBrief | null> {
215
+ p.intro(chalk.bgMagenta.white(' Project Interview '));
216
+
217
+ console.log(chalk.dim('\nLet\'s learn about your project. Answer as thoroughly as you can.\n'));
218
+
219
+ const name = await p.text({
220
+ message: '👩‍💼 Sarah: What\'s your project called?',
221
+ placeholder: 'My App Name',
222
+ validate: (v) => !v ? 'Project name is required' : undefined,
223
+ });
224
+ if (p.isCancel(name)) return null;
225
+
226
+ const idea = await p.text({
227
+ message: '👩‍💼 Sarah: Describe your idea in 2-3 sentences. What does it do?',
228
+ placeholder: 'A platform that helps...',
229
+ validate: (v) => !v ? 'Please describe your idea' : undefined,
230
+ });
231
+ if (p.isCancel(idea)) return null;
232
+
233
+ const problem = await p.text({
234
+ message: '📋 Aisha: What problem are you solving? Why does this need to exist?',
235
+ placeholder: 'Currently, people struggle with...',
236
+ validate: (v) => !v ? 'Understanding the problem is crucial' : undefined,
237
+ });
238
+ if (p.isCancel(problem)) return null;
239
+
240
+ const targetAudience = await p.text({
241
+ message: '📣 David: Who is this for? Describe your ideal user.',
242
+ placeholder: 'Small business owners who...',
243
+ validate: (v) => !v ? 'We need to know your target audience' : undefined,
244
+ });
245
+ if (p.isCancel(targetAudience)) return null;
246
+
247
+ const solution = await p.text({
248
+ message: '👩‍🎨 Elena: How does your product solve the problem? What\'s the core experience?',
249
+ placeholder: 'Users can easily...',
250
+ validate: (v) => !v ? 'Please describe your solution' : undefined,
251
+ });
252
+ if (p.isCancel(solution)) return null;
253
+
254
+ const competitors = await p.text({
255
+ message: '👩‍💼 Sarah: Who are your competitors? How are you different?',
256
+ placeholder: 'Competitor X does Y, but we...',
257
+ });
258
+ if (p.isCancel(competitors)) return null;
259
+
260
+ const monetization = await p.select({
261
+ message: '👩‍💼 Sarah: How will you make money?',
262
+ options: [
263
+ { value: 'subscription', label: 'Subscription (monthly/yearly)' },
264
+ { value: 'freemium', label: 'Freemium (free tier + paid)' },
265
+ { value: 'one-time', label: 'One-time purchase' },
266
+ { value: 'marketplace', label: 'Marketplace (take a cut)' },
267
+ { value: 'ads', label: 'Advertising' },
268
+ { value: 'enterprise', label: 'Enterprise sales' },
269
+ { value: 'unsure', label: 'Not sure yet' },
270
+ ],
271
+ });
272
+ if (p.isCancel(monetization)) return null;
273
+
274
+ const timeline = await p.select({
275
+ message: '👨‍💻 Marcus: What\'s your timeline for launching?',
276
+ options: [
277
+ { value: '2-weeks', label: '2 weeks (MVP)' },
278
+ { value: '1-month', label: '1 month' },
279
+ { value: '3-months', label: '3 months' },
280
+ { value: '6-months', label: '6 months' },
281
+ { value: 'flexible', label: 'Flexible / No rush' },
282
+ ],
283
+ });
284
+ if (p.isCancel(timeline)) return null;
285
+
286
+ const budget = await p.select({
287
+ message: '👩‍💼 Sarah: What\'s your budget for this project?',
288
+ options: [
289
+ { value: 'bootstrap', label: 'Bootstrap ($0 - using free tiers)' },
290
+ { value: 'small', label: 'Small ($100-500/month)' },
291
+ { value: 'medium', label: 'Medium ($500-2000/month)' },
292
+ { value: 'funded', label: 'Funded ($2000+/month)' },
293
+ ],
294
+ });
295
+ if (p.isCancel(budget)) return null;
296
+
297
+ const techPreferences = await p.text({
298
+ message: '👨‍💻 Marcus: Any tech preferences or requirements? (or "none")',
299
+ placeholder: 'Must use React, need mobile app, etc.',
300
+ initialValue: 'none',
301
+ });
302
+ if (p.isCancel(techPreferences)) return null;
303
+
304
+ // Any additional context
305
+ const additional = await p.text({
306
+ message: '📋 Aisha: Anything else we should know?',
307
+ placeholder: 'Optional: special requirements, existing users, etc.',
308
+ });
309
+ if (p.isCancel(additional)) return null;
310
+
311
+ return {
312
+ name: name as string,
313
+ idea: idea as string,
314
+ targetAudience: targetAudience as string,
315
+ problem: problem as string,
316
+ solution: solution as string,
317
+ competitors: (competitors as string) || 'Not specified',
318
+ monetization: monetization as string,
319
+ timeline: timeline as string,
320
+ budget: budget as string,
321
+ techPreferences: (techPreferences as string) || 'none',
322
+ };
323
+ }
324
+
325
+ async function getAdvisorFeedback(
326
+ anthropic: Anthropic,
327
+ advisor: typeof DREAM_TEAM[0],
328
+ brief: ProjectBrief
329
+ ): Promise<AdvisorFeedback> {
330
+ const response = await anthropic.messages.create({
331
+ model: 'claude-sonnet-4-20250514',
332
+ max_tokens: 2048,
333
+ messages: [{
334
+ role: 'user',
335
+ content: `You are ${advisor.name}, ${advisor.role} on a startup advisory board.
336
+
337
+ Your expertise: ${advisor.expertise}
338
+ Your personality: ${advisor.personality}
339
+
340
+ Review this project brief and provide your expert feedback:
341
+
342
+ Project: ${brief.name}
343
+ Idea: ${brief.idea}
344
+ Problem: ${brief.problem}
345
+ Target Audience: ${brief.targetAudience}
346
+ Solution: ${brief.solution}
347
+ Competitors: ${brief.competitors}
348
+ Monetization: ${brief.monetization}
349
+ Timeline: ${brief.timeline}
350
+ Budget: ${brief.budget}
351
+ Tech Preferences: ${brief.techPreferences}
352
+
353
+ Respond with JSON only:
354
+ {
355
+ "feedback": "2-3 sentence overall assessment in your voice/personality",
356
+ "recommendations": ["specific recommendation 1", "recommendation 2", "recommendation 3"],
357
+ "questions": ["question you'd want answered", "another question"],
358
+ "risks": ["risk 1", "risk 2"],
359
+ "score": 7
360
+ }
361
+
362
+ Score 1-10 based on your area of expertise. Be honest but constructive.`
363
+ }],
364
+ });
365
+
366
+ const text = response.content[0].type === 'text' ? response.content[0].text : '';
367
+ const jsonMatch = text.match(/\{[\s\S]*\}/);
368
+
369
+ if (!jsonMatch) {
370
+ return {
371
+ advisor: advisor.name,
372
+ role: advisor.role,
373
+ icon: advisor.icon,
374
+ feedback: 'Unable to generate feedback',
375
+ recommendations: [],
376
+ questions: [],
377
+ risks: [],
378
+ score: 5,
379
+ };
380
+ }
381
+
382
+ const parsed = JSON.parse(jsonMatch[0]);
383
+
384
+ return {
385
+ advisor: advisor.name,
386
+ role: advisor.role,
387
+ icon: advisor.icon,
388
+ ...parsed,
389
+ };
390
+ }
391
+
392
+ async function generateReport(
393
+ anthropic: Anthropic,
394
+ brief: ProjectBrief,
395
+ advisorFeedback: AdvisorFeedback[]
396
+ ): Promise<DreamTeamReport> {
397
+ const avgScore = advisorFeedback.reduce((sum, f) => sum + f.score, 0) / advisorFeedback.length;
398
+
399
+ const response = await anthropic.messages.create({
400
+ model: 'claude-sonnet-4-20250514',
401
+ max_tokens: 8192,
402
+ messages: [{
403
+ role: 'user',
404
+ content: `Generate a comprehensive startup plan based on this project brief and advisor feedback.
405
+
406
+ PROJECT BRIEF:
407
+ ${JSON.stringify(brief, null, 2)}
408
+
409
+ ADVISOR FEEDBACK:
410
+ ${JSON.stringify(advisorFeedback, null, 2)}
411
+
412
+ Generate a complete JSON report:
413
+ {
414
+ "executiveSummary": "3-4 paragraph executive summary",
415
+ "goNoGo": "GO" or "CAUTION" or "PIVOT",
416
+ "marketingPlan": {
417
+ "positioning": "positioning statement",
418
+ "targetSegments": ["segment 1", "segment 2"],
419
+ "channels": ["channel 1", "channel 2"],
420
+ "launchStrategy": "detailed launch strategy",
421
+ "contentPlan": ["content idea 1", "content idea 2"],
422
+ "socialMediaPlan": {
423
+ "platforms": ["platform 1", "platform 2"],
424
+ "postFrequency": "frequency",
425
+ "contentTypes": ["type 1", "type 2"]
426
+ },
427
+ "budget": "recommended budget breakdown"
428
+ },
429
+ "technicalPlan": {
430
+ "architecture": "high-level architecture description",
431
+ "stack": ["Next.js", "Supabase", "etc"],
432
+ "phases": [
433
+ {"name": "Phase 1: MVP", "duration": "2 weeks", "deliverables": ["feature 1", "feature 2"]}
434
+ ],
435
+ "mvpFeatures": ["feature 1", "feature 2"],
436
+ "futureFeatures": ["feature 1", "feature 2"]
437
+ },
438
+ "uxPlan": {
439
+ "userPersonas": [{"name": "Persona Name", "description": "desc", "goals": ["goal 1"]}],
440
+ "userJourneys": ["journey 1", "journey 2"],
441
+ "keyScreens": ["screen 1", "screen 2"],
442
+ "designPrinciples": ["principle 1", "principle 2"]
443
+ },
444
+ "businessPlan": {
445
+ "revenueModel": "detailed revenue model",
446
+ "pricing": "pricing strategy",
447
+ "projections": [{"month": 3, "users": 100, "revenue": 500}],
448
+ "kpis": ["kpi 1", "kpi 2"],
449
+ "risks": [{"risk": "risk description", "mitigation": "how to mitigate"}]
450
+ },
451
+ "actionItems": [
452
+ {"priority": "HIGH", "task": "task description", "owner": "CEO/Engineer/etc"}
453
+ ]
454
+ }
455
+
456
+ Be specific, actionable, and realistic based on the timeline and budget.`
457
+ }],
458
+ });
459
+
460
+ const text = response.content[0].type === 'text' ? response.content[0].text : '';
461
+ const jsonMatch = text.match(/\{[\s\S]*\}/);
462
+
463
+ const parsed = jsonMatch ? JSON.parse(jsonMatch[0]) : {};
464
+
465
+ return {
466
+ projectName: brief.name,
467
+ brief,
468
+ advisorFeedback,
469
+ overallScore: Math.round(avgScore * 10) / 10,
470
+ goNoGo: parsed.goNoGo || (avgScore >= 7 ? 'GO' : avgScore >= 5 ? 'CAUTION' : 'PIVOT'),
471
+ executiveSummary: parsed.executiveSummary || '',
472
+ marketingPlan: parsed.marketingPlan || {},
473
+ technicalPlan: parsed.technicalPlan || {},
474
+ uxPlan: parsed.uxPlan || {},
475
+ businessPlan: parsed.businessPlan || {},
476
+ actionItems: parsed.actionItems || [],
477
+ };
478
+ }
479
+
480
+ function displayReportSummary(report: DreamTeamReport): void {
481
+ const goNoGoColor = {
482
+ 'GO': chalk.green,
483
+ 'CAUTION': chalk.yellow,
484
+ 'PIVOT': chalk.red,
485
+ }[report.goNoGo];
486
+
487
+ console.log(chalk.bold(`\n${'═'.repeat(60)}`));
488
+ console.log(chalk.bold.cyan(`\n📊 DREAM TEAM REPORT: ${report.projectName.toUpperCase()}\n`));
489
+ console.log(chalk.bold(`${'═'.repeat(60)}\n`));
490
+
491
+ // Overall verdict
492
+ console.log(chalk.bold('Overall Assessment:'));
493
+ console.log(` Score: ${chalk.bold(report.overallScore.toString())}/10`);
494
+ console.log(` Verdict: ${goNoGoColor(report.goNoGo)}\n`);
495
+
496
+ // Advisor scores
497
+ console.log(chalk.bold('Advisor Scores:'));
498
+ for (const feedback of report.advisorFeedback) {
499
+ const bar = '█'.repeat(feedback.score) + '░'.repeat(10 - feedback.score);
500
+ console.log(` ${feedback.icon} ${feedback.advisor.padEnd(18)} ${bar} ${feedback.score}/10`);
501
+ }
502
+ console.log('');
503
+
504
+ // Executive Summary (truncated)
505
+ console.log(chalk.bold('Executive Summary:'));
506
+ console.log(chalk.dim(` ${report.executiveSummary.slice(0, 300)}...`));
507
+ console.log('');
508
+
509
+ // Top Action Items
510
+ console.log(chalk.bold('Top Action Items:'));
511
+ const highPriority = report.actionItems.filter(a => a.priority === 'HIGH').slice(0, 5);
512
+ highPriority.forEach((item, i) => {
513
+ console.log(` ${chalk.red('!')} ${item.task}`);
514
+ });
515
+ console.log('');
516
+
517
+ // Tech Stack
518
+ if (report.technicalPlan.stack?.length > 0) {
519
+ console.log(chalk.bold('Recommended Stack:'));
520
+ console.log(` ${report.technicalPlan.stack.join(' • ')}`);
521
+ console.log('');
522
+ }
523
+
524
+ console.log(chalk.dim('Full report saved to PDF with complete marketing, technical, and business plans.\n'));
525
+ }
526
+
527
+ async function saveReport(report: DreamTeamReport, projectName: string): Promise<string> {
528
+ const sanitizedName = projectName.toLowerCase().replace(/[^a-z0-9]/g, '-');
529
+ const timestamp = new Date().toISOString().split('T')[0];
530
+ const filename = `${sanitizedName}-dream-team-report-${timestamp}`;
531
+
532
+ // Save as markdown (can be converted to PDF)
533
+ const mdPath = path.join(process.cwd(), `${filename}.md`);
534
+ const mdContent = generateMarkdownReport(report);
535
+ await fs.writeFile(mdPath, mdContent);
536
+
537
+ // Save as JSON for programmatic use
538
+ const jsonPath = path.join(process.cwd(), `${filename}.json`);
539
+ await fs.writeJson(jsonPath, report, { spaces: 2 });
540
+
541
+ return mdPath;
542
+ }
543
+
544
+ function generateMarkdownReport(report: DreamTeamReport): string {
545
+ const goNoGoEmoji = { 'GO': '🟢', 'CAUTION': '🟡', 'PIVOT': '🔴' }[report.goNoGo];
546
+
547
+ return `# ${report.projectName} - Dream Team Report
548
+
549
+ **Generated:** ${new Date().toLocaleDateString()}
550
+ **Overall Score:** ${report.overallScore}/10
551
+ **Verdict:** ${goNoGoEmoji} ${report.goNoGo}
552
+
553
+ ---
554
+
555
+ ## Executive Summary
556
+
557
+ ${report.executiveSummary}
558
+
559
+ ---
560
+
561
+ ## Advisor Feedback
562
+
563
+ ${report.advisorFeedback.map(f => `
564
+ ### ${f.icon} ${f.advisor} - ${f.role}
565
+
566
+ **Score:** ${f.score}/10
567
+
568
+ ${f.feedback}
569
+
570
+ **Recommendations:**
571
+ ${f.recommendations.map(r => `- ${r}`).join('\n')}
572
+
573
+ **Questions to Consider:**
574
+ ${f.questions.map(q => `- ${q}`).join('\n')}
575
+
576
+ **Risks Identified:**
577
+ ${f.risks.map(r => `- ${r}`).join('\n')}
578
+ `).join('\n')}
579
+
580
+ ---
581
+
582
+ ## Marketing Plan
583
+
584
+ ### Positioning
585
+ ${report.marketingPlan.positioning}
586
+
587
+ ### Target Segments
588
+ ${report.marketingPlan.targetSegments?.map(s => `- ${s}`).join('\n') || 'TBD'}
589
+
590
+ ### Marketing Channels
591
+ ${report.marketingPlan.channels?.map(c => `- ${c}`).join('\n') || 'TBD'}
592
+
593
+ ### Launch Strategy
594
+ ${report.marketingPlan.launchStrategy}
595
+
596
+ ### Content Plan
597
+ ${report.marketingPlan.contentPlan?.map(c => `- ${c}`).join('\n') || 'TBD'}
598
+
599
+ ### Social Media Plan
600
+ - **Platforms:** ${report.marketingPlan.socialMediaPlan?.platforms?.join(', ') || 'TBD'}
601
+ - **Post Frequency:** ${report.marketingPlan.socialMediaPlan?.postFrequency || 'TBD'}
602
+ - **Content Types:** ${report.marketingPlan.socialMediaPlan?.contentTypes?.join(', ') || 'TBD'}
603
+
604
+ ### Budget
605
+ ${report.marketingPlan.budget}
606
+
607
+ ---
608
+
609
+ ## Technical Plan
610
+
611
+ ### Architecture
612
+ ${report.technicalPlan.architecture}
613
+
614
+ ### Tech Stack
615
+ ${report.technicalPlan.stack?.map(s => `- ${s}`).join('\n') || 'TBD'}
616
+
617
+ ### Development Phases
618
+ ${report.technicalPlan.phases?.map(p => `
619
+ #### ${p.name} (${p.duration})
620
+ ${p.deliverables.map(d => `- ${d}`).join('\n')}
621
+ `).join('\n') || 'TBD'}
622
+
623
+ ### MVP Features
624
+ ${report.technicalPlan.mvpFeatures?.map(f => `- ${f}`).join('\n') || 'TBD'}
625
+
626
+ ### Future Features
627
+ ${report.technicalPlan.futureFeatures?.map(f => `- ${f}`).join('\n') || 'TBD'}
628
+
629
+ ---
630
+
631
+ ## UX Plan
632
+
633
+ ### User Personas
634
+ ${report.uxPlan.userPersonas?.map(p => `
635
+ #### ${p.name}
636
+ ${p.description}
637
+
638
+ **Goals:**
639
+ ${p.goals.map(g => `- ${g}`).join('\n')}
640
+ `).join('\n') || 'TBD'}
641
+
642
+ ### User Journeys
643
+ ${report.uxPlan.userJourneys?.map(j => `- ${j}`).join('\n') || 'TBD'}
644
+
645
+ ### Key Screens
646
+ ${report.uxPlan.keyScreens?.map(s => `- ${s}`).join('\n') || 'TBD'}
647
+
648
+ ### Design Principles
649
+ ${report.uxPlan.designPrinciples?.map(p => `- ${p}`).join('\n') || 'TBD'}
650
+
651
+ ---
652
+
653
+ ## Business Plan
654
+
655
+ ### Revenue Model
656
+ ${report.businessPlan.revenueModel}
657
+
658
+ ### Pricing Strategy
659
+ ${report.businessPlan.pricing}
660
+
661
+ ### Projections
662
+ | Month | Users | Revenue |
663
+ |-------|-------|---------|
664
+ ${report.businessPlan.projections?.map(p => `| ${p.month} | ${p.users} | $${p.revenue} |`).join('\n') || '| TBD | TBD | TBD |'}
665
+
666
+ ### KPIs
667
+ ${report.businessPlan.kpis?.map(k => `- ${k}`).join('\n') || 'TBD'}
668
+
669
+ ### Risks & Mitigation
670
+ | Risk | Mitigation |
671
+ |------|------------|
672
+ ${report.businessPlan.risks?.map(r => `| ${r.risk} | ${r.mitigation} |`).join('\n') || '| TBD | TBD |'}
673
+
674
+ ---
675
+
676
+ ## Action Items
677
+
678
+ ### High Priority
679
+ ${report.actionItems.filter(a => a.priority === 'HIGH').map(a => `- [ ] **${a.task}** (Owner: ${a.owner})`).join('\n') || 'None'}
680
+
681
+ ### Medium Priority
682
+ ${report.actionItems.filter(a => a.priority === 'MEDIUM').map(a => `- [ ] ${a.task} (Owner: ${a.owner})`).join('\n') || 'None'}
683
+
684
+ ### Low Priority
685
+ ${report.actionItems.filter(a => a.priority === 'LOW').map(a => `- [ ] ${a.task} (Owner: ${a.owner})`).join('\n') || 'None'}
686
+
687
+ ---
688
+
689
+ ## Next Steps
690
+
691
+ 1. Review this report with your team
692
+ 2. Run \`codebakers prd ${report.projectName.toLowerCase().replace(/[^a-z0-9]/g, '-')}-dream-team-report.md\` to start building
693
+ 3. Or run \`codebakers init\` for standard project setup
694
+
695
+ ---
696
+
697
+ *Generated by CodeBakers Dream Team Advisors*
698
+ `;
699
+ }