- 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
23 lines
1.3 KiB
TypeScript
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`);
|
|
}
|