Manifest Reference
Full reference for the Nimbalyst extension manifest.json: required fields, permissions, contributions, file pattern syntax, and validation.
The manifest.json file declares your extension metadata, permissions, and contributions.
Basic Structure
{
"id": "com.example.my-extension",
"name": "My Extension",
"version": "1.0.0",
"main": "dist/index.js",
"styles": "dist/index.css",
"apiVersion": "1.0.0",
"permissions": {},
"contributions": {}
}Required Fields
id
Unique identifier for your extension.
"id": "com.yourcompany.extension-name"Use reverse-domain style identifiers.
Must start with a letter.
Can contain letters, numbers, dots, underscores, and hyphens.
name
Human-readable name shown in the UI.
version
Extension version in semver format.
main
Path to the built JavaScript entry point, relative to the manifest.
main is required for normal extensions. Claude-plugin-only extensions can omit it if they do not ship runtime code.
Optional Top-Level Fields
description
Short description of what your extension does.
author
Author or organization name.
styles
Path to a CSS bundle to load with your extension.
apiVersion
Optional extension API version string.
This is currently recommended, not required. Use it so future compatibility checks can warn more precisely.
requiredReleaseChannel
Restrict visibility to a release channel.
Allowed values:
"stable""alpha"
defaultEnabled
Control whether the extension starts enabled the first time it is discovered.
If omitted, the extension defaults to enabled.
Permissions
Declare the capabilities your extension needs:
Available permissions:
filesystem
Read and write files through extension services
ai
Register AI tools, context providers, and call AI chat/completion models directly (listModels, chatCompletion, chatCompletionStream)
network
Reserved for network-enabled extensions
catalog
Permission-catalog capability IDs required by gated host APIs. For example, database reads require nimbalyst-database-read. Backend modules declare their own permissions on the module contribution instead.
Contributions
The contributions object declares what your extension adds to Nimbalyst.
customEditors
Register custom editors for matching file types.
filePatterns
string[]
Glob patterns for matching files
displayName
string
Name shown in the editor selector
component
string
Key in your exported components object
supportsSourceMode
boolean
Enables the host's source-mode toggle
supportsDiffMode
boolean
Enables the host's AI diff review mode. Defaults to false when omitted
readOnlyDuringDiff
boolean
Tells the host that this editor actually locks manual edits during diff review. Defaults to false
supportsTranscriptEmbed
boolean
Allows a read-only, click-to-activate editor embed in agent transcripts. Defaults to false
transcriptEmbedHeight
number
Preferred transcript embed height in pixels. Defaults to 360
showDocumentHeader
boolean
Shows the host-provided document header above the editor. Defaults to true when omitted
collaboration
object
Declares shared-document support and optional awareness fields. Editors that opt in must implement the collaborative binding.
documentHeaders
Render UI above matching editors without replacing the editor itself.
aiTools
Declare AI tools your extension provides. This is an array of tool name strings, not full tool definitions.
The actual tool definitions belong in your TypeScript exports:
newFileMenu
Add items to the "New File" menu.
fileIcons
Override file icons in the sidebar.
Keys are glob patterns. Values are Material icon names.
slashCommands
Register slash commands for the command picker.
id
string
Stable command identifier
title
string
Label shown in the picker
description
string
Optional help text
icon
string
Optional Material icon name
keywords
string[]
Optional search keywords
handler
string
Name of the exported handler function
commands and keybindings
Declare named actions in commands, then bind keys separately in keybindings. Panel toggle commands are registered automatically as <extensionId>.<panelId>.toggle, so a panel shortcut does not need a matching commands entry.
configuration
Declare user/workspace settings for your extension.
claudePlugin
Bundle a Claude Code plugin with the extension.
panels
Register non-file-based panels.
placement must be one of:
"sidebar""fullscreen""floating""bottom"
settingsPanel
Add a nested settings UI inside the extension's installed-extension detail.
settingsRoutes
Add a first-class page to the Application or Project Settings sidebar:
id
string
Unique route ID inside this extension. The host namespaces it to prevent collisions.
scope
"application" | "project"
Settings scope where the page appears. Account routes are reserved for Nimbalyst.
label
string
User-facing sidebar label.
group
string
Optional sidebar group. Defaults to Extensions.
icon
string
Optional Material Symbol name. Defaults to extension.
order
number
Optional sort order within the extension group. Defaults to 100.
component
string
Component name exported from the module's settingsPanel record.
Project routes receive the active repository through SettingsPanelProps.workspacePath and the complete target through projectTarget. Application routes omit project context.
Use settingsRoutes when the extension owns a settings destination users should navigate to directly. Use settingsPanel for configuration that belongs inside the installed-extension detail.
themes
Register selectable themes contributed by your extension.
nodes, transformers, and hostComponents
These contribution arrays declare names of exports provided by your module.
lexicalExtensions is the supported contribution for Lexical features built with defineExtension from @lexical/extension. The strings in the manifest name entries in the module's exported lexicalExtensions record.
Advanced contributions
The SDK also defines contribution types for provider-neutral agentWorkflows, isolated backendModules, trackerImporters, and aiAgentProviders.
Backend modules run in a utility process or worker thread and remain disabled until the user grants them at first use. Their declaration names the built entry file, runtime, granular permission IDs, and a short purpose shown in the consent prompt. Renderer-side gated APIs instead use the top-level permissions.catalog array.
Tracker importers and AI agent providers reference a backend module because their privileged work cannot run in the renderer. These surfaces have additional permission, validation, and lifecycle requirements; use the TypeScript declarations from your installed @nimbalyst/extension-sdk and the current built-in extensions as the canonical reference.
Complete Example
File Pattern Syntax
File patterns use glob syntax:
*.csv
Any file ending in .csv
*.{csv,tsv}
Files ending in .csv or .tsv
data/*.json
JSON files in data/
**/*.test.ts
Test files anywhere in the tree
Validation Notes
Nimbalyst validates your manifest on load. Common errors:
Missing required top-level fields:
id,name,version, ormainaiToolscontains objects instead of tool-name stringsslashCommandsuses oldname/displayNamefields instead ofid/titlefileIconsis declared as an array instead of an object mapContribution component names do not match your exported module names
Best Practices
Use a stable reverse-domain
id.Request only the permissions you actually need.
Keep
contributions.aiToolsand your exportedaiToolsarray in sync.Prefer adding
apiVersioneven though it is currently optional.Validate on every build with
validateExtensionBundle().
Last updated
