Skip to content

Commit ce1f3e0

Browse files
docs: codify CMS and Academy update channels
1 parent b81c0d5 commit ce1f3e0

5 files changed

Lines changed: 104 additions & 0 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
---
99

10+
## Unreleased — 2026-09-30
11+
12+
### Dokumentation
13+
- Plattformgerechte Release-, Paket- und Backend-Updatewege für WordPress, Shopware 6 und JTL Shop 5 ergänzt.
14+
- Geschützte Update-Kanäle für private PHP-Plugins und die separate öffentliche Binär-Release-Strecke der MGD Academy beschrieben.
15+
- Prüfmatrix und Grenzen von GitHub-Release, CI, Digest und realem Installationstest festgehalten.
16+
17+
---
18+
1019
## [1.1.0] - 2026-06-23
1120

1221
### Added

‎README.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ Der Skill begleitet dich in 2 Phasen:
2020

2121
Für Desktop-Apps (Flutter, Electron, Tauri, Swift), Mobile Apps, Web-Apps, SaaS und Backend-Systeme.
2222

23+
Neu: [CMS-Plugin-Updates für WordPress, Shopware und JTL Shop](wiki/17-CMS-Plugin-Updates.md) sowie die [konkrete In-App-Update-Strecke von MGD Academy](wiki/18-MGD-Academy-In-App-Updates.md). Beide Anleitungen trennen Erkennung, Paket, Backend-Installation und realen Funktionstest.
24+
2325
---
2426

2527
## Was ist dieser Skill?

‎skill/SKILL.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ Der Skill besteht aus zwei Phasen:
1414

1515
Der Skill ist **technologie-neutral**: Desktop (Electron, Tauri, Flutter), Mobile (Flutter, React Native, Swift), Web (React, Vue, Next.js), Backend (Node.js, Python, Go), Games (Unity, Godot).
1616

17+
Für konkrete Plattformen nach der Planung: [CMS-Plugin-Updates (WordPress, Shopware, JTL Shop)](../wiki/17-CMS-Plugin-Updates.md) und [MGD Academy In-App-Updates](../wiki/18-MGD-Academy-In-App-Updates.md). Ein Release-Tag beweist noch keine Erkennung oder Installation im Produkt.
18+
1719
---
1820

1921
## Kernregel — Erst planen, dann implementieren

‎wiki/17-CMS-Plugin-Updates.md‎

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# 17 — Plugins in WordPress, Shopware und JTL Shop aktualisieren
2+
3+
Stand: 30.09.2026. Diese Anleitung unterscheidet bewusst **Update erkennen**, **Paket bereitstellen**, **Installation im Backend** und **live geprüft**. Ein GitHub-Release allein löst in keinem der drei Systeme magisch ein Update aus.
4+
5+
## Gemeinsamer Release-Vertrag
6+
7+
1. Eine versionierte Plugin-Datei, ein Tag `vX.Y.Z` und der installierbare ZIP-Inhalt müssen dieselbe Version tragen. Teste diese Gleichheit im Release-Workflow.
8+
2. Veröffentliche einen **fest benannten** Paket-Asset. GitHubs automatisch erzeugte „Source code“-ZIPs sind keine verlässlichen Installationspakete.
9+
3. Baue das ZIP reproduzierbar mit exakt dem erwarteten Plugin-Hauptordner; schließe `.env`, Zugangsdaten, Tests und Build-Verzeichnisse aus. Prüfe Dateiliste, ZIP-Integrität, Größe und nach Möglichkeit SHA-256 sowie gefährliche Pfade/Symlinks.
10+
4. Prüfe neue Versionen mit Cache, manueller Aktualisierungsmöglichkeit und eindeutigem Fehlerstatus. Zeige keine Beta-Version als Stable-Update.
11+
5. Installiere erst nach Staging-Update, Backup, Rollback-Plan und realem Backend-Test. Ein grüner CI-Lauf beweist keine funktionierende Kundeninstallation.
12+
6. Dokumentiere die Zustände getrennt: Code vorbereitet → PR geprüft → Release veröffentlicht → Backend erkennt → Backend installiert → Storefront und Admin geprüft.
13+
14+
## Öffentliche und private Repositories
15+
16+
Bei öffentlichen Repositories kann das CMS Release-Metadaten und Paket ohne Schlüssel laden. Bei **privaten** Repositories bleibt auch das ZIP privat. Jede Kundeninstallation bekommt einen eigenen, auf genau das Repository beschränkten Read-only-Token im Server-Secret-Store oder in einer nicht versionierten Konfigurationsdatei. Nie im Plugin, Client, Log oder Support-Screenshot. Bei einem GitHub-Asset-Aufruf geht `Authorization` nur an die passende GitHub-API; bei der Weiterleitung zum Download-Host muss der Header entfernt werden. Ohne gültigen Token **kein** öffentlicher Fallback. Tokenrotation und Entzug pro Kunde vorsehen.
17+
18+
Ein öffentliches Release-Repository wie bei MGD Academy legt seine Binärpakete offen. Dieses Muster eignet sich **nicht** für privaten Plugin-Code, wenn das ZIP den PHP-Quellcode enthält.
19+
20+
## WordPress
21+
22+
- Plugin-Header `Version` und bei externem Anbieter `Update URI` korrekt setzen. Die WordPress-Update-Information muss zum exakten Plugin-Basename und Slug passen.
23+
- Bei öffentlichen Plugins können WordPress-Filter oder ein gepflegter Update-Checker GitHub-Releases integrieren. Bei privaten Plugins muss derselbe Mechanismus Metadaten **und** Paket authentifiziert abrufen. Ein Token nur für die Versionsprüfung ist unzureichend.
24+
- Der installierbare ZIP-Hauptordner muss stabil bleiben, zum Beispiel `fragebogen/`. Der Update-Checker darf nicht auf Tag-/Branch-Archive zurückfallen, wenn das freigegebene Release-Asset fehlt.
25+
- Die eigentliche Installation soll WordPress über „Plugins“ oder „Dashboard → Aktualisierungen“ durchführen. WordPress-Auto-Updates nur nach ausdrücklicher Produktentscheidung aktivieren.
26+
- Besonders kritisch: Daten, die fälschlich innerhalb des Plugin-Verzeichnisses liegen, können beim Ersetzen des Ordners verloren gehen. Vor dem ersten Update migrieren und sichern.
27+
28+
## Shopware 6
29+
30+
- Composer-/Plugin-Version, Tag und ZIP-Paket synchronisieren; Shopware-kompatible Ordnerstruktur prüfen.
31+
- Ein Shopware-Plugin kann GitHub-Releases prüfen und ein neues Paket **vorbereiten**. Die Anwendung des Pakets soll durch Shopwares native Plugin-Verwaltung und deren Update-/Migrationsablauf erfolgen. Ein Dateikopieren direkt über die laufende Installation ist kein sicheres Backend-Update.
32+
- Paket nur aus stabilem Release, mit fester Asset-Bezeichnung, Integritätsprüfung und atomarer Staging-Ablage akzeptieren. Anschließend Plugin-Refresh, Update und Cache-/Theme-Kompilierung nach Shopware-Verfahren testen.
33+
- „Jede Stunde prüfen“ bedeutet nur Erkennung nach Cache-/Cron-Lauf, nicht GitHub-Push-Benachrichtigung und nicht automatisches Installieren. Einen manuellen „Jetzt prüfen“-Knopf für Administratoren anbieten.
34+
35+
## JTL Shop 5
36+
37+
- Die `info.xml`-Version und das JTL-Plugin-ZIP müssen exakt zusammenpassen. Der Hauptordner im ZIP ist entscheidend.
38+
- GitHub-Release-Prüfung kann im JTL-Backend eine neue Version und einen Download anzeigen. **Das ist noch kein Ein-Klick-Update aus GitHub.** Der bisherige MGD-Weg lädt das ZIP herunter, lädt es in die JTL-Pluginverwaltung und führt das Update dort aus.
39+
- Für einen echten „Update“-Knopf ohne manuellen ZIP-Upload muss das neue Paket kontrolliert serverseitig in die erwartete Plugin-Ablage gelangen und der JTL-Pluginmanager es als neue Version erkennen. Dies nur gegen die konkret eingesetzte JTL-Version und mit Backup testen; kein direktes Überschreiben aktiver PHP-Dateien.
40+
- Cache-Häufigkeit und Backend-„Jetzt prüfen“ sind getrennte Einstellungen. Frontend-Requests dürfen GitHub nicht synchron belasten.
41+
42+
## Testprotokoll pro Plugin
43+
44+
| Nachweis | Erwartetes Ergebnis |
45+
|---|---|
46+
| Ohne neue Version | Keine falsche Update-Anzeige |
47+
| Stable-Release mit gültigem ZIP | Exakte Version und richtiger Slug im Backend |
48+
| Fehlender/ungültiger Token (privat) | Sichere Fehlermeldung, keine Token-Ausgabe, kein Fallback |
49+
| Beta/Draft oder fehlendes Asset | Nicht als Stable-Update installierbar |
50+
| Manipuliertes/falsches Paket | Abbruch vor Installation |
51+
| Staging-Update | Einstellungen und Kundendaten bleiben erhalten; Funktion im Admin und Frontend |
52+
| Rollback | Vorherige Version und Daten aus Backup wiederherstellbar |
53+
54+
## Quellen und Beispielimplementierungen
55+
56+
- [WordPress-Plugin-Header mit Update URI](https://developer.wordpress.org/plugins/plugin-basics/header-requirements/), [externer Update-Filter](https://developer.wordpress.org/reference/hooks/update_plugins_hostname/) und [Hook vor dem Download](https://developer.wordpress.org/reference/hooks/upgrader_pre_download/).
57+
- [GitHub Release Assets API](https://docs.github.com/en/rest/releases/assets): geschützte Asset-Downloads.
58+
- [Plugin Update Checker](https://github.com/YahnisElsts/plugin-update-checker): `setAuthentication()` für private Repositories; Asset- und Fallback-Verhalten der verwendeten Version prüfen.
59+
- MGD-Referenzen: `MGD_WordPress-MCP` (WordPress, öffentlich), `MGD-AI-Kennzeichnung-Shopware-6` (Shopware, öffentlich), `MGD-AI-Kennzeichnung-JTL-Shop-5` (JTL, Backend-Hinweis). Referenzen sind Muster, **kein** pauschaler Live-Funktionsnachweis.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# 18 — MGD Academy: In-App-Updates über separates Release-Repository
2+
3+
Stand: 30.09.2026. Diese Anleitung beschreibt die **im Quellcode vorhandene** macOS-Strecke und ihre Grenzen, nicht eine allgemeine Update-Garantie für jede Plattform.
4+
5+
## Architektur
6+
7+
Der Quellcode der Flutter-App liegt getrennt vom öffentlichen [`MGD-Academy-Releases`](https://github.com/MichaelGahnDESIGN/MGD-Academy-Releases). Ein macOS-Release-Workflow im privaten Quellrepository baut die `.app`, ein Installations-DMG und ein besonderes In-App-ZIP. Er veröffentlicht die Artefakte als GitHub-Release im privaten Quellrepository **und** im öffentlichen Release-Repository. Das öffentliche Repository enthält die installierbaren Dateien, nicht automatisch den privaten Quellcode. Ein Token gehört nicht in die App.
8+
9+
Die installierte App fragt `https://api.github.com/repos/MichaelGahnDESIGN/MGD-Academy-Releases/releases/latest` ab, vergleicht den Tag mit der installierten Version und wählt unter den Assets `MGD-Academy-*-macOS-update.zip`. Nutzer sehen Version, Hinweise und einen Installationsweg. Die App lädt das ZIP in ein temporäres Verzeichnis und vergleicht SHA-256 mit dem `digest` des GitHub-Assets. Fehlt der Digest oder stimmt er nicht, wird abgebrochen. **SHA-256 schützt hier gegen beschädigte/abweichende Downloads; da Digest und Paket aus demselben Release-Konto stammen, ersetzt dies keine unabhängige Signatur oder Apple-Notarisierung.**
10+
11+
## macOS-Installation
12+
13+
Der Installer verweigert den automatischen Austausch, wenn die App direkt aus einem DMG unter `/Volumes/` läuft. Ansonsten wartet ein losgelöstes Hilfsskript auf das Ende der laufenden App, entpackt das ZIP, kopiert die neue `.app` zunächst als `APP.new`, verschiebt die alte nach `APP.old` und startet die neue App. Schlägt der Start fehl, stellt es `APP.old` zurück und versucht den alten Start. Persönliche SQLite-Daten liegen getrennt im Application-Support-Verzeichnis und sollen nicht Teil des App-Bundles sein.
14+
15+
Wichtig: Der gezeigte Skript-Rollback prüft einen erfolgreichen `open`-Aufruf und kurze Wartezeit, **keine** vollständige Funktionsprüfung der neuen Version. Signierung, Hardened Runtime und Apple-Notarisierung müssen für eine belastbare externe macOS-Verteilung gesondert überprüft werden. Im öffentlich sichtbaren Release-README wird fehlende Notarisierung genannt. Die Windows-Strecke im Update-Service erkennt zwar einen Setup-Assetnamen, der automatische Installer ist dort noch nicht freigeschaltet.
16+
17+
## Release- und Abnahmeregeln
18+
19+
1. Versionsdatei, Flutter-Paketversion, Tag und Dateinamen abgleichen; Artefakte aus genau einem getesteten Commit bauen.
20+
2. Build- und Inhaltstests durchführen. DMG und Update-ZIP getrennt bauen; SHA-256 für beide veröffentlichen.
21+
3. Public-Release erst nach erfolgreichem privaten Build und Signier-/Paketprüfung veröffentlichen. Keine zweite manuelle Veröffentlichung parallel zum CI-Workflow starten.
22+
4. Mit einer **installierten älteren Version** den echten Ablauf testen: Hinweis → Download → Hashprüfung → Austausch → Neustart → Versionsanzeige → lokale Daten erhalten. Ein GitHub-Release oder grüner Build allein reicht nicht.
23+
5. Auch Abbruchfälle prüfen: offline, 404, fehlender Asset/Digest, falscher Hash, Startfehler, fehlende Schreibrechte und Start direkt vom DMG.
24+
25+
## Relevante Quellorte
26+
27+
- Im privaten `MGD-Academy`-Quellrepository: `lib/services/update_service.dart`, `lib/ui/screens/update_install_screen.dart`, `.github/workflows/release.yml`, `docs/UPDATES.md`.
28+
- Im öffentlichen [`MGD-Academy-Releases`](https://github.com/MichaelGahnDESIGN/MGD-Academy-Releases): Release-Historie und herunterladbare Pakete. Zum Prüfzeitpunkt war `v0.11.0` mit macOS-DMG, Update-ZIP und Prüfsummen vorhanden.
29+
30+
## Nicht auf private CMS-Plugins übertragen
31+
32+
Bei Academy darf das öffentliche ZIP die verteilbare Binär-App enthalten. Ein WordPress-, Shopware- oder JTL-ZIP enthält in der Regel lesbaren PHP-Code. Falls der Plugin-Code privat bleiben soll, muss auch der Downloadkanal geschützt sein: per-installation Read-only-Zugang am Server oder eigener authentifizierter Update-Dienst, niemals ein eingebetteter gemeinsamer Token.

0 commit comments

Comments
 (0)