pixelkiln 0.68.0 → 0.69.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/docs/AGENTS.md CHANGED
@@ -67,7 +67,7 @@ not a replacement:
67
67
  | PixelLab MCP | Agent-facing access to PixelLab generation capabilities. |
68
68
  | PixelKiln skill | Agent guidance for safe project-level operations. |
69
69
  | PixelKiln library/CLI | Budgets, state, provenance, review, recovery, audit, and packaging. |
70
- | PixelLab adapter | The current production and live-tested generation backend: stills, tiles, and the character family (four engines, states, loops, mirrors, adoption). |
70
+ | PixelLab adapter | The current production and live-tested generation backend: stills, tiles, UI panels and elements, `objectPro` objects, controlled revisions, and the character family (four engines, states, loops, mirrors, portraits, outfits, adoption). |
71
71
  | Retro Diffusion adapter | Experimental backend; authenticated paid single-still lifecycle plus mocked advanced-workflow tests. |
72
72
  | ComfyUI adapter | Experimental self-hosted still, controlled-revision, and atomic frame-set backend; PixelKiln automates lineage and mechanical quality checks while a person retains visual approval. |
73
73
  | Scenario adapter | Experimental hosted still-image backend; BFL Flux 2 Dev quote, paid single/two-output generation, human review, and durable recovery live-tested. |
@@ -264,7 +264,10 @@ Characters that already exist on the account come under the manifest with
264
264
  PixelLab's own tools shows both) and run `pixelkiln adopt`: it records the
265
265
  character, writes every direction and frame that is not on disk, and costs
266
266
  nothing. A base can also be matched by the bytes of its south-facing file.
267
- See [`adopt`](CLI.md#adopt).
267
+ See [`adopt`](CLI.md#adopt). Characters no lockfile claims go through
268
+ `pixelkiln salvage`, one card per base with its states and loops, and a
269
+ character tagged for discard is deleted by `pixelkiln purge`; see
270
+ [Recovery](RECOVERY.md#characters).
268
271
 
269
272
  ## Mirrors
270
273
 
package/docs/CLI.md CHANGED
@@ -4,9 +4,11 @@
4
4
  pixelkiln <command> [options]
5
5
  ```
6
6
 
7
- Unknown commands, positional arguments, and flags are errors. Repeated
8
- `--style`, `--only`, `--claims`, and `--output-role` values accumulate; comma-
9
- separated values work too. This strict parsing prevents a misspelled filter
7
+ Unknown commands, positional arguments, and flags are errors. The only
8
+ positional words accepted are a command's own subcommands (`refine approve`,
9
+ `workspace add <manifest>`, and the like), `estimate-skeleton`'s one image
10
+ path, and `skeleton-preview`'s keypoints file or asset id. Repeated `--style`, `--only`, `--claims`, and `--output-role` values
11
+ accumulate; comma-separated values work too. This strict parsing prevents a misspelled filter
10
12
  from widening a paid run.
11
13
 
12
14
  The manifest's top-level `provider` is the default; each style may select a
@@ -27,6 +29,8 @@ Which command:
27
29
  | draw a character in 8 directions, then its poses and loops | a `character` style with `state` and `animation` assets; one `pixelkiln gen` runs the waves |
28
30
  | rotate your own sprite into 8 directions | `"reference": "refs/bot-south.png"` on the base; `mode: pro-flash` does it for 1 generation at 64px |
29
31
  | get the east-facing loop without paying for it | `"bot.walk.east": { "mirror": "bot.walk.west" }` |
32
+ | declare one loop for several directions, mirroring the rest | `"animation": { "of": "bot", "directions": ["south", "west", "north"] }`; `--only bot.walk` selects the whole family |
33
+ | make a bust portrait, or re-clothe a loop from an outfit image | `"portrait": { "of": "mira", "size": 64 }`, `"outfit": { "of": "mira.walk", "reference": "refs/armor.png" }` |
30
34
  | generate one asset, or one style | `pixelkiln gen --only anvil --budget 2`, `pixelkiln gen --style neon --budget 20` |
31
35
  | finish a run that was interrupted | `pixelkiln plan`, then the `next:` command it prints (`poll`, `pick`, or `fetch`) |
32
36
  | choose among candidates the provider returned | `pixelkiln pick` |
@@ -48,6 +52,10 @@ Which command:
48
52
  | drop lock entries the manifest no longer declares | `pixelkiln prune` |
49
53
  | check the project before committing or in CI | `pixelkiln doctor`, `pixelkiln plan --check` |
50
54
  | see the account balance | `pixelkiln balance` |
55
+ | shrink upscaled outside art to its native grid before using it as a reference | `pixelkiln unzoom --from refs/knight-512.png --out refs/knight.png` |
56
+ | generate a pixel font (`.ttf` plus glyph atlas) | `pixelkiln font --description "warm orange arcade font" --out fonts/arcade` |
57
+ | start an `animate-skeleton` keypoints file from an image | `pixelkiln estimate-skeleton poses/hero.png --out poses/hero-swing.json` |
58
+ | see a keypoints file's poses over the source before paying | `pixelkiln skeleton-preview hero-swing` |
51
59
  | work across several projects | `pixelkiln workspace add ../other/pixelkiln.manifest.json`, then `--workspace` on `gallery` and `salvage` |
52
60
 
53
61
  Every command takes `--manifest <file>` when the manifest is not in the
@@ -344,23 +352,6 @@ Show one provider's remaining balance and cost unit. A mixed manifest requires
344
352
  `--provider`; a single-provider manifest infers it. Reports a capability error
345
353
  when an installed provider, such as local ComfyUI, has no balance endpoint.
346
354
 
347
- ### `estimate-skeleton`
348
-
349
- ```bash
350
- pixelkiln estimate-skeleton <image> [--out keypoints.json]
351
- ```
352
-
353
- PixelLab only. Derives an 18-joint skeleton from an image via
354
- `/estimate-skeleton` and prints the keypoints JSON, or writes it with `--out`.
355
- Same category as `balance`: a direct, un-budgeted account call outside the
356
- manifest/plan/lock pipeline — no manifest is read beyond locating
357
- `.env.local`, and nothing is written to a lockfile. This is how to bootstrap
358
- an `animate-skeleton` revision's `keypointsFile` (see
359
- [Controlled asset revisions](./REVISIONS.md#skeleton-driven-animation)):
360
- estimate once, sanity-check the result, hand-tweak a few joints for
361
- in-between frames, rather than hand-authoring 18 joints of
362
- `{label, x, y, z_index}` from scratch.
363
-
364
355
  ### `status`
365
356
 
366
357
  Summarize lock entries by state and successful submission spend by cost unit.
@@ -882,10 +873,11 @@ See [derived artifacts](./ARTIFACTS.md) and [tiles](./TILES.md).
882
873
 
883
874
  ## PixelLab utilities
884
875
 
885
- Two commands call PixelLab on loose files rather than manifest assets. Neither
886
- reads the manifest or touches the lockfile; both load `PIXELLAB_API_KEY` from
887
- the environment or a `.env.local`/`.env` beside `--manifest` or in the working
888
- directory, the same as every other command.
876
+ Three commands call PixelLab on loose files rather than manifest assets. None
877
+ reads the manifest or touches the lockfile; all three load `PIXELLAB_API_KEY`
878
+ from the environment or a `.env.local`/`.env` beside `--manifest` or in the
879
+ working directory, the same as every other command. A fourth,
880
+ `skeleton-preview`, is their local companion and calls nothing.
889
881
 
890
882
  ### `unzoom`
891
883
 
@@ -936,6 +928,48 @@ A font is deliberately not a manifest generator: it has no style suffix to
936
928
  share, no prompt-per-asset, no candidates to pick, and its main output is not
937
929
  an image, so there is nothing for the lockfile's provenance model to hold.
938
930
 
931
+ ### `estimate-skeleton`
932
+
933
+ ```bash
934
+ pixelkiln estimate-skeleton <image> [--out keypoints.json] [--frames 4] [--force]
935
+ ```
936
+
937
+ PixelLab only. Derives an 18-joint skeleton from an image via
938
+ `/estimate-skeleton`. The image must be square at 16, 32, 64, 128, or 256
939
+ pixels, the sizes the endpoint takes; anything else is refused before the
940
+ call. Same category as `balance`: a direct, un-budgeted account call outside
941
+ the manifest/plan/lock pipeline — no manifest is read beyond locating
942
+ `.env.local`, and nothing is written to a lockfile.
943
+
944
+ The output is a whole keypoints file, the shape an `animate-skeleton`
945
+ revision's `keypointsFile` must be (see
946
+ [Controlled asset revisions](./REVISIONS.md#skeleton-driven-animation)): the
947
+ estimated pose as `firstFrameKeypoints`, and `--frames` copies of it (3–15,
948
+ default 4) as the frames to move into the motion. It prints, or writes to
949
+ `--out`; `--out` refuses to replace an existing file, which is usually hand
950
+ edits, unless `--force` is given.
951
+
952
+ ### `skeleton-preview`
953
+
954
+ ```bash
955
+ pixelkiln skeleton-preview <keypoints.json> [--from image.png] [--out sheet.png]
956
+ pixelkiln skeleton-preview <asset> [--style <id>] [--out sheet.png]
957
+ ```
958
+
959
+ Draws every pose of a keypoints file over its source image as one PNG, the
960
+ starting pose first at full strength and each frame after it over a dimmed
961
+ copy. Right-side bones are orange, left-side blue, the head and spine white.
962
+ Local and free: nothing is sent anywhere. Given an `animate-skeleton` asset
963
+ id, it reads the revision's `keypointsFile` and source image from the
964
+ manifest; given a file, `--from` names the image (without one, poses are drawn
965
+ on a plain ground). The sheet is written beside the keypoints file as
966
+ `<name>.preview.png` unless `--out` says otherwise. A file that does not parse
967
+ fails with the same message `plan` would give.
968
+
969
+ Use it after `estimate-skeleton` and after every hand edit: PixelKiln cannot
970
+ check that the starting pose matches what the image shows, and a mismatch
971
+ degrades every generated frame without an error.
972
+
939
973
  ## Utility commands
940
974
 
941
975
  ### `help`
@@ -951,9 +985,10 @@ Print the package version. `-v` is an alias.
951
985
  | Option | Applies to | Meaning |
952
986
  |---|---|---|
953
987
  | `--manifest <path>` | manifest commands | Manifest path; defaults to `pixelkiln.manifest.json`. |
988
+ | `--frames <n>` | `estimate-skeleton` | Frames to scaffold after the estimated pose, 3–15; default 4. |
954
989
  | `--lock <path>` | manifest commands | Lock path; defaults beside the manifest. |
955
990
  | `--style a,b` | most workflows | Restrict styles; repeatable. |
956
- | `--only id1,id2` | most workflows | Restrict asset ids; repeatable. |
991
+ | `--only id1,id2` | most workflows | Restrict asset ids; repeatable. An `animation.directions` shorthand id selects every loop and mirror it expands into. |
957
992
  | `--budget <n\|provider=n>` | submit/gen/gallery | Refuse work above this cost. Repeat `provider=n` for every provider in a mixed run; do not mix keyed and unkeyed forms. For `gallery`, the session ceiling that enables generation from the page. |
958
993
  | `--force` | gen/fetch/derived commands/recipe install/quality snapshot | Regenerate current work, replace a changed or untracked fetch destination, rebuild current quality-profile output, take ownership of modified/unowned derived output, replace changed recipe files, or replace a changed quality baseline. A refinement rebuild resets approval. |
959
994
  | `--dry-run` | supported mutating commands | Inspect without spending or mutating provider state. |
@@ -12,9 +12,13 @@ account; [ENDPOINTS.md](./ENDPOINTS.md) contains the detailed experiments.
12
12
  | Exact fixed palette | `pixflux` | 1 generation | 1 inline image |
13
13
  | Candidate variety, richer rendering, future rotation/animation | `1dir` | 20–40 generations | 4–64 by size |
14
14
  | Ground tiles or connectable structural sets | `tiles` | 20–40 generations | variations or complete set |
15
+ | Two-terrain Wang tileset for elevation (grass to water, floor to cliff) | `terrain` | 20–40 generations (unmeasured) | 16 or 25 tiles |
15
16
  | A single elevation tile — a raised mesa, a cliff block | `isometricTile` | 1 generation | 1 |
17
+ | Larger or non-square scene or background, up to 792 wide and 688 tall | `imagePro` | 40 generations flat | 1–64 by size |
16
18
  | Controlled pose/expression sequence in ComfyUI | `frames` | 0 `free` provider units | one atomic ordered set |
17
- | A character facing 4 or 8 directions, its poses, and its animations | `character` | 1 per base (standard), 20–40 per pose, 1 per template loop | one set of directions, or one ordered loop |
19
+ | Animated GIF or spritesheet from Retro Diffusion | `animation` | $0.07–$0.25 per animation (published price) | 1 GIF or PNG sheet |
20
+ | A character facing 4 or 8 directions, its poses, and its animations | `character` | 1 per base (standard), 20–40 per pose or portrait, 1 per template loop, 20 per outfit (measured once) | one set of directions, one ordered loop, or one portrait |
21
+ | A prop, creature, or vehicle with rotations, states, or loops but no character rig | `objectPro` | about 6 per base at 64px (unmeasured) | one set of directions, or one ordered loop |
18
22
  | UI chrome — panels, buttons, health bars, toolbars | `uiAsset` | 20 generations (measured once, at 256x192) | 1 composited image |
19
23
  | One UI element from a description, 16px and up, optionally guided by a concept image | `uiElement` | 20–40 generations (unmeasured) | 1 image |
20
24
  | A styled still on the Pro Flash model, or the south sprite a Pro Flash character will rotate | `imageProFlash` | 5–9 generations (PixelLab's provisional quote) | 1 image |
@@ -22,6 +26,11 @@ account; [ENDPOINTS.md](./ENDPOINTS.md) contains the detailed experiments.
22
26
  Start with `map` unless a required capability points elsewhere. Forty `map`
23
27
  re-rolls cost the same as one 64×64 `1dir` call.
24
28
 
29
+ `terrain` and `imagePro` have no section below: their fields and limits are in
30
+ the [PixelLab skill reference](../skills/pixelkiln/references/pixellab.md), and
31
+ a `terrain` set's export shape is in [Tiles](./TILES.md). Retro Diffusion
32
+ `animation` styles are in [Set up Retro Diffusion](./RETRO_DIFFUSION.md).
33
+
25
34
  ## `map`
26
35
 
27
36
  `map` calls PixelLab's map-object endpoint. It is purpose-built for isolated
package/docs/MANIFEST.md CHANGED
@@ -56,7 +56,7 @@ not merely a label edit.
56
56
 
57
57
  | Field | Type/default | Meaning |
58
58
  |---|---|---|
59
- | `prompt` | string, required unless `mirror` | The subject wording wrapped by the selected style's prompt prefix and suffix. |
59
+ | `prompt` | string, required unless `mirror`, `portrait`, or `outfit` | The subject wording wrapped by the selected style's prompt prefix and suffix. |
60
60
  | `width` / `height` | integer 16–8192 | Per-asset dimensions for generators that accept rectangular output. Provider limits may be lower. |
61
61
  | `size` | integer 16–8192 | Per-asset square size where the generator uses one dimension. |
62
62
  | `file` | string | Output path below the style's `outDir`; defaults to `<category>/<assetId>.png`. |
@@ -64,9 +64,11 @@ not merely a label edit.
64
64
  | `source` | string | Manifest-relative committed art used instead of generation. For a set of PNG outputs (a `frames` animation, a `tiles` set) a path that is not a file is the stem of a hand edit laid beside the generated members (`<stem>-<role>.png` each); the set still generates. Mutually exclusive with `revision`. |
65
65
  | `sourceByStyle` | object | Per-style `source`, keyed by style id; wins over `source` for that style. Written by `pixelkiln edit` for a hand edit of an asset that is in several styles. |
66
66
  | `remoteId` | string | The provider's own id for art that already exists on the account, so `adopt` maps it without matching bytes: an object id, a character id, or `<character id>#<animation group id>`. Not part of the spec's identity. |
67
- | `revision` | object | Controlled image-to-image or inpaint dependency. See [controlled revisions](REVISIONS.md). |
67
+ | `revision` | object | Controlled dependency on another asset: `image-to-image`, `inpaint`, or `outpaint`; on PixelLab also `reduce-colors`, `correct-pixelart`, the animate modes (`animate`, `animate-pixminimax`, `animate-skeleton`), `interpolate`, and `edit-animation`. `engine: "pro-flash"` selects PixelLab's Pro Flash tier for `image-to-image`/`inpaint`. See [controlled revisions](REVISIONS.md). |
68
68
  | `state` | object | `character` styles: a pose or outfit of another character asset. See [Characters](./CHARACTERS.md). |
69
69
  | `animation` | object | `character` styles: a loop of another character asset in one direction. `directions` (a list, instead of `direction`) declares the loop for several directions at once and fills the unnamed flips with mirrors; see [One loop, several directions](./CHARACTERS.md#one-loop-several-directions). |
70
+ | `portrait` | object | `character` styles: a bust of a base or state's south sprite, `{ "of": "<asset>", "size": 64 }`; `size` is 16, 32, 48, 64 (default), 128, or 160. See [Portraits](./CHARACTERS.md#portraits). |
71
+ | `outfit` | object | `character` styles: an existing loop's frames re-clothed from an outfit image, `{ "of": "<loop asset>", "reference": "<image>" }`, with optional `additionalInstructions`. See [Outfit transfer](./CHARACTERS.md#outfit-transfer). |
70
72
  | `mirror` | string | Another asset of the same style flipped left to right, made locally at no cost. See [Mirrors](./CHARACTERS.md#mirrors). |
71
73
  | `scene` | object | `map` styles, PixelLab only: draw this object into a scene image, in its style. `{ "image": "scene.png", "placement": { "oval": 0.3 } }`; `placement` is `oval` or `rectangle` (a fraction, 0.05–0.95) or `mask` (a PNG the size of the scene). See [Drawing into a scene](./GENERATORS.md#drawing-into-a-scene). |
72
74
  | `batch` | object | `1dir` styles: rides along on another `1dir` asset's `item_descriptions` submission instead of generating on its own — `{ "of": "<leader asset id>", "index": <1-based slot> }`. See [`1dir`](./GENERATORS.md#1dir). |
package/docs/PIXELLAB.md CHANGED
@@ -71,6 +71,14 @@ unapproved files. See [Manifest quality profiles](./MANIFEST.md#quality-profiles
71
71
  | `pixflux` | You need a closed palette or a full-bleed background | 1 generation |
72
72
  | `1dir` | You need references or several candidates for human review | 20 to 40 generations |
73
73
  | `tiles` | You need ground variations or a connected structural set | 20 to 40 generations |
74
+ | `terrain` | You need a two-terrain Wang tileset (grass to water, floor to cliff) | 20 to 40 generations (unmeasured) |
75
+ | `isometricTile` | You need one standalone isometric tile, 16 to 64px | 1 generation (measured once) |
76
+ | `imagePro` | You need a larger or non-square scene, up to 792 wide and 688 tall | 40 generations |
77
+ | `imageProFlash` | You need a still on the Pro Flash model, optionally styled from one image, 16 to 256px | 5 to 9 generations (provisional quote) |
78
+ | `character` | You need a character in 4 or 8 directions, with states, loops, portraits, or outfits | See [Characters](./CHARACTERS.md) |
79
+ | `objectPro` | You need a prop or creature with rotations, states, or loops but no character rig | about 6 at 64px (unmeasured) |
80
+ | `uiAsset` | You need a UI panel composited from pieces and named elements, 192px and up | 20 generations (measured once) |
81
+ | `uiElement` | You need one UI element from a description, 16px and up | 20 to 40 generations (unmeasured) |
74
82
 
75
83
  `map` accepts these values:
76
84
 
@@ -123,9 +131,9 @@ recorded, and records the new URLs. A refreshed base makes its states and
123
131
  animations stale, because their identity hashes the base's south file;
124
132
  `pixelkiln gen` regenerates them.
125
133
 
126
- ## Three ways to drive PixelLab, and why this one
134
+ ## Four ways to drive PixelLab, and why this one
127
135
 
128
- PixelLab is reachable three ways, and it is easy to conflate them when
136
+ PixelLab is reachable four ways, and it is easy to conflate them when
129
137
  comparing notes with someone using a different one:
130
138
 
131
139
  - **PixelLab's Game Builder**, a hosted web IDE with its own chat agent and a
@@ -167,7 +175,10 @@ reference image frame-by-frame from a supplied keypoint skeleton, not a text
167
175
  description) are the `revision` asset shape, not the `character` generator;
168
176
  see [Controlled asset revisions](./REVISIONS.md). The same revision shape
169
177
  animates, interpolates, recolors, and cleans up any asset, a whole character
170
- or loop at once where the endpoint takes a set. Object Creator is the
178
+ or loop at once where the endpoint takes a set; `pixelkiln estimate-skeleton`
179
+ starts a skeleton file from an image. Pro Flash stills are the
180
+ `imageProFlash` generator, and Pro Flash edit and inpaint are a revision's
181
+ `"engine": "pro-flash"`. Object Creator is the
171
182
  `objectPro` generator, UI panels and elements are `uiAsset` and `uiElement`,
172
183
  and fonts and unzooming reference art are the standalone `pixelkiln font` and
173
184
  `pixelkiln unzoom` commands. Map Workshop
package/docs/README.md CHANGED
@@ -22,10 +22,10 @@ provider you are using. These Markdown files also render at
22
22
 
23
23
  | Guide | Use it for |
24
24
  |---|---|
25
- | [Characters](./CHARACTERS.md) | A base in 4 or 8 directions from a prompt or your own sprite, states, loops, mirrors, the four PixelLab engines, and what each costs. |
25
+ | [Characters](./CHARACTERS.md) | A base in 4 or 8 directions from a prompt or your own sprite, states, loops, mirrors, portraits, outfit transfer, the four PixelLab engines, and what each costs. |
26
26
  | [Generators](./GENERATORS.md) | Choose between still, tile, character, hosted animation, and ComfyUI frame-set workflows. |
27
27
  | [Environment provider benchmark](./PROVIDER_BENCHMARK.md) | Compare PixelLab, Retro Diffusion, and ComfyUI on buildings, backgrounds, cleanup, and native-grid recovery. |
28
- | [Controlled asset revisions](./REVISIONS.md) | Use image-to-image/inpaint parents, masks, approval gates, side-by-side review, and ComfyUI bindings. |
28
+ | [Controlled asset revisions](./REVISIONS.md) | Image-to-image and inpaint edits, PixelLab palette cleanup, animation, skeleton posing, and interpolation from a parent asset; masks, approval gates, side-by-side review, and ComfyUI bindings. |
29
29
  | [Derived artifacts](./ARTIFACTS.md) | Refine, pack, mount, and export; provenance, approval gates, ownership, and crash recovery. |
30
30
  | [Recovery and account safety](./RECOVERY.md) | Restore, caches, adopt, salvage, cross-project claims, tagging, and confirmed purge. |
31
31
  | [Quality gates](./QUALITY.md) | Manifest quality profiles, image baselines, human review, audit, cache, and CI usage. |
package/docs/REVISIONS.md CHANGED
@@ -344,10 +344,16 @@ inline pixels. It must match the shape `src/skeleton.ts`'s `SkeletonSetSchema`
344
344
  validates: `{"firstFrameKeypoints": [...18 joints], "frames": [[...18
345
345
  joints], ...3 to 15 of them]}`, each joint `{"label": "RIGHT KNEE", "x": 0.52,
346
346
  "y": 0.71, "z_index": 9, "depth": 4}` (`depth` optional — PixelLab fills it
347
- from `skeletonTemplate`, default `mannequin`, when omitted). Bootstrap this
348
- file with `pixelkiln estimate-skeleton <image> --out poses/hero-swing.json`
349
- (see [CLI reference](./CLI.md#estimate-skeleton)) rather than hand-typing 18
350
- joints from scratch, then hand-tweak individual joints for in-between frames.
347
+ from `skeletonTemplate`, default `mannequin`, when omitted). `label` is one
348
+ of PixelLab's 18 joints (`NOSE`, `NECK`, `RIGHT`/`LEFT` `SHOULDER`, `ELBOW`,
349
+ `ARM` for the wrist, `HIP`, `KNEE`, `LEG` for the ankle, `EYE`, `EAR`), each
350
+ exactly once per pose; a misspelled or repeated joint fails when the manifest
351
+ loads. Bootstrap this file with
352
+ `pixelkiln estimate-skeleton <image> --out poses/hero-swing.json` (see
353
+ [CLI reference](./CLI.md#estimate-skeleton)), which writes the estimated pose
354
+ and four copies of it as frames, then move joints frame by frame. Check each
355
+ edit with `pixelkiln skeleton-preview hero-swing`, which draws every pose
356
+ over the source image, locally and for free.
351
357
 
352
358
  `direction` is **required** for this mode (unlike `animate-pixminimax`,
353
359
  where it is optional). `frames`/`fps`/`lastFrame`/`enhancePrompt` are all
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pixelkiln",
3
- "version": "0.68.0",
3
+ "version": "0.69.0",
4
4
  "description": "Manifest-driven pixel-art generation, review, recovery, and packaging with deterministic provenance.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -44,8 +44,8 @@ hashes.
44
44
  - When an asset declares `revision`, read the revision reference, require its
45
45
  parent gate to pass, and never bypass a `blocked` plan. Generate or approve
46
46
  the parent explicitly before re-planning the child.
47
- - A character `state`, `animation`, `mirror`, or pro `styleCharacter` is a
48
- dependent asset the same way: one `pixelkiln gen` runs the waves in order
47
+ - A character `state`, `animation`, `portrait`, `outfit`, `mirror`, or pro
48
+ `styleCharacter` is a dependent asset the same way: one `pixelkiln gen` runs the waves in order
49
49
  and stops when the budget cannot cover the next one. Before declaring the
50
50
  east-facing loop of a character, check whether a `mirror` of the west one
51
51
  does the job for nothing (an animation's `directions` list declares the
@@ -53,6 +53,10 @@ hashes.
53
53
  selects the whole family); before drawing a base from text, ask whether the
54
54
  user has a south-facing sprite to `reference` instead (1 generation on
55
55
  `pro-flash` at 64px). Mirrors swap handedness.
56
+ - Before an outside or upscaled sprite becomes a `reference` or `styleImages`
57
+ path, run `pixelkiln unzoom --from <file> --out <file>` to bring it back to
58
+ its native pixel grid. Upscaled input degrades every PixelLab endpoint that
59
+ takes a reference, and the unzoomed result is opaque.
56
60
  - Treat every ComfyUI output as source material until it passes the native-grid,
57
61
  final-palette, prompt-coverage, and human 1× checks in the ComfyUI reference.
58
62
  A successful PNG or high-confidence grid result is not quality approval.
@@ -105,8 +109,10 @@ composition review and, for an isolated asset, background removal.
105
109
 
106
110
  Read only the reference needed for the current decision:
107
111
 
108
- - For PixelLab configuration, generators, costs, alpha behavior, or account
109
- operations, read [references/pixellab.md](references/pixellab.md). For a
112
+ - For PixelLab configuration, generators (including `uiElement` for single UI
113
+ pieces and `imageProFlash` for styled stills), costs, alpha behavior,
114
+ account operations, or the `unzoom`, `font`, `estimate-skeleton`, and
115
+ `skeleton-preview` utilities, read [references/pixellab.md](references/pixellab.md). For a
110
116
  PixelLab style aimed at a specific resolution or fidelity tier (retro,
111
117
  high-detail, or matching an existing set's look), read
112
118
  [references/pixellab-fidelity.md](references/pixellab-fidelity.md) first.
@@ -1,7 +1,8 @@
1
- # PixelLab surface this adapter does not cover
1
+ # PixelLab coverage and remaining gaps
2
2
 
3
- A catalog of PixelLab capabilities confirmed absent from PixelKiln, built by
4
- reading all 29 tutorials on PixelLab's official YouTube channel (the original
3
+ A catalog of PixelLab capabilities checked against PixelKiln: what this
4
+ adapter now covers, and what is still absent. It was built by reading all 29
5
+ tutorials on PixelLab's official YouTube channel (the original
5
6
  26 — the 12 featured on pixellab.ai plus 14 more from the channel's "PixelLab
6
7
  Tutorial" playlist, filtered to ~12 months back from that pass — plus 3 more
7
8
  published since: "Level Up Your Game: Custom Sprite Animation Tutorial,"
@@ -16,8 +17,8 @@ confirmed gap with real demand rather than a guess. Nothing here is a
16
17
  commitment to build it — it is what is missing, with the evidence for why it
17
18
  might matter, so that decision can be made deliberately.
18
19
 
19
- Each entry names the PixelLab tool, why pixelkiln doesn't have it today, and
20
- which tutorial(s) demonstrated real (not hypothetical) demand for it.
20
+ Each open entry names the PixelLab tool, why pixelkiln doesn't have it today,
21
+ and which tutorial(s) demonstrated real (not hypothetical) demand for it.
21
22
 
22
23
  ## Already closed since this catalog's research began
23
24
 
@@ -93,7 +94,7 @@ which tutorial(s) demonstrated real (not hypothetical) demand for it.
93
94
  formula, since the request bodies are near-identical minus `template_id` —
94
95
  a real assumption pending a live check, not a confirmed number the way
95
96
  `isometricTile`'s now is. Batch "pack" generation (N distinct objects from
96
- one call) remains unmodeled — see above.
97
+ one call) is covered on `1dir` by its `batch` field — see below.
97
98
  - **Pixel correction** (`/correct-pixelart`, a dedicated cleanup pass distinct
98
99
  from `image-to-pixelart` — the latter is documented, docs/ENDPOINTS.md, as
99
100
  being "for photographs and 3-D renders, not for reprocessing" pixel art)
@@ -281,6 +282,50 @@ which tutorial(s) demonstrated real (not hypothetical) demand for it.
281
282
  Closed by `pixelkiln unzoom`, a standalone command on a loose file, since
282
283
  the art it is for comes from outside the manifest. Its result is opaque
283
284
  (transparency is composited onto white first). Cost unmeasured.
285
+ - **Pro Flash for plain image create, edit, and inpaint** — a third image
286
+ tier, distinct from `pixflux`/`map`'s 1-generation endpoints and
287
+ `imagePro`'s flat-40 `generate-image-v2`, on the same model
288
+ `character`/`objectPro` already use for their `pro-flash` engine
289
+ (`gpt-image-2.5-flare`), confirmed against PixelLab's MCP tool schemas.
290
+ Demonstrated in "Pixel Art Animation Tutorial: Images Pro Flash, Skeleton
291
+ V3 & PixMiniMax": a styled character from a style image, re-edited
292
+ repeatedly ("give him a winter outfit," then a thicker one from *that*
293
+ result), then inpainted hair, shirt, and pants as separate masked passes.
294
+ Closed by the `imageProFlash` generator (`create`, one style image +
295
+ `styleTraits`, 16–256px in multiples of 4) and a revision's
296
+ `"engine": "pro-flash"`, which sends `image-to-image` to `edit` (text
297
+ method) and `inpaint` to `inpaint` (32–256px in multiples of 4, no
298
+ `strength`). A still's `source_image_id` is recorded and reused when a Pro
299
+ Flash character or object base's `reference` is that still's exact file
300
+ (issue #145). Shape, via `get_pro_flash_capabilities` (a free quote, not
301
+ billed):
302
+ - `create`: native 16×16 (experimental, always grid-corrected), 24×24,
303
+ 32×32, 32×48, 64×64, 96×64, 96×96; custom (beta) 16–256 in steps of 4.
304
+ One output, no reference images.
305
+ - `edit`: native 32×32 up to 128×128, custom 32–256 step 4. Two
306
+ `edit_methods`: `"text"` or `"reference"` (one `reference_image` that
307
+ must fit the edit canvas natively). Canvas never grows.
308
+ - `inpaint`: same sizes as `edit`; a rectangle or a same-size mask PNG
309
+ (white = generate, black = preserve). Always crops to the mask.
310
+ - Cost quotes (provisional): `create` 5 at 32 and 64px, 9 at 256px;
311
+ `edit`/`inpaint` 5 at 64px, `inpaint` 6 at 128px; `character` and
312
+ `object` at 64px `image: 5, rotations: 1, total: 6`, matching
313
+ pixelkiln's measured `proFlashCharacterCost`. None billed live yet.
314
+
315
+ Still unmodeled: `edit`'s `"reference"` method, the
316
+ `use_color_palette_correction` flag (snap the edit back to the source's
317
+ palette), inpaint's three `output_methods` (`"New layer with changes"`,
318
+ `"Modify current layer, only changes"`, `"Modify current layer"`), and
319
+ `context_image` + a required `bounding_box`, which lets the model see up to
320
+ 3× the native canvas of surrounding context — the problem
321
+ `docs/REVISIONS.md`'s "select a sub-region" workaround for `inpaint-v3`'s
322
+ 512px ceiling solves by hand today.
323
+ - **Portraits and outfit transfer** (`portrait-character-pro`,
324
+ `transfer-outfit-v2`) — closed as the `character` asset kinds `portrait`
325
+ (a bust of a base or state's south sprite) and `outfit` (an existing
326
+ loop's frames re-clothed from a reference image); see
327
+ `docs/CHARACTERS.md`. Both were live-measured: a 16px portrait billed 20,
328
+ a 2-frame 92×92 outfit transfer billed 20.
284
329
  - **`/create-8-direction-object`** is deliberately left unwrapped. `objectPro`
285
330
  already covers what it does (8 rotations from a prompt or a reference
286
331
  image, a `view`, a style image) on `/create-object-pro-flash` at roughly 6
@@ -288,76 +333,6 @@ which tutorial(s) demonstrated real (not hypothetical) demand for it.
288
333
  from an existing 8-direction object's sprites), is not worth a second,
289
334
  pricier engine on its own.
290
335
 
291
- ## Pro Flash for plain image create, edit, and inpaint
292
-
293
- PixelLab ships a **third image-generation tier**, distinct from both
294
- pixelkiln's already-modeled ones — `pixflux`/`map`'s cheap 1-generation
295
- non-Pro endpoints, and `imagePro`'s Pro tier (`generate-image-v2`, flat 40
296
- generations) — confirmed directly against PixelLab's own MCP tool schemas
297
- (`create_image_pro_flash`, `edit_image_pro_flash`, `inpaint_image_pro_flash`,
298
- `get_pro_flash_capabilities`), not just a tutorial's framing, the same
299
- standard this catalog holds itself to elsewhere. It is the **same underlying
300
- model** `character`/`objectPro` already use for their `pro-flash` engine
301
- (`gpt-image-2.5-flare`, "medium" provider quality per
302
- `get_pro_flash_capabilities`), but exposed here for **plain images** — create,
303
- edit, and inpaint — with no character or object involved. Demonstrated at
304
- length in "Pixel Art Animation Tutorial: Images Pro Flash, Skeleton V3 &
305
- PixMiniMax": creating a styled character from a reference-image "style
306
- image," then repeatedly re-editing the same asset ("give him a winter
307
- outfit," then, from *that* result, "a thicker royal winter outfit with a
308
- bigger sword" — evolving the previous edit rather than restarting from the
309
- original each time), then inpainting new hair, a shirt, and pants as separate
310
- masked passes, each isolated onto its own layer.
311
-
312
- **Confirmed shape, via `get_pro_flash_capabilities` (a free, no-generation
313
- quote/identity lookup — not billed):**
314
-
315
- - **`create`**: native sizes 16×16 (experimental, always pixel-grid-corrected
316
- by `image-to-pixel-art`'s own fixer), 24×24, 32×32, 32×48, 64×64, 96×64,
317
- 96×96; custom sizes (beta) 16–256 in steps of 4 on both sides. Takes a
318
- `style_image` (URL/base64/owned image id) with `style_options`
319
- (`color_palette`/`outline`/`detail`/`shading` toggles) — the same
320
- style-copying mechanic as `character` pro-flash's `styleTraits`, just not
321
- yet exposed for a plain image. One output, no reference images.
322
- - **`edit`**: native sizes 32×32 up to **128×128** (a larger ceiling than
323
- `create`'s 96×96), custom 32–256 step 4. Two distinct `edit_methods`:
324
- `"text"` (a description) or `"reference"` (a `reference_image`, max 1,
325
- which must fit the edit canvas natively — no resizing). No style options.
326
- Canvas never grows. An optional `use_color_palette_correction` flag snaps
327
- the edited result back to the source's own palette.
328
- - **`inpaint`**: same size range as `edit`. Mask is a rectangle
329
- (`mask_x`/`y`/`width`/`height`) or a same-size mask PNG, white = generate /
330
- black = preserve / alpha ignored — the same convention `inpaint-v3` already
331
- uses. Always crops to the mask. Three `output_methods`: `"New layer with
332
- changes"`, `"Modify current layer, only changes"`, `"Modify current
333
- layer"` — matching exactly what the tutorial's Aseprite/Pixelorama UI
334
- offers, and a real choice the already-modeled `inpaint-v3` does not expose
335
- at all today (pixelkiln's `inpaint` revision always gets one behavior). A
336
- new, genuinely unmodeled mechanic: `context_image` + a required
337
- `bounding_box` lets the model see up to **3×** the native canvas in either
338
- dimension of surrounding context beyond the masked region itself — for
339
- inpainting a sub-region of a larger scene coherently, the same problem
340
- `docs/REVISIONS.md`'s existing "select a sub-region" workaround for
341
- `inpaint-v3`'s 512px ceiling solves by hand today.
342
- - **Cost, from live (but not billed — `get_pro_flash_capabilities`'s quotes
343
- are provisional) queries**: `create` 32×32 and 64×64 both quote 5
344
- generations flat; 256×256 quotes 9. `edit`/`inpaint` at 64×64 quote 5;
345
- `inpaint` at 128×128 quotes 6. `character` and `object` at 64×64 (8
346
- directions) both quote `image: 5, rotations: 1, total: 6` — matching
347
- pixelkiln's own already-measured `proFlashCharacterCost` (6 at 64px)
348
- exactly, reassuring cross-validation of the quote endpoint even though it
349
- is a quote, not a bill.
350
-
351
- **Now modeled, in part:** the `imageProFlash` generator wraps `create`
352
- (style image + `styleTraits`, 16–256px in multiples of 4), and a revision's
353
- `"engine": "pro-flash"` sends `image-to-image` to `edit` (text method) and
354
- `inpaint` to `inpaint`. A still's `source_image_id` is recorded and reused
355
- when a Pro Flash character or object base's `reference` is that still's exact
356
- file (issue #145). Still unmodeled: `edit`'s `"reference"` method, the
357
- `use_color_palette_correction` flag, inpaint's `output_method` choice and the
358
- `context_image` + `bounding_box` mechanism. Costs use the provisional quotes
359
- above; none has been billed live yet.
360
-
361
336
  ## Map Workshop (scene composition)
362
337
 
363
338
  PixelLab's actual scene-building surface: lay out a tile floor, place
@@ -418,7 +393,4 @@ result into a `SkeletonSetSchema` file) — worth scoping once the base
418
393
  product — "deploy your own agent," confirmed directly from the live tool
419
394
  schemas — unrelated to game-asset generation. Nothing to build here.
420
395
  - Lip-sync/vocal-animation/talking-gif are named as out of scope in
421
- docs/PIXELLAB.md, with no in-flight work. Portraits (`portrait`) and outfit
422
- transfer (`outfit`) are character asset kinds; see docs/CHARACTERS.md. They
423
- were built and live-measured in September 2026 on a stacked branch that
424
- never reached `main`, and were ported onto it later.
396
+ docs/PIXELLAB.md, with no in-flight work.
@@ -12,7 +12,9 @@ providers, or before any PixelLab account operation.
12
12
  - Cost unit: subscription generations. Copy the exact `pixelkiln plan` total
13
13
  into `--budget`; do not translate it into dollars.
14
14
  - Account operations: balance, adopt, salvage, tag, and separately confirmed
15
- purge are supported. Read `docs/RECOVERY.md` before using them.
15
+ purge are supported, for characters as well as objects (salvage reviews a
16
+ base with its states and loops as one group). Read `docs/RECOVERY.md`
17
+ before using them.
16
18
 
17
19
  ## Generator choice
18
20
 
@@ -24,7 +26,9 @@ providers, or before any PixelLab account operation.
24
26
  | `tiles` | Ground variations or connected structures | 20–40 generations |
25
27
  | `terrain` | A two-terrain Wang tileset for elevation (grass-to-water, floor-to-cliff) | Unmeasured; borrows the same 20–40 canvas tiers |
26
28
  | `imagePro` | A larger or non-square background/scene, or real style transfer | **40 generations flat**, any size |
27
- | `character` | A character in 4 or 8 directions, its poses (`state`), and its loops (`animation`) | 1 per standard base, 6 per pro-flash base at 64px (1 from a `reference`), 20–40 per pose, 1 per template loop per direction |
29
+ | `character` | A character in 4 or 8 directions, its poses (`state`), its loops (`animation`), bust `portrait`s, and `outfit` transfers onto a loop | 1 per standard base, 6 per pro-flash base at 64px (1 from a `reference`), 20–40 per pose or portrait, 1 per template loop per direction, 20 per outfit (measured once) |
30
+ | `objectPro` | A prop, creature, or vehicle that needs rotations, states, or loops but has no character rig | 6 per base at 64px (1 from a `reference`), **unmeasured**; assumed to match `character` pro-flash |
31
+ | `isometricTile` | One standalone isometric tile (a raised mesa, a cliff block), 16–64px | **1 generation, measured once** (32px `block`) |
28
32
  | `uiAsset` | A UI panel, button, health bar, or other chrome, from precise `pieces` and/or named `elements` | **20 generations, measured once** (256×192); the borrowed canvas-tier estimate still predicts 40 |
29
33
  | `uiElement` | One UI element (button, slot, bar, dialogue box) from the prompt, 16px and up, with an optional concept image | 20–40 generations, **unmeasured** |
30
34
  | `imageProFlash` | A styled still on the Pro Flash model (style image + `styleTraits`), 16–256px in multiples of 4; also the natural source for a Pro Flash character's south sprite | 5–9 generations, PixelLab's provisional quote |
@@ -172,9 +176,9 @@ not independently measured** — `objectProCost()` assumes it prices
172
176
  identically to `character` pro-flash's own measured formula
173
177
  (`proFlashCharacterCost`), since the request bodies are near-identical minus
174
178
  `template_id`; treat it as a working assumption pending a live check.
175
- Batch "pack" generation (PixelLab's Object Creator can make N distinct
176
- objects from one call) and `objectPro`'s own place in `pixelkiln adopt` are
177
- not modeled yet. `pixelkiln gallery --edit` offers "+ New state" and
179
+ `objectPro`'s own place in `pixelkiln adopt` is not modeled yet. (N distinct
180
+ objects from one call, PixelLab's Object Creator "pack", is the `1dir`
181
+ `batch` field above.) `pixelkiln gallery --edit` offers "+ New state" and
178
182
  "+ New animation" on a `character` or `objectPro` base/state's drawer, same
179
183
  family, same manifest-only write "+ New revision" does — it writes the
180
184
  `asset.state`/`asset.animation` fields above (minus `startFrame`/`endFrame`
@@ -444,12 +448,20 @@ the `direction` value. The same tutorial states outright that PixMiniMax
444
448
  "allows up to 40 frames," a second, independent (though still not
445
449
  live-billed) confirmation of the ceiling above.
446
450
 
447
- PixelLab ships a further image-generation tier beyond what this adapter
448
- models: "Pro Flash" for plain image create/edit/inpaint, the same
449
- `gpt-image-2.5-flare` model `character`/`objectPro` pro-flash already use,
450
- now exposed for images with no character or object involved — see
451
- [pixellab-roadmap.md](./pixellab-roadmap.md) for the confirmed shape and
452
- cost.
451
+ Parts of Pro Flash image editing are still outside this adapter: `edit`'s
452
+ reference-image method, palette correction, inpaint's output-method choice,
453
+ and inpainting with surrounding `context_image`. See
454
+ [pixellab-roadmap.md](./pixellab-roadmap.md) for the confirmed shape.
455
+
456
+ Three commands call PixelLab on loose files, outside the manifest and
457
+ lockfile. `pixelkiln unzoom --from <file> --out <file>` returns upscaled
458
+ pixel art to its native grid; run it before outside art becomes a
459
+ `reference` or `styleImages` entry (input at least 256×256, result opaque,
460
+ cost unmeasured). `pixelkiln font --description <text> --out <base>` writes a
461
+ `.ttf` and an 80-glyph atlas for PixelLab's documented 25 generations, and
462
+ asks first. `pixelkiln estimate-skeleton <image> --out <file>` starts an
463
+ `animate-skeleton` keypoints file, and `pixelkiln skeleton-preview <asset>`
464
+ draws its poses over the source for free. See `docs/CLI.md`, "PixelLab utilities".
453
465
 
454
466
  For a style aimed at a specific look (a
455
467
  retro/console feel or a
@@ -12,6 +12,11 @@ Read this reference when an asset declares `revision`.
12
12
  - An inpaint mask must be a PNG and match the available parent dimensions.
13
13
  - Start image-to-image strength around `0.2`–`0.4`; explain that the exact
14
14
  effect belongs to the model and graph.
15
+ - On PixelLab, `"engine": "pro-flash"` sends an `image-to-image` or `inpaint`
16
+ revision to the Pro Flash edit/inpaint endpoints instead of the Pro ones:
17
+ 5 generations up to 96px, 6 up to 208px, 9 beyond (provisional quotes),
18
+ against 20–40. The parent must be 32–256px per side in multiples of 4, and
19
+ `strength` is refused. Other modes reject `engine`.
15
20
  - `reduce-colors` and `correct-pixelart` send no prompt to the provider — the
16
21
  asset's `prompt` stays a manifest-only label. `numColors`/`paletteImage`
17
22
  are mutually exclusive; a `paletteImage` has no size relationship to the
@@ -40,6 +45,19 @@ Read this reference when an asset declares `revision`.
40
45
  while cardinal ones in the same batch generate fine — suspect the enhanced
41
46
  prompt's wording, not the model, when only some directions of a
42
47
  multi-directional set come out wrong.
48
+ - `animate-skeleton` (PixelLab, beta, tier 1+) poses the parent from a
49
+ committed `keypointsFile`: the parent's current pose plus 3–15 per-frame
50
+ poses. It needs `direction`; `prompt` names the motion and the optional
51
+ `description` says what the subject looks like. Bootstrap the file with
52
+ `pixelkiln estimate-skeleton <image> --out <file>` (a direct call, outside
53
+ any budget, like `balance`; square 16–256px images only), which writes the
54
+ estimated pose plus `--frames` copies (default 4) to edit. Joint labels are
55
+ PixelLab's 18 names, each once per pose. After every edit, run
56
+ `pixelkiln skeleton-preview <asset>` (local, free) and look at the sheet:
57
+ the starting pose must match the sprite, or every frame degrades silently. Plan cost
58
+ interpolates PixelLab's documented anchors (3 frames = 2, 8 = 3, 15 = 4);
59
+ like the other animate modes it lands in candidate review and is
60
+ unmeasured live.
43
61
  - `interpolate` needs `lastFrame` (the end keyframe; the parent is the
44
62
  start) and lets the model pick the frame count. Suggest it for motion one
45
63
  `animate` pass can't produce cleanly: build the key poses first as
@@ -53,8 +71,8 @@ Read this reference when an asset declares `revision`.
53
71
  `/reduce-colors`/`/correct-pixelart` endpoints synchronously (no background
54
72
  job); everything else in this file about the dependency gate, hashing, and
55
73
  candidate review applies identically regardless of provider. ComfyUI
56
- cannot back `animate`, `animate-pixminimax`, `interpolate`, or
57
- `edit-animation` at all (`supportsRevision` refuses them) — its revision
74
+ cannot back `animate`, `animate-pixminimax`, `animate-skeleton`,
75
+ `interpolate`, or `edit-animation` at all (`supportsRevision` refuses them) — its revision
58
76
  path always writes a single output image, and an animation is a frame
59
77
  set; that's a structural gap, not a missing binding.
60
78
  - A filtered child resolves its parents for safety but does not generate them.
@@ -67,8 +85,8 @@ Read this reference when an asset declares `revision`.
67
85
  from a parent's drawer ("+ New revision" under "Revisions from this
68
86
  asset"), once the parent has usable pixels; it does not offer `inpaint`
69
87
  (needs a mask upload), `outpaint`, `reduce-colors`, `correct-pixelart`,
70
- `animate`, `animate-pixminimax`, `interpolate`, or `edit-animation` yet,
71
- so add those by hand.
88
+ `animate`, `animate-pixminimax`, `animate-skeleton`, `interpolate`, or
89
+ `edit-animation` yet, so add those by hand.
72
90
  - Before an outside image becomes a `styleImages` or `reference` path,
73
91
  suggest `pixelkiln unzoom --from <file>`: upscaled pixel art (every art
74
92
  pixel a block of screen pixels) degrades every reference-taking PixelLab