critique
Judge the current UI blind (render + screenshot if possible), grep the anti-slop patterns, and run the mandatory forced-subtraction pass.
Clone a website — a working behavior ARCHIVE (real code + data replayed offline; tabs, filters, transitions work), a pixel-identical editable RESTORE (real source recovered from source maps when shipped, else the real DOM componentized into React with classes kept byte-exact —
> /plugin marketplace add TaewoooPark/UIForge > /plugin install uiforge@uiforge
How it fires
How this command gets triggered: by you, by Claude, or both.
/cloneContext preview
What this command does when you run it.
Clone a website — a working behavior ARCHIVE (real code + data replayed offline; tabs, filters, transitions work), a pixel-identical editable RESTORE (real source recovered from source maps when shipped, else the real DOM componentized into React with classes kept byte-exact —
description: Clone a website — a working behavior ARCHIVE (real code + data replayed offline; tabs, filters, transitions work), a pixel-identical editable RESTORE (real source recovered from source maps when shipped, else the real DOM componentized into React with classes kept byte-exact — verified by pixel-diff), or a pixel-faithful FREEZE. All from the archive, offline. argument-hint: "<url│file.html> [--archive] [--restore] [--freeze] [--content path.md] [--explore] [--no-fetch] [--headed] [--profile dir]"
Clone the reference in **$ARGUMENTS**. Pick the mode from the flags and the user's words:
Archive first (§A) whenever a Restore is wanted — the Restore builds from the archive's captured DOM/CSS, not a fresh scrape. (One caveat: Tier B back-fills assets the archive never fetched from the live origin **by default** — pass `--no-fetch` to stay fully offline.)
Before any `node` command below, run this once so `$ROOT` resolves and Playwright is findable — the snippets use `$ROOT`, and an unset one would run `node /tools/…`:
export ROOT="${CLAUDE_PLUGIN_ROOT}"
export NODE_PATH="$(npm root -g)"Work in a fresh output dir. `--headed`/`--profile <dir>` pass through to reach a site behind Cloudflare or a login (a persistent `--profile` reuses the clearance/session). `file://` inputs work too.
---
This is the only mode that reproduces **behavior**, because it keeps the site's **own code** and replays the **data it actually fetched**. Click a tab and content swaps; filter a list and it updates; scroll and it lazy-loads — the real JavaScript runs against cached responses. Use this whenever the user wants the clone to *work*, not just look right.
node $ROOT/tools/uiforge-archive.mjs <ref> --out-dir ./clone-archive --explore
node ./clone-archive/serve.mjs # → http://localhost:8787
---
Turn the **archive** into editable source that renders **pixel-identical to the original** — by *preservation*, not reconstruction. Best-fidelity tier first, always proven by a pixel gate. (This replaces the old lossy "re-derive styles from computed values" rebuild, which drifted.)
**What Restore is and isn't:** it preserves the *look + structure* as clean, editable React — **not** the behavior. Tier B is a **static snapshot** (the archive's rendered DOM → JSX; scripts are dropped), so CSS-driven states (`:hover`, `<details>`, animations) survive but JS behavior (tab-switching, filters, click-to-swap) does **not**. For a copy that *behaves*, use the **Archive** (§A) — Restore and Archive are complementary, not equivalent.
# 0 · detect the stack from the archive (drives output idiom + which tier applies) node $ROOT/tools/uiforge-detect.mjs ./clone-archive # TIER A · real ORIGINAL source — when the site shipped or leaked source maps (highest fidelity) node $ROOT/tools/uiforge-sourcemap.mjs ./clone-archive --out-dir ./restore/src-recovered # TIER B · always works — pixel-identical editable React from the real rendered DOM node $ROOT/tools/uiforge-restore.mjs ./clone-archive --out-dir ./restore # GATE · prove it, don't hope it node $ROOT/tools/uiforge-visualgate.mjs --a ./restore --b ./clone/ref.png
Clone a website so it actually works — tabs, filters, lists, client-side transitions, motion, scroll — then also as a pixel-faithful freeze and a pixel-identical, editable React restore.
Repo: TaewoooPark/UIForge
Judge the current UI blind (render + screenshot if possible), grep the anti-slop patterns, and run the mandatory forced-subtraction pass.
Run the full UIForge pipeline on a brief — thesis, one direction, tokens first, sourced components, budgeted composition, blind critique, forced subtraction.
Extract a measured design signature (type ramp, accent + its budget, grid unit, radius, layout) from a reference image or site, write it to signature.json, and…
Grade any UI project A–F for slop — a standalone review tool. Runs the UIForge linter and reports a letter grade + the tells, for the current project, a…
Prepare the current project for UIForge — ensure shadcn init, the component registries (shadcn + @motion-primitives), and the motion/lucide-react/cn…