nanoforge.manifest.json sits at the root of the plugin’s source folder. The build copies it into dist/ and adds the build field. The JSON schema is packages/kernel/schemas/plugin.schema.json in the editor repository ($schema gives completion in most editors).
Identity
Compatibility
Entries
Paths relative to the built folder. A plugin that only contributes from its manifest (a theme, icons) has noentry. Any other key is refused: a typo (clinet) keeps the plugin from loading, and the error names the key.
Activation
activation lists the events that load the plugin’s code. Default: ["onStartup"].
Prefer
onWidget and onCommand: a plugin loaded at startup delays the others.
Contributions
Everything undercontributes is applied when the manifest is read, before the plugin’s code loads.
commands
The code registers the handler with
context.registerCommand(id, handler).
widgets
Panels (docks) and screens.
The code gives the widget its view with the
WIDGET_VIEWS extension point. See widgets and styles.
menus
keybindings
- Write
Modfor Ctrl (Cmd on macOS). Two strokes separated by a space make a chord:Mod+K Mod+S. A modifier twice is a double tap:Shift Shift. - These are defaults: users change them in Settings › Keyboard shortcuts.
- Don’t bind a single stroke that starts an existing chord, and don’t give a default shortcut to an action that publishes or deletes.
keymapPresets
A named set of shortcuts users can choose in Settings › Keyboard shortcuts.
"remove": true cancels a default shortcut.
settings
@acme/counter.step. See settings for types and scopes.
themes
A color theme: id, label, and either extends (another theme’s id) with the colors it changes, or kind (dark or light) with every color. Also syntax (code colors) and tokens (fonts and corners). See make a theme.
icons, iconThemes
Icons as SVG files of the plugin, by name, and icon themes that replace the editor’s icons and give file and folder icons. See make a theme.
tours
A guided tour: steps shown one at a time over the editor, each pointing at a control found by its role and accessible name (the way tests find it), optionally inside a panel.
when holds, and goes on by itself once advanceWhen holds or the key of advanceWhenChanged changes. "exact": false on a target matches a name that only starts with name (a tree row says more than its label). The command tour.start with the tour’s id starts it.
documentEditors
Opens files matching a glob with one of your widgets instead of the code editor.
itemOwner
For plugins that describe items of the game’s code (components, systems…): schema (the version of the data it writes) and tags (the TSDoc tags it owns). See code and code generation.
When clauses
Awhen is an expression over context keys.
!, &&, ||, ==, !=, =~ (regular expression), in, and parentheses. A bare word on the right of == is a string.
A plugin sets its own keys with
context.contextKeys.set(key, value).