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

251 lines
10 KiB
Markdown

# 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`)
```yaml
---
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`)
```yaml
---
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
### 2. Claude Code (Full Featured)
- **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](https://github.com/anthropics/skills)
- **Installation**: Extract ZIP into your project root, creates `.claude/` folder
### 3. Gemini CLI (Full Featured)
- **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
### 4. Codex CLI (Full Featured)
- **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
## Provider Documentation Links
- [Agent Skills Specification](https://agentskills.io/specification) - Open standard
- [Cursor Commands](https://cursor.com/docs/agent/chat/commands)
- [Cursor Rules](https://cursor.com/docs/context/rules)
- [Cursor Skills](https://cursor.com/docs/context/skills)
- [Claude Code Slash Commands](https://code.claude.com/docs/en/slash-commands)
- [Anthropic Skills](https://github.com/anthropics/skills)
- [Gemini CLI Custom Commands](https://cloud.google.com/blog/topics/developers-practitioners/gemini-cli-custom-slash-commands)
- [Gemini CLI GEMINI.md](https://github.com/google-gemini/gemini-cli/blob/main/docs/cli/gemini-md.md)
- [Codex CLI Slash Commands](https://developers.openai.com/codex/guides/slash-commands)
- [Codex CLI Skills](https://developers.openai.com/codex/skills/)