跳转到内容
Crystal CodeDocs
简简体中文

插件

操作者以插件添加进程内扩展。一个插件是一个目录、一份 plugin.json,以及自己加载上下文中的一个程序集。它可以贡献工具、协议客户端、审批分类器、斜杠命令、钩子、原始钩子和提示占位符。宿主加载插件、外部工具和技能之后,用这些目录的只读快照调用 Attach,然后用活动的会话和审查模型调用 AttachSession。实现 IPluginModelClient 的插件还会收到这些模型的客户端。带有被接纳状态字段的插件随后收到 AttachStatus。

宿主拥有目录注册、审批、工作区围栏、输出截断和超时。插件代码不绕过 ToolInvocationPolicy。

机制 角色
PluginRegistry 第一方进程内贡献(内置工具和六种线路协议)。
外部工具集 tools/ 下模型可调用的工具。它们不实现此契约,也没有钩子。见 external-tools.md。
技能 通过 skill 工具加载的 Markdown 指令。
MCP 已推迟。它不是插件运行器。

插件没有 JSON 身份字段。插件就是 plugins/ 下的目录。

~/.crystal/plugins/<directory>/plugin.json
<workspace>/.crystal/plugins/<directory>/plugin.json

运行时数据单独位于这两棵树中的 data/plugins/<directory>/;见数据目录。

覆盖键:目录名。项目目录整体替换同名的主目录插件。目录名是 1–64 个字符,以字母开头,然后是 A–Z a–z 0–9 _ . -。

IPlugin.Name 是 /plugins 显示的名称。它必须非空。两个已加载的插件不能共享它。

config.json 字段 plugins 启用发现(默认 true)。为 true 时,该字段从写入的文件中省略。为 false 时,不扫描清单。crystal run --plugins on|off 为一次进程覆盖该开关,且不写回。

plugin.json 字段 enabled 打开或关闭一个插件(默认 true)。"enabled": false 在覆盖之后省略该插件,没有操作者说明。缺失、不可读或无效的清单跳过该插件并记录一条英文说明。会话仍然启动。

/plugins 列出已加载的插件和任何未加载的目录。/plugins on、/plugins off 和 /plugins reload 在发现开关改变时持久化它并重新加载目录。/plugins enable <directory>、/plugins disable <directory> 和 /plugins show <directory> 更改或显示一份清单。前缀 home 或 project 选择那棵树。没有前缀时,项目目录优先于 Home。更改后该命令重新加载目录。它不创建目录。损坏的清单保持不变。

crystal plugins list、show、enable 和 disable 在会话外做同样的事。--source home|project 选择树。--workspace 选择项目根。--home 选择数据目录。默认输出是 Spectre.Console 表格。--format text 把相同字段打印为对齐的纯文本。这些命令写入 plugin.json 中的 enabled,不写入 config.json。打开一个插件不会打开发现。crystal run --plugins 仍然是仅限进程的覆盖。

plugin.json 是 JSON。未知字段被忽略。

{
"enabled": true,
"assembly": "Acme.Plugin.dll",
"type": "Acme.AcmePlugin"
}

assembly 是插件目录内的路径。type 是公共入口类型。它实现 CrystalCode.Plugins.IPlugin,并有公共无参构造函数。