Frontend Design
udecode/plate
Build web interfaces with genuine design quality, not AI slop.
A skill your agent uses to run the Claude Design to ClosedLoop pipeline against the current web-ui.
$ npx skills add closedloop-ai/claude-plugins --skill design-inventory -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install closedloop-ai/claude-plugins design-inventory --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/closedloop-ai/claude-plugins.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/code/skills/design-inventory .claude/skills/design-inventory && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "design-inventory" agent skill from https://github.com/closedloop-ai/claude-plugins/tree/main/plugins/code/skills/design-inventory into .claude/skills/design-inventory/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "design-inventory", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/closedloop-ai/claude-plugins/tree/main/plugins/code/skills/design-inventoryType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add closedloop-ai/claude-plugins --skill design-inventory -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install closedloop-ai/claude-plugins design-inventory --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/closedloop-ai/claude-plugins.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugins/code/skills/design-inventory .agents/skills/design-inventory && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "design-inventory" agent skill from https://github.com/closedloop-ai/claude-plugins/tree/main/plugins/code/skills/design-inventory into .agents/skills/design-inventory/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "design-inventory", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add closedloop-ai/claude-plugins --skill design-inventory -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install closedloop-ai/claude-plugins design-inventory --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/closedloop-ai/claude-plugins.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugins/code/skills/design-inventory .cursor/skills/design-inventory && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "design-inventory" agent skill from https://github.com/closedloop-ai/claude-plugins/tree/main/plugins/code/skills/design-inventory into .cursor/skills/design-inventory/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "design-inventory", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/closedloop-ai/claude-plugins.git --path plugins/code/skills/design-inventory--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add closedloop-ai/claude-plugins --skill design-inventory -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install closedloop-ai/claude-plugins design-inventory --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/closedloop-ai/claude-plugins.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugins/code/skills/design-inventory .gemini/skills/design-inventory && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "design-inventory" agent skill from https://github.com/closedloop-ai/claude-plugins/tree/main/plugins/code/skills/design-inventory into .gemini/skills/design-inventory/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "design-inventory", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install closedloop-ai/claude-plugins design-inventoryInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add closedloop-ai/claude-plugins --skill design-inventory -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/closedloop-ai/claude-plugins.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugins/code/skills/design-inventory .github/skills/design-inventory && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "design-inventory" agent skill from https://github.com/closedloop-ai/claude-plugins/tree/main/plugins/code/skills/design-inventory into .github/skills/design-inventory/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "design-inventory", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add closedloop-ai/claude-plugins --skill design-inventory -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install closedloop-ai/claude-plugins design-inventory --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/closedloop-ai/claude-plugins.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugins/code/skills/design-inventory .opencode/skills/design-inventory && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "design-inventory" agent skill from https://github.com/closedloop-ai/claude-plugins/tree/main/plugins/code/skills/design-inventory into .opencode/skills/design-inventory/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "design-inventory", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
design-inventoryA skill your agent uses to run the Claude Design to ClosedLoop pipeline against the current web-ui.
Design Inventory is an agent skill from closedloop-ai/claude-plugins. Use to run the Claude Design to ClosedLoop pipeline against the current web-ui. Stage A inventories a design export zip into schema-validated findings (typed design units - screens, regions like nav bars, standalone components like a chat dialog; UX and behavioral changes; Storybook component reuse mapping; token drift vs the live design system), then creates a platform "Design Review" Feature document the team reviews by editing. Stage B is that in-document human review (delete a section to decline, edit a line…
Its SKILL.md is about 7.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 19 other files, including scripts.
It sits in Frontend & Design, covering Design review and critique, Frontend development and Design systems. It works with Storybook and Git. The repository describes itself as: Open-source Claude Code plugins for multi-agent software delivery. Plan-first SDLC workflow, code review, LLM quality judges, and self-learning — grounded in your codebase… The licence is Apache-2.0.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 0e20ac0. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 17 files in scripts/ (JavaScript), which the agent can run.
Shell commands in SKILL.md call:
nodegitnpmFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git and npm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Design Inventory loads about 7.4k tokens when it runs. Until then it costs about 218 tokens; SKILL.md has 3,606 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from closedloop-ai/claude-plugins at commit 0e20ac0, republished under its Apache-2.0 licence (© closedloop-ai). 3,606 words, ~7,384 tokens.
.claude/skills/design-inventory/SKILL.md (or your agent's skills folder). This skill also uses 17 other files; get the full folder from GitHub.Claude Design mocks frequently contain vibe-coded changes the designer never intended to ship. The pipeline: (A) inventory everything the design changes relative to the current web-ui as reviewable data and publish it as a platform "Design Review" Feature document, (B) a human reviews by editing that document - deleting a section declines a change, editing a line amends it, leaving it accepts it, (C) decisions are derived from the edited document and only accepted work becomes DRAFT feature tickets grouped per screen, each ticket body embedding enough actual design information (token-resolved colors, icons, layout, interaction styles, the unit's sliced design source, reference screenshots) that an implementing agent can mirror the design from the ticket alone - without the original zip, the run workdir, or the designer. Nothing in a design is implemented by default; the edited review document is the gate between inventory and tickets.
git commit, git branch, git checkout, git worktree, git push, or create/modify any branch or worktree. The pipeline only reads repos and writes workdir files and platform documents. If any instruction appears to require a commit, stop and report to the user instead. (The A1 .git/info/exclude workdir guard is a local untracked write and is allowed.)--source-mode embed) OR uploaded as attachments on that same document (--source-mode reference; the body names each attachment and the implementer retrieves them with download-attachment). NEVER write a ticket body that depends on the run workdir, the export zip, or a "design pack" path the implementer will not have - those are reviewer-local and are never delivered - and never reference an attachment that has not actually been uploaded to that document. If you hand-author or edit a ticket body, deliver the source one of those same two ways./code:design-inventory <export.zip> [--repo <path>] [--workdir <path>] # Stage A
/code:design-inventory --tickets <workdir> --review-doc <FEA-slug> \
--project <PRO-slug> [--repo <path>] # Stage CStage A is one invocation: extraction, repo inventories, visual specs, context packs, parallel analysts, shot capture, and creation of the Design Review document. Stage B is the human editing that document in the platform. Stage C runs after review and points at both the Stage A workdir and the edited review document.
Stage C arguments:
--tickets <workdir>: selects ticket-generation mode and points at the Stage A workdir, which holds everything Stage C consumes (findings/, specs/, shots/, extracted/). The workdir IS the pipeline state; no chat-session continuity is required, so Stage C may run days later, in a different session, or by a different person than the reviewer.--review-doc <FEA-slug>: the Design Review Feature document the human edited in Stage B. Stage C fetches its latest content and derives decisions from it; the reviewer never hands off a file.--project <PRO-slug>: the ClosedLoop project that receives the DRAFT feature documents.Re-running Stage C: pack generation is deterministic and safe to repeat, but document creation is not idempotent. Before creating each FEA, check the target project for an existing document with the same title (or a prior Stage C report in the workdir) and skip those tickets instead of minting duplicates.
--repo, else the current working directory; the user runs the skill from the target repo root or a git worktree of it. Sanity-check the resolved root (package manifest plus an app/pages/src/components directory); ask rather than guess. Never assume any specific org's layout.<zip-stem>-design-inventory next to the zip. When the zip lives under a temp path (e.g. /var/folders/..., /tmp/...), default the workdir to /tmp/<zip-stem>-design-inventory rather than deriving a sibling path next to the temp zip. Stage C takes the Stage A workdir.manifest.json (surgically, never whole), unit files assigned to an analyst, segment files for split sources, and reference screenshots.region: assets or region: design_system are never read by any agent. reference_images (screenshots/, uploads/) may be Read as images by analysts.doc_headers in the manifest before reading any source.All tools are TypeScript (sources in tools/design-inventory/src/, tests in vitest) compiled to self-contained bundles at scripts/dist/*.mjs; running them requires only Node 18+. After editing sources, rebuild with npm run build in tools/design-inventory/.
node scripts/dist/design-export-extract.mjs <export.zip> --workdir <workdir>Zip-slip safe; rejects archives over 500 MB; prints the manifest path (exit 2 = unsafe archive, stop and tell the user). Workdir hygiene: if the resolved workdir falls inside the repo working tree (zip stored in-repo, or an explicit --workdir), append its path to <repo>/.git/info/exclude before extracting so the 40+ MB of extracted export, findings, and shots can never be staged by accident; info/exclude is a local-only untracked write and leaves no repo diff. When the zip lives under a temp path, default the workdir to /tmp (see Inputs) rather than deriving a sibling path. The manifest's units array is typed: screen | region | component (scr- | rgn- | cmp- ids) with files, primary, and evidence, so an export containing only a nav bar or a single chat dialog still yields analyzable units.
node scripts/dist/build-route-map.mjs <repo> --out <workdir>/route-map.json
node scripts/dist/build-component-index.mjs <repo> --out <workdir>/component-index.jsonBoth require --out and write into the workdir. They stamp the repo commit and are rebuilt on every run. Outputs live in the workdir alongside all other pipeline artifacts; the repo working tree is never written by these tools. They are keyed by repo constants only - NOTHING derived from the zip is a cache key (different designers export structurally different zips of the same product).
From the manifest units plus doc_headers, select units to analyze:
screen units. Merge in related non-screen files the doc headers attribute to a screen (e.g. a stats header for the Branches screen).region units (Sidebar, Topbar, ...) when the export contains them as designer intent (full-app exports always include chrome; analyze it once, not per screen).component units when the export is component-centric (no screens), the component is net-new, or its doc header indicates divergence intent. Shared primitives consumed by analyzed screens do not need their own analyst.Match each selected unit to current state:
<workdir>/route-map.json routes; regions -> the chrome section; components -> <workdir>/component-index.json candidates.<repo>/.closedloop-ai/design-inventory/deprecated-screens.json (JSON array of name/route fragments; if missing, nothing is deprecated - tell the user). Match fragments against BOTH unit names and matched routes.node scripts/dist/extract-visual-spec.mjs --extract-dir <workdir>/extracted \
--repo <repo> --unit-file <rel> [--unit-file ...] \
--out <workdir>/specs/<unit-id>.json --slice-out <workdir>/specs/<unit-id>.cssSlices the unit's CSS to referenced rules, extracts colors/spacing/typography/icons/layout/state-styles, and resolves colors against the LIVE repo design system. Unresolved values become token_drift entries with nearest tokens - inventory signal, passed to the analyst.
For each selected unit, pre-assemble a single-file context pack so the analyst reads ONE file instead of extracting its slice from large shared inputs:
node scripts/dist/build-context-pack.mjs --manifest <m> --unit-id <id> \
--out <workdir>/context/<unit-id>.md \
--visual-spec <workdir>/specs/<unit-id>.json \
--route-map <workdir>/route-map.json \
--component-index <workdir>/component-index.json \
--hints '<json>'The pack contains the manifest slice (files, primary, evidence, interaction signals, doc headers, spec overlays, splits), the visual-spec summary, current-impl hints, the component-catalog subset, and route/chrome entries. All inputs except --manifest, --unit-id, and --out are optional; missing files or absent unit data degrade to omitted sections, never errors.
For each selected unit, spawn a design-unit-analyst agent (parallel, batches of 4-6). The input list now LEADS with CONTEXT_PACK (= <workdir>/context/<unit-id>.md); the analyst reads it first. Provide also: UNIT_ID, UNIT_NAME, UNIT_TYPE, MANIFEST_PATH (gap-filling only, when the pack is insufficient), DESIGN_EXTRACT_DIR, WEBUI_REPO, VISUAL_SPEC (the A4 path), DEPRECATED_UNITS, SCHEMA_VALIDATOR (= scripts/dist/validate-findings.mjs), OUTPUT_PATH = <workdir>/findings/<unit-id>.json. Analysts emit schema-validated findings.json (themes, categorized findings incl. token-drift, reuse resolutions, a recommendation per finding (renderer derives one from intent when a finding lacks it), pending decisions) and must validate before returning. Every backend-gap finding now carries a REQUIRED data_flow provenance block (gap_layer of capture/ingestion/model/serving/unknown, a concrete origin source-of-truth component, captured_today / ingested_today booleans, optional pipeline refs): the analyst traces the UI's missing data to its source before classifying the deepest missing layer, so a capture/ingestion gap (data not produced or not synced today) is distinguished from a serving gap (data exists, only an endpoint is missing). Analysts emit unit-scoped theme ids in the format thm-<unit-slug>-<topic> (e.g. thm-sessions-page-artifact-table); the render, derive-decisions, and plan-ticket-graph tools hard-fail with exit 1 if any theme id appears in more than one unit's findings. Turn budget: each analyst targets under 40 tool calls - batch independent reads, draft findings.json once, and validate once at the end. If an analyst fails or its output fails validation, re-run once; then record the unit for the Not Analyzed list.
The export is a runnable app, so each finding can show exactly what it is about. Per analyzed unit:
node scripts/dist/capture-design-shots.mjs --extract-dir <workdir>/extracted \
--entry <registry html, e.g. ui_kits/app/index.html> \
--findings <workdir>/findings/<unit-id>.json --shots-dir <workdir>/shots \
--repo <repo> --nav-text "<sidebar label, e.g. Sessions>" [--eval "<js>"]Serves the export locally, loads it in headless Chromium (Playwright resolved from the target repo's node_modules; web-ui repos in scope already depend on @playwright/test), navigates via the sidebar label (or an --eval expression using the export's window.cl* helpers for detail views), outlines each finding's spec.selectors matches in red, and screenshots the regions. It patches the findings document in place: finding.screenshot per captured finding, theme.screenshot falling back to the unit base shot. Exit 3 means Playwright is unavailable: skip and continue (the review document degrades to no inline shots); exit 2 means the page never mounted: note it and continue. Run this BEFORE A6 so the review body can reference the shots.
Shot verification (required when captures succeeded). A wrong screenshot is worse than none: it would anchor the reviewer's decision to the wrong element. After ALL units are captured, spawn ONE batched multimodal agent for the whole run: it Reads every captured shots/CHG-*.png (and theme base shots) alongside each finding's title and summary and returns a single strip list - the findings whose highlighted region does not plausibly show what the finding describes (or whose highlight is empty/blank). Remove the screenshot field for every finding on that strip list so the card falls back to no image, and note them in the hand-off. Do NOT spawn one verifier per unit.
Render the markdown body, create the platform document, substitute inline images, then version it with the final body:
node scripts/dist/render-review-doc.mjs --findings <workdir>/findings --manifest <m> \
--out <workdir>/review-body.md --export-name <zip> --shots-root <workdir>The body uses no numbered lists; every finding/theme heading carries its stable id as a trailing inline code span; images use attachment://{{path}} placeholders for later substitution. Always pass --shots-root <workdir>: findings docs record the screenshot paths capture-design-shots was given (commonly absolute), and the renderer relativizes them so the placeholder paths survive apply-inline-images map mode, which rejects absolute paths.
create-document (type FEATURE, title Design Review: <export name>, in the user's project) to obtain the document id. The review document STAYS DRAFT.
Substitute inline images via MCP (no REST calls, no environment-variable tokens):
Check whether the connected ClosedLoop MCP server exposes an attachment-upload tool (e.g. upload-attachment with purpose: "inline").
If the tool IS available: upload each verified shot through it, then build <workdir>/image-map.json from the returned attachment ids ({ "<path-as-it-appears-in-placeholder>": "<attachment-uuid>", ... }). Run:
node scripts/dist/apply-inline-images.mjs \
--body <workdir>/review-body.md --out <workdir>/review-body.final.md \
--map <workdir>/image-map.json --shots-root <workdir>If the tool is ABSENT (it is a named symphony-alpha dependency and is not yet deployed everywhere): run with --strip instead:
node scripts/dist/apply-inline-images.mjs \
--body <workdir>/review-body.md --out <workdir>/review-body.final.md \
--stripTell the user the review document was created without inline images because the attachment-upload MCP tool is not available in this environment. NEVER paste image bytes through chat context. NEVER make direct REST calls with user tokens. NEVER invent environment variables.
create-document-version with the final body (review-body.final.md in both cases; apply-inline-images.mjs always writes the output file).
Tell the user: the review document's webUrl, summary counts, highest-risk items (likely-unintentional changes to shared components), how to review (Stage B below), and a token-cost line aggregated across ALL spawned subagents (sum usage from every agent-*.jsonl under ~/.claude/projects/<project-slug>/<session-id>/subagents/; report fresh input, cache reads, and output separately). Do not implement anything; do not create any ticket.
The human edits the Design Review Feature document in the platform - no file handoff:
H3 heading declines all of its member findings; deleting an individual finding's H4 heading declines just that one.Survival is judged ONLY from the heading-line id anchors (the trailing inline-code id on each H3/H4). Ids appearing in bullets, tables, or the Backend gaps rollup do not count. The reviewer does not export anything; Stage C reads the edited document directly.
Invocation: --tickets <workdir> --review-doc <FEA-slug> --project <PRO-slug>.
Fetch the review document's LATEST content via get-document (includeContent: true, generous contentMaxChars) and save it to <workdir>/review-body.edited.md. Then:
node scripts/dist/derive-decisions-from-doc.mjs --doc <workdir>/review-body.edited.md \
--findings <workdir>/findings --out <workdir>/decisions.json \
--reviewer "<document assignee/editor, else the user>"decisions.json is INTERNAL pipeline state - never user-facing, never handed to anyone. Survival is judged from heading-line id anchors only.
node scripts/dist/plan-ticket-graph.mjs --findings <workdir>/findings \
--decisions <workdir>/decisions.json --manifest <m> \
--out <workdir>/ticket-plan.jsonThere are three ticket kinds: ui, api, and data. Grouping is per unit: one UI ticket per unit with accepted findings (screens, regions, AND standalone cmp- units; a designer publishing just a new component gets an "Implement <name> component from approved design" ticket whose scope is the design-system component plus its Storybook story), one API ticket per unit only when it has accepted backend-gap findings, and one DATA ticket per unit only when an accepted backend-gap finding is at the capture or ingestion layer (data_flow.gap_layer of "capture" or "ingestion") - i.e. the data the UI needs is not produced at its source or not synced into the platform DB today, so the API ticket alone would silently assume the data already exists. A serving- or model-layer backend-gap gets no data ticket (the data exists; only an endpoint is missing). The data ticket's title is "Capture and sync data for <name>". Net-new components discovered WITHIN a screen's findings do not get their own tickets: shared ones build once in their PRIMARY unit's UI ticket and consumer units reference them. The plan carries two edge arrays, blocks and relates. The data, api, and ui tickets are RELATED (relates, RELATES_TO): the pipeline layers (data capture/ingestion -> api/serving -> ui) build in PARALLEL, and each renders or serves an empty / no-data state until upstream data lands, so a hard block would over-constrain them. BLOCKS (blocks) is reserved for a genuine build-time prerequisite: a net-new shared component built in its PRIMARY unit's UI ticket BLOCKS the consumer UI tickets that import it, because they literally cannot compile until the component exists.
At Stage C start, check ONCE whether the connected ClosedLoop MCP server exposes an attachment-upload tool (the same check as A6, e.g. upload-attachment with purpose: "inline"). That single check picks the source mode for every unit in the run: tool PRESENT -> --source-mode reference (design source delivered as document attachments, uploaded at C4); tool ABSENT -> --source-mode embed (design source embedded in the body so the ticket stands alone with no uploads).
For each unit with accepted findings:
node scripts/dist/build-design-pack.mjs --findings <workdir>/findings/<unit-id>.json \
--decisions <workdir>/decisions.json --extract-dir <workdir>/extracted \
--out-dir <workdir>/packs --visual-spec <workdir>/specs/<unit-id>.json \
--css-slice <workdir>/specs/<unit-id>.css --shots-root <workdir> \
--source-mode <embed|reference>Always pass --shots-root <workdir> so the image placeholders carry workdir-relative paths: findings docs record the (commonly absolute) screenshot paths capture-design-shots was given, and apply-inline-images map mode rejects absolute placeholder paths, so an unrelativized placeholder would be stripped instead of substituted at C4.
Exit 3 = nothing accepted for that unit; skip it silently. Otherwise the pack contains design-source/, screenshots/, decision-applied findings.json, visual-spec.json, ticket-body-ui.md, ticket-body-api.md when the unit has accepted backend-gap findings, and ticket-body-data.md when an accepted backend-gap is at the capture/ingestion layer. The API body carries a ## Data Provenance section tracing each backend-gap to its source of truth, and flags when a separate, related data-source ticket covers the upstream capture/sync (the layers build in parallel and the view renders empty states until the data lands); the data body lists the data to capture and ingest (per finding: origin, what is missing - instrument the source and/or add the sync mapping - and pipeline refs) and notes it RELATES to the unit's API/serving ticket (parallel build, empty states until the data lands). In both modes, each accepted criterion carries State/Spec summaries and a Refs sub-bullet (state.refs + spec.refs, file:line into the design source) plus an inline attachment://{{path}} image placeholder when a shot was captured, and the body also carries the token-resolved visual spec, an explicit Declined Changes do-not-implement list, the component reuse table, and a provenance line - bullet format, no numbered lists. The modes differ only in the Design Source section: embed inlines the unit's design file(s) and sliced CSS as fenced blocks (budgeted to 90,000 characters total, truncating any overflow at a line boundary with a visible marker); reference instead lists each file as "attached to this document as <name>" and the C4 uploads make those names real. ticket-body-api.md carries the same per-criterion State/Spec/Refs detail and the same Design Source section (backend-gap criteria only). The pack directory stays a workdir-only local artifact - never committed, never copied into the repo; in reference mode its design-source/ directory is the upload source for the document attachments. The ticket document is the deliverable and must stand alone per hard rule 3 (an implementer works from the ticket document only, with no access to the workdir, the export, or any pack path).
For each ticket in ticket-plan.json (UI, API, and DATA kinds, titles taken from the plan), after the duplicate-title check (C above), create one FEATURE document via create-document in the user-specified project with the matching ticket body (the data ticket uses ticket-body-data.md, created exactly like the UI and API tickets). New documents are DRAFT - that is the second human gate; never advance their status yourself. The data and api tickets are linked per the plan's relates edges (data RELATES_TO api, api RELATES_TO ui) in the link step below.
The ticket bodies already carry inline attachment://{{path}} image placeholders (per-criterion shots and the unit base shot), with workdir-relative paths (C3's --shots-root), that this step substitutes or strips. Finalize each ticket per the C3 tool check:
Upload tool PRESENT (bodies were built with --source-mode reference): for each created FEA, upload the unit pack's design-source files and design-slice.css as attachments on that document under exactly the names the body lists, then upload the unit's verified shots, build the per-ticket image-map.json keyed by the relative path exactly as it appears in each placeholder (e.g. shots/CHG-...png), run apply-inline-images.mjs --body ... --out ... --map ... --shots-root <workdir>, and create-document-version with the result. Inline images in the final ticket are REQUIRED in this branch - do not silently strip them. If ANY upload for a ticket fails (source file or shot), do not leave the ticket pointing at attachments that do not exist: re-render that unit's body with --source-mode embed, run apply-inline-images.mjs --strip on it, create-document-version with that self-contained body, and tell the user which tickets fell back and why.
Upload tool ABSENT (bodies were built with --source-mode embed): run apply-inline-images.mjs --body ... --out ... --strip, then create-document-version with the result, and tell the user inline images and source attachments were skipped because the server lacks the attachment-upload tool (the embedded body keeps the ticket self-contained).
No direct REST calls, no environment-variable tokens in either branch.
Then create the artifact links exactly per ticket-plan.json's two edge arrays with create-artifact-link, each in the recorded direction (source/prerequisite -> target/dependent): a BLOCKS link for every blocks edge (the shared-component primary UI ticket BLOCKS each consumer UI ticket) and a RELATES_TO link for every relates edge (data RELATES_TO api, api RELATES_TO ui - the parallelizable pipeline adjacencies). Links are irreversible - verify direction against an existing platform example before the first link of a session.
List created FEAs (slugs + webUrls), the BLOCKS and RELATES_TO links made, skipped units (nothing accepted), and the aggregated token cost for the stage. NO design-system component tickets, NO per-component tickets, NO commits.
TypeScript sources in tools/design-inventory/src/ (vitest tests co-located as *.test.ts), committed bundles in scripts/dist/:
design-export-extract (+tests) - deterministic export decomposition: safe unzip, region tagging, typed unit detection, interaction signals (incl. pointer-drag), doc headers, spec overlays, splitting.build-route-map (+tests) - route table + chrome map from the repo's router conventions.build-component-index (+tests) - Storybook component index enriched with source paths, props, cva variants.extract-visual-spec (+tests) - CSS slicing, style extraction, live-token resolution, token drift.design-findings-schema (+tests) - findings.json / decisions.json schema and validators; validate-findings.mjs is the CLI.build-context-pack (+tests) - per-unit single-file context pack for analysts.capture-design-shots (+tests) - headless-Chromium highlighted shots of the live design per finding.render-review-doc (+tests) - markdown body for the platform Design Review document (id anchors, image placeholders, no numbered lists).apply-inline-images (+tests) - pure body transformer: substitutes attachment://{{path}} placeholders from an orchestrator-built map (map mode) or strips all placeholder lines (strip mode); network-free, always writes --out.shot-path (+tests) - placeholder-safe screenshot path normalization (relativize against --shots-root, shots/-tail fallback, omit when unsafe); shared by render-review-doc and build-design-pack.derive-decisions-from-doc (+tests) - decisions.json from the human-edited review document (heading-anchor survival).plan-ticket-graph (+tests) - per-screen UI/API/data ticket graph with shared-component ownership; pipeline adjacencies (data -> api -> ui) are RELATES_TO edges (parallelizable, empty states until data lands) while a net-new shared component's primary UI ticket BLOCKS its consumer UI tickets (a data ticket emitted only for capture/ingestion-layer backend gaps).build-design-pack (+tests) - per-unit design pack + ticket-body-ui.md / ticket-body-api.md / ticket-body-data.md (the data body written only for capture/ingestion-layer backend gaps) for accepted units.© closedloop-ai, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 17 other files (scripts) in plugins/code/skills/design-inventory of closedloop-ai/claude-plugins.
Open the folder on GitHubat commit 0e20ac0
Design Inventory next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Design Inventory this skillclosedloop-ai/claude-plugins | 122 | — | ~7.4k | Automated safety check: Pass | Apache-2.0 | |
| Frontend Designudecode/plate | 17k | — | ~3.6k | Automated safety check: Pass | Custom licence | |
| Frontend Designmohitagw15856/pm-claude-skills | 1.4k | — | ~1.4k | Automated safety check: Pass | MIT | |
| Design StyleCastor6/tactus | 376 | 1 repos | ~2.1k | Automated safety check: Pass | Apache-2.0 | |
| Superdesignsuperdesigndev/superdesign-skill | 628 | — | ~4.1k | Automated safety check: Pass | MIT | |
| UI Design Braincarmahhawwari/ui-design-brain | 893 | — | ~2.1k | Automated safety check: Pass | MIT |
udecode/plate
Build web interfaces with genuine design quality, not AI slop.
mohitagw15856/pm-claude-skills
Produce frontend UI that actually looks designed — a working spacing/type system, deliberate color use, real states, and restraint — instead of the generic AI-generated interface.
Castor6/tactus
A skill your agent uses whenever the user asks to build, create, design, develop, improve, or style any frontend interface or visual element.
superdesigndev/superdesign-skill
Design or redesign frontend UI, presentations, and graphics on the Superdesign canvas with a choice of leading AI models.
carmahhawwari/ui-design-brain
Generate production-grade UI using real component patterns and best practices from 60+ documented interface components.
mims-harvard/OptimusKG
Create distinctive, production-grade frontend interfaces with high design quality.
closedloop-ai/claude-plugins
Run Codex to review a plan file and return structured feedback with a verdict.
closedloop-ai/claude-plugins
Check if critic reviews are still valid before re-running Phase 2.5 critics.
closedloop-ai/claude-plugins
Check if cross-repo coordinator results can be reused, avoiding redundant Sonnet agent launches.
closedloop-ai/claude-plugins
Check for a cached plan-evaluation.json result before launching the plan-evaluator agent.
closedloop-ai/claude-plugins
This skill should be used when needing to locate files within the Claude Code plugins cache directory (~/.claude/plugins/cache).
closedloop-ai/claude-plugins
Start a detached GitHub pull-request monitor that wakes the exact launching Codex Desktop or CLI root through the managed Codex App Server when review, CI, conflict, merge-queue, closure, readiness…
Categories
A skill your agent uses to run the Claude Design to ClosedLoop pipeline against the current web-ui. Design Inventory is an agent skill from closedloop-ai/claude-plugins. Use to run the Claude Design to ClosedLoop pipeline against the current web-ui.
Design Inventory fits situations like: run the Claude Design to ClosedLoop pipeline against the current web-ui; design inventory; parse claude design export; design handoff report.
Run `npx skills add closedloop-ai/claude-plugins --skill design-inventory -a claude-code`. Or copy the skill folder (plugins/code/skills/design-inventory in closedloop-ai/claude-plugins) into .claude/skills/design-inventory in your project. Claude Code loads it when a task matches its description.
Run `npx skills add closedloop-ai/claude-plugins --skill design-inventory -a codex`. Or copy the skill folder (plugins/code/skills/design-inventory in closedloop-ai/claude-plugins) into .agents/skills/design-inventory in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add closedloop-ai/claude-plugins --skill design-inventory -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/design-inventory, .gemini/skills/design-inventory, .github/skills/design-inventory and .opencode/skills/design-inventory in your project.
Going by SKILL.md and its folder, Design Inventory needs JavaScript for the scripts in its folder and the command-line tools its instructions call (node, git and npm). Our summary lists: Node.js.
SKILL.md contains no URLs. Its commands use git and npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Design Inventory is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 7.4k tokens (SKILL.md is roughly 30k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Design Inventory: Frontend Design (udecode/plate, 17k stars), Frontend Design (mohitagw15856/pm-claude-skills, 1.4k stars), Design Style (Castor6/tactus, 376 stars) and Superdesign (superdesigndev/superdesign-skill, 628 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
closedloop-ai (a GitHub organization) maintains it in closedloop-ai/claude-plugins, which has 122 GitHub stars. The repository holds 43 skills in this directory. The repository was last updated on October 7, 2026.
Source: closedloop-ai/claude-plugins on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.