15 分钟完成第一个插件
生成一个命令 + 面板插件,作为开发目录连接,边改边热重载,在无应用环境测试并打包。
目标:一个带一条命令和一个面板的插件,在 GhostBoard 中运行、通过测试并打包。下面的时间节点假设你已安装 GhostBoard 与 Bun。
当前预览: npm 发布暂缓。现在请使用下面的源码仓库流程;后面的 registry 命令用于将来正式发布后。
git clone https://github.com/laogui/electrobun-starter-tanstack.git
cd electrobun-starter-tanstack
bun install
bun run plugin:create ../hello-plugin
cd ../hello-plugin
bun install
1. 生成项目(2 分钟)
bunx create-ghostboard-plugin hello-plugin
cd hello-plugin
bun install
bun install 只拉取 @ghostboard/sdk,它提供 TypeScript 声明、单文件 AI_REFERENCE.md、用于测试的 fake host 以及 ghostboard-plugin 打包器。这些都不会交付给最终用户。
你现在有:
hello-plugin/
├── manifest.json # id、version、engines.ghostboard、入口
├── app.js # definePlugin({ setup }),含一条命令和一个面板
├── ui.js # 可编辑的 Button/Input/Surface 助手,使用 --gb-* 主题变量
├── app.test.js # 基于 @ghostboard/sdk/testing 运行
├── AGENTS.md # 指引编码代理阅读 SDK 参考
└── package.json # bun test、bun run package
打开 manifest.json,把 id 改成唯一的点分形式,例如 yourname.hello。以 ghostboard. 开头的 ID 是保留的。
2. 在 GhostBoard 中运行(3 分钟)
- 打开 设置 → 插件 → 连接开发目录…,选择
hello-plugin/。 - 审阅目录身份并点击 连接目录,然后 为此工作区启用 并确认高信任说明。
- 打开插件菜单,运行 Open Hello panel。面板出现并显示你的工作区 ID。
连接只是登记目录;代码在你启用时才加载。
3. 边改边重载(3 分钟)
修改 app.js 里的面板文字:
import { definePlugin } from "@ghostboard/sdk";
export default definePlugin({
setup(app) {
app.commands.register({
id: "open-hello",
title: "Open Hello panel",
shortcut: "Mod+Shift+H",
run: () => app.panels.open("hello"),
});
app.panels.register({
id: "hello",
title: "Hello",
mount(element) {
const heading = document.createElement("h2");
heading.textContent = `Hello from ${app.pluginId} in ${app.workspaceId}`;
element.append(heading);
return () => heading.remove();
},
});
},
});
保存。已启用的插件自动重载:旧注册被清理,新注册被发布。如果新代码在 import 或 setup 中抛错,旧版本继续运行,插件菜单显示带文件与行号的错误。你注册的内容会在重载或停用时按逆序清理;在面板挂载元素之外创建的 DOM 不会。
4. 无需 GhostBoard 的测试(2 分钟)
bun test
app.test.js 创建一个 fake host,运行 setup,检查已注册的命令与面板 ID,并触发命令。fake host 不复现布局、持久化、原生对话框或平台行为;它只用于逻辑。
5. 打包(2 分钟)
bun run package
它会写出 dist/<id>-<version>.ghostboard-plugin,只包含 manifest.json、app.js 与 ui.js——即 package 脚本里列出的 --include 文件。归档是确定性的(相同输入得到相同 hash),并且从不执行你的代码。通过 设置 → 插件 → 选择插件包… 安装它,体验最终用户流程。