-
Notifications
You must be signed in to change notification settings - Fork 893
feat(dyl-stack): add dyl-stack plugin #462
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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.", | ||
| "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/" | ||
| } | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| node_modules/ | ||
| .DS_Store | ||
| *.log |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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. | ||
|
cursor[bot] marked this conversation as resolved.
|
||
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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
17
dyl-stack/skills/build-figma/references/design-system-discovery.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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
13
dyl-stack/skills/build-figma/references/failure-lessons.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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. |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.