Plugin Manifest

Overview

specwright.plugin.json lives at the plugin root. It is the detection signal — any directory without a valid manifest is rejected immediately by Specwright Desktop's 3-level validation before install even starts.

Full example

{
  "name": "@specwright/plugin-mui",
  "version": "0.1.0",
  "extends": "@specwright/plugin",
  "requiredBaseVersion": ">=0.3.8",
  "description": "Material UI overlay — MUI Select, Autocomplete, DatePicker, Dialog, Snackbar",
  "authStrategy": "email-password",
  "overrides": [
    "e2e-tests/utils/stepHelpers.js",
    "e2e-tests/playwright/auth-strategies/email-password.js",
    ".claude/agents/playwright/code-generator.md",
    ".claude/rules/dependencies.md"
  ]
}

Field reference

FieldTypeRequiredDescription
namestringYesPlugin package name. Use @scope/plugin-* convention for npm packages.
versionstringYesSemver version of the plugin.
extendsstringYesAlways "@specwright/plugin". Only one base is supported.
requiredBaseVersionstringYesMinimum base plugin version required (semver range, e.g. ">=0.3.8").
descriptionstringNoHuman-readable description shown in Specwright Desktop's plugin picker.
authStrategystringNoDefault auth strategy this plugin configures. Valid values: email-password, oauth, none.
overridesstring[]YesFiles this plugin replaces. Paths are relative to the project root being installed into, not relative to the plugin directory.

3-level validation

Specwright Desktop and the bootstrap() function both run this sequence before installing any plugin:

LevelCheckFailure behavior
1specwright.plugin.json present, valid JSON, has name + version fieldsRejected with "Invalid plugin manifest"
2install.sh present and executable (chmod +x)Rejected with "Missing or non-executable install.sh"
3Every path listed in overrides[] exists inside the plugin's overrides/ directoryRejected with the specific missing path listed

All three levels must pass before the plugin is applied.

Naming convention

For community and org plugins, follow these conventions to maximize discoverability:

  • Package name: specwright-plugin-* (unscoped) or @scope/plugin-* (scoped)
  • package.json keywords: ["specwright-plugin"]

This makes the plugin appear in npm search specwright-plugin results and in Specwright Desktop's npm tab browser.