Skip to content

Skills & Plugins

code-assist is extensible through two mechanisms: skills (reusable prompt-based workflows) and plugins (code packages that contribute tools, commands, and hooks).

Skills Overview

Skills are named workflows that can be invoked as slash commands. They bundle a prompt, allowed tools, model preferences, and execution context into a reusable unit.

What a Skill Is

A skill is essentially a specialized prompt command with:

  • A name (used as /name in the CLI)
  • A prompt (the instructions sent to the model)
  • Optional tool restrictions (which tools the model can use)
  • Optional model override (use a different model for this skill)
  • Optional execution context (inline or fork)

Skill Configuration

Skills are defined in settings.json under the skills key:

json
{
  "skills": {
    "review-pr": {
      "description": "Review a pull request for bugs and style issues",
      "prompt": "Review the current pull request. Check for bugs, security issues, and style violations. Provide actionable feedback.",
      "allowedTools": ["FileRead", "GlobTool", "GrepTool", "Bash(git diff *)"],
      "model": "claude-sonnet-4-6",
      "context": "inline"
    },
    "write-tests": {
      "description": "Generate tests for a module",
      "prompt": "Write comprehensive tests for the specified module. Use pytest with async support. Cover edge cases.",
      "allowedTools": null,
      "context": "fork"
    }
  }
}

Skill Fields

FieldTypeRequiredDescription
descriptionstrYesShort description shown in /help
promptstrYesThe prompt sent to the model
allowedToolslist[str] | nullNoTools the model can use (null = all)
modelstr | nullNoModel override for this skill
context"inline" | "fork"NoRun inline or in a forked agent
agentstr | nullNoAgent template to use
effortstr | nullNoEffort level hint
pathslist[str] | nullNoFile paths relevant to the skill
argNameslist[str] | nullNoNamed arguments the skill accepts

Using Skills

> /review-pr
> /write-tests src/code_assist/core/query.py

Skills appear alongside built-in commands in the /help listing and in autocomplete.

Custom Skill Creation

1. Add to settings.json

json
{
  "skills": {
    "explain-error": {
      "description": "Explain a Python traceback",
      "prompt": "The user will provide a Python traceback. Explain the root cause, suggest a fix, and show the corrected code.",
      "allowedTools": ["FileRead", "GlobTool", "GrepTool"]
    }
  }
}

2. Skill with arguments

json
{
  "skills": {
    "migrate-function": {
      "description": "Migrate a function to async",
      "prompt": "Convert the function at the specified path from synchronous to asynchronous. Update all callers.",
      "argNames": ["path"],
      "allowedTools": ["FileRead", "FileEdit", "GlobTool", "GrepTool"]
    }
  }
}

Usage: /migrate-function src/code_assist/config/settings.py

3. Skill with forked context

json
{
  "skills": {
    "experiment": {
      "description": "Try an experimental approach",
      "prompt": "Explore the approach described by the user. This runs in a fork so it won't affect the main conversation.",
      "context": "fork"
    }
  }
}

Skill Storage

User-created skills can also be stored as files in ~/.claude/skills/:

~/.claude/skills/
  review-pr.json
  write-tests.json
  explain-error.json

Each file is a JSON object with the same schema as a skill entry in settings.json.

Bundled Skills

code-assist ships with several built-in skills:

SkillDescription
simplifyReview changed code for reuse, quality, and efficiency
commitGenerate a commit message and create a git commit
review-prReview a pull request
loopRun a command on a recurring interval
scheduleCreate scheduled remote agents (cron triggers)
claude-apiHelp build apps with the Anthropic SDK
frontend-designCreate production-grade frontend interfaces

Bundled skills are loaded from CommandLoadedFrom.BUNDLED and cannot be overridden by user skills with the same name (user skills take priority through the merge order).

Plugin System

Plugins are Python packages that extend code-assist with custom tools, commands, and hooks.

Plugin Manifest

Every plugin declares a PluginManifest:

python
@dataclass
class PluginManifest:
    name: str = ""              # Plugin name
    version: str = ""           # Semantic version
    description: str = ""       # What this plugin does
    repository: str = ""        # Source repository URL
    author: str = ""            # Author name
    hooks: dict = {}            # Hook event -> handler mappings
    tools: list[str] = []       # Tool class names to register
    commands: list[str] = []    # Command names to register
    settings: dict = {}         # Default settings contributed by the plugin

Loading Plugins

Plugins are listed in settings.json:

json
{
  "plugins": [
    "my-code-assist-plugin",
    "another-plugin"
  ]
}

Each plugin is loaded and produces a LoadedPlugin:

python
@dataclass
class LoadedPlugin:
    manifest: PluginManifest    # The plugin's declared capabilities
    path: str = ""              # Filesystem path where the plugin was found
    source: str = ""            # How it was discovered
    is_active: bool = True      # Whether it is currently active
    error: str | None = None    # Load error, if any

Creating a Plugin

  1. Create a Python package with a code_assist_plugin entry point:
toml
# pyproject.toml
[project.entry-points."code_assist.plugins"]
my_plugin = "my_plugin:manifest"
  1. Define the manifest:
python
# my_plugin/__init__.py
from code_assist.types.plugin import PluginManifest

manifest = PluginManifest(
    name="my-plugin",
    version="1.0.0",
    description="Adds custom tools for my workflow",
    author="Your Name",
    tools=["MyCustomTool"],
    commands=["my-command"],
)
  1. Implement tools and commands following the standard ToolDef and CommandBase patterns.

  2. Install the package in the same environment as code-assist:

bash
uv pip install -e ./my-plugin

Plugin Settings

Plugins can contribute default settings that are merged into the settings hierarchy:

python
manifest = PluginManifest(
    name="my-plugin",
    settings={
        "myPlugin": {
            "apiUrl": "https://api.example.com",
            "timeout": 30,
        }
    },
)

These appear under their key in the merged settings and can be overridden by user/project/local settings.

Command Loading Sources

Commands (including skill-generated ones) are tracked by their source:

SourceEnum ValueDescription
BundledbundledShips with code-assist core
ManagedmanagedOrganization-managed commands
SkillsskillsUser-defined skills from settings.json
PluginpluginLoaded from installed plugins
MCPmcpProvided by MCP servers

TIP

Skills are the easiest way to extend code-assist for your workflow. Start with a skill before building a full plugin — most use cases can be covered by a well-crafted prompt with tool restrictions.

WARNING

Plugins run with the same privileges as code-assist itself. Only install plugins from trusted sources. Review the plugin manifest to understand which tools, hooks, and commands it registers.

Research and educational use only. Inspired by Claude Code by Anthropic. All original rights reserved by Anthropic.