Plugin docs

和 VS Code 插件系统的对比

The plugin docs are written in Chinese for now. Your browser's translate button works well on them; code, names and the API are the same in any language.

浮屿的插件系统参考了 VS Code 的扩展:清单里的 contributes、激活事件、按需启动、事件订阅、globalState / secrets 式的存储,都能在 VS Code 里找到对应的东西。本文说明两边哪里一样、哪里不一样,以及为什么。浮屿一侧是现在的插件 API 第 2 版;VS Code 一侧依据它的扩展 API:扩展跑在独立的 Extension Host 进程里,通过 package.json 的 contributes 声明能力,用 vscode 模块调用编辑器。

两边相同的是:插件不跑在画界面的那个进程里,所以一个插件卡死或崩溃,不至于直接拖垮主界面;能力都在清单的 contributes 里声明。其余差别很大。VS Code 是一个可编程的编辑器平台;岛屿是一条较窄的协议,界面大多由岛屿按模板绘制。

对照

浮屿 VS Code
插件是什么 岛屿启动的一个子进程。.exe、.ps1,或本机已安装的 Node 运行的 .js / .mjs / .cjs。不支持 .cmd / .bat 加载进 Extension Host 的 JavaScript。扩展可以再拉起自己的进程,但扩展入口本身是 JS
进程 一个插件一个进程。不写 activationEvents 时随岛屿一直运行;写了就按需启动(打开页面、执行命令、事件等),空闲 60 秒后停下 本机扩展共用一个 Node 进程(另外还有 Web、远程等 Extension Host)。按激活事件懒加载,例如打开某种语言、执行某个命令
协议 一行一条 JSON-RPC 2.0,UTF-8,单条不超过 1 MB。不限定语言 扩展直接调用 vscode API,跑在 Extension Host 里
能改界面吗 只能在岛屿留出的位置上加东西:岛上页面(最多 2 个,list / detail / form / status 模板由岛屿绘制,webview 模板显示插件自己的网页)、收起条状态项(最多 2 个)、待办右键菜单、全局快捷键、岛上提示。不能改岛的布局、CSS 或其他页面 可以。命令、菜单、侧栏、树视图、Webview、自定义编辑器、主题、快捷键、调试器、语言服务等
设置页 清单里声明,最多 20 项(开关、整数、文本、下拉),由岛屿绘制。另外最多 8 个命令按钮、最多 10 条运行信息 contributes.configuration 进设置编辑器;也可以用 Webview 做任意设置界面
能读写的应用数据 只有授予的权限:待办、每日笔记、AI Agent 状态、岛上提示、凭据(插件自己的)、媒体信息与播放控制,以及敏感的剪贴板历史、消息和文件架。邮箱授权码、翻译密钥等岛屿保存的凭据没有接口 vscode API 很宽:工作区文件、终端、源代码管理、调试、任务、认证等
操作系统权限 不沙箱。插件以当前用户身份运行,能读写文件、能联网。权限表只限制它能调用哪些岛屿接口 同样不沙箱,扩展以当前用户身份运行。Workspace Trust 在不信任的文件夹里限制一部分 API
默认是否运行第三方 关闭。用户打开“允许运行第三方插件”后才运行。内置插件不受这个开关限制 没有等价的总开关。装上即可能按激活事件运行;不信任的工作区会进入受限模式
敏感数据 敏感权限在第一次实际使用时再问一次(允许 / 本次 / 拒绝);可选权限用到时才申请 没有按 API 逐项询问
升级时的权限 新版本要更多权限时,插件暂停,等用户重新授权 市场扩展更新后继续运行,没有按“新增 API 权限”暂停这一步
分发 市场列表是 TixXin/fuyu-plugins 里签过名的 index.json,插件包放在作者自己仓库的 GitHub Release,安装时核对 SHA-256,可选作者签名。上架要维护者人工审核源码 官方市场、发布者账号、VSIX。也可以不经市场,本地安装 VSIX
只在自己电脑上试 把插件文件夹放进插件目录,在“插件扩展”里重新加载,不需要签名;也可以用 fuyu-plugin dev 开发模式,改文件后自动重启 用扩展开发宿主(Extension Development Host)调试,或本地安装 VSIX

运行方式

岛屿给每个启用的插件起一个进程,停用、重新加载或岛屿退出时关掉它的 stdin,插件必须随之退出。崩溃后按 1 秒、5 秒、30 秒退避重启,再失败就停住。这样单个插件的故障留在它自己的进程里。

VS Code 把多个扩展放进同一个 Extension Host。好处是启动快、扩展之间可以共用运行时;坏处是一个扩展死循环或把宿主搞崩,会连累同一个宿主里的其他扩展。工作台界面在另一个进程里,所以编辑器窗口通常还在,并可以重启 Extension Host。

岛屿不限定语言,只要程序会按行收发 JSON。VS Code 的扩展入口必须是 JavaScript(可以用它去调用别的语言写的程序)。

能改软件的哪些地方

这是两者最大的差别。

VS Code 的 contributes 是一张很长的清单:命令、菜单、视图容器、快捷键、语言和语法、主题、代码片段、调试器、任务、自定义编辑器、笔记本等等。Webview 还可以在工作台里嵌一整块 HTML。一个扩展可以长成产品的一块,比如 Git 界面、远程开发、某个语言的整个工具链。

岛屿的插件能做的事:

  • 按权限调用宿主方法、订阅事件(待办、笔记、Agent 状态、剪贴板、消息、媒体、文件架等,完整列表见 权限与安全)。
  • 在清单里声明命令、快捷键、待办右键菜单和设置项,由岛屿画出来。
  • 声明岛上页面和收起条状态项:模板页面只发数据,由岛屿绘制,和其他页面风格一致;webview 页面是插件自己的 HTML,跑在单独的 WebView2 里,只能和自己的插件进程通信。
  • 在岛上弹提示,用 storage / secrets 保存自己的数据。

改岛的布局和外观、替换内置页面、读邮件正文或岛屿保存的凭据,现在做不到。

权限

两边都不做操作系统级沙箱。装进电脑的程序就是当前用户的程序,权限表拦不住它自己去读磁盘或访问网络。

差别在于应用自己的 API 有多宽,以及用户要不要先点一次头:

  • 岛屿的权限是白名单,而且默认不跑第三方插件。启用时授予清单里的全部权限;敏感权限第一次使用时再问;以后的版本若多要权限,先停再问。
  • VS Code 把信任放在“要不要安装这个扩展”和“这个文件夹信不信任”上。装好之后,扩展能用的 API 远多于岛屿开放的那些。

分发

VS Code 有官方市场:注册发布者、打包成 VSIX、上传、签名校验、更新通道。扩展也可以脱离市场,把 VSIX 装到一台机器上。

岛屿的市场是一个 GitHub 仓库:作者把插件包发到自己仓库的 Release,向 fuyu-plugins 提交一份描述;CI 校验后重建索引并用 Ed25519 签名,zip 用 SHA-256 核对,作者可以另外签名。没有索引私钥就改不了市场列表。自己试用不必走市场,把文件夹放进 %APPDATA%\com.tixxin.fuyu\plugins\<id>\ 即可。步骤见 发布。

取舍

岛屿换来的是:任意语言都能写、坏一个不影响岛、界面风格不会被插件拆掉、第三方默认关闭、敏感数据逐项询问。换出去的是 VS Code 那种“扩展可以长出一整块产品”的能力。更深的定制(改岛的布局、替换内置页面)和进程沙箱都不在现在的计划里。

从 VS Code 扩展过来

熟悉 VS Code 扩展的话,可以按这张表找对应的东西:

VS Code 浮屿
package.json 的 contributes fuyu-plugin.json 的 contributes,见 清单
activationEvents activationEvents,见 按需启动
vscode.commands.registerCommand + keybindings contributes.commands 的 keybinding / when,插件收到 command 通知
menus contributes.menus(待办、剪贴板、文件中转、消息的右键菜单)
contributes.configuration contributes.settings,由岛屿画在插件设置页上
TreeView / WebviewView 岛上页面:list 等模板 / webview 模板,见 岛上界面
StatusBarItem 收起条状态项 status.update
window.showInformationMessage island.notify
ExtensionContext.globalState / secrets storage.* / secrets.*
vscode.window.registerUriHandler onUri 和 fuyu://plugin/<id>/… 链接
Extension Development Host npx fuyu-plugin dev 和岛屿的开发模式;不开岛屿时用模拟宿主
Edit this page on GitHub