Marktplatz: Registry-Katalog — mehrere Registries verwalten (CRUD), Quelle je Plugin, GitHub als Quelle (Folge von #57) #69

Open
opened 2026-10-16 22:23:04 +00:00 by alf · 18 comments
Owner

Warum

Der Marktplatz (#57) liest genau eine Registry-Adresse. Wer einen eigenen Marktplatz betreibt oder die Registry eines anderen nutzen will, ersetzt damit die offizielle und sieht nur noch deren Plugins. Der Marktplatz soll deshalb einen Registry-Katalog führen: mehrere Quellen, frei wählbar, auch ein GitHub-Repo. So ist jeder Nutzer frei, und der Marktplatz bleibt für alle offen, ohne dass eine Stelle bestimmt, welche Quellen es gibt. Anlass ist das geplante Forgejo-Plugin (iris/iris-plugins, „eigener Plugin-Marktplatz“), das auf diesem Feature aufbaut.

Entscheidungen (grill-me, 2026-10-17)

  • CRUD für Registries: anlegen, ändern, löschen, ein- und ausschalten, ordnen. Der Katalog liegt im Server (Mac-Server und Linux-Server gleich), die Clients (Iris, IrisClient, IrisRemote, Marktplatz-Seite) sind nur Oberfläche.
  • Quellen: jede Registry-Adresse. Ein GitHub-Repo (github.com/owner/repo, optional Zweig) wird in die Raw-Adresse umgerechnet, ebenso Forgejo-Repos. Erwartet wird das bekannte Registry-Layout (index.json, packages/, store/).
  • Standard: Die offizielle Registry ist ein vorhandener Eintrag, der sich abschalten lässt.
  • Quelle je Plugin sichtbar: Jeder Katalogeintrag trägt seine Registry. Steht dieselbe ID in mehreren aktiven Registries, wählt der Nutzer beim Installieren die Quelle. Ein installiertes Plugin merkt sich seine Registry; Updates kommen nur von dort. Die Identität eines Eintrags ist (Quelle, ID).
  • Vertrauen (Version 1): Eine Registry kommt nur nach Bestätigung mit klarer Warnung dazu („fremder Code, der auf deinem Server läuft“). Die Herkunft steht in jedem Installationsdialog (auch „Alle aktualisieren“), Pakete werden wie heute gegen die Prüfsumme des Index geprüft. Keine Signaturen in Version 1 (eigenes späteres Feature).
  • Nicht Teil: Quelle eines installierten Plugins wechseln, Signaturen, geschlossene Registries mit Anmeldung (Zugriffstoken), automatische Lizenzprüfung.

Wie

Plan, Datenmodell, Wire-Änderungen und Bauabschnitte: plugins/plugin-marktplatz/PLAN-registry-katalog.md. Betrifft Wire-Protokoll, Mac- und Linux-Server und alle Clients (alle Seiten im selben Zug prüfen). Die Beschreibung bleibt die Spezifikation; der Verlauf steht in den Kommentaren.

## Warum Der Marktplatz (#57) liest genau **eine** Registry-Adresse. Wer einen eigenen Marktplatz betreibt oder die Registry eines anderen nutzen will, ersetzt damit die offizielle und sieht nur noch deren Plugins. Der Marktplatz soll deshalb einen **Registry-Katalog** führen: mehrere Quellen, frei wählbar, auch ein GitHub-Repo. So ist jeder Nutzer frei, und der Marktplatz bleibt für alle offen, ohne dass eine Stelle bestimmt, welche Quellen es gibt. Anlass ist das geplante Forgejo-Plugin (iris/iris-plugins, „eigener Plugin-Marktplatz“), das auf diesem Feature aufbaut. ## Entscheidungen (grill-me, 2026-10-17) - **CRUD für Registries:** anlegen, ändern, löschen, ein- und ausschalten, ordnen. Der Katalog liegt im **Server** (Mac-Server und Linux-Server gleich), die Clients (Iris, IrisClient, IrisRemote, Marktplatz-Seite) sind nur Oberfläche. - **Quellen:** jede Registry-Adresse. Ein GitHub-Repo (`github.com/owner/repo`, optional Zweig) wird in die Raw-Adresse umgerechnet, ebenso Forgejo-Repos. Erwartet wird das bekannte Registry-Layout (`index.json`, `packages/`, `store/`). - **Standard:** Die offizielle Registry ist ein vorhandener Eintrag, der sich abschalten lässt. - **Quelle je Plugin sichtbar:** Jeder Katalogeintrag trägt seine Registry. Steht dieselbe ID in mehreren aktiven Registries, wählt der Nutzer beim Installieren die Quelle. Ein **installiertes Plugin merkt sich seine Registry**; Updates kommen nur von dort. Die Identität eines Eintrags ist (Quelle, ID). - **Vertrauen (Version 1):** Eine Registry kommt nur nach Bestätigung mit klarer Warnung dazu („fremder Code, der auf deinem Server läuft“). Die Herkunft steht in jedem Installationsdialog (auch „Alle aktualisieren“), Pakete werden wie heute gegen die Prüfsumme des Index geprüft. **Keine Signaturen** in Version 1 (eigenes späteres Feature). - **Nicht Teil:** Quelle eines installierten Plugins wechseln, Signaturen, geschlossene Registries mit Anmeldung (Zugriffstoken), automatische Lizenzprüfung. ## Wie Plan, Datenmodell, Wire-Änderungen und Bauabschnitte: `plugins/plugin-marktplatz/PLAN-registry-katalog.md`. Betrifft Wire-Protokoll, Mac- und Linux-Server und alle Clients (alle Seiten im selben Zug prüfen). Die Beschreibung bleibt die Spezifikation; der Verlauf steht in den Kommentaren.
Author
Owner

PR #114 gemergt: docs(plugins): Pläne für den Registry-Katalog im Marktplatz (iris/Iris#69) und das Forgejo-Plugin (#113)
iris/iris-plugins#114

Commits:

  • docs(plugins): Pläne für den Registry-Katalog im Marktplatz (iris/Iris#69) und das Forgejo-Plugin (#113)
PR #114 gemergt: docs(plugins): Pläne für den Registry-Katalog im Marktplatz (iris/Iris#69) und das Forgejo-Plugin (#113) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/114 Commits: - docs(plugins): Pläne für den Registry-Katalog im Marktplatz (iris/Iris#69) und das Forgejo-Plugin (#113)
Author
Owner

PR #114 gemergt: feat(marketplace): Registry-Katalog, Kern — Quellen, Adressen, Indexprüfung, Zusammenführen (iris/Iris#69)
iris/iris-linux-server#114

Commits:

  • feat(marketplace): Registry-Katalog, Kern — Quellen, Adressen, Indexprüfung, Zusammenführen (iris/Iris#69)

Stand: Bauabschnitt 1 (Kern), Linux-Server-Seite — Plan: plugins/plugin-marktplatz/PLAN-registry-katalog.md

Befund / geändert: Neues, reines Modul iris-server/app/registry_sources.py (kein Netzwerk, kein Dateisystem), noch von nichts aufgerufen:

  • Quellen-Modell (id, name, url, art, aktiv, reihenfolge, angelegt, bestaetigt), official immer vorhanden (ensure_official), ordered, active, new_source (ohne Bestätigung, Namen oder bei doppelter Adresse keine Quelle).
  • normalize_address: GitHub (/tree/zweig, .git, ohne Zweig HEAD), raw.githubusercontent.com, Forgejo/Gitea (/src/branch/… → /raw/branch/…), sonst fertige Basis; nur https, keine Zugangsdaten/Abfrage/Anker.
  • validate_index: Schema 1, plugins mit version, categories mit id.
  • merge_catalogs: ein Eintrag je (Quelle, ID) mit source = {id, name}, Kategorien ohne Doppelte, sources mit stale/error/plugin_count; ausgefallene Quelle bricht den Rest nicht; stale oben bleibt das der offiziellen Quelle (ältere Seiten).
  • migrated_source_id: Altbestand ohne Vermerk = official.

Geprüft: tests/test_registry_sources.py, 41 Fälle, grün (reine Funktionen, ohne laufenden Server). Der Swift-Port prüft dieselben Fälle (macos-iris, gleicher Zug).

Nicht geprüft: Kein Aufruf aus Routen, kein echter Abruf einer GitHub-/Forgejo-Registry, kein Deploy — das kommt mit Abschnitt 2.

Grenzen / Entscheidungen: Ein nacktes https://host/owner/repo auf einem Nicht-GitHub-Host ist nicht von einer fertigen Basis zu unterscheiden und gilt als sonstige (der Abruf von index.json entscheidet später); erkannt werden nur die Formen …/src/branch/<zweig> und …/raw/branch/<zweig>.

Offen: Abschnitte 2–6 (Speicherung/Routen, Seite, Mac-Server, Clients, Wire-Doku); die drei offenen Fragen im Plan bleiben.

PR #114 gemergt: feat(marketplace): Registry-Katalog, Kern — Quellen, Adressen, Indexprüfung, Zusammenführen (iris/Iris#69) https://forgejo.lewerken.duckdns.org/iris/iris-linux-server/pulls/114 Commits: - feat(marketplace): Registry-Katalog, Kern — Quellen, Adressen, Indexprüfung, Zusammenführen (iris/Iris#69) --- **Stand: Bauabschnitt 1 (Kern), Linux-Server-Seite** — Plan: `plugins/plugin-marktplatz/PLAN-registry-katalog.md` **Befund / geändert:** Neues, reines Modul `iris-server/app/registry_sources.py` (kein Netzwerk, kein Dateisystem), noch von nichts aufgerufen: - Quellen-Modell (`id`, `name`, `url`, `art`, `aktiv`, `reihenfolge`, `angelegt`, `bestaetigt`), `official` immer vorhanden (`ensure_official`), `ordered`, `active`, `new_source` (ohne Bestätigung, Namen oder bei doppelter Adresse keine Quelle). - `normalize_address`: GitHub (`/tree/zweig`, `.git`, ohne Zweig `HEAD`), `raw.githubusercontent.com`, Forgejo/Gitea (`/src/branch/…` → `/raw/branch/…`), sonst fertige Basis; nur `https`, keine Zugangsdaten/Abfrage/Anker. - `validate_index`: Schema 1, `plugins` mit `version`, `categories` mit `id`. - `merge_catalogs`: ein Eintrag je (Quelle, ID) mit `source` = `{id, name}`, Kategorien ohne Doppelte, `sources` mit `stale`/`error`/`plugin_count`; ausgefallene Quelle bricht den Rest nicht; `stale` oben bleibt das der offiziellen Quelle (ältere Seiten). - `migrated_source_id`: Altbestand ohne Vermerk = `official`. **Geprüft:** `tests/test_registry_sources.py`, 41 Fälle, grün (reine Funktionen, ohne laufenden Server). Der Swift-Port prüft dieselben Fälle (macos-iris, gleicher Zug). **Nicht geprüft:** Kein Aufruf aus Routen, kein echter Abruf einer GitHub-/Forgejo-Registry, kein Deploy — das kommt mit Abschnitt 2. **Grenzen / Entscheidungen:** Ein nacktes `https://host/owner/repo` auf einem Nicht-GitHub-Host ist nicht von einer fertigen Basis zu unterscheiden und gilt als `sonstige` (der Abruf von `index.json` entscheidet später); erkannt werden nur die Formen `…/src/branch/<zweig>` und `…/raw/branch/<zweig>`. **Offen:** Abschnitte 2–6 (Speicherung/Routen, Seite, Mac-Server, Clients, Wire-Doku); die drei offenen Fragen im Plan bleiben.
Author
Owner

PR #218 gemergt: feat(marketplace): Registry-Katalog, Kern — Quellen, Adressen, Indexprüfung, Zusammenführen (iris/Iris#69)
#218

Commits:

  • feat(marketplace): Registry-Katalog, Kern — Quellen, Adressen, Indexprüfung, Zusammenführen (iris/Iris#69)

Stand: Bauabschnitt 1 (Kern), Mac-Seite — Plan: plugins/plugin-marktplatz/PLAN-registry-katalog.md

Befund / geändert: Neues, reines Modul Iris/RegistrySourcesCore.swift (Foundation-only, Port von registry_sources.py, gleiche Formen und Texte), noch von nichts aufgerufen:

  • Quellen-Modell (id, name, url, art, aktiv, reihenfolge, angelegt, bestaetigt), official immer vorhanden (ensure_official), ordered, active, new_source (ohne Bestätigung, Namen oder bei doppelter Adresse keine Quelle).
  • normalize_address: GitHub (/tree/zweig, .git, ohne Zweig HEAD), raw.githubusercontent.com, Forgejo/Gitea (/src/branch/… → /raw/branch/…), sonst fertige Basis; nur https, keine Zugangsdaten/Abfrage/Anker.
  • validate_index: Schema 1, plugins mit version, categories mit id.
  • merge_catalogs: ein Eintrag je (Quelle, ID) mit source = {id, name}, Kategorien ohne Doppelte, sources mit stale/error/plugin_count; ausgefallene Quelle bricht den Rest nicht; stale oben bleibt das der offiziellen Quelle (ältere Seiten).
  • migrated_source_id: Altbestand ohne Vermerk = official.

Geprüft: scripts/test-marketplace-core.sh (swiftc, kein Xcode-Build): 369 Prüfungen, 0 Fehler — dieselben Fälle wie test_registry_sources.py im Linux-Server, dazu die bisherigen Marktplatz-Tests.

Nicht geprüft: Kein Aufruf aus Routen, kein echter Abruf einer GitHub-/Forgejo-Registry, kein Xcode-Build der Apps (die Datei liegt in Iris/ und ist damit in beiden Targets, Foundation-only) — Routen und Dienst kommen mit Abschnitt 4.

Grenzen / Entscheidungen: Ein nacktes https://host/owner/repo auf einem Nicht-GitHub-Host ist nicht von einer fertigen Basis zu unterscheiden und gilt als sonstige (der Abruf von index.json entscheidet später); erkannt werden nur die Formen …/src/branch/<zweig> und …/raw/branch/<zweig>.

Offen: Abschnitte 2–6 (Speicherung/Routen, Seite, Mac-Server, Clients, Wire-Doku); die drei offenen Fragen im Plan bleiben.

PR #218 gemergt: feat(marketplace): Registry-Katalog, Kern — Quellen, Adressen, Indexprüfung, Zusammenführen (iris/Iris#69) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/218 Commits: - feat(marketplace): Registry-Katalog, Kern — Quellen, Adressen, Indexprüfung, Zusammenführen (iris/Iris#69) --- **Stand: Bauabschnitt 1 (Kern), Mac-Seite** — Plan: `plugins/plugin-marktplatz/PLAN-registry-katalog.md` **Befund / geändert:** Neues, reines Modul `Iris/RegistrySourcesCore.swift` (Foundation-only, Port von `registry_sources.py`, gleiche Formen und Texte), noch von nichts aufgerufen: - Quellen-Modell (`id`, `name`, `url`, `art`, `aktiv`, `reihenfolge`, `angelegt`, `bestaetigt`), `official` immer vorhanden (`ensure_official`), `ordered`, `active`, `new_source` (ohne Bestätigung, Namen oder bei doppelter Adresse keine Quelle). - `normalize_address`: GitHub (`/tree/zweig`, `.git`, ohne Zweig `HEAD`), `raw.githubusercontent.com`, Forgejo/Gitea (`/src/branch/…` → `/raw/branch/…`), sonst fertige Basis; nur `https`, keine Zugangsdaten/Abfrage/Anker. - `validate_index`: Schema 1, `plugins` mit `version`, `categories` mit `id`. - `merge_catalogs`: ein Eintrag je (Quelle, ID) mit `source` = `{id, name}`, Kategorien ohne Doppelte, `sources` mit `stale`/`error`/`plugin_count`; ausgefallene Quelle bricht den Rest nicht; `stale` oben bleibt das der offiziellen Quelle (ältere Seiten). - `migrated_source_id`: Altbestand ohne Vermerk = `official`. **Geprüft:** `scripts/test-marketplace-core.sh` (swiftc, kein Xcode-Build): 369 Prüfungen, 0 Fehler — dieselben Fälle wie `test_registry_sources.py` im Linux-Server, dazu die bisherigen Marktplatz-Tests. **Nicht geprüft:** Kein Aufruf aus Routen, kein echter Abruf einer GitHub-/Forgejo-Registry, kein Xcode-Build der Apps (die Datei liegt in `Iris/` und ist damit in beiden Targets, Foundation-only) — Routen und Dienst kommen mit Abschnitt 4. **Grenzen / Entscheidungen:** Ein nacktes `https://host/owner/repo` auf einem Nicht-GitHub-Host ist nicht von einer fertigen Basis zu unterscheiden und gilt als `sonstige` (der Abruf von `index.json` entscheidet später); erkannt werden nur die Formen `…/src/branch/<zweig>` und `…/raw/branch/<zweig>`. **Offen:** Abschnitte 2–6 (Speicherung/Routen, Seite, Mac-Server, Clients, Wire-Doku); die drei offenen Fragen im Plan bleiben.
Author
Owner

PR #319 gemergt: docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 1 (iris/Iris#69)
iris/iris-plugins#319

Commits:

  • docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 1 (iris/Iris#69)
PR #319 gemergt: docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 1 (iris/Iris#69) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/319 Commits: - docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 1 (iris/Iris#69)
Author
Owner

PR #115 gemergt: feat(marketplace): Registry-Katalog im Linux-Server — Quellen, Katalog, Installation je Quelle (iris/Iris#69)
iris/iris-linux-server#115

Commits:

  • feat(marketplace): Registry-Katalog im Linux-Server — Quellen, Katalog, Installation je Quelle (iris/Iris#69)

Stand: Bauabschnitt 2 (Linux-Server) gebaut und auf alf@iris-server deployt — Plan: plugins/plugin-marktplatz/PLAN-registry-katalog.md

Geändert

  • registry_store.py (neu): Quellenliste in /data/registry-sources.json (die offizielle immer dabei, Adresse folgt IRIS_PLUGIN_REGISTRY_URL; Anlegen, Ändern, Ordnen, Löschen) und Installationsvermerk in /data/plugin-sources.json.
  • Offene Frage aus dem Plan geklärt: Der Vermerk steht bewusst in einer eigenen Datei, nicht in plugins-index.json — der Installer baut diesen Eintrag bei jeder Installation neu aus dem Manifest, der Restore installiert aus den gesicherten Archiven; ein Feld dort ginge bei Update und Restore verloren. Ohne Vermerk gilt official (Altbestand), uninstall_plugin löscht den Vermerk, eine gelöschte Quelle macht ihre Plugins „privat“ (bleiben installiert, keine Registry aktualisiert sie).
  • marketplace.py: Zwischenspeicher je Quelle (Datei marketplace-index-cache[-<id>].json); GET /marketplace/api/catalog führt alle aktiven Quellen zusammen (source je Eintrag, sources); Status gilt je (Quelle, ID) — dieselbe ID aus anderer Quelle installiert ist hier gesperrt („erst entfernen“); Abhängigkeiten werden zuerst in der Quelle des Plugins, dann in den übrigen aktiven Quellen aufgelöst (resolve_install_plan); preview/install_with_requires/package_file/remove_plugin nehmen source_id, Zusammenfassungen nennen ihre Quelle; „Alle aktualisieren“ (update_all) läuft je Quelle und macht bei Ausfall einer Quelle mit den übrigen weiter (Fehler je Plugin im Ergebnis); Medien einer fremden Quelle tragen ?source=<id>; check_source prüft eine Adresse ohne zu speichern.
  • Routen (plugin_registry_routes.py): GET/POST /plugin-registry/sources, POST …/sources/check, PUT/DELETE …/sources/{id}; update, install, preview, package-file, remove nehmen source (ohne: wie bisher). Anlegen nur mit bestaetigt: true — ohne Bestätigung gibt es auch keinen Abruf beim fremden Server.
  • plugin_registry.py: base_url/source_id in fetch_index, _download_verified, _install, install_from_registry, update_installed; neue IndexFormatError (falsches Format = Eingabefehler 400 beim Prüfen, kein 502).

Geprüft

  • tests/test_registry_catalog.py (29 Fälle: Quellenliste, Katalog über zwei Registries, Ausfall und veralteter Cache je Quelle, Installation mit Vermerk, Abhängigkeit über Quellen, Vorschau, Entfernen, Alle aktualisieren je Quelle, Prüfen, alle Routen) plus die bisherigen Registry-/Marktplatz-Tests: 246 grün. Zwei bestehende Tests angepasst (isoliertes DATA_DIR wegen des Vermerks; die Update-Route ruft jetzt marketplace.update_all).
  • Live auf dem Dev-Host nach Deploy: Quellenliste, Prüfen (Forgejo-src/branch-Form wird zur offiziellen Registry erkannt, already_added), Ablehnen von http, Anlegen einer Zweitquelle (dieselbe Registry über :443), Katalog mit 54 Einträgen (27 je Quelle), Sperre „Schon installiert aus …“, Verweigerung der Installation aus anderer Quelle, Medien mit ?source= (200) und unbekannte Quelle (404), Löschen der Quelle.

Nicht geprüft

  • Keine echte GitHub-Registry (es gibt keine mit dem Layout); die GitHub-Normalisierung ist nur per Test belegt.
  • Nicht die volle Live-Suite gegen den Server (pytest gegen alf@iris-server), nur der Registry-/Marktplatz-Umfang lokal.
  • Die Seite zeigt Quellen noch nicht (Abschnitt 3); Mac-Server und Clients folgen (4, 5).

Beim Live-Test passiert (offen gelegt): Ich habe zwei Aktionen mit Nebenwirkungen auf dem Dev-Host ohne Vorprüfung ausgelöst: (1) file-picker war dort schon aus der offiziellen Quelle installiert, mein „falsche Quelle“-Test hat es entfernt, weil ich genau die richtige Quelle erwischt hatte — danach aus der offiziellen Registry wieder installiert (1.2.2, wie vorher); (2) ein Sammel-Update mit {} hat die ausstehenden Updates der installierten Plugins eingespielt (comfyui-bridge, comfyui-workflows, heartmula, iris-plugin-dev, iris-solidcraft, iris-web-automation, marker, strata-modelle, translate). Sandbox-Container wurden danach wie üblich entfernt.

Grenzen: plugin_count in sources zählt alle Katalogeinträge (auch ohne Linux-Build), check nur die für diesen Server gebauten — die beiden Zahlen unterscheiden sich bewusst. Der Seitenzugriff auf Medien fremder Quellen läuft über ?source=; ein Markdown-Bild mit relativem Pfad verliert diesen Parameter, das gehört in die Seite (Abschnitt 3).

Offen: Abschnitte 3–6; im Plan bleiben die GitHub-Ratenbegrenzung und private Repos offen (Version 1: nur öffentlich lesbar).

PR #115 gemergt: feat(marketplace): Registry-Katalog im Linux-Server — Quellen, Katalog, Installation je Quelle (iris/Iris#69) https://forgejo.lewerken.duckdns.org/iris/iris-linux-server/pulls/115 Commits: - feat(marketplace): Registry-Katalog im Linux-Server — Quellen, Katalog, Installation je Quelle (iris/Iris#69) --- **Stand: Bauabschnitt 2 (Linux-Server) gebaut und auf `alf@iris-server` deployt** — Plan: `plugins/plugin-marktplatz/PLAN-registry-katalog.md` **Geändert** - `registry_store.py` (neu): Quellenliste in `/data/registry-sources.json` (die offizielle immer dabei, Adresse folgt `IRIS_PLUGIN_REGISTRY_URL`; Anlegen, Ändern, Ordnen, Löschen) und **Installationsvermerk** in `/data/plugin-sources.json`. - **Offene Frage aus dem Plan geklärt:** Der Vermerk steht bewusst in einer **eigenen Datei**, nicht in `plugins-index.json` — der Installer baut diesen Eintrag bei jeder Installation neu aus dem Manifest, der Restore installiert aus den gesicherten Archiven; ein Feld dort ginge bei Update und Restore verloren. Ohne Vermerk gilt `official` (Altbestand), `uninstall_plugin` löscht den Vermerk, eine gelöschte Quelle macht ihre Plugins „privat“ (bleiben installiert, keine Registry aktualisiert sie). - `marketplace.py`: Zwischenspeicher je Quelle (Datei `marketplace-index-cache[-<id>].json`); `GET /marketplace/api/catalog` führt alle aktiven Quellen zusammen (`source` je Eintrag, `sources`); Status gilt je (Quelle, ID) — dieselbe ID aus anderer Quelle installiert ist hier gesperrt („erst entfernen“); Abhängigkeiten werden zuerst in der Quelle des Plugins, dann in den übrigen aktiven Quellen aufgelöst (`resolve_install_plan`); `preview`/`install_with_requires`/`package_file`/`remove_plugin` nehmen `source_id`, Zusammenfassungen nennen ihre Quelle; „Alle aktualisieren“ (`update_all`) läuft je Quelle und macht bei Ausfall einer Quelle mit den übrigen weiter (Fehler je Plugin im Ergebnis); Medien einer fremden Quelle tragen `?source=<id>`; `check_source` prüft eine Adresse ohne zu speichern. - Routen (`plugin_registry_routes.py`): `GET/POST /plugin-registry/sources`, `POST …/sources/check`, `PUT/DELETE …/sources/{id}`; `update`, `install`, `preview`, `package-file`, `remove` nehmen `source` (ohne: wie bisher). Anlegen nur mit `bestaetigt: true` — ohne Bestätigung gibt es auch keinen Abruf beim fremden Server. - `plugin_registry.py`: `base_url`/`source_id` in `fetch_index`, `_download_verified`, `_install`, `install_from_registry`, `update_installed`; neue `IndexFormatError` (falsches Format = Eingabefehler 400 beim Prüfen, kein 502). **Geprüft** - `tests/test_registry_catalog.py` (29 Fälle: Quellenliste, Katalog über zwei Registries, Ausfall und veralteter Cache je Quelle, Installation mit Vermerk, Abhängigkeit über Quellen, Vorschau, Entfernen, Alle aktualisieren je Quelle, Prüfen, alle Routen) plus die bisherigen Registry-/Marktplatz-Tests: 246 grün. Zwei bestehende Tests angepasst (isoliertes `DATA_DIR` wegen des Vermerks; die Update-Route ruft jetzt `marketplace.update_all`). - Live auf dem Dev-Host nach Deploy: Quellenliste, Prüfen (Forgejo-`src/branch`-Form wird zur offiziellen Registry erkannt, `already_added`), Ablehnen von `http`, Anlegen einer Zweitquelle (dieselbe Registry über `:443`), Katalog mit 54 Einträgen (27 je Quelle), Sperre „Schon installiert aus …“, Verweigerung der Installation aus anderer Quelle, Medien mit `?source=` (200) und unbekannte Quelle (404), Löschen der Quelle. **Nicht geprüft** - Keine echte GitHub-Registry (es gibt keine mit dem Layout); die GitHub-Normalisierung ist nur per Test belegt. - Nicht die volle Live-Suite gegen den Server (`pytest` gegen `alf@iris-server`), nur der Registry-/Marktplatz-Umfang lokal. - Die Seite zeigt Quellen noch nicht (Abschnitt 3); Mac-Server und Clients folgen (4, 5). **Beim Live-Test passiert (offen gelegt):** Ich habe zwei Aktionen mit Nebenwirkungen auf dem Dev-Host ohne Vorprüfung ausgelöst: (1) `file-picker` war dort schon aus der offiziellen Quelle installiert, mein „falsche Quelle“-Test hat es entfernt, weil ich genau die richtige Quelle erwischt hatte — danach aus der offiziellen Registry wieder installiert (1.2.2, wie vorher); (2) ein Sammel-Update mit `{}` hat die ausstehenden Updates der installierten Plugins eingespielt (comfyui-bridge, comfyui-workflows, heartmula, iris-plugin-dev, iris-solidcraft, iris-web-automation, marker, strata-modelle, translate). Sandbox-Container wurden danach wie üblich entfernt. **Grenzen:** `plugin_count` in `sources` zählt alle Katalogeinträge (auch ohne Linux-Build), `check` nur die für diesen Server gebauten — die beiden Zahlen unterscheiden sich bewusst. Der Seitenzugriff auf Medien fremder Quellen läuft über `?source=`; ein Markdown-Bild mit relativem Pfad verliert diesen Parameter, das gehört in die Seite (Abschnitt 3). **Offen:** Abschnitte 3–6; im Plan bleiben die GitHub-Ratenbegrenzung und private Repos offen (Version 1: nur öffentlich lesbar).
Author
Owner

PR #320 gemergt: docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 2 (iris/Iris#69)
iris/iris-plugins#320

Commits:

  • docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 2 (iris/Iris#69)
PR #320 gemergt: docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 2 (iris/Iris#69) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/320 Commits: - docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 2 (iris/Iris#69)
Author
Owner

PR #116 gemergt: feat(marketplace): Registry-Katalog — Seite mit Quellenkennzeichen, Filter, Quellenwahl und Verwaltung (iris/Iris#69)
iris/iris-linux-server#116

Commits:

  • feat(marketplace): Registry-Katalog — Seite mit Quellenkennzeichen, Filter, Quellenwahl und Verwaltung (iris/Iris#69)

Stand: Bauabschnitt 3 (Marktplatz-Seite, Quelle im Linux-Server) — Plan: plugins/plugin-marktplatz/PLAN-registry-katalog.md

Geändert

  • marketplace_web/index.html: Alle Zustände der Seite (offen, Versionen, Changelog, Anleitung, „wartet auf Bestätigung“) hängen jetzt an (Quelle, ID) statt an der Plugin-ID. Kachel und Detail zeigen die Registry als Kennzeichen (nur wenn es mehr als eine aktive Quelle gibt), dazu ein Filter „Registry“. Steht dieselbe ID in mehreren Registries, zeigt das Detail eine Quellenwahl (Knöpfe je Registry mit Version); jede Kachel installiert genau aus ihrer Quelle. Ausgefallene weitere Registries stehen als Hinweis oben, nicht als Gesamtfehler.
  • Verwaltung der Quellen: Knopf „Quellen“ (nur, wenn der Katalog sources führt, ältere Server blenden ihn aus) öffnet eine Ansicht mit Liste (Name, Art, Adresse, Anzahl Plugins, Fehler/Stand, Bestätigungsdatum), Schalter „aktiv“, Reihenfolge ↑↓, Umbenennen, Löschen mit Rückfrage und „Quelle hinzufügen“ mit Warnung „fremder Code“ und Vorabprüfung (Name, https://).
  • Brücke (additiv): install/update/remove tragen source, nur wenn nicht official (Nachrichten an eine ältere App bleiben unverändert). Neu: source_add {name, address}, source_update {source, name?, aktiv?, reihenfolge?}, source_delete {source}; Rückmeldung wie bisher über irisMarketplaceDone({id, action, status: added|updated|deleted|cancelled|error, message}), danach lädt die Seite Katalog und Liste neu. Die Seite kennt nur das Lese-Token und ändert selbst nichts: Prüfung der Adresse, Warnung und ausdrückliche Bestätigung gehören in die App (Abschnitt 5).
  • Neue Lese-Route GET /marketplace/api/sources (Lese-Token oder Bearer): alle Quellen, auch abgeschaltete, nur zum Ansehen.
  • Relativ aufgelöste Markdown-Bilder (_attachments/…) behalten ?source= einer fremden Registry.

Geprüft

  • Browser-Test in Chrome gegen einen Mock-Server (echte index.html, Katalog aus den echten Funktionen build_catalog/merge_catalogs mit zwei Registries, derselben Plugin-ID, einer ausgefallenen und einer abgeschalteten Quelle), einmal mit simulierter App-Brücke, einmal ohne: Kennzeichen, Filter, Hinweis zur ausgefallenen Registry, Quellenwahl und Wechsel, Nachrichten der Brücke (source nur bei nicht-offizieller Quelle), alle Verwaltungsaktionen samt Nutzlast, Validierung beim Hinzufügen, error-Rückmeldung, Escape, Hinweise im Browser ohne Brücke.
  • Tests: 248 grün im Registry-/Marktplatz-Umfang (neu: Lese-Route für Quellen mit/ohne Token). Deploy auf alf@iris-server; dort nur lesende Aufrufe geprüft (Seite enthält den Knopf, Quellen-Route 200 mit Token und 401 ohne).

Nicht geprüft

  • Mit der echten App: Die Brücken-Nachrichten source_* und source an install/update/remove kennt noch keine App (Abschnitt 5); bis dahin ignorieren sie die Nachrichten bzw. verlassen sich auf official. Die Verwaltung funktioniert also erst mit Abschnitt 5 wirklich.
  • Hell-Modus und Telefonbreite habe ich nicht ausprobiert (gleiche Farbvariablen und umbrechende Zeilen wie die übrige Seite).
  • Kein Test der Seite gegen den Mac-Server (liefert bis Abschnitt 4 noch kein sources: Knopf und Kennzeichen bleiben dann weg).

Grenzen: Die Wire-Doku (02-Wire-Protokoll.md) zieht Abschnitt 6 nach.

Offen: Abschnitte 4–6.

PR #116 gemergt: feat(marketplace): Registry-Katalog — Seite mit Quellenkennzeichen, Filter, Quellenwahl und Verwaltung (iris/Iris#69) https://forgejo.lewerken.duckdns.org/iris/iris-linux-server/pulls/116 Commits: - feat(marketplace): Registry-Katalog — Seite mit Quellenkennzeichen, Filter, Quellenwahl und Verwaltung (iris/Iris#69) --- **Stand: Bauabschnitt 3 (Marktplatz-Seite, Quelle im Linux-Server)** — Plan: `plugins/plugin-marktplatz/PLAN-registry-katalog.md` **Geändert** - `marketplace_web/index.html`: Alle Zustände der Seite (offen, Versionen, Changelog, Anleitung, „wartet auf Bestätigung“) hängen jetzt an **(Quelle, ID)** statt an der Plugin-ID. Kachel und Detail zeigen die Registry als Kennzeichen (nur wenn es mehr als eine aktive Quelle gibt), dazu ein Filter „Registry“. Steht dieselbe ID in mehreren Registries, zeigt das Detail eine **Quellenwahl** (Knöpfe je Registry mit Version); jede Kachel installiert genau aus ihrer Quelle. Ausgefallene weitere Registries stehen als Hinweis oben, nicht als Gesamtfehler. - **Verwaltung der Quellen:** Knopf „Quellen“ (nur, wenn der Katalog `sources` führt, ältere Server blenden ihn aus) öffnet eine Ansicht mit Liste (Name, Art, Adresse, Anzahl Plugins, Fehler/Stand, Bestätigungsdatum), Schalter „aktiv“, Reihenfolge ↑↓, Umbenennen, Löschen mit Rückfrage und „Quelle hinzufügen“ mit Warnung „fremder Code“ und Vorabprüfung (Name, `https://`). - **Brücke (additiv):** `install`/`update`/`remove` tragen `source`, **nur wenn nicht `official`** (Nachrichten an eine ältere App bleiben unverändert). Neu: `source_add {name, address}`, `source_update {source, name?, aktiv?, reihenfolge?}`, `source_delete {source}`; Rückmeldung wie bisher über `irisMarketplaceDone({id, action, status: added|updated|deleted|cancelled|error, message})`, danach lädt die Seite Katalog und Liste neu. Die Seite kennt nur das Lese-Token und ändert selbst nichts: Prüfung der Adresse, Warnung und ausdrückliche Bestätigung gehören in die App (Abschnitt 5). - Neue Lese-Route `GET /marketplace/api/sources` (Lese-Token oder Bearer): alle Quellen, auch abgeschaltete, nur zum Ansehen. - Relativ aufgelöste Markdown-Bilder (`_attachments/…`) behalten `?source=` einer fremden Registry. **Geprüft** - Browser-Test in Chrome gegen einen Mock-Server (echte `index.html`, Katalog aus den echten Funktionen `build_catalog`/`merge_catalogs` mit zwei Registries, derselben Plugin-ID, einer ausgefallenen und einer abgeschalteten Quelle), einmal mit simulierter App-Brücke, einmal ohne: Kennzeichen, Filter, Hinweis zur ausgefallenen Registry, Quellenwahl und Wechsel, Nachrichten der Brücke (`source` nur bei nicht-offizieller Quelle), alle Verwaltungsaktionen samt Nutzlast, Validierung beim Hinzufügen, `error`-Rückmeldung, Escape, Hinweise im Browser ohne Brücke. - Tests: 248 grün im Registry-/Marktplatz-Umfang (neu: Lese-Route für Quellen mit/ohne Token). Deploy auf `alf@iris-server`; dort nur lesende Aufrufe geprüft (Seite enthält den Knopf, Quellen-Route 200 mit Token und 401 ohne). **Nicht geprüft** - **Mit der echten App:** Die Brücken-Nachrichten `source_*` und `source` an `install`/`update`/`remove` kennt noch keine App (Abschnitt 5); bis dahin ignorieren sie die Nachrichten bzw. verlassen sich auf `official`. Die Verwaltung funktioniert also erst mit Abschnitt 5 wirklich. - Hell-Modus und Telefonbreite habe ich nicht ausprobiert (gleiche Farbvariablen und umbrechende Zeilen wie die übrige Seite). - Kein Test der Seite gegen den Mac-Server (liefert bis Abschnitt 4 noch kein `sources`: Knopf und Kennzeichen bleiben dann weg). **Grenzen:** Die Wire-Doku (`02-Wire-Protokoll.md`) zieht Abschnitt 6 nach. **Offen:** Abschnitte 4–6.
Author
Owner

PR #219 gemergt: feat(marketplace): Registry-Katalog — Seitenkopie mit Quellenverwaltung (iris/Iris#69)
#219

Commits:

  • feat(marketplace): Registry-Katalog — Seitenkopie mit Quellenverwaltung (iris/Iris#69)

Stand: Bauabschnitt 3 (Marktplatz-Seite, Kopie in der Mac-App) — Plan: plugins/plugin-marktplatz/PLAN-registry-katalog.md

Geändert

  • marketplace_web/index.html: Alle Zustände der Seite (offen, Versionen, Changelog, Anleitung, „wartet auf Bestätigung“) hängen jetzt an (Quelle, ID) statt an der Plugin-ID. Kachel und Detail zeigen die Registry als Kennzeichen (nur wenn es mehr als eine aktive Quelle gibt), dazu ein Filter „Registry“. Steht dieselbe ID in mehreren Registries, zeigt das Detail eine Quellenwahl (Knöpfe je Registry mit Version); jede Kachel installiert genau aus ihrer Quelle. Ausgefallene weitere Registries stehen als Hinweis oben, nicht als Gesamtfehler.
  • Verwaltung der Quellen: Knopf „Quellen“ (nur, wenn der Katalog sources führt, ältere Server blenden ihn aus) öffnet eine Ansicht mit Liste (Name, Art, Adresse, Anzahl Plugins, Fehler/Stand, Bestätigungsdatum), Schalter „aktiv“, Reihenfolge ↑↓, Umbenennen, Löschen mit Rückfrage und „Quelle hinzufügen“ mit Warnung „fremder Code“ und Vorabprüfung (Name, https://).
  • Brücke (additiv): install/update/remove tragen source, nur wenn nicht official (Nachrichten an eine ältere App bleiben unverändert). Neu: source_add {name, address}, source_update {source, name?, aktiv?, reihenfolge?}, source_delete {source}; Rückmeldung wie bisher über irisMarketplaceDone({id, action, status: added|updated|deleted|cancelled|error, message}), danach lädt die Seite Katalog und Liste neu. Die Seite kennt nur das Lese-Token und ändert selbst nichts: Prüfung der Adresse, Warnung und ausdrückliche Bestätigung gehören in die App (Abschnitt 5).
  • Neue Lese-Route GET /marketplace/api/sources (Lese-Token oder Bearer): alle Quellen, auch abgeschaltete, nur zum Ansehen.
  • Relativ aufgelöste Markdown-Bilder (_attachments/…) behalten ?source= einer fremden Registry.

Geprüft

  • Browser-Test in Chrome gegen einen Mock-Server (echte index.html, Katalog aus den echten Funktionen build_catalog/merge_catalogs mit zwei Registries, derselben Plugin-ID, einer ausgefallenen und einer abgeschalteten Quelle), einmal mit simulierter App-Brücke, einmal ohne: Kennzeichen, Filter, Hinweis zur ausgefallenen Registry, Quellenwahl und Wechsel, Nachrichten der Brücke (source nur bei nicht-offizieller Quelle), alle Verwaltungsaktionen samt Nutzlast, Validierung beim Hinzufügen, error-Rückmeldung, Escape, Hinweise im Browser ohne Brücke.
  • Abgleich: tools/check-marketplace-page-sync (Kopie von linux-server/iris-server/app/marketplace_web/index.html, im Linux-Server geprüft und shippt im selben Zug; siehe dortigen Kommentar).

Nicht geprüft

  • Mit der echten App: Die Brücken-Nachrichten source_* und source an install/update/remove kennt noch keine App (Abschnitt 5); bis dahin ignorieren sie die Nachrichten bzw. verlassen sich auf official. Die Verwaltung funktioniert also erst mit Abschnitt 5 wirklich.
  • Hell-Modus und Telefonbreite habe ich nicht ausprobiert (gleiche Farbvariablen und umbrechende Zeilen wie die übrige Seite).
  • Kein Test der Seite gegen den Mac-Server (liefert bis Abschnitt 4 noch kein sources: Knopf und Kennzeichen bleiben dann weg).

Grenzen: Die Wire-Doku (02-Wire-Protokoll.md) zieht Abschnitt 6 nach.

Offen: Abschnitte 4–6.

PR #219 gemergt: feat(marketplace): Registry-Katalog — Seitenkopie mit Quellenverwaltung (iris/Iris#69) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/219 Commits: - feat(marketplace): Registry-Katalog — Seitenkopie mit Quellenverwaltung (iris/Iris#69) --- **Stand: Bauabschnitt 3 (Marktplatz-Seite, Kopie in der Mac-App)** — Plan: `plugins/plugin-marktplatz/PLAN-registry-katalog.md` **Geändert** - `marketplace_web/index.html`: Alle Zustände der Seite (offen, Versionen, Changelog, Anleitung, „wartet auf Bestätigung“) hängen jetzt an **(Quelle, ID)** statt an der Plugin-ID. Kachel und Detail zeigen die Registry als Kennzeichen (nur wenn es mehr als eine aktive Quelle gibt), dazu ein Filter „Registry“. Steht dieselbe ID in mehreren Registries, zeigt das Detail eine **Quellenwahl** (Knöpfe je Registry mit Version); jede Kachel installiert genau aus ihrer Quelle. Ausgefallene weitere Registries stehen als Hinweis oben, nicht als Gesamtfehler. - **Verwaltung der Quellen:** Knopf „Quellen“ (nur, wenn der Katalog `sources` führt, ältere Server blenden ihn aus) öffnet eine Ansicht mit Liste (Name, Art, Adresse, Anzahl Plugins, Fehler/Stand, Bestätigungsdatum), Schalter „aktiv“, Reihenfolge ↑↓, Umbenennen, Löschen mit Rückfrage und „Quelle hinzufügen“ mit Warnung „fremder Code“ und Vorabprüfung (Name, `https://`). - **Brücke (additiv):** `install`/`update`/`remove` tragen `source`, **nur wenn nicht `official`** (Nachrichten an eine ältere App bleiben unverändert). Neu: `source_add {name, address}`, `source_update {source, name?, aktiv?, reihenfolge?}`, `source_delete {source}`; Rückmeldung wie bisher über `irisMarketplaceDone({id, action, status: added|updated|deleted|cancelled|error, message})`, danach lädt die Seite Katalog und Liste neu. Die Seite kennt nur das Lese-Token und ändert selbst nichts: Prüfung der Adresse, Warnung und ausdrückliche Bestätigung gehören in die App (Abschnitt 5). - Neue Lese-Route `GET /marketplace/api/sources` (Lese-Token oder Bearer): alle Quellen, auch abgeschaltete, nur zum Ansehen. - Relativ aufgelöste Markdown-Bilder (`_attachments/…`) behalten `?source=` einer fremden Registry. **Geprüft** - Browser-Test in Chrome gegen einen Mock-Server (echte `index.html`, Katalog aus den echten Funktionen `build_catalog`/`merge_catalogs` mit zwei Registries, derselben Plugin-ID, einer ausgefallenen und einer abgeschalteten Quelle), einmal mit simulierter App-Brücke, einmal ohne: Kennzeichen, Filter, Hinweis zur ausgefallenen Registry, Quellenwahl und Wechsel, Nachrichten der Brücke (`source` nur bei nicht-offizieller Quelle), alle Verwaltungsaktionen samt Nutzlast, Validierung beim Hinzufügen, `error`-Rückmeldung, Escape, Hinweise im Browser ohne Brücke. - Abgleich: `tools/check-marketplace-page-sync` (Kopie von `linux-server/iris-server/app/marketplace_web/index.html`, im Linux-Server geprüft und shippt im selben Zug; siehe dortigen Kommentar). **Nicht geprüft** - **Mit der echten App:** Die Brücken-Nachrichten `source_*` und `source` an `install`/`update`/`remove` kennt noch keine App (Abschnitt 5); bis dahin ignorieren sie die Nachrichten bzw. verlassen sich auf `official`. Die Verwaltung funktioniert also erst mit Abschnitt 5 wirklich. - Hell-Modus und Telefonbreite habe ich nicht ausprobiert (gleiche Farbvariablen und umbrechende Zeilen wie die übrige Seite). - Kein Test der Seite gegen den Mac-Server (liefert bis Abschnitt 4 noch kein `sources`: Knopf und Kennzeichen bleiben dann weg). **Grenzen:** Die Wire-Doku (`02-Wire-Protokoll.md`) zieht Abschnitt 6 nach. **Offen:** Abschnitte 4–6.
Author
Owner

PR #321 gemergt: docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 3 (iris/Iris#69)
iris/iris-plugins#321

Commits:

  • docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 3 (iris/Iris#69)
PR #321 gemergt: docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 3 (iris/Iris#69) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/321 Commits: - docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 3 (iris/Iris#69)
Author
Owner

PR #220 gemergt: feat(marketplace): Registry-Katalog im Mac-Server — Quellen, Katalog, Installation je Quelle (iris/Iris#69)
#220

Commits:

  • feat(marketplace): Registry-Katalog im Mac-Server — Quellen, Katalog, Installation je Quelle (iris/Iris#69)

Stand: Bauabschnitt 4 (Mac-Server) — Plan: plugins/plugin-marktplatz/PLAN-registry-katalog.md

Geändert (gleiche Wire-Form wie der Linux-Server, Bauabschnitt 2)

  • RegistrySourcesStore.swift (neu, in beiden Apps übersetzbar): Quellenliste registry-sources.json (die offizielle immer dabei, Adresse folgt IRIS_PLUGIN_REGISTRY_URL bzw. der Einstellung) und Installationsvermerk plugin-sources.json in Application Support — wie im Linux-Server bewusst nicht im Plugin-Index, weil dessen Eintrag bei jeder Installation neu aus dem Manifest gebaut wird. Ohne Vermerk gilt official; PluginManager.uninstallPlugin löscht den Vermerk; eine gelöschte Quelle macht ihre Plugins „privat“.
  • RegistrySourcesCore.swift: buildMergedCatalog (je Quelle ein Katalog, Status gegen die aus ihr installierten Plugins, zusammengeführt), scopeToSource (dieselbe ID aus anderer Quelle: gesperrt „erst entfernen“), resolveInstallPlan (Abhängigkeiten zuerst in der eigenen Quelle, dann in den übrigen aktiven), fallbackEntries, ownerName. MarketplaceCore bekam dafür fallback/sourceID (Medien einer fremden Quelle tragen ?source=<id>), Standardwerte lassen alle bisherigen Aufrufe unverändert.
  • PluginRegistryService: baseURL/sourceID in fetchIndex, downloadVerified, install, installFromRegistry, updateInstalled; neue IndexFormatError (falsches Format = Eingabefehler beim Prüfen).
  • MarketplaceService: Zwischenspeicher je Quelle (marketplace-index-cache[-<id>].json, eine Quelle ausgefallen = nur sie veraltet), Katalog über alle aktiven Quellen (parallel geladen, Index einer fremden Quelle streng geprüft), preview/installWithRequires/packageFile/removePlugin/storeFile mit sourceID, Zusammenfassungen nennen ihre Quelle, updateAll je Quelle (Ausfall einer Quelle hält die übrigen nicht auf; Plugins einer gelöschten/abgeschalteten Quelle werden übersprungen), checkSource.
  • IrisRemoteServer: GET/POST /plugin-registry/sources, POST …/sources/check, PUT/DELETE …/sources/{id}, GET /marketplace/api/sources (Lese-Token oder Bearer); update, install, preview, package-file, remove nehmen source; Medien ?source=. Anlegen nur mit bestaetigt: true, ohne Bestätigung kein Abruf beim fremden Server.

Geprüft

  • scripts/test-marketplace-core.sh: 431 Prüfungen, 0 Fehler (neu: Katalog über Quellen, Sperre bei anderer Quelle, Altbestand ohne Vermerk, Ausfall einer Quelle, Installationsplan über Quellen inkl. Zirkel, und der Speicher gegen ein Wegwerf-Verzeichnis: Quellen anlegen/ändern/ordnen/löschen, Vermerk, kaputte Datei, Wire-Form) — dieselben Fälle wie test_registry_catalog.py.
  • Build: Das Iris-Target baut (Xcode per AppleScript, nur bauen, kein Start): MarketplaceService, RegistrySourcesStore und IrisRemoteServer wurden neu übersetzt, keine Fehler.

Nicht geprüft

  • Nicht gegen die laufende App: Die Routen und MarketplaceService (hängt an PluginManager, MainActor, Netzwerk) haben keine eigenen Tests; ich habe Iris nicht neu gestartet, weil das die laufende Instanz beendet. Ein Gerätetest gegen den Mac-Server (Quelle anlegen, aus ihr installieren, Update, Entfernen) steht aus (Abschnitt 6).
  • Das IrisClient-Target habe ich nicht gebaut (die neuen Dateien sind Foundation-only und liegen auch dort, PluginManager und die Dienste sind dort ausgeschlossen).
  • Keine echte GitHub-Registry (es gibt keine mit dem Layout).

Offen: Abschnitte 5 (Clients: Dialoge, Brücke mit source_*, Alle aktualisieren je Quelle) und 6 (Wire-Doku, Daily Logs, Gerätetests).

PR #220 gemergt: feat(marketplace): Registry-Katalog im Mac-Server — Quellen, Katalog, Installation je Quelle (iris/Iris#69) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/220 Commits: - feat(marketplace): Registry-Katalog im Mac-Server — Quellen, Katalog, Installation je Quelle (iris/Iris#69) --- **Stand: Bauabschnitt 4 (Mac-Server)** — Plan: `plugins/plugin-marktplatz/PLAN-registry-katalog.md` **Geändert** (gleiche Wire-Form wie der Linux-Server, Bauabschnitt 2) - `RegistrySourcesStore.swift` (neu, in beiden Apps übersetzbar): Quellenliste `registry-sources.json` (die offizielle immer dabei, Adresse folgt `IRIS_PLUGIN_REGISTRY_URL` bzw. der Einstellung) und **Installationsvermerk** `plugin-sources.json` in Application Support — wie im Linux-Server bewusst nicht im Plugin-Index, weil dessen Eintrag bei jeder Installation neu aus dem Manifest gebaut wird. Ohne Vermerk gilt `official`; `PluginManager.uninstallPlugin` löscht den Vermerk; eine gelöschte Quelle macht ihre Plugins „privat“. - `RegistrySourcesCore.swift`: `buildMergedCatalog` (je Quelle ein Katalog, Status gegen die aus ihr installierten Plugins, zusammengeführt), `scopeToSource` (dieselbe ID aus anderer Quelle: gesperrt „erst entfernen“), `resolveInstallPlan` (Abhängigkeiten zuerst in der eigenen Quelle, dann in den übrigen aktiven), `fallbackEntries`, `ownerName`. `MarketplaceCore` bekam dafür `fallback`/`sourceID` (Medien einer fremden Quelle tragen `?source=<id>`), Standardwerte lassen alle bisherigen Aufrufe unverändert. - `PluginRegistryService`: `baseURL`/`sourceID` in `fetchIndex`, `downloadVerified`, `install`, `installFromRegistry`, `updateInstalled`; neue `IndexFormatError` (falsches Format = Eingabefehler beim Prüfen). - `MarketplaceService`: Zwischenspeicher je Quelle (`marketplace-index-cache[-<id>].json`, eine Quelle ausgefallen = nur sie veraltet), Katalog über alle aktiven Quellen (parallel geladen, Index einer fremden Quelle streng geprüft), `preview`/`installWithRequires`/`packageFile`/`removePlugin`/`storeFile` mit `sourceID`, Zusammenfassungen nennen ihre Quelle, `updateAll` je Quelle (Ausfall einer Quelle hält die übrigen nicht auf; Plugins einer gelöschten/abgeschalteten Quelle werden übersprungen), `checkSource`. - `IrisRemoteServer`: `GET/POST /plugin-registry/sources`, `POST …/sources/check`, `PUT/DELETE …/sources/{id}`, `GET /marketplace/api/sources` (Lese-Token oder Bearer); `update`, `install`, `preview`, `package-file`, `remove` nehmen `source`; Medien `?source=`. Anlegen nur mit `bestaetigt: true`, ohne Bestätigung kein Abruf beim fremden Server. **Geprüft** - `scripts/test-marketplace-core.sh`: 431 Prüfungen, 0 Fehler (neu: Katalog über Quellen, Sperre bei anderer Quelle, Altbestand ohne Vermerk, Ausfall einer Quelle, Installationsplan über Quellen inkl. Zirkel, und der **Speicher** gegen ein Wegwerf-Verzeichnis: Quellen anlegen/ändern/ordnen/löschen, Vermerk, kaputte Datei, Wire-Form) — dieselben Fälle wie `test_registry_catalog.py`. - **Build:** Das Iris-Target baut (Xcode per AppleScript, nur bauen, kein Start): `MarketplaceService`, `RegistrySourcesStore` und `IrisRemoteServer` wurden neu übersetzt, keine Fehler. **Nicht geprüft** - **Nicht gegen die laufende App:** Die Routen und `MarketplaceService` (hängt an `PluginManager`, `MainActor`, Netzwerk) haben keine eigenen Tests; ich habe Iris nicht neu gestartet, weil das die laufende Instanz beendet. Ein Gerätetest gegen den Mac-Server (Quelle anlegen, aus ihr installieren, Update, Entfernen) steht aus (Abschnitt 6). - Das **IrisClient**-Target habe ich nicht gebaut (die neuen Dateien sind Foundation-only und liegen auch dort, `PluginManager` und die Dienste sind dort ausgeschlossen). - Keine echte GitHub-Registry (es gibt keine mit dem Layout). **Offen:** Abschnitte 5 (Clients: Dialoge, Brücke mit `source_*`, Alle aktualisieren je Quelle) und 6 (Wire-Doku, Daily Logs, Gerätetests).
Author
Owner

PR #322 gemergt: docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 4 (iris/Iris#69)
iris/iris-plugins#322

Commits:

  • docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 4 (iris/Iris#69)
PR #322 gemergt: docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 4 (iris/Iris#69) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/322 Commits: - docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 4 (iris/Iris#69)
Author
Owner

PR #117 gemergt: docs(routes): Registry-Quellen auch im Mac-Server (iris/Iris#69)
iris/iris-linux-server#117

Commits:

  • docs(routes): Registry-Quellen auch im Mac-Server (iris/Iris#69)
PR #117 gemergt: docs(routes): Registry-Quellen auch im Mac-Server (iris/Iris#69) https://forgejo.lewerken.duckdns.org/iris/iris-linux-server/pulls/117 Commits: - docs(routes): Registry-Quellen auch im Mac-Server (iris/Iris#69)
Author
Owner

PR #221 gemergt: feat(marketplace): Registry-Katalog in den Clients — Quelle in Dialogen und Brücke, Registry hinzufügen mit Bestätigung (iris/Iris#69)
#221

Commits:

  • feat(marketplace): Registry-Katalog in den Clients — Quelle in Dialogen und Brücke, Registry hinzufügen mit Bestätigung (iris/Iris#69)

Stand: Bauabschnitt 5 (Clients), macOS-Teil (Iris und IrisClient) — Plan: plugins/plugin-marktplatz/PLAN-registry-katalog.md. Das gemeinsame Dialog-Modell ist die Quelle der Kopie in IrisRemote (iOS), die im selben Zug shippt.

Geändert

  • MarketplaceConfirmation.swift (Modell, Quelle der iOS-Kopie): Jedes Paket und jede Aktion trägt ihre Registry (source = {id, name}), daraus die Zeile „Quelle: …“ im Installations-, Update-, Entfernen- und Sammel-Dialog (bei mitinstallierten Abhängigkeiten je Paket). MarketplaceBulkUpdate.updatablePlugins liefert die Quelle je Eintrag (ein Update bietet nur die Quelle an, aus der das Plugin installiert wurde); Dateiansicht im Dialog holt aus der Registry des Pakets (MarketplaceFileLoader bekam sourceID).
  • Brücke: install/update/remove nehmen source (nur sauber: Kleinbuchstaben/Ziffern, ≤ 32 Zeichen; sonst nichts ausgelöst und error an die Seite). Neu RegistrySourceCommand (source_add, source_update, source_delete), streng geprüft: Name ≤ 80 Zeichen, Adresse nur https:// ≤ 2048 Zeichen, aktiv nur Bool, reihenfolge Ganzzahl 0…1000, Quell-ID sauber; alles andere wird verworfen.
  • Hinzufügen mit Bestätigung (RegistrySourceConfirmation): Die App prüft erst die Adresse (POST /plugin-registry/sources/check), zeigt dann Name, Adresse, Art, Anzahl der Plugins und die Warnung „fremder Code, der auf deinem Server läuft“ (macOS: NSAlert als Sheet, Abbrechen ist die Standardwahl, nie mit Return bestätigt), und legt die Quelle erst nach Zustimmung mit bestaetigt: true an. Schon eingetragen oder unbrauchbar: Fehlermeldung an die Seite, nichts angelegt. Rückmeldung added|updated|deleted|cancelled|error über irisMarketplaceDone; beim Löschen steht, wie viele Plugins installiert bleiben.
  • RemoteServerClient: sourceID bei Vorschau, Installation, Paketdatei und Entfernen; neu checkRegistrySource, addRegistrySource, updateRegistrySource, deleteRegistrySource.
  • „Alle aktualisieren“ holt Vorschau und Installation je Eintrag aus dessen Quelle.

Geprüft

  • scripts/test-marketplace-core.sh: 475 Prüfungen, 0 Fehler (neu: Quelle in Dialog- und Katalogdaten inkl. älterem Server ohne Quelle, Updates mit Quelle, alle Fälle der Befehlsprüfung mit gültigen und ungültigen Nachrichten, Text und Warnung der Bestätigung, „schon eingetragen“, Fehler des Servers).
  • Build: Xcode (per AppleScript, nur bauen) baut Iris und IrisClient ohne Fehler; das aktive Schema ist danach wieder Iris.

Nicht geprüft

  • Nicht in der laufenden App: Weder NSAlert-Ablauf noch die echten Aufrufe gegen einen Server (Quelle anlegen, daraus installieren, Update, Entfernen) habe ich ausprobiert; ich habe Iris nicht neu gestartet. Das ist der Gerätetest in Abschnitt 6.
  • Linux-Client (PyQt6) und iris-web sind nicht Teil dieses Abschnitts (der Plan nennt Iris, IrisClient, IrisRemote); sie bekommen den Marktplatz nicht über diese Brücke.

Offen: Abschnitt 6 (Wire-Doku, Daily Logs, Gerätetests: Mac-App, iPhone, GitHub-Quelle echt).

PR #221 gemergt: feat(marketplace): Registry-Katalog in den Clients — Quelle in Dialogen und Brücke, Registry hinzufügen mit Bestätigung (iris/Iris#69) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/221 Commits: - feat(marketplace): Registry-Katalog in den Clients — Quelle in Dialogen und Brücke, Registry hinzufügen mit Bestätigung (iris/Iris#69) --- **Stand: Bauabschnitt 5 (Clients), macOS-Teil (Iris und IrisClient)** — Plan: `plugins/plugin-marktplatz/PLAN-registry-katalog.md`. Das gemeinsame Dialog-Modell ist die Quelle der Kopie in IrisRemote (iOS), die im selben Zug shippt. **Geändert** - `MarketplaceConfirmation.swift` (Modell, Quelle der iOS-Kopie): Jedes Paket und jede Aktion trägt ihre Registry (`source` = `{id, name}`), daraus die Zeile **„Quelle: …“** im Installations-, Update-, Entfernen- und Sammel-Dialog (bei mitinstallierten Abhängigkeiten je Paket). `MarketplaceBulkUpdate.updatablePlugins` liefert die Quelle je Eintrag (ein Update bietet nur die Quelle an, aus der das Plugin installiert wurde); Dateiansicht im Dialog holt aus der Registry des Pakets (`MarketplaceFileLoader` bekam `sourceID`). - **Brücke:** `install`/`update`/`remove` nehmen `source` (nur sauber: Kleinbuchstaben/Ziffern, ≤ 32 Zeichen; sonst nichts ausgelöst und `error` an die Seite). Neu `RegistrySourceCommand` (`source_add`, `source_update`, `source_delete`), streng geprüft: Name ≤ 80 Zeichen, Adresse nur `https://` ≤ 2048 Zeichen, `aktiv` nur Bool, `reihenfolge` Ganzzahl 0…1000, Quell-ID sauber; alles andere wird verworfen. - **Hinzufügen mit Bestätigung** (`RegistrySourceConfirmation`): Die App prüft erst die Adresse (`POST /plugin-registry/sources/check`), zeigt dann Name, Adresse, Art, Anzahl der Plugins und die Warnung „fremder Code, der auf deinem Server läuft“ (macOS: `NSAlert` als Sheet, **Abbrechen ist die Standardwahl**, nie mit Return bestätigt), und legt die Quelle erst nach Zustimmung mit `bestaetigt: true` an. Schon eingetragen oder unbrauchbar: Fehlermeldung an die Seite, nichts angelegt. Rückmeldung `added|updated|deleted|cancelled|error` über `irisMarketplaceDone`; beim Löschen steht, wie viele Plugins installiert bleiben. - `RemoteServerClient`: `sourceID` bei Vorschau, Installation, Paketdatei und Entfernen; neu `checkRegistrySource`, `addRegistrySource`, `updateRegistrySource`, `deleteRegistrySource`. - „Alle aktualisieren“ holt Vorschau und Installation je Eintrag aus dessen Quelle. **Geprüft** - `scripts/test-marketplace-core.sh`: 475 Prüfungen, 0 Fehler (neu: Quelle in Dialog- und Katalogdaten inkl. älterem Server ohne Quelle, Updates mit Quelle, alle Fälle der Befehlsprüfung mit gültigen und ungültigen Nachrichten, Text und Warnung der Bestätigung, „schon eingetragen“, Fehler des Servers). - **Build:** Xcode (per AppleScript, nur bauen) baut `Iris` und `IrisClient` ohne Fehler; das aktive Schema ist danach wieder `Iris`. **Nicht geprüft** - **Nicht in der laufenden App:** Weder `NSAlert`-Ablauf noch die echten Aufrufe gegen einen Server (Quelle anlegen, daraus installieren, Update, Entfernen) habe ich ausprobiert; ich habe Iris nicht neu gestartet. Das ist der Gerätetest in Abschnitt 6. - Linux-Client (PyQt6) und iris-web sind nicht Teil dieses Abschnitts (der Plan nennt Iris, IrisClient, IrisRemote); sie bekommen den Marktplatz nicht über diese Brücke. **Offen:** Abschnitt 6 (Wire-Doku, Daily Logs, Gerätetests: Mac-App, iPhone, GitHub-Quelle echt).
Author
Owner

PR #56 gemergt: feat(marketplace): Registry-Katalog in IrisRemote — Quelle in Dialogen und Brücke, Registry hinzufügen mit Bestätigung (iris/Iris#69)
iris/2ndbrain-ios#56

Commits:

  • feat(marketplace): Registry-Katalog in IrisRemote — Quelle in Dialogen und Brücke, Registry hinzufügen mit Bestätigung (iris/Iris#69)

Stand: Bauabschnitt 5 (Clients), iOS-Teil (IrisRemote) — Plan: plugins/plugin-marktplatz/PLAN-registry-katalog.md. Das gemeinsame Dialog-Modell ist eine Kopie der Mac-App (tools/check-marketplace-page-sync, „identisch“) und kam dort zuerst.

Geändert

  • MarketplaceConfirmation.swift (Modell, Quelle der iOS-Kopie): Jedes Paket und jede Aktion trägt ihre Registry (source = {id, name}), daraus die Zeile „Quelle: …“ im Installations-, Update-, Entfernen- und Sammel-Dialog (bei mitinstallierten Abhängigkeiten je Paket). MarketplaceBulkUpdate.updatablePlugins liefert die Quelle je Eintrag (ein Update bietet nur die Quelle an, aus der das Plugin installiert wurde); Dateiansicht im Dialog holt aus der Registry des Pakets (MarketplaceFileLoader bekam sourceID).
  • Brücke: install/update/remove nehmen source (nur sauber: Kleinbuchstaben/Ziffern, ≤ 32 Zeichen; sonst nichts ausgelöst und error an die Seite). Neu RegistrySourceCommand (source_add, source_update, source_delete), streng geprüft: Name ≤ 80 Zeichen, Adresse nur https:// ≤ 2048 Zeichen, aktiv nur Bool, reihenfolge Ganzzahl 0…1000, Quell-ID sauber; alles andere wird verworfen.
  • Hinzufügen mit Bestätigung (RegistrySourceConfirmation): Die App prüft erst die Adresse (POST /plugin-registry/sources/check), zeigt dann Name, Adresse, Art, Anzahl der Plugins und die Warnung „fremder Code, der auf deinem Server läuft“ (iOS: alert mit Abbrechen als Abbruchknopf und „Hinzufügen“ nur über den ausdrücklichen Knopf), und legt die Quelle erst nach Zustimmung mit bestaetigt: true an. Schon eingetragen oder unbrauchbar: Fehlermeldung an die Seite, nichts angelegt. Rückmeldung added|updated|deleted|cancelled|error über irisMarketplaceDone; beim Löschen steht, wie viele Plugins installiert bleiben.
  • RemoteServerClient: sourceID bei Vorschau, Installation, Paketdatei und Entfernen; neu checkRegistrySource, addRegistrySource, updateRegistrySource, deleteRegistrySource.
  • „Alle aktualisieren“ holt Vorschau und Installation je Eintrag aus dessen Quelle.

Geprüft

  • Build: xcodebuild für IrisRemote (Simulator, ohne Signierung, eigener DerivedData-Ordner): BUILD SUCCEEDED. Die Logik des Modells ist im Mac-Harness getestet (475 Prüfungen, siehe PR in iris/Iris); tools/check-marketplace-page-sync meldet die Kopie als identisch.

Nicht geprüft

  • Nicht auf dem iPhone: Alert-Ablauf und echte Aufrufe (Quelle anlegen, daraus installieren, Update, Entfernen) habe ich nicht ausprobiert und nichts auf ein Gerät installiert. Das ist der Gerätetest in Abschnitt 6.

Offen: Abschnitt 6 (Wire-Doku, Daily Logs, Gerätetests: Mac-App, iPhone, GitHub-Quelle echt).

PR #56 gemergt: feat(marketplace): Registry-Katalog in IrisRemote — Quelle in Dialogen und Brücke, Registry hinzufügen mit Bestätigung (iris/Iris#69) https://forgejo.lewerken.duckdns.org/iris/2ndbrain-ios/pulls/56 Commits: - feat(marketplace): Registry-Katalog in IrisRemote — Quelle in Dialogen und Brücke, Registry hinzufügen mit Bestätigung (iris/Iris#69) --- **Stand: Bauabschnitt 5 (Clients), iOS-Teil (IrisRemote)** — Plan: `plugins/plugin-marktplatz/PLAN-registry-katalog.md`. Das gemeinsame Dialog-Modell ist eine Kopie der Mac-App (`tools/check-marketplace-page-sync`, „identisch“) und kam dort zuerst. **Geändert** - `MarketplaceConfirmation.swift` (Modell, Quelle der iOS-Kopie): Jedes Paket und jede Aktion trägt ihre Registry (`source` = `{id, name}`), daraus die Zeile **„Quelle: …“** im Installations-, Update-, Entfernen- und Sammel-Dialog (bei mitinstallierten Abhängigkeiten je Paket). `MarketplaceBulkUpdate.updatablePlugins` liefert die Quelle je Eintrag (ein Update bietet nur die Quelle an, aus der das Plugin installiert wurde); Dateiansicht im Dialog holt aus der Registry des Pakets (`MarketplaceFileLoader` bekam `sourceID`). - **Brücke:** `install`/`update`/`remove` nehmen `source` (nur sauber: Kleinbuchstaben/Ziffern, ≤ 32 Zeichen; sonst nichts ausgelöst und `error` an die Seite). Neu `RegistrySourceCommand` (`source_add`, `source_update`, `source_delete`), streng geprüft: Name ≤ 80 Zeichen, Adresse nur `https://` ≤ 2048 Zeichen, `aktiv` nur Bool, `reihenfolge` Ganzzahl 0…1000, Quell-ID sauber; alles andere wird verworfen. - **Hinzufügen mit Bestätigung** (`RegistrySourceConfirmation`): Die App prüft erst die Adresse (`POST /plugin-registry/sources/check`), zeigt dann Name, Adresse, Art, Anzahl der Plugins und die Warnung „fremder Code, der auf deinem Server läuft“ (iOS: `alert` mit **Abbrechen** als Abbruchknopf und „Hinzufügen“ nur über den ausdrücklichen Knopf), und legt die Quelle erst nach Zustimmung mit `bestaetigt: true` an. Schon eingetragen oder unbrauchbar: Fehlermeldung an die Seite, nichts angelegt. Rückmeldung `added|updated|deleted|cancelled|error` über `irisMarketplaceDone`; beim Löschen steht, wie viele Plugins installiert bleiben. - `RemoteServerClient`: `sourceID` bei Vorschau, Installation, Paketdatei und Entfernen; neu `checkRegistrySource`, `addRegistrySource`, `updateRegistrySource`, `deleteRegistrySource`. - „Alle aktualisieren“ holt Vorschau und Installation je Eintrag aus dessen Quelle. **Geprüft** - **Build:** `xcodebuild` für `IrisRemote` (Simulator, ohne Signierung, eigener DerivedData-Ordner): BUILD SUCCEEDED. Die Logik des Modells ist im Mac-Harness getestet (475 Prüfungen, siehe PR in iris/Iris); `tools/check-marketplace-page-sync` meldet die Kopie als identisch. **Nicht geprüft** - **Nicht auf dem iPhone:** Alert-Ablauf und echte Aufrufe (Quelle anlegen, daraus installieren, Update, Entfernen) habe ich nicht ausprobiert und **nichts auf ein Gerät installiert**. Das ist der Gerätetest in Abschnitt 6. **Offen:** Abschnitt 6 (Wire-Doku, Daily Logs, Gerätetests: Mac-App, iPhone, GitHub-Quelle echt).
Author
Owner

PR #323 gemergt: docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 5 (iris/Iris#69)
iris/iris-plugins#323

Commits:

  • docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 5 (iris/Iris#69)
PR #323 gemergt: docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 5 (iris/Iris#69) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/323 Commits: - docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 5 (iris/Iris#69)
Author
Owner

PR #118 gemergt: feat(marketplace): Quelle hinzufügen — Vorschläge vom eigenen Forgejo, ohne Anmeldung (iris/Iris#69)
iris/iris-linux-server#118

Commits:

  • feat(marketplace): Quelle hinzufügen — Vorschläge vom eigenen Forgejo, ohne Anmeldung (iris/Iris#69)

Nachtrag zu Abschnitt 3 (Seite): Vorschläge vom Forgejo bei „Quelle hinzufügen“ — Wunsch von Alf nach dem Test auf dem iPhone (Foto): den lokalen Forgejo anbieten, möglichst ohne Anmeldedaten.

Geändert

  • Neue Lese-Route GET /marketplace/api/source-suggestions (Lese-Token oder Bearer): Die Suche läuft auf den Forgejo-Servern, auf denen schon eine Forgejo-Quelle liegt (bei Alf forgejo.lewerken.duckdns.org), mit der anonymen Forgejo-Suche (/api/v1/repos/search, nur öffentliche Repos, nie ein Token). Jedes Repo, das öffentlich, nicht leer, nicht archiviert und noch nicht eingetragen ist, wird auf ein index.json im Registry-Layout geprüft (Schema 1, 8 s je Repo, parallel, höchstens 50 Repos). Antwort {hosts, suggestions: [{full_name, name, description, address, url, plugin_count, host}], errors}; der Ausfall eines Servers steht in errors.
  • Seite: Knopf „Auf meinem Forgejo suchen“ unter „Quelle hinzufügen“; ein Treffer füllt Name und Adresse vor (angelegt wird weiterhin erst nach „Prüfen und hinzufügen“ und der Bestätigung „fremder Code“ in der App). Leere Liste, Fehler und „keine Forgejo-Quelle eingetragen“ haben eigene Texte.
  • Beim Schreiben hat ein Test eine Lücke gefunden und geschlossen: .. als Repo- oder Zweigname wäre durchgegangen (nur Zeichenklasse geprüft).

Geprüft

  • Python: 259 Tests grün im Registry-/Marktplatz-Umfang (neu: Forgejo-Basis, Filter der Suchtreffer, Grenzen, Suche gegen einen Mock-Forgejo mit gültigem, kaputtem, Index-losem und privatem Repo, schon eingetragenes Repo, Suche mit 503, keine Forgejo-Quelle).
  • Seite per Headless-Chrome gegen einen Mock (Treffer → Name/Adresse vorbelegt und source_add mit genau diesen Werten; leere Liste; Fehler). Die Chrome-Erweiterung war nicht verbunden, deshalb mit einem Testskript in der Seite.
  • Live auf dem Dev-Host nach Deploy (nur lesend): hosts: [forgejo.lewerken.duckdns.org], suggestions: [], ohne Token 401, Seite enthält den Knopf.

Grenzen

  • Heute findet die Suche nichts: Auf Alfs Forgejo hat nur iris/iris-plugin-registry ein index.json, und das ist die offizielle Quelle. Neue Registry-Repos erscheinen automatisch.
  • Private Repos brauchen ein Zugriffstoken und sind laut Plan nicht Teil von Version 1 (die anonyme Suche zeigt sie nicht).
  • Nur Forgejo/Gitea (wie bei der Adress-Normalisierung); für GitHub gibt es keine Suche.

Nicht geprüft: Der Mac-Server und die Apps mit der neuen Seite (Mac-Teil in iris/Iris, gleicher Zug).

PR #118 gemergt: feat(marketplace): Quelle hinzufügen — Vorschläge vom eigenen Forgejo, ohne Anmeldung (iris/Iris#69) https://forgejo.lewerken.duckdns.org/iris/iris-linux-server/pulls/118 Commits: - feat(marketplace): Quelle hinzufügen — Vorschläge vom eigenen Forgejo, ohne Anmeldung (iris/Iris#69) --- **Nachtrag zu Abschnitt 3 (Seite): Vorschläge vom Forgejo bei „Quelle hinzufügen“** — Wunsch von Alf nach dem Test auf dem iPhone (Foto): den lokalen Forgejo anbieten, möglichst ohne Anmeldedaten. **Geändert** - Neue Lese-Route `GET /marketplace/api/source-suggestions` (Lese-Token oder Bearer): Die Suche läuft auf den Forgejo-Servern, auf denen schon eine Forgejo-Quelle liegt (bei Alf `forgejo.lewerken.duckdns.org`), mit der **anonymen** Forgejo-Suche (`/api/v1/repos/search`, nur öffentliche Repos, nie ein Token). Jedes Repo, das öffentlich, nicht leer, nicht archiviert und noch nicht eingetragen ist, wird auf ein `index.json` im Registry-Layout geprüft (Schema 1, 8 s je Repo, parallel, höchstens 50 Repos). Antwort `{hosts, suggestions: [{full_name, name, description, address, url, plugin_count, host}], errors}`; der Ausfall eines Servers steht in `errors`. - Seite: Knopf „Auf meinem Forgejo suchen“ unter „Quelle hinzufügen“; ein Treffer füllt Name und Adresse **vor** (angelegt wird weiterhin erst nach „Prüfen und hinzufügen“ und der Bestätigung „fremder Code“ in der App). Leere Liste, Fehler und „keine Forgejo-Quelle eingetragen“ haben eigene Texte. - Beim Schreiben hat ein Test eine Lücke gefunden und geschlossen: `..` als Repo- oder Zweigname wäre durchgegangen (nur Zeichenklasse geprüft). **Geprüft** - Python: 259 Tests grün im Registry-/Marktplatz-Umfang (neu: Forgejo-Basis, Filter der Suchtreffer, Grenzen, Suche gegen einen Mock-Forgejo mit gültigem, kaputtem, Index-losem und privatem Repo, schon eingetragenes Repo, Suche mit 503, keine Forgejo-Quelle). - Seite per Headless-Chrome gegen einen Mock (Treffer → Name/Adresse vorbelegt und `source_add` mit genau diesen Werten; leere Liste; Fehler). Die Chrome-Erweiterung war nicht verbunden, deshalb mit einem Testskript in der Seite. - Live auf dem Dev-Host nach Deploy (nur lesend): `hosts: [forgejo.lewerken.duckdns.org]`, `suggestions: []`, ohne Token 401, Seite enthält den Knopf. **Grenzen** - Heute findet die Suche **nichts**: Auf Alfs Forgejo hat nur `iris/iris-plugin-registry` ein `index.json`, und das ist die offizielle Quelle. Neue Registry-Repos erscheinen automatisch. - **Private Repos** brauchen ein Zugriffstoken und sind laut Plan nicht Teil von Version 1 (die anonyme Suche zeigt sie nicht). - Nur Forgejo/Gitea (wie bei der Adress-Normalisierung); für GitHub gibt es keine Suche. **Nicht geprüft:** Der Mac-Server und die Apps mit der neuen Seite (Mac-Teil in iris/Iris, gleicher Zug).
Author
Owner

PR #222 gemergt: feat(marketplace): Quelle hinzufügen — Vorschläge vom eigenen Forgejo im Mac-Server (iris/Iris#69)
#222

Commits:

  • feat(marketplace): Quelle hinzufügen — Vorschläge vom eigenen Forgejo im Mac-Server (iris/Iris#69)

Nachtrag, Mac-Teil: Vorschläge vom Forgejo bei „Quelle hinzufügen“ — Wunsch von Alf nach dem Test auf dem iPhone (Foto): den lokalen Forgejo anbieten, möglichst ohne Anmeldedaten.

Geändert

  • Neue Lese-Route GET /marketplace/api/source-suggestions (Lese-Token oder Bearer): Die Suche läuft auf den Forgejo-Servern, auf denen schon eine Forgejo-Quelle liegt (bei Alf forgejo.lewerken.duckdns.org), mit der anonymen Forgejo-Suche (/api/v1/repos/search, nur öffentliche Repos, nie ein Token). Jedes Repo, das öffentlich, nicht leer, nicht archiviert und noch nicht eingetragen ist, wird auf ein index.json im Registry-Layout geprüft (Schema 1, 8 s je Repo, parallel, höchstens 50 Repos). Antwort {hosts, suggestions: [{full_name, name, description, address, url, plugin_count, host}], errors}; der Ausfall eines Servers steht in errors.
  • Seite: Knopf „Auf meinem Forgejo suchen“ unter „Quelle hinzufügen“; ein Treffer füllt Name und Adresse vor (angelegt wird weiterhin erst nach „Prüfen und hinzufügen“ und der Bestätigung „fremder Code“ in der App). Leere Liste, Fehler und „keine Forgejo-Quelle eingetragen“ haben eigene Texte.
  • Beim Schreiben hat ein Test eine Lücke gefunden und geschlossen: .. als Repo- oder Zweigname wäre durchgegangen (nur Zeichenklasse geprüft).

Geprüft

  • scripts/test-marketplace-core.sh: 491 Prüfungen, 0 Fehler (neu: Forgejo-Basis, Filter der Suchtreffer inkl. .., Grenze 50, Adresse wird wieder zur Raw-Basis); dieselben Fälle wie im Linux-Server. Build: Xcode baut Iris ohne Fehler.

Grenzen

  • Heute findet die Suche nichts: Auf Alfs Forgejo hat nur iris/iris-plugin-registry ein index.json, und das ist die offizielle Quelle. Neue Registry-Repos erscheinen automatisch.
  • Private Repos brauchen ein Zugriffstoken und sind laut Plan nicht Teil von Version 1 (die anonyme Suche zeigt sie nicht).
  • Nur Forgejo/Gitea (wie bei der Adress-Normalisierung); für GitHub gibt es keine Suche.

Mac-Teil: MarketplaceService.sourceSuggestions und die Route GET /marketplace/api/source-suggestions (gleiche Antwortform), RegistrySourcesCore.forgejoBase/searchCandidates, Seitenkopie aktualisiert (check-marketplace-page-sync).

Nicht geprüft: Nicht gegen die laufende Mac-App (Iris nicht neu gestartet); IrisClient und IrisRemote brauchen keine Änderung (die Seite kommt vom Server).

PR #222 gemergt: feat(marketplace): Quelle hinzufügen — Vorschläge vom eigenen Forgejo im Mac-Server (iris/Iris#69) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/222 Commits: - feat(marketplace): Quelle hinzufügen — Vorschläge vom eigenen Forgejo im Mac-Server (iris/Iris#69) --- **Nachtrag, Mac-Teil: Vorschläge vom Forgejo bei „Quelle hinzufügen“** — Wunsch von Alf nach dem Test auf dem iPhone (Foto): den lokalen Forgejo anbieten, möglichst ohne Anmeldedaten. **Geändert** - Neue Lese-Route `GET /marketplace/api/source-suggestions` (Lese-Token oder Bearer): Die Suche läuft auf den Forgejo-Servern, auf denen schon eine Forgejo-Quelle liegt (bei Alf `forgejo.lewerken.duckdns.org`), mit der **anonymen** Forgejo-Suche (`/api/v1/repos/search`, nur öffentliche Repos, nie ein Token). Jedes Repo, das öffentlich, nicht leer, nicht archiviert und noch nicht eingetragen ist, wird auf ein `index.json` im Registry-Layout geprüft (Schema 1, 8 s je Repo, parallel, höchstens 50 Repos). Antwort `{hosts, suggestions: [{full_name, name, description, address, url, plugin_count, host}], errors}`; der Ausfall eines Servers steht in `errors`. - Seite: Knopf „Auf meinem Forgejo suchen“ unter „Quelle hinzufügen“; ein Treffer füllt Name und Adresse **vor** (angelegt wird weiterhin erst nach „Prüfen und hinzufügen“ und der Bestätigung „fremder Code“ in der App). Leere Liste, Fehler und „keine Forgejo-Quelle eingetragen“ haben eigene Texte. - Beim Schreiben hat ein Test eine Lücke gefunden und geschlossen: `..` als Repo- oder Zweigname wäre durchgegangen (nur Zeichenklasse geprüft). **Geprüft** - `scripts/test-marketplace-core.sh`: 491 Prüfungen, 0 Fehler (neu: Forgejo-Basis, Filter der Suchtreffer inkl. `..`, Grenze 50, Adresse wird wieder zur Raw-Basis); dieselben Fälle wie im Linux-Server. Build: Xcode baut `Iris` ohne Fehler. **Grenzen** - Heute findet die Suche **nichts**: Auf Alfs Forgejo hat nur `iris/iris-plugin-registry` ein `index.json`, und das ist die offizielle Quelle. Neue Registry-Repos erscheinen automatisch. - **Private Repos** brauchen ein Zugriffstoken und sind laut Plan nicht Teil von Version 1 (die anonyme Suche zeigt sie nicht). - Nur Forgejo/Gitea (wie bei der Adress-Normalisierung); für GitHub gibt es keine Suche. **Mac-Teil:** `MarketplaceService.sourceSuggestions` und die Route `GET /marketplace/api/source-suggestions` (gleiche Antwortform), `RegistrySourcesCore.forgejoBase`/`searchCandidates`, Seitenkopie aktualisiert (`check-marketplace-page-sync`). **Nicht geprüft:** Nicht gegen die laufende Mac-App (Iris nicht neu gestartet); IrisClient und IrisRemote brauchen keine Änderung (die Seite kommt vom Server).
Author
Owner

PR #324 gemergt: docs(plugins): Registry-Katalog — Vorschläge vom Forgejo bei Quelle hinzufügen (iris/Iris#69)
iris/iris-plugins#324

Commits:

  • docs(plugins): Registry-Katalog — Vorschläge vom Forgejo bei Quelle hinzufügen (iris/Iris#69)
PR #324 gemergt: docs(plugins): Registry-Katalog — Vorschläge vom Forgejo bei Quelle hinzufügen (iris/Iris#69) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/324 Commits: - docs(plugins): Registry-Katalog — Vorschläge vom Forgejo bei Quelle hinzufügen (iris/Iris#69)
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
iris/Iris#69
No description provided.