Skip to main content
A plugin is a directory in Qoder CLI that bundles commands, sub-agents, Skills, Hooks, MCP servers, and other extensions for installation, enable/disable management, and sharing. A plugin directory may contain one or more of these resources, and the CLI auto-discovers and loads them after installation.

Quick Start

The following example creates a minimal plugin containing a single Skill and installs it from a local directory.

1. Create the plugin directory

2. Write the manifest

Declaring a plugin.json is recommended for every plugin so it has stable metadata; at minimum include name (see Manifest Fields below): ~/my-plugin/.qoder-plugin/plugin.json:

3. Add a Skill

~/my-plugin/skills/hello/SKILL.md:

4. Install

After seeing Plugin "my-plugin@local" installed successfully. Run /plugins reload to apply., restart the CLI or run /plugins reload in the TUI to start using the Skill.

Plugin Directory Layout

.qoder-plugin/plugin.json is the recommended location for the manifest. When omitted, the CLI still loads the directory by convention and uses the directory name as the plugin name. Convention directories are auto-discovered when present, otherwise ignored.
Convention directory behavior: Agents shipped in agents/ can also declare isolation: worktree, which is useful for implementation Subagents that should run in an isolated copy.

Manifest Fields

Only name is required in plugin.json; other fields are optional.
Advanced: the manifest can also explicitly declare commands / agents / skills / hooks / outputStyles to override the default directory conventions or use inline content (note the manifest field uses camelCase outputStyles, while the convention directory remains output-styles/). When not declared, the CLI auto-discovers via the conventions above.

Installation Scope

Plugins can be installed at three scopes:

Commands

Plugin commands live under the qodercli plugins subcommand group, aliased as plugin.

Install: plugins install

Install a plugin from a local directory path:
After installation, restart the CLI or run /plugins reload in the TUI to apply changes.

Uninstall: plugins uninstall

Aliases: remove / rm.

Enable / Disable: plugins enable / plugins disable

Enable / disable is implemented by updating the enabledPlugins field in the corresponding settings.json. Disabled plugins are not loaded in new sessions.

List: plugins list

Validate: plugins validate

Validate that a local plugin directory matches the conventions; useful during development:
The command lists the commands, Skills, Hooks, and other components it discovers, and prints a notice when no convention subdirectory exists. Note: validate does not fail in that case — but plugins install for a local plugin requires at least one recognizable component or resource (either a convention directory or a resource explicitly declared in the manifest).
Recommended: always declare name, version, etc. in .qoder-plugin/plugin.json. This is the recommended way to organize a Qoder plugin — without it, the plugin can only be identified by its directory name in plugins list, enabledPlugins, and other places, which is fragile across environments.

The enabledPlugins Setting

Enable / disable state is stored in the enabledPlugins field of settings.json:
  • true: enables the plugin
  • false: explicitly disables the plugin
The configuration key must match the installed plugin ID exactly (locally installed plugins have IDs of the form name@local). Run plugins list to see each plugin’s identifier.
Prefer plugins enable / plugins disable over hand-editing this field — the commands handle scope selection, dependency resolution, and other details for you.

Writing Plugin Hooks

A plugin may declare its own Hooks in hooks/hooks.json. The file uses a wrapped shape: a top-level object with a hooks field whose value matches the hooks field in settings.json:
Note this differs from settings.json: settings.json uses the bare hooks field, while a plugin’s hooks/hooks.json requires the extra { "hooks": ... } wrapper.
When executed, plugin Hooks receive two extra environment variables: See Hooks for more on writing Hooks.

Marketplace

A marketplace is a centralized distribution source for plugins. By adding a marketplace, you can browse and install published plugins without managing local directories manually.

Add a Marketplace

Multiple source formats are supported:

List Configured Marketplaces

Update a Marketplace

Refresh the plugin catalog from the source:

Remove a Marketplace

Removing a marketplace also uninstalls all plugins that were installed from it.

Install Plugins from a Marketplace

Once a marketplace is added, install plugins by name:
The CLI searches all configured marketplaces and installs the plugin. The resulting plugin ID takes the form name@marketplace-name.

List Available Plugins

Returns all plugins from configured marketplaces that are not yet installed.

Update Installed Marketplace Plugins