pixelkiln 0.89.0 → 0.89.2
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/dist/cli.js +61 -2
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +65 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +459 -1
- package/dist/index.d.ts +459 -1
- package/dist/index.js +63 -2
- package/dist/index.js.map +1 -1
- package/docs/ARCHITECTURE.md +8 -0
- package/docs/ENDPOINTS.md +23 -5
- package/docs/GENERATORS.md +1 -1
- package/docs/MANIFEST.md +1 -1
- package/docs/PIXELLAB.md +6 -5
- package/docs/REVISIONS.md +4 -4
- package/package.json +1 -1
- package/skills/pixelkiln/references/pixellab-roadmap.md +21 -10
- package/skills/pixelkiln/references/pixellab.md +11 -1
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -112,6 +112,14 @@ retain:
|
|
|
112
112
|
same output bytes, which is what lets a restore reproduce a recorded hash.
|
|
113
113
|
It is compared against the manifest on every `plan`: a difference is
|
|
114
114
|
`recoverable`, never `stale`, because no provider work is involved;
|
|
115
|
+
- `terrainSettings`, `terrain` entries only: the settings the request was
|
|
116
|
+
sent with that `specHash` leaves out (the older mode, transition size,
|
|
117
|
+
view, shape, and raggedness knobs, and each terrain's description as
|
|
118
|
+
sent). Hashing them would have made every existing terrain entry stale,
|
|
119
|
+
so `plan` compares this record instead and reports `stale` naming each
|
|
120
|
+
changed setting. An entry from before it was recorded has none and is
|
|
121
|
+
taken as current. A history entry keeps its own, so a restore is
|
|
122
|
+
compared against the generation it brought back;
|
|
115
123
|
- temporary `supersededOutputs[]` ownership hashes while a stale generation is
|
|
116
124
|
being replaced;
|
|
117
125
|
- provider-specific metadata under a provider-id namespace;
|
package/docs/ENDPOINTS.md
CHANGED
|
@@ -401,13 +401,13 @@ normal-map` ([REVISIONS.md](./REVISIONS.md#normal-maps)).
|
|
|
401
401
|
|
|
402
402
|
---
|
|
403
403
|
|
|
404
|
-
## Tilesets:
|
|
404
|
+
## Tilesets: measured once per kind
|
|
405
405
|
|
|
406
406
|
Called out separately because these are the most capable endpoints for level art
|
|
407
|
-
and they are relevant to the disc-golf game.
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
407
|
+
and they are relevant to the disc-golf game. pixelkiln plans a top-down set
|
|
408
|
+
at PixelLab's own quote (Pro 15 for tiles up to 32px, 25 at 64px; standard 4,
|
|
409
|
+
the top of its quoted 1 to 4). Pro at 32px and the sidescroller are measured
|
|
410
|
+
below; Pro at 64px and standard are not.
|
|
411
411
|
|
|
412
412
|
`POST /tilesets` (top-down) and `/tilesets-sidescroller` are the current
|
|
413
413
|
versions; `/create-tileset*` are the older aliases with identical schemas.
|
|
@@ -437,6 +437,24 @@ are the base tile ids, so set A's `upper` id sent as set B's
|
|
|
437
437
|
`lower_base_tile_id` makes the two share that terrain. pixelkiln records them
|
|
438
438
|
as `terrainIds` when it polls a set.
|
|
439
439
|
|
|
440
|
+
### Pro top-down and a connected pair, measured
|
|
441
|
+
|
|
442
|
+
October 2026, through `pixelkiln gen` on the website's showcase project
|
|
443
|
+
(`website/art/pixellab-0.4.130`). Two Pro sets at 32px with
|
|
444
|
+
`terrainRoundness: 2` and `terrainConnectDiagonals: true`:
|
|
445
|
+
|
|
446
|
+
- `ocean-sand` ("deep ocean water texture" to "plain smooth sand texture")
|
|
447
|
+
billed **exactly 15 generations**, 16 tiles. Its `metadata.terrain_ids`
|
|
448
|
+
held both a `lower` and an `upper` id, recorded as `terrainIds`.
|
|
449
|
+
- `sand-grass` ("plain smooth sand texture" to "plain short grass texture")
|
|
450
|
+
with `connect: { lower: { of: "ocean-sand", terrain: "upper" } }` stayed
|
|
451
|
+
blocked until `ocean-sand` was downloaded, then sent `ocean-sand`'s upper
|
|
452
|
+
id as `lower_base_tile_id` and billed **exactly 15**.
|
|
453
|
+
- Painted together on one vertex grid, the two sets join at the shared sand
|
|
454
|
+
with matching colour. The second set's sand carries fewer pebbles, so the
|
|
455
|
+
ring where it meets the first set's sand is visible up close. "plain smooth
|
|
456
|
+
sand texture" still came back with pebbles in the first set.
|
|
457
|
+
|
|
440
458
|
### Sidescroller, measured
|
|
441
459
|
|
|
442
460
|
One `POST /create-tileset-sidescroller` call, 16px tiles,
|
package/docs/GENERATORS.md
CHANGED
|
@@ -12,7 +12,7 @@ account; [ENDPOINTS.md](./ENDPOINTS.md) contains the detailed experiments.
|
|
|
12
12
|
| Exact fixed palette | `pixflux`, or `imagePro` for a larger or non-square canvas | 1 generation (`imagePro`: 10–25) | 1 inline image (`imagePro`: 1–64 by size) |
|
|
13
13
|
| Candidate variety, richer rendering, future rotation/animation | `1dir` | 10–25 generations | 4–64 by size |
|
|
14
14
|
| Ground tiles or connectable structural sets | `tiles` | 10–25 generations | variations or complete set |
|
|
15
|
-
| Two-terrain Wang tileset for elevation (grass to water, floor to cliff), or a sidescroller platform set | `terrain` | Pro 15
|
|
15
|
+
| Two-terrain Wang tileset for elevation (grass to water, floor to cliff), or a sidescroller platform set | `terrain` | Pro 15 at 32px and sidescroller 3 (measured); Pro 25 at 64px, standard plans at 4 (PixelLab's quotes) | 16 or 25 tiles |
|
|
16
16
|
| Platform tileset for a sidescroller (stone body, grass top) | `terrain`, `terrainOrientation: "sidescroller"` | 3 generations | 16 tiles |
|
|
17
17
|
| A single elevation tile — a raised mesa, a cliff block | `isometricTile` | 1 generation | 1 |
|
|
18
18
|
| Larger or non-square scene or background, up to 792 wide and 688 tall | `imagePro` | 10–25 generations by canvas | 1–64 by size |
|
package/docs/MANIFEST.md
CHANGED
|
@@ -155,7 +155,7 @@ One asset using the fields most projects reach for:
|
|
|
155
155
|
| `terrainBoundarySeed` | `0` | `terrain`, with `terrainBoundaryAmplitude`. Which meander, an integer. |
|
|
156
156
|
| `terrainStepSlope` | `0` | `terrain`, `pro` at `terrainTransitionSize` 0.25 only. 0 a cliff to 2 a gentle slope. |
|
|
157
157
|
| `terrainConnectDiagonals` | `false` | `terrain`, `pro` only. Join the diagonal tiles' upper corners into one area. |
|
|
158
|
-
| `terrainSpreadX` / `terrainSlopeSize` | | Deprecated: PixelLab ignores both. Still accepted. |
|
|
158
|
+
| `terrainSpreadX` / `terrainSlopeSize` | | Deprecated: PixelLab ignores both. Still accepted. Changing any `terrain*` field marks the set stale: the older ones (mode, transition size, view, shape style, raggedness, these two) and the descriptions as sent are recorded per lock entry as `terrainSettings` rather than hashed, compared as written (an explicit default counts as a change), and absent on sets generated before that record existed, which stay current. |
|
|
159
159
|
| `mode` | `standard` | `character` only. `standard`, `v3`, `pro`, or `pro-flash`; see [Characters](./CHARACTERS.md). |
|
|
160
160
|
| `directions` | `8` | `character` only. `4` or `8`; every engine but `standard` draws 8. |
|
|
161
161
|
| `template` | `mannequin` | `character` only. Body template: `mannequin`, or `bear`, `cat`, `dog`, `horse`, `lion`; `custom` for `pro-flash`. |
|
package/docs/PIXELLAB.md
CHANGED
|
@@ -71,7 +71,7 @@ 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 | 10 to 25 generations |
|
|
73
73
|
| `tiles` | You need ground variations or a connected structural set | 10 to 25 generations |
|
|
74
|
-
| `terrain` | You need a two-terrain Wang tileset (grass to water, floor to cliff), sets that share a terrain, or a sidescroller platform set | sidescroller 3 (measured);
|
|
74
|
+
| `terrain` | You need a two-terrain Wang tileset (grass to water, floor to cliff), sets that share a terrain, or a sidescroller platform set | Pro 15 at 32px and sidescroller 3 (measured); Pro 25 at 64px and standard up to 4 (PixelLab's quote) |
|
|
75
75
|
| `isometricTile` | You need one standalone isometric tile, 16 to 64px | 1 generation (measured once) |
|
|
76
76
|
| `imagePro` | You need a larger or non-square scene, up to 792 wide and 688 tall, optionally held to the style's `palette` | 10 to 25 generations |
|
|
77
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) |
|
|
@@ -121,10 +121,11 @@ PixelLab 0.4.130 (October 2026) added four things. PixelKiln covers each:
|
|
|
121
121
|
loop at 0.5 generations, and `pixelkiln normal-map` does it for a loose
|
|
122
122
|
file. See [Controlled asset revisions](./REVISIONS.md#normal-maps).
|
|
123
123
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
(
|
|
127
|
-
|
|
124
|
+
Each has been billed live and matched the plan: a Pro 32px set (15) and a
|
|
125
|
+
second set connected to it (15), a sidescroller set (3), a 64×64 `imagePro`
|
|
126
|
+
call with the Game Boy palette (10, every pixel one of its four colours), a
|
|
127
|
+
lite described effect (1), and normal maps (0.5 each). The home page shows
|
|
128
|
+
the results.
|
|
128
129
|
|
|
129
130
|
## Learn from PixelLab's tutorials
|
|
130
131
|
|
package/docs/REVISIONS.md
CHANGED
|
@@ -242,8 +242,8 @@ naming the foreground. Both are rejected on other modes, as is `strength`.
|
|
|
242
242
|
map, so a game engine can light the sprite. The map is the parent's size: RGB
|
|
243
243
|
is the way each pixel faces, and alpha is 255 where the sprite shows and 0
|
|
244
244
|
elsewhere. It is a background job, and costs 0.5 generation per call,
|
|
245
|
-
charged only when the map is delivered (
|
|
246
|
-
|
|
245
|
+
charged only when the map is delivered (measured: a sprite and an 8-frame
|
|
246
|
+
strip each billed exactly 0.5).
|
|
247
247
|
|
|
248
248
|
```jsonc
|
|
249
249
|
{
|
|
@@ -723,8 +723,8 @@ further — there is nothing to ask.
|
|
|
723
723
|
horizontal strip, cut into per-frame files on poll. See
|
|
724
724
|
[Normal maps](#normal-maps). Measured once through `pixelkiln normal-map`:
|
|
725
725
|
an 8-frame strip billed exactly 0.5 generations and came back the same
|
|
726
|
-
size with matching alpha (docs/ENDPOINTS.md). The revision mode
|
|
727
|
-
|
|
726
|
+
size with matching alpha (docs/ENDPOINTS.md). The revision mode billed
|
|
727
|
+
0.5 on a 64×64 sprite too.
|
|
728
728
|
|
|
729
729
|
- The mask convention is fixed, not graph-defined like ComfyUI's: white marks
|
|
730
730
|
the area to generate, black the area to preserve. There is no way to flip it.
|
package/package.json
CHANGED
|
@@ -84,6 +84,16 @@ and which tutorial(s) demonstrated real (not hypothetical) demand for it.
|
|
|
84
84
|
15 up to 32px and 25 at 64px, standard 4 (the top of its quoted 1 to 4),
|
|
85
85
|
sidescroller 3. What is still open is in
|
|
86
86
|
[Pro tilesets](#pro-tilesets-what-is-left-after-04130) below.
|
|
87
|
+
- **Older terrain fields as identity.** `terrainMode`,
|
|
88
|
+
`terrainTransitionSize`, `terrainRaggedness`, `terrainShapeStyle`,
|
|
89
|
+
`terrainView`, the deprecated `terrainSpreadX`/`terrainSlopeSize`, and
|
|
90
|
+
the descriptions as sent (the prompt wrapped in the style's prefix and
|
|
91
|
+
suffix) never entered `specHash`, and hashing them would have made every
|
|
92
|
+
existing terrain entry stale at once. Closed without a migration: submit
|
|
93
|
+
records them on the entry as `terrainSettings` (kept through history and
|
|
94
|
+
`restore --generation`), and the plan marks a set stale naming each one
|
|
95
|
+
that changed. An entry from before the record has none and stays current
|
|
96
|
+
until it is next regenerated. The 0.4.130 fields stay hashed (when set).
|
|
87
97
|
- **Pro-tier full-bleed background generation** (`generate-image-v2`, PixelLab's
|
|
88
98
|
Pro image tier) at arbitrary custom aspect ratios (not just square) —
|
|
89
99
|
already measured at 40 generations in `docs/ENDPOINTS.md`, but `pixflux`
|
|
@@ -363,13 +373,16 @@ and which tutorial(s) demonstrated real (not hypothetical) demand for it.
|
|
|
363
373
|
standalone `pixelkiln normal-map` command. Styles with `enforcePalette` or
|
|
364
374
|
`quality` refuse it so nothing palette-snaps a normal map. **Measured
|
|
365
375
|
once**: an 8-frame 1304×26 strip billed exactly 0.5 and came back the same
|
|
366
|
-
size with matching alpha.
|
|
376
|
+
size with matching alpha. The revision mode then billed 0.5 on a 64×64
|
|
377
|
+
sprite through `pixelkiln gen`.
|
|
367
378
|
- **Target palette for Create Image Pro** (`target_palette` on
|
|
368
379
|
`/generate-image-v2`, PixelLab 0.4.130) — an `imagePro` style's `palette`
|
|
369
380
|
is now sent as the colors every pixel must use, with `maxColors` (2 to 64
|
|
370
381
|
per image) and `paletteName`. The beta `smart` mapping is left out because
|
|
371
382
|
PixelLab documents it as single-image only and `imagePro` returns a grid of
|
|
372
|
-
candidates below 171px.
|
|
383
|
+
candidates below 171px. **Measured once**: a 64×64 call with the Game Boy
|
|
384
|
+
palette billed exactly 10, and the picked candidate used only those four
|
|
385
|
+
colours.
|
|
373
386
|
- **October 2026 Pro price cut** — PixelLab 0.4.128 moved every Pro tool from
|
|
374
387
|
20/25/40 to 10/15/25 generations. Cost estimates now use the new prices,
|
|
375
388
|
and `imagePro` (`generate-image-v2`) is tiered instead of a flat 40: a
|
|
@@ -441,18 +454,16 @@ connecting different tilesets") are now mostly covered; see the closed
|
|
|
441
454
|
`/create-tileset-sidescroller` has no `mode` field, and its tile size is
|
|
442
455
|
16 or 32. pixelkiln's sidescroller sets use whatever model that endpoint
|
|
443
456
|
runs.
|
|
444
|
-
- **Older terrain fields are not identity.** `terrainMode`,
|
|
445
|
-
`terrainTransitionSize`, `terrainRaggedness`, `terrainShapeStyle`, and
|
|
446
|
-
`terrainView` never entered `specHash`, so changing one does not mark a set stale. The 0.4.130 fields
|
|
447
|
-
are hashed (when set). Hashing the older ones would make every existing
|
|
448
|
-
terrain lock entry stale at once, so it needs a deliberate migration.
|
|
449
457
|
- **Wall-continuation twins export as duplicates.** The 25-tile layout has
|
|
450
458
|
21 distinct corner combinations. Four tiles share corners with a twin and
|
|
451
459
|
differ only in `pattern_4x4`, which pixelkiln records but cannot express in
|
|
452
460
|
a four-bit Tiled/Godot corner mask.
|
|
453
|
-
- **
|
|
454
|
-
|
|
455
|
-
|
|
461
|
+
- **Measured once:** a Pro 32px set billed exactly 15, and a second set
|
|
462
|
+
connected to it through `lower_base_tile_id` billed exactly 15 and shared
|
|
463
|
+
its sand (docs/ENDPOINTS.md). `terrainRoundness: 2` with
|
|
464
|
+
`terrainConnectDiagonals` gave clean 45° edges. **Unexercised live:**
|
|
465
|
+
Pro at 64px, standard sets, `upper_base_tile_id`, and the other shape
|
|
466
|
+
controls. Sidescroller tile counts at transition
|
|
456
467
|
sizes other than 0.25 are assumed to be 16. The one sidescroller call
|
|
457
468
|
returned `metadata.transition_size: 0.0` although 0.25 was sent.
|
|
458
469
|
- **Prompting advice** lives in the skill reference: end each terrain on
|
|
@@ -24,7 +24,7 @@ providers, or before any PixelLab account operation.
|
|
|
24
24
|
| `pixflux` | Closed palettes or full-bleed backgrounds up to 400×400 | 1 generation |
|
|
25
25
|
| `1dir` | Reference-guided work or several candidates | 10–25 generations |
|
|
26
26
|
| `tiles` | Ground variations or connected structures | 10–25 generations |
|
|
27
|
-
| `terrain` | A two-terrain Wang tileset for elevation (grass-to-water, floor-to-cliff), or a sidescroller platform set | Sidescroller **3**, measured.
|
|
27
|
+
| `terrain` | A two-terrain Wang tileset for elevation (grass-to-water, floor-to-cliff), or a sidescroller platform set | Sidescroller **3**, measured. Pro **15** at 32px, measured (a connected second set also billed 15). Pro 25 at 64px and standard 4 (quoted 1–4) are PixelLab's quotes |
|
|
28
28
|
| `imagePro` | A larger or non-square background/scene, or real style transfer; takes the style `palette` as a hard constraint | **10–25 generations** by canvas (64px billed 10; a flat 40 before October 2026) |
|
|
29
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 (2–4 as `skeleton-v3`), 20 per outfit (measured once) |
|
|
30
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 |
|
|
@@ -127,6 +127,16 @@ reads it:
|
|
|
127
127
|
both now, so leave them out. Reference images, a forced palette, and the
|
|
128
128
|
remaining tunables (`tileStrength`, `tilesetAdherence`) are not modeled.
|
|
129
129
|
|
|
130
|
+
Changing any terrain setting marks the set stale. The Pro shape controls
|
|
131
|
+
are in `specHash`; the older ones (`terrainMode`, `terrainTransitionSize`,
|
|
132
|
+
`terrainRaggedness`, `terrainShapeStyle`, `terrainView`, the deprecated
|
|
133
|
+
pair) and the style's `promptPrefix`/`promptSuffix` are recorded on the
|
|
134
|
+
lock entry as `terrainSettings` instead, and `plan` names the one that
|
|
135
|
+
changed ("terrainTransitionSize changed from 0.25 to 0.5"). A setting is
|
|
136
|
+
compared as written: adding `terrainMode: "standard"` to a style that left
|
|
137
|
+
it out is a change, even though it is the default. A set generated before
|
|
138
|
+
this record existed has none and stays current until it is regenerated.
|
|
139
|
+
|
|
130
140
|
**Connected sets.** An asset's `connect` makes one of its terrains the very
|
|
131
141
|
terrain of another set in the same style, so ocean, sand, and grass paint on
|
|
132
142
|
one map: `"connect": { "lower": { "of": "coast", "terrain": "upper" } }` is
|