From 4daabe5232deb776d7e02a5d5aeb87cb44d2e5e7 Mon Sep 17 00:00:00 2001 From: Paul Bakaus Date: Tue, 21 Apr 2026 14:13:29 -0700 Subject: [PATCH] feat(skill): register split, color strategy, and pre-design intake Splits the skill into two register references (editorial, product), replaces category-based theme selection with a forced physical-scene inference, and introduces a four-step color strategy axis (Restrained / Committed / Full palette / Drenched) with editorial permission for the bold three. Adds a seed mode to /impeccable document for pre-implementation projects, updates /impeccable teach Step 5 to offer the seed path, and grows /impeccable shape with Design Direction + Scope intake (fidelity, breadth, interactivity, time). Extends live-mode variant distinctness to forbid three variants sharing theme and dominant hue. Also drops the anti-pattern validator coupling, consolidates a11y into audit.md, and updates CLAUDE.md with the register architecture. Co-Authored-By: Claude Opus 4.7 (1M context) --- .agents/skills/impeccable/SKILL.md | 403 ++++------------- .../skills/impeccable/reference/animate.md | 7 + .agents/skills/impeccable/reference/bolder.md | 7 + .../skills/impeccable/reference/colorize.md | 7 + .../skills/impeccable/reference/delight.md | 7 + .../skills/impeccable/reference/document.md | 74 ++- .../skills/impeccable/reference/editorial.md | 75 +++ .agents/skills/impeccable/reference/layout.md | 7 + .agents/skills/impeccable/reference/live.md | 427 ++++++++---------- .../skills/impeccable/reference/product.md | 62 +++ .../skills/impeccable/reference/quieter.md | 7 + .agents/skills/impeccable/reference/shape.md | 40 +- .agents/skills/impeccable/reference/teach.md | 43 +- .../skills/impeccable/reference/typeset.md | 7 + .claude/agents/anti-patterns.md | 53 +-- .claude/skills/impeccable/SKILL.md | 403 ++++------------- .../skills/impeccable/reference/animate.md | 7 + .claude/skills/impeccable/reference/bolder.md | 7 + .../skills/impeccable/reference/colorize.md | 7 + .../skills/impeccable/reference/delight.md | 7 + .../skills/impeccable/reference/document.md | 74 ++- .../skills/impeccable/reference/editorial.md | 75 +++ .claude/skills/impeccable/reference/layout.md | 7 + .claude/skills/impeccable/reference/live.md | 427 ++++++++---------- .../skills/impeccable/reference/product.md | 62 +++ .../skills/impeccable/reference/quieter.md | 7 + .claude/skills/impeccable/reference/shape.md | 40 +- .claude/skills/impeccable/reference/teach.md | 43 +- .../skills/impeccable/reference/typeset.md | 7 + .cursor/skills/impeccable/SKILL.md | 403 ++++------------- .../skills/impeccable/reference/animate.md | 7 + .cursor/skills/impeccable/reference/bolder.md | 7 + .../skills/impeccable/reference/colorize.md | 7 + .../skills/impeccable/reference/delight.md | 7 + .../skills/impeccable/reference/document.md | 74 ++- .../skills/impeccable/reference/editorial.md | 75 +++ .cursor/skills/impeccable/reference/layout.md | 7 + .cursor/skills/impeccable/reference/live.md | 427 ++++++++---------- .../skills/impeccable/reference/product.md | 62 +++ .../skills/impeccable/reference/quieter.md | 7 + .cursor/skills/impeccable/reference/shape.md | 40 +- .cursor/skills/impeccable/reference/teach.md | 43 +- .../skills/impeccable/reference/typeset.md | 7 + .gemini/skills/impeccable/SKILL.md | 403 ++++------------- .../skills/impeccable/reference/animate.md | 7 + .gemini/skills/impeccable/reference/bolder.md | 7 + .../skills/impeccable/reference/colorize.md | 7 + .../skills/impeccable/reference/delight.md | 7 + .../skills/impeccable/reference/document.md | 74 ++- .../skills/impeccable/reference/editorial.md | 75 +++ .gemini/skills/impeccable/reference/layout.md | 7 + .gemini/skills/impeccable/reference/live.md | 427 ++++++++---------- .../skills/impeccable/reference/product.md | 62 +++ .../skills/impeccable/reference/quieter.md | 7 + .gemini/skills/impeccable/reference/shape.md | 40 +- .gemini/skills/impeccable/reference/teach.md | 43 +- .../skills/impeccable/reference/typeset.md | 7 + .github/skills/impeccable/SKILL.md | 403 ++++------------- .../skills/impeccable/reference/animate.md | 7 + .github/skills/impeccable/reference/bolder.md | 7 + .../skills/impeccable/reference/colorize.md | 7 + .../skills/impeccable/reference/delight.md | 7 + .../skills/impeccable/reference/document.md | 74 ++- .../skills/impeccable/reference/editorial.md | 75 +++ .github/skills/impeccable/reference/layout.md | 7 + .github/skills/impeccable/reference/live.md | 427 ++++++++---------- .../skills/impeccable/reference/product.md | 62 +++ .../skills/impeccable/reference/quieter.md | 7 + .github/skills/impeccable/reference/shape.md | 40 +- .github/skills/impeccable/reference/teach.md | 43 +- .../skills/impeccable/reference/typeset.md | 7 + .kiro/skills/impeccable/SKILL.md | 403 ++++------------- .kiro/skills/impeccable/reference/animate.md | 7 + .kiro/skills/impeccable/reference/bolder.md | 7 + .kiro/skills/impeccable/reference/colorize.md | 7 + .kiro/skills/impeccable/reference/delight.md | 7 + .kiro/skills/impeccable/reference/document.md | 74 ++- .../skills/impeccable/reference/editorial.md | 75 +++ .kiro/skills/impeccable/reference/layout.md | 7 + .kiro/skills/impeccable/reference/live.md | 427 ++++++++---------- .kiro/skills/impeccable/reference/product.md | 62 +++ .kiro/skills/impeccable/reference/quieter.md | 7 + .kiro/skills/impeccable/reference/shape.md | 40 +- .kiro/skills/impeccable/reference/teach.md | 43 +- .kiro/skills/impeccable/reference/typeset.md | 7 + .opencode/skills/impeccable/SKILL.md | 403 ++++------------- .../skills/impeccable/reference/animate.md | 7 + .../skills/impeccable/reference/bolder.md | 7 + .../skills/impeccable/reference/colorize.md | 7 + .../skills/impeccable/reference/delight.md | 7 + .../skills/impeccable/reference/document.md | 74 ++- .../skills/impeccable/reference/editorial.md | 75 +++ .../skills/impeccable/reference/layout.md | 7 + .opencode/skills/impeccable/reference/live.md | 427 ++++++++---------- .../skills/impeccable/reference/product.md | 62 +++ .../skills/impeccable/reference/quieter.md | 7 + .../skills/impeccable/reference/shape.md | 40 +- .../skills/impeccable/reference/teach.md | 43 +- .../skills/impeccable/reference/typeset.md | 7 + .pi/skills/impeccable/SKILL.md | 403 ++++------------- .pi/skills/impeccable/reference/animate.md | 7 + .pi/skills/impeccable/reference/bolder.md | 7 + .pi/skills/impeccable/reference/colorize.md | 7 + .pi/skills/impeccable/reference/delight.md | 7 + .pi/skills/impeccable/reference/document.md | 74 ++- .pi/skills/impeccable/reference/editorial.md | 75 +++ .pi/skills/impeccable/reference/layout.md | 7 + .pi/skills/impeccable/reference/live.md | 427 ++++++++---------- .pi/skills/impeccable/reference/product.md | 62 +++ .pi/skills/impeccable/reference/quieter.md | 7 + .pi/skills/impeccable/reference/shape.md | 40 +- .pi/skills/impeccable/reference/teach.md | 43 +- .pi/skills/impeccable/reference/typeset.md | 7 + .rovodev/skills/impeccable/SKILL.md | 403 ++++------------- .../skills/impeccable/reference/animate.md | 7 + .../skills/impeccable/reference/bolder.md | 7 + .../skills/impeccable/reference/colorize.md | 7 + .../skills/impeccable/reference/delight.md | 7 + .../skills/impeccable/reference/document.md | 74 ++- .../skills/impeccable/reference/editorial.md | 75 +++ .../skills/impeccable/reference/layout.md | 7 + .rovodev/skills/impeccable/reference/live.md | 427 ++++++++---------- .../skills/impeccable/reference/product.md | 62 +++ .../skills/impeccable/reference/quieter.md | 7 + .rovodev/skills/impeccable/reference/shape.md | 40 +- .rovodev/skills/impeccable/reference/teach.md | 43 +- .../skills/impeccable/reference/typeset.md | 7 + .trae-cn/skills/impeccable/SKILL.md | 403 ++++------------- .../skills/impeccable/reference/animate.md | 7 + .../skills/impeccable/reference/bolder.md | 7 + .../skills/impeccable/reference/colorize.md | 7 + .../skills/impeccable/reference/delight.md | 7 + .../skills/impeccable/reference/document.md | 74 ++- .../skills/impeccable/reference/editorial.md | 75 +++ .../skills/impeccable/reference/layout.md | 7 + .trae-cn/skills/impeccable/reference/live.md | 427 ++++++++---------- .../skills/impeccable/reference/product.md | 62 +++ .../skills/impeccable/reference/quieter.md | 7 + .trae-cn/skills/impeccable/reference/shape.md | 40 +- .trae-cn/skills/impeccable/reference/teach.md | 43 +- .../skills/impeccable/reference/typeset.md | 7 + .trae/skills/impeccable/SKILL.md | 403 ++++------------- .trae/skills/impeccable/reference/animate.md | 7 + .trae/skills/impeccable/reference/bolder.md | 7 + .trae/skills/impeccable/reference/colorize.md | 7 + .trae/skills/impeccable/reference/delight.md | 7 + .trae/skills/impeccable/reference/document.md | 74 ++- .../skills/impeccable/reference/editorial.md | 75 +++ .trae/skills/impeccable/reference/layout.md | 7 + .trae/skills/impeccable/reference/live.md | 427 ++++++++---------- .trae/skills/impeccable/reference/product.md | 62 +++ .trae/skills/impeccable/reference/quieter.md | 7 + .trae/skills/impeccable/reference/shape.md | 40 +- .trae/skills/impeccable/reference/teach.md | 43 +- .trae/skills/impeccable/reference/typeset.md | 7 + CLAUDE.md | 70 +-- scripts/build.js | 72 +-- scripts/lib/utils.js | 18 +- source/skills/impeccable/SKILL.md | 403 ++++------------- source/skills/impeccable/reference/animate.md | 7 + source/skills/impeccable/reference/bolder.md | 7 + .../skills/impeccable/reference/colorize.md | 7 + source/skills/impeccable/reference/delight.md | 7 + .../skills/impeccable/reference/document.md | 74 ++- .../skills/impeccable/reference/editorial.md | 75 +++ source/skills/impeccable/reference/layout.md | 7 + source/skills/impeccable/reference/live.md | 427 ++++++++---------- source/skills/impeccable/reference/product.md | 62 +++ source/skills/impeccable/reference/quieter.md | 7 + source/skills/impeccable/reference/shape.md | 40 +- source/skills/impeccable/reference/teach.md | 43 +- source/skills/impeccable/reference/typeset.md | 7 + 172 files changed, 7316 insertions(+), 6973 deletions(-) create mode 100644 .agents/skills/impeccable/reference/editorial.md create mode 100644 .agents/skills/impeccable/reference/product.md create mode 100644 .claude/skills/impeccable/reference/editorial.md create mode 100644 .claude/skills/impeccable/reference/product.md create mode 100644 .cursor/skills/impeccable/reference/editorial.md create mode 100644 .cursor/skills/impeccable/reference/product.md create mode 100644 .gemini/skills/impeccable/reference/editorial.md create mode 100644 .gemini/skills/impeccable/reference/product.md create mode 100644 .github/skills/impeccable/reference/editorial.md create mode 100644 .github/skills/impeccable/reference/product.md create mode 100644 .kiro/skills/impeccable/reference/editorial.md create mode 100644 .kiro/skills/impeccable/reference/product.md create mode 100644 .opencode/skills/impeccable/reference/editorial.md create mode 100644 .opencode/skills/impeccable/reference/product.md create mode 100644 .pi/skills/impeccable/reference/editorial.md create mode 100644 .pi/skills/impeccable/reference/product.md create mode 100644 .rovodev/skills/impeccable/reference/editorial.md create mode 100644 .rovodev/skills/impeccable/reference/product.md create mode 100644 .trae-cn/skills/impeccable/reference/editorial.md create mode 100644 .trae-cn/skills/impeccable/reference/product.md create mode 100644 .trae/skills/impeccable/reference/editorial.md create mode 100644 .trae/skills/impeccable/reference/product.md create mode 100644 source/skills/impeccable/reference/editorial.md create mode 100644 source/skills/impeccable/reference/product.md diff --git a/.agents/skills/impeccable/SKILL.md b/.agents/skills/impeccable/SKILL.md index 10d4ff4ee..5d16d7d54 100644 --- a/.agents/skills/impeccable/SKILL.md +++ b/.agents/skills/impeccable/SKILL.md @@ -3,7 +3,7 @@ name: impeccable description: Use when the user wants to design, redesign, shape, critique, audit, polish, clarify, distill, harden, optimize, adapt, animate, colorize, extract, or otherwise improve a frontend interface. Covers websites, landing pages, dashboards, product UI, app shells, components, forms, settings, onboarding, and empty states. Handles UX review, visual hierarchy, information architecture, cognitive load, accessibility, performance, responsive behavior, theming, anti-patterns, typography, fonts, spacing, layout, alignment, color, motion, micro-interactions, UX copy, error states, edge cases, i18n, and reusable design systems or tokens. Also use for bland designs that need to become bolder or more delightful, loud designs that should become quieter, live browser iteration on UI elements, or ambitious visual effects that should feel technically extraordinary. Not for backend-only or non-UI tasks. --- -This skill guides creation and editing/iteration of distinctive, production-grade frontend interfaces. Implement real working code with exceptional attention to aesthetic details and creative choices. +Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft. BEFORE doing any design work, run this one-time maintenance step. Tell the user: @@ -21,14 +21,16 @@ If the script removed files, briefly confirm what was cleaned up. If it found no After running the script, delete this entire section (from `` through `` inclusive) from THIS file so it does not run again until the next update. Save the file. -## Context Gathering Protocol +## Setup (non-optional) -Before any design work, ensure project context is loaded. Two files at the project root (case-insensitive): +Two steps before any design work. Both are required. Skipping either produces generic output that ignores the project. + +### 1. Context gathering + +Two files at the project root, case-insensitive: - **PRODUCT.md** — required. Users, brand, tone, anti-references, strategic principles. -- **DESIGN.md** — optional but strongly recommended. Colors, typography, elevation, components. - -**Never infer brand, audience, or tone from the codebase.** Code shows WHAT was built, not WHO it's for or HOW it should feel. Output is generic without PRODUCT.md. +- **DESIGN.md** — optional, strongly recommended. Colors, typography, elevation, components. Load both in one call: @@ -38,346 +40,129 @@ node .agents/skills/impeccable/scripts/load-context.mjs Consume the full JSON output. Never pipe through `head`, `tail`, `grep`, or `jq`. -**If the content is already in this session's conversation history, do NOT re-run.** Re-fetching wastes thousands of tokens. Exceptions that require a fresh load: you just ran `$impeccable teach` or `$impeccable document` (those write/update the files), or the user manually edited a file. +If the output is already in this session's conversation history, don't re-run. Exceptions requiring a fresh load: you just ran `$impeccable teach` or `$impeccable document` (they rewrite the files), or the user manually edited one. -**`$impeccable live` already warms context** via `live.mjs` — when you've run `live.mjs`, do NOT additionally run `load-context.mjs` in the same session. +`$impeccable live` already warms context via `live.mjs` — if you've run `live.mjs`, don't also run `load-context.mjs` this session. -**If PRODUCT.md is missing, empty, or clearly placeholder content (`[TODO]` markers, <200 chars):** run `$impeccable teach`, then resume the user's original task with the fresh context. Do not silently abandon intent. +If PRODUCT.md is missing, empty, or placeholder (`[TODO]` markers, <200 chars): run `$impeccable teach`, then resume the user's original task with the fresh context. -**If DESIGN.md is missing:** nudge once per session (*"Run `$impeccable document` for more on-brand output"*), then proceed. +If DESIGN.md is missing: nudge once per session (*"Run `$impeccable document` for more on-brand output"*), then proceed. ---- +### 2. Register -## Design Direction +Every design task is **editorial** (marketing, landing, brand, content — design IS the product) or **product** (app UI, admin, dashboard, tool — design SERVES the product). -Commit to a BOLD aesthetic direction: -- **Purpose**: What problem does this interface solve? Who uses it? -- **Tone**: Pick an extreme: brutally minimal, maximalist chaos, retro-futuristic, organic/natural, luxury/refined, playful/toy-like, editorial/magazine, brutalist/raw, art deco/geometric, soft/pastel, industrial/utilitarian, etc. There are so many flavors to choose from. Use these for inspiration but design one that is true to the aesthetic direction. -- **Constraints**: Technical requirements (framework, performance, accessibility). -- **Differentiation**: What makes this UNFORGETTABLE? What's the one thing someone will remember? +Identify before designing. Priority: (1) cue in the task itself ("landing page" vs "dashboard"); (2) the surface in focus (the page, file, or route being worked on); (3) `register` field in PRODUCT.md. First match wins. -**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work. The key is intentionality, not intensity. +If PRODUCT.md lacks the `register` field (legacy), infer it once from its "Users" and "Product Purpose" sections, then cache the inferred value for the session. Suggest the user run `$impeccable teach` to add the field explicitly. -Then implement working code that is: -- Production-grade and functional -- Visually striking and memorable -- Cohesive with a clear aesthetic point-of-view -- Meticulously refined in every detail +Load the matching reference: [reference/editorial.md](reference/editorial.md) or [reference/product.md](reference/product.md). The shared design laws below apply to both. -## Frontend Aesthetics Guidelines +## Shared design laws + +Apply to every design, both registers. Match implementation complexity to the aesthetic vision — maximalism needs elaborate code, minimalism needs precision. Interpret creatively. Vary across projects; never converge on the same choices. GPT is capable of extraordinary work — don't hold back. + +### Color + +- Use OKLCH. Reduce chroma as lightness approaches 0 or 100 — high chroma at extremes looks garish. +- Never use `#000` or `#fff`. Tint every neutral toward the brand hue (chroma 0.005–0.01 is enough). +- Pick a **color strategy** before picking colors. Four steps on the commitment axis: + - **Restrained** — tinted neutrals + one accent ≤10%. Product default; editorial minimalism. + - **Committed** — one saturated color carries 30–60% of the surface. Editorial default for brand-owned pages. + - **Full palette** — 3–4 named roles, each used deliberately. Editorial campaigns; product data viz. + - **Drenched** — the surface IS the color. Editorial heroes, campaign pages. +- The "one accent ≤10%" rule is Restrained only. Committed / Full palette / Drenched exceed it on purpose. Don't collapse every design to Restrained by reflex. + +### Theme + +Dark vs. light is never a default. Not dark "because tools look cool dark." Not light "to be safe." + +Before choosing, write one sentence of physical scene: who uses this, where, under what ambient light, in what mood. If the sentence doesn't force the answer, it's not concrete enough — add detail until it does. + +"Observability dashboard" does not force an answer. "SRE glancing at incident severity on a 27-inch monitor at 2am in a dim room" does. Run the sentence, not the category. ### Typography -→ *Consult [typography reference](reference/typography.md) for OpenType features, web font loading, and the deeper material on scales.* -Choose fonts that are beautiful, unique, and interesting. Pair a distinctive display font with a refined body font. +- Cap body line length at 65–75ch. +- Hierarchy through scale + weight contrast (≥1.25 ratio between steps). Avoid flat scales. - -Always apply these — do not consult a reference, just do them: +### Layout -- Use a modular type scale with fluid sizing (clamp) for headings on marketing/content pages. Use fixed `rem` scales for app UIs and dashboards (no major design system uses fluid type in product UI). -- Use fewer sizes with more contrast. A 5-step scale with at least a 1.25 ratio between steps creates clearer hierarchy than 8 sizes that are 1.1× apart. -- Line-height scales inversely with line length. Narrow columns want tighter leading, wide columns want more. For light text on dark backgrounds, ADD 0.05-0.1 to your normal line-height — light type reads as lighter weight and needs more breathing room. -- Cap line length at ~65-75ch. Body text wider than that is fatiguing. - - - -DO THIS BEFORE TYPING ANY FONT NAME. - -The model's natural failure mode is "I was told not to use Inter, so I will pick my next favorite font, which becomes the new monoculture." Avoid this by performing the following procedure on every project, in order: - -Step 1. Read the brief once. Write down 3 concrete words for the brand voice (e.g., "warm and mechanical and opinionated", "calm and clinical and careful", "fast and dense and unimpressed", "handmade and a little weird"). NOT "modern" or "elegant" — those are dead categories. - -Step 2. List the 3 fonts you would normally reach for given those words. Write them down. They are most likely from this list: - - -Fraunces -Newsreader -Lora -Crimson -Crimson Pro -Crimson Text -Playfair Display -Cormorant -Cormorant Garamond -Syne -IBM Plex Mono -IBM Plex Sans -IBM Plex Serif -Space Mono -Space Grotesk -Inter -DM Sans -DM Serif Display -DM Serif Text -Outfit -Plus Jakarta Sans -Instrument Sans -Instrument Serif - - -Reject every font that appears in the reflex_fonts_to_reject list. They are your training-data defaults and they create monoculture across projects. - -Step 3. Browse a font catalog with the 3 brand words in mind. Sources: Google Fonts, Pangram Pangram, Future Fonts, Adobe Fonts, ABC Dinamo, Klim Type Foundry, Velvetyne. Look for something that fits the brand as a *physical object* — a museum exhibit caption, a hand-painted shop sign, a 1970s mainframe terminal manual, a fabric label on the inside of a coat, a children's book printed on cheap newsprint. Reject the first thing that "looks designy" — that's the trained reflex too. Keep looking. - -Step 4. Cross-check the result. The right font for an "elegant" brief is NOT necessarily a serif. The right font for a "technical" brief is NOT necessarily a sans-serif. The right font for a "warm" brief is NOT Fraunces. If your final pick lines up with your reflex pattern, go back to Step 3. - - - -DO use a modular type scale with fluid sizing (clamp) on headings. -DO vary font weights and sizes to create clear visual hierarchy. -DO vary your font choices across projects. If you used a serif display font on the last project, look for a sans, monospace, or display face on this one. - -DO NOT use overused fonts like Inter, Roboto, Arial, Open Sans, or system defaults — but also do not simply switch to your second-favorite. Every font in the reflex_fonts_to_reject list above is banned. Look further. -DO NOT use monospace typography as lazy shorthand for "technical/developer" vibes. -DO NOT put large icons with rounded corners above every heading. They rarely add value and make sites look templated. -DO NOT use only one font family for the entire page. Pair a distinctive display font with a refined body font. -DO NOT use a flat type hierarchy where sizes are too close together. Aim for at least a 1.25 ratio between steps. -DO NOT set long body passages in uppercase. Reserve all-caps for short labels and headings. - - -### Color & Theme -→ *Consult [color reference](reference/color-and-contrast.md) for the deeper material on contrast, accessibility, and palette construction.* - -Commit to a cohesive palette. Dominant colors with sharp accents outperform timid, evenly-distributed palettes. - - -Always apply these — do not consult a reference, just do them: - -- Use OKLCH, not HSL. OKLCH is perceptually uniform: equal steps in lightness *look* equal, which HSL does not deliver. As you move toward white or black, REDUCE chroma — high chroma at extreme lightness looks garish. A light blue at 85% lightness wants ~0.08 chroma, not the 0.15 of your base color. -- Tint your neutrals toward your brand hue. Even a chroma of 0.005-0.01 is perceptible and creates subconscious cohesion between brand color and UI surfaces. The hue you tint toward should come from THIS brand, not from a "warm = friendly" or "cool = tech" formula. Pick the brand's actual hue first, then tint everything toward it. -- The 60-30-10 rule is about visual *weight*, not pixel count. 60% neutral / surface, 30% secondary text and borders, 10% accent. Accents work BECAUSE they're rare. Overuse kills their power. - - - -Theme (light vs dark) should be DERIVED from audience and viewing context, not picked from a default. Read the brief and ask: when is this product used, by whom, in what physical setting? - -- A perp DEX consumed during fast trading sessions → dark -- A hospital portal consumed by anxious patients on phones late at night → light -- A children's reading app → light -- A vintage motorcycle forum where users sit in their garage at 9pm → dark -- An observability dashboard for SREs in a dark office → dark -- A wedding planning checklist for couples on a Sunday morning → light -- A music player app for headphone listening at night → dark -- A food magazine homepage browsed during a coffee break → light - -Do not default everything to light "to play it safe." Do not default everything to dark "to look cool." Both defaults are the lazy reflex. The correct theme is the one the actual user wants in their actual context. - - - -DO use modern CSS color functions (oklch, color-mix, light-dark) for perceptually uniform, maintainable palettes. -DO tint your neutrals toward your brand hue. Even a subtle hint creates subconscious cohesion. - -DO NOT use gray text on colored backgrounds; it looks washed out. Use a shade of the background color instead. -DO NOT use pure black (#000) or pure white (#fff). Always tint; pure black/white never appears in nature. -DO NOT use the AI color palette: cyan-on-dark, purple-to-blue gradients, neon accents on dark backgrounds. -DO NOT use gradient text for impact — see below for the strict definition. Solid colors only for text. -DO NOT default to dark mode with glowing accents. It looks "cool" without requiring actual design decisions. -DO NOT default to light mode "to be safe" either. The point is to choose, not to retreat to a safe option. - - -### Layout & Space -→ *Consult [spatial reference](reference/spatial-design.md) for the deeper material on grids, container queries, and optical adjustments.* - -Create visual rhythm through varied spacing, not the same padding everywhere. Embrace asymmetry and unexpected compositions. Break the grid intentionally for emphasis. - - -Always apply these — do not consult a reference, just do them: - -- Vary spacing for hierarchy. A heading with extra space above it reads as more important. Don't apply the same padding everywhere. -- Use a semantic spacing scale (`--space-sm`, `--space-md`), not pixel-named (`--spacing-8`). -- Self-adjusting grid pattern: `grid-template-columns: repeat(auto-fit, minmax(280px, 1fr))` is the breakpoint-free responsive grid for card-style content. - - - -DO create visual rhythm through varied spacing: tight groupings, generous separations. -DO use fluid spacing with clamp() that breathes on larger screens. -DO use asymmetry and unexpected compositions; break the grid intentionally for emphasis. - -DO NOT wrap everything in cards. Not everything needs a container. -DO NOT nest cards inside cards. Visual noise; flatten the hierarchy. -DO NOT use identical card grids (same-sized cards with icon + heading + text, repeated endlessly). -DO NOT use the hero metric layout template (big number, small label, supporting stats, gradient accent). -DO NOT center everything. Left-aligned text with asymmetric layouts feels more designed. -DO NOT use the same spacing everywhere. Without rhythm, layouts feel monotonous. -DO NOT let body text wrap beyond ~80 characters per line. Add a max-width like 65–75ch so the eye can track easily. - - -### Visual Details - - -These CSS patterns are NEVER acceptable. They are the most recognizable AI design tells. Match-and-refuse: if you find yourself about to write any of these, stop and rewrite the element with a different structure entirely. - -BAN 1: Side-stripe borders on cards/list items/callouts/alerts - - PATTERN: `border-left:` or `border-right:` with width greater than 1px - - INCLUDES: hard-coded colors AND CSS variables - - FORBIDDEN: `border-left: 3px solid red`, `border-left: 4px solid #ff0000`, `border-left: 4px solid var(--color-warning)`, `border-left: 5px solid oklch(...)`, etc. - - WHY: this is the single most overused "design touch" in admin, dashboard, and medical UIs. It never looks intentional regardless of color, radius, opacity, or whether the variable name is "primary" or "warning" or "accent." - - REWRITE: use a different element structure entirely. Do not just swap to box-shadow inset. Reach for full borders, background tints, leading numbers/icons, or no visual indicator at all. - -BAN 2: Gradient text - - PATTERN: `background-clip: text` (or `-webkit-background-clip: text`) combined with a gradient background - - FORBIDDEN: any combination that makes text fill come from a `linear-gradient`, `radial-gradient`, or `conic-gradient` - - WHY: gradient text is decorative rather than meaningful and is one of the top three AI design tells - - REWRITE: use a single solid color for text. If you want emphasis, use weight or size, not gradient fill. - - -DO: Use intentional, purposeful decorative elements that reinforce brand. -DO NOT: Use border-left or border-right greater than 1px as a colored accent stripe on cards, list items, callouts, or alerts. See above for the strict CSS pattern. -DO NOT: Use glassmorphism everywhere (blur effects, glass cards, glow borders used decoratively rather than purposefully). -DO NOT: Use sparklines as decoration. Tiny charts that look sophisticated but convey nothing meaningful. -DO NOT: Use rounded rectangles with generic drop shadows. Safe, forgettable, could be any AI output. -DO NOT: Use modals unless there's truly no better alternative. Modals are lazy. +- Vary spacing for rhythm. Same padding everywhere is monotony. +- Cards are the lazy answer. Use them only when they're truly the best affordance. Nested cards are always wrong. +- Don't wrap everything in a container. Most things don't need one. ### Motion -→ *Consult [motion reference](reference/motion-design.md) for timing, easing, and reduced motion.* -Focus on high-impact moments: one well-orchestrated page load with staggered reveals creates more delight than scattered micro-interactions. +- Don't animate CSS layout properties. +- Ease out with exponential curves (ease-out-quart / quint / expo). No bounce, no elastic. -**DO**: Use motion to convey state changes: entrances, exits, feedback -**DO**: Use exponential easing (ease-out-quart/quint/expo) for natural deceleration -**DO**: For height animations, use grid-template-rows transitions instead of animating height directly -**DON'T**: Animate layout properties (width, height, padding, margin). Use transform and opacity only -**DON'T**: Use bounce or elastic easing. They feel dated and tacky; real objects decelerate smoothly +### Absolute bans -### Interaction -→ *Consult [interaction reference](reference/interaction-design.md) for forms, focus, and loading patterns.* +Match-and-refuse. If you're about to write any of these, rewrite the element with different structure. -Make interactions feel fast. Use optimistic UI: update immediately, sync later. +- **Side-stripe borders.** `border-left` or `border-right` greater than 1px as a colored accent on cards, list items, callouts, or alerts. Never intentional. Rewrite with full borders, background tints, leading numbers/icons, or nothing. +- **Gradient text.** `background-clip: text` combined with a gradient background. Decorative, never meaningful. Use a single solid color. Emphasis via weight or size. +- **Glassmorphism as default.** Blurs and glass cards used decoratively. Rare and purposeful, or nothing. +- **The hero-metric template.** Big number, small label, supporting stats, gradient accent. SaaS cliché. +- **Identical card grids.** Same-sized cards with icon + heading + text, repeated endlessly. +- **Modal as first thought.** Modals are usually laziness. Exhaust inline / progressive alternatives first. -**DO**: Use progressive disclosure. Start simple, reveal sophistication through interaction (basic options first, advanced behind expandable sections; hover states that reveal secondary actions) -**DO**: Design empty states that teach the interface, not just say "nothing here" -**DO**: Make every interactive surface feel intentional and responsive -**DON'T**: Repeat the same information (redundant headers, intros that restate the heading) -**DON'T**: Make every button primary. Use ghost buttons, text links, secondary styles; hierarchy matters +### Copy -### Responsive -→ *Consult [responsive reference](reference/responsive-design.md) for mobile-first, fluid design, and container queries.* +- Every word earns its place. No restated headings, no intros that repeat the title. +- **No em dashes.** Use commas, colons, semicolons, periods, or parentheses. Also not `--`. -**DO**: Use container queries (@container) for component-level responsiveness -**DO**: Adapt the interface for different contexts, not just shrink it -**DON'T**: Hide critical functionality on mobile. Adapt the interface, don't amputate it +### The AI slop test -### UX Writing -→ *Consult [ux-writing reference](reference/ux-writing.md) for labels, errors, and empty states.* +If someone could look at this interface and say "AI made that" without doubt, it's failed. Cross-register failures are the absolute bans above. Register-specific failures live in each reference. -**DO**: Make every word earn its place -**DON'T**: Repeat information users can already see +**Category-reflex check.** If someone could guess the theme and palette from the category name alone — "observability → dark blue", "healthcare → white + teal", "finance → navy + gold", "crypto → neon on black" — it's the training-data reflex. Rework the scene sentence and color strategy until the answer is no longer obvious from the domain. ---- +## Commands -## The AI Slop Test +| Command | Category | Description | Reference | +|---|---|---|---| +| `craft [feature]` | Build | Shape, then build a feature end-to-end | [reference/craft.md](reference/craft.md) | +| `shape [feature]` | Build | Plan UX/UI before writing code | [reference/shape.md](reference/shape.md) | +| `teach` | Build | Set up PRODUCT.md and DESIGN.md context | [reference/teach.md](reference/teach.md) | +| `document` | Build | Generate DESIGN.md from existing project code | [reference/document.md](reference/document.md) | +| `extract [target]` | Build | Pull reusable tokens and components into design system | [reference/extract.md](reference/extract.md) | +| `critique [target]` | Evaluate | UX design review with heuristic scoring | [reference/critique.md](reference/critique.md) | +| `audit [target]` | Evaluate | Technical quality checks (a11y, perf, responsive) | [reference/audit.md](reference/audit.md) | +| `polish [target]` | Refine | Final quality pass before shipping | [reference/polish.md](reference/polish.md) | +| `bolder [target]` | Refine | Amplify safe or bland designs | [reference/bolder.md](reference/bolder.md) | +| `quieter [target]` | Refine | Tone down aggressive or overstimulating designs | [reference/quieter.md](reference/quieter.md) | +| `distill [target]` | Refine | Strip to essence, remove complexity | [reference/distill.md](reference/distill.md) | +| `harden [target]` | Refine | Production-ready: errors, i18n, edge cases | [reference/harden.md](reference/harden.md) | +| `onboard [target]` | Refine | Design first-run flows, empty states, activation | [reference/onboard.md](reference/onboard.md) | +| `animate [target]` | Enhance | Add purposeful animations and motion | [reference/animate.md](reference/animate.md) | +| `colorize [target]` | Enhance | Add strategic color to monochromatic UIs | [reference/colorize.md](reference/colorize.md) | +| `typeset [target]` | Enhance | Improve typography hierarchy and fonts | [reference/typeset.md](reference/typeset.md) | +| `layout [target]` | Enhance | Fix spacing, rhythm, and visual hierarchy | [reference/layout.md](reference/layout.md) | +| `delight [target]` | Enhance | Add personality and memorable touches | [reference/delight.md](reference/delight.md) | +| `overdrive [target]` | Enhance | Push past conventional limits | [reference/overdrive.md](reference/overdrive.md) | +| `clarify [target]` | Fix | Improve UX copy, labels, and error messages | [reference/clarify.md](reference/clarify.md) | +| `adapt [target]` | Fix | Adapt for different devices and screen sizes | [reference/adapt.md](reference/adapt.md) | +| `optimize [target]` | Fix | Diagnose and fix UI performance | [reference/optimize.md](reference/optimize.md) | +| `live` | Iterate | Visual variant mode: pick elements in the browser, generate alternatives | [reference/live.md](reference/live.md) | -**Critical quality check**: If you showed this interface to someone and said "AI made this," would they believe you immediately? If yes, that's the problem. - -A distinctive interface should make someone ask "how was this made?" not "which AI made this?" - -Review the DON'T guidelines above. They are the fingerprints of AI-generated work. - ---- - -## Implementation Principles - -Match implementation complexity to the aesthetic vision. Maximalist designs need elaborate code with extensive animations and effects. Minimalist or refined designs need restraint, precision, and careful attention to spacing, typography, and subtle details. - -Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices across generations. - -Remember: GPT is capable of extraordinary creative work. Don't hold back. Show what can truly be created when thinking outside the box and committing fully to a distinctive vision. - ---- - -## Command Router - -This skill supports sub-commands. Parse the first word of the argument string to determine routing. +Plus two management commands — `pin ` and `unpin `, detailed below. ### Routing rules -1. **No argument at all** (user typed just `$impeccable`): Display the command menu below, then ask the user what they'd like to do. -2. **First word matches a sub-command**: Route to that command's reference file. Everything after the sub-command name is the target. -3. **First word does NOT match any sub-command**: This is a general design invocation. Follow the Design Direction and Implementation Principles above, using the full argument string as context. +1. **No argument** — render the table above as the user-facing command menu, grouped by category. Ask what they'd like to do. +2. **First word matches a command** — load its reference file and follow its instructions. Everything after the command name is the target. +3. **First word doesn't match** — general design invocation. Apply the setup steps, shared design laws, and the loaded register reference, using the full argument as context. -### Command menu (display when invoked with no argument) - -> **Available commands:** -> -> **Build & Plan** -> `$impeccable craft [feature]` - Shape, then build a feature end-to-end -> `$impeccable shape [feature]` - Plan UX/UI before writing code -> `$impeccable teach` - Set up PRODUCT.md and DESIGN.md context for this project -> `$impeccable document` - Generate DESIGN.md from existing project code -> `$impeccable extract [target]` - Pull reusable tokens and components into design system -> -> **Evaluate** -> `$impeccable critique [target]` - UX design review with heuristic scoring -> `$impeccable audit [target]` - Technical quality checks (a11y, perf, responsive) -> -> **Refine** -> `$impeccable polish [target]` - Final quality pass before shipping -> `$impeccable bolder [target]` - Amplify safe/bland designs -> `$impeccable quieter [target]` - Tone down aggressive/overstimulating designs -> `$impeccable distill [target]` - Strip to essence, remove complexity -> `$impeccable harden [target]` - Production-ready: errors, i18n, edge cases -> `$impeccable onboard [target]` - Design first-run flows, empty states, activation -> -> **Enhance** -> `$impeccable animate [target]` - Add purposeful animations and motion -> `$impeccable colorize [target]` - Add strategic color to monochromatic UIs -> `$impeccable typeset [target]` - Improve typography hierarchy and fonts -> `$impeccable layout [target]` - Fix spacing, rhythm, and visual hierarchy -> `$impeccable delight [target]` - Add personality and memorable touches -> `$impeccable overdrive [target]` - Push past conventional limits -> -> **Fix** -> `$impeccable clarify [target]` - Improve UX copy, labels, and error messages -> `$impeccable adapt [target]` - Adapt for different devices and screen sizes -> `$impeccable optimize [target]` - Diagnose and fix UI performance -> -> **Iterate** -> `$impeccable live` - Visual variant mode: pick elements in the browser, generate alternatives -> -> **Manage** -> `$impeccable pin ` - Create a standalone shortcut (e.g., pin audit creates $audit) -> `$impeccable unpin ` - Remove a pinned shortcut -> -> Or use `$impeccable [description]` directly to apply design principles to any task. - -### Sub-command reference table - -When a sub-command is matched, load the linked reference and follow its instructions. The design principles, guidelines, and Context Gathering Protocol from this skill are already loaded. Do NOT re-invoke $impeccable. - -| Command | Reference | Summary | -|---------|-----------|---------| -| `craft` | [craft](reference/craft.md) | Full shape-then-build flow with visual iteration | -| `teach` | [teach](reference/teach.md) | One-time setup: gather design context for the project | -| `extract` | [extract](reference/extract.md) | Pull reusable tokens and components into design system | -| `document` | [document](reference/document.md) | Generate DESIGN.md from existing project code (visual design system doc) | -| `shape` | [shape](reference/shape.md) | Plan UX and UI before writing code (produces a design brief) | -| `critique` | [critique](reference/critique.md) | UX design review with heuristic scoring and persona testing | -| `audit` | [audit](reference/audit.md) | Technical quality checks across a11y, perf, theming, responsive, anti-patterns | -| `polish` | [polish](reference/polish.md) | Final quality pass: alignment, spacing, consistency, micro-details | -| `bolder` | [bolder](reference/bolder.md) | Amplify safe or boring designs for more visual impact | -| `quieter` | [quieter](reference/quieter.md) | Tone down visually aggressive or overstimulating designs | -| `distill` | [distill](reference/distill.md) | Strip designs to their essence, remove unnecessary complexity | -| `harden` | [harden](reference/harden.md) | Production-ready: error handling, i18n, text overflow, edge cases | -| `onboard` | [onboard](reference/onboard.md) | Design onboarding flows, first-run experiences, and empty states that guide users to value | -| `animate` | [animate](reference/animate.md) | Add purposeful animations and micro-interactions | -| `colorize` | [colorize](reference/colorize.md) | Add strategic color to monochromatic interfaces | -| `typeset` | [typeset](reference/typeset.md) | Improve typography: fonts, hierarchy, sizing, readability | -| `layout` | [layout](reference/layout.md) | Improve layout, spacing, and visual rhythm | -| `delight` | [delight](reference/delight.md) | Add personality, joy, and memorable touches | -| `overdrive` | [overdrive](reference/overdrive.md) | Push interfaces past conventional limits | -| `clarify` | [clarify](reference/clarify.md) | Improve UX copy, labels, error messages, and microcopy | -| `adapt` | [adapt](reference/adapt.md) | Adapt designs across screen sizes, devices, and platforms | -| `optimize` | [optimize](reference/optimize.md) | Diagnose and fix UI performance issues | -| `live` | [live](reference/live.md) | Interactive visual variant mode: pick elements, generate alternatives in the browser | - ---- +Setup (context gathering, register) is already loaded by then; sub-commands don't re-invoke `$impeccable`. ## Pin / Unpin -**Pin** creates a standalone shortcut so `$` invokes `$impeccable ` directly. **Unpin** removes it. The script writes to every harness directory present in the project so shortcuts work across every AI tool the user has installed. +**Pin** creates a standalone shortcut so `$` invokes `$impeccable ` directly. **Unpin** removes it. The script writes to every harness directory present in the project. ```bash node .agents/skills/impeccable/scripts/pin.mjs ``` -Valid `` is any sub-command from the router table above. Report the script's result concisely — confirm the new shortcut on success, relay stderr verbatim on error. \ No newline at end of file +Valid `` is any command from the table above. Report the script's result concisely — confirm the new shortcut on success, relay stderr verbatim on error. \ No newline at end of file diff --git a/.agents/skills/impeccable/reference/animate.md b/.agents/skills/impeccable/reference/animate.md index 0186ce081..8afad8aea 100644 --- a/.agents/skills/impeccable/reference/animate.md +++ b/.agents/skills/impeccable/reference/animate.md @@ -2,6 +2,13 @@ Analyze a feature and strategically add animations and micro-interactions that enhance understanding, provide feedback, and create delight. +--- + +## Register + +Editorial: orchestrated page-load sequences, staggered reveals, scroll-driven animation. Motion is part of the voice; one well-rehearsed entrance beats scattered micro-interactions. + +Product: 150–250 ms on most transitions. Motion conveys state — feedback, reveal, loading, transitions between views. No page-load choreography; users are in a task and won't wait for it. --- diff --git a/.agents/skills/impeccable/reference/bolder.md b/.agents/skills/impeccable/reference/bolder.md index cb3481663..5132657b7 100644 --- a/.agents/skills/impeccable/reference/bolder.md +++ b/.agents/skills/impeccable/reference/bolder.md @@ -1,5 +1,12 @@ Increase visual impact and personality in designs that are too safe, generic, or visually underwhelming, creating more engaging and memorable experiences. +--- + +## Register + +Editorial: "bolder" means distinctive. Extreme scale, unexpected color, typographic risk, committed POV. + +Product: "bolder" rarely means theatrics — those undermine trust. It means stronger hierarchy, clearer weight contrast, one sharper accent, more committed density. The amplification is in clarity, not drama. --- diff --git a/.agents/skills/impeccable/reference/colorize.md b/.agents/skills/impeccable/reference/colorize.md index bb94be480..3b34f9369 100644 --- a/.agents/skills/impeccable/reference/colorize.md +++ b/.agents/skills/impeccable/reference/colorize.md @@ -2,6 +2,13 @@ Strategically introduce color to designs that are too monochromatic, gray, or lacking in visual warmth and personality. +--- + +## Register + +Editorial: palette IS voice. A dominant color can own the page; unexpected combinations are allowed. Accent rate stays ≤10% — rarity is what makes it pop. + +Product: semantic-first. Accent color is reserved for primary action, current selection, and state indicators — not decoration. Every color has a consistent meaning across every screen. --- diff --git a/.agents/skills/impeccable/reference/delight.md b/.agents/skills/impeccable/reference/delight.md index 8a781e70e..010b17a7e 100644 --- a/.agents/skills/impeccable/reference/delight.md +++ b/.agents/skills/impeccable/reference/delight.md @@ -2,6 +2,13 @@ Identify opportunities to add moments of joy, personality, and unexpected polish that transform functional interfaces into delightful experiences. +--- + +## Register + +Editorial: delight can be distributed — copy voice, section transitions, discovery rewards, seasonal touches, personality across the whole surface. + +Product: delight at specific moments, not pages. Completion, first-time actions, error recovery, milestone crossings. Reliability and consistency carry the rest of the experience; delight pushed everywhere reads as noise. --- diff --git a/.agents/skills/impeccable/reference/document.md b/.agents/skills/impeccable/reference/document.md index 6c08cf4d5..1be6c9404 100644 --- a/.agents/skills/impeccable/reference/document.md +++ b/.agents/skills/impeccable/reference/document.md @@ -22,7 +22,14 @@ Optional evocative subtitles are allowed in the form `## 2. Colors: The [Name] P If a `DESIGN.md` already exists, **do not silently overwrite it**. Show the user the existing file and ask the user directly to clarify what you cannot infer. whether to refresh, overwrite, or merge. -## Process (approach C: auto-extract, then confirm descriptive language) +## Two paths + +- **Scan mode** (default): the project has design tokens, components, or rendered output. Extract, then confirm descriptive language. Use when there's code to analyze. +- **Seed mode**: the project is pre-implementation (fresh teach, nothing built yet). Interview for five high-level answers, write a minimal DESIGN.md marked ``. Re-run in scan mode once there's code. + +Decide by scanning first (Scan mode Step 1). If the scan finds no tokens, no component files, and no rendered site, offer seed mode — don't silently switch. `$impeccable document --seed` forces seed mode regardless of code presence. + +## Scan mode (approach C: auto-extract, then confirm descriptive language) ### Step 1: Find the design assets @@ -272,6 +279,71 @@ Do not reword. The panel shows these as secondary collapsible context; the same 3. Offer to refine any section: "Want me to revise a section, add component patterns I missed, or adjust the atmosphere language?" 4. **Refresh the session cache.** Run `node {{scripts_path}}/load-context.mjs` one final time so the newly-written DESIGN.md lands in conversation. Subsequent commands in this session will use the fresh version automatically without re-reading. +## Seed mode + +For projects with no visual system to extract yet. Produces a minimal scaffold, not a full spec. + +### Step 1: Confirm seed mode + +Before interviewing: "There's no existing visual system to scan. I'll ask five quick questions to seed a starter DESIGN.md. You can re-run `$impeccable document` once there's code, to capture the real tokens and components. OK?" + +If the user prefers to skip, stop. No file. + +### Step 2: Five questions + +Group into one `AskUserQuestion` interaction. Options must be concrete. + +1. **Color strategy.** Pick one: + - Restrained — tinted neutrals + one accent ≤10% + - Committed — one saturated color carries 30–60% of the surface + - Full palette — 3–4 named color roles, each deliberate + - Drenched — the surface IS the color + + Then: one hue family or anchor reference ("deep teal", "mustard", "Klim #ff4500 orange"). + +2. **Typography direction.** Pick one (specific fonts come later): + - Serif display + sans body + - Single sans (warm / technical / geometric / humanist — pick a feel) + - Display + mono + - Mono-forward + - Editorial script + sans + +3. **Motion energy.** Pick one: + - Restrained — state changes only + - Responsive — feedback + transitions, no choreography + - Choreographed — orchestrated entrances, scroll-driven sequences + +4. **Three named references.** Brands, products, printed objects. Not adjectives. + +5. **One anti-reference.** What it should NOT feel like. Also named. + +### Step 3: Write seed DESIGN.md + +Use the six-section spec from Scan mode. Populate what the interview answers; leave the rest as honest placeholders. The seed is a scaffold, not a fabricated spec. + +Lead the file with: + +```markdown + +``` + +Per-section guidance in seed mode: + +- **Overview**: Creative North Star and philosophy phrased from the answers (color strategy + motion energy + references). Reference the user's anti-reference directly. +- **Colors**: Color strategy as a Named Rule (e.g. *"The Drenched Rule. The surface IS the color."*). Hue family or anchor reference. No hex values — mark as `[to be resolved during implementation]`. +- **Typography**: the direction the user picked (e.g. "Serif display + sans body"). No font names yet — `[font pairing to be chosen at implementation]`. +- **Elevation**: inferred from motion energy. Restrained/Responsive → flat by default; Choreographed → layered. One sentence. +- **Components**: omit entirely — no components exist yet. +- **Do's and Don'ts**: carry PRODUCT.md's anti-references directly plus the anti-reference named in Q5. + +Skip the `DESIGN.json` sidecar in seed mode. The live panel needs real tokens and components to render; there is nothing to show yet. The sidecar gets generated on the next Scan-mode run. + +### Step 4: Confirm and refresh session cache + +1. Show the seed DESIGN.md. Call out that it is a seed (the marker is the literal commitment). +2. Tell the user: "Re-run `$impeccable document` once you have some code. That pass will extract real tokens and generate the sidecar." +3. Run `node {{scripts_path}}/load-context.mjs` once so the seed lands in conversation for the rest of the session. + ## Style guidelines - **Match the spec, don't invent new sections.** The six section names are fixed. If you have Layout/Motion/Responsive content to document, fold it into Overview (philosophy-level rules) or Components (per-component behavior). diff --git a/.agents/skills/impeccable/reference/editorial.md b/.agents/skills/impeccable/reference/editorial.md new file mode 100644 index 000000000..50bc0ec3b --- /dev/null +++ b/.agents/skills/impeccable/reference/editorial.md @@ -0,0 +1,75 @@ +# Editorial register + +When design IS the product: marketing pages, landing pages, brand sites, editorial content, campaign pages, portfolios. + +## The editorial slop test + +If someone could look at this and say "AI made that" without hesitation, it's failed. The bar is distinctiveness — a reader should ask "how was this made?", not "which AI made this?" + +Editorial isn't a neutral register. AI-generated landing pages have flooded the internet, and average is no longer findable. Restraint without intent now reads as mediocre, not refined. Editorial has to take a POV, commit to a specific audience, risk strangeness. Go big or go home. + +## Typography + +### Font selection procedure + +Every project. Never skip. + +1. Read the brief. Write three concrete brand-voice words — not "modern" or "elegant," but "warm and mechanical and opinionated" or "calm and clinical and careful." Physical-object words. +2. List the three fonts you'd reach for by reflex. If any appear in the reflex-reject list below, reject them — they are training-data defaults and they create monoculture. +3. Browse a real catalog (Google Fonts, Pangram Pangram, Future Fonts, Adobe Fonts, ABC Dinamo, Klim, Velvetyne) with the three words in mind. Find the font for the brand as a *physical object* — a museum caption, a 1970s terminal manual, a fabric label, a cheap-newsprint children's book. Reject the first thing that "looks designy." +4. Cross-check. "Elegant" is not necessarily serif. "Technical" is not necessarily sans. "Warm" is not Fraunces. If the final pick lines up with the original reflex, start over. + +### Reflex-reject list + +Training-data defaults. Ban list — look further: + +Fraunces · Newsreader · Lora · Crimson · Crimson Pro · Crimson Text · Playfair Display · Cormorant · Cormorant Garamond · Syne · IBM Plex Mono · IBM Plex Sans · IBM Plex Serif · Space Mono · Space Grotesk · Inter · DM Sans · DM Serif Display · DM Serif Text · Outfit · Plus Jakarta Sans · Instrument Sans · Instrument Serif + +### Pairing + +Distinctive display font + refined body font. Two families minimum. Vary across projects — if the last one was a serif display, this one isn't. + +### Scale + +Modular scale, fluid `clamp()` for headings, ≥1.25 ratio between steps. Flat scales (1.1× apart) read as uncommitted. + +Light text on dark backgrounds: add 0.05–0.1 to line-height. Light type reads as lighter weight and needs more breathing room. + +## Color + +Editorial has permission for Committed, Full palette, and Drenched strategies. Use them. A single saturated color spread across a hero is not excess — it's voice. A beige-and-muted-slate landing page ignores the register. + +- Name a real reference before picking a strategy. "Klim Type Foundry #ff4500 orange drench", "Mailchimp yellow full palette", "Condé Nast Traveler muted navy restraint". Unnamed ambition becomes beige. +- Palette IS voice. A calm site and a restless site should not share palette mechanics. +- When the strategy is Committed or Drenched, the color is load-bearing. Don't hedge with neutrals around the edges — commit. +- Don't converge across projects. If the last editorial was restrained-on-cream, this one is not. + +## Layout + +- Asymmetric compositions. Break the grid intentionally for emphasis. +- Fluid spacing with `clamp()` that breathes on larger viewports. Vary for rhythm — generous separations, tight groupings. +- Don't center everything. Left-aligned in asymmetric compositions feels more designed. +- When cards ARE the right affordance, use `grid-template-columns: repeat(auto-fit, minmax(280px, 1fr))` — breakpoint-free responsiveness. + +## Motion + +- One well-orchestrated page-load with staggered reveals beats scattered micro-interactions. +- For collapsing/expanding sections, transition `grid-template-rows` rather than `height`. + +## Editorial bans (on top of the shared absolute bans) + +- Monospace as lazy shorthand for "technical / developer." +- Large rounded-corner icons above every heading. Screams template. +- Single-font-family pages. +- All-caps body copy. Reserve caps for short labels and headings. +- Timid palettes and average layouts. Safe = invisible. + +## Editorial permissions + +Editorial can afford things product can't. Take them. + +- Ambitious first-load motion. Reveals, scroll-triggered transitions, typographic choreography. +- Single-purpose viewports. One dominant idea per fold, long scroll, deliberate pacing. +- Typographic risk. Enormous display type, unexpected italic cuts, mixed cases, expressive pairings. +- Unexpected color strategies. Palette IS voice — a calm site and a restless site should not share palette mechanics. +- Art direction per section. Different sections can have different visual worlds if the narrative demands it. Consistency of voice beats consistency of treatment. diff --git a/.agents/skills/impeccable/reference/layout.md b/.agents/skills/impeccable/reference/layout.md index cd6b778e7..1a05913a0 100644 --- a/.agents/skills/impeccable/reference/layout.md +++ b/.agents/skills/impeccable/reference/layout.md @@ -1,5 +1,12 @@ Assess and improve layout and spacing that feels monotonous, crowded, or structurally weak — turning generic arrangements into intentional, rhythmic compositions. +--- + +## Register + +Editorial: asymmetric compositions, fluid spacing with `clamp()`, intentional grid-breaking for emphasis. Rhythm through contrast — tight groupings paired with generous separations. + +Product: predictable grids, consistent densities, familiar navigation patterns. Responsive behavior is structural (collapse sidebar, responsive table), not fluid typography. Consistency IS an affordance. --- diff --git a/.agents/skills/impeccable/reference/live.md b/.agents/skills/impeccable/reference/live.md index 90f3317ea..4ecf01722 100644 --- a/.agents/skills/impeccable/reference/live.md +++ b/.agents/skills/impeccable/reference/live.md @@ -1,68 +1,215 @@ -Launch interactive live variant mode: select elements in the browser, pick a design action, and get AI-generated HTML+CSS variants hot-swapped via the dev server's HMR. +Interactive live variant mode: select elements in the browser, pick a design action, and get AI-generated HTML+CSS variants hot-swapped via the dev server's HMR. ## Prerequisites -- A running development server with hot module replacement (Vite, Next.js, Bun, etc.), OR a static HTML file open in the browser +A running dev server with hot module replacement (Vite, Next.js, Bun, etc.), OR a static HTML file open in the browser. -## Start Live Mode (one command) +## The contract (read once) -The `live.mjs` entry point does everything in a single call: checks config, starts (or reuses) the server, injects the script tag, loads `.impeccable.md` context. +Execute in order. No step skipped, no step reordered. + +1. `live.mjs` — boot. +2. Navigate the browser to the URL that serves `pageFile`. +3. Poll loop with the default long timeout (600000 ms). After every event or `--reply`, run `live-poll.mjs` again immediately. Never pass a short `--timeout=`. +4. On `generate` — read screenshot if present; load the action's reference; plan three distinct directions; write all variants in one edit; `--reply done`; poll again. +5. On `accept` / `discard` — the poll script already cleaned up; just poll again. +6. On `exit` — run the cleanup at the bottom. + +Harness: Cursor runs the poll in the foreground (blocking shell — not a background terminal, not a subagent). Claude Code can background the poll with no short timeout. Other harnesses: foreground unless the poll's stdout reliably returns to this session. + +Chat is overhead. No recap, no tutorial output, no pasting PRODUCT / DESIGN bodies. Spend tokens on tools and edits; on failure, one or two short sentences. + +## Start ```bash node {{scripts_path}}/live.mjs ``` -### Happy path +Output JSON: `{ ok, serverPort, serverToken, pageFile, hasProduct, product, productPath, hasDesign, design, designPath, migrated }`. Keep PRODUCT.md and DESIGN.md in mind for variant generation — **DESIGN.md wins on visual decisions; PRODUCT.md wins on strategic/voice decisions.** If `migrated: true`, the loader auto-renamed legacy `.impeccable.md` to `PRODUCT.md`; mention this once and suggest `$impeccable document` for the matching DESIGN.md. -Output JSON: -```json -{ - "ok": true, - "serverPort": 8400, - "serverToken": "...", - "pageFile": "public/index.html", - "hasProduct": true, - "product": "...full PRODUCT.md contents...", - "productPath": "PRODUCT.md", - "hasDesign": true, - "design": "...full DESIGN.md contents...", - "designPath": "DESIGN.md", - "migrated": false -} +`serverPort` and `serverToken` belong to the small **Impeccable live helper** HTTP server (serves `/live.js`, SSE, and `/poll`). That port is **not** your dev server and is usually not the URL you open to view the app. The browser page is whatever origin serves the HTML entry (`pageFile` / Vite / Next / Bun / tunnel / LAN hostname). + +If output is `{ ok: false, error: "config_missing", configPath }`, this project hasn't used live mode. See **First-time setup** at the bottom. + +## Poll loop + +``` +LOOP: + node {{scripts_path}}/live-poll.mjs # default long timeout; no --timeout= + Read JSON; dispatch on "type" + + "generate" → Handle Generate; reply done; LOOP + "accept" → Handle Accept; LOOP + "discard" → Handle Discard; LOOP + "timeout" → LOOP + "exit" → break → Cleanup ``` -**`serverPort` / `serverToken`:** These belong to the small **Impeccable live helper** HTTP server (serves `/live.js` for the injected `