Files
pbakaus_impeccable/AGENTS.md
T
Paul BakausandClaude Opus 4.6 e1032b7285 Add icon-tile-stack rule and cross-validate engine against skill
A new icon-tile-stack detection (the canonical AI feature-card with a
small rounded-square icon container above a heading), backed by a
two-column TDD fixture, plus a single-source-of-truth design that ties
the engine to the impeccable skill so they can no longer drift silently.

Detection
- New icon-tile-stack rule (slop): heading's previousElementSibling is
  a 32–128px rounded-square element with a non-transparent background
  or border, contains an svg/icon-i child, and sits above (not next to)
  the heading. Excludes round avatars, wide thumbnails, side-by-side
  layouts, tiny icons, and hero images.
- Two-column fixture convention: a single icon-tile-stack.html with a
  flag column (4 cases) and pass column (6 cases), with snippet-text
  matching used by the fixture test.

Single source of truth
- Each ANTIPATTERNS entry can now declare skillSection + skillGuideline.
  18 of 25 rules carry these fields; the build's new
  validateAntipatternRules() in scripts/build.js fails if any declared
  skillGuideline isn't found verbatim in the right SKILL.md section.
- scripts/build-extension.js now includes the description field in
  extension/detector/antipatterns.json (it was previously dropped).
- The existing count validator was promoted from warn to error so
  command count drift fails the build the same way detection drift does.

Impeccable skill DON'Ts
- Added 4 new top-level DON'Ts that target real default AI behavior:
  single-font, flat-type-hierarchy, all-caps-body, line-length.
- Cut 7 new DON'Ts I had drafted (tight-leading, tiny-text, wide-tracking,
  justified-text, low-contrast, cramped-padding, skipped-heading) because
  they teach things every model already knows from CSS/a11y basics. The
  detector still catches all of them.

Stale count cleanup
- 22 commands → 21 across 17 references in HTML, README, NOTICE, AGENTS,
  plugin.json, marketplace.json (left over from the validate skill removal).
- Dropped the hand-coded "212 design guidelines" marketing copy on the
  homepage, which never mapped to any real count.

Sub-agent
- New private .claude/agents/anti-patterns.md captures the full TDD
  recipe, schema, plug-in points, jsdom constraints, and pre-commit
  checklist so future sessions can add rules end-to-end without
  re-investigating the wiring.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 22:58:13 -07:00

10 KiB

Impeccable

The vocabulary you didn't know you needed. 1 skill, 21 commands, and curated anti-patterns for impeccable style. Works with Cursor, Claude Code, Gemini CLI, and Codex CLI.

Repository Purpose

Maintain a single source of truth for design-focused skills and commands, then automatically transform them into provider-specific formats. Each provider has different capabilities (frontmatter, arguments, modular files), so we use a build system to generate appropriate outputs.

Architecture: Option A (Feature-Rich Source)

We use a feature-rich source format that gets transformed for each provider:

  • Source files (source/): Full metadata with YAML frontmatter, args, descriptions
  • Build system (scripts/): Transforms source → provider-specific formats
  • Distribution (dist/): Committed output files for 4 providers

Why Option A?

Cursor doesn't support frontmatter or arguments (lowest common denominator). Instead of limiting all providers, we:

  1. Author with full metadata in source files
  2. Generate full-featured versions for providers that support it (Claude Code, Gemini, Codex)
  3. Generate downgraded versions for Cursor (strip frontmatter, rely on appending)

Repository Structure

impeccable/
├── source/                      # EDIT THESE! Single source of truth
│   ├── commands/                # Command definitions with frontmatter
│   │   └── normalize.md
│   └── skills/                  # Skill definitions with frontmatter
│       └── impeccable/
├── dist/                        # Generated outputs (committed for users)
│   ├── cursor/                  # Commands + Agent Skills
│   │   └── .cursor/
│   │       ├── commands/*.md
│   │       └── skills/*/SKILL.md
│   ├── claude-code/             # Full featured
│   │   └── .claude/
│   │       ├── commands/*.md
│   │       └── skills/*/SKILL.md
│   ├── gemini/                  # TOML commands + modular skills
│   │   ├── .gemini/
│   │   │   └── commands/*.toml
│   │   ├── GEMINI.md
│   │   └── GEMINI.*.md
│   └── codex/                   # Custom prompts + Agent Skills
│       └── .codex/
│           ├── prompts/*.md
│           └── skills/*/SKILL.md
├── api/                         # Vercel Functions (production)
│   ├── skills.js                # GET /api/skills
│   ├── commands.js              # GET /api/commands
│   └── download/
│       ├── [type]/[provider]/[id].js   # Individual downloads
│       └── bundle/[provider].js        # Bundle downloads
├── public/                      # Website for impeccable.style
│   ├── index.html               # Main page
│   ├── css/                     # Modular CSS (9 files)
│   │   ├── main.css             # Entry point with imports
│   │   ├── tokens.css           # Design system
│   │   └── ...                  # Component styles
│   └── app.js                   # Vanilla JS
├── server/                      # Bun server (local dev only)
│   ├── index.js                 # Serves website + API routes
│   └── lib/
│       └── api-handlers.js      # Shared API logic (used by both server & functions)
├── scripts/                     # Build system (Bun)
│   ├── build.js                 # Main orchestrator
│   ├── lib/
│   │   ├── utils.js             # Shared utilities
│   │   ├── zip.js               # ZIP generation
│   │   └── transformers/        # Provider-specific transformers
│   │       ├── cursor.js
│   │       ├── claude-code.js
│   │       ├── gemini.js
│   │       └── codex.js
├── README.md                    # End user documentation
├── DEVELOP.md                   # Contributor documentation
└── package.json                 # Bun scripts

Website (impeccable.style)

Tech Stack:

  • Vanilla JavaScript (no frameworks)
  • Modern CSS with Bun's bundler (nesting, OKLCH colors, @import)
  • Local Development: Bun server with native routes (server/index.js)
  • Production: Vercel Functions with Bun runtime (/api directory)
  • Deployed on Vercel with Bun runtime

Dual Setup:

  • /api directory contains individual Vercel Functions for production
  • /server directory contains monolithic Bun server for local development
  • /server/lib/api-handlers.js contains shared logic used by both
  • Zero duplication: API functions and dev server import the same handlers

Design:

  • Editorial precision aesthetic
  • Cormorant Garamond (display) + Instrument Sans (body)
  • OKLCH color space for vibrant, perceptually uniform colors
  • Editorial sidebar layout (title left, content right)
  • Modular CSS architecture (9 files)

API Endpoints (Vercel Functions):

  • / - Homepage (static HTML)
  • /api/skills - JSON list of all skills
  • /api/commands - JSON list of all commands
  • /api/download/[type]/[provider]/[id] - Individual file download
  • /api/download/bundle/[provider] - ZIP bundle download

Source File Format

Commands (source/commands/*.md)

---
name: command-name
description: Clear description of what this command does
args:
  - name: argname
    description: Argument description
    required: false
---

Command prompt here. Use {{argname}} placeholders for arguments.

Skills (source/skills/*.md)

---
name: skill-name
description: Clear description of what this skill provides
license: License info (optional)
---

Skill instructions for the LLM here.

Build System

Uses Bun for fast builds. Modular architecture:

  • utils.js: Shared functions (parseFrontmatter, readSourceFiles, writeFile, etc.)
  • Transformer pattern: Each provider has one focused file
  • Registry: transformers/index.js exports all transformers
  • Main script: build.js orchestrates everything (~50 lines)

Run: bun run build

Provider Transformations

1. Cursor (Agent Skills Standard)

  • Commands: Body only → dist/cursor/.cursor/commands/*.md (no frontmatter support)
  • Skills: Agent Skills standard → dist/cursor/.cursor/skills/{name}/SKILL.md
    • Full YAML frontmatter with name/description
    • Reference files in skill subdirectories
  • Installation: Extract ZIP into your project root, creates .cursor/ folder
  • Note: Agent Skills require Cursor nightly channel
  • Commands: Full YAML frontmatter → dist/claude-code/.claude/commands/*.md
  • Skills: Full YAML frontmatter → dist/claude-code/.claude/skills/{name}/SKILL.md
  • Preserves: All metadata, all args
  • Format: Matches Anthropic Skills spec
  • Installation: Extract ZIP into your project root, creates .claude/ folder
  • Commands: TOML format → dist/gemini/.gemini/commands/*.toml
    • Uses description and prompt keys
    • Transforms {{argname}}{{args}} (Gemini uses single args string)
  • Skills: Modular with imports → dist/gemini/GEMINI.{name}.md (root level)
    • Main GEMINI.md uses @./GEMINI.{name}.md import syntax
    • Gemini automatically loads imported files
  • Installation: Extract ZIP into your project root, creates .gemini/ folder + skill files
  • Commands: Custom prompt format → dist/codex/.codex/prompts/*.md
    • Uses description and argument-hint in frontmatter
    • Transforms {{argname}}$ARGNAME (uppercase variables)
    • Invoked as /prompts:<name>
  • Skills: Agent Skills standard → dist/codex/.codex/skills/{name}/SKILL.md
    • Same SKILL.md format as Claude Code with YAML frontmatter
    • Reference files in skill subdirectories
  • Installation: Extract ZIP into your project root, creates .codex/ folder

Key Design Decisions

Why commit dist/?

End users can copy files directly without needing build tools.

Why separate transformers?

  • Each provider ~30-85 lines, easy to understand
  • Can modify one without affecting others
  • Easy to add new providers

Why Bun?

  • Much faster than Node.js (2-4x)
  • All-in-one toolkit (runtime + package manager)
  • Zero config, TypeScript native
  • Node.js compatible (works with existing code)

Why modular skills for Gemini/Codex?

  • Better context management (load only what's needed)
  • Cleaner file organization
  • Gemini: Uses native @file.md import feature
  • Codex: Uses routing pattern with AGENTS.md guide

Why vanilla JS for website?

  • No build complexity
  • Bun handles everything natively
  • Modern features (ES6+, CSS nesting, OKLCH colors)
  • Fast, lean, maintainable

Adding New Content

  1. Create source file in source/commands/ or source/skills/
  2. Add frontmatter with name, description, args (for commands) or license (for skills)
  3. Write body with instructions/prompt
  4. Build: bun run build
  5. Test with your provider
  6. Commit both source and dist files

Important Notes

  • Source is truth: Always edit source/, never edit dist/ directly
  • Test across providers: Changes affect 4 different outputs
  • Argument handling: Write prompts that work with both placeholders and appending
  • Cursor limitations: No frontmatter/args, so design for graceful degradation

Documentation

  • README.md: End user guide (installation, usage, quick dev setup)
  • DEVELOP.md: Contributor guide (architecture, build system, adding content)
  • This file (AGENTS.md): Context for AI assistants and new developers