Manifest Reference

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:

Permission
Description

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

Contributions

The contributions object declares what your extension adds to Nimbalyst.

customEditors

Register custom editors for matching file types.

Field
Type
Description

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 true when omitted

showDocumentHeader

boolean

Shows the host-provided document header above the editor. Defaults to true when omitted

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.

Field
Type
Description

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

Reserved for future command contributions.

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"

settingsPanel

Add a settings UI for your extension inside the main Settings screen.

themes

Register selectable themes contributed by your extension.

nodes, transformers, and hostComponents

These contribution arrays declare names of exports provided by your module.

Complete Example

File Pattern Syntax

File patterns use glob syntax:

Pattern
Matches

*.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, or main

  • aiTools contains objects instead of tool-name strings

  • slashCommands uses old name / displayName fields instead of id / title

  • fileIcons is declared as an array instead of an object map

  • Contribution component names do not match your exported module names

Best Practices

  1. Use a stable reverse-domain id.

  2. Request only the permissions you actually need.

  3. Keep contributions.aiTools and your exported aiTools array in sync.

  4. Prefer adding apiVersion even though it is currently optional.

  5. Validate on every build with validateExtensionBundle().

Last updated