Skip to content

Commit 86eb25f

Browse files
committed
feat(landing-page): redesign landing page for v5.6
Redesign outdated landing page (stuck on v5.0 messaging) to reflect v5.6 features. Pivots positioning from "multi-AI rules" to "prove your AI coding is actually improving" with measurable impact as the core value prop. Content updates: - Hero: new headline + subtitle, terminal demo with 9 tool files (added Windsurf, Aider, OpenCode) - Features: 6 → 8 cards (added Session Impact Reports, Self-Evolving Rules, 50 Skills) - SupportedTools: 6 → 9 AI tools - BeforeAfter: reflects 9 config files + impact tracking - Agents: 29 → 37 specialists (added auto-mode, data-scientist, parallel-orchestrator, plan-reviewer, security-engineer, software-engineer, systems-developer, test-engineer) New sections (4 parallel routes): - @social_proof: headline stats bar (37 agents · 9 tools · 50 skills · 9 checklists · 8 langs) - @workflow_demo: interactive PLAN/ACT/EVAL/AUTO tab UI with mode-specific color gradients - @hud_showcase: simulated HUD statusbar preview (buddy face, cost velocity, cache savings, context bar) + 5 feature cards - @skills_library: 5-category tabbed skills browser i18n: all 5 locales (en/ko/ja/zh-CN/es) updated with new keys + revised copy. Tests: 43 files / 265 tests, 100% coverage on all new widgets.
1 parent 679ff1c commit 86eb25f

44 files changed

Lines changed: 1550 additions & 150 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/landing-page/__tests__/__helpers__/mock-translations.ts

Lines changed: 121 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,37 @@
44
*/
55
export const mockTranslations: Record<string, Record<string, string>> = {
66
hero: {
7-
title: 'Multi-AI Rules for Consistent Coding',
8-
subtitle: 'One ruleset for Cursor, Claude Code, Codex, Antigravity, Q, and Kiro.',
7+
title: 'Prove Your AI Coding Is Actually Improving',
8+
subtitle: 'One command. 9 AI tools. Measurable impact on every session.',
99
cta: 'Get Started',
1010
github: 'Star on GitHub',
1111
terminalTitle: '~/your-project',
1212
terminalCmd: 'npx codingbuddy init',
1313
terminalInstalling: 'Installing codingbuddy-rules...',
14-
terminalRulesSynced: 'Rules synced to 6 AI tools',
15-
terminalAgents: '35 specialist agents activated',
14+
terminalRulesSynced: 'Rules synced to 9 AI tools',
15+
terminalAgents: '37 specialist agents activated',
1616
terminalWorkflow: 'PLAN → ACT → EVAL workflow ready',
17+
terminalSkills: '50 built-in skills loaded',
1718
terminalCursorrules: '.cursorrules',
1819
terminalClaudeMd: 'CLAUDE.md',
1920
terminalCodex: '.codex/',
2021
terminalAntigravity: '.antigravity/',
2122
terminalQ: '.q/',
2223
terminalKiro: '.kiro/',
24+
terminalWindsurf: '.windsurfrules',
25+
terminalAider: '.aider.conf.yml',
26+
terminalOpenCode: '.opencode/',
2327
terminalReady: 'Ready! One source, all tools.',
2428
},
29+
socialProof: {
30+
agents: '37 Agents',
31+
tools: '9 AI Tools',
32+
skills: '50 Skills',
33+
checklists: '9 Checklists',
34+
languages: '8 Languages',
35+
},
2536
agents: {
26-
title: '35 Specialist Agents',
37+
title: '37 Specialist Agents',
2738
subtitle: 'Focused expertise for every aspect of development',
2839
filter: 'Filter by category',
2940
allCategories: 'All',
@@ -36,6 +47,14 @@ export const mockTranslations: Record<string, Record<string, string>> = {
3647
'categories.Security': 'Security',
3748
'categories.UX': 'UX',
3849
count: '{count} agents',
50+
stacks: 'Agent Stacks',
51+
stacksSubtitle: 'Pre-built teams for common workflows',
52+
fullStack: 'Full-Stack',
53+
apiDev: 'API Development',
54+
dataPipeline: 'Data Pipeline',
55+
frontendPolish: 'Frontend Polish',
56+
mlInfra: 'ML Infrastructure',
57+
securityAudit: 'Security Audit',
3958
},
4059
quickStart: {
4160
title: 'Quick Start',
@@ -48,6 +67,9 @@ export const mockTranslations: Record<string, Record<string, string>> = {
4867
step3Desc: 'Use PLAN, ACT, EVAL modes with specialist agents',
4968
copy: 'Copy',
5069
copied: 'Copied!',
70+
tab_claude: 'Claude Code',
71+
tab_cursor: 'Cursor',
72+
tab_codex: 'Codex',
5173
},
5274
header: {
5375
'nav.features': 'Features',
@@ -77,24 +99,29 @@ export const mockTranslations: Record<string, Record<string, string>> = {
7799
decline: 'Decline',
78100
},
79101
metadata: {
80-
title: 'Codingbuddy - Multi-AI Rules for Consistent Coding',
81-
description: 'One ruleset for Cursor, Claude Code, Codex, Antigravity, Q, and Kiro.',
102+
title: 'Codingbuddy - Prove Your AI Coding Is Actually Improving',
103+
description:
104+
'One command for 9 AI tools. 37 specialist agents. Measurable impact on every session.',
82105
},
83106
beforeAfter: {
84107
title: 'The Problem & Solution',
85108
beforeLabel: 'Before',
86109
afterLabel: 'After',
87-
beforeFiles: '6 config files. Always out of sync.',
110+
beforeFiles: '9 config files. Always out of sync.',
88111
afterFiles: 'Single source. Auto-synced to all tools.',
89112
cursorrules: '.cursorrules',
90113
claudeMd: 'CLAUDE.md',
91114
codexRules: '.codex/instructions.md',
92115
antigravityRules: '.antigravity/rules.md',
93116
qRules: '.q/rules.md',
94117
kiroRules: '.kiro/rules.md',
118+
windsurfRules: '.windsurfrules',
119+
aiderRules: '.aider.conf.yml',
120+
opencodeRules: '.opencode/rules.md',
95121
singleSource: 'codingbuddy-rules/.ai-rules/',
96122
autoSynced: 'Auto-synced',
97123
alwaysCurrent: 'Always current',
124+
impactTracked: 'Impact tracked',
98125
},
99126
supportedTools: {
100127
title: 'Works with your favorite AI tools',
@@ -105,6 +132,9 @@ export const mockTranslations: Record<string, Record<string, string>> = {
105132
antigravity: 'Antigravity',
106133
amazonQ: 'Amazon Q',
107134
kiro: 'Kiro',
135+
windsurf: 'Windsurf',
136+
aider: 'Aider',
137+
opencode: 'OpenCode',
108138
},
109139
tuiDashboard: {
110140
title: 'Real-Time Agent Dashboard',
@@ -126,26 +156,100 @@ export const mockTranslations: Record<string, Record<string, string>> = {
126156
features: {
127157
title: 'What You Get',
128158
universalRulesTitle: 'Universal Rules',
129-
universalRulesDesc: 'One source of truth automatically applied to all 6 AI coding tools.',
130-
agentsTitle: '35 AI Agents',
159+
universalRulesDesc: 'One source of truth automatically applied to all 9 AI coding tools.',
160+
agentsTitle: '37 Specialist Agents',
131161
agentsDesc:
132-
'Specialist agents for architecture, security, testing, performance, and accessibility.',
162+
'Domain experts for architecture, security, testing, performance, and accessibility.',
133163
workflowTitle: 'Structured Workflow',
134164
workflowDesc: 'PLAN → ACT → EVAL cycle ensures consistent quality across all development.',
135165
qualityTitle: 'Quality Built-in',
136166
qualityDesc: 'TDD, SOLID principles, and 90%+ test coverage enforced as standard practice.',
137-
mcpTitle: 'MCP Protocol',
138-
mcpDesc: 'Standard Model Context Protocol for seamless AI tool integration.',
167+
impactTitle: 'Session Impact Reports',
168+
impactDesc:
169+
'Measurable proof that AI coding is improving — issues prevented, agents dispatched, rules enforced.',
170+
selfEvolvingTitle: 'Self-Evolving Rules',
171+
selfEvolvingDesc:
172+
'Rules that learn from repeated failure patterns and suggest improvements automatically.',
173+
skillsTitle: '50 Built-in Skills',
174+
skillsDesc: 'Reusable workflows for TDD, shipping, code review, debugging, and more.',
139175
zeroConfigTitle: 'Zero Config',
140176
zeroConfigDesc: 'One command to install. Works out of the box with all supported tools.',
141177
},
178+
workflowDemo: {
179+
title: 'Your AI Coding Workflow, Supercharged',
180+
subtitle: 'Four modes that take AI-assisted development from chaos to production-ready.',
181+
planTitle: 'PLAN',
182+
planDesc:
183+
'Question-first planning with intelligent clarification. Specialists recommend architecture before a single line of code.',
184+
planDetail1: 'Clarification gate catches ambiguity',
185+
planDetail2: 'Specialists recommend architecture',
186+
planDetail3: 'Permission forecast before execution',
187+
actTitle: 'ACT',
188+
actDesc:
189+
'Execute with TDD discipline. Real-time rule enforcement prevents drift. Quality gates block bad patterns.',
190+
actDetail1: 'TDD Red → Green → Refactor cycle',
191+
actDetail2: 'Live rule enforcement',
192+
actDetail3: 'Dynamic checklists per domain',
193+
evalTitle: 'EVAL',
194+
evalDesc:
195+
'Specialist council independently reviews. Cross-review findings. Consensus-driven approval.',
196+
evalDetail1: 'Parallel specialist review',
197+
evalDetail2: 'Cross-review and debate',
198+
evalDetail3: 'Consensus: approve / concern / reject',
199+
autoTitle: 'AUTO',
200+
autoDesc:
201+
'Fully autonomous cycle. Iterates PLAN → ACT → EVAL until zero critical issues. Ship with confidence.',
202+
autoDetail1: 'Autonomous iteration',
203+
autoDetail2: 'Quality gate: Critical=0, High=0',
204+
autoDetail3: 'Production-ready guarantee',
205+
},
206+
hudShowcase: {
207+
title: 'Intelligence at a Glance',
208+
subtitle:
209+
'A living statusbar that breathes with your session — cost tracking, cache savings, and mode awareness built in.',
210+
buddyTitle: 'Breathing Buddy',
211+
buddyDesc:
212+
'Animated avatar reacts to session phase — idle, thinking, active, blocked, victory.',
213+
costTitle: 'Cost Velocity',
214+
costDesc:
215+
'Real-time spend-rate tracking with trend indicators so you never get a billing surprise.',
216+
cacheTitle: 'Cache Savings',
217+
cacheDesc: 'See exactly how much prompt caching saves you per session.',
218+
modeTitle: 'Mode Rainbow',
219+
modeDesc:
220+
'Per-mode color gradients — blue for PLAN, green for ACT, purple for EVAL, rainbow for AUTO.',
221+
contextTitle: 'Context Bar',
222+
contextDesc: 'Visual progress bar shows context window usage with warning thresholds.',
223+
screenshotAlt:
224+
'Codingbuddy HUD Statusbar showing buddy face, cost velocity, cache savings, and mode indicator',
225+
},
226+
skillsLibrary: {
227+
title: '50 Built-in Skills',
228+
subtitle: 'Reusable workflows that codify best practices into repeatable actions',
229+
development: 'Development',
230+
teamGit: 'Team & Git',
231+
review: 'Review & Code',
232+
intelligence: 'Intelligence',
233+
specialized: 'Specialized',
234+
developmentSkills:
235+
'TDD, Refactoring, Debugging, Performance Optimization, Brainstorming, Legacy Modernization, Database Migration, API Design, Frontend Design, MCP Builder',
236+
teamGitSkills: 'Ship, Git Master, Worktrees, Parallel Agents, Subagent Dev, Cross-Repo Issues',
237+
reviewSkills:
238+
'PR Review, PR All-in-One, Code Review, Code Explanation, Error Analysis, Build Fix, Verification',
239+
intelligenceSkills:
240+
'Retrospective, Security Audit, Tech Debt, Rule Authoring, Skill Creator, Prompt Engineering',
241+
specializedSkills:
242+
'Incident Response, Onboard, Deployment Checklist, Cost Budget, Widget Architecture, Agent Design',
243+
},
142244
ctaFooter: {
143-
title: 'Ready to unify your AI coding?',
245+
title: 'Ready to prove your AI coding works?',
144246
command: 'npx codingbuddy init',
145-
github: 'GitHub',
247+
github: 'Star on GitHub',
146248
docs: 'Documentation',
147-
copyright: `© {year} Codingbuddy. All rights reserved.`,
148-
madeWith: 'Made for developers who ship with AI',
249+
copy: 'Copy',
250+
copied: 'Copied!',
251+
copyright: `© {year} Codingbuddy. MIT License.`,
252+
madeWith: '37 agents. 9 tools. 50 skills. One command.',
149253
},
150254
};
151255

apps/landing-page/__tests__/i18n/request.test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,15 @@ describe('i18n request config logic', () => {
4848
expect(messages).toBeDefined();
4949
expect(Object.keys(messages)).toEqual([
5050
'hero',
51+
'socialProof',
5152
'beforeAfter',
5253
'features',
54+
'workflowDemo',
5355
'supportedTools',
56+
'hudShowcase',
5457
'tuiDashboard',
5558
'agents',
59+
'skillsLibrary',
5660
'quickStart',
5761
'ctaFooter',
5862
'header',

apps/landing-page/__tests__/widgets/AgentsShowcase.test.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ describe('AgentsShowcase', () => {
2121

2222
it('should display section heading', () => {
2323
render(<AgentsShowcase locale="en" />);
24-
expect(screen.getByRole('heading', { level: 2 })).toHaveTextContent('35 Specialist Agents');
24+
expect(screen.getByRole('heading', { level: 2 })).toHaveTextContent('37 Specialist Agents');
2525
});
2626

2727
it('should have id attribute for anchor navigation', () => {
@@ -42,16 +42,16 @@ describe('AgentsShowcase', () => {
4242

4343
it('should render agent cards up to max 8', () => {
4444
render(<AgentsShowcase locale="en" />);
45-
// Total agents is 29, but only 8 should be visible
46-
expect(screen.getByText('Frontend Developer')).toBeInTheDocument();
45+
// Total agents is 37, but only 8 should be visible
46+
expect(screen.getByText('Plan Mode Agent')).toBeInTheDocument();
4747
// Count visible agent cards (each has role="img" for the emoji)
4848
const agentIcons = screen.getAllByRole('img', { hidden: true });
4949
expect(agentIcons.length).toBeLessThanOrEqual(8);
5050
});
5151

5252
it('should display agent count for all agents', () => {
5353
render(<AgentsShowcase locale="en" />);
54-
expect(screen.getByText('29 agents')).toBeInTheDocument();
54+
expect(screen.getByText('37 agents')).toBeInTheDocument();
5555
});
5656

5757
it('should not render a search input', () => {

apps/landing-page/__tests__/widgets/CTAFooter.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ describe('CTAFooter', () => {
1212
it('should render CTA heading', async () => {
1313
render(await CTAFooter({ locale: 'en' }));
1414
expect(
15-
screen.getByRole('heading', { level: 2, name: /Ready to unify your AI coding/i }),
15+
screen.getByRole('heading', { level: 2, name: /Ready to prove your AI coding works/i }),
1616
).toBeInTheDocument();
1717
});
1818

@@ -45,7 +45,7 @@ describe('CTAFooter', () => {
4545

4646
it('should render made for developers text', async () => {
4747
render(await CTAFooter({ locale: 'en' }));
48-
expect(screen.getByText(/Made for developers who ship with AI/)).toBeInTheDocument();
48+
expect(screen.getByText(/37 agents\. 9 tools\. 50 skills\. One command\./)).toBeInTheDocument();
4949
});
5050

5151
it('should have CTA section with data-testid', async () => {

apps/landing-page/__tests__/widgets/Features.test.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,25 @@ describe('Features', () => {
3131
expect(section).toHaveAttribute('id', 'features');
3232
});
3333

34-
it('should render 6 feature cards', async () => {
34+
it('should render 8 feature cards', async () => {
3535
render(await Features({ locale: 'en' }));
3636
expect(screen.getByText('Universal Rules')).toBeInTheDocument();
37-
expect(screen.getByText('35 AI Agents')).toBeInTheDocument();
37+
expect(screen.getByText('37 Specialist Agents')).toBeInTheDocument();
3838
expect(screen.getByText('Structured Workflow')).toBeInTheDocument();
3939
expect(screen.getByText('Quality Built-in')).toBeInTheDocument();
40-
expect(screen.getByText('MCP Protocol')).toBeInTheDocument();
40+
expect(screen.getByText('Session Impact Reports')).toBeInTheDocument();
41+
expect(screen.getByText('Self-Evolving Rules')).toBeInTheDocument();
42+
expect(screen.getByText('50 Built-in Skills')).toBeInTheDocument();
4143
expect(screen.getByText('Zero Config')).toBeInTheDocument();
4244
});
4345

4446
it('should render feature descriptions', async () => {
4547
render(await Features({ locale: 'en' }));
4648
expect(screen.getByText(/One source of truth automatically applied/)).toBeInTheDocument();
47-
expect(screen.getByText(/Specialist agents for architecture/)).toBeInTheDocument();
49+
expect(screen.getByText(/Domain experts for architecture/)).toBeInTheDocument();
4850
expect(screen.getByText(/PLAN ACT EVAL cycle/)).toBeInTheDocument();
4951
expect(screen.getByText(/TDD, SOLID principles/)).toBeInTheDocument();
50-
expect(screen.getByText(/Standard Model Context Protocol/)).toBeInTheDocument();
52+
expect(screen.getByText(/Measurable proof that AI coding/)).toBeInTheDocument();
5153
expect(screen.getByText(/One command to install/)).toBeInTheDocument();
5254
});
5355
});

apps/landing-page/__tests__/widgets/Hero.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ describe('Hero', () => {
1717
it('should display h1 heading', async () => {
1818
render(await Hero({ locale: 'en' }));
1919
expect(screen.getByRole('heading', { level: 1 })).toHaveTextContent(
20-
'Multi-AI Rules for Consistent Coding',
20+
'Prove Your AI Coding Is Actually Improving',
2121
);
2222
});
2323

@@ -30,7 +30,7 @@ describe('Hero', () => {
3030
it('should display subtitle', async () => {
3131
render(await Hero({ locale: 'en' }));
3232
expect(
33-
screen.getByText('One ruleset for Cursor, Claude Code, Codex, Antigravity, Q, and Kiro.'),
33+
screen.getByText('One command. 9 AI tools. Measurable impact on every session.'),
3434
).toBeInTheDocument();
3535
});
3636

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { describe, it, expect } from 'vitest';
2+
import { render, screen } from '@testing-library/react';
3+
import '@/__tests__/__helpers__/next-intl-server-mock';
4+
import { HudShowcase } from '@/widgets/HudShowcase';
5+
6+
describe('HudShowcase', () => {
7+
it('should render with locale prop', async () => {
8+
render(await HudShowcase({ locale: 'en' }));
9+
expect(screen.getByTestId('hud-showcase')).toBeInTheDocument();
10+
});
11+
12+
it('should set lang attribute matching locale', async () => {
13+
render(await HudShowcase({ locale: 'ko' }));
14+
expect(screen.getByTestId('hud-showcase')).toHaveAttribute('lang', 'ko');
15+
});
16+
17+
it('should display section heading', async () => {
18+
render(await HudShowcase({ locale: 'en' }));
19+
expect(screen.getByRole('heading', { level: 2 })).toHaveTextContent('Intelligence at a Glance');
20+
});
21+
22+
it('should have aria-labelledby linking to heading', async () => {
23+
render(await HudShowcase({ locale: 'en' }));
24+
expect(screen.getByTestId('hud-showcase')).toHaveAttribute(
25+
'aria-labelledby',
26+
'hud-showcase-heading',
27+
);
28+
});
29+
30+
it('should render simulated HUD statusbar with all segments', async () => {
31+
render(await HudShowcase({ locale: 'en' }));
32+
expect(screen.getByText('buddy')).toBeInTheDocument();
33+
expect(screen.getByText('PLAN')).toBeInTheDocument();
34+
expect(screen.getByText('$0.47 saved')).toBeInTheDocument();
35+
});
36+
37+
it('should render all 5 feature cards', async () => {
38+
render(await HudShowcase({ locale: 'en' }));
39+
expect(screen.getByText('Breathing Buddy')).toBeInTheDocument();
40+
expect(screen.getByText('Cost Velocity')).toBeInTheDocument();
41+
expect(screen.getByText('Cache Savings')).toBeInTheDocument();
42+
expect(screen.getByText('Mode Rainbow')).toBeInTheDocument();
43+
expect(screen.getByText('Context Bar')).toBeInTheDocument();
44+
});
45+
});

0 commit comments

Comments
 (0)