diff --git a/INSTALLATION.md b/INSTALLATION.md index a56a787..a52be3f 100644 --- a/INSTALLATION.md +++ b/INSTALLATION.md @@ -1,33 +1,8 @@ -# Omarchy Citizen 0.6.4 – Plug-&-Play-Installation +# Omarchy Citizen 0.7.0 – Rundum-Sorglos -## Ziel +## Installation -Der Nutzer soll Star Citizen unter Omarchy benutzen können, ohne Linux administrieren zu müssen. - -Im normalen Alltag sind nur drei Dinge wichtig: - -1. **EINRICHTEN & STARTKLAR MACHEN** bzw. **STAR CITIZEN STARTEN** -2. **Problem beheben** -3. **Support-Paket erstellen** - -Wine-Runner, DXVK, einzelne Reparaturschritte, Logs und NGL befinden sich unter -**Erweiterte Optionen**. - ---- - -## 1. Plugin installieren - -### Mausfreundlich - -Entpacke `omarchy-citizen-0.6.0.zip`. - -Im entpackten Ordner liegt: - -`INSTALLIEREN.sh` - -Führe diese Datei über deinen Dateimanager als Programm aus. - -Falls der Dateimanager Skripte nicht direkt ausführt, bleibt der Terminal-Fallback: +Entpacken und einmal ausführen: ```bash ./INSTALLIEREN.sh @@ -39,267 +14,73 @@ oder: ./install.sh ``` -Der Plugin-Installer benötigt kein `sudo` und schreibt nur nach: +Danach übernimmt **Autopilot**. + +## Was automatisch aktuell gehalten wird + +Ohne weitere Pflege des Nutzers: + +- Omarchy Citizen selbst (wenn als Git-Plugin installiert) +- offizieller LUG Helper als AppImage +- stabiler LUG-Wine-Runner +- DXVK +- Auswahl des verwalteten Wine-Runners im Start-Script + +Der Wartungstimer läuft alle sechs Stunden. + +## Sicherheitsmechanismus für Wine Updates + +Ein neuer Wine-Runner wird nicht einfach installiert. + +Omarchy Citizen baut zuerst einen temporären Wine-Prefix und verlangt erfolgreich: ```text -~/.config/omarchy/plugins/local.omarchy-citizen/ +wineboot +drive_c +system.reg +user.reg +%APPDATA% ``` -Nach der Installation erscheint **✦SC** in der Omarchy-Leiste. +Erst danach wird der Runner aktiviert. ---- +Damit hätte der Fehler, den wir während der Entwicklung gesehen haben +(`drive_c` fehlt / `%AppData% returned empty string`), bereits *vor* der echten +Star-Citizen-Installation den Autopilot-Test gestoppt. -## 2. Erstes Setup +## Warum kein AUR-LUG-Paket mehr? -Klicke: +Der offizielle LUG Helper wird als AppImage verwaltet. Dadurch hängt der +Star-Citizen-Workflow nicht mehr davon ab, ob das AUR-Paket, dessen Winetricks +oder dessen GUI-Abhängigkeiten gerade passend installiert sind. -**✦SC → EINRICHTEN & STARTKLAR MACHEN** +Bestehende AUR-LUG-Installationen dürfen vorhanden bleiben; Omarchy Citizen +bevorzugt jedoch seine eigene verwaltete AppImage-Kopie. -Omarchy Citizen übernimmt danach soweit möglich selbst: +## Systemupdates -- benötigte Systempakete prüfen/installieren -- `zenity`, `polkit`, `cabextract`, `unzip` -- LUG Helper aus dem AUR installieren -- LUG Preflight Check starten -- Star-Citizen-/RSI-Launcher-Einrichtung starten -- vorhandenen Wine-Prefix erkennen -- Start-Script erkennen/reparieren +Omarchy Citizen installiert absichtlich keine dauerhafte passwortlose +Pacman-/sudo-Regel. -Für Paketinstallationen kann einmal ein sichtbares Omarchy-Terminal erscheinen. -Das ist absichtlich so, damit Passwortabfragen sicher und nachvollziehbar bleiben. -Der Nutzer muss dort keine Paketnamen oder Linux-Befehle kennen. +Omarchy-System-, Kernel- und GPU-Treiberupdates bleiben bei: ---- - -## 3. Normaler Alltag - -Wenn das Panel **FLIGHT READY** zeigt: - -**✦SC → STAR CITIZEN STARTEN** - -Das Plugin verwendet weiterhin das vom LUG Helper verwaltete `sc-launch.sh`. - ---- - -## 4. Problem beheben - -Klicke: - -**✦SC → Problem beheben** - -Der Assistent prüft zuerst automatisch, ob etwas offensichtlich fehlt. - -Wenn das System grundsätzlich eingerichtet ist, fragt er nur nach dem Symptom: - -- Automatisch prüfen -- RSI Launcher startet nicht / ist kaputt -- Star Citizen startet nicht -- Grafik / Performance / Abstürze -- NGL macht Probleme -- Problem unklar - -Dahinter werden die passenden LUG-Helper-Funktionen aufgerufen. - -Der Nutzer muss keine Begriffe wie Wine-Prefix, DXVK oder `vm.max_map_count` kennen. - ---- - -## 5. Permanentes Debug-Log - -Omarchy Citizen protokolliert seine eigenen Aktionen dauerhaft unter: - -```text -~/.local/state/omarchy-citizen/omarchy-citizen.log +```bash +omarchy update -y ``` -Darin stehen unter anderem: +Das ist der von Omarchy vorgesehene vollständige Updatepfad. Die Star-Citizen- +Komponenten selbst werden davon unabhängig durch Autopilot gepflegt. -- Plugin-Version -- aufgerufene Plugin-Aktionen -- Start-/Reparaturvorgänge -- LUG-Helper-Aufrufe -- Setup-/Update-Abläufe -- Fehlermeldungen des Plugins +## Support -Das lokale Roh-Log kann in **Erweiterte Optionen → Plugin-Debuglog öffnen** -angesehen werden. - -Das Roh-Log wird nicht automatisch hochgeladen oder versendet. Ab ungefähr 4 MiB wird es automatisch gekürzt; die neuesten ungefähr 2 MiB bleiben erhalten. - ---- - -## 6. Support-Paket für Nutzer - -Klicke: +Bei einem Fehler: **✦SC → Support-Paket erstellen** -Das Plugin erzeugt automatisch eine Datei wie: +Das Paket enthält zusätzlich: -```text -~/Downloads/Omarchy-Citizen-Support-OC-20260831-123456-abcdef.tar.gz -``` - -Zusätzlich wird eine **Support-ID** angezeigt. - -### Standardmäßig enthalten - -- Omarchy Citizen Status -- Plugin-Version -- `omarchy debug --no-sudo --print` -- Kernel/Desktop-Informationen -- GPU/Vulkan-Zusammenfassung -- RAM -- Dateisystemtyp und freier Speicher -- relevante Paketversionen -- Star-Citizen-Kernel-Limits -- Plugin-Validierung -- letzte Omarchy-Citizen-Debugmeldungen -- letzter Omarchy-Update-Logauszug, falls vorhanden -- Star-Citizen-/LUG-Pfadstatus -- begrenzter `sc-launch.log`-Auszug -- bereinigte Kopie des LUG-Start-Scripts -- Go-Updater-Status (Git/ZIP, Auto-Update, Commit-Stand) -- bereinigter Updater-Logauszug - -### Nicht standardmäßig enthalten - -- Browserdaten -- SSH-Schlüssel -- Passwortdateien -- vollständige Star-Citizen-Game.log-Dateien -- vollständige EAC-Logs -- Dateien aus dem RSI-Account/Browserprofil - -### Automatische Maskierung beim Export - -Das Support-Paket versucht folgende Daten zu maskieren: - -- Home-Pfad -- Benutzername -- Hostname -- E-Mail-Adressen -- IPv4-Adressen -- MAC-Adressen -- Bearer-/JWT-Tokens -- typische `token`, `session`, `cookie`, `password`, `secret`-Werte -- typische Auth-Queryparameter in URLs - -Die Maskierung ist eine Best-Effort-Funktion. Nutzer können das Archiv vor dem -Versenden selbst öffnen und prüfen. - ---- - -## 7. Updates - -### Plugin selbst - -0.6.0 enthält ein statisch gebautes Go-Backend. Es erkennt automatisch, ob Omarchy -Citizen als Git-Plugin oder aus einem ZIP installiert wurde. - -Bei einer Git-Installation gibt es unter **Erweiterte Optionen → Plugin-Updates**: - -- **Plugin-Update prüfen** -- **Plugin jetzt aktualisieren** -- **Auto-Updates einschalten/ausschalten** -- **Updater-Log öffnen** - -Beim Aktivieren von Auto-Updates wird das aktuelle Git-`origin` als vertrauenswürdige -Quelle gespeichert. Ein systemd-User-Timer prüft ungefähr alle sechs Stunden mit einer -zufälligen Verzögerung von bis zu 15 Minuten. - -Ein automatisches Update wird verweigert, wenn: - -- das Git-Remote nachträglich geändert wurde -- lokale Änderungen im Plugin-Checkout liegen -- der lokale Branch vom Upstream abgewichen ist -- bereits ein anderes Plugin-Update läuft -- Omarchys Plugin-Validierung fehlschlägt - -Das Backend baut keinen eigenen Plugin-Paketmanager. Die eigentliche Aktualisierung läuft -über Omarchys offiziellen nicht-interaktiven Weg: - -```bash -omarchy plugin update local.omarchy-citizen --yes -``` - -Dadurch bleiben Fast-Forward-Prüfung, Validierung und Rollback bei Omarchy. - -Bei der aktuellen ZIP-Installation zeigt das Backend bewusst **ZIP / nicht Git-verwaltet**. -Es lädt dann nichts aus einer erfundenen oder unbekannten Quelle herunter. Sobald das -Projekt als GitHub-/Git-Repository veröffentlicht und mit `omarchy plugin add` installiert -wird, erkennt das Backend `origin` automatisch. - -### LUG und Omarchy - -Zusätzlich befinden sich unter **Erweiterte Optionen**: - -- LUG Update prüfen -- LUG aktualisieren -- Omarchy aktualisieren - -Systempakete werden weiter über den normalen `omarchy update`-Weg aktualisiert. -Dadurch bleiben Omarchy-Migrationen und der vorgesehene Update-Ablauf erhalten. - -### Updater-Dateien - -```text -~/.config/omarchy-citizen/updater.json -~/.local/state/omarchy-citizen/updater.log -~/.local/lib/omarchy-citizen/omarchy-citizen-backend -``` - -Der Updater läuft nicht als dauerhafter Webserver. Der systemd-User-Timer startet ihn nur -für die jeweilige Prüfung. - ---- - -## 8. NGL - -NGL bleibt unter **Erweiterte Optionen** und ist deutlich als experimentell markiert. - -Der normale Star-Citizen-Betrieb ist nicht von NGL abhängig. - ---- - -## 9. Supportablauf für dich als Plugin-Betreuer - -Wenn ein Nutzer ein Problem meldet, kannst du ihn bitten: - -1. **✦SC** öffnen -2. **Support-Paket erstellen** klicken -3. dir die erzeugte `.tar.gz` schicken -4. die angezeigte Support-ID nennen - -Damit brauchst du im ersten Supportkontakt normalerweise keine Terminalbefehle -vom Nutzer anzufordern. - - -## Hotfix 0.6.4 – Setup-Button - -Version 0.6.4 ändert die Ausführung der Panel-Aktionen grundlegend. - -Beim Klick auf **EINRICHTEN & STARTKLAR MACHEN** wird die Aktion nun direkt als -Quickshell-Prozess gestartet. Das Panel zeigt sofort **WIRD GESTARTET**. - -Wenn der Start fehlschlägt, bleibt das Panel offen und zeigt den Fehler an. -Außerdem wird der fehlgeschlagene Terminalstart in -`~/.local/state/omarchy-citizen/omarchy-citizen.log` protokolliert und landet -im Support-Paket. - -Nach der Installation wird der Omarchy-Shellprozess einmal neu gestartet, damit -die neue QML-Version sicher aktiv ist. - -## 0.6.4 – unvollständiger Wine-Prefix - -Ein Ordner wie `~/Games/star-citizen` gilt jetzt erst dann als fertiger Wine-Prefix, -wenn mindestens `drive_c`, `system.reg` und `user.reg` existieren. - -Wenn nur Runner/Teildateien vorhanden sind, zeigt das Plugin **SETUP REPAIR**. - -Bei **SETUP SICHER REPARIEREN** wird der alte Ordner nicht gelöscht. Ohne erkannte -`Data.p4k`-Spieldatei wird er nach `star-citizen-incomplete-` umbenannt, -die LUG-Zielkonfiguration wird gesichert und der offizielle LUG-Installer startet neu. - -Das Support-Paket enthält jetzt außerdem den neuesten detaillierten -`lughelper-install-*.log`, damit Wine-/Winetricks-Fehler analysiert werden können. +- Autopilot-Status +- verwaltete LUG-/Wine-/DXVK-Versionen +- Wine-Selbsttest +- Maintenance-Ergebnis +- Updater-Log diff --git a/INSTALLIEREN.sh b/INSTALLIEREN.sh index 404d21e..3c44a2a 100644 --- a/INSTALLIEREN.sh +++ b/INSTALLIEREN.sh @@ -49,6 +49,7 @@ omarchy-shell shell rescanPlugins >/dev/null 2>&1 || true "$HOME/.local/lib/omarchy-citizen/omarchy-citizen-backend" install-service >/dev/null 2>&1 || true omarchy plugin enable "$PLUGIN_ID" >/dev/null 2>&1 || true +"$HOME/.local/lib/omarchy-citizen/omarchy-citizen-backend" autopilot enable >/tmp/omarchy-citizen-autopilot-install.log 2>&1 || true omarchy bar move "$PLUGIN_ID" --section right >/dev/null 2>&1 || true # QML hot-reload is currently unreliable for third-party bar plugins. diff --git a/Panel.qml b/Panel.qml index c735690..b058ad0 100644 --- a/Panel.qml +++ b/Panel.qml @@ -12,7 +12,7 @@ Panel { property var anchorItem: null property var hostWidget: null - property string pluginVersion: "0.6.4" + property string pluginVersion: "0.7.0" property string health: "checking" property string depsState: "checking" property string depsMissing: "" @@ -34,6 +34,11 @@ Panel { property string pluginUpdate: "unavailable" property string pluginLocalCommit: "" property string pluginRemoteCommit: "" + property string autopilot: "false" + property string managedLUGVersion: "" + property string managedWineVersion: "" + property string managedDXVKVersion: "" + property string maintenanceResult: "" property string actionStatus: "" property string actionError: "" property string actionKind: "" @@ -97,7 +102,7 @@ Panel { values[lines[i].slice(0, p)] = lines[i].slice(p + 1) } - pluginVersion = values.plugin_version || "0.6.4" + pluginVersion = values.plugin_version || "0.7.0" health = values.health || "setup" depsState = values.deps || "missing" depsMissing = values.deps_missing || "" @@ -117,6 +122,11 @@ Panel { pluginUpdate = values.plugin_update || "unavailable" pluginLocalCommit = values.plugin_local_commit || "" pluginRemoteCommit = values.plugin_remote_commit || "" + autopilot = values.autopilot || "false" + managedLUGVersion = values.managed_lug_version || "" + managedWineVersion = values.managed_wine_version || "" + managedDXVKVersion = values.managed_dxvk_version || "" + maintenanceResult = values.maintenance_result || "" } function stateIcon(state) { @@ -160,6 +170,7 @@ Panel { } function headline() { + if (health === "ready" && root.autopilot === "true") return "FLIGHT READY · AUTOPILOT" if (health === "ready") return "FLIGHT READY" if (health === "recover-prefix") return "SETUP REPAIR" if (health === "repair") return "REPAIR AVAILABLE" @@ -523,9 +534,10 @@ Panel { Text { width: parent.width - text: "Version " + root.pluginVersion + " · LUG " + - (root.helperVersion !== "" ? root.helperVersion : "nicht eingerichtet") + - " · Plugin: " + (root.pluginManaged === "git" ? (root.pluginAuto === "true" ? "Auto" : "Git") : "ZIP") + text: "Version " + root.pluginVersion + + " · Autopilot " + (root.autopilot === "true" ? "AKTIV" : "aus") + + " · LUG " + (root.managedLUGVersion !== "" ? root.managedLUGVersion : "—") + + " · Wine " + (root.managedWineVersion !== "" ? root.managedWineVersion : "—") color: root.muted font.family: root.uiFont font.pixelSize: Style.font.caption @@ -599,6 +611,26 @@ Panel { PanelSeparator { foreground: root.barForeground } + StatusLine { + label: "Autopilot" + state: root.autopilot === "true" ? "ready" : "warning" + value: root.autopilot === "true" + ? "aktiv · Wartung alle 6 Stunden" + : "nicht aktiviert" + } + + StatusLine { + label: "Managed Wine" + state: root.managedWineVersion !== "" ? "ready" : "unknown" + value: root.managedWineVersion !== "" ? root.managedWineVersion : "wird beim Setup geladen" + } + + StatusLine { + label: "Managed DXVK" + state: root.managedDXVKVersion !== "" ? "ready" : "unknown" + value: root.managedDXVKVersion !== "" ? root.managedDXVKVersion : "nach Prefix-Setup" + } + Text { text: "PLUGIN-UPDATES" color: root.accent @@ -699,11 +731,11 @@ Panel { Button { width: setupGrid.cellWidth - text: "LUG aktualisieren" + text: "Gaming-Stack aktualisieren" foreground: root.barForeground fontFamily: root.uiFont bordered: true - onClicked: root.runAction("update-helper") + onClicked: root.runAction("autopilot-maintain") } Button { @@ -726,11 +758,11 @@ Panel { Button { width: setupGrid.cellWidth - text: "Wine-Runner" + text: "Wine-Selbsttest" foreground: root.barForeground fontFamily: root.uiFont bordered: true - onClicked: root.runAction("runners") + onClicked: root.runAction("wine-doctor") } Button { diff --git a/README.md b/README.md index 19b4c44..03a9ae8 100644 --- a/README.md +++ b/README.md @@ -1,107 +1,70 @@ -# Omarchy Citizen 0.6.4 +# Omarchy Citizen 0.7.0 -A plug-and-play Star Citizen control panel for Omarchy. +## Rundum-Sorglos / Autopilot -## Design goal +Omarchy Citizen 0.7.0 changes the architecture from "frontend for packages the +user maintains" to "self-maintaining Star Citizen appliance". -**Play Star Citizen, don't administer Linux.** +Autopilot manages the complete user-space gaming stack: -The default UI deliberately exposes only: +- Omarchy Citizen plugin updates (for clean Git-managed installs) +- official Star Citizen LUG Helper **AppImage** +- stable `lug-wine-tkg-git` Wine runner +- DXVK +- Wine prefix health testing +- launch-script Wine runner selection +- repair / recovery +- support logs -- Setup / Start -- Guided repair -- Create support bundle +The LUG Helper AppImage is preferred over the AUR package. Current LUG releases +bundle their GUI/runtime dependencies, reducing the amount of Arch package +knowledge required from the player. -Advanced Wine/DXVK/LUG/NGL controls remain available behind an advanced section. +### Update model -## 0.6.0 highlights +A systemd user timer runs every six hours. Each candidate Wine runner is tested +in a throw-away Wine prefix before it can become the active runner. The test +requires: -- one primary action that adapts to current system state -- guided first-time setup -- symptom-based repair assistant -- persistent plugin debug log -- one-click sanitized support bundle -- support ID for remote troubleshooting -- Omarchy's native `omarchy debug --no-sudo --print` included in support bundles -- advanced controls hidden by default -- optional NGL remains isolated from the normal launcher path -- Go-based plugin update backend with Git remote pinning -- optional automatic updates via systemd user timer -- updater status/log included in support bundles +- successful `wineboot` +- `drive_c` +- `system.reg` +- `user.reg` +- a valid `%APPDATA%` response -## Local debug log +If an upstream runner fails that test, the previous working runner stays active. + +DXVK is only changed while the Star Citizen Wine prefix is not in use. Existing +DLLs are backed up before replacement. + +### What Autopilot deliberately does not bypass + +Kernel, GPU driver and base Omarchy package upgrades still belong to Omarchy's +blessed `omarchy update` pipeline. Omarchy Citizen does not install a passwordless +pacman/sudo backdoor. + +That boundary lets the Star Citizen stack remain self-maintaining without giving +a third-party QML plugin permanent unattended root package-management rights. + +## Local state + +Managed components: ```text -~/.local/state/omarchy-citizen/omarchy-citizen.log +~/.local/share/omarchy-citizen/vendor/ +├── lug-helper/ +├── wine/ +└── dxvk/ ``` -The log rotates automatically at roughly 4 MiB and keeps the newest ~2 MiB. - -## Support bundle - -One click creates: +Logs: ```text -~/Downloads/Omarchy-Citizen-Support-.tar.gz +~/.local/state/omarchy-citizen/ +├── omarchy-citizen.log +└── updater.log ``` -The exported data is sanitized on a best-effort basis before packaging. - -See [`INSTALLATION.md`](INSTALLATION.md) for details. - ## License MIT. - -## Go update backend - -The bundled static Go binary lives at: - -```text -backend/bin/omarchy-citizen-backend -``` - -For Git-managed Omarchy installations it checks the checkout and delegates actual -updates to Omarchy's native `omarchy plugin update local.omarchy-citizen --yes`. -Automatic updates are opt-in and run through a systemd user timer roughly every six -hours. The Git `origin` present when auto-update is enabled is pinned as the trusted -remote; unattended updates stop if that remote changes or the checkout is dirty. - -See [`backend/README.md`](backend/README.md) and [`GIT_DISTRIBUTION.md`](GIT_DISTRIBUTION.md). - - -## 0.6.4 hotfix - -- primary/setup actions now run through a Quickshell `Process` instead of fire-and-forget `bar.run` -- the panel shows `WIRD GESTARTET` immediately after a click -- startup failures stay visible in the panel instead of silently closing it -- terminal launch has a monitored fallback path and logs immediate launcher failures -- installers restart the Omarchy shell after QML changes to avoid stale third-party plugin QML - -## 0.6.4 UI / setup hotfix - -- fixed `undefined` in reusable status rows and chips -- panel no longer inherits the bar's theme font; uses a neutral system sans font -- first-time setup keeps the panel open and shows a visible status message -- setup terminal is launched directly through `xdg-terminal-exec`/UWSM with separate argv -- failed package/AUR setup remains visible instead of the terminal disappearing immediately - -## 0.6.4 incomplete-prefix recovery - -- a configured folder is no longer considered a valid Wine prefix merely because it exists -- valid prefixes require `drive_c`, `system.reg`, and `user.reg` -- half-created prefixes are shown as `unvollständig` -- one-click recovery renames the incomplete directory to a timestamped backup instead of deleting it -- stale LUG target config files are backed up before a clean reinstall -- existing `Data.p4k` is never moved by Omarchy Citizen; migration is delegated to the LUG Helper -- support bundles now include the newest `/tmp/lughelper-install-*.log` and a prefix-health report - -## 0.6.4 visible recovery hotfix - -- incomplete-prefix recovery no longer spawns a hidden second background process -- `SETUP SICHER REPARIEREN` opens a visible terminal directly -- the incomplete prefix is automatically renamed to a timestamped backup; it is never deleted -- LUG reinstall output remains visible and is logged at the same time -- if recovery fails, the terminal stays open with the error code and support instructions -- guided setup, repair assistant, support bundle creation and NGL file selection no longer use nested `nohup` wrappers -- updater status `blocked-dirty` is displayed as the user-friendly `lokale Änderungen · Update pausiert` diff --git a/backend/bin/omarchy-citizen-backend b/backend/bin/omarchy-citizen-backend index 0b03aa8..435ca53 100644 Binary files a/backend/bin/omarchy-citizen-backend and b/backend/bin/omarchy-citizen-backend differ diff --git a/backend/cmd/omarchy-citizen-backend/main.go b/backend/cmd/omarchy-citizen-backend/main.go index 405dc06..bb2227c 100644 --- a/backend/cmd/omarchy-citizen-backend/main.go +++ b/backend/cmd/omarchy-citizen-backend/main.go @@ -16,34 +16,43 @@ import ( ) const ( - appVersion = "0.6.4" + appVersion = "0.7.0" pluginID = "local.omarchy-citizen" ) type Config struct { - AutoApply bool `json:"auto_apply"` - TrustedRemote string `json:"trusted_remote,omitempty"` - LastCheck string `json:"last_check,omitempty"` - LastUpdate string `json:"last_update,omitempty"` - LastResult string `json:"last_result,omitempty"` + AutoApply bool `json:"auto_apply"` + AutoMaintain bool `json:"auto_maintain"` + TrustedRemote string `json:"trusted_remote,omitempty"` + LastCheck string `json:"last_check,omitempty"` + LastUpdate string `json:"last_update,omitempty"` + LastResult string `json:"last_result,omitempty"` + LastMaintenance string `json:"last_maintenance,omitempty"` + MaintenanceResult string `json:"maintenance_result,omitempty"` } type Status struct { - BackendVersion string `json:"backend_version"` - PluginID string `json:"plugin_id"` - PluginDir string `json:"plugin_dir"` - Managed string `json:"managed"` - AutoApply bool `json:"auto_apply"` - Remote string `json:"remote,omitempty"` - TrustedRemote string `json:"trusted_remote,omitempty"` - Branch string `json:"branch,omitempty"` - LocalCommit string `json:"local_commit,omitempty"` - RemoteCommit string `json:"remote_commit,omitempty"` - Dirty bool `json:"dirty"` - Update string `json:"update"` - LastCheck string `json:"last_check,omitempty"` - LastUpdate string `json:"last_update,omitempty"` - LastResult string `json:"last_result,omitempty"` + BackendVersion string `json:"backend_version"` + PluginID string `json:"plugin_id"` + PluginDir string `json:"plugin_dir"` + Managed string `json:"managed"` + AutoApply bool `json:"auto_apply"` + AutoMaintain bool `json:"auto_maintain"` + LUGVersion string `json:"lug_version,omitempty"` + WineVersion string `json:"wine_version,omitempty"` + DXVKVersion string `json:"dxvk_version,omitempty"` + LastMaintenance string `json:"last_maintenance,omitempty"` + MaintenanceResult string `json:"maintenance_result,omitempty"` + Remote string `json:"remote,omitempty"` + TrustedRemote string `json:"trusted_remote,omitempty"` + Branch string `json:"branch,omitempty"` + LocalCommit string `json:"local_commit,omitempty"` + RemoteCommit string `json:"remote_commit,omitempty"` + Dirty bool `json:"dirty"` + Update string `json:"update"` + LastCheck string `json:"last_check,omitempty"` + LastUpdate string `json:"last_update,omitempty"` + LastResult string `json:"last_result,omitempty"` } type App struct { @@ -51,6 +60,9 @@ type App struct { pluginDir string configDir string stateDir string + dataDir string + cacheDir string + vendorDir string configPath string logPath string libDir string @@ -100,6 +112,38 @@ func main() { app.logf("tick failed: %v", err) os.Exit(2) } + case "maintain": + if err := app.maintainGamingStack(); err != nil { + app.logf("maintenance failed: %v", err) + fatal(err) + } + case "doctor": + if err := app.wineDoctor(); err != nil { + fatal(err) + } + case "autopilot": + if len(args) < 2 { + fatal(errors.New("usage: autopilot enable|disable|status")) + } + switch args[1] { + case "enable": + if err := app.enableAutopilot(); err != nil { + fatal(err) + } + case "disable": + if err := app.disableAutopilot(); err != nil { + fatal(err) + } + case "status": + cfg := app.loadConfig() + if cfg.AutoMaintain { + fmt.Println("enabled") + } else { + fmt.Println("disabled") + } + default: + fatal(errors.New("usage: autopilot enable|disable|status")) + } case "auto": if len(args) < 2 { fatal(errors.New("usage: auto enable|disable|status")) @@ -149,11 +193,17 @@ func newApp() (*App, error) { self, _ = filepath.EvalSymlinks(self) configHome := envOr("XDG_CONFIG_HOME", filepath.Join(home, ".config")) stateHome := envOr("XDG_STATE_HOME", filepath.Join(home, ".local", "state")) + dataHome := envOr("XDG_DATA_HOME", filepath.Join(home, ".local", "share")) + cacheHome := envOr("XDG_CACHE_HOME", filepath.Join(home, ".cache")) + dataDir := filepath.Join(dataHome, "omarchy-citizen") return &App{ home: home, pluginDir: filepath.Join(configHome, "omarchy", "plugins", pluginID), configDir: filepath.Join(configHome, "omarchy-citizen"), stateDir: filepath.Join(stateHome, "omarchy-citizen"), + dataDir: dataDir, + cacheDir: filepath.Join(cacheHome, "omarchy-citizen"), + vendorDir: filepath.Join(dataDir, "vendor"), configPath: filepath.Join(configHome, "omarchy-citizen", "updater.json"), logPath: filepath.Join(stateHome, "omarchy-citizen", "updater.log"), libDir: filepath.Join(home, ".local", "lib", "omarchy-citizen"), @@ -164,16 +214,22 @@ func newApp() (*App, error) { func (a *App) status(fetch bool) (Status, error) { cfg := a.loadConfig() st := Status{ - BackendVersion: appVersion, - PluginID: pluginID, - PluginDir: a.pluginDir, - Managed: "manual", - AutoApply: cfg.AutoApply, - TrustedRemote: cfg.TrustedRemote, - Update: "unavailable", - LastCheck: cfg.LastCheck, - LastUpdate: cfg.LastUpdate, - LastResult: cfg.LastResult, + BackendVersion: appVersion, + PluginID: pluginID, + PluginDir: a.pluginDir, + Managed: "manual", + AutoApply: cfg.AutoApply, + AutoMaintain: cfg.AutoMaintain, + LUGVersion: readMetaVersion(filepath.Join(a.vendorDir, "lug-helper", "meta.json")), + WineVersion: readMetaVersion(filepath.Join(a.vendorDir, "wine", "meta.json")), + DXVKVersion: readMetaVersion(filepath.Join(a.vendorDir, "dxvk", "meta.json")), + LastMaintenance: cfg.LastMaintenance, + MaintenanceResult: cfg.MaintenanceResult, + TrustedRemote: cfg.TrustedRemote, + Update: "unavailable", + LastCheck: cfg.LastCheck, + LastUpdate: cfg.LastUpdate, + LastResult: cfg.LastResult, } if !isGitRepo(a.pluginDir) { @@ -239,20 +295,30 @@ func (a *App) status(fetch bool) (Status, error) { func (a *App) tick() error { cfg := a.loadConfig() - if !cfg.AutoApply { - a.logf("tick: auto updates disabled") - return nil + var problems []string + + if cfg.AutoMaintain { + if err := a.maintainGamingStack(); err != nil { + problems = append(problems, "gaming stack: "+err.Error()) + } } - st, err := a.status(true) - a.recordCheck(st, err) - if err != nil { - return err + + if cfg.AutoApply { + st, err := a.status(true) + a.recordCheck(st, err) + if err != nil { + problems = append(problems, "plugin check: "+err.Error()) + } else if st.Update == "available" { + if err := a.update(true); err != nil { + problems = append(problems, "plugin update: "+err.Error()) + } + } } - if st.Update != "available" { - a.logf("tick: no update applied; state=%s", st.Update) - return nil + + if len(problems) > 0 { + return errors.New(strings.Join(problems, "; ")) } - return a.update(true) + return nil } func (a *App) update(automatic bool) error { @@ -383,8 +449,8 @@ func (a *App) installService() error { timerPath := filepath.Join(a.home, ".config", "systemd", "user", "omarchy-citizen-update.timer") backendPath := filepath.Join(a.libDir, "omarchy-citizen-backend") - service := `[Unit]\nDescription=Omarchy Citizen automatic plugin updater\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=oneshot\nExecStart=` + backendPath + ` tick\n` - timer := `[Unit]\nDescription=Check Omarchy Citizen updates periodically\n\n[Timer]\nOnBootSec=10min\nOnUnitActiveSec=6h\nRandomizedDelaySec=15min\nPersistent=true\nUnit=omarchy-citizen-update.service\n\n[Install]\nWantedBy=timers.target\n` + service := `[Unit]\nDescription=Omarchy Citizen Autopilot maintenance\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=oneshot\nExecStart=` + backendPath + ` tick\n` + timer := `[Unit]\nDescription=Maintain Omarchy Citizen gaming stack automatically\n\n[Timer]\nOnBootSec=3min\nOnUnitActiveSec=6h\nRandomizedDelaySec=15min\nPersistent=true\nUnit=omarchy-citizen-update.service\n\n[Install]\nWantedBy=timers.target\n` if err := os.WriteFile(servicePath, []byte(strings.ReplaceAll(service, `\n`, "\n")), 0o644); err != nil { return err @@ -655,6 +721,12 @@ func printStatusKV(s Status) { fmt.Printf("backend_version=%s\n", s.BackendVersion) fmt.Printf("managed=%s\n", s.Managed) fmt.Printf("auto_apply=%t\n", s.AutoApply) + fmt.Printf("auto_maintain=%t\n", s.AutoMaintain) + fmt.Printf("lug_version=%s\n", s.LUGVersion) + fmt.Printf("wine_version=%s\n", s.WineVersion) + fmt.Printf("dxvk_version=%s\n", s.DXVKVersion) + fmt.Printf("last_maintenance=%s\n", s.LastMaintenance) + fmt.Printf("maintenance_result=%s\n", s.MaintenanceResult) fmt.Printf("update=%s\n", s.Update) fmt.Printf("remote=%s\n", s.Remote) fmt.Printf("trusted_remote=%s\n", s.TrustedRemote) diff --git a/citizenctl b/citizenctl index e3efb40..97f641a 100644 --- a/citizenctl +++ b/citizenctl @@ -2,7 +2,7 @@ set -u PLUGIN_ID="local.omarchy-citizen" -PLUGIN_VERSION="0.6.4" +PLUGIN_VERSION="0.7.0" CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/starcitizen-lug" DATA_DIR="${XDG_DATA_HOME:-$HOME/.local/share}" @@ -17,6 +17,8 @@ PLUGIN_DIR="$(cd -- "$(dirname -- "$SELF")" && pwd)" SANITIZER="$PLUGIN_DIR/support-sanitize.py" BACKEND_EXTERNAL="$HOME/.local/lib/omarchy-citizen/omarchy-citizen-backend" BACKEND_BUNDLED="$PLUGIN_DIR/backend/bin/omarchy-citizen-backend" +MANAGED_LUG="$DATA_DIR/omarchy-citizen/vendor/lug-helper/lug-helper.appimage" +MANAGED_WINE="$DATA_DIR/omarchy-citizen/vendor/wine/current" GUI_PACKAGES=(zenity polkit cabextract unzip) @@ -61,6 +63,27 @@ backend_status() { "$backend" status } +autopilot_enable() { + local backend + backend="$(find_backend 2>/dev/null)" || { + echo "Omarchy-Citizen-Backend fehlt." >&2 + return 1 + } + "$backend" autopilot enable +} + +autopilot_maintain() { + local backend + backend="$(find_backend 2>/dev/null)" || return 1 + "$backend" maintain +} + +wine_doctor() { + local backend + backend="$(find_backend 2>/dev/null)" || return 1 + "$backend" doctor +} + plugin_update_check() { local backend output state backend="$(find_backend 2>/dev/null)" || { @@ -143,11 +166,17 @@ notify_error() { find_helper() { local candidate + # Omarchy Citizen owns this copy and keeps it current automatically. + if [[ -x "$MANAGED_LUG" ]]; then + printf '%s\n' "$MANAGED_LUG" + return 0 + fi + + # Compatibility fallbacks for existing users. if command -v lug-helper >/dev/null 2>&1; then command -v lug-helper return 0 fi - if command -v lug-helper.sh >/dev/null 2>&1; then command -v lug-helper.sh return 0 @@ -156,33 +185,30 @@ find_helper() { for candidate in \ "$HOME/.local/bin/lug-helper" \ "$HOME/.local/bin/lug-helper.sh" \ - "$DATA_DIR/lug-helper/lug-helper.sh" \ - "$HOME/lug-helper/lug-helper.sh" + "$DATA_DIR/lug-helper/lug-helper.sh" do - if [[ -f "$candidate" ]]; then - printf '%s\n' "$candidate" - return 0 - fi + [[ -f "$candidate" ]] && { printf '%s\n' "$candidate"; return 0; } done - - shopt -s nullglob - for candidate in \ - "$HOME/Applications"/*LUG*Helper*.AppImage \ - "$HOME/Applications"/lug-helper*.AppImage \ - "$HOME/Downloads"/*LUG*Helper*.AppImage \ - "$HOME/Downloads"/lug-helper*.AppImage - do - if [[ -x "$candidate" ]]; then - printf '%s\n' "$candidate" - shopt -u nullglob - return 0 - fi - done - shopt -u nullglob - return 1 } +helper_exec() { + local helper="$1" + shift + + if [[ "$helper" == "$MANAGED_LUG" || "${helper,,}" == *.appimage ]]; then + APPIMAGE_EXTRACT_AND_RUN=1 "$helper" "$@" + elif [[ "$helper" == *.sh ]]; then + bash "$helper" "$@" + else + "$helper" "$@" + fi +} + +helper_version() { + local helper="$1" + APPIMAGE_EXTRACT_AND_RUN=1 "$helper" --version 2>/dev/null | head -n1 || true +} run_helper_sync() { local helper helper="$(find_helper)" || { @@ -190,12 +216,8 @@ run_helper_sync() { return 1 } - log_line "lug-helper sync args=$*" - if [[ "$helper" == *.sh ]]; then - bash "$helper" "$@" >>"$LOG_FILE" 2>&1 - else - "$helper" "$@" >>"$LOG_FILE" 2>&1 - fi + log_line "lug-helper sync args=$* helper=$helper" + helper_exec "$helper" "$@" >>"$LOG_FILE" 2>&1 } run_helper_visible() { @@ -205,12 +227,8 @@ run_helper_visible() { return 1 } - log_line "lug-helper visible args=$*" - if [[ "$helper" == *.sh ]]; then - bash "$helper" "$@" - else - "$helper" "$@" - fi + log_line "lug-helper visible args=$* helper=$helper" + helper_exec "$helper" "$@" } run_helper_gui() { @@ -222,8 +240,10 @@ Wähle im SC-Panel „Einrichten“ – Omarchy Citizen installiert die benötig return 1 } - log_line "lug-helper gui args=$*" - if [[ "$helper" == *.sh ]]; then + log_line "lug-helper gui args=$* helper=$helper" + if [[ "$helper" == "$MANAGED_LUG" || "${helper,,}" == *.appimage ]]; then + nohup env APPIMAGE_EXTRACT_AND_RUN=1 "$helper" "$@" >>"$LOG_FILE" 2>&1 & + elif [[ "$helper" == *.sh ]]; then nohup bash "$helper" "$@" >>"$LOG_FILE" 2>&1 & else nohup "$helper" "$@" >>"$LOG_FILE" 2>&1 & @@ -353,26 +373,23 @@ status() { local prefix_state="missing" prefix_detail="" launcher_state="missing" game_state="missing" local update_state="unknown" update_version="" health="setup" - for dep in "${GUI_PACKAGES[@]}"; do - if ! package_installed "$dep"; then - deps_state="missing" - if [[ -n "$missing_deps" ]]; then missing_deps+=","; fi - missing_deps+="$dep" - fi - done + # Core operation no longer depends on an AUR LUG package. The managed + # official LUG AppImage bundles its GUI/runtime dependencies. + if [[ ! -x "$MANAGED_LUG" ]]; then + deps_state="partial" + missing_deps="managed LUG AppImage" + fi - if package_installed lug-helper; then + if helper="$(find_helper 2>/dev/null)"; then helper_state="ready" - helper_managed="aur" - version="$(installed_lug_version)" - elif helper="$(find_helper 2>/dev/null)"; then - helper_state="ready" - helper_managed="external" - if [[ "$helper" == *.sh ]]; then - version="$(bash "$helper" --version 2>/dev/null | head -n 1 || true)" + if [[ "$helper" == "$MANAGED_LUG" ]]; then + helper_managed="autopilot" + elif package_installed lug-helper; then + helper_managed="aur" else - version="$("$helper" --version 2>/dev/null | head -n 1 || true)" + helper_managed="external" fi + version="$(helper_version "$helper")" version="${version//$'\n'/ }" version="${version//$'\r'/ }" fi @@ -399,7 +416,7 @@ status() { fi fi - if [[ "$deps_state" != "ready" || "$helper_state" != "ready" ]]; then + if [[ "$helper_state" != "ready" ]]; then health="setup" elif [[ "$prefix_state" == "partial" ]]; then health="recover-prefix" @@ -438,6 +455,11 @@ status() { printf 'plugin_update=%s\n' "$(printf '%s\n' "$backend_output" | sed -n 's/^update=//p' | head -n1)" printf 'plugin_local_commit=%s\n' "$(printf '%s\n' "$backend_output" | sed -n 's/^local_commit=//p' | head -n1)" printf 'plugin_remote_commit=%s\n' "$(printf '%s\n' "$backend_output" | sed -n 's/^remote_commit=//p' | head -n1)" + printf 'autopilot=%s\n' "$(printf '%s\n' "$backend_output" | sed -n 's/^auto_maintain=//p' | head -n1)" + printf 'managed_lug_version=%s\n' "$(printf '%s\n' "$backend_output" | sed -n 's/^lug_version=//p' | head -n1)" + printf 'managed_wine_version=%s\n' "$(printf '%s\n' "$backend_output" | sed -n 's/^wine_version=//p' | head -n1)" + printf 'managed_dxvk_version=%s\n' "$(printf '%s\n' "$backend_output" | sed -n 's/^dxvk_version=//p' | head -n1)" + printf 'maintenance_result=%s\n' "$(printf '%s\n' "$backend_output" | sed -n 's/^maintenance_result=//p' | head -n1)" } probe_detached_start() { @@ -698,15 +720,13 @@ install_stack_terminal() { echo "==================================================" echo echo "Fehlercode: $rc" - echo "Keine Sorge: Im SC-Panel kannst du anschließend" - echo "„Support-Paket erstellen“ wählen." + echo "Omarchy Citizen hat alle Ausgaben im Debug-Log gespeichert." + echo "Im SC-Panel genügt „Support-Paket erstellen“." echo - log_line "install-stack failed rc=$rc" - notify "Omarchy Citizen" "Setup fehlgeschlagen. Bitte erstelle im SC-Panel ein Support-Paket." + log_line "autopilot setup failed rc=$rc" + notify "Omarchy Citizen" "Setup fehlgeschlagen. Support-Paket kann mit einem Klick erstellt werden." if [[ -t 0 ]]; then read -r -p "Drücke Enter, um dieses Fenster zu schließen … " _ || true - else - sleep 8 fi exit "$rc" } @@ -714,72 +734,75 @@ install_stack_terminal() { echo echo "==================================================" - echo " Omarchy Citizen – Plug & Play Setup" + echo " Omarchy Citizen – Rundum-Sorglos Autopilot" echo "==================================================" echo - echo "Omarchy Citizen richtet die Linux-Gaming-Basis ein." - echo "Du musst keine Paketnamen oder Linux-Befehle kennen." + echo "Das Plugin verwaltet jetzt selbst:" + echo " ✓ Omarchy-Citizen-Updates (bei Git-Installation)" + echo " ✓ offiziellen LUG Helper als AppImage" + echo " ✓ stabilen LUG-Wine-Runner" + echo " ✓ DXVK" + echo " ✓ Wine-Selbsttest vor Aktivierung" + echo " ✓ Reparatur- und Support-Logs" echo - echo "Installiert/überprüft werden:" - echo " - zenity / polkit" - echo " - cabextract / unzip" - echo " - Star Citizen LUG Helper aus dem AUR" + echo "Es wird kein AUR-LUG-Paket mehr benötigt." echo - omarchy pkg add zenity polkit cabextract unzip - - if package_installed lug-helper; then - echo "LUG Helper ist bereits installiert." - else - echo "Installiere LUG Helper..." - omarchy pkg aur add lug-helper - fi - - rm -f "$UPDATE_CACHE" + echo "Aktiviere Autopilot und synchronisiere den Gaming-Stack …" + autopilot_enable echo - echo "Systempakete sind bereit." - echo "Als Nächstes startet der grafische Star-Citizen-Assistent." + echo "Prüfe den verwalteten Wine-Runner in einem temporären Test-Prefix …" + wine_doctor + echo "✓ Wine-Selbsttest erfolgreich." echo - run_helper_sync --preflight-check || true - if find_incomplete_prefix >/dev/null 2>&1; then - echo - echo "Eine frühere, unvollständige Wine-Prefix-Erstellung wurde erkannt." - echo "Öffne die sichere Reparatur in einem eigenen Fenster." + echo "Eine unvollständige frühere Installation wurde erkannt." + echo "Sie wird jetzt sicher über den vorhandenen Recovery-Pfad behandelt." echo trap - ERR launch_terminal_action recover-prefix-terminal return 0 - elif ! read_prefix >/dev/null 2>&1; then - run_helper_sync --install || true fi + echo "Starte LUG Preflight …" + run_helper_visible --preflight-check || true + + if ! read_prefix >/dev/null 2>&1; then + echo + echo "Installiere den RSI Launcher mit dem aktuellen LUG Helper …" + run_helper_visible --install + fi + + prefix="$(read_prefix 2>/dev/null || true)" + if [[ -n "$prefix" && ! -f "$prefix/sc-launch.sh" ]]; then + run_helper_visible --update-launch-script + fi + + # Maintenance once more now that a prefix exists: switches sc-launch.sh to + # the tested managed runner and installs current DXVK. echo - echo "Plug-&-Play-Setup beendet." - echo "Du kannst dieses Fenster schließen und ✦SC öffnen." + echo "Aktualisiere Wine/DXVK für den neu eingerichteten Prefix …" + autopilot_maintain + trap - ERR - notify "Omarchy Citizen" "Grundsetup abgeschlossen. Öffne ✦SC und starte Star Citizen." - log_line "install-stack complete" + notify "Omarchy Citizen" "Autopilot ist aktiv. Der Gaming-Stack wird künftig automatisch gepflegt." + log_line "autopilot setup complete" + echo + echo "==================================================" + echo " AUTOPILOT AKTIV" + echo "==================================================" + echo + echo "Künftig reicht der große STAR-CITIZEN-Button." } update_helper_terminal() { - set -e + set -Ee exec > >(tee -a "$LOG_FILE") 2>&1 - - if ! package_installed lug-helper; then - echo "LUG Helper ist noch nicht als AUR-Paket installiert." - echo "Starte bitte zuerst das normale Omarchy-Citizen-Setup." - exit 1 - fi - - echo "Aktualisiere den LUG Helper..." - omarchy pkg aur add lug-helper - rm -f "$UPDATE_CACHE" - echo "LUG Helper ist aktuell." - installed_lug_version - log_line "lug-helper update complete" + echo "Synchronisiere LUG Helper, Wine Runner und DXVK über Autopilot …" + autopilot_maintain + echo "✓ Gaming-Stack ist aktuell." } system_update_terminal() { @@ -809,7 +832,14 @@ launch_game() { } primary_action() { - local st health + local st health backend + # Keep normal launch instant. Autopilot maintenance is delegated to systemd + # and never blocks the player's click. + backend="$(find_backend 2>/dev/null || true)" + if [[ -n "$backend" ]]; then + systemctl --user start omarchy-citizen-update.service >/dev/null 2>&1 || true + fi + st="$("$SELF" status)" health="$(printf '%s\n' "$st" | sed -n 's/^health=//p' | head -n1)" @@ -1008,6 +1038,11 @@ EOF capture_sanitized "$work/omarchy-debug.txt" omarchy debug --no-sudo --print + if backend="$(find_backend 2>/dev/null)"; then + capture_sanitized "$work/autopilot-status.txt" "$backend" status + capture_sanitized "$work/wine-doctor.txt" "$backend" doctor + fi + { echo "=== Kernel / Desktop ===" uname -rmo 2>/dev/null || true @@ -1292,6 +1327,9 @@ ngl_install() { case "$ACTION" in status) status ;; + autopilot-enable) autopilot_enable ;; + autopilot-maintain) autopilot_maintain ;; + wine-doctor) wine_doctor ;; primary) primary_action ;; setup) guided_setup ;; recover-prefix) recover_incomplete_prefix ;; diff --git a/install.sh b/install.sh index c58ef7a..f73cc80 100644 --- a/install.sh +++ b/install.sh @@ -36,7 +36,11 @@ omarchy-shell shell rescanPlugins echo "Aktiviere Plugin..." "$DEST/backend/bin/omarchy-citizen-backend" self-sync >/dev/null 2>&1 || true -"$HOME/.local/lib/omarchy-citizen/omarchy-citizen-backend" install-service >/dev/null 2>&1 || true +echo "Aktiviere Rundum-Sorglos Autopilot …" +"$HOME/.local/lib/omarchy-citizen/omarchy-citizen-backend" autopilot enable || { + echo "Hinweis: Autopilot konnte beim Installer noch nicht vollständig synchronisieren." + echo "Der SC-Setup-Button versucht es erneut und protokolliert die Ursache." +} omarchy plugin enable "$PLUGIN_ID" @@ -44,7 +48,7 @@ omarchy plugin enable "$PLUGIN_ID" omarchy restart shell >/dev/null 2>&1 || true echo -echo "Omarchy Citizen 0.6.4 wurde installiert:" +echo "Omarchy Citizen 0.7.0 wurde installiert:" echo " $DEST" echo echo "Links-Klick auf 'SC' in der Omarchy-Leiste öffnet das Star-Citizen-Panel." diff --git a/manifest.json b/manifest.json index bce64d4..d38d568 100644 --- a/manifest.json +++ b/manifest.json @@ -2,10 +2,10 @@ "schemaVersion": 1, "id": "local.omarchy-citizen", "name": "Omarchy Citizen", - "version": "0.6.4", + "version": "0.7.0", "author": "Community prototype", "license": "MIT", - "description": "Plug-and-play Star Citizen controls for Omarchy. 0.6.4 removes nested background UI actions and performs incomplete-prefix recovery in a visible, logged terminal.", + "description": "Plug-and-play Star Citizen for Omarchy with Autopilot: automatic plugin, LUG Helper AppImage, LUG Wine runner and DXVK maintenance, health checks, self-healing setup and sanitized support bundles.", "kinds": [ "bar-widget" ], diff --git a/uninstall.sh b/uninstall.sh index 0ef62a4..5145938 100644 --- a/uninstall.sh +++ b/uninstall.sh @@ -4,6 +4,8 @@ set -euo pipefail PLUGIN_ID="local.omarchy-citizen" DEST="$HOME/.config/omarchy/plugins/$PLUGIN_ID" +BACKEND="$HOME/.local/lib/omarchy-citizen/omarchy-citizen-backend" +[[ -x "$BACKEND" ]] && "$BACKEND" uninstall-service >/dev/null 2>&1 || true omarchy plugin disable "$PLUGIN_ID" 2>/dev/null || true BACKEND="$HOME/.local/lib/omarchy-citizen/omarchy-citizen-backend"