diff --git a/CLAUDE.md b/CLAUDE.md index e724b826..d0bddfbf 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -47,6 +47,8 @@ gstack/ ├── review/ # PR review skill ├── plan-ceo-review/ # /plan-ceo-review skill ├── plan-eng-review/ # /plan-eng-review skill +├── brainstorm/ # /brainstorm skill (Socratic design exploration) +├── debug/ # /debug skill (systematic root-cause debugging) ├── retro/ # Retrospective skill ├── setup # One-time setup: build binary + symlink skills ├── SKILL.md # Generated from SKILL.md.tmpl (don't edit directly) diff --git a/TODOS.md b/TODOS.md index 7bd1176a..eb8c95f0 100644 --- a/TODOS.md +++ b/TODOS.md @@ -374,6 +374,32 @@ **Priority:** P3 **Depends on:** Ref staleness Parts 1+2 (shipped) +## Brainstorm / Design + +### Design docs → Supabase team store sync + +**What:** Add design docs (`*-design-*.md`) to the Supabase sync pipeline alongside test plans, retro snapshots, and QA reports. + +**Why:** Cross-team design discovery at scale. Local `~/.gstack/projects/$SLUG/` keyword-grep discovery works for same-machine users now, but Supabase sync makes it work across the whole team. Duplicate ideas surface, everyone sees what's been explored. + +**Context:** /brainstorm writes design docs to `~/.gstack/projects/$SLUG/`. The team store already syncs test plans, retro snapshots, QA reports. Design docs follow the same pattern — just add a sync adapter. + +**Effort:** S +**Priority:** P2 +**Depends on:** `garrytan/team-supabase-store` branch landing on main + +### /plan-design-review skill + +**What:** A visual/UX-focused design review skill that consumes /brainstorm design docs and evaluates mockups, wireframes, and UI decisions. Completes the review trilogy — product (/plan-ceo-review), engineering (/plan-eng-review), design (/plan-design-review). + +**Why:** Full workflow coverage for visual/UX projects. The brainstorm design doc artifact is the input contract. + +**Context:** /brainstorm handoff already mentions this skill. The design doc at `~/.gstack/projects/` is the input. + +**Effort:** M +**Priority:** P2 +**Depends on:** `garrytan/design` branch landing on main + ## Completed ### Phase 1: Foundations (v0.2.0) diff --git a/test/skill-validation.test.ts b/test/skill-validation.test.ts index 88e98935..bdec781b 100644 --- a/test/skill-validation.test.ts +++ b/test/skill-validation.test.ts @@ -176,6 +176,7 @@ describe('Update check preamble', () => { 'ship/SKILL.md', 'review/SKILL.md', 'plan-ceo-review/SKILL.md', 'plan-eng-review/SKILL.md', 'retro/SKILL.md', + 'brainstorm/SKILL.md', 'debug/SKILL.md', ]; for (const skill of skillsWithUpdateCheck) { @@ -421,6 +422,7 @@ describe('v0.4.1 preamble features', () => { 'ship/SKILL.md', 'review/SKILL.md', 'plan-ceo-review/SKILL.md', 'plan-eng-review/SKILL.md', 'retro/SKILL.md', + 'brainstorm/SKILL.md', 'debug/SKILL.md', ]; for (const skill of skillsWithPreamble) { @@ -436,6 +438,34 @@ describe('v0.4.1 preamble features', () => { expect(content).toContain('ELI16'); }); } + + for (const skill of skillsWithPreamble) { + test(`${skill} contains escalation protocol`, () => { + const content = fs.readFileSync(path.join(ROOT, skill), 'utf-8'); + expect(content).toContain('DONE_WITH_CONCERNS'); + expect(content).toContain('BLOCKED'); + expect(content).toContain('NEEDS_CONTEXT'); + }); + } +}); + +// --- Structural tests for new skills --- + +describe('brainstorm skill structure', () => { + const content = fs.readFileSync(path.join(ROOT, 'brainstorm', 'SKILL.md'), 'utf-8'); + for (const section of ['Phase 1', 'Phase 2', 'Phase 3', 'Phase 4', 'Phase 5', 'Phase 6', + 'Design Doc', 'Supersedes', 'APPROVED', 'Premise Challenge', + 'Alternatives', 'Smart-skip']) { + test(`contains ${section}`, () => expect(content).toContain(section)); + } +}); + +describe('debug skill structure', () => { + const content = fs.readFileSync(path.join(ROOT, 'debug', 'SKILL.md'), 'utf-8'); + for (const section of ['Iron Law', 'Root Cause', 'Pattern Analysis', 'Hypothesis', + 'DEBUG REPORT', '3-strike', 'BLOCKED']) { + test(`contains ${section}`, () => expect(content).toContain(section)); + } }); describe('Enum & Value Completeness in review checklist', () => {