From 4e151596cc626fb9a632d46ffc14fab15fe0c947 Mon Sep 17 00:00:00 2001 From: "prompt.ac/@jeffrey" Date: Sat, 30 May 2026 13:52:38 -0700 Subject: [PATCH] infra: gitignore hardening, electron/lith/grants/toolchain/settings updates Co-Authored-By: Claude Opus 4.8 (1M context) --- .claude/settings.json | 14 +++++++++++++- .gitignore | 8 ++++++++ ac-electron/dev.fish | 2 +- ac-electron/main.js | 13 +++++++++++-- ac-electron/renderer/flip-view.html | 22 ++++++++++++++++++++-- grants/lacma-2026/build-video-v6.py | 2 +- grants/lacma-2026/watch-pvc.mjs | 2 +- lith/Caddyfile | 12 +++++++++++- toolchain/macos/SCORE.md | 16 ++++++++-------- 9 files changed, 74 insertions(+), 17 deletions(-) diff --git a/.claude/settings.json b/.claude/settings.json index a452416f9..a4bb9bb24 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -15,7 +15,19 @@ "allow": [ "Bash(git add:*)", "Bash(git commit -m \"$\\(cat <<''EOF''\nfix: prevent black flashing during rapid reframing\n\nFixes blacking issue when window rapidly resizes by preventing cleared\nrendering canvases from being shown before new pixels arrive. During\nrapid reframes \\(e.g., mobile scrolling\\), the canvas size changes faster\nthan the worker can provide new pixels, causing black flashes.\n\nChanges:\n- Guard WebGL/WebGPU canvas visibility with dimension mismatch check\n- Skip canvas pixel recovery when awaiting reframe pixels\n- Keep freeze frame visible until matching pixels are received\n\nCo-Authored-By: Claude Sonnet 4.5 \nEOF\n\\)\")", - "Read(//home/me/.claude/**)" + "Read(//home/me/.claude/**)", + "Bash(open -a:*)", + "Bash(mkdir -p:*)", + "Bash(xelatex:*)", + "Bash(cp:*)", + "Bash(rm -f:*)", + "Bash(mv:*)", + "Bash(magick:*)", + "Bash(mutool draw:*)", + "Bash(pdftoppm:*)", + "Bash(bibtex:*)", + "Bash(kpsewhich:*)", + "Bash(chmod +x:*)" ] } } diff --git a/.gitignore b/.gitignore index 96440e4d0..c3c13a176 100644 --- a/.gitignore +++ b/.gitignore @@ -431,6 +431,14 @@ sosoft/*.aux sosoft/*.log sosoft/*.out sosoft/*.pdf +sosoft/**/*.aux +sosoft/**/*.log +sosoft/**/*.out +sosoft/**/*.pdf +# Editor/latex backup scratch files — never tracked +*.tex.bak +*.tex.old +*.mjs.bak # Stray xelatex log dir created when run from repo root. texput.log/ diff --git a/ac-electron/dev.fish b/ac-electron/dev.fish index b2ecfe152..e1dc53c3c 100755 --- a/ac-electron/dev.fish +++ b/ac-electron/dev.fish @@ -57,7 +57,7 @@ for arg in $argv case "--build" set build true case "--piece=*" - set piece (string replace "--piece=" "" $arg) + set piece (string replace -- "--piece=" "" $arg) case "*" set extra_args $extra_args $arg end diff --git a/ac-electron/main.js b/ac-electron/main.js index 87d60e10b..a5dd55dc6 100644 --- a/ac-electron/main.js +++ b/ac-electron/main.js @@ -1905,7 +1905,16 @@ async function openAcPaneWindowInternal(options = {}) { if (isPaperWM) winOpts.type = 'normal'; const win = new BrowserWindow(winOpts); - win.loadFile(getAppPath('renderer/flip-view.html'), isPaperWM ? { query: { wm: 'paper' } } : undefined); + // Plumb the launch piece + environment base into the flip-view shell so + // `--piece=NAME` (and `--dev`) actually route. The shell reads ?piece= and + // ?base= in initWebviewSrc(); without these it always falls back to prompt + // on production. Only the pane explicitly given a piece overrides the + // default — extra panes opened later still start at the prompt. + const baseUrl = startInDevMode ? 'http://localhost:8888' : 'https://aesthetic.computer'; + const query = { base: baseUrl }; + if (options.piece) query.piece = options.piece; + if (isPaperWM) query.wm = 'paper'; + win.loadFile(getAppPath('renderer/flip-view.html'), { query }); // 🎮 Grant sticky user activation to the host page so navigator.getGamepads() // works without the user clicking host chrome first. Chromium gates the @@ -3191,7 +3200,7 @@ app.whenReady().then(async () => { // When launched silently at login, stay in menubar-daemon mode: no AC // window, no dock icon. The user opens things explicitly from the tray. if (!launchedSilently || acDropColdLaunchFile) { - openAcPaneWindow(); + openAcPaneWindow({ piece: initialPiece }); } if (acDropColdLaunchFile) { diff --git a/ac-electron/renderer/flip-view.html b/ac-electron/renderer/flip-view.html index 3ba83259f..baf7b56d2 100644 --- a/ac-electron/renderer/flip-view.html +++ b/ac-electron/renderer/flip-view.html @@ -486,7 +486,9 @@
- + +
@@ -502,11 +504,27 @@ const webviewEl = document.getElementById('front-webview'); // Initial src comes from ?piece= (defaults to 'prompt') and ?base= (defaults to prod). + // A ignores .src assigned before it's attached, and its first + // dom-ready (from the about:blank placeholder) can fire before our listener + // attaches — a race that left the pane blank. So poll for attachment + // (getWebContentsId throws until ready) and navigate the moment it's live. (function initWebviewSrc() { const params = new URLSearchParams(location.search); const piece = (params.get('piece') || 'prompt').replace(/^\/+/, ''); const base = params.get('base') || 'https://aesthetic.computer'; - webviewEl.src = `${base}/${piece}?desktop`; + const target = `${base}/${piece}?desktop`; + let tries = 0; + const iv = setInterval(() => { + tries++; + let ready = false; + try { ready = webviewEl.getWebContentsId() != null; } catch (e) {} + if (ready) { + webviewEl.src = target; + clearInterval(iv); + } else if (tries > 60) { + clearInterval(iv); // ~6s; give up rather than spin forever + } + }, 100); })(); const flipTabs = document.querySelectorAll('.flip-tab'); const volumeSlider = document.getElementById('volume-slider'); diff --git a/grants/lacma-2026/build-video-v6.py b/grants/lacma-2026/build-video-v6.py index 34ab14af6..7b0952eea 100644 --- a/grants/lacma-2026/build-video-v6.py +++ b/grants/lacma-2026/build-video-v6.py @@ -26,7 +26,7 @@ CARDS.mkdir(exist_ok=True) ASSETS = Path.home() / "Desktop" / "ac-deck-assets" VAULT_ENV = "/Users/jas/aesthetic-computer/aesthetic-computer-vault/.devcontainer/envs/devcontainer.env" -VOICE_ID = "dYNGZ848Oo6DtNBoeqgh" # @jeffrey PVC +VOICE_ID = "ZXoQQp5X0PKHGwyZpVIT" # @jeffrey PVC MODEL_ID = "eleven_multilingual_v2" W, H = 1280, 800 diff --git a/grants/lacma-2026/watch-pvc.mjs b/grants/lacma-2026/watch-pvc.mjs index 04179924d..4f6848eb0 100644 --- a/grants/lacma-2026/watch-pvc.mjs +++ b/grants/lacma-2026/watch-pvc.mjs @@ -12,7 +12,7 @@ import { join, dirname } from "node:path"; import { fileURLToPath } from "node:url"; const HERE = dirname(fileURLToPath(import.meta.url)); -const VOICE_ID = "dYNGZ848Oo6DtNBoeqgh"; // @jeffrey PVC +const VOICE_ID = "ZXoQQp5X0PKHGwyZpVIT"; // @jeffrey PVC const VAULT_ENV = "/Users/jas/aesthetic-computer/aesthetic-computer-vault/.devcontainer/envs/devcontainer.env"; function loadKey() { diff --git a/lith/Caddyfile b/lith/Caddyfile index bc376dd10..4944a4f42 100644 --- a/lith/Caddyfile +++ b/lith/Caddyfile @@ -505,7 +505,17 @@ } reverse_proxy localhost:8888 } - @mainspa host aesthetic.computer www.aesthetic.computer lith.aesthetic.computer notepat.com www.notepat.com p5.aesthetic.computer sitemap.aesthetic.computer + + # --- wipppps.world --- + @wippppsroot host wipppps.world www.wipppps.world + handle @wippppsroot { + @wippppsindex path / + handle @wippppsindex { + rewrite * /wipppps + } + reverse_proxy localhost:8888 + } + @mainspa host aesthetic.computer www.aesthetic.computer lith.aesthetic.computer notepat.com www.notepat.com wipppps.world www.wipppps.world p5.aesthetic.computer sitemap.aesthetic.computer handle @mainspa { # Assets → DO Spaces CDN. The bucket root maps directly to # assets.aesthetic.computer (no /assets/ prefix exists in the diff --git a/toolchain/macos/SCORE.md b/toolchain/macos/SCORE.md index 662fc4912..b4c83f052 100644 --- a/toolchain/macos/SCORE.md +++ b/toolchain/macos/SCORE.md @@ -6,7 +6,7 @@ Conventions for working on @jeffrey's macOS host (the MacBook Neo). ## The Desktop convention -**The macbook neo `~/Desktop/` should ONLY contain the `Working Desktop` +**The macbook neo `~/Desktop/` should ONLY contain the `Shelf` alias** (plus macOS system dotfiles like `.DS_Store` / `.localized`). Everything else is media cruft and needs to be relocated. @@ -24,12 +24,12 @@ Everything else is media cruft and needs to be relocated. ### The single allowed alias ``` -~/Desktop/Working Desktop -> /Users/jas/Documents/Working Desktop/ +~/Desktop/Shelf -> /Users/jas/Documents/Shelf/ ``` That's the only thing on the desktop. All real work lives behind it. -### Where things actually live (under `~/Documents/Working Desktop/`) +### Where things actually live (under `~/Documents/Shelf/`) - `gens//refs/` — gpt-image-2 reference image sets per generation run (e.g. `gens/trancepenta-zuck/refs/`, @@ -45,10 +45,10 @@ That's the only thing on the desktop. All real work lives behind it. ### How to clean When the desktop has accumulated media cruft, move EVERYTHING except -the `Working Desktop` alias into a dated cleanup folder under it: +the `Shelf` alias into a dated cleanup folder under it: ```bash -mkdir -p "/Users/jas/Documents/Working Desktop/desktop-cleanup-$(date +%Y-%m-%d)" +mkdir -p "/Users/jas/Documents/Shelf/desktop-cleanup-$(date +%Y-%m-%d)" # then move each item (see gotcha below for screenshots) ``` @@ -71,7 +71,7 @@ the actual filename bytes: ```python import os, shutil src_dir = '/Users/jas/Desktop' -dst_dir = '/Users/jas/Documents/Working Desktop/desktop-cleanup-2026-05-26' +dst_dir = '/Users/jas/Documents/Shelf/desktop-cleanup-2026-05-26' for f in os.listdir(src_dir): if f.startswith('Screenshot'): shutil.move(os.path.join(src_dir, f), os.path.join(dst_dir, f)) @@ -147,9 +147,9 @@ Wait for "Deleting" to clear before re-checking disk: until ! $SIMCTL runtime list | grep -q "Deleting"; do sleep 5; done ``` -### Working Desktop bulk +### Shelf bulk -`~/Documents/Working Desktop/` regularly grows past 15 GB. Look +`~/Documents/Shelf/` regularly grows past 15 GB. Look specifically for: - `-DISTROKID/` of any track that already shipped -- 2.51.2