Agent skill

Build Sculptor Extension

by imbue-ai in imbue-ai/sculptor

Build or modify a Sculptor extension — a runtime ESM module loaded into the Sculptor UI.

MITAuto-check passed

Install Build Sculptor Extension

skills CLI
$ npx skills add imbue-ai/sculptor --skill build-sculptor-extension -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install imbue-ai/sculptor build-sculptor-extension --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/imbue-ai/sculptor.git skills-src && mkdir -p .claude/skills && cp -r skills-src/sculptor/sculptor-plugin/skills/build-sculptor-extension .claude/skills/build-sculptor-extension && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
build-sculptor-extension
GitHub stars
238
Token cost
~3.4k tokens
SKILL.md length
1,420 words
Files
4
Skills in repo
29
Repo updated
First seen
Licence
MIT

At a glance

Build or modify a Sculptor extension — a runtime ESM module loaded into the Sculptor UI.

  • Asked to write an extension (or plugin) for Sculptor
  • SKILL.md covers Quick start (no build step), Prerequisites — the two…, Dev loop — sculpt extension and manifest.json, plus 5 more sections
  • Runs JavaScript and TypeScript scripts from its folder; calls just
  • Workspace widget

What it does

Build Sculptor Extension is an agent skill from imbue-ai/sculptor. Build or modify a Sculptor extension — a runtime ESM module loaded into the Sculptor UI. Use when asked to write an extension (or "plugin") for Sculptor, add a panel, overlay, workspace widget, home view, or settings UI to Sculptor, or to iterate on an extension with sculpt extension. Works from any repo; this file is a self-contained reference (the Sculptor source code is optional).

Its SKILL.md is about 3.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 4 other files (for example `example/main.js`, `example/manifest.json` and `sdk.d.ts`).

The repository describes itself as: Build product with grounded, parallel coding agents. The licence is MIT.

When your agent uses it

  • Asked to write an extension (or plugin) for Sculptor
  • Workspace widget
  • Settings UI to Sculptor
  • Iterate on an extension with sculpt extension

Example prompts

  • “plugin”
  • “/build-sculptor-extension”

Requirements

  • Node.js

What it can do on your machine

Read from SKILL.md and the folder at commit f847102. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships script files (JavaScript and TypeScript), which the agent can run.

    Shell commands in SKILL.md call:

    • just

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Build Sculptor Extension loads about 3.4k tokens when it runs. Until then it costs about 103 tokens; SKILL.md has 1,420 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~103
When it runs · the whole SKILL.md, loaded when a task matches
~3.4k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from imbue-ai/sculptor at commit f847102, republished under its MIT licence (© imbue-ai). 1,420 words, ~3,420 tokens.

Download SKILL.mdSave it as .claude/skills/build-sculptor-extension/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.
name
build-sculptor-extension
description
Build or modify a Sculptor extension — a runtime ESM module loaded into the Sculptor UI. Use when asked to write an extension (or "plugin") for Sculptor, add a panel, overlay, workspace widget, home view, or settings UI to Sculptor, or to iterate on an extension with `sculpt extension`. Works from any repo; this file is a self-contained reference (the Sculptor source code is optional).

Build a Sculptor extension

An extension is a runtime ES module the Sculptor frontend imports at load time. It is not built into the app — it ships as its own files and is loaded live. Everything you need is in this file plus the sculpt CLI; you do not need the Sculptor source code or a dev build of Sculptor (see the last section for when they help).

An extension is a directory containing manifest.json plus an ESM entry module that default-exports an activate(api) function.

Two files ship next to this SKILL.md (resolve them against this skill's base directory):

  • sdk.d.ts — the authoritative, generated contract of @sculptor/extension-sdk: every hook, component, and registration option with its doc comments. Read it before writing extension code; the prose below only summarizes it.
  • example/ — the quick-start extension below as ready-to-load files (Sculptor's e2e tests load this exact directory, so it is known-good).

Quick start (no build step)

json
// manifest.json
{ "id": "hello", "name": "Hello", "version": "0.1.0", "entry": "main.js", "sdkVersion": "^1.0.0" }
js
// main.js — hand-written ESM, imported directly by the host (no bundler)
export default function activate(api) {
  const el = document.createElement("div");
  el.textContent = "hello from an extension";
  el.style.cssText = "position:fixed;bottom:16px;right:16px;pointer-events:auto;";
  document.body.appendChild(el);
  return () => el.remove(); // disposer — REQUIRED cleanup on unload/reload
}
bash
sculpt extension load <this-skill's-base-dir>/example   # package + load into the live UI
sculpt extension inspect hello                          # see what it registered

Prerequisites — the two settings toggles

Both live in Settings → Extensions in the Sculptor UI; only the user can flip them:

  • Extensions (enable_extensions, default on) — master switch for the extension runtime.
  • Agent extension loading (allow_agent_extension_loading, default off) — gates the mutating CLI ops (load, reload, unload, remove). Read-only ops (list, inspect, dir) always work.

If a mutating command fails with HTTP 403 / agent_extension_loading_disabled, ask the user to enable "Agent extension loading" under Settings → Extensions, then retry. If no window responds at all, Sculptor isn't running or extensions are disabled.

Dev loop — sculpt extension

(See the sculpt-cli skill for general sculpt usage; all commands accept --json and infer the workspace from SCULPT_WORKSPACE_ID.)

CommandWhat it does
sculpt extension load <dir|manifest.json|url> [--persist]Package the directory (or register the URL) and load it into the live UI — run after every edit
sculpt extension reload <id>Re-import from the extension's current source with cache-busting. Does NOT re-package local file edits — after editing a path-loaded extension, run load again; reload only helps when the source itself serves fresh files (e.g. a dev-server URL)
sculpt extension inspect <id>One extension's live status, registrations, and config key names (values are never shown)
sculpt extension listAll extensions (builtin / installed / url / dev) with live status per window
sculpt extension unload <id>Unload from the UI; files stay on disk
sculpt extension remove <id>Unload + delete the workspace's dev install (idempotent; leaves permanent installs alone)
sculpt extension dirPrint the backend's extensions directory (e.g. ~/.sculptor/extensions)

load mechanics worth knowing:

  • A local path is packaged and uploaded (dotfiles, node_modules, and __pycache__ are skipped; 5 MB encoded limit) to a workspace-scoped dev install at <extensions-dir>/dev/<workspace-id>/<extension-id>/. Re-loading wipes and rewrites that directory.
  • --persist installs to the top-level <extensions-dir>/<extension-id>/ instead — a permanent install that survives after this workspace is gone. URLs are always persistent sources; --persist has no effect on them.
  • The extension id must be a single safe path segment: no / or \, not exactly . or .. (dots inside an id like foo.bar are fine), and not the reserved name dev.
  • load and reload wait for the extension to settle: load: OK means it reached status: loaded (manifest fetched, validated, imported, activated). A failure at any phase (manifest, validate, import, activate, or the catch-all load) prints load: FAILED with the phase and error message and exits non-zero. Errors thrown after activation (e.g. inside a component render) surface in the UI's per-extension error boundary instead — check inspect and the UI when something registered but doesn't render.

Typical loop: load → edit → load again → … → remove (cleanup) or load --persist (keep it installed). Do not reach for reload in this loop — it re-imports the previously uploaded copy, so your edits won't show up.

Manual no-CLI route: drop the extension directory into <extensions-dir>/<extension-id>/ (path from sculpt extension dir) and click the Refresh button in Settings → Extensions.

manifest.json

All five fields are required non-empty strings; there are no optional fields:

FieldMeaning
idStable identifier — used in CLI commands, registration namespaces, and the settings localStorage prefix. Safe path segment, not dev.
nameDisplay name in Settings → Extensions
versionInformational; shown in the UI, not validated
entryESM entry file, relative to the manifest
sdkVersionSemver range; only the major must match the host's SDK major, which is 1 — use "^1.0.0"

The entry module — activate and disposers

ts
type ExtensionActivate = (api: ExtensionHostApi) => void | (() => void) | Promise<void | (() => void)>;
  • The host imports the entry and calls its default export with the API.
  • Return a disposer that undoes every module-level side effect (DOM nodes, event listeners, timers, injected <style> tags). Disposers must be synchronous. Registrations made through api.register* each return their own undo function — compose them into the disposer you return.
  • If activate throws or rejects, the extension lands in error status with phase activate, any registrations it already made are rolled back, and other extensions are unaffected.
  • On reload the disposer runs, then the module is re-imported (cache-busted) and re-activated.
Show full SKILL.md (633 more words)Show less

The host API and SDK — read sdk.d.ts

The full typed contract — ExtensionHostApi, every registration option shape, every hook signature, and their doc comments — is in the generated sdk.d.ts next to this file. It is authoritative; read it rather than trusting any summary. What it contains, in one breath:

  • api.registerPanel / registerSettings / registerOverlay / registerWorkspaceWidget / registerHomeView — each returns an undo function; registering twice with the same id replaces the previous contribution; every component renders inside a per-extension error boundary and receives no props.
  • Hooks: useCurrentWorkspace (selector form available), useWorkspaces, useWorkspaceTasks, useNavigateToWorkspace, useOpenNewWorkspaceModal, useExtensionSetting, useExtensionSettings, useSetExtensionSetting.
  • Components and actions: Markdown, PanelHeader, openExternal.

Semantics that matter beyond the types:

  • Workspace scope: panels and workspace widgets are mounted per-workspace, so workspace-scoped hooks work directly. Overlays, home views, and settings components are app-global — useWorkspaceTasks is unavailable there, and useCurrentWorkspace reflects whichever workspace the current route shows (or null).
  • Overlays render in a pointer-events: none layer — interactive elements must set pointer-events: auto themselves.
  • useExtensionSetting persists per-extension strings in localStorage (sculptor-extension:<id>:<key>). Values are plaintext — treat anything the user puts there (e.g. an API token) as visible to anyone with devtools access, and JSON-encode yourself if you need structure.
  • Prefer the selector form of useCurrentWorkspace (e.g. (w) => w?.branch ?? null) to avoid re-rendering on unrelated workspace changes.
Host-provided modules — never bundle these

The host import map provides exactly these bare specifiers; mark them as externals in any build, and never ship your own copy (a second React instance breaks hooks):

react   react/jsx-runtime   react-dom   react-dom/client
jotai   @tanstack/react-query   @radix-ui/themes   lucide-react
@sculptor/extension-sdk

Notes: @tanstack/react-query deliberately does not expose QueryClient / QueryClientProvider — extensions share the host's query cache; namespace your query keys with your extension id (e.g. ["my-extension", "issue", id]). Importing a name a module doesn't export silently yields undefined at runtime, so verify in the UI rather than trusting the build.

Two flavors: no-build vs. built

No-build (start here): hand-written ESM. Raw DOM (as in the quick start), or React without JSX via createElement:

js
import { createElement as h, useState } from "react";
import { useExtensionSetting } from "@sculptor/extension-sdk";

const Badge = () => {
  const [label, setLabel] = useExtensionSetting("label");
  return h("div", { style: { pointerEvents: "auto", position: "fixed", top: 8, right: 8 } },
    h("input", { value: label, onChange: (e) => setLabel(e.target.value) }));
};

export default function activate(api) {
  return api.registerOverlay({ id: "badge", component: Badge });
}

Built (when you want JSX/TypeScript/dependencies): any bundler that emits a single ESM file with the host modules external. Minimal Vite setup:

ts
// vite.config.ts — devDependencies: vite, @vitejs/plugin-react
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";

export default defineConfig({
  plugins: [react()],
  define: { "process.env.NODE_ENV": JSON.stringify("production") },
  build: {
    lib: { entry: "src/index.tsx", formats: ["es"], fileName: () => "main.js" },
    rollupOptions: {
      external: [
        "react", "react/jsx-runtime", "react-dom", "react-dom/client",
        "jotai", "@tanstack/react-query", "@radix-ui/themes", "lucide-react",
        "@sculptor/extension-sdk",
      ],
    },
  },
});

The SDK is not published to npm. For TypeScript, copy the sdk.d.ts shipped next to this skill into your project and alias it in tsconfig.json: "paths": { "@sculptor/extension-sdk": ["./sdk.d.ts"] } (you'll want @types/react installed for full fidelity). After building, place manifest.json next to the bundle ("entry": "main.js") and sculpt extension load <dist-dir> — loading the output directory keeps the upload small.

Gotchas

  • load/reload report the settled status, but errors thrown after activation (event handlers, component renders) don't reach the CLI — when something registered but misbehaves, check inspect and the UI's per-extension error boundary.
  • Disposers are synchronous; clean up injected styles/listeners/timers, not just DOM nodes.
  • Overlays: remember pointer-events: auto on interactive elements.
  • Settings are plaintext localStorage; inspect reports key names only.
  • Use Radix theme CSS variables (e.g. var(--gray-12), var(--accent-9)) so the extension follows the host theme, and @radix-ui/themes components for native-feeling UI.
  • One extension id wins per source priority (local > url > builtin); a shadowed duplicate loads its manifest but never activates.

Going deeper with the Sculptor source (optional)

None of this is required — the contract above is complete — but if you have a checkout of github.com/imbue-ai/sculptor (or are already working in it), you can go deeper:

  • SDK source: sculptor/frontend/src/extensions/types.ts (host API contract) and sculptor/frontend/src/extensions/sdk/ (hooks, components, actions) — the sdk.d.ts next to this skill is generated from these (just generate-extension-sdk-dts).
  • Reference extensions: sculptor/frontend/public/extensions/sculpty/ (no-build raw DOM), sculptor/frontend/public/extensions/pomodoro/ (no-build React overlay with persisted settings), and sculptor/frontend/extensions/linear-issue/ (full TypeScript/Vite panel + settings + widget + home view).
  • Bundled extensions: extensions shipped with the app are built by the host's Vite config (sculptor/frontend/vite-plugins/bundled-extensions.ts); adding an id to COMPILED_EXTENSION_IDS there builds extensions/<id>/src/ automatically.
  • In-repo skills: when working inside the Sculptor repo you can run a dev build of the app and use the auto-qa-changes skill to drive the UI in a headless browser for visual verification, instead of relying on the user's live instance.

© imbue-ai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 3 other files in sculptor/sculptor-plugin/skills/build-sculptor-extension of imbue-ai/sculptor.

  • SKILL.md
  • example/main.js
  • example/manifest.json
  • sdk.d.ts

Open the folder on GitHubat commit f847102

Compare with similar skills

Build Sculptor Extension next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Build Sculptor Extension compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Build Sculptor Extension this skillimbue-ai/sculptor238—~3.4kAutomated safety check: PassMIT
EsmK-Dense-AI/scientific-agent-skills48k1 repos~2.7kAutomated safety check: PassMIT
Esmdavila7/claude-code-templates33k9 repos~2.6kAutomated safety check: WarnMIT
Browser Extension Buildersickn33/agentic-awesome-skills47k2 repos~2.3kAutomated safety check: PassMIT
Browser Extension Launchsickn33/agentic-awesome-skills47k1 repos~1.4kAutomated safety check: PassMIT
Browser Extension Reversesickn33/agentic-awesome-skills47k1 repos~695Automated safety check: PassMIT

Similar skills

  • Esm

    K-Dense-AI/scientific-agent-skills

    Uses the Biohub esm Python SDK for ESM3 protein generation, ESMC embeddings, and ESMFold2 all-atom folding.

    48k GitHub starsUsed in 1 repo~2.7k tokens
    AI & LLM EngineeringAuto-check passed
  • Esm

    davila7/claude-code-templates

    Comprehensive toolkit for protein language models including ESM3 (generative multimodal protein design across sequence, structure, and function) and ESM C (efficient protein embeddings and…

    33k GitHub starsUsed in 9 repos~2.6k tokens
    AI & LLM EngineeringAuto-check: warnings
  • Browser Extension Builder

    sickn33/agentic-awesome-skills

    Expert in building browser extensions that solve real problems - Chrome, Firefox, and cross-browser extensions.

    47k GitHub starsUsed in 2 repos~2.3k tokens
    DevelopmentAuto-check passed
  • Browser Extension Launch

    sickn33/agentic-awesome-skills

    Builds, tests, packages, and prepares Chrome extensions for store launch from a plain-language idea; use for new extensions, fixes, releases, and submission recovery.

    47k GitHub starsUsed in 1 repo~1.4k tokens
    DevelopmentAuto-check passed
  • Browser Extension Reverse

    sickn33/agentic-awesome-skills

    Authorized reverse engineering of Chrome/Firefox extensions: manifest analysis, background workers, content scripts, and extension-based credential or data-exposure research.

    47k GitHub starsUsed in 1 repo~695 tokens
    SecurityAuto-check passed
  • Browser Extension Reverse

    zhaoxuya520/reverse-skill

    A skill your agent uses for authorized reverse engineering of browser extensions (Chrome/Firefox) including manifest analysis, background workers, and extension-based credential or traffic logic…

    41k GitHub starsUsed in 2 repos~366 tokens
    SecurityAuto-check passed

More from imbue-ai/sculptor

All 29 skills in this repo
  • Auto QA Iphone

    imbue-ai/sculptor

    QA the Sculptor mobile web UI on a real iOS Simulator, driven headlessly from a Mac.

    238 GitHub stars~3.1k tokensUpdated yesterday
    Auto-check passed
  • Measure React Renders

    imbue-ai/sculptor

    Compare React component render counts between origin/main and the current branch during a user-defined UI scenario (e.g.

    238 GitHub stars~603 tokensUpdated yesterday
    Auto-check passed
  • Post PR To Slack

    imbue-ai/sculptor

    Post a one-line PR announcement to a Slack channel, and mark it :merged: when the PR merges.

    238 GitHub stars~1.6k tokensUpdated yesterday
    Auto-check passed
  • Batch Claude Runner

    imbue-ai/sculptor

    Run Claude programmatically against collections of files in the codebase.

    238 GitHub stars~308 tokensUpdated yesterday
    Auto-check passed
  • Code Review Checklist

    imbue-ai/sculptor

    Review a set of code changes against Sculptor's review categories and produce a markdown findings table.

    238 GitHub stars~3.6k tokensUpdated yesterday
    Auto-check passed
  • Cut Release

    imbue-ai/sculptor

    Cut a new Sculptor release candidate from main: run just cut-release (which creates the release/sculptor-vX.Y.0 branch at X.Y.0rc1, pushes the tag that triggers the RC build, and opens a PR bumping…

    238 GitHub stars~1.8k tokensUpdated yesterday
    Auto-check passed

Questions about Build Sculptor Extension

What does Build Sculptor Extension do?

Build or modify a Sculptor extension — a runtime ESM module loaded into the Sculptor UI. Build Sculptor Extension is an agent skill from imbue-ai/sculptor. Build or modify a Sculptor extension — a runtime ESM module loaded into the Sculptor UI.

When should I use Build Sculptor Extension?

Build Sculptor Extension fits situations like: asked to write an extension (or plugin) for Sculptor; workspace widget; settings UI to Sculptor; iterate on an extension with sculpt extension.

How do I install Build Sculptor Extension in Claude Code?

Run `npx skills add imbue-ai/sculptor --skill build-sculptor-extension -a claude-code`. Or copy the skill folder (sculptor/sculptor-plugin/skills/build-sculptor-extension in imbue-ai/sculptor) into .claude/skills/build-sculptor-extension in your project. Claude Code loads it when a task matches its description.

How do I install Build Sculptor Extension in Codex?

Run `npx skills add imbue-ai/sculptor --skill build-sculptor-extension -a codex`. Or copy the skill folder (sculptor/sculptor-plugin/skills/build-sculptor-extension in imbue-ai/sculptor) into .agents/skills/build-sculptor-extension in your project. Codex loads it when a task matches its description.

Can I use Build Sculptor Extension in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add imbue-ai/sculptor --skill build-sculptor-extension -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/build-sculptor-extension, .gemini/skills/build-sculptor-extension, .github/skills/build-sculptor-extension and .opencode/skills/build-sculptor-extension in your project.

What does Build Sculptor Extension need to run?

Going by SKILL.md and its folder, Build Sculptor Extension needs JavaScript and TypeScript for the scripts in its folder and the command-line tools its instructions call (just). Our summary lists: Node.js.

Does Build Sculptor Extension access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Build Sculptor Extension safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Build Sculptor Extension use?

Build Sculptor Extension is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Build Sculptor Extension use?

About 3.4k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Build Sculptor Extension?

Skills that share tags, products or a category with Build Sculptor Extension: Esm (K-Dense-AI/scientific-agent-skills, 48k stars), Esm (davila7/claude-code-templates, 33k stars), Browser Extension Builder (sickn33/agentic-awesome-skills, 47k stars) and Browser Extension Launch (sickn33/agentic-awesome-skills, 47k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Build Sculptor Extension?

imbue-ai (a GitHub organization) maintains it in imbue-ai/sculptor, which has 238 GitHub stars. The repository holds 29 skills in this directory. The repository was last updated on October 9, 2026.

Source: imbue-ai/sculptor on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.