Zum Inhalt

Rezept-Authoring (Rezeptor)

Tiefenreferenz für recipe.yml, install_steps und Hooks.
Schnellstart & Muster (Portable, Installer, Steam, Trainer): ENTWICKLER.md.

Vorlagen: recipes/_template/, recipes/_template-installer/.


Architektur

recipes/<id>/
  recipe.yml          ← Metadaten + install_steps + uninstall:
  install.sh          ← recipe_hooks::load + recipe_install_steps::run
  launch.sh / validate.sh / repair.sh / kill.sh / uninstall.sh

core/
  recipe-hooks.sh           ← Einstieg (+ purge_recipe_data)
  recipe-install-steps.sh   ← führt install_steps aus
  recipe-<id>.sh            ← App-Logik (module:)
recipes/recipe.schema.json  ← Vertrag

uninstall.sh (Pflicht — vollständig)

Immer recipe_hooks::load minimal und recipe_hooks::purge_recipe_data (Desktop + DATA_ROOT + kanonischer data_root inkl. data_root.path).
Nicht nur prefix/ oder recipe.env löschen — sonst bleibt die GUI bei „installiert“.
Kein load kill in uninstall (Proton/Hang). Portable/Spielordner außerhalb von DATA_ROOT bleiben.

install.sh (immer dünn)

RECIPE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$RECIPE_DIR/../../core/recipe-hooks.sh"
recipe_hooks::load install
recipe_install_steps::run

install_steps (Pflicht)

install_steps:
  - prepare_source
  - require_portable   # portable
  - prefix
  - winetricks         # aus winetricks: in yml
  - winetricks: [corefonts, gdiplus]
  - module: recipe_meine_app::post_deploy
  - copy_asset:
      src: assets/foo.sh
      dest: "{data_root}/bin/foo.sh"
  - run_installer      # installer_offline
  - win10
  - fonts_registry
Schritt Rolle
prepare_source Quelle → RECIPE_WORK_ROOT (Ordner/Archiv/Installer)
require_portable erwartet portable_folder
prefix Proton + Prefix
winetricks Pakete (yml oder Liste); vcrun*/dotnet*/win10 speziell
deploy_graphics Proton-Grafik-DLLs
run_installer Setup.exe
module recipe_*::funktion aus Core
copy_asset Datei deployen
env_set Key in portable.env / Datei
stabilize_prefix / win10 / fonts_registry Hilfsschritte

Parser: scripts/recipe-yaml-read.py · Schema: scripts/recipe-schema-check.py (embedded; optional jsonschema).


recipe.yml Pflicht

id, name, icon, data_root, runtime, install_type, source_kind, fix_kind, Hooks (inkl. uninstall), install_steps.

Icon (Pflicht)

icon: "{repo}/images/<id>-icon.png"
  • Datei unter images/ (PNG oder SVG), empfohlen 256×256
  • GUI: Sidebar + Header; Notify kann dasselbe Icon nutzen
  • Lint prüft: Feld gesetzt und Datei existiert
  • Quelle z. B. EXE-Icon (wrestool/icotool) oder Steam-Library-Art

Empfohlen

Feld Rolle
schema_version Format-Version (aktuell 1; fehlend = 1)
author Anzeige in der Übersicht
notify_title Desktop-Notify -a / Titel; sonst name
version_label / version_guaranteed Getestete Version (Anzeige + Garantie)
version_detect Pflicht bei version_guaranteed — deklarative Erkennung (siehe unten)
steam_appid Steam AppID: Trainer-Zielordner oder Spielordner bei deploy_mode: link
steam_target_folder Unterordner im Spielverzeichnis (Default Trainer; nur bei copy/Trainer)

Notify-Titel: manuell (notify_title) oder Fallback name — kein Auto-Detect aus EXE-Namen.

Versionserkennung (version_detect)

Rezeptor prüft die gewählte Quelle gegen version_guaranteed. Die Regeln stehen im Rezept — der Launcher liefert die Engine.

version_guaranteed: "22.0.0.35"
version_detect:
  - kind: json_key
    glob: "products/PHSP/application.json"
    key: ProductVersion
  - kind: pe_field
    glob: "*.exe"
    field: FileVersion
kind Zweck
json_key JSON-Datei (glob + key)
text_regex Textzeile (glob + regex mit Gruppe)
path_regex Ordner-/Dateiname
pe_field PE FileVersion / ProductVersion
pe_contains Byte-Marker in EXE → value (z. B. Trainer-Familie)
filename_regex Dateiname → value
stack Mehrere Dateien + INI-Keys (Steam+Fix)

Signale werden der Reihe nach versucht; erstes Ergebnis gewinnt. stack kann bei Teilerkennung eine Abweichungs-Meldung liefern.

Lint: version_guaranteed ohne version_detectERROR.

Info-Layout (info.de.txt / info.en.txt)

# <Titel>

Autor: …
Version: …

## Kurzbeschreibung

## Voraussetzungen
• …

## Installation
1. …

## Nutzung
• …

## Hinweise
• …

Schreibstil: professionell und klar, locker lesbar, Business-Ton — auch für Einsteiger verständlich. Struktur und Aussage beibehalten; nur Formulierungen glätten. Fachbegriffe nur wenn nötig, kurz erklären. Keine inhaltliche Aufblähung.

Schema: recipes/recipe.schema.json.

Portable:

install_type: portable_launch
deploy_mode: copy
source_kind: folder
source_formats: zip,tar.gz,tgz,7z,rar
target_default: "~/Dokumente/Meine App"
winetricks: [win10, vcrun2019]
install_steps:
  - prepare_source
  - require_portable
  - prefix
  - winetricks

Installer (entspricht recipes/_template-installer/):

install_type: installer_offline
source_kind: folder          # GUI wählt Setup-Ordner / .exe
source_label: "Ordner mit Offline-Installer (setup.exe / Set-up.exe)"
winetricks: [win10, vcrun2015]
install_steps:
  - prepare_source
  - prefix
  - winetricks
  - run_installer

Optional (selten): source_kind: fixed_path + installer_dir: "{repo}/installer" für fest verdrahtete Repo-Pfade — die mitgelieferte Vorlage nutzt das nicht.

Steam-Titel mit externem Fix (BYOS, Launch aus Rezeptor):

Für Spiele, die im Steam-Ordner bleiben und nur einen selbst eingelegten Fix brauchen (z. B. house-of-ashes). Kein Fix-Vertrieb im Repo — validate prüft Dateien read-only, Launch setzt Proton + WINEDLLOVERRIDES / SteamAppId. Vorlage: _template-steam-game/.

Wichtig: kein neuer Steam-Eintrag (Start nur Rezeptor); FakeAppId oft 480/Spacewar (muss in Steam installiert sein); Deinstall entfernt nur Rezeptor-Wrapper, nicht Spiel/Fix.

install_type: game_portable
deploy_mode: link          # kein Kopieren; Dialog ohne Zielordner
source_kind: folder
steam_appid: "1281590"     # echte Steam-AppID (compatdata)
steam_fake_appid: "480"    # oft Spacewar — muss in Steam installiert sein
steam_fix_win64_rel: "Binaries/Win64"   # relativ zum Spielordner
steam_fix_required:
  - OnlineFix64.dll
  - OnlineFix.ini
steam_api_rel: ""          # optional, relativ zum Spielordner
runtime: proton-ge
fix_kind: none
exe_glob: "HouseOfAshes.exe"
install_steps:
  - emit_log_paths         # Logik in install.sh / validate.sh / launch.sh
Feld Rolle
steam_appid Echte AppID → Steam-Spielordner / compatdata
steam_fake_appid FakeAppId in Online-Fix-INI (häufig 480)
steam_fix_win64_rel Unterordner mit Fix-DLLs/INI
steam_fix_required Pflicht-Dateinamen für validate
steam_api_rel Optionaler steam_api64.dll-Pfad

Details: STEAM-WRAPPER.md.

Trainer (za4-trainer) Steam+Fix (house-of-ashes)
Quelle einzelne .exe Spielordner
Deploy copy in Zielunterordner link (Pfad merken)
Prefix Steam compatdata des Spiels dasselbe
Validate EXE + Wrapper EXE + Fix-Dateien + INI-AppIDs
Uninstall nur Rezeptor-Dateien nur Rezeptor-State; Spiel/Fix bleiben

Tokens: {repo}, {data_root}, {recipe}, ~.


Qualität / CI

./scripts/recipe-lint.sh      # Hooks ERROR, install_steps, Schema
./scripts/recipe-manifest.sh
make recipe-lint              # CI
REZEPTOR_DEV=1 ./setup.sh

Runtime-Helfer (Pflicht in Custom-/Repair-Code)

Aufgabe Nur so Nie
Winetricks recipe_winetricks::run (Retry nur Exit 139) Direktes winetricks, Subshell-Hacks
Windows 10 recipe_win10::ensure (Registry) winetricks winecfg / doppeltes win10+settings win10
Grafik/DXVK wine_runtime::deploy_proton_graphics_dlls winetricks dxvk
Prefix recipe_prefix::ensure System-Wine-Fallback

Verboten (Lint ERROR): winetricks dxvk, System-Wine-Fallback, doppeltes win10.
API-Details: CORE-API.md.


Grafik-Apps — GPU

DXVK nur über wine_runtime::deploy_proton_graphics_dllskein winetricks-dxvk.


Kernmodule

Vollständige API: CORE-API.md. Kurz:

Datei Zweck
recipe-hooks.sh Hook-Einstieg + purge_recipe_data
recipe-install-steps.sh Deklarative Installation
recipe-install.sh prepare_source / apply_fix
recipe-prefix.sh / recipe-winetricks.sh / recipe-win10.sh Prefix, Winetricks (Retry 139), Win10
recipe-validate.sh OK/FAIL/WARN-Helfer
recipe-<id>.sh App-Logik
wine-runtime.sh Proton-GE + Grafik-DLLs

Lifecycle: VALIDATE-REPAIR.md · UNINSTALL.md · LOG-PROTOCOL.md