rig-parts 0.16.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE.md +24 -24
- package/README.md +66 -52
- package/bin/{spine-parts.cjs → rig-parts.cjs} +9 -5
- package/cli.ts +49 -49
- package/docs/AUTHORING.md +465 -57
- package/docs/MIGRATION.md +137 -0
- package/docs/STABILITY.md +256 -0
- package/package.json +11 -8
- package/skills/{spine-parts → rig-parts}/SKILL.md +21 -21
- package/src/apng.ts +4 -4
- package/src/autoamplitude.ts +194 -0
- package/src/autoenvelope.ts +404 -0
- package/src/automesh.ts +561 -0
- package/src/automotion.ts +336 -0
- package/src/autoreplay.ts +516 -0
- package/src/build.ts +483 -27
- package/src/check.ts +32 -32
- package/src/comfy/painting.ts +1 -1
- package/src/comfy/seethrough.ts +1 -1
- package/src/config.ts +385 -25
- package/src/contour.ts +85 -32
- package/src/coords.ts +3 -3
- package/src/gif.ts +1 -1
- package/src/instruments.ts +2 -2
- package/src/layers.ts +1 -1
- package/src/localweights.ts +21 -11
- package/src/mesh.ts +30 -5
- package/src/motion.ts +4 -4
- package/src/palette.ts +1 -1
- package/src/propose.ts +2 -2
- package/src/raster/png.ts +7 -7
- package/src/raster/types.ts +1 -1
- package/src/requirements.ts +13 -13
- package/src/rig.ts +384 -19
- package/src/scene.ts +7 -7
- package/src/sheet.ts +2 -2
- package/src/structure.ts +10 -6
- package/src/weights.ts +19 -3
package/NOTICE.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# Third-party notices
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
rig-parts' own code is MIT (see `LICENSE`). It depends on, reads the output
|
|
4
4
|
of, or reimplements the behaviour of the third-party work below, each under its
|
|
5
5
|
own terms. Naming a project here identifies where something comes from; it does
|
|
6
|
-
not imply that its authors endorse
|
|
6
|
+
not imply that its authors endorse rig-parts.
|
|
7
7
|
|
|
8
8
|
Every statement below is either quoted from the named source or marked
|
|
9
9
|
**[observed]** with the date and the place it was read. Upstream terms can
|
|
@@ -11,10 +11,10 @@ change; check the source when it matters.
|
|
|
11
11
|
|
|
12
12
|
## 1. See-through
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
rig-parts takes See-through's output as its input. **rig-parts does not
|
|
15
15
|
vendor, embed or redistribute See-through code or weights**: the user runs
|
|
16
16
|
See-through by one of the routes in the README (*See-through routes*) and points
|
|
17
|
-
|
|
17
|
+
rig-parts at what it wrote.
|
|
18
18
|
|
|
19
19
|
- Project: [shitagaki-lab/see-through](https://github.com/shitagaki-lab/see-through)
|
|
20
20
|
- Paper: Jian Lin, Chengze Li, Haoyun Qin, Kwun Wang Chan, Yanghua Jin, Hanyuan
|
|
@@ -31,7 +31,7 @@ spine-parts at what it wrote.
|
|
|
31
31
|
repository (`LICENSE` on the default branch `master` returns 404, and GitHub
|
|
32
32
|
reports no licence); `pyproject.toml` declares `license = "MIT"`.
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
rig-parts reads the wrapper's `layers.json` manifest format; it contains no
|
|
35
35
|
wrapper code.
|
|
36
36
|
|
|
37
37
|
### Weights
|
|
@@ -46,52 +46,52 @@ wrapper code.
|
|
|
46
46
|
Maintainer statement, on the Hugging Face discussion
|
|
47
47
|
[`layerdifforg/seethroughv0.0.2_layerdiff3d/discussions/1`](https://huggingface.co/layerdifforg/seethroughv0.0.2_layerdiff3d/discussions/1)
|
|
48
48
|
(user `24yearsold`, 2026-04-07): *"Yes all our models are aligned with our main
|
|
49
|
-
repo to use Apache 2.0."* The 2026-09-28 card revision above narrows that: Apache-2.0 for the maintainers' contributions, with the base models' Open RAIL terms inherited.
|
|
49
|
+
repo to use Apache 2.0."* The 2026-09-28 card revision above narrows that: Apache-2.0 for the maintainers' contributions, with the base models' Open RAIL terms inherited. rig-parts does not distribute these weights; a user who fetches them accepts the terms the card states on the day they fetch.
|
|
50
50
|
|
|
51
51
|
### Training data
|
|
52
52
|
|
|
53
53
|
The paper describes its own supervision this way: *"we introduce a scalable
|
|
54
54
|
engine that bootstraps high-quality supervision from commercial Live2D models,
|
|
55
55
|
capturing pixel-perfect semantics and hidden geometry."* That is the paper's
|
|
56
|
-
description of how See-through was trained.
|
|
56
|
+
description of how See-through was trained. rig-parts does not use,
|
|
57
57
|
include or redistribute any of that data, any Live2D model, or anything derived
|
|
58
58
|
from them beyond the layers See-through itself writes for the user's own image.
|
|
59
59
|
|
|
60
|
-
## 2. Spine Runtimes, through
|
|
60
|
+
## 2. Spine Runtimes, through rig-c
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
rig-parts depends on [`rig-c`](https://www.npmjs.com/package/rig-c)
|
|
63
63
|
(MIT, same author), which compiles and validates Spine skeleton data. Its round
|
|
64
64
|
trip runs through `@esotericsoftware/spine-core`, part of the
|
|
65
65
|
[Spine Runtimes](https://github.com/EsotericSoftware/spine-runtimes), under the
|
|
66
66
|
[Spine Runtimes License Agreement](https://esotericsoftware.com/spine-runtimes-license).
|
|
67
|
-
Since
|
|
68
|
-
only as a development dependency, and an install of
|
|
69
|
-
its own validator.
|
|
70
|
-
development dependency, at the version
|
|
67
|
+
Since rig-c 2.0 neither package installs the runtime: rig-c carries it
|
|
68
|
+
only as a development dependency, and an install of rig-c gates a build with
|
|
69
|
+
its own validator. rig-parts does not install it either; it is this repository's
|
|
70
|
+
development dependency, at the version rig-c develops against, for the round
|
|
71
71
|
trip in the selftest and CI and the selftest's posing oracle.
|
|
72
|
-
|
|
72
|
+
rig-c's [NOTICE.md](https://github.com/firejune/rigc/blob/main/NOTICE.md)
|
|
73
73
|
sets out the chain in full; briefly, as a restatement of Esoteric Software's
|
|
74
74
|
terms and not a term of this project:
|
|
75
75
|
|
|
76
|
-
1. What
|
|
76
|
+
1. What rig-parts produces is input to rig-c, whose output **is Spine
|
|
77
77
|
skeleton data**.
|
|
78
78
|
2. Playing Spine skeleton data in a product requires a Spine Runtime, and the
|
|
79
79
|
Spine Runtimes License requires **each user of such a product to own a
|
|
80
80
|
Spine Editor license**.
|
|
81
|
-
3.
|
|
82
|
-
the obligation in 2 attaches to the Spine skeleton data
|
|
83
|
-
which the stages of
|
|
81
|
+
3. rig-c no longer installs `spine-core`, and rig-parts does not either;
|
|
82
|
+
the obligation in 2 attaches to the Spine skeleton data rig-c writes,
|
|
83
|
+
which the stages of rig-parts that call it produce, and to `spine-core`
|
|
84
84
|
wherever it is installed beside them — this repository's development
|
|
85
85
|
dependency included.
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
rig-parts also imports rig-c's own modules directly, by deep path: its PNG codec
|
|
88
88
|
(`tools/plate.ts`, `src/png.ts`), its 5x7 label font (`tools/font5x7.ts`) and
|
|
89
|
-
its coordinate conversion (`src/transform.ts`). Those are
|
|
89
|
+
its coordinate conversion (`src/transform.ts`). Those are rig-c's MIT code.
|
|
90
90
|
|
|
91
91
|
## 3. Checkpoints
|
|
92
92
|
|
|
93
|
-
Generating the painting is an **optional** adapter (`
|
|
94
|
-
The checkpoint, any LoRA and any ControlNet it runs are the user's:
|
|
93
|
+
Generating the painting is an **optional** adapter (`rig-parts comfy paint`).
|
|
94
|
+
The checkpoint, any LoRA and any ControlNet it runs are the user's: rig-parts
|
|
95
95
|
ships none and downloads none, and the terms that govern an image they produce
|
|
96
96
|
are the terms of those models. A painting from any other source works the same
|
|
97
97
|
way.
|
|
@@ -121,7 +121,7 @@ function's comment says which call it stands in for and what was measured.
|
|
|
121
121
|
|
|
122
122
|
| Package | Licence | Why |
|
|
123
123
|
| --- | --- | --- |
|
|
124
|
-
| [`
|
|
124
|
+
| [`rig-c`](https://www.npmjs.com/package/rig-c) | MIT | compile, gate, render and check; its PNG codec, font and coordinate conversion |
|
|
125
125
|
| [`ag-psd`](https://www.npmjs.com/package/ag-psd) | MIT | reading an upstream See-through `.psd` |
|
|
126
126
|
| ↳ [`pako`](https://www.npmjs.com/package/pako) | MIT AND Zlib | ag-psd's deflate |
|
|
127
127
|
| ↳ [`base64-js`](https://www.npmjs.com/package/base64-js) | MIT | ag-psd's base64 |
|
|
@@ -129,6 +129,6 @@ function's comment says which call it stands in for and what was measured.
|
|
|
129
129
|
Development only, not installed with the package: `typescript` (Apache-2.0),
|
|
130
130
|
`eslint` (MIT), `typescript-eslint` (MIT), `@types/bun` (MIT), and
|
|
131
131
|
[`@esotericsoftware/spine-core`](https://www.npmjs.com/package/@esotericsoftware/spine-core)
|
|
132
|
-
(Spine Runtimes License; section 2), pinned to the version
|
|
132
|
+
(Spine Runtimes License; section 2), pinned to the version rig-c develops
|
|
133
133
|
against (`TY10`): the round trip in the selftest and CI, the selftest's posing
|
|
134
134
|
oracle, and `tools/atlas_population.ts` and `tools/idle_cost.ts`.
|
package/README.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
#
|
|
1
|
+
# rig-parts
|
|
2
2
|
|
|
3
3
|
**AI-authored Spine 2D character rigs from one anime painting, verified before they
|
|
4
|
-
are written.**
|
|
4
|
+
are written.** rig-parts takes a single character painting and the layers
|
|
5
5
|
[See-through](https://github.com/shitagaki-lab/see-through) decomposed it into,
|
|
6
6
|
merges them into measured rig-space parts, authors weighted meshes, bone chains
|
|
7
|
-
and a looping idle over them in [
|
|
8
|
-
spec, and hands that spec to
|
|
7
|
+
and a looping idle over them in [rig-c](https://github.com/firejune/rigc)'s
|
|
8
|
+
spec, and hands that spec to rig-c to compile, gate, pack, render and check.
|
|
9
9
|
It is built for agents that cannot see the image: every stage prints named,
|
|
10
10
|
numeric findings, a refusal names the object, the value found and the value
|
|
11
11
|
required, nothing is written after a red, and no value is invented where the
|
|
@@ -14,20 +14,21 @@ input is silent.
|
|
|
14
14
|
## What you get
|
|
15
15
|
|
|
16
16
|
<p align="center">
|
|
17
|
-
<img src="https://raw.githubusercontent.com/firejune/
|
|
18
|
-
<img src="https://raw.githubusercontent.com/firejune/
|
|
17
|
+
<img src="https://raw.githubusercontent.com/firejune/rig-parts/main/assets/demo-source.png" alt="The demo painting: a generated full-body character in a white and pink frilled dress with long pink twin tails, standing with her hands clasped" height="420" />
|
|
18
|
+
<img src="https://raw.githubusercontent.com/firejune/rig-parts/main/assets/demo-idle.png" alt="The same character as a Spine rig, breathing, blinking once and swaying her hair, sleeves and skirt in a four-second loop" height="420" />
|
|
19
19
|
</p>
|
|
20
20
|
|
|
21
21
|
<p align="center">
|
|
22
|
-
<img src="https://raw.githubusercontent.com/firejune/
|
|
22
|
+
<img src="https://raw.githubusercontent.com/firejune/rig-parts/main/assets/demo-parts.png" alt="Contact sheet of the painting and the 22 assembled parts it was split into: hair, dress, sleeves, shoes, face, eyes, brows, mouth and ornaments" width="100%" />
|
|
23
23
|
</p>
|
|
24
24
|
|
|
25
25
|
<p align="center"><em>
|
|
26
26
|
The painting was generated for this repository with a public checkpoint (Pony
|
|
27
27
|
Diffusion V6 XL) and no LoRA; its generation record, See-through layers and licence
|
|
28
|
-
are in <a href="https://github.com/firejune/spine-parts-examples">spine-parts-examples</a
|
|
28
|
+
are in <a href="https://github.com/firejune/spine-parts-examples">spine-parts-examples</a>
|
|
29
|
+
(that repository keeps the name it was published under before this package's rename).
|
|
29
30
|
See-through ran twice, once on the whole figure and once on a square head crop.
|
|
30
|
-
Then one command: <code>
|
|
31
|
+
Then one command: <code>rig-parts build --seam silhouette --loop</code>. The
|
|
31
32
|
proposer's bones, meshes, regions and motion were used <b>unedited</b>. Two input-stage
|
|
32
33
|
edits were made by hand for the reference run this example reproduces: the head box
|
|
33
34
|
was shifted down into the canvas (its proposal ran 118 px above the top edge;
|
|
@@ -41,19 +42,19 @@ is taken from the full run, because the twin tails leave the head crop sideways
|
|
|
41
42
|
<code>--seam silhouette</code> repaired the navy blobs the default rule leaves on the white
|
|
42
43
|
blouse (recomposite error pixels 11,050 → 9,540); the default stays
|
|
43
44
|
<code>near-white</code>, the reference implementation's rule, so the examples stay
|
|
44
|
-
comparable with it. The loop is <code>
|
|
45
|
+
comparable with it. The loop is <code>rig-parts loop --palette</code>'s indexed APNG, 48 frames at
|
|
45
46
|
12 fps, 1,706,719 bytes, one 256-entry palette at a measured error of max 57, mean 1.601
|
|
46
47
|
per channel over every frame (the lossless APNG beside it, the exactness record, is
|
|
47
48
|
13,645,503 bytes; the GIF, at the same error, 1,812,288). Frame 29 (2.417 s) is the
|
|
48
49
|
closed eye: the blink holds for 0.084 s, one 12 fps frame rounded up, where the
|
|
49
50
|
reference implementation held 0.04 s and no frame of its loop showed the eyes shut
|
|
50
51
|
(issue #32); the painting is shown at half size, resampled and written
|
|
51
|
-
by this package's PNG codec (nothing here encodes JPEG). <code>
|
|
52
|
+
by this package's PNG codec (nothing here encodes JPEG). <code>rig-parts sheet</code>
|
|
52
53
|
made the contact sheet.
|
|
53
54
|
</em></p>
|
|
54
55
|
|
|
55
56
|
<p align="center">
|
|
56
|
-
<img src="https://raw.githubusercontent.com/firejune/
|
|
57
|
+
<img src="https://raw.githubusercontent.com/firejune/rig-parts/main/assets/sample-parts.png" alt="Contact sheet of the sample character's painting and its 20 parts" width="560" />
|
|
57
58
|
</p>
|
|
58
59
|
|
|
59
60
|
<p align="center"><em>
|
|
@@ -86,7 +87,7 @@ is this port's own build (<a href="examples/scarf/README.md">examples/scarf</a>)
|
|
|
86
87
|
the stacking order being the draw order.
|
|
87
88
|
- **A character config** (`config.json`) — the part plan, the head box, the bones,
|
|
88
89
|
which bones may pull which layer, the idle's sines, and optionally `constraints`
|
|
89
|
-
in
|
|
90
|
+
in rig-c's own rig-spec shape (ik, transform, path, physics, slider), handed
|
|
90
91
|
to rigc as written once every bone they name resolves; a scene target is a bone
|
|
91
92
|
under `root` a constraint names. `src/config.ts` is its
|
|
92
93
|
schema and documents every field; the loader refuses an unknown or a missing field
|
|
@@ -96,14 +97,14 @@ is this port's own build (<a href="examples/scarf/README.md">examples/scarf</a>)
|
|
|
96
97
|
|
|
97
98
|
## What it gives out
|
|
98
99
|
|
|
99
|
-
`
|
|
100
|
+
`rig-parts build` ends the way a Spine editor export does — with **one packed atlas
|
|
100
101
|
page** (issue #2):
|
|
101
102
|
|
|
102
103
|
| path under `--out` | what |
|
|
103
104
|
| --- | --- |
|
|
104
105
|
| `check/build/skeleton.json`, `skeleton.atlas`, `skeleton.png` | **the artifact** — Spine 4.3 skeleton data and one packed page, written by `rigc build --pack --page-edges free --pack-shape polygon` and gated under `spine-html`, which holds every rule `spine` measures (on the demo, rigc 2.1.3 and 2.10.1: the 14 rules `validate --profile spine` measures are among the build's 24; 16 are not in `spine`) |
|
|
105
106
|
| `parts/*.png`, `parts.json`, `recomposite_rig.png`, `recomposite_error_rig.png` | the loose parts, each cropped to its alpha box; the record of where every part came from, how many of its pixels were re-taken from the painting, and the recomposite's uncovered holes with their boxes; the flat stack of parts; its error map — red where no part covers a pixel the painting has, blue where a part covers it in the wrong colour |
|
|
106
|
-
| `rig/` | `rig.json` and `motion.json` in
|
|
107
|
+
| `rig/` | `rig.json` and `motion.json` in rig-c's spec, `mesh_report.json`, the padded `images/` |
|
|
107
108
|
| `check/` | both gate files verbatim, the idle's frames and their `geometry.json` (skinned vertices per frame), `contact.png`, `motion_heat.png`, `check.json` (with `pack_mode`, the `--page-edges` and `--pack-shape` the page was packed under) |
|
|
108
109
|
| `idle.png`, `idle-indexed.png`, `idle.gif` | with `--loop`: the idle as a lossless APNG (the exactness record), an indexed APNG with one shared palette (the small one) and a GIF; the last two print their palette error |
|
|
109
110
|
|
|
@@ -130,7 +131,7 @@ consumer that mipmaps or repeats the page; it writes exactly the page builds wro
|
|
|
130
131
|
before the flag existed. The measurements are in
|
|
131
132
|
[AUTHORING §5, *Page edges*](docs/AUTHORING.md#5-after-each-stage-what-to-read).
|
|
132
133
|
|
|
133
|
-
The pack shape is `polygon` by default (
|
|
134
|
+
The pack shape is `polygon` by default (rig-c 2.1): a region only meshes draw is
|
|
134
135
|
packed by its emitted hull, so a neighbour may sit inside its rectangle where the hull
|
|
135
136
|
is not; a region attachment stays its rectangle. On the two examples that takes the
|
|
136
137
|
free page from 967x1338 to 922x1348 (covered 91.2 % to 95.0 %, 3.9 % less area) and
|
|
@@ -140,32 +141,32 @@ already has: every idle frame within 1 level of the `rect` build's, and no figur
|
|
|
140
141
|
0.7.0 wrote. The measurements are in
|
|
141
142
|
[AUTHORING §5, *Pack shape*](docs/AUTHORING.md#5-after-each-stage-what-to-read).
|
|
142
143
|
|
|
143
|
-
The packer is
|
|
144
|
+
The packer is rig-c's, and no other: a packed region is a lossless copy, and an
|
|
144
145
|
atlas written by anything else would have no oracle behind it.
|
|
145
146
|
|
|
146
147
|
## Painting → parts → rig → browser
|
|
147
148
|
|
|
148
149
|
| stage | tool | what it owns |
|
|
149
150
|
| --- | --- | --- |
|
|
150
|
-
| painting + See-through layers → parts and specs | **
|
|
151
|
-
| specs → Spine skeleton data | **[
|
|
151
|
+
| painting + See-through layers → parts and specs | **rig-parts** | the merge of two runs, the measurements, the rig spec and motion spec |
|
|
152
|
+
| specs → Spine skeleton data | **[rig-c](https://github.com/firejune/rigc)** | compile, the gate (rigc's own validator in an install; the round trip through `spine-core` where the runtime is beside it, as in this repository's CI), the named assertions, the packer, the renderer |
|
|
152
153
|
| skeleton data → a page | **[spine-html](https://github.com/firejune/spine-html)**, a sibling project | a DOM renderer; rigc's `spine-html` profile is its policy, and every build here is gated under that profile as well as under `spine` |
|
|
153
154
|
|
|
154
|
-
|
|
155
|
-
was written by
|
|
155
|
+
rig-parts never writes Spine data itself. Everything on disk under `check/build/`
|
|
156
|
+
was written by rig-c after its own gate passed.
|
|
156
157
|
|
|
157
158
|
## Getting See-through layers
|
|
158
159
|
|
|
159
|
-
See-through is required; how you run it is not.
|
|
160
|
+
See-through is required; how you run it is not. rig-parts does not vendor, embed or
|
|
160
161
|
redistribute See-through code or weights — run it by any of these and point
|
|
161
|
-
|
|
162
|
+
rig-parts at what it wrote:
|
|
162
163
|
|
|
163
|
-
| Route | Where | Output
|
|
164
|
+
| Route | Where | Output rig-parts reads |
|
|
164
165
|
| --- | --- | --- |
|
|
165
166
|
| Hugging Face Space | [24yearsold/see-through-demo](https://huggingface.co/spaces/24yearsold/see-through-demo) (ZeroGPU; upstream states 1-2 extractions a day for a registered user) | the `.psd` it produces |
|
|
166
167
|
| ModelScope demo | [ljsabc/See-Through](https://modelscope.cn/studios/ljsabc/See-Through), linked from the upstream README | the `.psd` it produces |
|
|
167
168
|
| Upstream CLI | `python inference/scripts/inference_psd.py --srcp <image> --save_to_psd` in a checkout of [shitagaki-lab/see-through](https://github.com/shitagaki-lab/see-through) | the `.psd` in `workspace/layerdiff_output/` |
|
|
168
|
-
| ComfyUI wrapper | [jtydhr88/ComfyUI-See-through](https://github.com/jtydhr88/ComfyUI-See-through) on your own ComfyUI box; the optional `comfy` adapter (`
|
|
169
|
+
| ComfyUI wrapper | [jtydhr88/ComfyUI-See-through](https://github.com/jtydhr88/ComfyUI-See-through) on your own ComfyUI box; the optional `comfy` adapter (`rig-parts comfy seethrough`) drives it | the `layers.json` + PNGs it writes |
|
|
169
170
|
|
|
170
171
|
**The head run is needed on every route that was read.** See-through's model
|
|
171
172
|
already separates the head in a second stage of its own: it crops the head the
|
|
@@ -189,7 +190,7 @@ head run on `st_input_head.png` is what gives the eyes more pixels
|
|
|
189
190
|
and the head run's 60×38: the head run is still needed.
|
|
190
191
|
|
|
191
192
|
**See-through is required; ComfyUI is not.** The wrapper is one route among
|
|
192
|
-
four, and `
|
|
193
|
+
four, and `rig-parts comfy` is only a convenience for that route: every
|
|
193
194
|
stage after See-through reads files, whichever route wrote them. On the two
|
|
194
195
|
public examples each run took 171–199 s through the wrapper (each run's
|
|
195
196
|
`meta.json`, in [spine-parts-examples](https://github.com/firejune/spine-parts-examples)).
|
|
@@ -197,7 +198,7 @@ public examples each run took 171–199 s through the wrapper (each run's
|
|
|
197
198
|
### The two images See-through is fed: `inputs`
|
|
198
199
|
|
|
199
200
|
```sh
|
|
200
|
-
|
|
201
|
+
rig-parts inputs --source painting.png --config config.json --out <dir>
|
|
201
202
|
```
|
|
202
203
|
|
|
203
204
|
cuts the two images See-through is fed: the painting centred on a white square
|
|
@@ -210,8 +211,8 @@ For a user who has a ComfyUI box, two
|
|
|
210
211
|
commands drive it; nothing else in the pipeline needs one:
|
|
211
212
|
|
|
212
213
|
```sh
|
|
213
|
-
|
|
214
|
-
|
|
214
|
+
rig-parts comfy paint --config config.json --out <dir> --host http://<box>:8188
|
|
215
|
+
rig-parts comfy seethrough --image st_input_full.png --out layers/full --host http://<box>:8188 --offload
|
|
215
216
|
```
|
|
216
217
|
|
|
217
218
|
`comfy paint` generates `painting_<seed>.png` from the config's inline
|
|
@@ -227,27 +228,27 @@ than queueing behind someone else's job.
|
|
|
227
228
|
## The loop, for an agent
|
|
228
229
|
|
|
229
230
|
```sh
|
|
230
|
-
|
|
231
|
-
# See-through on st_input_full.png (external, or `
|
|
232
|
-
|
|
233
|
-
|
|
231
|
+
rig-parts inputs --source painting.png --config config.json --out inputs # st_input_full.png
|
|
232
|
+
# See-through on st_input_full.png (external, or `rig-parts comfy seethrough`) -> layers/full
|
|
233
|
+
rig-parts layers layers/full # every layer: box, opaque px, depth, plausibility figures; WARN lines
|
|
234
|
+
rig-parts propose --head-box --full layers/full --canvas 1664x2432
|
|
234
235
|
# -> seethrough.head_box into config.json
|
|
235
|
-
|
|
236
|
-
# See-through on st_input_head.png (external, or `
|
|
237
|
-
|
|
238
|
-
|
|
236
|
+
rig-parts inputs --source painting.png --config config.json --out inputs # now st_input_head.png too
|
|
237
|
+
# See-through on st_input_head.png (external, or `rig-parts comfy seethrough`) -> layers/head
|
|
238
|
+
rig-parts sheet --source painting.png --layers layers/full --layers layers/head --out sheets/layers.png
|
|
239
|
+
rig-parts assemble --propose-plan --source painting.png --full layers/full --head layers/head --config config.json
|
|
239
240
|
# -> assemble.plan and extend_below_crop
|
|
240
|
-
|
|
241
|
+
rig-parts assemble --source painting.png --full layers/full --head layers/head --config config.json --out work
|
|
241
242
|
# -> work/rig: parts.json and parts/; the config holds no bones, meshes, regions or motion yet
|
|
242
243
|
# -> read the `uncovered hole N:` lines and look at work/render/recomposite_error_rig.png:
|
|
243
244
|
# red is painting that no part holds, and no later gate can see it
|
|
244
245
|
# -> a large red hole neither run holds? add an assemble.patches entry (cut from the painting) and assemble again
|
|
245
|
-
|
|
246
|
+
rig-parts propose --parts work/rig --source painting.png --out work
|
|
246
247
|
# -> proposal.json, basis.json (what each bone rests on) and render/landmarks.png; per-bone coverage lines;
|
|
247
248
|
# correct it, copy bones/meshes/regions/motion into config.json
|
|
248
|
-
|
|
249
|
+
rig-parts propose --parts work/rig --source painting.png --out work --from-config config.json
|
|
249
250
|
# -> LINT lines; exit 1 while any remain
|
|
250
|
-
|
|
251
|
+
rig-parts build --config config.json --source painting.png --full layers/full --head layers/head --out out --loop
|
|
251
252
|
# -> read out/check/check.json; every FAIL line names what has to change
|
|
252
253
|
```
|
|
253
254
|
|
|
@@ -264,7 +265,7 @@ against its overlay, and a config with bones is `build`'s input. `rig`, `check`
|
|
|
264
265
|
`loop` are the same stages one at a time. [docs/AUTHORING.md](docs/AUTHORING.md) is
|
|
265
266
|
the guide an agent authors from — every config field, what to look at after each
|
|
266
267
|
stage, what each refusal means and which field it points at — and
|
|
267
|
-
[`skills/
|
|
268
|
+
[`skills/rig-parts/SKILL.md`](skills/rig-parts/SKILL.md) is the same loop as an
|
|
268
269
|
agent skill.
|
|
269
270
|
|
|
270
271
|
## Commands
|
|
@@ -283,15 +284,20 @@ agent skill.
|
|
|
283
284
|
| `propose … --keypoints <file> [--person <id>]` | read a posed figure's joints from one explicit file (space, image size, people, each joint observed, occluded or missing, its source): a joint with a position places the neck, hip, chest or a sleeve chain as given, a note says how every joint was used or which rule stood in, and LINT reads the torso and sleeves along the joints instead of by screen y ([AUTHORING §3](docs/AUTHORING.md)) |
|
|
284
285
|
| `propose … --from-config <config>` | draw and LINT the config's current bones (by the joints too, given `--keypoints`) |
|
|
285
286
|
| `compare --left <file> --right <file> [--map <bonemap.json>]` | compare two skeletons — a config, a proposal or a `rig.json` — bone by bone: origin, parent, tip, length and direction per pair, the bones neither side pairs, the required ones missing, and each side's roles read off the spec; no frame is guessed, and nothing pairs by resemblance (`propose --compare` reads origins only) |
|
|
286
|
-
| `rig --config --parts --out [--idle-keys ctl\|direct]` | author `rig.json` + `motion.json`, written only after
|
|
287
|
-
| `check --rig --out [--parts] [--source] [--requirements]` | build packed, gated under `spine-html`, render the idle, measure seam, loop and the six judgement lines (mesh texture stretch among them, from the idle's `render --geometry`), and report the recomposite's holes from `parts.json`; on a rig spec with no `parts.json` or no `idle` (a merged rig, issue #77) the gate still runs and every line that needs the missing input says SKIP by name; `--source <painting.png>` adds `SETUP_POSE_VS_SOURCE`, the setup pose against the painting by assemble's recomposite figures; `--requirements <scene.json>` measures what a scene declares of the motion — a contact, a follow fraction, an aim, a joint range, a mesh's stretch, the seam between two parts over the motion — each against the author's own bar, from
|
|
287
|
+
| `rig --config --parts --out [--idle-keys ctl\|direct]` | author `rig.json` + `motion.json`, written only after rig-c's gate is green; each mesh is in the mode its config entry names — `grid` (the lattice, what `propose` writes), `contour` (the traced outline with declared interior points) or `auto` (the contour mesh at alpha 1 and above, reduced and locally refined by rig-c's `reduceMesh` under the author's declared bounds, written only when its motion against the unreduced source on the idle passes the author's `motion` bounds through rig-c's `compareMeshesInMotion`; [AUTHORING §3](docs/AUTHORING.md)); every chain link is turned along its chain and carries its `length`, so a physics constraint added later has a lever, with every offset under it in the turned frame so nothing moves; `--idle-keys` says whether the idle's keys on mesh-driving bones go through `<bone>_ctl` parents (default) or stay on the bones with `invariants.idleDrivesMeshes` declared; the config's `constraints` go to rigc as written, and a two-bone ik over keyed links needs `--idle-keys direct` (on `rig` or `build`) |
|
|
288
|
+
| `check --rig --out [--parts] [--source] [--requirements]` | build packed, gated under `spine-html`, render the idle, measure seam, loop and the six judgement lines (mesh texture stretch among them, from the idle's `render --geometry`), and report the recomposite's holes from `parts.json`; on a rig spec with no `parts.json` or no `idle` (a merged rig, issue #77) the gate still runs and every line that needs the missing input says SKIP by name; `--source <painting.png>` adds `SETUP_POSE_VS_SOURCE`, the setup pose against the painting by assemble's recomposite figures; `--requirements <scene.json>` measures what a scene declares of the motion — a contact, a follow fraction, an aim, a joint range, a mesh's stretch, the seam between two parts over the motion — each against the author's own bar, from rig-c's posed frames, one line each, PASS, FAIL or NOT MEASURABLE (AUTHORING §7, *Declared requirements*) |
|
|
288
289
|
| `loop --frames <dir> --out <file.gif \| file.png> [--palette]` | encode a rendered idle as a looping GIF, lossless APNG, or indexed APNG (`--palette`) |
|
|
289
290
|
| `build --config --source --full --head --out [--seam] [--project] [--loop] [--requirements] [--idle-keys ctl\|direct]` | assemble, rig and check in one process, stopping at the first refusal; `--requirements` is forwarded to check, `--idle-keys` to rig |
|
|
290
|
-
| `compose --scene <scene.json> --out [--requirements]` | bind several characters' green builds into one rig: every name prefixed `<id>:` under one shared root, each character's offset added at its first-level bones, an optional background plate (its provenance recorded, judged by nothing) drawn first, and the draw order between the characters' slots as the scene file declares it — nothing inferred, nothing scaled; gated through
|
|
291
|
+
| `compose --scene <scene.json> --out [--requirements]` | bind several characters' green builds into one rig: every name prefixed `<id>:` under one shared root, each character's offset added at its first-level bones, an optional background plate (its provenance recorded, judged by nothing) drawn first, and the draw order between the characters' slots as the scene file declares it — nothing inferred, nothing scaled; gated through rig-c as `rig` is, then checked ([AUTHORING §7](docs/AUTHORING.md), *Composing several characters*) |
|
|
291
292
|
|
|
292
|
-
`
|
|
293
|
+
`rig-parts --help` has every flag. Exit codes: 0 done, 1 input refused (every
|
|
293
294
|
reason is a FAIL line), 2 a usage error or a command this version does not implement.
|
|
294
295
|
|
|
296
|
+
What 1.0.0 holds stable — these commands and their flags, the config
|
|
297
|
+
fields, the files a build writes and their spec ids, the environment, and what this
|
|
298
|
+
package relies on in rig-c — and what is not, is [docs/STABILITY.md](docs/STABILITY.md).
|
|
299
|
+
Coming from 0.16.0: [docs/MIGRATION.md](docs/MIGRATION.md).
|
|
300
|
+
|
|
295
301
|
## What it does not do
|
|
296
302
|
|
|
297
303
|
These are limits of the approach, stated so nobody reads more into a green run:
|
|
@@ -361,10 +367,17 @@ before it, at v0.14.0).
|
|
|
361
367
|
|
|
362
368
|
## Requirements
|
|
363
369
|
|
|
364
|
-
[Bun](https://bun.sh) 1.2 or later. `npm install -g
|
|
365
|
-
`
|
|
366
|
-
on `PATH`.
|
|
367
|
-
spine-
|
|
370
|
+
[Bun](https://bun.sh) 1.2 or later. `npm install -g rig-parts` installs the
|
|
371
|
+
`rig-parts` command; it hands off to Bun and says so in one sentence if Bun is not
|
|
372
|
+
on `PATH`. **`rig-parts` is the package's name; versions up to 0.16.0 were published
|
|
373
|
+
as `spine-parts`, its former name**, and the install keeps a `spine-parts` command
|
|
374
|
+
beside `rig-parts` for the transition, the same launcher under both names. On npm
|
|
375
|
+
the alias `spine-parts` stays published beside `rig-parts` at every version,
|
|
376
|
+
carrying the same files with only the `name` in `package.json` changed, so a
|
|
377
|
+
project that depends on the former name keeps receiving every release; a new
|
|
378
|
+
install names `rig-parts` ([RELEASING.md](RELEASING.md), *The registry side*). rig-c
|
|
379
|
+
comes with it as a dependency. No Spine runtime does: since
|
|
380
|
+
rig-c 2.0 the installed `rigc` gates every build with its own validator over the
|
|
368
381
|
compiled model document, and `rigc --version` says `entry: cli_core.ts —
|
|
369
382
|
@esotericsoftware/spine-core absent`. With `@esotericsoftware/spine-core` installed
|
|
370
383
|
beside it, the same `rigc` runs the spine-core round trip instead, as this repository's
|
|
@@ -372,7 +385,7 @@ selftest and CI do; `check.json`'s `rigc_entry` records which one gated a build.
|
|
|
372
385
|
|
|
373
386
|
## Licence posture
|
|
374
387
|
|
|
375
|
-
|
|
388
|
+
rig-parts is MIT, and it depends on rig-c, whose output is Spine skeleton data:
|
|
376
389
|
using what it produces in a product requires a Spine Editor licence, as any Spine data
|
|
377
390
|
does. Neither package installs Esoteric Software's `spine-core` any more; this
|
|
378
391
|
repository uses it in development, for the round trip in its selftest and CI. [NOTICE.md](NOTICE.md) records that chain and every other
|
|
@@ -390,7 +403,8 @@ bun run smoke # pack, install into an empty directory, run from the i
|
|
|
390
403
|
```
|
|
391
404
|
|
|
392
405
|
[CLAUDE.md](CLAUDE.md) is the doctrine, [CONTRIBUTING.md](CONTRIBUTING.md) the
|
|
393
|
-
practice, [RELEASING.md](RELEASING.md) the cut.
|
|
406
|
+
practice, [RELEASING.md](RELEASING.md) the cut, [docs/STABILITY.md](docs/STABILITY.md)
|
|
407
|
+
the interface it holds.
|
|
394
408
|
|
|
395
409
|
## Licence
|
|
396
410
|
|
|
@@ -2,16 +2,20 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* rig-parts' `bin` entry has one job: hand off to Bun.
|
|
6
6
|
*
|
|
7
7
|
* npm's `bin` field has to be something any installed Node can run, but
|
|
8
|
-
*
|
|
9
|
-
* does
|
|
8
|
+
* rig-parts is a Bun program (it runs its TypeScript sources directly, and so
|
|
9
|
+
* does rig-c underneath it). Without this file, a machine with no Bun
|
|
10
10
|
* would fail as a bare `env: bun: No such file or directory`, with no hint
|
|
11
11
|
* why. So: if `bun` is on PATH, run the real CLI (cli.ts, next to this file)
|
|
12
12
|
* under it and disappear — argv, stdio, the exit code and signals all pass
|
|
13
13
|
* straight through. If it isn't, say so once and stop. No downloads, no
|
|
14
14
|
* network, no writes — just the hand-off or the message.
|
|
15
|
+
*
|
|
16
|
+
* package.json installs this one file under two command names: `rig-parts`,
|
|
17
|
+
* and the package's former name, kept as a second `bin` entry for the
|
|
18
|
+
* transition so a script written against it still runs.
|
|
15
19
|
*/
|
|
16
20
|
|
|
17
21
|
const path = require('node:path');
|
|
@@ -22,9 +26,9 @@ const result = spawnSync('bun', [cli, ...process.argv.slice(2)], { stdio: 'inher
|
|
|
22
26
|
|
|
23
27
|
if (result.error) {
|
|
24
28
|
if (result.error.code === 'ENOENT') {
|
|
25
|
-
process.stderr.write('
|
|
29
|
+
process.stderr.write('rig-parts runs on Bun, which was not found on PATH — install it from https://bun.sh\n');
|
|
26
30
|
} else {
|
|
27
|
-
process.stderr.write(`
|
|
31
|
+
process.stderr.write(`rig-parts: could not launch bun: ${result.error.message}\n`);
|
|
28
32
|
}
|
|
29
33
|
process.exit(1);
|
|
30
34
|
}
|