diff --git a/test/gen-skill-docs.test.ts b/test/gen-skill-docs.test.ts index 496e7963..43507f0e 100644 --- a/test/gen-skill-docs.test.ts +++ b/test/gen-skill-docs.test.ts @@ -690,6 +690,125 @@ describe('BENEFITS_FROM resolver', () => { }); }); +// --- {{DESIGN_OUTSIDE_VOICES}} resolver tests --- + +describe('DESIGN_OUTSIDE_VOICES resolver', () => { + test('plan-design-review contains outside voices section', () => { + const content = fs.readFileSync(path.join(ROOT, 'plan-design-review', 'SKILL.md'), 'utf-8'); + expect(content).toContain('Design Outside Voices'); + expect(content).toContain('CODEX_AVAILABLE'); + expect(content).toContain('LITMUS SCORECARD'); + }); + + test('design-review contains outside voices section', () => { + const content = fs.readFileSync(path.join(ROOT, 'design-review', 'SKILL.md'), 'utf-8'); + expect(content).toContain('Design Outside Voices'); + expect(content).toContain('source audit'); + }); + + test('design-consultation contains outside voices section', () => { + const content = fs.readFileSync(path.join(ROOT, 'design-consultation', 'SKILL.md'), 'utf-8'); + expect(content).toContain('Design Outside Voices'); + expect(content).toContain('design direction'); + }); + + test('codex host produces empty outside voices', () => { + const codexContent = fs.readFileSync(path.join(ROOT, '.agents', 'skills', 'gstack-design-review', 'SKILL.md'), 'utf-8'); + expect(codexContent).not.toContain('Design Outside Voices'); + }); + + test('branches correctly per skillName — different prompts', () => { + const planContent = fs.readFileSync(path.join(ROOT, 'plan-design-review', 'SKILL.md'), 'utf-8'); + const consultContent = fs.readFileSync(path.join(ROOT, 'design-consultation', 'SKILL.md'), 'utf-8'); + // plan-design-review uses analytical prompt (high reasoning) + expect(planContent).toContain('model_reasoning_effort="high"'); + // design-consultation uses creative prompt (medium reasoning) + expect(consultContent).toContain('model_reasoning_effort="medium"'); + }); +}); + +// --- {{DESIGN_HARD_RULES}} resolver tests --- + +describe('DESIGN_HARD_RULES resolver', () => { + test('plan-design-review Pass 4 contains hard rules', () => { + const content = fs.readFileSync(path.join(ROOT, 'plan-design-review', 'SKILL.md'), 'utf-8'); + expect(content).toContain('Design Hard Rules'); + expect(content).toContain('Classifier'); + expect(content).toContain('MARKETING/LANDING PAGE'); + expect(content).toContain('APP UI'); + }); + + test('design-review contains hard rules', () => { + const content = fs.readFileSync(path.join(ROOT, 'design-review', 'SKILL.md'), 'utf-8'); + expect(content).toContain('Design Hard Rules'); + }); + + test('includes all 3 rule sets', () => { + const content = fs.readFileSync(path.join(ROOT, 'plan-design-review', 'SKILL.md'), 'utf-8'); + expect(content).toContain('Landing page rules'); + expect(content).toContain('App UI rules'); + expect(content).toContain('Universal rules'); + }); + + test('references shared AI slop blacklist items', () => { + const content = fs.readFileSync(path.join(ROOT, 'plan-design-review', 'SKILL.md'), 'utf-8'); + expect(content).toContain('3-column feature grid'); + expect(content).toContain('Purple/violet/indigo'); + }); + + test('includes OpenAI hard rejection criteria', () => { + const content = fs.readFileSync(path.join(ROOT, 'plan-design-review', 'SKILL.md'), 'utf-8'); + expect(content).toContain('Generic SaaS card grid'); + expect(content).toContain('Carousel with no narrative purpose'); + }); + + test('includes OpenAI litmus checks', () => { + const content = fs.readFileSync(path.join(ROOT, 'plan-design-review', 'SKILL.md'), 'utf-8'); + expect(content).toContain('Brand/product unmistakable'); + expect(content).toContain('premium with all decorative shadows removed'); + }); +}); + +// --- Extended DESIGN_SKETCH resolver tests --- + +describe('DESIGN_SKETCH extended with outside voices', () => { + const content = fs.readFileSync(path.join(ROOT, 'office-hours', 'SKILL.md'), 'utf-8'); + + test('contains outside design voices step', () => { + expect(content).toContain('Outside design voices'); + }); + + test('offers opt-in via AskUserQuestion', () => { + expect(content).toContain('outside design perspectives'); + }); + + test('still contains original wireframe steps', () => { + expect(content).toContain('wireframe'); + expect(content).toContain('$B goto'); + }); +}); + +// --- Extended DESIGN_REVIEW_LITE resolver tests --- + +describe('DESIGN_REVIEW_LITE extended with Codex', () => { + const content = fs.readFileSync(path.join(ROOT, 'ship', 'SKILL.md'), 'utf-8'); + + test('contains Codex design voice block', () => { + expect(content).toContain('Codex design voice'); + expect(content).toContain('CODEX (design)'); + }); + + test('still contains original checklist steps', () => { + expect(content).toContain('design-checklist.md'); + expect(content).toContain('SCOPE_FRONTEND'); + }); + + test('codex host does not include Codex design block', () => { + const codexContent = fs.readFileSync(path.join(ROOT, '.agents', 'skills', 'gstack-ship', 'SKILL.md'), 'utf-8'); + expect(codexContent).not.toContain('Codex design voice'); + }); +}); + // ─── Codex Generation Tests ───────────────────────────────── describe('Codex generation (--host codex)', () => { diff --git a/test/helpers/touchfiles.ts b/test/helpers/touchfiles.ts index 5af21021..07fb19ea 100644 --- a/test/helpers/touchfiles.ts +++ b/test/helpers/touchfiles.ts @@ -105,13 +105,13 @@ export const E2E_TOUCHFILES: Record = { 'ship-triage': ['ship/**', 'bin/gstack-repo-mode'], // Design - 'design-consultation-core': ['design-consultation/**'], - 'design-consultation-existing': ['design-consultation/**'], - 'design-consultation-research': ['design-consultation/**'], - 'design-consultation-preview': ['design-consultation/**'], - 'plan-design-review-plan-mode': ['plan-design-review/**'], - 'plan-design-review-no-ui-scope': ['plan-design-review/**'], - 'design-review-fix': ['design-review/**', 'browse/src/**'], + 'design-consultation-core': ['design-consultation/**', 'scripts/gen-skill-docs.ts'], + 'design-consultation-existing': ['design-consultation/**', 'scripts/gen-skill-docs.ts'], + 'design-consultation-research': ['design-consultation/**', 'scripts/gen-skill-docs.ts'], + 'design-consultation-preview': ['design-consultation/**', 'scripts/gen-skill-docs.ts'], + 'plan-design-review-plan-mode': ['plan-design-review/**', 'scripts/gen-skill-docs.ts'], + 'plan-design-review-no-ui-scope': ['plan-design-review/**', 'scripts/gen-skill-docs.ts'], + 'design-review-fix': ['design-review/**', 'browse/src/**', 'scripts/gen-skill-docs.ts'], // gstack-upgrade 'gstack-upgrade-happy-path': ['gstack-upgrade/**'],