Skip to content

Toolkit

The Toolkit is Sidequest’s built-in extension for managing skills, commands, and agents — the three types of customizations that Claude Code understands. It also serves as a window into the extension system that powers Sidequest’s side panels.

Open the Toolkit panel from the bottom toolbar (Cmd+6 by default). It provides a unified interface for managing all three types of Claude Code customizations, and the same items power the / autocomplete in the Create Quest prompt.

TypePaths scannedDescription
Skill~/.claude/skills/*/SKILL.md, ~/.claude/skills/*.md, ~/.claude/plugins/marketplaces/*/skills/*/SKILL.md, <project>/.claude/skills/Instructions Claude loads on demand
Command~/.claude/commands/**/*.md, <project>/.claude/commands/Slash commands
Agent~/.claude/agents/*.md, <project>/.claude/agents/Sub-agents with their own model, tools and turn limits

Items are grouped by Type (Skills, Commands, Agents) or by Scope (the current project vs. User). Plugin and marketplace skills appear under User, named <plugin>:<skill> when the skill has no name of its own. Use the search box to filter by name or description.

  1. Click + in the Toolkit header and choose New Skill, New Command or New Agent
  2. Choose the save target with the segmented toggle: Global (~/.claude/..., available in every project) or the current project’s name (<project>/.claude/...)
  3. Fill in the name and description
  4. For agents, configure additional fields:
    • Model — Default, Opus, Sonnet or Haiku
    • Allowed Tools — quick-add Bash, Read, Write, Edit, Grep, Glob, WebSearch, WebFetch, or type any tool name
    • Max Turns — limit on agent execution turns
  5. Write the instructions in the body editor
  6. Click Save

Files are written as markdown with frontmatter (name, description, and for agents model, allowed_tools, max_turns) to <dir>/<slug>.md.

Right-click any item to Edit it in the Toolkit editor, open it in your preferred editor, open its folder in the file manager, open a terminal there, or Delete it.

Two skills in the list are managed by Sidequest and rewritten at every launch: sidequest (creating quests from an agent) and sidequest-journal (searching and writing journals). Editing them in the Toolkit will not stick; see Sidequest CLI.

Sidequest has a lightweight extension system that loads panels into the right-hand panel of the app. Each extension is a directory containing a manifest.json and a JavaScript/TypeScript entry point.

Third-party extensions are loaded from:

~/.sidequest/extensions/
my-extension/
manifest.json
src/
index.ts

The ExtensionHost manages the full lifecycle — activation, deactivation, visibility toggling, and event broadcasting. Extensions receive a sandboxed API surface (SidequestAPI) that is gated by a capability system declared in their manifest.

graph TD
A[Startup: Scan extensions/] --> B[Parse each manifest.json]
B --> C[Register in ExtensionHost]
C --> D{User opens panel}
D --> E["Call activate(container, api)"]
E --> F{Panel closed}
F -->|"keepAlive: true"| G[Hidden, state preserved]
F -->|"keepAlive: false"| H["Call deactivate()"]
G -->|Reopened| E
  1. Sidequest scans ~/.sidequest/extensions/ at startup for directories containing manifest.json
  2. Each manifest is parsed for id, name, version, and capabilities
  3. When a user opens an extension panel, the host calls the module’s activate() method, passing a container DOM element and the sandboxed API
  4. When the panel is closed, deactivate() is called to clean up
  5. Extensions with keepAlive: true are hidden instead of destroyed when their panel closes, so they can maintain background state
{
"id": "my-extension",
"name": "My Extension",
"version": "1.0.0",
"description": "What this extension does",
"main": "src/index.ts",
"keepAlive": false,
"capabilities": {
"quest:read": true,
"skills:read": true,
"skills:write": true
},
"contributes": {
"panel": {
"label": "My Panel"
}
}
}
FieldRequiredDescription
idYesUnique identifier (e.g., sidequest.toolkit)
nameYesDisplay name
versionYesSemver version string
descriptionNoShort description
mainNoEntry point file (defaults to index.js)
keepAliveNoIf true, extension stays loaded when hidden (defaults to false)
capabilitiesNoMap of capability scopes the extension requires
contributesNoUI contributions (currently only panel with a label)

Extensions declare the API scopes they need. Undeclared capabilities are denied at runtime. First-party extensions (IDs starting with sidequest.) skip runtime prompts; third-party extensions with sensitive capabilities require user confirmation.

CapabilityDescription
session:readRead session stats (tokens, tool usage)
quest:readRead active quest info
workspace:readRead workspace/project info
skills:readList and read skills, commands, agents
skills:writeCreate, update, delete skills/commands/agents
shell:openOpen URLs, editors, terminals, Finder
ui:notifyShow notifications
fs:readRead files from the filesystem
fs:writeWrite files to the filesystem
net:requestMake HTTP requests
process:spawnSpawn child processes (array of allowed executables)

Capabilities that are always prompted at runtime for third-party extensions, even when declared: fs:read, fs:write, net:request, process:spawn.

Your entry point must export an object (or default export) with these methods:

export default {
activate(ctx: ExtensionContext): void | Promise<void> {
// ctx.container — the DOM element to render into
// ctx.api — the SidequestAPI proxy (capability-gated)
// ctx.extension — { id, name, version, directory }
// ctx.onDismiss — callback to close the panel
},
deactivate(): void | Promise<void> {
// Clean up listeners, unmount UI
},
onVisibilityChanged(visible: boolean): void {
// Called when keepAlive extension is shown/hidden
},
}

Third-party extensions get a button in the bottom toolbar with a generic icon, a Cmd+N shortcut after the built-in ones, and a visibility switch under Settings > Extensions like any other.

Sidequest ships with three built-in extensions, registered by the app and always available in the bottom toolbar. Only one is open at a time.

Displays live token usage (input, output, cache read), an estimated cost, the quest’s Token budget progress when one is set, and Tools / Skills timing tables for the active quest’s Claude Code session. Uses keepAlive: true so it maintains state across panel toggles.

Capabilities: session:read, quest:read

The skill, command, and agent manager described above.

Capabilities: skills:read, skills:write, quest:read, workspace:read, shell:open

Briefs a separate agent session on the current quest’s work and asks for an adversarial review. See Council.

Capabilities: process:spawn (restricted to the agent binaries), quest:read