Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .cursor-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,11 @@
"source": "pstack",
"description": "if you want to go fast, go deep first. pstack helps you write less, but higher quality code. rigorous agent workflows you can parallelize with confidence."
},
{
"name": "dyl-stack",
"source": "dyl-stack",
"description": "Dylan's agent style on top of pstack: root causes over symptom patches, The Algorithm before design, terse verified delivery, a PR review that fits in a paste, and Figma-to-UI with a visual judge."
},
{
"name": "grok-voice",
"source": "grok-voice",
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc
| `cursor-sdk` | [Cursor SDK](cursor-sdk/) | Cursor | Developer Tools | Build apps, scripts, and automations with the TypeScript SDK. |
| `orchestrate` | [Orchestrate](orchestrate/) | Cursor | Developer Tools | Fan large tasks out across parallel cloud agents with planners, workers, verifiers, and structured handoffs. |
| `pstack` | [pstack](pstack/) | Lauren Tan | Developer Tools | if you want to go fast, go deep first. pstack helps you write less, but higher quality code. rigorous agent workflows you can parallelize with confidence. |
| `dyl-stack` | [dyl-stack](dyl-stack/) | Dylan Gattey | Developer Tools | Dylan's agent style on top of pstack: root causes over symptom patches, The Algorithm before design, terse verified delivery, a PR review that fits in a paste, and Figma-to-UI with a visual judge. |
| `advisor` | [Advisor](advisor/) | Cursor | Developer Tools | Consult a stronger model before major decisions, when stuck, and before declaring done. |
| `grok-voice` | [Grok Voice](grok-voice/) | Eric Zakariasson | Developer Tools | Add Grok voice to an app: realtime speech-to-speech, speech-to-text dictation, text-to-speech read-aloud, and a log-driven fix loop for voice sessions. |
| `gmail` | [Gmail](third_party/gmail/) | Cursor | Productivity | Search, read, draft, and manage email. |
Expand Down
30 changes: 30 additions & 0 deletions dyl-stack/.cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"name": "dyl-stack",
"displayName": "dyl-stack",
"version": "0.1.0",
"description": "Dylan's agent style on top of pstack: root causes over symptom patches, The Algorithm before design, terse verified delivery, a PR review that fits in a paste, and Figma-to-UI with a visual judge.",
Comment thread
cursor[bot] marked this conversation as resolved.
"author": {
"name": "Dylan Gattey"
},
"homepage": "https://github.com/cursor/plugins/tree/main/dyl-stack",
"repository": "https://github.com/cursor/plugins",
"license": "MIT",
"logo": "assets/logo.png",
"keywords": [
"dyl-stack",
"dyl-mode",
"pstack",
"figma",
"code-review",
"agent-style"
],
"category": "developer-tools",
"tags": [
"workflow",
"review",
"design",
"principles"
],
"skills": "./skills/",
"agents": "./agents/"
}
3 changes: 3 additions & 0 deletions dyl-stack/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
node_modules/
.DS_Store
*.log
21 changes: 21 additions & 0 deletions dyl-stack/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 Dylan Gattey

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
48 changes: 48 additions & 0 deletions dyl-stack/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# dyl-stack

My agent style, layered on [pstack](../pstack/). pstack does the heavy lifting: principles, playbooks, subagent routing. dyl-stack adds the few gates I keep correcting agents on, a PR review that fits in a paste, and a Figma-to-UI flow that won't call it done until it looks right.

## Install

```bash
/add-plugin pstack
/add-plugin cursor-team-kit
/add-plugin thermos
/add-plugin dyl-stack
```

`/build-figma` also needs the Figma plugin and its MCP connected.

## Skills

| Skill | Use it when |
|---|---|
| [`/dyl-mode`](./skills/dyl-mode/SKILL.md) | Default entry for non-trivial work. Routes through pstack's `poteto-mode` playbooks with my gates on top. |
| [`/dyl-review`](./skills/dyl-review/SKILL.md) | You want up to 7 paste-ready review comments and one 🟢/🟡/🔴 call. Say "deep" to add thermos and Bugbot. Never posts. |
| [`/dyl-ready-pr`](./skills/dyl-ready-pr/SKILL.md) | "Get PR green." Deep review until 🟢, mark ready, fix conflicts, babysit CI to merge-ready. Never merges. |
| [`/build-figma`](./skills/build-figma/SKILL.md) | You have a `figma.com/design` URL with a `node-id`. Intake first, map to your repo's design system, then a visual judge against the live UI. Also fires on its own from Figma URLs. |
| [`principle-the-algorithm`](./skills/principle-the-algorithm/SKILL.md) | Referenced by `dyl-mode`. Question the requirement, delete, then optimize, accelerate, automate. |

## What dyl-mode adds over poteto-mode

- **Root cause, not symptom.** Any failure gets a `Root cause: X because Y` todo before a fix. Null guards, retries, `.skip`, and snapshot updates are symptom fixes until that line justifies them.
- **The Algorithm** before designing anything bigger than a glance-sized edit.
- **Plain replies.** Default voice is pstack's `/bro`.
- **Merge gates.** Never merge without permission in the current turn. Update the existing PR, never open a duplicate.
- **Live UI proof** via `control-ui`, and measure before coding layout bugs.
- **Taste vetoes bind.** "Roll that back" means roll it back.

## Subagent

[`dyl-agent`](./agents/dyl-agent.md) runs the style end to end. Spawn it with `subagent_type: "dyl-agent"`.

## Not shipped here

- Principles, playbooks, `/bro`, `/unslop`, and the babysit watcher ship in `pstack`.
- `deslop`, `control-ui`, `control-cli`, and `verify-this` ship in `cursor-team-kit`.
- The thermos review subagents ship in `thermos`.
- `/review-bugbot` and `/create-skill` are Cursor built-ins.

## License

MIT
14 changes: 14 additions & 0 deletions dyl-stack/agents/dyl-agent.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
name: dyl-agent
description: Routing target for `/dyl-mode` and any request for Dylan's style. Resume an existing `dyl-agent` for the conversation rather than spawning a sibling. Reads the `dyl-mode` skill's `SKILL.md` in full before any work, then the pstack `poteto-mode` skill it layers on. Substituting `generalPurpose` skips those reads and drifts.
is_background: true
---

# Dyl subagent

You are operating as Dylan's full agent style.

1. Read the `dyl-mode` skill's `SKILL.md` in full before any work.
2. Run its requirements check before anything else. Missing plugin → stop and report it.
3. Follow its router. It layers on pstack's `poteto-mode` for Principles, triggers, and playbooks. Read those from pstack. Do not invent a parallel principles tree.
4. "Get PR green" or merge-ready asks follow the `dyl-ready-pr` skill. "Review this PR like me" follows the `dyl-review` skill. Draft only unless the human explicitly asks to post.
Comment thread
cursor[bot] marked this conversation as resolved.
Binary file added dyl-stack/assets/logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
75 changes: 75 additions & 0 deletions dyl-stack/skills/build-figma/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
---
name: build-figma
description: "Use for \"/build-figma\", a figma.com/design URL with node-id, or \"implement this Figma\" into a web, desktop, or shared UI. Orchestrates Figma MCP intake, maps nodes to the repo's own design system, then a verify-this visual judge. Do not paste Figma Tailwind."
icon: paintbrush
color: magenta
# Intentionally model-invocable so agents discover it from Figma URLs.
---

# Build Figma

Orchestrator for Figma → production UI. It does **not** replace the skills below. Read each when that phase starts; do not restate them here.

**Requires** `figma` (plugin and connected MCP) and `cursor-team-kit`. Check first with [../dyl-mode/references/requirements.md](../dyl-mode/references/requirements.md). Missing → stop and tell the user to run `/add-plugin <name>`.

Failure modes that shaped the gates: [references/failure-lessons.md](references/failure-lessons.md).

## Delegate to (do not copy)

| Phase | Read |
| --- | --- |
| Figma MCP mechanics | `figma-design-to-code` from the Figma plugin, before every `get_design_context` |
| Design-system inventory | [references/design-system-discovery.md](references/design-system-discovery.md), then any repo-local design-system skill or rule it finds |
| Visual claim / verdict shape | `verify-this` from `cursor-team-kit` + [references/visual-judge.md](references/visual-judge.md) |
| Drive live UI | `control-ui` from `cursor-team-kit`, or the repo's own control skill for that surface |

## Gates

```
Build-figma progress:
- [ ] 0. Parse fileKey + nodeId (refuse file-only URLs)
- [ ] 1. Intake done before any product UI edit (see below)
- [ ] 2. Mapped to the repo's primitives/tokens only
- [ ] 3. Styling in the surface's own styling system
- [ ] 4. Visual judge VERIFIED per visual-judge.md (verify-this claim shape)
```

Gate 1 blocks coding. "Functional first, polish visuals later" is the main failure mode.

## Workflow (thin)

### 0. Parse URL

`figma.com/design/:fileKey/...?node-id=1-2` → `fileKey`, `nodeId` (`1-2` → `1:2`). Branch URLs use `branchKey` as `fileKey`. No `node-id` → stop.

### 1. Intake (blocking)

Follow `figma-design-to-code`. Call `get_design_context` and `get_screenshot`. If the response is sparse or too large, split to implementable **child** nodes. Download brand assets from MCP URLs; never redraw logos.

Run [design-system discovery](references/design-system-discovery.md). Then write `/tmp/build-figma/<slug>/intake.md`:

- Target surface, code path, and how you will drive it live.
- Node tree.
- **Metric table.** Figma px → token, or pinned value when no token matches.
- **Node → primitive map.** Each Figma node to an existing component. Mark any node with no match as new, with why.

### 2. Implement

Use the surface's styling system and the mapped components. When Figma px disagree with a primitive's default size, pin the Figma metric in that styling system. Do not bend the primitive's defaults globally. Hard bans below.

### 3. Visual judge (blocking)

Specialize `verify-this` with [references/visual-judge.md](references/visual-judge.md). Treat the Figma shot as baseline and the live capture as treatment. Match theme polarity first, then apply the rubric and write the verdict. After NOT VERIFIED, fix the failed rows, recapture, and apply the rubric again. Repeat until VERIFIED or INCONCLUSIVE. Stop and report the blocker after INCONCLUSIVE; do not claim Gate 4 complete.

### 4. Report

Intake path, map highlights, verdict + evidence paths, remaining gaps.

## Hard bans

1. Paste Figma MCP Tailwind/React as product code.
2. Invent brand assets when Figma or the repo has them.
3. "Close enough" primitive for a distinct Figma structure.
4. Trust text/button/dialog size tokens without checking Figma px.
5. Claim visual done without the judge.
6. Edit product UI before `intake.md` exists.
17 changes: 17 additions & 0 deletions dyl-stack/skills/build-figma/references/design-system-discovery.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Design-system discovery

Find what the repo already has before mapping a single node. Record every answer in `intake.md`. A mapping built on a guess at the component library is the failure this step exists to stop.

## Look for, in order

1. **Repo guidance.** `AGENTS.md`, `.cursor/rules/`, `.cursor/skills/`, and `CONTRIBUTING.md` for anything on UI, styling, design tokens, or components. A repo-local design-system, styling, or primitives skill outranks everything below. Read it in full and follow it.
2. **Target surface.** Which app or package the Figma frame belongs to. Use the ask and the Figma file name. If the repo has several UI surfaces with different styling systems, name the one you picked and why. Ask only when two surfaces are equally plausible and picking wrong means redoing the work.
3. **Component library.** The shared package or directory the surface imports primitives from (buttons, text, dialogs, icons, inputs). Note its import path and where its stories, gallery, or examples live.
4. **Tokens.** Where color, spacing, radius, and type scales are defined, and how components consume them (CSS variables, a theme object, a utility config).
5. **Styling system.** What the surface actually uses: CSS modules, a CSS-in-JS library, utility classes, plain CSS. Check lint rules that ban alternatives. Match what neighboring files in the target directory do.
6. **Icons and brand assets.** The icon set and its naming, and where logos and brand images live. Verify every icon name exists before using it.
7. **Live surface.** How to run and capture the target UI (dev server command, story, gallery page, desktop build). This is the treatment side of the visual judge.

## Output in `intake.md`

A short table: surface, code path, component library path, token source, styling system, icon source, and the command to drive it live. Every row cites the file you read it from.
13 changes: 13 additions & 0 deletions dyl-stack/skills/build-figma/references/failure-lessons.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Failure lessons

What broke in past Figma → UI runs, and which gate each one produced. Styling and token rules live in the repo's own guidance, found during design-system discovery. This file only records why the gates exist.

## What went wrong

1. Shipped functional UI first; Figma-faithful visuals only came after the human pushed back. → Gate 1 blocks coding until intake exists.
2. Drew a brand mark by hand instead of exporting it from Figma or using the repo's existing asset. → Hard ban 2.
3. Reached for a list or dialog primitive that looked close but had different structure (a recessed card with divider rows is not a plain list). → Hard ban 3, node → primitive map.
4. Trusted a primitive's size tokens where they disagreed with Figma px. → Metric table, hard ban 4.
5. Styling that compiled but never emitted, or dynamic styles the styling system could not handle. → Gate 3, match neighbors and lint.
6. Guessed icon names; downscaled a brand image before sizing it, which crushed its detail. → Rubric rows 2, 5, 6.
7. Judged a light-theme build against a dark-theme frame. → Rubric row 0.
32 changes: 32 additions & 0 deletions dyl-stack/skills/build-figma/references/visual-judge.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Visual judge

Specialize `verify-this` (from `cursor-team-kit`) for Figma → live UI. Use its falsifiable claim, artifact tree, and VERIFIED / NOT VERIFIED / INCONCLUSIVE verdicts. Define the claim as visual equivalence. Treatment must match baseline on every rubric row. This specialization returns VERIFIED when they match, NOT VERIFIED when any row fails, and INCONCLUSIVE when comparable treatment cannot be captured. Pixel machine-diff is optional; structured side-by-side is required.

## Artifacts

```
/tmp/build-figma/<slug>/
├── intake.md
├── claim.md
├── baseline/ # Figma screenshots + assets
├── treatment/ # live UI captures
├── diff/ # optional composites
├── timeline.md
└── verdict.md
```

## Rubric (any Fail → NOT VERIFIED)

0. **Theme polarity.** Live matches Figma light/dark before other rows. Wrong polarity: switch the app theme and recapture. Do not treat inverted button colors as a primitive bug.
1. **Structure.** Same regions as Figma; no missing or extra chrome.
2. **Primitives.** Mapped components from intake; no invented brand marks; icons match Figma and exist in the repo's icon set.
3. **Type.** Size and line-height within ~1px of the intake metric table (or pinned).
4. **Spacing.** Padding, gaps, and control heights match intake metrics.
5. **Assets.** Figma or repo exports, sized via layout; no natural-size blowups or pre-downscaled images.
6. **Controls.** Checkboxes, buttons, and close affordances match; no guessed icon names.

Figma placeholder counts vs live data are not a Fail unless fixtures were required.

Drive the surface with `control-ui` or the repo's own control skill. After VERIFIED, run the repo's design-polish or QA skill if it has one.

On NOT VERIFIED, fix the failed rows, recapture, and apply the rubric again. Repeat until VERIFIED or INCONCLUSIVE. If the live UI cannot be captured after the control skill's documented setup, stop with INCONCLUSIVE. Record the attempted capture and blocker in `verdict.md`; do not claim Gate 4 complete.
Loading
Loading