storebound/media/teaser/site-shots.ts
CRT 236977940e flows, listing translate, scan 2.2 + --originality, prices export with subscriptions, site sections
- storebound flow list|validate|run: repo-local workflows (store/workflows/*.yml, storebound.workflows.*), writes dry unless --apply, owner steps never run, --from / --resume; init templates for app and game; MCP flow_list + dry flow_run; release-flows skill
- storebound listing translate|check|reviewed: per-language listing drafts with store limits and keyword rules, agent or --translate hook, marked until reviewed; MCP listing_translate / listing_check; listing-localization skill
- scan: Apple 2.2 beta/demo/test wording rule; scan --originality [--against]
- prices export includes subscriptions; prices import skips their rows
- site: rejection scan section, Desktop app section with fixture-mode screenshots, Everything else grid, FAQ 4.3 answer
- README, CHANGELOG, adapters, API tables
2026-10-12 01:24:21 +08:00

23 lines
1.3 KiB
TypeScript

#!/usr/bin/env bun
// The home page's "Desktop app" screenshots (site/img/desktop/*.webp) from the same headless fixture-mode capture as
// the teaser (desktop.ts: Vite dev server of apps/desktop with VITE_FIXTURES=1, dev markers hidden), scaled to 1280 px
// and encoded with cwebp (quality 75). Run after a desktop UI change: bun media/teaser/site-shots.ts
import { existsSync, mkdirSync, statSync } from 'node:fs';
import { join } from 'node:path';
import { captureDesktop } from './desktop';
const ROOT = join(import.meta.dir, '../..');
const SRC = join(import.meta.dir, 'out/desktop');
const OUT = join(ROOT, 'site/img/desktop');
const NAMES = ['portfolio', 'releases', 'checks'];
if (process.argv.includes('--fresh') || !NAMES.every(n => existsSync(join(SRC, `${n}.jpg`)))) await captureDesktop();
mkdirSync(OUT, { recursive: true });
for (const n of NAMES) {
const out = join(OUT, `${n}.webp`);
const p = Bun.spawnSync(['cwebp', '-quiet', '-q', '75', '-m', '6', '-resize', '1280', '0', join(SRC, `${n}.jpg`), '-o', out]);
if (p.exitCode !== 0) throw new Error(`cwebp ${n}: ${p.stderr.toString()}`);
const kb = statSync(out).size / 1024;
if (kb > 150) throw new Error(`${n}.webp is ${kb.toFixed(0)} KB (limit 150)`);
console.log(`${n}.webp ${kb.toFixed(0)} KB`);
}