Intermediate 12 min read

Skill Packs & User Commands

Extend CLAUDIUS without waiting on plugin updates. Drop a Python file with @claudius headers and it becomes a first-class registry entry. Bundle multiple files with a manifest.json and you've got a shareable skill pack.

In This Tutorial

  1. Two Extension Surfaces
  2. User Python Commands
  3. The @claudius Header Format
  4. Authoring a Skill Pack
  5. Installing & Sharing Packs
  6. Bundled Reference Packs

1 Two Extension Surfaces

v3 gives you two ways to add commands without rebuilding the plugin:

Both are tracked in the same registry as built-in commands. There's no second-class status — a Python user command sits alongside a built-in C++ command in Claudius/CLAUDIUS.md, with the same enabled flag, description, and workflow tags.

2 User Python Commands

The simplest extension. Drop a .py file in {Project}/Claudius/UserCommands/ with an execute(params) function:

UserCommands/spawn_grid.py
# @claudius category: level
# @claudius description: Spawn a grid of cubes for blockout
# @claudius workflow: level, level_design, debug

import unreal


def execute(params):
    rows = int(params.get("rows", 5))
    cols = int(params.get("cols", 5))
    spacing = float(params.get("spacing", 200.0))

    sub = unreal.get_editor_subsystem(unreal.EditorActorSubsystem)
    spawned = []
    for r in range(rows):
        for c in range(cols):
            loc = unreal.Vector(c * spacing, r * spacing, 100)
            actor = sub.spawn_actor_from_class(unreal.StaticMeshActor, loc)
            if actor:
                spawned.append(actor.get_actor_label())

    return {
        "success": True,
        "message": f"Spawned {len(spawned)} cubes",
        "output": {"count": len(spawned), "actors": spawned},
    }

Discover and use it:

Use the new command
# Re-scan the UserCommands folder
{ "category": "user", "command": "reload_commands", "parameters": {} }

# Call it
{ "category": "level", "command": "spawn_grid",
  "parameters": { "rows": 3, "cols": 3 } }
Have Claude write it for you

You can also call config.create_command with {name, body, category, description, tags} — the plugin writes the @claudius headers, drops the file in UserCommands/, and reloads. This is the path Claude Code uses when you say "add a command that does X".

3 The @claudius Header Format

Three header lines control how a script appears in the registry:

Header reference
# @claudius category:    one identifier (no spaces). Default: "user"
#                        Common values: level, blueprint, animation, sequencer

# @claudius description: one-line summary for CLAUDIUS.md

# @claudius workflow:    comma-separated tags. Drives preset visibility.
#                        Common: core, fps, level, animation, shot, debug

If you omit headers, the file still works — it just appears under the user category with a generic description. Headers are recommended for anything you want surfaced through presets or wanted to be tagged for the AI's discovery layer.

Function signature

Your execute function gets a single params dict (the JSON payload's parameters field) and must return a dict with these keys:

Return shape
{
  "success": True | False,
  "message": "human-readable status",
  "output": { ... # anything JSON-serializable }
}

4 Authoring a Skill Pack

A skill pack is a folder bundling multiple commands plus metadata. Folder layout:

Pack folder structure
{Project}/Claudius/SkillPacks/my_studio_helpers/
├── manifest.json
├── README.md         # optional
├── ingest_props.py
├── render_shot.py
└── retarget_anims.py

manifest.json

manifest.json
{
  "name":        "my_studio_helpers",
  "version":     "1.0.0",
  "author":      "Your Name",
  "description": "Studio-specific helpers for the X pipeline",
  "workflow_tags": ["animation", "shot", "asset"],
  "requires": {
    "claudius_version": "3.0.0"
  }
}

Pack-level vs. command-level tags

The pack's workflow_tags apply to every command in it, in addition to per-command headers. So if your pack is tagged shot, all its commands light up under any preset that enables the shot tag.

5 Installing & Sharing Packs

Once the folder is in {Project}/Claudius/SkillPacks/:

Pack lifecycle
# Register the pack with the plugin
{ "category": "pack", "command": "install",
  "parameters": { "path": "Claudius/SkillPacks/my_studio_helpers" } }

# Turn its commands on
{ "category": "pack", "command": "enable",
  "parameters": { "pack": "my_studio_helpers" } }

# See what's installed
{ "category": "pack", "command": "list", "parameters": {} }

# Remove it
{ "category": "pack", "command": "uninstall",
  "parameters": { "pack": "my_studio_helpers" } }

To share with your team: zip the pack folder and have them drop it into their SkillPacks/ directory. They run pack.install, optionally pack.enable, and they're set.

Source control friendly

Skill pack folders are plain files (Python + JSON + Markdown). Commit them to your project repo or your studio's shared library — no binary state, no build artifacts.

6 Bundled Reference Packs

v3.1 ships two reference packs you can copy and learn from. Both live in Plugins/Claudius/Resources/SkillPacks/:

fps_starter

The minimal example. Two commands — spawn_target_dummies and spawn_weapon_pickup. Read these first to understand the pattern. Auto-installed in new projects when the FPS preset is loaded.

animation_studio

Designed for shot-based commercial work. Five commands:

Status: v0.1, useful as scaffolding, not yet production-hardened. See The Animation Studio Preset tutorial for end-to-end usage.

Back to
All Tutorials