pixelkiln 0.46.0 → 0.47.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/README.md CHANGED
@@ -54,6 +54,7 @@ provenance and no long-lived npm token.
54
54
  | Generate and review | Resumable submit/poll/pick/fetch pipeline, exact next-step hints, candidate or atomic frame-set review, and a provenance gallery that can edit intent, generate under a budget, and compare records. |
55
55
  | Hand edits | Touch-ups in your own editor or a pinned in-browser Pixelorama, kept beside the generated art with the generation still the record; frame and tile sets member by member. |
56
56
  | Controlled inputs | Hashed image-to-image/inpaint lineage, fail-closed parent approval, source-versus-candidate review, and content-addressed per-asset ComfyUI bindings. |
57
+ | Characters | A base in 4 or 8 directions from a prompt or your own sprite (four PixelLab engines), poses and loops as dependent assets generated in waves, free mirrored directions, account adoption, and SpriteFrames export. |
57
58
  | Existing-art onboarding | Manifest scaffolding, exact-hash account adoption, and prompt recovery. |
58
59
  | Recovery | Safe stale-output replacement, validated caches, durable references, resumable paid jobs, and per-asset generation history with free restores. |
59
60
  | Shared-account safety | Cross-project claim files or a registered workspace catalog, sibling-style exclusion, reviewed salvage, keep/discard tags, separate confirmed purge. |
@@ -177,8 +178,8 @@ packaging layer.
177
178
  "styles": {
178
179
  "base": {
179
180
  "generator": "map",
180
- "promptPrefix": "Pixel-art game prop: ",
181
- "promptSuffix": ", isolated, transparent background",
181
+ "promptPrefix": "pixel-art game prop",
182
+ "promptSuffix": "isolated, transparent background",
182
183
  "outDir": "assets/generated/base",
183
184
  "tags": ["my-game"]
184
185
  }
@@ -390,9 +391,8 @@ package share one source. Policies: [Contributing](./CONTRIBUTING.md),
390
391
 
391
392
  ## Scope
392
393
 
393
- Salvaging characters, and PixelLab's portrait and outfit tools, are not
394
- implemented. Cross-project content-cache reuse and `workspace find`
395
- are deferred. See the open [roadmap issues](https://github.com/gfargo/pixelkiln/issues).
394
+ Salvaging characters, PixelLab's portrait and outfit tools, cross-project
395
+ cache reuse, and `workspace find` are not implemented; see the open [issues](https://github.com/gfargo/pixelkiln/issues).
396
396
 
397
397
  ## License
398
398
 
package/dist/cli.js CHANGED
@@ -5641,6 +5641,10 @@ function pixelLabObjectUrl(generator, objectId) {
5641
5641
  const setId = objectId.split("#")[0];
5642
5642
  return setId ? `https://www.pixellab.ai/maps/tiles/${encodeURIComponent(setId)}` : null;
5643
5643
  }
5644
+ if (generator === "character") {
5645
+ const characterId = objectId.split("#")[0];
5646
+ return characterId ? `https://www.pixellab.ai/create-character/${encodeURIComponent(characterId)}` : null;
5647
+ }
5644
5648
  return null;
5645
5649
  }
5646
5650
  function characterCost(spec) {
@@ -8088,8 +8092,9 @@ async function fetchAssets(provider, specs, lock, lockPath, opts = {}) {
8088
8092
  const superseded = (entry.supersededOutputs ?? []).find(
8089
8093
  (output, oldIndex, all) => currentOutputPath(output, spec, oldIndex, all.length) === target
8090
8094
  );
8095
+ const outgoing = Boolean(superseded && currentHash === superseded.sha256);
8091
8096
  if (!opts.force) {
8092
- if (superseded && currentHash === superseded.sha256) {
8097
+ if (outgoing) {
8093
8098
  } else if (recorded || superseded) {
8094
8099
  throw new Error(
8095
8100
  `refusing to overwrite modified output ${target}; pass --force to replace it`
@@ -8100,6 +8105,14 @@ async function fetchAssets(provider, specs, lock, lockPath, opts = {}) {
8100
8105
  );
8101
8106
  }
8102
8107
  }
8108
+ if (outgoing && cacheDir) {
8109
+ try {
8110
+ const oldBytes = await readFile7(target);
8111
+ const oldMediaType = detectMediaType(oldBytes);
8112
+ if (oldMediaType) await cacheMedia(cacheDir, oldBytes, oldMediaType, currentHash);
8113
+ } catch {
8114
+ }
8115
+ }
8103
8116
  log2(
8104
8117
  ` replace ${path14.relative(process.cwd(), target)}` + (opts.force ? " (--force)" : " (previous tracked generation)")
8105
8118
  );