WAS: `npm run klick` startet das ECHTE Rippy (Electron, Haupt, Kern, Fenster, Datenbank) mit eigenem Profil (--profil, --klick-smoke: ohne Tray, Updater, Toasts), einem nachgebauten Laufwerk (RIPPY_FAKE_LAUFWERK) und nachgebauten Werkzeugen (bau/klick/fake-*.cjs) — und klickt sich durch: Rippen → Dialog → Sprachen je Titel (jpn statt deu) → Rollen auf Folge → Staffel 1, ab Folge 3 → Vorschau → Rip → Warteschlange → Kompression → Ablage als S01E03/S01E04 unter Serien\…\Season 01 → Einstellungen/Roh-Dateien → Roh loeschen → Ereignisse. Bilder liegen in beweise/klick/. Die Naht dafuer (kern/werkzeuge/aufruf.ts): Zeigt ein Werkzeug-Pfad auf ein Node-Skript, laeuft es ueber die eigene Laufzeit (ELECTRON_RUN_AS_NODE) — fuer EXE-Pfade aendert sich nichts. WARUM: Beide Fehler vom 01.09.2026 waren Verkabelung; 261 Unit-Tests sahen keinen. Der Klick-Beweis haette beide gefunden. NEBENBEFUND: Die CSP blockte eingebettete Schrift-Teile (data:-Fonts der fontsource-Pakete) — Konsolenfehler im gebauten Fenster, jetzt font-src. Dazu test/messung.spuren.test.ts: HandBrake-Scan einer echten Roh-Datei auf Verlangen (RIPPY_MESSUNG_MKV). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
38 lines
1.7 KiB
TypeScript
38 lines
1.7 KiB
TypeScript
// EINE Stelle, an der Werkzeuge gestartet werden (5.4.0) — mit einer Naht
|
|
// für den Klick-Beweis (bau/klick-smoke.mjs): Zeigt der eingestellte
|
|
// Werkzeug-Pfad auf ein Node-Skript (.cjs/.js), läuft es über die eigene
|
|
// Node-Laufzeit (ELECTRON_RUN_AS_NODE, Electron-Doku »Environment
|
|
// Variables«) statt als EXE. So klickt der Beweis durch das ECHTE Programm
|
|
// — Fenster, Kern, Datenbank, Warteschlange — nur makemkvcon und HandBrake
|
|
// sind nachgebaut. Für echte EXE-Pfade ändert sich nichts.
|
|
//
|
|
// Warum nicht einfach eine .cmd: Node weigert sich seit 18.20/20.12,
|
|
// .bat/.cmd ohne Shell zu starten (CVE-2024-27980) — und mit Shell wären
|
|
// Pfade mit Leerzeichen wieder eine Falle.
|
|
import { spawn } from 'node:child_process'
|
|
|
|
export function istSkript(programm: string): boolean {
|
|
const p = programm.toLowerCase()
|
|
return p.endsWith('.cjs') || p.endsWith('.mjs') || p.endsWith('.js')
|
|
}
|
|
|
|
/** Programm + Argumente, so wie spawn sie bekommen soll. */
|
|
export function werkzeugStart(
|
|
programm: string,
|
|
args: readonly string[],
|
|
umgebung: NodeJS.ProcessEnv = process.env,
|
|
): { programm: string; args: string[]; env: NodeJS.ProcessEnv } {
|
|
if (!istSkript(programm)) return { programm, args: [...args], env: umgebung }
|
|
return {
|
|
programm: process.execPath,
|
|
args: [programm, ...args],
|
|
env: { ...umgebung, ELECTRON_RUN_AS_NODE: '1' },
|
|
}
|
|
}
|
|
|
|
/** spawn mit der Naht — dieselbe Signatur, dieselben Typen. */
|
|
export const werkzeugSpawn: typeof spawn = ((programm: string, args: readonly string[], optionen: Record<string, unknown>) => {
|
|
const start = werkzeugStart(programm, args)
|
|
return spawn(start.programm, start.args, { ...optionen, env: start.env })
|
|
}) as typeof spawn
|