mcpbeat

Figmirror

vila-lab/figmirror-figmirror

> FigMirror mirrors the visual style of a top-conference paper figure (NeurIPS / ICML / ICLR / Nature family) onto the user's own data. Takes dirty data plus a reference figure screenshot (cropped or uncropped), preprocesses the reference crop, runs a Drawer/Reviewer loop, and outputs a camera-ready PDF plus a self-contained matplotlib script with an inline DATA SECTOR.

56k tokens
context cost
the whole folder, loaded on every use
24
files
ships runnable scripts
0
copies elsewhere
how many repositories repackaged it
497
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/VILA-Lab/FigMirror --skill figmirror

The instruction itself

7 sections, as written by the author

FigMirror (figmirror)

Use this skill when the user wants to:

  • Transfer the visual style of a top-conference paper figure to their own data.
  • Produce a camera-ready matplotlib figure matching a reference screenshot in

style, not in data.

  • Mirror 3D paper-figure references such as surfaces, scatter, trajectories,

bars, layered waterfalls, or plane projections when the reference or data is

actually 3D.

  • Receive a self-contained .py script with editable inline data plus PNG/PDF

outputs.

Required Inputs

  • A reference figure screenshot (PNG/JPG). It may include margins, captions,

neighboring panels, or page text; Stage 0 preprocesses it.

  • The user's data in any parseable form: pasted table, CSV, TSV, markdown table, or

dirty terminal text.

  • A working directory for iteration artifacts.

3D Insert Gate

Enable references/three-d-prompting.md only when the user asks for a 3D

figure, the reference is visibly 3D, or the parsed data requires a 3D encoding

such as x/y/z, surfaces, trajectories, layered profiles, closed objects, 3D

small multiples, 3D bars, or plane projections. Do not use this insert to turn

an ordinary 2D task into 3D.

Architecture

  • Python runner owns UI lifecycle, cancellation, Stage-0 bootstrap, optional

data-gen, and launching the main Codex process.

  • The top-level Codex process is Orchestrator only. It owns iteration state,

role dispatch, artifact checks, Reviewer audit-view staging, JSON parsing, stop

decisions, and final selection.

  • Drawer runs as the named figmirror-drawer custom subagent through

spawn_agent with fork_context=false. It writes each iteration's matplotlib

script, render, notes, and floor self-check in the staged workdir.

  • Reviewer runs as the named figmirror-reviewer custom subagent through

spawn_agent with fork_context=false. It sees only the staged audit view:

the far-view composite, full-resolution reference/draft near views, the

Reviewer prompt, the aesthetic library, and bounded history. It returns strict

JSON including boxes; the Orchestrator writes that JSON to

audit_iter<N>.json and deterministically renders annotated.png plus

notes.md for the next Drawer.

  • 3D flow uses the standard Orchestrator plus named Drawer/Reviewer

subagents, and optional candidate-scoring path for strict reproduction.

Workflow

  • Read these bundled references from this skill directory:
  • references/preprocessor.md for Stage-0 reference crop cleanup.
  • references/orchestrator-codex.md for loop wiring and stop conditions.
  • references/drawer.md for the Drawer instructions.
  • references/reviewer.md for the Reviewer instructions.
  • references/aesthetic-library.md for the L2 convention library.
  • references/three-d-prompting.md only when the 3D insert gate is enabled.
  • Preserve the uploaded reference as inputs/reference_raw.png, then run the

reference preprocessor to write inputs/reference_clean.png,

inputs/reference_crop_check.png, and inputs/reference_crop_report.md.

  • Echo the parsed data structure before drawing. If the user explicitly asked you

to make up data or proceed without confirmation, record that in data_echo.md

and continue; otherwise ask for confirmation.

  • When the 3D insert gate is enabled, stage references/three-d-prompting.md

plus references/three-d/ beside the normal prompts. The router selects

exactly one mode file: three-d/style-transfer.md for ordinary user-data

figures, or three-d/strict-reproduction.md for reproduction, comparison, or

candidate/control replacement. For strict 3D reproduction runs that need

quantitative candidate diagnosis, also stage scripts/score_3d_candidates.py;

do not use that scorer for ordinary style transfer. The top-level

Orchestrator owns final selection and must run the selected mode's

rendered-image gates before copying any candidate to the final figure.

Always stage scripts/figannot.py; it is the deterministic operator for

building audit composites and drawing Reviewer boxes.

  • In Codex, the top-level agent follows references/orchestrator-codex.md and

spawns figmirror-drawer for each iter. The Drawer writes

figure_iter<N>.py, img_iter<N>.png, notes_iter<N>.md, and

floor_selfcheck_iter<N>.txt; the Orchestrator verifies those files before

any Reviewer handoff.

  • Stage audit_view_<N>, run scripts/figannot.py compose to create

composite.png and review_prompt.txt, and spawn figmirror-reviewer as

described in references/orchestrator-codex.md. The Reviewer sees the

composite far view, full-resolution reference/draft near views, aesthetic

library, optional 3D insert, bounded anchors/changed lists, and prior audit

JSON, then returns strict JSON for the Orchestrator to persist.

  • Run scripts/figannot.py draw so audit_view_<N>/annotated.png and

audit_view_<N>/notes.md become the next Drawer invocation's explicit

stateless visual history.

  • Stop when the Reviewer returns a passing quality floor and a shipping verdict.

If the caller supplied max_iters, select the best floor-passing close iteration

when that limit is reached. If the caller enabled auto-until-shipped, keep

iterating until ship or a real blocker.

  • Write final figure.py, figure.png, figure.pdf, output.png,

floor_selfcheck_final.txt, selection.md, process.md, and status.json.

output.png is the evaluator-facing PNG and may be identical to

figure.png.

Artifact Layout

<workdir>/
  inputs/
    reference_raw.png
    reference_clean.png
    reference_crop_check.png
    reference_crop_report.md
    data.txt
    aesthetic-library.md
  prompts/
    preprocessor.md
    drawer.md
    reviewer.md
    orchestrator-codex.md
    aesthetic-library.md
    three-d-prompting.md  # router, only for 3D runs
    three-d/              # mode files and routed 3D modules, only for 3D runs
  tools/
    figannot.py
    score_3d_candidates.py  # optional for strict 3D candidate diagnosis
  figure_iter0.py
  img_iter0.png
  notes_iter0.md
  floor_selfcheck_iter0.txt
  audit_view_0/
    reference_clean.png
    img_iter0.png
    composite.png
    composite_meta.json
    review_prompt.txt
    aesthetic-library.md
    anchors.md
    changed.md
    three-d-prompting.md  # router, only for 3D runs
    three-d/              # mode files and routed 3D modules, only for 3D runs
    review.json
    annotated.png
    notes.md
  audit_iter0.json
  audit_iter0.stderr
  ...
  figure.py
  figure.png
  figure.pdf
  output.png
  floor_selfcheck_final.txt
  selection.md
  process.md
  status.json

Non-Negotiables

  • The reference is a style anchor, not a layout-number anchor — but the chart type

and signature motifs ARE style, not layout numbers. Reproduce them.

  • Preserve the source's signature visual motifs — chart type, colorbars, shaded/error

bands, error bars, streamline fields, stacked/offset construction, insets. Dropping

or flattening one is a fidelity failure, not a simplification. Only the data values

and labels change to match data.txt.

  • inputs/reference_raw.png is the preserved upload; inputs/reference_clean.png

is the Stage-0 crop used for L1 measurement.

  • Every visual choice must be grounded in L1 (reference image) or L2

(references/aesthetic-library.md); L3 opinion is disallowed.

  • Do not modify a property on the Reviewer preserve list outside its L1/L2 class.
  • Do not expose data.txt or source code to the Reviewer audit view.
  • Keep the final script self-contained and set plt.rcParams["pdf.fonttype"] = 42.

How to use it

Copy the folder

Take vila-lab/figmirror-figmirror from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.