Marktplatz: Registry-Katalog — mehrere Registries verwalten (CRUD), Quelle je Plugin, GitHub als Quelle (Folge von #57) #69
Labels
No labels
herkunft/alpha-feedback
status
blockiert
status
zu-testen
typ
bug
typ
docs
typ
enhancement
typ
feature
typ
idea
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
iris/Iris#69
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
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)
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/).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.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:
PR #114 gemergt: feat(marketplace): Registry-Katalog, Kern — Quellen, Adressen, Indexprüfung, Zusammenführen (iris/Iris#69)
iris/iris-linux-server#114
Commits:
Stand: Bauabschnitt 1 (Kern), Linux-Server-Seite — Plan:
plugins/plugin-marktplatz/PLAN-registry-katalog.mdBefund / geändert: Neues, reines Modul
iris-server/app/registry_sources.py(kein Netzwerk, kein Dateisystem), noch von nichts aufgerufen:id,name,url,art,aktiv,reihenfolge,angelegt,bestaetigt),officialimmer vorhanden (ensure_official),ordered,active,new_source(ohne Bestätigung, Namen oder bei doppelter Adresse keine Quelle).normalize_address: GitHub (/tree/zweig,.git, ohne ZweigHEAD),raw.githubusercontent.com, Forgejo/Gitea (/src/branch/…→/raw/branch/…), sonst fertige Basis; nurhttps, keine Zugangsdaten/Abfrage/Anker.validate_index: Schema 1,pluginsmitversion,categoriesmitid.merge_catalogs: ein Eintrag je (Quelle, ID) mitsource={id, name}, Kategorien ohne Doppelte,sourcesmitstale/error/plugin_count; ausgefallene Quelle bricht den Rest nicht;staleoben 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/repoauf einem Nicht-GitHub-Host ist nicht von einer fertigen Basis zu unterscheiden und gilt alssonstige(der Abruf vonindex.jsonentscheidet 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)
#218
Commits:
Stand: Bauabschnitt 1 (Kern), Mac-Seite — Plan:
plugins/plugin-marktplatz/PLAN-registry-katalog.mdBefund / geändert: Neues, reines Modul
Iris/RegistrySourcesCore.swift(Foundation-only, Port vonregistry_sources.py, gleiche Formen und Texte), noch von nichts aufgerufen:id,name,url,art,aktiv,reihenfolge,angelegt,bestaetigt),officialimmer vorhanden (ensure_official),ordered,active,new_source(ohne Bestätigung, Namen oder bei doppelter Adresse keine Quelle).normalize_address: GitHub (/tree/zweig,.git, ohne ZweigHEAD),raw.githubusercontent.com, Forgejo/Gitea (/src/branch/…→/raw/branch/…), sonst fertige Basis; nurhttps, keine Zugangsdaten/Abfrage/Anker.validate_index: Schema 1,pluginsmitversion,categoriesmitid.merge_catalogs: ein Eintrag je (Quelle, ID) mitsource={id, name}, Kategorien ohne Doppelte,sourcesmitstale/error/plugin_count; ausgefallene Quelle bricht den Rest nicht;staleoben 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 wietest_registry_sources.pyim 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/repoauf einem Nicht-GitHub-Host ist nicht von einer fertigen Basis zu unterscheiden und gilt alssonstige(der Abruf vonindex.jsonentscheidet 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 #319 gemergt: docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 1 (iris/Iris#69)
iris/iris-plugins#319
Commits:
PR #115 gemergt: feat(marketplace): Registry-Katalog im Linux-Server — Quellen, Katalog, Installation je Quelle (iris/Iris#69)
iris/iris-linux-server#115
Commits:
Stand: Bauabschnitt 2 (Linux-Server) gebaut und auf
alf@iris-serverdeployt — Plan:plugins/plugin-marktplatz/PLAN-registry-katalog.mdGeändert
registry_store.py(neu): Quellenliste in/data/registry-sources.json(die offizielle immer dabei, Adresse folgtIRIS_PLUGIN_REGISTRY_URL; Anlegen, Ändern, Ordnen, Löschen) und Installationsvermerk in/data/plugin-sources.json.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 giltofficial(Altbestand),uninstall_pluginlöscht den Vermerk, eine gelöschte Quelle macht ihre Plugins „privat“ (bleiben installiert, keine Registry aktualisiert sie).marketplace.py: Zwischenspeicher je Quelle (Dateimarketplace-index-cache[-<id>].json);GET /marketplace/api/catalogführt alle aktiven Quellen zusammen (sourceje 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_pluginnehmensource_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_sourceprüft eine Adresse ohne zu speichern.plugin_registry_routes.py):GET/POST /plugin-registry/sources,POST …/sources/check,PUT/DELETE …/sources/{id};update,install,preview,package-file,removenehmensource(ohne: wie bisher). Anlegen nur mitbestaetigt: true— ohne Bestätigung gibt es auch keinen Abruf beim fremden Server.plugin_registry.py:base_url/source_idinfetch_index,_download_verified,_install,install_from_registry,update_installed; neueIndexFormatError(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 (isoliertesDATA_DIRwegen des Vermerks; die Update-Route ruft jetztmarketplace.update_all).src/branch-Form wird zur offiziellen Registry erkannt,already_added), Ablehnen vonhttp, 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
pytestgegenalf@iris-server), nur der Registry-/Marktplatz-Umfang lokal.Beim Live-Test passiert (offen gelegt): Ich habe zwei Aktionen mit Nebenwirkungen auf dem Dev-Host ohne Vorprüfung ausgelöst: (1)
file-pickerwar 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_countinsourceszählt alle Katalogeinträge (auch ohne Linux-Build),checknur 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 #320 gemergt: docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 2 (iris/Iris#69)
iris/iris-plugins#320
Commits:
PR #116 gemergt: feat(marketplace): Registry-Katalog — Seite mit Quellenkennzeichen, Filter, Quellenwahl und Verwaltung (iris/Iris#69)
iris/iris-linux-server#116
Commits:
Stand: Bauabschnitt 3 (Marktplatz-Seite, Quelle im Linux-Server) — Plan:
plugins/plugin-marktplatz/PLAN-registry-katalog.mdGeä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.sourcesfü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://).install/update/removetragensource, nur wenn nichtofficial(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 überirisMarketplaceDone({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).GET /marketplace/api/sources(Lese-Token oder Bearer): alle Quellen, auch abgeschaltete, nur zum Ansehen._attachments/…) behalten?source=einer fremden Registry.Geprüft
index.html, Katalog aus den echten Funktionenbuild_catalog/merge_catalogsmit 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 (sourcenur bei nicht-offizieller Quelle), alle Verwaltungsaktionen samt Nutzlast, Validierung beim Hinzufügen,error-Rückmeldung, Escape, Hinweise im Browser ohne Brücke.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
source_*undsourceaninstall/update/removekennt noch keine App (Abschnitt 5); bis dahin ignorieren sie die Nachrichten bzw. verlassen sich aufofficial. Die Verwaltung funktioniert also erst mit Abschnitt 5 wirklich.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)
#219
Commits:
Stand: Bauabschnitt 3 (Marktplatz-Seite, Kopie in der Mac-App) — Plan:
plugins/plugin-marktplatz/PLAN-registry-katalog.mdGeä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.sourcesfü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://).install/update/removetragensource, nur wenn nichtofficial(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 überirisMarketplaceDone({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).GET /marketplace/api/sources(Lese-Token oder Bearer): alle Quellen, auch abgeschaltete, nur zum Ansehen._attachments/…) behalten?source=einer fremden Registry.Geprüft
index.html, Katalog aus den echten Funktionenbuild_catalog/merge_catalogsmit 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 (sourcenur bei nicht-offizieller Quelle), alle Verwaltungsaktionen samt Nutzlast, Validierung beim Hinzufügen,error-Rückmeldung, Escape, Hinweise im Browser ohne Brücke.tools/check-marketplace-page-sync(Kopie vonlinux-server/iris-server/app/marketplace_web/index.html, im Linux-Server geprüft und shippt im selben Zug; siehe dortigen Kommentar).Nicht geprüft
source_*undsourceaninstall/update/removekennt noch keine App (Abschnitt 5); bis dahin ignorieren sie die Nachrichten bzw. verlassen sich aufofficial. Die Verwaltung funktioniert also erst mit Abschnitt 5 wirklich.sources: Knopf und Kennzeichen bleiben dann weg).Grenzen: Die Wire-Doku (
02-Wire-Protokoll.md) zieht Abschnitt 6 nach.Offen: Abschnitte 4–6.
PR #321 gemergt: docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 3 (iris/Iris#69)
iris/iris-plugins#321
Commits:
PR #220 gemergt: feat(marketplace): Registry-Katalog im Mac-Server — Quellen, Katalog, Installation je Quelle (iris/Iris#69)
#220
Commits:
Stand: Bauabschnitt 4 (Mac-Server) — Plan:
plugins/plugin-marktplatz/PLAN-registry-katalog.mdGeändert (gleiche Wire-Form wie der Linux-Server, Bauabschnitt 2)
RegistrySourcesStore.swift(neu, in beiden Apps übersetzbar): Quellenlisteregistry-sources.json(die offizielle immer dabei, Adresse folgtIRIS_PLUGIN_REGISTRY_URLbzw. der Einstellung) und Installationsvermerkplugin-sources.jsonin 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 giltofficial;PluginManager.uninstallPluginlö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.MarketplaceCorebekam dafürfallback/sourceID(Medien einer fremden Quelle tragen?source=<id>), Standardwerte lassen alle bisherigen Aufrufe unverändert.PluginRegistryService:baseURL/sourceIDinfetchIndex,downloadVerified,install,installFromRegistry,updateInstalled; neueIndexFormatError(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/storeFilemitsourceID, Zusammenfassungen nennen ihre Quelle,updateAllje 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,removenehmensource; Medien?source=. Anlegen nur mitbestaetigt: 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 wietest_registry_catalog.py.MarketplaceService,RegistrySourcesStoreundIrisRemoteServerwurden neu übersetzt, keine Fehler.Nicht geprüft
MarketplaceService(hängt anPluginManager,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).PluginManagerund die Dienste sind dort ausgeschlossen).Offen: Abschnitte 5 (Clients: Dialoge, Brücke mit
source_*, Alle aktualisieren je Quelle) und 6 (Wire-Doku, Daily Logs, Gerätetests).PR #322 gemergt: docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 4 (iris/Iris#69)
iris/iris-plugins#322
Commits:
PR #117 gemergt: docs(routes): Registry-Quellen auch im Mac-Server (iris/Iris#69)
iris/iris-linux-server#117
Commits:
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:
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.updatablePluginsliefert 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 (MarketplaceFileLoaderbekamsourceID).install/update/removenehmensource(nur sauber: Kleinbuchstaben/Ziffern, ≤ 32 Zeichen; sonst nichts ausgelöst underroran die Seite). NeuRegistrySourceCommand(source_add,source_update,source_delete), streng geprüft: Name ≤ 80 Zeichen, Adresse nurhttps://≤ 2048 Zeichen,aktivnur Bool,reihenfolgeGanzzahl 0…1000, Quell-ID sauber; alles andere wird verworfen.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:NSAlertals Sheet, Abbrechen ist die Standardwahl, nie mit Return bestätigt), und legt die Quelle erst nach Zustimmung mitbestaetigt: truean. Schon eingetragen oder unbrauchbar: Fehlermeldung an die Seite, nichts angelegt. Rückmeldungadded|updated|deleted|cancelled|errorüberirisMarketplaceDone; beim Löschen steht, wie viele Plugins installiert bleiben.RemoteServerClient:sourceIDbei Vorschau, Installation, Paketdatei und Entfernen; neucheckRegistrySource,addRegistrySource,updateRegistrySource,deleteRegistrySource.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).IrisundIrisClientohne Fehler; das aktive Schema ist danach wiederIris.Nicht geprüft
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.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)
iris/2ndbrain-ios#56
Commits:
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.updatablePluginsliefert 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 (MarketplaceFileLoaderbekamsourceID).install/update/removenehmensource(nur sauber: Kleinbuchstaben/Ziffern, ≤ 32 Zeichen; sonst nichts ausgelöst underroran die Seite). NeuRegistrySourceCommand(source_add,source_update,source_delete), streng geprüft: Name ≤ 80 Zeichen, Adresse nurhttps://≤ 2048 Zeichen,aktivnur Bool,reihenfolgeGanzzahl 0…1000, Quell-ID sauber; alles andere wird verworfen.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:alertmit Abbrechen als Abbruchknopf und „Hinzufügen“ nur über den ausdrücklichen Knopf), und legt die Quelle erst nach Zustimmung mitbestaetigt: truean. Schon eingetragen oder unbrauchbar: Fehlermeldung an die Seite, nichts angelegt. Rückmeldungadded|updated|deleted|cancelled|errorüberirisMarketplaceDone; beim Löschen steht, wie viele Plugins installiert bleiben.RemoteServerClient:sourceIDbei Vorschau, Installation, Paketdatei und Entfernen; neucheckRegistrySource,addRegistrySource,updateRegistrySource,deleteRegistrySource.Geprüft
xcodebuildfürIrisRemote(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-syncmeldet die Kopie als identisch.Nicht geprüft
Offen: Abschnitt 6 (Wire-Doku, Daily Logs, Gerätetests: Mac-App, iPhone, GitHub-Quelle echt).
PR #323 gemergt: docs(plugins): Registry-Katalog — Stand nach Bauabschnitt 5 (iris/Iris#69)
iris/iris-plugins#323
Commits:
PR #118 gemergt: feat(marketplace): Quelle hinzufügen — Vorschläge vom eigenen Forgejo, ohne Anmeldung (iris/Iris#69)
iris/iris-linux-server#118
Commits:
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
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 Alfforgejo.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 einindex.jsonim 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 inerrors...als Repo- oder Zweigname wäre durchgegangen (nur Zeichenklasse geprüft).Geprüft
source_addmit genau diesen Werten; leere Liste; Fehler). Die Chrome-Erweiterung war nicht verbunden, deshalb mit einem Testskript in der Seite.hosts: [forgejo.lewerken.duckdns.org],suggestions: [], ohne Token 401, Seite enthält den Knopf.Grenzen
iris/iris-plugin-registryeinindex.json, und das ist die offizielle Quelle. Neue Registry-Repos erscheinen automatisch.Nicht geprüft: Der Mac-Server und die Apps mit der neuen Seite (Mac-Teil in iris/Iris, gleicher Zug).
PR #222 gemergt: feat(marketplace): Quelle hinzufügen — Vorschläge vom eigenen Forgejo im Mac-Server (iris/Iris#69)
#222
Commits:
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
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 Alfforgejo.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 einindex.jsonim 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 inerrors...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 bautIrisohne Fehler.Grenzen
iris/iris-plugin-registryeinindex.json, und das ist die offizielle Quelle. Neue Registry-Repos erscheinen automatisch.Mac-Teil:
MarketplaceService.sourceSuggestionsund die RouteGET /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 #324 gemergt: docs(plugins): Registry-Katalog — Vorschläge vom Forgejo bei Quelle hinzufügen (iris/Iris#69)
iris/iris-plugins#324
Commits: