Documentation Index
Fetch the complete documentation index at: https://docs.qoder.com/llms.txt
Use this file to discover all available pages before exploring further.
options.plugins is used to load local plugin directories into the current session. The SDK converts each local plugin into a --plugin-dir <path> startup argument; commands, agents, skills, and MCP servers contained in the plugin all take part in capability discovery for the session.
Loading Local Plugins
--plugin-dir arguments will be written in order:
💡query()is a one-shot message stream; it cannot query the init response after the handshake. To read commands / agents / skills contributed by plugins, useQoderSDKClientand callget_server_info()afterconnect(), or captureSystemMessage(subtype='init')in the message stream and readmessage.datayourself.
Plugin Directory Layout
A local plugin typically contains:.qoder-plugin/plugin.json declares the plugin name, version, and description. The other directories are automatically scanned by the CLI based on file type.
The SDK does not validate whether the path exists or is well-formed:
- A non-existent
--plugin-dirpath is silently ignored in SDK mode; the session still initializes normally. - Broken frontmatter or
.mcp.jsondoes not block init; broken commands simply do not appear in the init response. - To explicitly diagnose plugin loading failures, the only fallback right now is
reload_plugins().error_count.
Plugin-contributed Slash Commands
commands/*.md files in a plugin appear in get_server_info()['commands'], with names in the plugin-qualified form <plugin>:<cmd>.
Plugin-contributed Agents
agents/*.md files in a plugin appear in get_server_info()['agents']. The SDK also provides a synchronous convenience method for getting this list directly:
Plugin-contributed Skills
skills/<name>/SKILL.md files in a plugin are registered with a plugin-qualified name (plugin:skill). To make them callable in the main session, list them explicitly in options.skills; see Skills documentation.
Plugin-contributed MCP Servers
.mcp.json in a plugin is started by the CLI and included in the MCP status, which can be read via get_mcp_status():
Temporarily Overriding an Installed Plugin with the Same Name
Local plugins loaded throughoptions.plugins are session-scoped. During the current session, if a local plugin shares a name with an installed plugin, the local plugin takes priority in capability discovery for the session. This is useful for plugin development, debugging, and canary testing.
Reloading Plugins at Runtime
If the plugin directory changes, you can callreload_plugins() within the same QoderSDKClient session to have the CLI rescan plugin resources.
- Refreshing after adding or deleting
commands/*.mdduring plugin development. - After installing or updating a local plugin without restarting the host application.
- When the host UI needs to display commands, agents, plugins, and MCP status after a reload.
Note:reload_plugins()is only meaningful inQoderSDKClient(streaming) mode; the one-shotquery()stream has no runtime control channel.
Options Reference
| Field | Type | Description |
|---|---|---|
plugins | list[SdkPluginConfig] | Loads local plugin directories; currently the common form is {"type": "local", "path": ...} |
settings | str | Path | dict[str, Any] | None | Settings passed to the CLI, which can include fields like enabledPlugins, pluginConfigs, etc. |
setting_sources | list[Literal["user", "project", "local"]] | None | Controls which settings sources the CLI reads |
settings.enabledPlugins, settings.pluginConfigs, settings.allowedChannelPlugins, and settings.strictPluginOnlyCustomization are passed through by the SDK types, but the actual pipeline depends on the specific CLI version. Verify against your environment before use.
Return Value Reference
client.get_server_info() and SystemMessage(subtype='init').data
client.reload_plugins()
Returns ReloadPluginsResponse:
Best Practices
- Read
get_server_info()first for the host UI: It is the stable entry point for displaying commands, agents, skills, and plugins. If a one-shotquery()needs this data, switch toQoderSDKClient, or readSystemMessage(subtype='init').datafrom the message stream. - Use
options.pluginsduring plugin development: It only affects the current session and does not require modifying the user’s global install state. - Prepare user prompts before reloading:
reload_plugins()triggers the CLI to rescan disk, which may briefly change the available resource list; synchronize UI updates accordingly. - Check
error_countfor diagnostics: Iferror_count > 0after a reload, some plugin resources failed to load; display the source to the user.
Current Limitations
- In some qodercli versions, local plugin commands, agents, and MCP can appear correctly in the initialization result, but plugin skills may not appear in
get_server_info()['skills']— this is a CLI-side discovery pipeline issue. - Under the current qodercli implementation, non-existent
--plugin-dirpaths are silently ignored in SDK mode; to explicitly diagnose plugin loading failures, the only fallback right now isreload_plugins().error_count. reload_plugins()is a runtime control API exposed byQoderSDKClient; if the current CLI version returns internal errors related tothis._plugins, an upgrade to a fixed qodercli is needed.settings.strictPluginOnlyCustomization,settings.allowedChannelPlugins, and template substitution insettings.pluginConfigs.<pid>.optionsare dict pass-through fields. The SDK does not parse them; whether they take effect depends entirely on the CLI version.