Plugin manifest.json schema
Reflected verbatim from App\Plugins\ManifestValidator::rules(). Unknown keys pass through untouched (Zod .passthrough() semantics). Two rules live outside this table and are enforced in code: a runtime: "sidecar" manifest is rejected outright, and a uiMode: declarative manifest must carry a ui spec validated by validateDeclarativeUiSpec() (see docs/PLUGINS.md → “The manifest schema”). Regenerate with php artisan docs:reference.
| Field | Rules |
|---|---|
slug | required, string, min:1, max:100, regex:/^[a-z0-9][a-z0-9-]*$/ |
name | required, string, min:1, max:100 |
version | required, string, regex:/^\d+\.\d+\.\d+$/ |
id | sometimes, string, min:1 |
description | sometimes, string, min:1, max:500 |
visibility | sometimes, string, in:first_party,marketplace,private |
enabledByDefault | sometimes, boolean |
status | sometimes, string, in:published,draft |
tier | sometimes, string, in:A,B |
distribution | sometimes, string, in:monorepo,extracted |
runtime | sometimes, string, in:in_tree |
uiMode | sometimes, string, in:declarative,module |
ui | sometimes, array |
provider | sometimes, string, min:1 |
nav | sometimes, array |
nav.*.key | required, string, min:1 |
nav.*.label | required, string, min:1 |
nav.*.href | required, string, min:1 |
permissions | sometimes, array |
permissions.* | string, min:1 |
events | sometimes, array |
events.* | string, min:1 |
capabilities | sometimes, array |
capabilities.* | string, min:1 |
scopes | sometimes, array |
scopes.* | string, min:1 |
widgets | sometimes, array |
widgets.*.key | required, string, min:1 |
widgets.*.title | sometimes, string, min:1 |
widgets.*.permission | sometimes, string, min:1 |
jobs | sometimes, array |
jobs.*.key | required, string, min:1 |
jobs.*.schedule | sometimes, string, min:1 |
jobs.*.description | sometimes, string, min:1 |
jobs.*.name | sometimes, string, min:1 |
jobs.*.inngestFunctionId | sometimes, string, min:1 |
uiExtensions | sometimes, array |
uiExtensions.*.hook | required, string, min:1 |
uiExtensions.*.componentUrl | sometimes, string, min:1 |
uiExtensions.*.config | sometimes, array |
trainingContent | sometimes, array |
trainingContent.*.contentKey | required, string, min:1 |
trainingContent.*.title | required, string, min:1 |
trainingContent.*.contentType | required, string, in:video,document,quiz,scorm |
trainingContent.*.durationMinutes | sometimes, integer, min:0 |
trainingContent.*.orderIndex | sometimes, integer, min:0 |
trainingContent.*.requiredForOnboarding | sometimes, boolean |
contextContributions | sometimes, array |
contextContributions.provides | sometimes, array |
contextContributions.provides.* | string, min:1 |
contextContributions.consumes | sometimes, array |
contextContributions.consumes.* | string, min:1 |
contextContributions.syndicatesTo | sometimes, array |
contextContributions.syndicatesTo.* | string, min:1 |
contextContributions.extends | sometimes, array |
contextContributions.extends.*.sectionKey | required, string, min:1 |
contextContributions.extends.*.fields | required, array |
contextContributions.extends.*.fields.*.key | required, string, min:1 |
contextContributions.extends.*.fields.*.label | required, string, min:1 |
contextContributions.extends.*.fields.*.type | required, string, min:1 |
gamificationEvents | sometimes, array |
gamificationEvents.*.key | required, string, min:1 |
gamificationEvents.*.label | required, string, min:1 |
gamificationEvents.*.defaultPoints | required, integer |
gamificationEvents.*.cooldownSeconds | sometimes, integer, min:0 |
gamificationEvents.*.dailyMax | sometimes, integer, min:0 |
pricing | sometimes, array |
pricing.model | required_with:pricing, string, in:free,paid,subscription |
pricing.amount | sometimes, numeric |
pricing.currency | sometimes, string |
pricing.trialDays | sometimes, integer, min:0 |
billingGate | sometimes, array |
billingGate.minPlan | sometimes, string, in:free,starter,pro,enterprise |
billingGate.blockOnDelinquent | sometimes, boolean |
settings | sometimes, array |
engines | sometimes, array |
engines.vctrbase | sometimes, string, min:1, max:255 |
worker | sometimes, array |
worker.entry | required_with:worker, string, min:1 |
webhookUrl | sometimes, string, url |
settings.admin | sometimes, array |
settings.admin.*.key | required, string, min:1 |
settings.admin.*.label | required, string, min:1 |
settings.admin.*.group | required, string, min:1 |
settings.admin.*.type | required, string, in:boolean,string,number,select,multiselect,object |
settings.admin.*.description | sometimes, string |
settings.admin.*.default | present |
settings.admin.*.options | sometimes, array |
settings.admin.*.options.*.value | required, string |
settings.admin.*.options.*.label | required, string |
settings.userPreferences | sometimes, array |
settings.userPreferences.*.key | required, string, min:1 |
settings.userPreferences.*.label | required, string, min:1 |
settings.userPreferences.*.group | required, string, min:1 |
settings.userPreferences.*.type | required, string, in:boolean,string,number,select,multiselect,object |
settings.userPreferences.*.description | sometimes, string |
settings.userPreferences.*.default | present |
settings.userPreferences.*.options | sometimes, array |
settings.userPreferences.*.options.*.value | required, string |
settings.userPreferences.*.options.*.label | required, string |
Last updated on