Agent skill

Plugin Builder

by AIDotNet in AIDotNet/NextCoWork

Author, package, and debug NextCoWork plugins — the single entry point.

Apache-2.0Auto-check passedDevelopment

Install Plugin Builder

skills CLI
$ npx skills add AIDotNet/NextCoWork --skill plugin-builder -a claude-code

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

GitHub CLI
$ gh skill install AIDotNet/NextCoWork plugin-builder --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/AIDotNet/NextCoWork.git skills-src && mkdir -p .claude/skills && cp -r skills-src/resources/skills/plugin-builder .claude/skills/plugin-builder && 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
plugin-builder
GitHub stars
638
Token cost
~2.4k tokens
SKILL.md length
876 words
Files
8 (incl. references)
Skills in repo
2
Repo updated
First seen
Licence
Apache-2.0

At a glance

Author, package, and debug NextCoWork plugins — the single entry point.

  • Scaffolding a plugin
  • SKILL.md covers Read the reference you need —…, The isolation model (read this…, Package anatomy and The smallest plugin is zero code, plus 3 more sections
  • Reaches bilibili.com
  • Choosing what to contribute

What it does

Plugin Builder is an agent skill from AIDotNet/NextCoWork. Author, package, and debug NextCoWork plugins — the single entry point. Covers the manifest (package.json) and the permission model with per-call capability gates, every contribution point (commands, menus, keybindings, custom editors, views, web apps, agent tools, card views, configuration, bundled Skills) including which install cleanly but do nothing yet, the ncw:doc document channel, result / live-progress / interactive cards, the nextcowork runtime API namespaces, the sandbox and isolation model, and build +…

Its SKILL.md is about 2.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files, including reference files (for example `references/agent-tools.md`, `references/contribution-points.md` and `references/custom-editors.md`).

It sits in Development, covering Authorization and RBAC, Project scaffolding and Debugging. It works with npm. The repository describes itself as: Open Cowork - Opensource Claude Cowork for Windows & macOS & Linux. The licence is Apache-2.0.

When your agent uses it

  • Scaffolding a plugin
  • Choosing what to contribute
  • Reviewing a manifest
  • Debugging a permission

Example prompts

  • “/plugin-builder”

What it can do on your machine

Read from SKILL.md and the folder at commit c253cae. 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

    No scripts in the folder and no shell commands in SKILL.md (its code samples are jsonc and typescript).

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

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • bilibili.com

    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

Plugin Builder loads about 2.4k tokens when it runs, and up to ~16k if it reads all its reference files. Until then it costs about 229 tokens; SKILL.md has 876 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~229
When it runs · the whole SKILL.md, loaded when a task matches
~2.4k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~16k

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 AIDotNet/NextCoWork at commit c253cae, republished under its Apache-2.0 licence (© AIDotNet). 876 words, ~2,399 tokens.

Download SKILL.mdSave it as .claude/skills/plugin-builder/SKILL.md (or your agent's skills folder). This skill also uses 7 other files; get the full folder from GitHub.
name
plugin-builder
description
Author, package, and debug NextCoWork plugins — the single entry point. Covers the manifest (package.json) and the permission model with per-call capability gates, every contribution point (commands, menus, keybindings, custom editors, views, web apps, agent tools, card views, configuration, bundled Skills) including which install cleanly but do nothing yet, the ncw:doc document channel, result / live-progress / interactive cards, the nextcowork runtime API namespaces, the sandbox and isolation model, and build + ZIP + market publishing rules. Use for scaffolding a plugin, choosing what to contribute, writing or reviewing a manifest, picking or debugging a permission, taking over a file type, bundling Skills with a plugin, giving the agent new tools, or fixing a plugin that builds, installs, activates, renders, or publishes wrong. Detailed material lives in references/ next to this file.

NextCoWork Plugin Builder

Build plugins that extend the NextCoWork desktop app and its AI agent. A plugin is a self-contained package that runs sandboxed and talks to the host over a small, permissioned RPC surface.

Read the reference you need — this page is the map

The details live in references/, next to this SKILL.md. Read the file that matches the task; this page alone is not enough to write a working plugin.

TaskReference
Every contributes key, what it does, and which ones do nothing yetreferences/contribution-points.md
Manifest fields, the permission model, what needs which capabilityreferences/manifest-permissions.md
Method → permission, one row per RPCreferences/permission-map.md
Taking over file types (custom editors), views, the document channelreferences/custom-editors.md
Contributing agent tools, result / live / interactive cardsreferences/agent-tools.md
Runtime API namespaces (workspace / net / process / storage / secrets / window / tabs / …)references/runtime-api.md
Build, ZIP layout, installer checks, market publishreferences/packaging.md

How to open them: the paths above are relative to this Skill's own package directory — the directory holding this SKILL.md. Bundled Skills are installed into the app's global Skill root (<userData>/skills/plugin-builder/), which differs between dev and packaged builds; if you don't know it, locate the package first (for example a Glob search for **/skills/plugin-builder/SKILL.md) and read the reference by its absolute path. Do not look for them relative to the user's workspace — they are not part of it.

The isolation model (read this first)

Every plugin runs with no access to the host DOM or Node. Two surfaces exist:

  • Background host window — a hidden BrowserWindow (sandbox, contextIsolation, nodeIntegration:false) on a dedicated session partition, serving your main ESM entry from ncw-plugin://<publisher>.<name>/. This is where activate() and your tool/command handlers run.
  • View / card iframes — your HTML (contributes.views, contributes.customEditors, contributes.cardViews) rendered in a cross-origin ncw-plugin:// iframe inside the main window. Sandboxed: no popups, no modals, no top-navigation. Views cannot import nextcowork — that shim only loads in the host window; views talk to the host exclusively through the document channel and the theme shim (see references/custom-editors.md).

You reach the host only through the nextcowork module API (host window side). Every capability is gated by a permission the user granted, plus an argument gate (path inside the workspace, host in hostPermissions, command in allowedCommands).

Package anatomy

<publisher>.<name>/
├── package.json            # the manifest (required)
├── dist/
│   ├── extension.js        # single-file ESM entry (manifest.main)
│   ├── views/*.html        # view / cardView HTML (optional)
│   └── ...
├── l10n/                   # zh-CN.json + en-US.json (required if you use %keys%)
└── icon.png                # optional (≤256 KB)

Install by ZIP (top-level single dir named <publisher>.<name>), from a directory in dev, or from the market.

The smallest plugin is zero code

If all you want is to bring a website in ("open Bilibili in a tab"), you do not need an entry module, a bundler, or a host process. Declare "kind": "webapp" and one webApps entry — that's the whole package:

jsonc
{
  "publisher": "ncw", "name": "bilibili", "kind": "webapp",
  "displayName": "哔哩哔哩", "description": "…", "version": "0.1.0",
  "engines": { "nextcowork": "^0.3.0" }, "l10n": "./l10n",
  "permissions": [],
  "hostPermissions": ["https://www.bilibili.com/*"],
  "contributes": { "webApps": [
    { "id": "home", "title": "%app.home%", "icon": "tv", "url": "https://www.bilibili.com/" }
  ] }
}

Installing it puts an entry in the sidebar; clicking it opens the site in a workspace tab, signed in already (it shares the workspace browser session). Full rules — including why main in a webapp manifest is an error rather than an ignored field — in references/manifest-permissions.md. Working example: examples/ncw.bilibili.

Minimal working plugin (with code)

package.json:

jsonc
{
  "publisher": "acme", "name": "hello", "displayName": "Hello", "description": "demo",
  "version": "0.1.0", "engines": { "nextcowork": "^0.3.0" }, "main": "./dist/extension.js",
  "l10n": "./l10n", "activationEvents": ["onTool:say_hello"],
  "permissions": [],
  "contributes": { "tools": [{ "name": "say_hello", "title": "%tool.hello%", "shape": "orchestration" }] }
}

dist/extension.js:

ts
import * as ncw from 'nextcowork'
export function activate(context) {
  context.subscriptions.push(
    ncw.tools.registerTool('say_hello', {
      description: 'Greet someone.',
      inputSchema: { type: 'object', properties: { name: { type: 'string' } }, required: ['name'] },
      readOnly: true, destructive: false, needsNetwork: false,
      async invoke({ input }) {
        return { content: [{ text: `Hello, ${input.name}!` }] }
      }
    })
  )
}

l10n/zh-CN.json → { "plugin.acme.hello.tool.hello": "打个招呼" }, l10n/en-US.json → { "plugin.acme.hello.tool.hello": "Say hello" }.

Show full SKILL.md (389 more words)Show less

Activation model

Declared plugins wake lazily on the first matching event. Waking a plugin wakes its declared dependencies first.

  • onStartup — wakes at launch. The market rejects this by default (memory risk). Avoid unless essential.
  • onCommand:<commandId>, onCustomEditor:<viewType>, onTool:<toolName>, onView:<viewId>, onWorkspaceContains:<glob>

★ The event you declare must be one the host actually dispatches: onCommand: fires when the user runs the command; onCustomEditor: fires when a tab opens for that viewType — the host wakes the plugin before mounting the view iframe, because view files are only servable for plugins that have been spawned at least once (an unwoken plugin's iframe is a bare 403 "forbidden"). Prefer these specific events over onStartup.

Idle plugins sleep after ~5 minutes; the next event re-wakes them. Sleeping stops your background code but does not stop serving your view files.

Gotchas that bite every new author

  • Titles/messages are l10n keys, not text — ship both locales or install fails.
  • The manifest is the capability ceiling; permissions.request() for anything outside permissions ∪ optionalPermissions is silently denied. See references/manifest-permissions.md for what each capability unlocks, per API call.
  • Contributing a resource (view / custom editor / command / tool registration) itself needs no permission — permissions gate the runtime RPCs you call, not the contribution points. A pure custom editor that saves via the document channel needs zero permissions.
  • Tool inputSchema is not validated by the host — validate input yourself.
  • Result/live/interactive cards are UI-only; the model only ever sees content text.
  • connect() needs both the plugins permission and a declared dependencies entry.
  • nextcowork must be external in the host-side bundle; views must bundle everything (CSP gives no network). See references/packaging.md.

Inspect the host implementation when behavior is unclear: manifest schema src/shared/plugin/manifest.ts, RPC + permissions src/shared/plugin/protocol.ts, permission model src/shared/plugin/permission.ts, contribution points src/shared/plugin/contribution.ts, custom editor matching src/shared/plugin/custom-editor.ts, lifecycle src/main/plugin/manager.ts, protocol/CSP src/main/plugin/protocol.ts, cards src/renderer/src/views/chat/CardRenderer.tsx, full typed API packages/plugin-api/nextcowork.d.ts.

Plugin views (custom editors) are React-ready: the host serves react, react-dom and its own control kit as nextcowork/ui over an injected import map, so a view bundle carries neither. Mark them external, import Button / Dialog / TextArea from nextcowork/ui and the document channel from nextcowork/view. See references/custom-editors.md.

Working examples live in examples/ — ncw.bilibili (zero-code web app: three files, no JavaScript), acme.note-editor (React view on the host kit, zero dependencies), acme.excalidraw (custom editor + command + onStartup), acme.image-studio (image editor over the document channel's base64 branch, zero permissions), acme.markdown-studio (editor + rich split view, zero permissions, code-split chunks).

© AIDotNet, Apache-2.0. 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 7 other files (references) in resources/skills/plugin-builder of AIDotNet/NextCoWork.

  • SKILL.md
  • references/agent-tools.md
  • references/contribution-points.md
  • references/custom-editors.md
  • references/manifest-permissions.md
  • references/packaging.md
  • references/permission-map.md
  • references/runtime-api.md

Open the folder on GitHubat commit c253cae

Compare with similar skills

Plugin Builder 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.

Plugin Builder compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Plugin Builder this skillAIDotNet/NextCoWork638—~2.4kAutomated safety check: PassApache-2.0
AO Desktop App LauncherOrchestratorInc/agent-orchestrator13k—~2.4kAutomated safety check: PassApache-2.0
Debugging and Error Recoveryaddyosmani/agent-skills102k1 repos~2.6kAutomated safety check: PassMIT
EasyEDA Pro API Bridgeeasyeda/easyeda-api-skill855—~7.8kAutomated safety check: PassMIT
Qwen Code Memory Leak DebuggerQwenLM/qwen-code28k—~1.3kAutomated safety check: PassApache-2.0
Tsed CLItsedio/tsed3.1k—~2.7kAutomated safety check: PassMIT

Similar skills

  • AO Desktop App Launcher

    OrchestratorInc/agent-orchestrator

    Launches, restarts and troubleshoots the real AO Electron desktop app from a checkout, with isolated or real local data and checks for stale processes.

    13k GitHub stars~2.4k tokensUpdated today
    DevelopmentAuto-check passed
  • Debugging and Error Recovery

    addyosmani/agent-skills

    Applies a stop-the-line rule and a step-by-step triage when tests fail, builds break or something stops working, aiming at the root cause instead of guesses.

    102k GitHub starsUsed in 1 repo~2.6k tokens
    DevelopmentAuto-check passed
  • EasyEDA Pro API Bridge

    easyeda/easyeda-api-skill

    Gives an agent the EasyEDA Pro API reference and a WebSocket bridge to run code in a live EasyEDA client, for PCB, schematic and library work and extension development.

    855 GitHub stars~7.8k tokensUpdated 5 days ago
    DevelopmentAuto-check passed
  • Walks through capturing and comparing V8 heap snapshots to find memory leaks in the Qwen Code Node.js CLI, using tmux and the chrome-devtools CLI.

    28k GitHub stars~1.3k tokensUpdated today
    DevelopmentAuto-check passed
  • Tsed CLI

    tsedio/tsed

    Scaffolds Ts.ED v8 projects and generates files with the Ts.ED CLI v7, through its MCP server (tools set-workspace, init-project, list-templates, get-template, generate-file) or the tsed binary…

    3.1k GitHub stars~2.7k tokensUpdated 2 days ago
    DevelopmentAuto-check passed
  • Octocode Code Research

    bgauryy/octocode

    Researches code with evidence: traces callers, imports and cross-repo links, diagnoses failures and reports findings with exact file and line references and a confidence label.

    946 GitHub stars~1.5k tokensUpdated 4 days ago
    DevelopmentAuto-check passed

More from AIDotNet/NextCoWork

  • Skills Creator

    AIDotNet/NextCoWork

    Create, install, validate, update, and diagnose NextCoWork Skills.

    638 GitHub stars~2.3k tokensUpdated 5 days ago
    Auto-check passed

Works with

Categories

Questions about Plugin Builder

What does Plugin Builder do?

Author, package, and debug NextCoWork plugins — the single entry point. Plugin Builder is an agent skill from AIDotNet/NextCoWork. Author, package, and debug NextCoWork plugins — the single entry point.

When should I use Plugin Builder?

Plugin Builder fits situations like: scaffolding a plugin; choosing what to contribute; reviewing a manifest; debugging a permission.

How do I install Plugin Builder in Claude Code?

Run `npx skills add AIDotNet/NextCoWork --skill plugin-builder -a claude-code`. Or copy the skill folder (resources/skills/plugin-builder in AIDotNet/NextCoWork) into .claude/skills/plugin-builder in your project. Claude Code loads it when a task matches its description.

How do I install Plugin Builder in Codex?

Run `npx skills add AIDotNet/NextCoWork --skill plugin-builder -a codex`. Or copy the skill folder (resources/skills/plugin-builder in AIDotNet/NextCoWork) into .agents/skills/plugin-builder in your project. Codex loads it when a task matches its description.

Can I use Plugin Builder 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 AIDotNet/NextCoWork --skill plugin-builder -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/plugin-builder, .gemini/skills/plugin-builder, .github/skills/plugin-builder and .opencode/skills/plugin-builder in your project.

What does Plugin Builder need to run?

SKILL.md names no scripts, command-line tools or credentials: Plugin Builder is instructions for the agent only.

Does Plugin Builder access the network?

SKILL.md names 1 domain. In commands or code: bilibili.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Plugin Builder 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 Plugin Builder use?

Plugin Builder is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Plugin Builder use?

About 2.4k tokens (SKILL.md is roughly 9.6k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 14k tokens, read only when the agent opens those files.

What are the alternatives to Plugin Builder?

Skills that share tags, products or a category with Plugin Builder: AO Desktop App Launcher (OrchestratorInc/agent-orchestrator, 13k stars), Debugging and Error Recovery (addyosmani/agent-skills, 102k stars), EasyEDA Pro API Bridge (easyeda/easyeda-api-skill, 855 stars) and Qwen Code Memory Leak Debugger (QwenLM/qwen-code, 28k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Plugin Builder?

AIDotNet (a GitHub organization) maintains it in AIDotNet/NextCoWork, which has 638 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on October 2, 2026.

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