rig-c 0.0.0-stage → 2.21.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.
Files changed (213) hide show
  1. package/.claude-plugin/marketplace.json +19 -0
  2. package/.claude-plugin/plugin.json +13 -0
  3. package/LICENSE +30 -0
  4. package/NOTICE.md +145 -0
  5. package/README.md +817 -3
  6. package/bin/rigc.cjs +83 -0
  7. package/cli.ts +61 -0
  8. package/cli_core.ts +46 -0
  9. package/docs/AUTHORING.md +9923 -0
  10. package/docs/FACE.md +1948 -0
  11. package/docs/INGEST.md +1488 -0
  12. package/docs/MOTION.md +1241 -0
  13. package/docs/PROMPTING.md +109 -0
  14. package/docs/RIGGING.md +1441 -0
  15. package/docs/SPEC_COVERAGE.md +357 -0
  16. package/package.json +108 -4
  17. package/skills/rigc/SKILL.md +133 -0
  18. package/skills/rigc-face/SKILL.md +60 -0
  19. package/skills/rigc-ingest/SKILL.md +78 -0
  20. package/skills/rigc-motion/SKILL.md +51 -0
  21. package/skills/rigc-rigging/SKILL.md +49 -0
  22. package/src/areaband.ts +159 -0
  23. package/src/assertions/bodies/a01.ts +23 -0
  24. package/src/assertions/bodies/a02.ts +21 -0
  25. package/src/assertions/bodies/a03.ts +27 -0
  26. package/src/assertions/bodies/a04.ts +40 -0
  27. package/src/assertions/bodies/a05.ts +56 -0
  28. package/src/assertions/bodies/a06.ts +245 -0
  29. package/src/assertions/bodies/a07.ts +68 -0
  30. package/src/assertions/bodies/a08.ts +76 -0
  31. package/src/assertions/bodies/a09.ts +82 -0
  32. package/src/assertions/bodies/a10.ts +116 -0
  33. package/src/assertions/bodies/a11.ts +15 -0
  34. package/src/assertions/bodies/a12.ts +30 -0
  35. package/src/assertions/bodies/a13.ts +51 -0
  36. package/src/assertions/bodies/a14.ts +35 -0
  37. package/src/assertions/bodies/a15.ts +97 -0
  38. package/src/assertions/bodies/a16.ts +24 -0
  39. package/src/assertions/bodies/a17.ts +26 -0
  40. package/src/assertions/bodies/a18.ts +62 -0
  41. package/src/assertions/bodies/a19.ts +404 -0
  42. package/src/assertions/bodies/a20.ts +122 -0
  43. package/src/assertions/bodies/a21.ts +190 -0
  44. package/src/assertions/bodies/a22.ts +39 -0
  45. package/src/assertions/bodies/a23.ts +305 -0
  46. package/src/assertions/bodies/a24.ts +68 -0
  47. package/src/assertions/bodies/a25.ts +39 -0
  48. package/src/assertions/bodies/a26.ts +61 -0
  49. package/src/assertions/bodies/a27.ts +33 -0
  50. package/src/assertions/bodies/a28.ts +70 -0
  51. package/src/assertions/bodies/a29.ts +34 -0
  52. package/src/assertions/bodies/a30.ts +50 -0
  53. package/src/assertions/bodies/a31.ts +61 -0
  54. package/src/assertions/bodies/a32.ts +44 -0
  55. package/src/assertions/bodies/a33.ts +110 -0
  56. package/src/assertions/bodies/a34.ts +133 -0
  57. package/src/assertions/bodies/a35.ts +160 -0
  58. package/src/assertions/bodies/a36.ts +81 -0
  59. package/src/assertions/bodies/a37.ts +77 -0
  60. package/src/assertions/bodies/a38.ts +73 -0
  61. package/src/assertions/bodies/a39.ts +303 -0
  62. package/src/assertions/bodies/a40.ts +128 -0
  63. package/src/assertions/bodies/a42.ts +97 -0
  64. package/src/assertions/bodies/a43.ts +181 -0
  65. package/src/assertions/bodies/a44.ts +23 -0
  66. package/src/assertions/bodies/a45.ts +172 -0
  67. package/src/assertions/bodies/a46.ts +224 -0
  68. package/src/assertions/bodies/a47.ts +126 -0
  69. package/src/assertions/bodies/a48.ts +83 -0
  70. package/src/assertions/bodies/a49.ts +81 -0
  71. package/src/assertions/bodies/a50.ts +97 -0
  72. package/src/assertions/constraint_words.ts +169 -0
  73. package/src/assertions/emitted/index.ts +148 -0
  74. package/src/assertions/facts/animated_bones.ts +30 -0
  75. package/src/assertions/facts/animation_durations.ts +37 -0
  76. package/src/assertions/facts/atlas_pages.ts +19 -0
  77. package/src/assertions/facts/atlas_regions.ts +52 -0
  78. package/src/assertions/facts/bone_timelines.ts +37 -0
  79. package/src/assertions/facts/constraint_targets.ts +56 -0
  80. package/src/assertions/facts/constraints.ts +155 -0
  81. package/src/assertions/facts/deform_survey.ts +27 -0
  82. package/src/assertions/facts/event_keys.ts +55 -0
  83. package/src/assertions/facts/linked_meshes.ts +38 -0
  84. package/src/assertions/facts/mesh_attachments.ts +100 -0
  85. package/src/assertions/facts/region_joins.ts +34 -0
  86. package/src/assertions/facts/sequences.ts +85 -0
  87. package/src/assertions/facts/skeleton_roster.ts +45 -0
  88. package/src/assertions/facts/skin_entries.ts +37 -0
  89. package/src/assertions/facts/skin_members.ts +53 -0
  90. package/src/assertions/facts/slider_composition.ts +78 -0
  91. package/src/assertions/facts/slot_colour.ts +43 -0
  92. package/src/assertions/facts/stage.ts +27 -0
  93. package/src/assertions/facts/stage_box.ts +65 -0
  94. package/src/assertions/facts/stepped_poses.ts +74 -0
  95. package/src/assertions/facts/two_colour.ts +52 -0
  96. package/src/assertions/facts/vertex_polygons.ts +53 -0
  97. package/src/assertions/footprints.ts +367 -0
  98. package/src/assertions/harness.ts +109 -0
  99. package/src/assertions/inward_advance.ts +58 -0
  100. package/src/assertions/kinds.ts +105 -0
  101. package/src/assertions/mesh_kinds.ts +56 -0
  102. package/src/assertions/model/animated_bones.ts +38 -0
  103. package/src/assertions/model/animation_durations.ts +57 -0
  104. package/src/assertions/model/atlas_pages.ts +15 -0
  105. package/src/assertions/model/atlas_regions.ts +76 -0
  106. package/src/assertions/model/bone_timelines.ts +58 -0
  107. package/src/assertions/model/constraint_targets.ts +82 -0
  108. package/src/assertions/model/constraints.ts +233 -0
  109. package/src/assertions/model/declared.ts +125 -0
  110. package/src/assertions/model/deform_survey.ts +24 -0
  111. package/src/assertions/model/event_keys.ts +45 -0
  112. package/src/assertions/model/given.ts +45 -0
  113. package/src/assertions/model/index.ts +398 -0
  114. package/src/assertions/model/linked_meshes.ts +24 -0
  115. package/src/assertions/model/mesh_attachments.ts +119 -0
  116. package/src/assertions/model/parse.ts +146 -0
  117. package/src/assertions/model/region_joins.ts +67 -0
  118. package/src/assertions/model/runtime_timelines.ts +78 -0
  119. package/src/assertions/model/sequences.ts +157 -0
  120. package/src/assertions/model/skeleton_roster.ts +23 -0
  121. package/src/assertions/model/skin_entries.ts +69 -0
  122. package/src/assertions/model/skin_members.ts +64 -0
  123. package/src/assertions/model/slider_composition.ts +193 -0
  124. package/src/assertions/model/slot_colour.ts +81 -0
  125. package/src/assertions/model/stage.ts +28 -0
  126. package/src/assertions/model/stage_box.ts +51 -0
  127. package/src/assertions/model/stepped_poses.ts +105 -0
  128. package/src/assertions/model/two_colour.ts +61 -0
  129. package/src/assertions/model/vertex_polygons.ts +72 -0
  130. package/src/assertions/reasons.ts +129 -0
  131. package/src/assertions/region_lookups.ts +61 -0
  132. package/src/assertions/report.ts +189 -0
  133. package/src/assertions/values.ts +39 -0
  134. package/src/atlas.ts +2870 -0
  135. package/src/ballot.ts +866 -0
  136. package/src/bonedist.ts +643 -0
  137. package/src/chainfit.ts +2752 -0
  138. package/src/chains.ts +170 -0
  139. package/src/check.ts +4303 -0
  140. package/src/checkpics.ts +295 -0
  141. package/src/cli/core_commands.ts +1627 -0
  142. package/src/cli/repack.ts +414 -0
  143. package/src/cli/shared.ts +2776 -0
  144. package/src/cli/spine_commands.ts +820 -0
  145. package/src/compile.ts +9414 -0
  146. package/src/core/additive.ts +458 -0
  147. package/src/core/animation.ts +1050 -0
  148. package/src/core/clipping.ts +696 -0
  149. package/src/core/constraints.ts +1876 -0
  150. package/src/core/constraints_path.ts +964 -0
  151. package/src/core/constraints_physics.ts +881 -0
  152. package/src/core/constraints_slider.ts +635 -0
  153. package/src/core/deform.ts +613 -0
  154. package/src/core/draw_order.ts +125 -0
  155. package/src/core/events.ts +135 -0
  156. package/src/core/hooks.ts +249 -0
  157. package/src/core/index.ts +1400 -0
  158. package/src/core/raw.ts +739 -0
  159. package/src/core/skins.ts +129 -0
  160. package/src/core/uvs.ts +469 -0
  161. package/src/core/vertices.ts +490 -0
  162. package/src/core/walk.ts +197 -0
  163. package/src/core/world.ts +289 -0
  164. package/src/correspondence.ts +15 -0
  165. package/src/deformbuild.ts +60 -0
  166. package/src/deformgen.ts +630 -0
  167. package/src/deformmeasure.ts +732 -0
  168. package/src/deformreport.ts +373 -0
  169. package/src/deformstructure.ts +386 -0
  170. package/src/deformsurvey.ts +2162 -0
  171. package/src/depth.ts +784 -0
  172. package/src/diff.ts +2252 -0
  173. package/src/emit.ts +134 -0
  174. package/src/emit_spine.ts +854 -0
  175. package/src/errors.ts +53 -0
  176. package/src/framing.ts +819 -0
  177. package/src/generation.ts +139 -0
  178. package/src/ingest.ts +2293 -0
  179. package/src/json-position.ts +253 -0
  180. package/src/keyorder.ts +587 -0
  181. package/src/keys.ts +486 -0
  182. package/src/ladder.ts +121 -0
  183. package/src/mesh.ts +2382 -0
  184. package/src/meshcompare.ts +1191 -0
  185. package/src/meshquality.ts +2051 -0
  186. package/src/meshrasters.ts +944 -0
  187. package/src/meshreduce.ts +1444 -0
  188. package/src/model.ts +1245 -0
  189. package/src/motion.ts +809 -0
  190. package/src/nonfinite.ts +54 -0
  191. package/src/package_meta.ts +48 -0
  192. package/src/png.ts +297 -0
  193. package/src/pose.ts +2324 -0
  194. package/src/preview.ts +434 -0
  195. package/src/region_joins.ts +54 -0
  196. package/src/render.ts +1013 -0
  197. package/src/render_core.ts +871 -0
  198. package/src/render_shared.ts +2958 -0
  199. package/src/repack.ts +495 -0
  200. package/src/rig.ts +2941 -0
  201. package/src/slots.ts +892 -0
  202. package/src/spine_side.ts +138 -0
  203. package/src/timelines.ts +837 -0
  204. package/src/trackgen.ts +364 -0
  205. package/src/transform.ts +310 -0
  206. package/src/types.ts +1797 -0
  207. package/src/validate.ts +3875 -0
  208. package/tools/contact.ts +126 -0
  209. package/tools/editor_roundtrip.ts +1641 -0
  210. package/tools/font5x7.ts +101 -0
  211. package/tools/measure_contact_depth.ts +105 -0
  212. package/tools/plate.ts +508 -0
  213. package/tools/png_probe.mjs +72 -0
package/src/emit.ts ADDED
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Writing the compiled atlas to disk with its pages copied alongside it — the
3
+ * step behind `build --copy-images` (issue #217).
4
+ *
5
+ * `compile()` never touches the filesystem for output; it only reads inputs and
6
+ * assembles text (see its own header). A page's name in that text is a path *as
7
+ * seen from the atlas file* — for the default emit `relative(outDir, absPath)`,
8
+ * for `--atlas-in` the imported pack's own page re-anchored the same way — so it
9
+ * points at wherever the source art already lives, which is very often outside
10
+ * `outDir` (`../parts/torso.png`). That is the right default for a build that
11
+ * sits beside the project that owns the art, and it is exactly what makes
12
+ * `--out` non-self-contained the moment the directory is zipped, committed or
13
+ * handed to someone who does not have that project.
14
+ *
15
+ * `copyAtlasPages` is the opt-in other half: copy every page the atlas names
16
+ * into the output directory and hand back the same atlas text with its page
17
+ * names rewritten to match. Nothing here runs unless `cli.ts` calls it, so the
18
+ * default emit (`buildAtlasText` in [`src/compile.ts`](compile.ts)) is untouched.
19
+ *
20
+ * ## 🚨 Why it reads the atlas rather than the image list (issue #693)
21
+ *
22
+ * It used to take `CompiledImage[]` and rebuild the text with
23
+ * `buildAtlasText` — one page per part, each region covering its page exactly.
24
+ * That is a true statement about the DEFAULT emit and about nothing else, and
25
+ * `--atlas-in` is the else: there the atlas is the imported pack, whose pages
26
+ * carry many regions at measured rectangles and whose page count has no relation
27
+ * to the number of parts. Rebuilding it from the image list wrote a file the
28
+ * pack never contained, in two shapes, both of them green at the gate because
29
+ * the gate had read the compile's text and the rebuild happened after it:
30
+ *
31
+ * * a rig that declares no `image` at all — which is what `ingest --art none`
32
+ * writes, and it is the documented route for rebuilding somebody's export —
33
+ * has an EMPTY image list, so the rebuilt atlas was `writeAtlasText([])`:
34
+ * **zero bytes**. `validate` on the directory then reported
35
+ * `A00_ROUNDTRIP_PARSE` and one `A08` per attachment, on all 10 corpus
36
+ * rebuilds;
37
+ * * a rig that does declare parts got one fabricated page per part, all of
38
+ * them named after the pack's single page and each claiming the drawing's
39
+ * own size: 24 pages called `skeleton.png` declaring 800x880, 440x448, …
40
+ * against one 1024x2048 PNG, and 24 `A06` failures on the written directory.
41
+ *
42
+ * The pages an atlas names are the pages an atlas has. Reading them out of the
43
+ * text is the one rule that is true of both emits — and on the default emit it
44
+ * reproduces the old text byte for byte, because there the page list and the
45
+ * image list are the same list (`PKR44`).
46
+ */
47
+ import { copyFileSync, mkdirSync } from 'node:fs';
48
+ import { basename, extname, join, resolve } from 'node:path';
49
+ import { parseAtlasText, rewritePageNames } from './atlas.ts';
50
+
51
+ /** One page's source and where `--copy-images` put it. */
52
+ export interface CopiedPage {
53
+ /** The page name as the atlas spelled it: a path relative to the atlas file. */
54
+ from: string;
55
+ /** Filename inside the output directory — also the atlas's new page name. */
56
+ to: string;
57
+ /** How many regions ride on this page, so a shared page says so. */
58
+ regions: number;
59
+ }
60
+
61
+ export interface CopyImagesResult {
62
+ /** The atlas text, with every page name rewritten to its `to` filename. */
63
+ atlasText: string;
64
+ pages: CopiedPage[];
65
+ }
66
+
67
+ /**
68
+ * Copy every page `atlasText` names into `outDir` and return the same text with
69
+ * the page names rewritten to the copies.
70
+ *
71
+ * `atlasText` is the text that is about to be written INTO `outDir`, so its page
72
+ * names resolve against `outDir` — the same anchor `A06` and `A17` read them
73
+ * with, which is what makes "the pages this atlas names" one thing rather than
74
+ * two.
75
+ *
76
+ * ## Naming and collisions
77
+ *
78
+ * A page's filename in `outDir` is its source basename, unchanged. Two pages
79
+ * that live in different directories can still share one, and a case-insensitive
80
+ * filesystem (the macOS default) can collide two the atlas saw as distinct. On a
81
+ * genuine collision the second and later claimants get `-2`, `-3`, … inserted
82
+ * before the extension, assigned in the order the atlas lists its pages — which
83
+ * is also the order the rewritten text carries them in, so the mapping is
84
+ * identical on every run over the same text. The rewritten atlas is the record
85
+ * of it: reading a page name back out says exactly which file it is, with no
86
+ * side table to fall out of sync.
87
+ *
88
+ * ⚠️ A page that ALREADY sits in `outDir` under the name it would be copied to
89
+ * is left alone. There is nothing to move, and `copyFileSync` onto the path it
90
+ * is reading is not a defined way to say so.
91
+ */
92
+ export function copyAtlasPages(atlasText: string, outDir: string): CopyImagesResult {
93
+ mkdirSync(outDir, { recursive: true });
94
+ const planned = plannedPageCopies(atlasText, outDir);
95
+ for (const page of planned.pages) {
96
+ const source = resolve(outDir, page.from);
97
+ const destination = join(outDir, page.to);
98
+ if (source !== resolve(destination)) copyFileSync(source, destination);
99
+ }
100
+ return planned;
101
+ }
102
+
103
+ /**
104
+ * What `copyAtlasPages` will do, without doing it: the rewritten atlas text
105
+ * and each page's source and copy name, from the text and `outDir` alone — no
106
+ * file is read or written (issue #1016). `build --copy-images` spells the
107
+ * model document from this text BEFORE the gate, because the document states
108
+ * where each region sits on its page (`pages`) and the copy renames every
109
+ * page; `copyAtlasPages` returns exactly this, after copying.
110
+ */
111
+ export function plannedPageCopies(atlasText: string, outDir: string): CopyImagesResult {
112
+ const parsed = parseAtlasText(atlasText);
113
+ const claimedBy = new Map<string, string>(); // destination filename -> absolute source holding it
114
+ const pages: CopiedPage[] = [];
115
+
116
+ for (const page of parsed.pages) {
117
+ const source = resolve(outDir, page.name);
118
+ const original = basename(page.name);
119
+ let name = original;
120
+ if (claimedBy.has(name) && claimedBy.get(name) !== source) {
121
+ const ext = extname(original);
122
+ const stem = original.slice(0, original.length - ext.length);
123
+ let n = 2;
124
+ do {
125
+ name = `${stem}-${n}${ext}`;
126
+ n++;
127
+ } while (claimedBy.has(name) && claimedBy.get(name) !== source);
128
+ }
129
+ claimedBy.set(name, source);
130
+ pages.push({ from: page.name, to: name, regions: page.regions.length });
131
+ }
132
+
133
+ return { atlasText: rewritePageNames(parsed, (_name, index) => pages[index].to), pages };
134
+ }