Covers Engine Plugin SDK 2.0.0 · Interface Plugin SDK 0.2.0
Packaging and Installation
Define the manifest, install built output, and publish a repository release.
Build from the example plugin and keep one root manifest as the source of package identity. Its scripts generate the per-side manifests and output layout.
Manifest
This is the combined starter manifest shape. The minimum versions shown belong to the example; choose tested floors for your plugin.
{
"id": "example_device_plugin",
"name": "Example Device Plugin",
"description": "A device driver and its operator tools.",
"author": "Your team",
"version": "2.0.0-beta.1",
"minEngineVersion": "2.0.0-beta.1",
"minInterfaceVersion": "1.0.0-pre_release",
"contains_engine_plugin": true,
"contains_interface_plugin": true
}| Field | Requirement |
|---|---|
id | Nonempty stable ID. Match the runtime definition, output directory, and registry entry. |
name, version | Required nonempty strings. |
contains_engine_plugin, contains_interface_plugin | Both must be booleans; at least one must be true. |
minEngineVersion | Required for an engine side. |
minInterfaceVersion | Required for an interface side. |
description, author | Useful display information; include them for distribution. |
Change package.json and plugin.json versions together using the starter’s version script, for example npm version 2.0.0-beta.2 --no-git-tag-version. Do not raise a minimum version merely to match your plugin version: it describes the host API you require.
Build the package
npm ci
npm run verify
npm run packagepackage builds and verifies all enabled sides. An engine side requires CMake, a C++ toolchain, and VCPKG_ROOT pointing at a vcpkg checkout with the starter’s dependencies. An interface-only package does not need native build tools.
The release archive is plugin.zip. The starter wraps its output in a plugin/ folder:
plugin/
engine/<id>/
plugin.json
bin/<native-library>
... # defaults, configs, and binary dependencies
interface/<id>/
plugin.json
ui/index.js
... # UI assets
files/ # optional engine-root filesDisabled sides are omitted. npm run package-debug creates plugin-debug.zip with engine-debug/ instead of engine/. Use debug binaries only with a compatible debug engine. Native libraries must also match the host OS and architecture.
Install locally
For a local development installation, set the destination roots and let the starter copy the correct files:
$env:DARTWIC_ENGINE_DIR = 'C:\DARTWIC\engine'
$env:DARTWIC_INTERFACE_DIR = 'C:\DARTWIC\interface'
npm run deployUse your actual engine configuration root and interface plugin host root. You can instead copy deployment-settings.example.json to deployment-settings.json and set engine_dir and interface_dir. deploy-debug targets a debug engine; deploy:interface rebuilds and copies only UI.
For a manual install, stop the affected host before replacing loaded files, extract the archive, and copy each ID directory:
| Package source | Installation destination |
|---|---|
plugin/engine/<id>/ | <engine-config-root>/plugins/<id>/ |
plugin/interface/<id>/ | <interface-host-root>/plugins/<id>/ |
Contents of plugin/files/ | Corresponding paths beneath <engine-config-root>/. |
Each installed side needs its own valid plugin.json. Preserve the native bin/ and UI ui/ subdirectories and all dependencies. Do not place the entire ZIP or an extra plugin/engine/ wrapper inside the installed ID directory.
Start the engine and reload the interface. In Settings → Plugins, check the installed side, version, and any load error. Create a module instance only after its engine plugin is loaded. See Interface Plugins for the normal plugin-browser workflow.
Publish for the plugin browser
- Commit the source and root
plugin.jsonto a public GitHub repository. Include a README with setup, supported hardware, compatibility, and troubleshooting. - Build and verify the release package. Create a GitHub release for the same source version, with both
plugin.jsonandplugin.zipas release assets. Keep the manifest in the tagged source too; browser hosts read it from the tag. - Submit a pull request adding your entry to
data/plugin-registry.json. It is a JSON array; add an object like this inside the array:
{
"id": "example_device_plugin",
"name": "Example Device Plugin",
"author": "Your team",
"description": "A device driver and its operator tools.",
"repo": "your-org/your-plugin-repository"
}The registry points to your repository. The plugin browser resolves published releases, checks the manifest ID and minimum host versions, and selects compatible output. A source-only tag is useful as a developer starter but is not an installable plugin-browser release without the two assets.
| Problem | Check |
|---|---|
| Not listed publicly | The registry entry has been accepted and its repo is correct. |
| No compatible release | Both assets exist and the relevant minimum host version is satisfied. |
| Installed folder marked invalid | Its manifest has the required side flag, ID, version, and minimum version. |
| Engine library fails to load | OS, architecture, debug/release mode, SDK compatibility, and binary dependencies. |
| UI installs but does not appear | ui/index.js, the registry definition, matching IDs, and interface reload. |