Every Kael plugin is described by a manifest that the framework reads before spawning or loading anything. The manifest tells the host who you are, what API version you target, how your code runs, which system resources you need, and what UI surface area you want to occupy. Getting the manifest right is the foundation of working plugin development.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/Augani/kael/llms.txt
Use this file to discover all available pages before exploring further.
The PluginManifest struct
| Field | Required | Description |
|---|---|---|
id | Yes | Reverse-DNS identifier, e.g. com.example.my-plugin |
name | Yes | Human-readable display name |
version | Yes | Semver version string |
api_version | Yes | Host API version targeted — currently "1.0.0" |
entry_point | Yes | Executable path or WASM module path |
execution_model | Yes | ExternalProcess or Wasm |
description | No | Short description shown in plugin listings |
author | No | Author name or contact |
capabilities | No | Capabilities requested from the host |
args | No | Extra command-line arguments forwarded to the entry point |
contributions | No | UI contribution points (commands, menus, panels, settings) |
Execution models
TheExecutionModel enum controls where and how your plugin code runs.
- ExternalProcess
- Wasm
The host spawns your binary as a child process and passes an IPC socket path in the environment:Your binary must connect to that socket and complete the RPC handshake before doing anything else. This is the most common model for Rust plugins.
Writing a manifest file
Kael readsmanifest.json and manifest.toml natively. Use whichever format fits your toolchain.
Loading a manifest in Rust
validate() internally. If any required field is missing, you get an Err with a descriptive message.
Building a manifest with the builder API
The builder lets you construct a manifest programmatically without constructing the struct directly:Self, so you can chain calls freely. .build() calls validate() and returns Result<PluginManifest>.
Capabilities
Your plugin must declare every system resource it needs. Capabilities not listed are denied by the host’sPermissionBroker.
PathScope controls filesystem reach:
| Scope | Accessible paths |
|---|---|
AppData | Application data directory only |
Downloads | User’s downloads directory only |
UserSelected | Paths the user picks via a file dialog |
Any | Unrestricted — high-risk |
Checking high-risk capabilities
Capability declaration in JSON
Contribution points
TheContributions struct describes the UI surface area your plugin registers:
Commands
Commands appear in the application’s command palette and can carry a keybinding:Menu items
Menu items attach to existing named application menus ("file", "edit", "view", etc.) and invoke a command when activated:
Panels
Panels dock into the workspace layout at a fixed position by default:Settings schema
Supply a JSON Schema value to register a settings namespace for your plugin:Minimal working plugin
Security best practices
Request only what you need
Request only what you need
The host’s
PermissionBroker checks every capability your plugin declares before activation. Requesting capabilities you do not use creates unnecessary risk and makes users less likely to trust your plugin.Handle Shutdown gracefully
Handle Shutdown gracefully
When you receive
ExtensionRequest::Shutdown, flush any pending state and acknowledge before exiting. The host may terminate the process shortly after the response if you do not exit cleanly.Validate all host input
Validate all host input
Treat
ExecuteCommand arguments and any other host-supplied values as untrusted. Validate types and ranges before acting on them.Never assume high-risk capabilities are granted
Never assume high-risk capabilities are granted
Call
manifest.high_risk_capabilities() during development to audit what you declared, and design your plugin to degrade gracefully when those capabilities are denied at runtime.