Using Plugins
Yoker can load tools, skills, and agents from external Python packages via the plugin system. This guide covers the complete workflow for using plugins safely.
Overview
Plugins extend Yoker’s capabilities by providing:
Tools - New functions the agent can call
Skills - Predefined prompts loaded via
/skillcommandsAgents - Custom agent definitions
Plugins are Python packages that declare their components through a __YOKER_MANIFEST__ object. When you load a plugin with --with, Yoker discovers and registers all components the package provides.
Enabling Plugins
Important: Plugins are disabled by default for security. You must explicitly enable them in your configuration.
Step 1: Create or Update Configuration
Create a yoker.toml file in your project directory or home directory:
[plugins]
enabled = true
Without this configuration, attempting to load a plugin will show:
Error: Plugins are disabled. To enable, add to your config:
[plugins]
enabled = true
Step 2: Secure File Permissions
Yoker requires configuration files to be readable only by the owner (mode 600). This prevents other users on shared systems from reading sensitive configuration.
If your configuration file has incorrect permissions, you’ll see:
Error: Configuration file /Users/you/yoker.toml is readable by group/other (mode 0o644). Use 'chmod 600 /Users/you/yoker.toml' to fix.
Fix it with:
chmod 600 yoker.toml
# or for home directory config
chmod 600 ~/.yoker.toml
Loading Plugins
Basic Usage
Install the plugin package (if not already installed), then run Yoker with --with:
# Using uvx (recommended for one-time use)
uvx --with pkgq yoker --with pkgq
# Or install first, then run
pip install pkgq
python -m yoker --with pkgq
Multiple Plugins
Load multiple plugins by repeating the --with argument:
python -m yoker --with plugin-one --with plugin-two --with plugin-three
Plugin Confirmation Dialog
When you load a plugin for the first time, Yoker displays a confirmation dialog:
╭─────────────────────────────────────────────── Plugin: pkgq ───────────────────────────────────────────────╮
│ Plugin: pkgq │
│ │
│ Tools: pkgq:find │
│ Skills: pkgq:create, pkgq:update │
│ Agents: (none) │
│ │
│ Plugins can execute code on your system. │
│ Only load plugins you trust. │
│ │
│ Load this plugin? [y/N]: │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Important: Plugins can execute arbitrary code on your system. Only load plugins from sources you trust.
Type y and press Enter to load the plugin, or N (or just Enter) to decline.
Trusting Plugins Permanently
After accepting a plugin, Yoker shows how to trust it permanently:
To trust this plugin permanently, add to your yoker.toml:
[plugins.trusted]
pkgq = true
Add this to your configuration file to skip the confirmation dialog in future sessions:
[plugins]
enabled = true
[plugins.trusted]
pkgq = true
another-plugin = true
Verifying Loaded Components
After Yoker starts, verify that plugin components are available.
Check Skills
Use the /skills command to see all loaded skills, including those from plugins:
> /skills
Loaded skills:
From plugins:
✓ pkgq:create - Generate a PACKAGE.md file for a Python project. Analyzes the project structure,
extracts key components, patterns, and creates agent-ready documentation.
Use when creating documentation for your own packages. (pkgq)
✓ pkgq:update - Update existing package documentation for a new version.
Fetches changelog, extracts changes, and updates PACKAGE.md and HISTORY.md.
Use when planning upgrades or when new versions are released. (pkgq)
All loaded skills are available to the agent.
Check Tools
Use the /tools command to see all available tools:
> /tools
Known tools:
Built-in:
✗ yoker:existence - Check if a file or folder exists at the given path.
✗ yoker:git - Execute a Git operation on a repository.
✗ yoker:list - List files and directories.
✗ yoker:mkdir - Create a directory at the given path.
✗ yoker:read - Read the contents of a file.
✗ yoker:search - Search for patterns in files.
✗ yoker:skill - Invoke a skill by name to get its full instructions.
✗ yoker:update - Update an existing file by replacing, inserting, or delet...
✗ yoker:write - Write content to a file.
Plugins:
✗ pkgq:find - Find Python package documentation.
Agent: default
Allowed tools:
>
Using Plugin Skills
Invoke plugin skills by name with the / prefix:
> /pkgq:create
Or ask the agent to use a plugin tool:
> Use the pkgq:find tool to look up documentation for requests
Security Best Practices
1. Review Plugin Components
Before loading a plugin, review what it provides (shown in the confirmation dialog). Tools can execute arbitrary code, so understand what each tool does.
2. Trust Selectively
Only trust plugins from reputable sources. Check the plugin’s:
Source code repository
Documentation
Changelog
Security policy
3. Use Per-Project Configuration
Create project-specific yoker.toml files rather than trusting all plugins globally:
# Project-specific config
./my-project/yoker.toml
# Home config for trusted plugins only
~/.yoker.toml
4. Audit Regularly
Review your trusted plugins periodically:
# Check your trusted plugins
cat ~/.yoker.toml | grep -A 10 "\[plugins.trusted\]"
Configuration Reference
Plugin Settings
[plugins]
enabled = true # Required to load any plugins
[plugins.trusted]
# List of plugins that don't require confirmation
plugin-name = true
another-plugin = true
Configuration File Locations
Yoker searches for configuration files in this order:
./yoker.toml- Current directory (highest priority)~/.yoker.toml- User home directoryBuilt-in defaults
Use the project-local config for project-specific plugins, and the home config for plugins you use across all projects.
Example: Using pkgq Plugin
The pkgq package is the first PyPI-published Yoker plugin. Here’s the complete workflow:
Install and Run
# One-time use with uvx
uvx --with pkgq yoker --with pkgq
# Or install first
pip install pkgq
python -m yoker --with pkgq
First-Time Setup
Enable plugins in
yoker.toml:[plugins] enabled = true
Secure the file:
chmod 600 yoker.toml
Load the plugin and accept the confirmation dialog
Trust permanently (optional):
[plugins.trusted] pkgq = true
Available Components
After loading, pkgq provides:
Tool:
pkgq:find- Find Python package documentationSkills:
pkgq:create- Generate PACKAGE.md for a projectpkgq:update- Update package documentation for new versions
Usage Examples
# Use the skill directly
> /pkgq:create
# Ask the agent to use the tool
> Use pkgq:find to get documentation for the requests library
# Update documentation for a new version
> /pkgq:update
Developing Plugins
For information on creating your own plugins, see:
examples/plugins/demo/README.md- Complete plugin development guideexamples/plugins/demo/- Reference implementation
Plugin Manifest Structure
Plugins declare components through a PluginManifest instance in their __init__.py:
from yoker.plugins import PluginManifest
from .tools import echo
__YOKER_MANIFEST__ = PluginManifest(
tools=[echo],
skills_dir="skills",
agents_dir="agents",
)
PluginManifest Attributes
tools: list[Callable]- List of functions or callable classes provided by the pluginskills: list[Skill]- List of Skill instances (or useskills_dirfor auto-discovery)agents: list[AgentDefinition]- List of AgentDefinition instances (or useagents_dirfor auto-discovery)config_class: type | None- Optional configuration class for plugin toolsskills_dir: str- Directory name for skill files (default: “skills”)agents_dir: str- Directory name for agent files (default: “agents”)
Component Discovery
When using skills_dir or agents_dir, Yoker automatically discovers:
Skills: Markdown files named
SKILL.mdinskills_dirsubdirectoriesAgents: Markdown files with
.mdextension inagents_dir
See the demo plugin at examples/plugins/demo/ for a complete reference implementation.
Troubleshooting
Plugin Not Found
Error: Plugin 'plugin-name' not found
Solution: Install the plugin package before loading it:
pip install plugin-name
# or with uvx
uvx --with plugin-name yoker --with plugin-name
Permission Denied on Config
Error: Configuration file is readable by group/other
Solution: Fix permissions:
chmod 600 yoker.toml
# or
chmod 600 ~/.yoker.toml
Plugin Disabled
Error: Plugins are disabled
Solution: Enable plugins in your configuration:
[plugins]
enabled = true
Trusted Plugin Not Loading
If a plugin you’ve trusted isn’t loading:
Check configuration location: Ensure you’re using the correct config file (project vs. home)
Verify plugin installation:
pip list | grep plugin-nameCheck manifest: The plugin must declare
__YOKER_MANIFEST__in__init__.py
Summary
The plugin workflow follows these steps:
Enable plugins in
yoker.toml([plugins] enabled = true)Secure configuration with
chmod 600 yoker.tomlLoad plugin with
--with package-nameReview and accept the confirmation dialog
Trust permanently (optional) in
[plugins.trusted]Verify components with
/skillsand/toolsUse plugin skills and tools in your session
Plugins extend Yoker’s capabilities while maintaining security through explicit enablement and trust management. Always review plugin components before loading them, and only trust plugins from sources you trust.