Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
1d98675
feat: add RILL_UI_PUBLIC_DISABLED_FEATURES gate for self-hosted deplo…
rtkzoop May 11, 2026
8caad57
feat: default projectWelcomeEnabled to true for the Mint build
rtkzoop May 13, 2026
ac7b50e
docs: add Mint RBAC eval deployment assets
rtkzoop May 25, 2026
de09827
Preserve Hermes planning artifacts for Rill deployment work
rtkzoop May 26, 2026
e0e9831
Allow Rill MCP config without committing credentials
rtkzoop May 26, 2026
7852260
feat: add project access management UI
rtkzoop May 25, 2026
c5d5cf2
fix: address project access PR review
rtkzoop May 26, 2026
7f3f919
Enforce canvas-only viewing as backend policy
rtkzoop May 27, 2026
b13baf4
Keep restricted viewers out of unavailable access surfaces
rtkzoop May 27, 2026
f8ba1ef
Preserve the RBAC rollout handoff as an artifact
rtkzoop May 27, 2026
22f67e1
Document the Canvas viewer project role
rtkzoop May 27, 2026
2c8e17f
Close unscoped Canvas viewer role bypasses
rtkzoop May 27, 2026
dd0fd51
Preserve force-access runtime inspection permissions
rtkzoop May 27, 2026
49fdf84
Scope custom API access through runtime security
rtkzoop May 27, 2026
48bc1ba
Make project access edits explicit
rtkzoop May 28, 2026
4b62606
Preserve selected dashboard context across views
rtkzoop May 28, 2026
fb57ae3
Define Dashboard Groups before implementation
rtkzoop May 28, 2026
42bcc36
Enable grouped dashboard navigation across runtimes
rtkzoop May 29, 2026
ffda77d
Add dashboard group access controls
rtkzoop May 29, 2026
9f02b9e
first version
rtkzoop Jun 1, 2026
d890499
Show project-scoped canvas breadcrumbs
rtkzoop Jun 1, 2026
29915ca
Make Rill local testing repeatable on auth-safe ports
rtkzoop Jun 1, 2026
63f3ca7
Show dashboard groups as first-class canvas viewer entries
rtkzoop Jun 1, 2026
071130c
Remove Rill support links from avatar menus
rtkzoop Jun 1, 2026
dcf53e6
Trim generated sample deploy assets from the PR
rtkzoop Jun 1, 2026
5da938a
Remove local planning artifacts from the PR
rtkzoop Jun 1, 2026
d0d8832
Address PR review blockers before merge
rtkzoop Jun 1, 2026
c745357
Keep PR-wide prettier checks focused on source files
rtkzoop Jun 1, 2026
7734a29
Stabilize fork CI for Zoop branding changes
rtkzoop Jun 1, 2026
9a526c4
Merge pull request #3 from zoop/feat/rbac-eval
rtkzoop Jun 1, 2026
2603f3a
Save deploy and Dockerfile changes before worktree removal
rtkzoop Jun 1, 2026
f67d6cc
Add Rill agent skills
rtkzoop Jun 3, 2026
4333947
fix: constrain invite access modal layout
rtkzoop Jun 5, 2026
be9d870
Merge pull request #5 from zoop/fix/access-invite-modal-overflow
rtkzoop Jun 5, 2026
4baa6fa
Merge remote-tracking branch 'zoop/feat/zoop-custom' into feat/zoop-c…
rtkzoop Jun 5, 2026
5e43241
Move dashboard group filters above tabs
rtkzoop Jun 3, 2026
fb1690d
Stabilize dashboard group shared filters
rtkzoop Jun 5, 2026
bbc6724
Prevent dashboard group filter flicker
rtkzoop Jun 5, 2026
80f6127
Merge pull request #4 from zoop/feat/dashboard-group-shared-filters-a…
rtkzoop Jun 5, 2026
e1ae73b
Merge branch 'feat/zoop-custom' of https://github.com/zoop/minty-msi …
rtkzoop Jun 5, 2026
eac2398
Record Mint deploy e1ae73bc88
rtkzoop Jun 5, 2026
cf31fca
Merge pull request #6 from zoop/review/zoop-custom-deploy-e1ae73bc88
rtkzoop Jun 5, 2026
d133b28
feat: restrict canvas viewer filters
rtkzoop Jun 5, 2026
a85f7e5
Merge pull request #7 from zoop/feat/canvas-viewer-filter-enforcement
rtkzoop Jun 5, 2026
0a16bcf
docs: plan horizontal bar canvas chart
rtkzoop Jun 5, 2026
796b9e0
docs: plan horizontal bar implementation
rtkzoop Jun 5, 2026
ce3c351
feat: type horizontal bar chart options
rtkzoop Jun 5, 2026
06efe93
test: cover horizontal bar chart spec
rtkzoop Jun 5, 2026
e990a0a
feat: render horizontal bar charts
rtkzoop Jun 5, 2026
745eab3
feat: validate horizontal bar chart specs
rtkzoop Jun 5, 2026
79813ee
feat: guard horizontal bar canvas validation
rtkzoop Jun 5, 2026
fe27666
docs: teach data viz horizontal bars
rtkzoop Jun 5, 2026
eafce3a
fix: dodge grouped horizontal bars
rtkzoop Jun 5, 2026
0448d38
docs: design heatmap table canvas chart
rtkzoop Jun 5, 2026
977b362
fix: disable stacking for offset bar groups
rtkzoop Jun 5, 2026
0a41485
fix: nest grouped horizontal bars and format their labels
rtkzoop Jun 8, 2026
fb63ec1
fix: keep every group in multi-value chart tooltips
rtkzoop Jun 8, 2026
d60df1f
fix: hide the scrollbar on dashboard group tabs
rtkzoop Jun 8, 2026
c6e53d0
fix: size grouped horizontal bars to their card height
rtkzoop Jun 8, 2026
2b9f18e
fix: size grouped horizontal bars by bar count, not container
rtkzoop Jun 8, 2026
c09bf04
fix: remove "filters apply to all tabs" banner from dashboard group
rtkzoop Jun 8, 2026
b9d6c4f
fix: address PR CI failures
rtkzoop Jun 9, 2026
fd42694
docs: plan heatmap table implementation
rtkzoop Jun 8, 2026
d174c74
feat: scaffold heatmap table chart spec
rtkzoop Jun 8, 2026
8d10579
test: cover heatmap table chart spec
rtkzoop Jun 8, 2026
55554f1
feat: render heatmap table charts
rtkzoop Jun 8, 2026
6ed8926
feat: register heatmap table canvas chart
rtkzoop Jun 8, 2026
1c18fec
feat: validate heatmap table chart specs
rtkzoop Jun 8, 2026
4b6eb18
feat: guard heatmap table canvas validation
rtkzoop Jun 8, 2026
78a1464
style: format heatmap table chart files
rtkzoop Jun 8, 2026
1dd0736
docs: align heatmap table chart design
rtkzoop Jun 8, 2026
ce397d9
test: assert heatmap table spec compiles in vega-lite
rtkzoop Jun 8, 2026
8401804
fix(canvas): allow chart filter fields
rtkzoop Jun 9, 2026
ac31293
fix(canvas): hide chart filter chips
rtkzoop Jun 9, 2026
790ddab
fix(canvas): union viewer filter fields
rtkzoop Jun 9, 2026
ecfce18
feat(canvas): add rank line chart
rtkzoop Jun 9, 2026
429b04b
feat(canvas): add range bar chart
rtkzoop Jun 9, 2026
6a6bc3c
fix(canvas): satisfy range bar CI checks
rtkzoop Jun 9, 2026
5805ed2
Merge pull request #8 from zoop/feat/viewer-safe-canvas-components
rtkzoop Jun 9, 2026
86191bf
feat(canvas): add scatter reference lines and point labels
rtkzoop Jun 10, 2026
553c96c
feat(canvas): validate scatter reference lines and labels
rtkzoop Jun 10, 2026
3e1ba33
feat(canvas): allow scatter label field in viewer filters
rtkzoop Jun 10, 2026
fe245e9
docs: document scatter reference lines and labels
rtkzoop Jun 10, 2026
d29707b
fix(canvas): apply scatter dimension limit as top-N filter
rtkzoop Jun 10, 2026
e236086
feat(canvas): add stacked_area_normalized chart type
rtkzoop Jun 11, 2026
6656e6c
docs: document stacked_area_normalized chart type
rtkzoop Jun 11, 2026
74ea5e1
Merge pull request #9 from zoop/feat/viewer-safe-canvas-components
rtkzoop Jun 11, 2026
9f062c9
fix(runtime): refresh security cache rules
rtkzoop Jun 10, 2026
e65ece1
fix(web-admin): allow admin API URL override
rtkzoop Jun 11, 2026
77779d2
docs(data-viz): cover viewer-safe charts
rtkzoop Jun 12, 2026
cba5219
feat(ai): add OpenRouter connector
rtkzoop Jun 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
168 changes: 168 additions & 0 deletions .agents/skills/impeccable/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
---
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."
argument-hint: "[{{command_hint}}] [target]"
user-invocable: true
allowed-tools:
- Bash(npx impeccable *)
license: Apache 2.0. Based on Anthropic's frontend-design skill. See NOTICE.md for attribution.
---

Designs and iterates production-grade frontend interfaces. Real working code, committed design choices, exceptional craft.

## Setup

Before any design work or file edits:

1. Load context (PRODUCT.md / DESIGN.md) via the loader script.
2. Identify the register and load the matching register reference (brand.md or product.md).
3. **If the user invoked a sub-command (e.g. `craft`, `shape`, `audit`), load its reference file too.** This is non-negotiable: `craft` without `craft.md` loaded means you'll skip the shape-and-confirm step the user expects.

Skipping these produces generic output that ignores the project.

### 1. Context gathering

Two files, case-insensitive. The loader looks at the project root by default and falls back to `.agents/context/` and `docs/` if the root is clean. Override with `IMPECCABLE_CONTEXT_DIR=path/to/dir` (absolute or relative to cwd).

- **PRODUCT.md**: required. Users, brand, tone, anti-references, strategic principles.
- **DESIGN.md**: optional, strongly recommended. Colors, typography, elevation, components.

Load both in one call:

```bash
node {{scripts_path}}/load-context.mjs
```

Consume the full JSON output. Never pipe through `head`, `tail`, `grep`, or `jq`. The output's `contextDir` field tells you where the files were resolved from.

If the output is already in this session's conversation history, don't re-run. Exceptions requiring a fresh load: you just ran `{{command_prefix}}impeccable teach` or `{{command_prefix}}impeccable document` (they rewrite the files), or the user manually edited one.

`{{command_prefix}}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 placeholder (`[TODO]` markers, <200 chars): run `{{command_prefix}}impeccable teach`, then resume the user's original task with the fresh context. If the original task was `{{command_prefix}}impeccable craft`, resume into `{{command_prefix}}impeccable shape` before any implementation work.

If DESIGN.md is missing: nudge once per session (*"Run `{{command_prefix}}impeccable document` for more on-brand output"*), then proceed.

### 2. Register

Every design task is **brand** (marketing, landing, campaign, long-form content, portfolio: design IS the product) or **product** (app UI, admin, dashboard, tool: design SERVES the product).

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.

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 `{{command_prefix}}impeccable teach` to add the field explicitly.

Load the matching reference: [reference/brand.md](reference/brand.md) or [reference/product.md](reference/product.md). The shared design laws below apply to both.

## 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. {{model}} 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; brand minimalism.
- **Committed**: one saturated color carries 30–60% of the surface. Brand default for identity-driven pages.
- **Full palette**: 3–4 named roles, each used deliberately. Brand campaigns; product data viz.
- **Drenched**: the surface IS the color. Brand 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

- Cap body line length at 65–75ch.
- Hierarchy through scale + weight contrast (≥1.25 ratio between steps). Avoid flat scales.

### Layout

- 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

- Don't animate CSS layout properties.
- Ease out with exponential curves (ease-out-quart / quint / expo). No bounce, no elastic.

### Absolute bans

Match-and-refuse. If you're about to write any of these, rewrite the element with different structure.

- **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.

### Copy

- 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 `--`.

### The AI slop test

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.

**Category-reflex check.** Run at two altitudes; the second one catches what the first one misses.

- **First-order:** if someone could guess the theme + palette from the category alone ("observability → dark blue", "healthcare → white + teal", "finance → navy + gold", "crypto → neon on black"), it's the first training-data reflex. Rework the scene sentence and color strategy until the answer isn't obvious from the domain.
- **Second-order:** if someone could guess the aesthetic family from category-plus-anti-references ("AI workflow tool that's not SaaS-cream → editorial-typographic", "fintech that's not navy-and-gold → terminal-native dark mode"), it's the trap one tier deeper. The first reflex was avoided; the second wasn't. Rework until both answers are not obvious. The brand register's [reflex-reject aesthetic lanes](reference/brand.md) list catches the currently-saturated families.

## Commands

| 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) |

Plus two management commands: `pin <command>` and `unpin <command>`, detailed below.

### Routing rules

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.

Setup (context gathering, register) is already loaded by then; sub-commands don't re-invoke `{{command_prefix}}impeccable`.

If the first word is `craft`, setup still runs first, but [reference/craft.md](reference/craft.md) owns the rest of the flow. If setup invokes `teach` as a blocker, finish teach, refresh context, then resume the original command and target.

## Pin / Unpin

**Pin** creates a standalone shortcut so `{{command_prefix}}<command>` invokes `{{command_prefix}}impeccable <command>` directly. **Unpin** removes it. The script writes to every harness directory present in the project.

```bash
node {{scripts_path}}/pin.mjs <pin|unpin> <command>
```

Valid `<command>` is any command from the table above. Report the script's result concisely. Confirm the new shortcut on success, relay stderr verbatim on error.
Loading
Loading