---
name: plugin-creator
description: 创建、修改并验证可安装的 Lexora 桌面插件，包括工作台装饰、导航与面板、文件阅读工具、控件样式、网络查询、通知和定时命令。也响应 $plugin-creator。普通任务执行、使用现有插件、其他产品的插件开发不属于此技能。
---

# 创建 Lexora 插件

将用户的需求变成可安装、可修改的真实插件。完成最小可用版本，再依据编译诊断与用户的实际体验迭代。不要用占位 demo 代替需求。

## 理解需求

先利用当前对话确定输入、触发时机、呈现位置与生效范围、需要保留的数据和停止方式。描述充分时直接实施；只询问会改变实现的缺失信息。短需求选择轻量默认值并说明，不要求用户先填技术问卷。没有设置需求时优先复用插件管理中的启用、禁用，不额外增加导航和配置页面。

分别确定事件来自哪里、内容画在哪里、何时可见。事件来自某个控件，不意味着内容只能画在该控件内；保留用户指定的窗口、分屏或局部区域，不擅自缩小范围。未指定的视觉细节可以选择默认值；指定范围缺少正式能力时明确说明，不能用相近位置代替交付。

用户提供外部参考时先阅读公开说明或代码，提取需要复现的用户行为，再映射到 Lexora 的正式能力。参考项目的内部接口不能直接移植；读取失败时说明缺少的依据，不把推测写成已经核对的实现。

用户给出的作者署名或调用名不符合规则时，说明具体原因并给出 1–3 个保留原意的可用候选，通过对话请用户确定后继续。不要静默截断、转拼音、替换为系统账号或生成陌生名称；中文作者署名本身合法，无需改成英文。尚未指定调用名时可以按插件功能提出简短名称。

## 按需求组合能力

读取 [能力选择与组合](references/capabilities.md)，将需求对应到输入来源、呈现方式、运行入口与状态归属，再确定最小清单。一个插件可以组合多种正式扩展点，也可以只提供命令或一个文件视图；现有示例不是插件类别或必须复制的模板。

查询宿主扩展能力时，通过 `lexora_tool_search` 查找 `lexora_plugin_capabilities`。先无参数查询当前宿主的简短目录，再按 `kind` 或 `target` 获取所需能力的契约；不要把完整目录提前塞进提示词。内容区的共同规则见 [内容插槽](references/slots.md)。没有匹配位置时说明能力缺口，不借助 CSS 选择器或相近区域模拟替换。

先说明所选组合能完成的用户行为，再创作。文件阅读工具需要按文件打开的独立视图和各自的阅读状态；常驻信息条可能需要底部挂载、宿主查询命令与私有设置。不要因为都“有界面”就统一做导航页，也不要为了演示全部 API 给插件添加无关权限。

## 阅读协议并创作

继续旧对话创作时，重新读取当前技能与协议。历史消息、旧工具结果和压缩摘要中的命名示例不作为新插件的身份依据；维护已有插件时读取实际源码清单，并保留其中的 ID。

1. 读取 [协议与清单](references/protocol.md) 和 [完整 API 类型](references/api.d.ts)。这些文件与当前 Lexora 一起分发；不要根据其他产品的插件格式猜测接口。
   需要实时配置、表单依赖或运行状态判断时，读取 [条件函数](references/conditions.md)，声明数据输入与作用域，不将函数序列化进清单。需要 Agent 指令、后台任务动作、模型调用、任务标题或原生设置时，追加读取 [Agent 与设置](references/agent-settings.md)，并确认当前宿主能力目录支持。事件驱动动作与订阅按 [事件与触发列表](references/events.md) 选择精确入口和载荷，不把普通事件监听器当作任务能力调用。
2. 在当前可写工作区创建独立源码目录，例如 `plugins/<插件名>/`。通过文件工具写入真实文件，保留源码以便后续对话修改。不需要用户另外安装 Node、Bun 或 SDK。
3. 新建独立插件时通过 `lexora_tool_search` 查找 `lexora_plugin_identity`，传入按功能选定的简短英文 `slug`，将返回的 `id`、`author` 和 `engines` 写入 `extension.json`。作者未指定时省略参数，使用已保存的默认署名；明确不署名时传空字符串。作者名支持中文，不要求用户提供英文名、平台账号或唯一名称，也不从系统用户名、Git 配置或目录推断署名。不要自行编造 ID 或继续生成 `local.*`。修改、升级、换电脑维护及分发沿用源码内已有 ID，不重新调用身份生成工具；包括已有的 `local.*`。只有创建独立副本时生成新 ID 并同步内部引用。
4. 按选定组合声明视图、命令、导航和挂载点，明确每项能力由宿主入口还是视图入口调用；限定页面时使用公开上下文和声明条件。仅声明实际需要的权限；没有对应能力时解释限制，不绕过隔离访问宿主 DOM、内部接口或文件。明确用户第一次如何启动、关闭后如何再次打开；普通挂载需要显式打开；内容插槽和替换控件的启用、回退与配置归属按 [内容插槽](references/slots.md) 实现。现有入口足够时不额外增加设置页。
5. 使用自包含 TS/JS 和包内资源。复制 `references/api.d.ts` 为源码目录的 `lexora.d.ts`，仅通过 `import type` 引用。源码清单设置 `format: "source"`。视图导出 `render(context, container)`，需要命令、存储或调度时再添加宿主入口 `activate(context)`。
6. 事件、定时器、动画在关闭时清理，动画结束回收节点、空闲时停止循环。页面使用主题变量；窗口效果保持透明、不阻挡输入，并尊重减少动态效果偏好。

修改作者署名时直接更新清单 `author`，保留已有 `id` 和所有贡献引用，无需调用身份生成工具。ID 的前缀不会自动成为署名；用户说“用户名”或“发布者”且含义不明确时，先区分作者署名与更换插件身份。用户明确要求更换 ID 时，先说明它会被当作另一份插件，既有数据不会自动转移。

## 编译与修正

通过 `lexora_tool_search` 查找 `lexora_plugin_build`，然后调用它：

如果当前明确是在独立 Lexora Plugin SDK 仓库中开发、没有 Lexora 内置工具，使用 [SDK 工作流](references/sdk-workflow.md)。普通 Lexora 对话不需要这条分支。

```json
{ "source": "plugins/my-plugin", "output": "my-plugin-1.0.0.lexora-extension", "review": true }
```

`output` 是已存在父目录中的新文件，放在源码目录之外；现有文件不会被覆盖。工具使用内置隔离编译器，不执行 npm 安装脚本或插件代码。错误结果包含 `code` 与有限的 `diagnostics`：修正对应问题后重新构建，避免重复提交相同错误。需要重新生成包时使用新的输出文件名。

`review: true` 请求显示安装确认，用户确认后才会安装。只要求源码或打包时设为 `false`。不要绕过确认或通过内部配置安装。交付前核对构建结果中的 `id`、`name`、`author` 和 `version`。`author` 为空表示安装界面会显示未署名；用户要求署名时，修正清单并重新构建，不能把 ID 前缀当作署名已经生效。构建结果中的 `installation` 只表示是否发起审核，不代表当前安装状态；旧版本返回的 `installed: false` 也不能用于断言用户尚未安装。

需要判断安装、待应用更新或加载失败时，通过 `lexora_tool_search` 查找 `lexora_plugin_inspect`，以插件 `id` 读取当前宿主状态。比较当前版本与 `pendingVersion`，检查可见命令、导航入口、视图 ready 和错误。仍待用户审核时交付结果即可，不循环轮询；工具不可用时明确安装状态未核实。ready 只证明入口完成加载，不能代替实际功能验收。

通过 `lexora_output_present` 交付源码目录与安装包。不要只在回答中粘贴代码，也不要下载 SDK 或建立另一套构建工程。

## 验证与迭代

按所选能力检查主要动作，以及真正影响它的边界：文件视图验证两份资源的状态互不覆盖；组合面板验证导航切换和设置刷新；控件验证宿主允许值、失败回退与明确重试；后台命令验证关闭页面后仍按约定运行。再验证禁用后的停止行为，避免机械套用某个示例的测试步骤。

有持久设置时，检查修改后的实际行为、离开页面再返回及重启后的恢复；开关需要验证关闭与重新开启，不能只确认表单显示成功提示。

编译通过只证明包可构建，不证明界面和运行效果通过。Lexora 的浏览器工具只能控制资源浏览器，不能操作插件安装弹窗或窗口效果；不要为此创建另一个 HTML 模拟宿主来代替安装验收。有能操作真实插件界面的工具时执行检查；否则交付编译后的包和待验证项，让用户安装后反馈，不在等待安装期间反复调用无关工具。不要编造截图、通知送达、运行成功或性能数据。

交付简短说明：完成了什么、源码与包的位置、如何触发、已检查和仍待体验的行为。用户反馈后读取现有源码，修正实现、重新编译并再次验证相同场景。保持 ID 与数据含义稳定。发布市场或同步远端单独遵循用户指示。
