EntwicklerMitarbeiter-Handbuch

manifest.json

Die manifest.json ist die einzige Konfigurationsdatei eines Plugins. Sie deklariert Metadaten, Queries, Parameter und Berechtigungen.

Entwickler-Handbuch · Plugin-Authoring

Pflichtfelder

jsonmanifest.json
{
  "id": "sellx.artikel-kpi",
  "name": "Artikel-KPI",
  "version": "1.0.0",
  "category": "report",
  "requiresDbRole": "read",
  "queries": [
    {
      "id": "top-articles",
      "name": "Top 10 Artikel",
      "description": "Verkaufte Menge und Umsatz der 10 meistverkauften Artikel",
      "file": "sql/top-articles.sql",
      "parameters": []
    }
  ]
}
FeldTypBeschreibung
idstringEindeutige Plugin-ID, reverse-DNS-Notation (sellx.<hersteller>.<name>)
namestringAnzeigename im Hub
versionstringsemver, MAJOR.MINOR.PATCH
categoryenumreport oder automation
requiresDbRoleenumread, write, oder owner
queriesarrayListe der Query-Definitionen

Optionale Felder

jsonmanifest.json
{
  "...": "...Pflichtfelder oben...",
  "description": "Zeigt verkaufte Top-Artikel mit Umsatz-Vergleich",
  "author": {
    "name": "sellx GmbH",
    "email": "plugins@sellx.de",
    "url": "https://sellx.de/plugins/artikel-kpi"
  },
  "icon": "icon.png",
  "license": "proprietary",
  "minHubVersion": "0.5.0",
  "tags": ["umsatz", "verkauf", "kpi"]
}
FeldTypBeschreibung
descriptionstringKurzbeschreibung, max. 500 Zeichen
authorobjectName, Email, URL des Plugin-Herstellers
iconstringPfad zur Icon-Datei (relativ zum ZIP-Root)
licensestringz.B. proprietary, MIT, GPL-3.0
minHubVersionstringNiedrigste Hub-Version, die das Plugin unterstützt
tagsstring[]Such-Tags für den Plugin-Store

Query-Definition

jsonmanifest.json
{
  "id": "sales-by-period",
  "name": "Umsatz nach Zeitraum",
  "description": "Summierter Umsatz gruppiert nach Monat",
  "file": "sql/sales-by-period.sql",
  "parameters": [
    {
      "name": "fromDate",
      "type": "date",
      "label": "Von",
      "required": true,
      "default": "2026-01-01"
    },
    {
      "name": "toDate",
      "type": "date",
      "label": "Bis",
      "required": true
    },
    {
      "name": "minAmount",
      "type": "number",
      "label": "Min. Umsatz (€)",
      "required": false,
      "min": 0,
      "max": 1000000
    }
  ]
}
FeldTypBeschreibung
idstringQuery-ID, eindeutig im Plugin, Dateiname muss sql/<id>.sql sein
namestringAnzeigename im Tab
descriptionstringTooltip im Workspace
filestringPfad zur SQL-Datei relativ zum ZIP-Root
parametersarrayListe der Parameter (UI-Eingabefelder)

Parameter-Typen

TypUI-ElementJSON-WertValidation
stringText-Input"Hallo"minLength, maxLength
numberNumber-Input42.5min, max, step
dateDate-Picker"2026-06-30"min, max
boolCheckboxtrue/false
articleArtikel-Suche12345 (Artikel-ID)Auto-Complete gegen tArtikel
customerKunden-Suche67890 (Kunden-ID)Auto-Complete gegen tKunde

Beispiel: Alle Parameter-Typen

jsonparameters.json
"parameters": [
  { "name": "title", "type": "string", "label": "Titel", "required": true, "minLength": 3, "maxLength": 50 },
  { "name": "limit", "type": "number", "label": "Anzahl", "required": true, "min": 1, "max": 100, "default": 10 },
  { "name": "since", "type": "date", "label": "Seit", "required": true, "default": "2026-01-01" },
  { "name": "active", "type": "bool", "label": "Nur aktive", "required": false, "default": true },
  { "name": "article", "type": "article", "label": "Artikel", "required": false },
  { "name": "customer", "type": "customer", "label": "Kunde", "required": false }
]

DB-Rollen

WertBedeutungTypische Plugins
readdb_datareader reichtReports, KPIs, Suchen
writedb_datawriter nötigAutomationen, Backfills
ownerdb_owner nötigSchema-Änderungen (selten)

Bei der Installation prüft der Sidecar, ob die Hub-DB-Rolle ≥ requiresDbRole ist. Sonst: DB_ROLE_MISMATCH.

Kategorien

WertBedeutung
reportRead-only-Queries, zeigt Ergebnisse in DataTable
automationHintergrund-Tasks, schreiben in die DB (geplant)

Beispiel: Minimales Manifest

jsonmanifest.json
{
  "id": "example.hello-world",
  "name": "Hello World",
  "version": "1.0.0",
  "category": "report",
  "requiresDbRole": "read",
  "queries": [
    {
      "id": "count",
      "name": "Anzahl Artikel",
      "file": "sql/count.sql",
      "parameters": []
    }
  ]
}
sqlsql/count.sql
SELECT COUNT(*) AS ArtikelAnzahl FROM tArtikel