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. Withoutactivation, 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
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 withlocales/<tag>.json files (fr.json, zh-CN.json). No manifest entry is needed. Each file maps the English source text to its translation:
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.