Files
karim 961b3c0396 Snapshot: Wand/Öffnung Multi-Surface-Select + Z-Drag + Brüstungs-Mitnahme
Stable working state after a long iteration session. The plugin now supports:
- Multi-Surface-Select für alle Element-Typen (Türen/Fenster/Treppen/Tragwerk)
- Wand-Z-Drag → unbound mode (UK/OK-Override, Wand vom Geschoss entkoppelt)
- Wand-Z-Drag nimmt verknüpfte Öffnungen mit (Brüstung += delta_z via Idle-Pfad)
- Öffnungs-XY-Drag snapt direktional auf Wand-Tangente
- Öffnungs-Z-Drag passt Brüstung an (Fenster sofort sync, Tür deferred)
- Wand-Delete kaskadiert Öffnungen (deferred via Idle, robust gegen _Rotate/_Move)
- Source-Cascade beim Öffnungs-Delete (deferred analog Wand-Kaskade)
- Listener-Cleanup robust gegen _reset_panels.py Reload (Refs in
  _dossier_runtime_event_refs gespeichert, vor Re-Install deregistriert)
- _count_same_id_type filtert IsDeleted (verhindert Source-Duplikat-Bug bei Move)
- Frontend: Brüstungs-Slider für Tür ("Schwelle"), Flügel-Block nur bei Fenster

Plus aus früherer Phase dieser Session:
- Dossier-Launcher Auto-Load via Rhinos StartupCommands-XML
- Default-Pfad zeigt auf gebundeltes startup.py (out-of-the-box für neue User)
- Splash-Window beim Plugin-Load mit native macOS rounded corners
- Diverse Launcher-Verbesserungen (Brüstungs-Default, tauri.conf, capabilities)

Known issue: bei Multi-Select-Move mit vielen Sub-Volumen kann sporadisch
"Unable to transform" auftreten (Rhinos Move-Operation kollidiert mit Wand-
Regen). Tür-spezifischer Defer-Pfad mildert das, Fenster läuft sync.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 01:50:45 +02:00

105 lines
3.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# Build + sign Dossier-Launcher fuer den Updater, und emit latest.json.
#
# Voraussetzungen:
# - Private Key liegt unter ~/.tauri/dossier_updater.key
# (einmalig erzeugen mit:
# npx tauri signer generate -w ~/.tauri/dossier_updater.key)
# - Version wurde in src-tauri/tauri.conf.json + package.json hochgezaehlt
#
# Ablauf:
# 1) npx tauri build (mit Signing-Env)
# 2) liest die erzeugte .sig-Datei
# 3) schreibt latest.json im launcher-Root mit URLs auf Gitea-Release-Assets
#
# Danach manuell:
# - auf Gitea einen Release mit Tag <VERSION> erstellen
# - die .app.tar.gz und (optional) die .dmg als Assets hochladen
# - latest.json committen + auf main pushen
set -euo pipefail
cd "$(dirname "$0")/.."
KEY_PATH="${TAURI_SIGNING_PRIVATE_KEY_PATH:-$HOME/.tauri/dossier_updater.key}"
GITEA_REPO="https://git.kgva.ch/karim/DOSSIER"
# WICHTIG: `npx tauri ...` ohne Namespace zieht ausserhalb dieses Verzeichnisses
# das uralte tauri@0.15 von npm (das kein `signer` kennt). Wir nutzen den
# expliziten Paketnamen @tauri-apps/cli — der funktioniert von ueberall und
# auch innerhalb dieses Verzeichnisses, wo die devDependency ohnehin vorhanden ist.
TAURI_CLI="npx --yes @tauri-apps/cli"
if [ ! -f "$KEY_PATH" ]; then
echo "Private Key fehlt: $KEY_PATH" >&2
echo "Einmalig erzeugen mit:" >&2
echo " $TAURI_CLI signer generate -w $KEY_PATH" >&2
echo "und den public key (.pub) in src-tauri/tauri.conf.json -> plugins.updater.pubkey eintragen." >&2
exit 1
fi
VERSION=$(node -p "require('./src-tauri/tauri.conf.json').version")
PKG_VERSION=$(node -p "require('./package.json').version")
if [ "$VERSION" != "$PKG_VERSION" ]; then
echo "Version mismatch: tauri.conf.json=$VERSION package.json=$PKG_VERSION" >&2
exit 1
fi
ARCH=$(uname -m)
case "$ARCH" in
arm64|aarch64) PLATFORM_KEY="darwin-aarch64" ;;
x86_64) PLATFORM_KEY="darwin-x86_64" ;;
*) echo "Unsupported arch: $ARCH" >&2; exit 1 ;;
esac
echo "→ Build Dossier $VERSION ($PLATFORM_KEY)"
TAURI_SIGNING_PRIVATE_KEY="$(cat "$KEY_PATH")" \
TAURI_SIGNING_PRIVATE_KEY_PASSWORD="" \
$TAURI_CLI build
BUNDLE_DIR="src-tauri/target/release/bundle/macos"
TAR_GZ=$(ls "$BUNDLE_DIR"/*.app.tar.gz 2>/dev/null | head -n1 || true)
SIG_FILE="${TAR_GZ}.sig"
if [ -z "$TAR_GZ" ] || [ ! -f "$SIG_FILE" ]; then
echo "Bundle oder Signatur fehlt in $BUNDLE_DIR" >&2
exit 1
fi
ASSET_NAME=$(basename "$TAR_GZ")
ASSET_URL_NAME=$(printf '%s' "$ASSET_NAME" | sed 's/ /%20/g')
SIGNATURE=$(cat "$SIG_FILE")
PUB_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
DOWNLOAD_URL="$GITEA_REPO/releases/download/$VERSION/$ASSET_URL_NAME"
NOTES=${RELEASE_NOTES:-"Dossier $VERSION"}
cat > latest.json <<EOF
{
"version": "$VERSION",
"notes": $(node -e "process.stdout.write(JSON.stringify(process.argv[1]))" "$NOTES"),
"pub_date": "$PUB_DATE",
"platforms": {
"$PLATFORM_KEY": {
"signature": $(node -e "process.stdout.write(JSON.stringify(process.argv[1]))" "$SIGNATURE"),
"url": "$DOWNLOAD_URL"
}
}
}
EOF
echo
echo "✓ Build fertig"
echo " Bundle: $TAR_GZ"
echo " Signatur: $SIG_FILE"
echo " DMG: $(ls src-tauri/target/release/bundle/dmg/*.dmg 2>/dev/null | head -n1 || echo '(keine DMG gefunden)')"
echo " Platform: $PLATFORM_KEY"
echo " latest.json wurde im launcher-Root geschrieben."
echo
echo "Nächste Schritte:"
echo " 1) Auf Gitea Release mit Tag $VERSION erstellen und folgende Assets hochladen:"
echo " - $ASSET_NAME"
echo " - (optional) DMG für Erstinstallation"
echo " 2) latest.json committen + auf main pushen:"
echo " git add launcher/latest.json && git commit -m 'Release $VERSION' && git push origin main"