{"slug":"rigc","title":"rigc","summary":"Author, build and validate Spine 4.3 skeleton data (skeleton.json plus its .atlas) from loose part PNGs with rigc, the rig compiler that verifies its own output with named assertions before writing it. Use for any request to make a Spine rig or Spine animation from PNG parts, or ","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-10-14T21:51:24.492948Z","repo":{"url":"https://github.com/rig-c/core","stars":14,"forks":2,"license":null,"updatedAt":"2026-10-14T21:50:41Z"},"bodyHtml":"<hr>\n<h2>name: rigc\ndescription: Author, build and validate Spine 4.3 skeleton data (skeleton.json plus its .atlas) from loose part PNGs with rigc, the rig compiler that verifies its own output with named assertions before writing it. Use for any request to make a Spine rig or Spine animation from PNG parts, or where the source is a Live2D, Unity or video model whose pictures you can render, to run or read rigc build, validate, render, preview, check or vote, or to write or fix a *.rig.json or *.motion.json spec; it says which shipped guide to open for the need at hand. Not for Live2D conversion, cutting an illustration into parts, or real-time face tracking.\nlicense: MIT\ncompatibility: Requires Bun 1.2 or later. The tool is the npm package rig-c (bunx rig-c, or bun add -d rig-c); the command it installs is rigc.</h2>\n<h1>rigc — a rig compiler for agents</h1>\n<p>rigc compiles a rig spec and a motion spec into Spine 4.3 skeleton data and an\natlas, runs its named assertions — rigc's own validator in the published package,\nheld to a <code>@esotericsoftware/spine-core</code> round trip's verdicts in its CI, all but\nthe parse itself — and writes <strong>only if every one is green</strong>. You cannot see the\nrig you are authoring. The validator's messages and the shipped guides are the\nwhole interface, and this skill only says which of them to open.</p>\n<p>\uD83D\uDCD6 <strong>A failure line ends with the command that prints its row of the guide</strong> —\n<code> (see rigc guide &lt;RULE&gt;)</code>. Run that command first, before reading anything else:\nit prints that rule's row of the shipped guide and nothing else. <code>rigc guide §&lt;n&gt;</code>\n(and <code>§&lt;n&gt;.&lt;m&gt;</code>, <code>§&lt;n&gt;.&lt;m&gt;.&lt;k&gt;</code>) prints the section's heading, own prose and\nsubsection index from <code>docs/AUTHORING.md</code>; add <code>--all</code> to include subsection\nbodies. A leaf prints its full text either way. Sizes describe full ledger spans;\n<code>--all</code> with a rule name is refused, exit 2. A compile error points at its stable\n<code>CE_</code> code row. <code>rigc guide §5.1.&lt;k&gt;</code> prints a numbered compile-error group of\nat most 30,000 UTF-8 bytes, and <code>rigc guide §5.1</code> prints the introduction and\nindex within that same limit; only legacy uncoded library errors point at <code>§5.1</code>.</p>\n<h2>Non-negotiables</h2>\n<ul>\n<li><strong>Validation is never bypassed.</strong> <code>build</code> writes nothing on a red gate; there is\nno <code>--no-validate</code>, and none may be added — AUTHORING §0 says so in as many\nwords. Correctness is the whole of the reason: the assertions are what make the\noutput trustworthy, and they are held to the official parser's verdicts in the\nrepository's CI — all but the parse itself, which runs only where the runtime is\ninstalled and is reported as a SKIP elsewhere.</li>\n<li><strong>The compiler never invents a value.</strong> A field the spec leaves out is a\n<code>CompileError</code> naming that field. Fill the spec; do not expect a default read off\nthe art — AUTHORING §2 and §5.</li>\n<li><strong>The validator's messages are the instructions.</strong> Each names the object, the\nvalue found and the value required, and AUTHORING §5 maps every named failure to\nthe file that has to change.</li>\n<li><strong>A green gate cannot see a wrong animation.</strong> If you were given pictures,\n<code>check</code> is the half of the loop that can; if not, <code>render</code> or <code>preview</code> and look —\nAUTHORING §0 and §9.</li>\n</ul>\n<h2>Install</h2>\n<pre><code>bunx rig-c --help       # run it without installing\nbun add -d rig-c        # or pin it in the project; the command is `rigc`\nbun rigc skills install      # then link these skills into .agents/skills\n</code></pre>\n<p>Codex, Gemini CLI and Antigravity read skills from <code>.agents/skills/</code> in the\nworkspace and none of them reads <code>node_modules</code>; <code>rigc skills install</code> puts every\nskill the package ships there, and <code>rigc skills --help</code> says what it refuses.</p>\n<p>The package links no Spine runtime. <code>validate</code>, <code>preview</code> and <code>vote</code> below run\nthrough <code>@esotericsoftware/spine-core</code>: install it beside the package\n(<code>bun add -d @esotericsoftware/spine-core</code>) and the same <code>rigc</code> runs them, and\n<code>build</code> runs the round trip as well. Without it they are refused by name, and\n<code>build</code> writes the same files gated without the parse — <code>rigc --version</code> names the\nentry that ran. In the parse's place that <code>build</code> runs two rules of its own over\nrigc's model document, <code>A00_MODEL_READ</code> and <code>A00_MODEL_REGIONS_ON_PAGES</code>; they are\nnot registry assertions, so its summary counts two more, and AUTHORING §5.2 has a\nrow for each.</p>\n<h2>The loop</h2>\n<ol>\n<li><code>rigc build --rig &lt;spec&gt; --motion &lt;spec&gt; --images &lt;dir&gt; --out &lt;dir&gt;</code> compiles,\ngates, and writes only on green.</li>\n<li>Read the report. Every red line names the file to change; fix the spec and\nbuild again.</li>\n<li><code>rigc explain --rig &lt;spec&gt; --motion &lt;spec&gt; --out &lt;dir&gt;</code> when the red line is\nnot enough — the compiled rig as a table: every bone with its resolved parent,\nthe slots in draw order, every timeline key by key, and a <code>DEFORM</code> block per\ndeform key. It takes no <code>--profile</code>, it never gates, and it writes nothing, so\nthe figures are readable on a build the gate is refusing — AUTHORING §0 and\n§4.11.2.</li>\n<li><code>rigc render --candidate &lt;out&gt;</code> or <code>rigc preview --candidate &lt;out&gt;</code> — look at\nit. A rig with its head off its torso passes the gate; looking is what catches it.\nOpen one frame at full size, not only <code>contact.png</code>: the sheet is for spacing\nacross frames, and a defect is read on a frame. Ask it three things — is any\npicture drawn twice, is there a straight edge where the art has none, does a part\ncover a feature the art shows — and answer each with <code>render --hide &lt;slot&gt;</code> (or\n<code>--slot &lt;slot,…&gt;</code>), which draws the frame again without that part on the same\ngrid, so the two frames say which part a pixel is. AUTHORING §0 holds the three.\nWhen the question is geometry — is this bone where the art is, which way does it\nsquash, where in rig units is this point — <code>rigc inspect --candidate &lt;out&gt; --show art,bones,names --dim</code> draws the bones over the art and writes a legend beside the\npicture that puts every mark back in world units; AUTHORING §13 maps each\nquestion to its view.</li>\n<li><code>rigc check --candidate &lt;out&gt; --frames &lt;dir&gt;</code> when you have reference pictures\n(<code>--out &lt;dir&gt;</code> writes the picture each of its numbers came from — open the worst).\nRead its output from the top: the framing block says whether the figures under\nit are about placement or motion. A figure is where the loop starts, not where it\nends — keep the first green build's figure, check every later build against the\nsame frames, and stop when the figure stops moving, not when it exists; AUTHORING\n§9.2 says how to read the framing block and the floor to read a figure against.\n<code>rigc vote --candidate &lt;a&gt; --candidate &lt;b&gt;</code> when several candidates are green and\nonly a person can choose between them.</li>\n<li><code>rigc validate &lt;out&gt;</code> re-gates artifacts already on disk, and\n<code>rigc &lt;command&gt; --help</code> is each command's own flag table. <code>rigc repack &lt;out&gt; --out &lt;dir&gt;</code> packs a build again under <code>build --pack</code>'s packing flags when its\nparts were not kept, and writes only after every region and the skeleton are\nshown unchanged (<code>--accept-skeleton-differences</code> writes a rebuild whose skeleton\ndiffers, every difference printed; <code>--stage-box &lt;slot&gt;</code> reads a build's stage box)\n— AUTHORING §0.4. A mesh refused because its triangles are several pieces that\nshare no vertex: <code>rigc split --rig … --motion … --slot &lt;slot&gt; --out &lt;dir&gt;</code> writes\nboth specs back with one mesh per piece and every deform key renumbered — build\nthat — AUTHORING §3.4.11.</li>\n<li>Every finished unit ends with <code>rigc preview --candidate &lt;out&gt;</code>, and the report\nnames the <code>.html</code> it wrote. The hand-off to a person is part of the work.</li>\n</ol>\n<p>The loop in full, with <code>pose</code> before it and <code>chainfit</code> after the first build:\nAUTHORING §0.</p>\n<h2>When the source is not loose PNGs</h2>\n<p>A Live2D model, a Unity scene or a video is a player, not a set of parts. Make the\nreference frames first: render the source at the rate you will check at, into one\ndirectory of <code>f0000.png</code>, <code>f0001.png</code>…, and <code>rigc check --frames &lt;that dir&gt; --fps &lt;rate&gt;</code>\nreads them with no <code>frames.json</code>. A port with no reference frames is unmeasured,\nnot finished. The parts are the source's own texture cut along its drawables, never\na screenshot: a screenshot is the composed result, and a part cut from it carries\nevery part under it. Where a part goes is its drawable's geometry — its vertices in\nmodel space, its UVs, its triangles — which is a mesh attachment with those three\n(AUTHORING §3.4, <em>Mesh attachment</em>); a region at the drawable's bounding-box centre\nkeeps only the box. rigc reads none of those formats — FACE §11, the paragraph\nthat opens <em>No Live2D file is read or written</em>\n(<a href=\"https://github.com/rig-c/core/blob/main/docs/FACE.md#11-non-goals--stated-so-nobody-proposes-them-as-gaps\">FACE.md</a>) —\nonly the pictures they produce. The rule, the background those frames need and\nwhat a wrong one costs: AUTHORING §0, <em>When the source is a foreign player</em>.</p>\n<h2>Which guide, for which need</h2>\n<p>Read <a href=\"https://github.com/rig-c/core/blob/main/docs/AUTHORING.md\">AUTHORING.md</a> first, whatever the need: the two\nspec files field by field, the emission rules, the loop, and the failure map. Then:</p>\n<table>\n<thead>\n<tr>\n<th>The request is…</th>\n<th>Open</th>\n<th>Skill</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>a <strong>skeleton</strong> — how many bones, where each pivot sits, what hangs off what</td>\n<td><a href=\"https://github.com/rig-c/core/blob/main/docs/RIGGING.md\">RIGGING.md</a></td>\n<td><code>rigc-rigging</code></td>\n</tr>\n<tr>\n<td>a <strong>movement</strong> — an idle, a loop, from this pose to that one</td>\n<td><a href=\"https://github.com/rig-c/core/blob/main/docs/MOTION.md\">MOTION.md</a></td>\n<td><code>rigc-motion</code></td>\n</tr>\n<tr>\n<td>a <strong>face</strong> — a blink, a gaze, a head turn a few degrees off axis</td>\n<td><a href=\"https://github.com/rig-c/core/blob/main/docs/FACE.md\">FACE.md</a></td>\n<td><code>rigc-face</code></td>\n</tr>\n<tr>\n<td>a <strong>skeleton.json somebody else authored</strong> — read it, repair it, extend it</td>\n<td><a href=\"https://github.com/rig-c/core/blob/main/docs/INGEST.md\">INGEST.md</a></td>\n<td><code>rigc-ingest</code></td>\n</tr>\n<tr>\n<td>you are the <strong>person operating</strong> the agent rather than the agent</td>\n<td><a href=\"https://github.com/rig-c/core/blob/main/docs/PROMPTING.md\">PROMPTING.md</a></td>\n<td>—</td>\n</tr>\n</tbody>\n</table>\n<p>Every guide linked here is in the installed package at <code>node_modules/rig-c/docs/</code>,\nwhich is the copy that matches the rigc you run; the links go to the repository's\n<code>main</code>. Inside the Claude Code plugin the same files are at <code>${CLAUDE_PLUGIN_ROOT}/docs/</code>.\nFormats, the CLI reference and the licence chain:\n<a href=\"https://github.com/rig-c/core/blob/main/README.md\">README.md</a>, installed at <code>node_modules/rig-c/README.md</code>.</p>\n","files":[{"path":"SKILL.md","sizeBytes":10447,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-10-14T21:51:31.104603Z","sha256":"A05471E54C772881EB1F56D4B02AABB7CBB9ED42468C70E4C4E328FC95BC9284","sizeBytes":4626},"review":null,"source":{"repositoryUrl":"https://github.com/rig-c/core","path":"skills/rigc","license":null,"commit":"844d2a10413aed8151c618392ea380cb5f43c6c3","subtreeSha":"5B46CE703746142E45210393D5A6AF309CA32D4D3A3002CAED5E8647BF1BDBA3","lastSyncedAt":"2026-10-14T21:51:24.485663Z"},"reviewedAt":"2026-10-14T21:53:21.984072Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/rig-c/core/tree/main/skills/rigc"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install rig-c-core@llmmart"},{"target":"git","command":"git clone https://github.com/rig-c/core.git"}]}