Inhaltsverzeichnis

Manifest (plugin.json)

Das Manifest ist das Herzstück eines jeden Add-ins. Es ist eine JSON-Datei namens plugin.json, die im Wurzelverzeichnis des .wvdsx-Pakets liegt. Der Host liest dieses Manifest, bevor er die DLL des Add-ins lädt, und verwendet es, um Kompatibilität zu prüfen, Contributions zu registrieren und die Benutzeroberfläche vorzubereiten.

Das Manifest dient zwei Zwecken: Es identifiziert das Add-in eindeutig und beschreibt vollständig, was das Add-in zur Shell beiträgt. Alles, was der Host wissen muss, um Menüpunkte, Toolbar-Buttons, Seitenleisten und Tastenkürzel anzuzeigen, steht in dieser Datei. Die DLL wird erst geladen, wenn sie tatsächlich gebraucht wird.

Zurück zur Übersicht.

Vollständiges Beispiel

{
  "id": "wvds.assets-manager",
  "name": "assets-manager",
  "displayName": "Assets Manager",
  "description": "Verwaltung von Anlagevermögen und Inventar",
  "version": "1.2.0",
  "publisher": "wvds",
  "kind": "native",
  "main": "bin/AssetsManager.dll",
  "engineVersion": "^1.0.0",
 
  "activationEvents": [
    "onCommand:assets.open",
    "onCommand:assets.list"
  ],
 
  "dependencies": [
    { "id": "wvds.core-services", "version": "^1.0.0" }
  ],
 
  "servicesProvided": ["IAssetDataService"],
  "servicesConsumed": ["IDocumentPrintService"],
 
  "permissions": ["fs.read", "fs.write", "net.http"],
 
  "dllChecksum": "sha256:a1b2c3d4e5f6...",
 
  "contributes": {
    "commands": [
      {
        "command": "assets.open",
        "title": "Anlage öffnen",
        "category": "Assets",
        "icon": "media/asset-open.svg"
      },
      {
        "command": "assets.list",
        "title": "Anlageliste",
        "category": "Assets",
        "icon": "media/asset-list.svg"
      }
    ],
 
    "submenus": [
      { "id": "assets", "label": "Assets" }
    ],
 
    "menus": {
      "menuBar": [
        { "submenu": "assets", "group": "modules", "order": 200 }
      ],
      "assets": [
        { "command": "assets.open", "group": "navigation", "order": 1 },
        { "command": "assets.list", "group": "navigation", "order": 2 }
      ],
      "commandPalette": [
        { "command": "assets.open" },
        { "command": "assets.list" }
      ]
    },
 
    "toolbar": [
      {
        "toolbarId": "main",
        "command": "assets.list",
        "icon": "media/asset-list.svg",
        "tooltip": "Anlageliste öffnen",
        "when": ""
      }
    ],
 
    "keybindings": [
      {
        "command": "assets.list",
        "key": "Ctrl+Shift+A",
        "when": ""
      }
    ],
 
    "views": {
      "sidebar": [
        {
          "id": "assets.navigator",
          "name": "Assets-Navigator",
          "icon": "media/navigator.svg",
          "containerId": "assets-explorer"
        }
      ]
    },
 
    "viewsWelcome": [
      {
        "viewId": "assets.navigator",
        "content": "Keine Anlagen vorhanden.\n[Anlage erstellen](command:assets.create)",
        "when": "!hasAssets",
        "group": "main",
        "order": 1
      }
    ],
 
    "welcomePage": [
      {
        "title": "Anlagenverwaltung",
        "icon": "codicon-package",
        "order": 10,
        "contents": [
          { "label": "Anlageliste öffnen", "command": "assets.list", "icon": "codicon-list-flat" },
          { "label": "Neue Anlage erfassen", "command": "assets.create", "icon": "codicon-add" }
        ]
      }
    ],
 
    "configuration": {
      "title": "Assets Manager",
      "properties": {
        "assets.defaultCurrency": {
          "type": "string",
          "default": "EUR",
          "description": "Standard-Währung für neue Anlagen"
        },
        "assets.pageSize": {
          "type": "number",
          "default": 50,
          "description": "Anzahl der Einträge pro Seite in der Anlageliste"
        }
      }
    },
 
    "themes": [
      {
        "id": "assets.highlight",
        "label": "Assets Highlight",
        "path": "themes/highlight.json",
        "uiTheme": "wvds-light"
      }
    ]
  }
}

Felder im Detail

Identität

Feld Typ Pflicht Beschreibung
id string ja Eindeutiger Bezeichner im Format publisher.name. Der Host verwendet diesen Wert, um Add-ins zu unterscheiden, Abhängigkeiten aufzulösen und Berechtigungen zuzuordnen. Einmal veröffentlicht, darf sich die Id nicht mehr ändern.
name string ja Kurzname ohne Publisher-Prefix. Wird intern für Dateipfade und Konfigurationsschlüssel verwendet.
displayName string ja Anzeigename, den der Benutzer in der Erweiterungsliste und in Benachrichtigungen sieht. Darf Leerzeichen und Sonderzeichen enthalten.
description string nein Einzeilige Beschreibung des Add-ins. Erscheint in der Erweiterungsliste unterhalb des Anzeigenamens.
version string ja Versionsnummer im SemVer-Format (MAJOR.MINOR.PATCH). Der Host verwendet diese Version für Update-Prüfungen und Abhängigkeitsauflösung.
publisher string ja Name des Herausgebers. Zusammen mit name ergibt sich die vollständige Id.

Typ und Einstiegspunkt

Feld Typ Pflicht Beschreibung
kind string nein Art des Add-ins. Mögliche Werte: native (Standard, enthält eine DLL), script (PowerShell-basiert, keine DLL nötig) oder theme (reines Theme ohne Code). Wenn das Feld fehlt, nimmt der Host native an. Bei script verweisen Commands auf .ps1-Dateien statt auf eine DLL — siehe ScriptHost.
main string ja (bei native) Relativer Pfad zur DLL innerhalb des Pakets. Der Host löst diesen Pfad relativ zum Installationsverzeichnis des Add-ins auf. Bei kind: „script“ entfällt dieses Feld.

Kompatibilität

Feld Typ Pflicht Beschreibung
engineVersion string nein SemVer-Constraint für die Host-Version (z.B. ^1.0.0). Wenn das Add-in eine Host-Version erfordert, die nicht installiert ist, wird es nicht geladen. Fehlt das Feld, wird keine Prüfung durchgeführt.

Aktivierung

Feld Typ Pflicht Beschreibung
activationEvents string[] ja (bei native) Liste der Ereignisse, die das Laden der DLL auslösen.

Unterstützte Aktivierungsereignisse:

Die Verwendung von onCommand: ist der bevorzugte Weg, weil das Add-in so erst geladen wird, wenn es tatsächlich gebraucht wird. Das hält den Anwendungsstart schnell und den Speicherverbrauch niedrig.

Abhängigkeiten

Feld Typ Pflicht Beschreibung
dependencies array nein Liste von Add-ins, die vor diesem Add-in aktiviert werden müssen. Jeder Eintrag enthält id und version.
servicesProvided string[] nein Vertragsnamen der Services, die dieses Add-in über die IServiceRegistry anbietet.
servicesConsumed string[] nein Vertragsnamen der Services, die dieses Add-in von anderen Add-ins benötigt. Der Host stellt sicher, dass anbietende Add-ins zuerst aktiviert werden.

Sicherheit

Feld Typ Pflicht Beschreibung
permissions string[] nein Liste der Berechtigungen, die das Add-in benötigt. Der Benutzer wird beim ersten Start um Zustimmung gebeten. Details zu den verfügbaren Berechtigungen stehen unter Sicherheit.
dllChecksum string nein SHA256-Prüfsumme der DLL im Format sha256:hexwert. Der Host verifiziert diesen Wert vor dem Laden der DLL.

Contributions

Der contributes-Block im Manifest deklariert alles, was das Add-in zur Benutzeroberfläche beiträgt. Jeder Contribution-Typ hat eine eigene Struktur und wird auf einer eigenen Seite ausführlich beschrieben.

Commands

Commands sind die zentrale Aktionseinheit. Jeder Menüpunkt, jeder Toolbar-Button und jedes Tastenkürzel verweist auf einen Command. Das Manifest deklariert den Command mit Titel, Kategorie und Icon. Der eigentliche Handler wird zur Laufzeit vom Add-in registriert.

"commands": [
  {
    "command": "assets.open",
    "title": "Anlage öffnen",
    "category": "Assets",
    "icon": "media/asset-open.svg"
  }
]
Feld Beschreibung
command Eindeutiger Bezeichner des Commands. Konvention: addin-name.aktion.
title Anzeigename in Menüs und der CommandPalette. Kann über NLS übersetzt werden.
category Gruppierung in der CommandPalette. Erscheint als Prefix vor dem Titel.
icon Relativer Pfad zu einer SVG- oder PNG-Datei im Paket.

Ausführliche Beschreibung: Commands.

Das menus-Objekt ordnet Commands bestimmten Stellen in der Oberfläche zu. Der Schlüssel bestimmt den Ort (menuBar, commandPalette, view/title, view/item/context), der Wert ist ein Array von Einträgen.

"submenus": [
  { "id": "assets", "label": "Assets", "icon": "media/assets.svg" }
],
"menus": {
  "menuBar": [
    { "submenu": "assets", "group": "modules", "order": 200 }
  ],
  "assets": [
    { "command": "assets.open", "group": "navigation", "order": 1, "when": "" }
  ]
}
Feld Beschreibung
submenu Referenziert eine Submenu-Id. Erzeugt ein Untermenü an der angegebenen Stelle.
command Referenziert einen Command. Erzeugt einen Menüpunkt, der den Command auslöst.
group Sortiergruppe. Innerhalb eines Menüs werden Gruppen durch Trennstriche getrennt.
order Numerische Priorität innerhalb der Gruppe. Niedrigere Werte stehen weiter oben.
when Kontextausdruck für bedingte Sichtbarkeit (z.B. hasActiveDocument && !readOnly). Leerer String oder fehlendes Feld bedeutet: immer sichtbar.

Ausführliche Beschreibung mit Merge-Verfahren: Menü-Merge.

Toolbar

"toolbar": [
  {
    "toolbarId": "main",
    "command": "assets.list",
    "icon": "media/asset-list.svg",
    "tooltip": "Anlageliste öffnen",
    "when": ""
  }
]

Ausführliche Beschreibung: Toolbar.

Views (Seitenleiste)

"views": {
  "sidebar": [
    {
      "id": "assets.navigator",
      "name": "Assets-Navigator",
      "icon": "media/navigator.svg",
      "containerId": "assets-explorer"
    }
  ]
}

Views mit demselben containerId werden vom Host in einem Accordion gruppiert. Das erlaubt mehreren Add-ins, verwandte Panels in einer gemeinsamen Seitenleisten-Gruppe anzuzeigen.

Ausführliche Beschreibung: Sidebar-Views.

Keybindings

"keybindings": [
  {
    "command": "assets.list",
    "key": "Ctrl+Shift+A",
    "mac": "Cmd+Shift+A",
    "when": ""
  }
]

Ausführliche Beschreibung: Keybindings.

Configuration

"configuration": {
  "title": "Assets Manager",
  "properties": {
    "assets.defaultCurrency": {
      "type": "string",
      "default": "EUR",
      "description": "Standard-Währung für neue Anlagen"
    }
  }
}

Konfigurationswerte werden in der mehrstufigen Konfigurationshierarchie des Hosts gespeichert: Standardwerte aus dem Manifest, Benutzer-Einstellungen, Workspace-Einstellungen und Laufzeit-Überschreibungen. Das Add-in liest sie über IHost.Configuration.

Themes

"themes": [
  {
    "id": "assets.highlight",
    "label": "Assets Highlight",
    "path": "themes/highlight.json",
    "uiTheme": "wvds-light"
  }
]

Theme-Contributions werden beim Start registriert und stehen dem Benutzer in der Theme-Auswahl zur Verfügung. Die Theme-Datei enthält Farbdefinitionen nach dem Skin-Vertrag.

ViewsWelcome

"viewsWelcome": [
  {
    "viewId": "assets.navigator",
    "content": "Keine Anlagen vorhanden.\n[Anlage erstellen](command:assets.create)",
    "when": "!hasAssets",
    "group": "main",
    "order": 1
  }
]

Welcome-Inhalte werden in leeren Views angezeigt, solange keine Daten vorhanden sind. Der content unterstützt Markdown-Links im Format [Text](command:command.id), die beim Klick den referenzierten Command auslösen.

WelcomePage

"welcomePage": [
  {
    "title": "WIS Prüfungen",
    "icon": "codicon-shield",
    "order": 10,
    "contents": [
      { "label": "Prüfungen ausführen", "command": "wis.proofExec.open", "icon": "codicon-checklist" },
      { "label": "Prüfungen planen", "command": "wis.proofPlan.open", "icon": "codicon-calendar" }
    ]
  }
]

WelcomePage-Sektionen erscheinen auf der zentralen Willkommensseite unterhalb der eingebauten Quick Links. Jede Sektion besteht aus einer Überschrift und einer Liste von Command-Links. Mehrere Add-ins liefern ihre Sektionen unabhängig — der Host sortiert sie nach order und rendert sie als HTML-Blöcke.

Im Unterschied zu viewsWelcome (oben) adressiert welcomePage den zentralen Welcome-Tab im Dokumentbereich, nicht einzelne Sidebar-Views.

Ausführliche Beschreibung: Welcome-Page Sections.

NLS-Übersetzung

Alle Texte im Manifest können über NLS-Platzhalter übersetzt werden. Dazu wird der Textwert durch %schlüssel% ersetzt und der tatsächliche Text in einer separaten Datei bereitgestellt. Details dazu stehen unter Lokalisierung.

Weiter zu Paketformat oder zurück zur Übersicht.