Skip to content

plugin-manifest schema ​

A real .spk business-application plugin's own spk-assembly/plugin.json contract (id/version/permissions/roles/dependencies).

Pull the full JSON Schema: erp schema pull plugin-manifest  ·  MCP: erp_get_schema {"name":"plugin-manifest"}

Top-level properties ​

PropertyTypeRequiredNotes
idstringyes
namestringyes
versionstringyes
typestring
vendorstring
licensestring
licenseTierstring
categorystring
erpVersionstring
minErpVersionstring
maxErpVersionstring
mainClassstring | nullFully-qualified plugin main class. Optional (null/absent) for a pure-JSON plugin that ships zero Java classes -- the platform loads it via the built-in JsonOnlyPlugin entry point.
schemaNamestringApp-owned database schema this plugin's Entity-Engine tables route to.
scopestringone of: global, tenant — Tenant-Safe Plugin & Extension Architecture spec §54. 'global' (default, every manifest that predates this field): a shared plugin installable by any tenant. 'tenant': a private single-tenant L5 extension — MUST also set tenantId, and if it carries Java code (mainClass, or type java-extension/code-plugin) it MUST declare runtimeModes: ['service'] — the shared runtime refuses to load it (ExtensionInstallValidator, spec §11/§28.10/§74).
tenantIdstringSpec §54 — the owning tenant of a scope:'tenant' plugin. Required iff scope=='tenant'; must match the tenant the plugin is installed into. Absent for a global plugin.
erpApiVersionstringSpec §25 — the ERP extension-API contract version this plugin targets (e.g. '5.0'), distinct from erpVersion/minErpVersion (platform build versions). Optional; informational in E1.
supportedApplicationsarraySpec §25 — applications this extension supports, e.g. ['HCM']. Optional; empty/absent means unconstrained.
dependenciesarray
optionalDependenciesarray
permissionsarrayLegacy flat permission-key catalogue; real installs read roles[].permissionKeys instead (PluginRoleInstaller) — commonly left empty on modules whose roles[] is populated.
ownerstring
editableboolean
extendableboolean
capabilitiesProvidedarray
capabilitiesRequiredarray
featureFlagsarray
configSchemaJsonobject | string | null
frontendBundleobjectOptional — dynamic frontend-plugin-loading (ai/patterns/code-plugin-sdk.md). Absent on every plugin.json that predates it.
rolesarray
runtimeModesarrayWhich runtime modes this plugin can run under: embedded (runs inside the platform) and/or service (its own standalone process behind the gateway).
serviceRuntimestring | nullOne of java, python, nodejs, go, null. The language a service-mode plugin is written in. Only meaningful when runtimeModes contains service.
serviceFrameworkstring | nullone of: spring-boot, fastapi, express, net/http, null — Added 2026-09-14, same initiative as serviceRuntime — purely informational (shown as a read-only chip in Studio's Plugin Runtime panel; not validated against serviceRuntime today, so keep them consistent yourself: spring-boot pairs with java, fastapi with python, express with nodejs). null/absent defaults to 'spring-boot'.
serviceDeploymentobject | nullAdded 2026-09-03 (same real-gap fix as runtimeModes). Recommended deployment/runtime defaults for this plugin when run in 'service' mode (PluginManifest.PluginServiceDeploymentSpec in engine-plugin-api). null (the default for almost every manifest) means Studio seeds an empty config the admin fills in the first time they switch this plugin to Service mode. Only healthPath/timeoutMs/heartbeatIntervalSeconds actually drive runtime behavior today (health checks, proxy call timeout) — docker/kubernetes/cloud are real, persisted, Studio-editable data for a future Deployment Manager, not wired to any live provisioning API.

Named sub-definitions ​

resourceLimits