=== Patchly Connector ===
Contributors: webdex
Requires at least: 6.0
Tested up to: 6.6
Requires PHP: 7.4
Stable tag: 1.3.0
License: proprietary

Agent-Plugin für das Patchly-Backend (zentrales WordPress-Update-Management).

== Beschreibung ==

Das Plugin stellt unter `/wp-json/patchly/v1/` eine REST-API bereit, über die das Patchly-Backend
Inventar abruft, Updates mit vorherigem Backup einspielt, Rollbacks durchführt, Wordfence-Meldungen
ausliest und Einmal-Logins erzeugt. Authentifiziert wird ausschließlich über den API-Schlüssel, der bei
der Aktivierung erzeugt wird (Einstellungen → Patchly). Es gibt bewusst keine eigene Rechteverwaltung.

Endpunkte (siehe api-spezifikation.md):
* GET  /status, GET /inventory?refresh=1
* POST /updates/core | /updates/plugins | /updates/themes | /updates/localizations
* GET  /updates/{job_id}
* POST /rollback, GET /backups
* GET  /security/wordfence-log
* POST /auth/one-time-login, GET /auth/users
* POST /backups/create, GET /backups/jobs/{job_id}, GET /backups/{backup_id}/download, DELETE /backups/{backup_id}

Der Schlüssel wird als `Authorization: Bearer <key>` oder – falls der Webserver den Authorization-Header
verwirft – als `X-Patchly-Key: <key>` gesendet.

Ziel-Bezeichner für Lokalisierungen: `core::de_DE`, `plugin:<slug>:de_DE`, `theme:<slug>:de_DE`.

== Installation ==

1. ZIP hochladen und aktivieren.
2. Unter Einstellungen → Patchly den angezeigten API-Schlüssel kopieren.
3. Site mit Domain und Schlüssel im Patchly-Backend eintragen.

== Hinweise ==

* Batch-Updates laufen als Job über WP-Cron. Ist WP-Cron deaktiviert, verarbeitet das Plugin
  ausstehende Jobs beim Statusabruf durch das Backend.
* Vor jedem Update wird ein ZIP des betroffenen Elements unter `wp-content/uploads/patchly-backups/`
  abgelegt; es werden maximal 5 Sicherungen je Element behalten.
* Liegt auf der Site bereits die aktuelle Fassung, meldet das Plugin `success: true` zusammen mit
  `skipped: true`. Das ist kein Fehlschlag. WordPress aktualisiert Sprachpakete von sich aus und
  kommt dem Backend dabei regelmäßig zuvor.

== Changelog ==

= 1.3.0 =
* Neuer Endpunkt `POST /plugins/manage`: Plugins aktivieren, deaktivieren, löschen und von
  wordpress.org installieren, angestoßen aus dem Backend, bis zu 20 Plugins je Aufruf.
* Löschen legt vorher ein Backup an und entfernt nur die Dateien, ohne die Deinstallations-
  Routine des Plugins; Einstellungen und Daten bleiben, ein Rollback stellt das Plugin wieder her.
* Installiert wird nur von downloads.wordpress.org. Der Connector selbst lässt sich nicht
  deaktivieren oder löschen.

= 1.2.0 =
* Site-Backups auch für Themes (alle Theme-Verzeichnisse), Uploads (Upload-Verzeichnis ohne
  die eigenen Sicherungen in `uploads/patchly-backups`) und Sprachdateien (`WP_LANG_DIR`, auch
  eigene Übersetzungen etwa von Loco Translate). Weitere Ordner lassen sich über den Filter
  `patchly_site_backup_exclude` ausnehmen.
* Stream-Modus: das Backend holt fertige Teile schon während der Erzeugung ab und löscht sie
  einzeln (`DELETE /backups/{id}/parts/{n}`). Auf der Site liegen so nur wenige Teile gleichzeitig,
  auch bei Uploads, die größer sind als der freie Speicher.
* Die Dateiliste wird nur noch einmal erstellt und zeilenweise gelesen; spart Zeit und
  Arbeitsspeicher bei großen Upload-Verzeichnissen.
* Die vollständige Core-Sicherung enthält jetzt `wp-config.php` (auch wenn sie eine Ebene über
  dem Wurzelverzeichnis liegt), `.htaccess`, `.user.ini` und `web.config` aus dem
  Wurzelverzeichnis sowie die Drop-ins aus `wp-content` (`object-cache.php`, `advanced-cache.php`,
  `db.php` …). Die Rollback-Sicherung vor einem Core-Update weiterhin nicht.

= 1.1.0 =
* Vollständige Sicherungen für das Backend: Datenbank (SQL-Dump), Plugins und Core als Archive,
  erzeugt in Etappen über WP-Cron, abholbar mit Range-Anfragen, lokale Kopien verfallen nach
  48 Stunden. Ablage unter `wp-content/uploads/patchly-backups/full/`; unter nginx diesen Ordner
  bitte sperren, Apache erledigt das über `.htaccess`.
* "Bereits aktuell" wird als `skipped` gemeldet statt als Fehler `no_update_available`.

= 1.0.0 =
* Erste Fassung.
