Skip to main content
Every plugin is a directory with a plugin.toml at its root. The manifest says who the plugin is, which plugin API it needs, where its code is (if any), when to load it, what it may do, and what it contributes to the IDE.

Example

Top-level fields

Unknown top-level fields are an error. All paths are relative to the package directory and may not leave it. The manifest is validated as a whole: if one contribution is invalid, nothing is installed or loaded. Contribution types the IDE does not know (from a newer API) are skipped with a warning.

Categories

languages, themes, icon-themes, linters (linters and formatters), vcs, ai, frameworks, tools, other. Without categories, a plugin that contributes themes, icon themes or languages is filed under those, any other under other. Categories the IDE doesn’t know, and any after the first three it knows, are ignored; openidea-plugin check warns about both.

Activation

Code is loaded lazily. Without activation, it loads the first time one of the plugin’s commands runs. Duplicates are an error. Some event kinds need a newer API: on-event:files-changed needs ^1.3; file-closed, settings-changed, input-mode-changed, run-exited, terminal-exited and content-tab-action need ^1.4.

Capabilities

The user approves required capabilities as a whole when installing. Optional ones can be refused individually, and the plugin must cope with Error::Denied when it lacks them. The full list and what each unlocks is in Permissions and capabilities.

Contribution points

Each contribution point is a table ([contributes.settings]) or an array of tables ([[contributes.commands]]). Contributions are live as soon as the plugin is enabled, before its code loads. Item ids (commands, views, themes, …) match [a-z0-9][a-z0-9._-]*, at most 64 characters. Menus, shortcuts and status bar items refer to the plugin’s own declared commands; inside the IDE a command’s action id is plugin.<plugin id>.<command id>.

Translations

A package translates its own text with locales/<tag>.json files (fr.json, zh-CN.json). No manifest entry is needed. Each file maps the English source text to its translation:
The IDE applies the catalog of the selected UI language (the exact tag, then the language, then a variant such as zh-TW for zh) to the titles, categories, labels and tooltips the manifest declares, and to the text views show. Text the plugin builds itself (notifications, error messages, html bodies) is not translated: read host::locale() when building it. openidea-plugin check refuses a catalog that is not a JSON object of strings.

The 0.1 format

Manifests in the old 0.1 format (openidea-api = "0.1", permissions = [...]) still load: their permissions become required capabilities and their contributions work. Their code no longer runs; rebuild it against the 1.x SDK and switch to engines.openidea and [capabilities]. You can’t mix the two formats in one manifest.

Checking a manifest

check validates the manifest, every contribution and the component exactly as installing would. See Testing and debugging.