← Commit history

Publish 0.22.1

Colby Knox ·950bd14849 ·19d ago ·parent a2dcc31
7 files changed +17−6
bin/hero-studio

  
doctor.mjs+6−1
@@ -344,5 +344,10 @@ if (process.argv[1] && fileURLToPath(import.meta.url) === path.resolve(process.a   }   console.log(JSON.stringify({ ok: report.ok, renderer: report.renderer, checks: report.checks,     ...(brand ? { brand: { ok: brand.ok, owner: brand.owner, status: brand.status, checks: brand.checks } } : {}) }));-  process.exit(report.ok ? 0 : 1);+  // exitCode, not process.exit(): on Windows, exiting while fetch's sockets+  // are still closing trips a libuv assertion (UV_HANDLE_CLOSING) and prints+  // a crash line after a clean report. The unref'd timer only fires if+  // something else were to hold the loop open.+  process.exitCode = report.ok ? 0 : 1;+  setTimeout(() => process.exit(process.exitCode), 8000).unref(); }
install.sh+6−2
@@ -18,7 +18,10 @@ if [ -n "$ON_WINDOWS" ]; then   chmod +x "$HOME/.local/bin/hero-studio"   # PowerShell and cmd: run the same launcher through Git's bash.   WINBIN="$(cygpath -w "$PWD/bin/hero-studio" 2>/dev/null || echo "$PWD/bin/hero-studio")"-  printf '@echo off\r\nwhere bash >nul 2>nul && (bash "%s" %%*) || ("%%ProgramFiles%%\\Git\\bin\\bash.exe" "%s" %%*)\r\n' "$WINBIN" "$WINBIN" > "$HOME/.local/bin/hero-studio.cmd"+  # Git's own bash first: the first `bash` on PATH is usually WSL's launcher+  # (System32), a different machine. Exactly one interpreter runs, so a+  # failing command is never retried by a fallback.+  printf '@echo off\r\nif exist "%%ProgramFiles%%\\Git\\bin\\bash.exe" (\r\n  "%%ProgramFiles%%\\Git\\bin\\bash.exe" "%s" %%*\r\n) else if exist "%%LOCALAPPDATA%%\\Programs\\Git\\bin\\bash.exe" (\r\n  "%%LOCALAPPDATA%%\\Programs\\Git\\bin\\bash.exe" "%s" %%*\r\n) else (\r\n  bash "%s" %%*\r\n)\r\nexit /b %%ERRORLEVEL%%\r\n' "$WINBIN" "$WINBIN" "$WINBIN" > "$HOME/.local/bin/hero-studio.cmd"   echo "installed: hero-studio (wrapper + hero-studio.cmd in ~/.local/bin; add it to PATH for PowerShell)"   echo "run 'hero-studio', then open http://127.0.0.1:8846/ in a browser (pose: --surface browser)" else@@ -59,7 +62,8 @@ fi DOCTOR_JSON="$(node "$PKG/doctor.mjs" 2>/dev/null || true)" case "$DOCTOR_JSON" in   *'"renderer":"local"'*)-    echo "renderer: OK (local headless Chrome verified; Generate renders in-container)" ;;+    if [ -n "$ON_WINDOWS" ]; then WHERE_RENDER="on this machine"; else WHERE_RENDER="in-container"; fi+    echo "renderer: OK (local headless Chrome verified; Generate renders $WHERE_RENDER)" ;;   *'"renderer":"pup"'*)     echo ""     echo "!! renderer: PUP FALLBACK ONLY. The local headless-Chrome stack is missing,  !!"
package.json+1−1
@@ -2,7 +2,7 @@   "slug": "hero-studio",   "title": "Hero Studio",   "type": "app",-  "version": "0.22.0",+  "version": "0.22.1",   "description": "The hero-image lab with a human gate: `hero-studio pose <owner/slug>` opens the studio in front of the human, posed for their package, and blocks until they click Generate, producing the provenance-stamped 2000x1250 PNG the registry's hero gate requires. The image carries the title and artwork; the exported image also bakes the type pill (top right) and full wiki slug (bottom right); the page shows the hero bare, and only the homepage marquee overlays its own dynamic info. Every hero wears its PAGE OWNER's brand guide (<owner>/brand): colors, type, logo and background themes, Adom's included; an unresolved guide holds unbranded rather than borrowing Adom's look. Placement is fixed for all. The floating app window is the showcase: it auto-loads a real screenshot from the package's wiki page (screenshots/, docs/), takes a manual import, or a full-hero import (the human-ratified re-stamp path for existing heroes). The pose gate opens in verification mode: per-item checklist (title, subtitle, showcase, type match) and a Generate that unlocks only fully confirmed. Includes showcase bleeds, brand tile themes, gradient angles, pixel-faithful wiki marquee and index-card previews, and a component-hero mode with a photo/raytrace/phong fallback ladder.",   "license": "MIT",   "tags": [
page.json+1−1
@@ -2,7 +2,7 @@   "slug": "hero-studio",   "title": "Hero Studio",   "type": "app",-  "version": "0.22.0",+  "version": "0.22.1",   "description": "The hero-image lab with a human gate: `hero-studio pose <owner/slug>` opens the studio in front of the human, posed for their package, and blocks until they click Generate, producing the provenance-stamped 2000x1250 PNG the registry's hero gate requires. The image carries the title and artwork; the exported image also bakes the type pill (top right) and full wiki slug (bottom right); the page shows the hero bare, and only the homepage marquee overlays its own dynamic info. Every hero wears its PAGE OWNER's brand guide (<owner>/brand): colors, type, logo and background themes, Adom's included; an unresolved guide holds unbranded rather than borrowing Adom's look. Placement is fixed for all. The floating app window is the showcase: it auto-loads a real screenshot from the package's wiki page (screenshots/, docs/), takes a manual import, or a full-hero import (the human-ratified re-stamp path for existing heroes). The pose gate opens in verification mode: per-item checklist (title, subtitle, showcase, type match) and a Generate that unlocks only fully confirmed. Includes showcase bleeds, brand tile themes, gradient angles, pixel-faithful wiki marquee and index-card previews, and a component-hero mode with a photo/raytrace/phong fallback ladder.",   "license": "MIT",   "tags": [
platform.cjs+3−1
@@ -92,7 +92,9 @@ function authHeader() { /// Returns { cmd, args } (args to put before -c), or null. let pythonCache; function pythonWithPillow({ fresh = false } = {}) {-  if (pythonCache !== undefined && !fresh) return pythonCache;+  // Only a FOUND interpreter is cached: after `pip install pillow` the next+  // Generate must find it without a server restart.+  if (pythonCache && !fresh) return pythonCache;   const order = IS_WIN     ? [['python', []], ['py', ['-3']], ['python3', []]]     : [['python3', []], ['python', []]];
pose.mjs