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.
Using the Toolkit Extension
Section titled “Using the Toolkit Extension”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.
Item Types
Section titled “Item Types”| Type | Paths scanned | Description |
|---|---|---|
| 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.
Creating Items
Section titled “Creating Items”- Click + in the Toolkit header and choose New Skill, New Command or New Agent
- Choose the save target with the segmented toggle: Global (
~/.claude/..., available in every project) or the current project’s name (<project>/.claude/...) - Fill in the name and description
- 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
- Write the instructions in the body editor
- Click Save
Files are written as markdown with frontmatter (name, description, and for agents model, allowed_tools, max_turns) to <dir>/<slug>.md.
Context Menu Actions
Section titled “Context Menu Actions”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.
Sidequest’s own skills
Section titled “Sidequest’s own skills”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.
Extension System Architecture
Section titled “Extension System Architecture”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.tsThe 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.
Extension Lifecycle
Section titled “Extension Lifecycle”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 - Sidequest scans
~/.sidequest/extensions/at startup for directories containingmanifest.json - Each manifest is parsed for
id,name,version, andcapabilities - When a user opens an extension panel, the host calls the module’s
activate()method, passing a container DOM element and the sandboxed API - When the panel is closed,
deactivate()is called to clean up - Extensions with
keepAlive: trueare hidden instead of destroyed when their panel closes, so they can maintain background state
Manifest Format
Section titled “Manifest Format”{ "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" } }}Manifest Fields
Section titled “Manifest Fields”| Field | Required | Description |
|---|---|---|
id | Yes | Unique identifier (e.g., sidequest.toolkit) |
name | Yes | Display name |
version | Yes | Semver version string |
description | No | Short description |
main | No | Entry point file (defaults to index.js) |
keepAlive | No | If true, extension stays loaded when hidden (defaults to false) |
capabilities | No | Map of capability scopes the extension requires |
contributes | No | UI contributions (currently only panel with a label) |
Capabilities
Section titled “Capabilities”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.
| Capability | Description |
|---|---|
session:read | Read session stats (tokens, tool usage) |
quest:read | Read active quest info |
workspace:read | Read workspace/project info |
skills:read | List and read skills, commands, agents |
skills:write | Create, update, delete skills/commands/agents |
shell:open | Open URLs, editors, terminals, Finder |
ui:notify | Show notifications |
fs:read | Read files from the filesystem |
fs:write | Write files to the filesystem |
net:request | Make HTTP requests |
process:spawn | Spawn 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.
Extension Module Interface
Section titled “Extension Module Interface”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.
Built-in Extensions
Section titled “Built-in Extensions”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.
Live Stats (sidequest.stats)
Section titled “Live Stats (sidequest.stats)”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
Toolkit (sidequest.toolkit)
Section titled “Toolkit (sidequest.toolkit)”The skill, command, and agent manager described above.
Capabilities: skills:read, skills:write, quest:read, workspace:read, shell:open
Council (sidequest.council)
Section titled “Council (sidequest.council)”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