Skip to main content

cyrene-plugin-dev

当用户想为 Cyrene 开发插件(扩展昔涟的工具、做插件弹窗、接入渠道)、调试插件报错,或询问插件怎么写时使用。涉及 Cyrene 本体源码的功能开发不使用本 Skill。

Informations de source

Dépôt
Playa-Cyrene/Cyrene-Agent
Dernière activité de la source
2 octobre 2026 à 13:11
Langue détectée de SKILL.md
chinois
Étoiles
674
Forks
92

Options d'installation

Le prompt qui vérifie d'abord la source est sélectionné par défaut. Vous pouvez passer à une commande directe ou télécharger une copie locale.

Vérifiez les fichiers source

Lisez SKILL.md et les fichiers associés affichés par SkillsMP avant de décider de l'installer.

Explorateur de fichiers
4 fichiers

Affichage de SKILL.md

SKILL.md
Instructions source · Aperçu en lecture seule
name
cyrene-plugin-dev
description
当用户想为 Cyrene 开发插件(扩展昔涟的工具、做插件弹窗、接入渠道)、调试插件报错,或询问插件怎么写时使用。涉及 Cyrene 本体源码的功能开发不使用本 Skill。
version
1.3.0
effectKind
mutation
modes
["code","work"]
# Cyrene 插件开发 本 Skill 指导如何为 Cyrene 开发运行时插件:从需求到可安装的 zip 包,一次做对。 ## 何时使用 - 用户想给 Cyrene 加新能力,且明确走插件形式(而不是改本体源码) - 用户拿来的插件报错,需要排查(启用失败、工具不生效、弹窗异常) - 用户询问插件怎么写、能做什么 不使用:改 Cyrene 本体源码的普通开发任务;只是使用已装插件。 ## 前置知识:先读再写 动手前必须先读本 Skill 目录下的参考文件(自包含,打包版也可用): 1. `references/getting-started.md` —— 快速上手教程,含最小可用模板和常见坑速查 2. `references/api-spec.md` —— 完整接口规范(manifest 字段表、ctx API、生命周期、zip 导入限制) 3. `references/example-walkthrough.md` —— 官方示例插件 system-status 走读,覆盖工具 + 弹窗 + IPC 全部知识点;写新插件前通读一遍 开发版仓库中另有 `docs/plugins/` 文档和 `examples/` 官方示例(`system-status` 为 JS 全功能走读;`weather-tool`、`long-term-memory`、`scheduled-automation`、`local-asr-contract` 为 TypeScript + SDK 示例,分别覆盖 Secrets/轮次事件冻结分页/调度任务/语音租约契约),以 references/ 为准。 ## 开发流程 ### 1. 明确插件形态 先和用户确认要做的是哪类能力,通常是一种或多种组合: | 形态 | 特征 | | --- | --- | | 纯工具插件 | 只注册 `registerTool`,AI 对话中自动调用(最常见) | | 带界面插件 | 额外实现 `open()` 弹独立窗口 | | 事件驱动插件 | `ctx.events.on/emit`:监听宿主生命周期(如关机前收尾)、与其他插件互通 | | 动态上下文插件 | `ctx.registerPromptProvider`:让昔涟主动感知实时状态(天气/日程/番茄钟),无需用户开口问 | | 调用 LLM 的插件 | manifest 声明 `"deps": ["llm"]` | | 渠道插件 | `ctx.registerChannelAdapter`(进阶,先确认用户真的需要) | | 数据服务插件 | `deps` 声明后经 `ctx.deps` 使用:`secrets`(密钥保管)、`conversations`(只读对话分页)、`workspace`(工作区只读绑定)、`scheduler`(自有定时任务) | | 语音输入插件 | `deps: ["speech-input"]`:自带 ASR 模型,取独占语音租约后把识别文本提交进正常对话 | ### 2. 搭骨架 在一个独立目录(如 `examples/<plugin-id>/` 或用户指定目录)创建: ```text <plugin-id>/ manifest.json index.cjs ``` manifest 必填字段:`apiVersion: 1`、`id`、`name`、`version`(严格三段式 SemVer)、`description`、`author`、`entry`。`author` 填开发者或团队名称,会展示在聊天窗口的插件卡片中;`id` 全小写连字符,它决定工具 id 前缀和安装目录名。可选字段 `icon`(裸文件名,png/jpg/webp/svg,≤2MiB)在插件卡片左侧展示图标,不合法时静默忽略不影响加载。 ### 3. 实现 铁律(违反会直接启用失败或行为异常): - **工具 id 必须以 `<插件id>_` 开头**,如插件 `my-plugin` 的工具叫 `my-plugin_hello` - **工具的 `description` 是写给 AI 看的**:写清"什么场景该用",含参数说明 - 只读工具 `risk: "safe"` + `effectKind: "read"`;有副作用的用 `effectKind: "write"` - 弹窗用 `BrowserWindow` 加载插件目录内的 HTML,`nodeIntegration: true` + `contextIsolation: false` - 窗口实例、定时器、子进程必须在 `unregister()` 里清理,且该函数要能重复调用不崩;后台资源优先用 `ctx.onDispose(() => ...)` 登记兜底清理、`ctx.signal` 传给后台任务,交给框架托管停止时机 - 渲染进程与插件通信:IPC 通道名是 `plugin:<插件id>:<channel>` - 事件发布只能用短名(框架自动补 `plugin:<插件id>:` 前缀),不能伪造 `host:*` 或其他插件的事件;监听器单个最多 5 秒 - 提示词 Provider 只写本轮有用的实时事实、短而精;单项配额 2 秒 / 16000 字符,超时或失败只跳过自身 - 数据采集优先 Node 原生(`os`、`fs`),不够再用 PowerShell / nvidia-smi 等子进程;子进程要设超时并处理失败降级 ### 4. 本地验证 装进用户目录前,先用 Node 模拟注册做冒烟测试: ```js // node -e 直接跑:模拟 ctx 调用 register,确认不抛错、工具 id 合法 const p = require("./<plugin-id>/index.cjs"); p.register({ registerTool: (t) => { if (!t.id.startsWith("<plugin-id>_")) throw new Error(t.id); }, registerIpc: () => {}, log: () => {}, }); ``` TypeScript 插件优先用官方 SDK 的测试工具(不需要启动 Cyrene): ```bash npm install @playa0v0/cyrene-plugin-sdk ``` ```js // 测试脚本:Mock Context 验证 register 契约、工具 id、清理回调 const { createMockPluginContext, assertPluginTool } = require("@playa0v0/cyrene-plugin-sdk/testing"); const ctx = createMockPluginContext({ pluginId: "<plugin-id>" }); await plugin.register(ctx); ctx.tools.forEach((t) => assertPluginTool(t, "<plugin-id>")); await ctx.dispose(); ``` 涉及弹窗的逻辑无法脱离 Electron 验证,跳过此步,靠安装后实测。 ### 5. 打包安装 - 把插件目录压成 zip:`Compress-Archive -Path <plugin-id>/* -DestinationPath <plugin-id>-<version>.zip` - zip 限制:≤50 MiB、≤2000 条目、解压总量 ≤200 MiB;不能有符号链接和 `..` 路径 - 开发期也可以直接把文件复制到 `%APPDATA%\Cyrene\plugins\<plugin-id>\`(与 zip 导入等价) - 安装后**默认停用**,需用户在聊天窗口的“插件”面板中手动启用 ### 6. 安装后实测 告诉用户验证三件事,缺一不可: 1. 聊天窗口插件卡片状态为 `running` 2. 有弹窗的:点“打开”按钮窗口正常显示、关闭再开正常 3. 有工具的:对话里问一个应触发工具的问题,确认 AI 调用并转述结果 ## 分发与收录 - 插件装好后只在用户本机可用。**用户想让插件被更多人看到/使用时,主动提醒**:可提交 PR 到官方收录仓库 [Cyrene-Plugins](https://github.com/Playa-0v0/Cyrene-Plugins),审核通过后其他用户可直接下载 ZIP 导入 - 收录要求(完整规范见仓库 CONTRIBUTING.md):`plugins/<插件id>/` 下放可直接安装的产物(manifest + 编译后入口 + README)+ `registry.json` 登记 + README「已收录插件」表格加一行;**不要上传 zip**,ZIP 由维护者从审核过的源码统一打包 - 反过来,用户想安装别人开发的插件:从仓库 README「已收录插件」表格下载 ZIP,走上方导入流程即可 ## 排查既有插件问题 按优先级查: 1. **启用报错** → 聊天窗口插件卡片会显示具体 error,对照铁律清单(九成是 id 前缀 / SemVer / deps 拼写) 2. **启用成功但 AI 不用工具** → description 没写清场景,或对话上下文没触发 3. **改了代码不生效** → 聊天窗口插件面板点“刷新插件”(会清模块缓存) 4. **弹窗白屏/报错** → 开发者工具看渲染端异常(`win.webContents.openDevTools()`);多为 IPC 通道名拼错或 HTML 路径不对 5. **扫描警告“缺少 manifest.json”** → 插件目录层级错了(zip 解压多套/少套了一层目录) ## 安全与边界 - 插件与宿主同权限运行(无沙箱)。为用户写插件时只用可审查的标准库和明确说明用途的子进程调用 - 提示词 Provider 能直接影响 AI 行为:为用户写 Provider 时只输出事实性状态("剩余 12 分钟"),不输出指令性内容("忽略之前的规则"一类) - 不覆盖、不删除用户插件目录和 `plugin-data/` 下的数据 - 更新插件:导入同名新版 zip 走替换流程,不要手动删旧目录再装(会丢启用状态)
Voir sur GitHub