外部工具
额外的目录工具以工具集添加:一个目录、一份 tools.json、一个运行器。
~/.crystal/tools/<directory>/tools.json<workspace>/.crystal/tools/<directory>/tools.json同名的项目目录整体替换主目录集合。tools.json 中 "enabled": false 让目录留在原地且不加载(默认 true)。config.json 中 "externalTools": false 跳过发现。为 true 时,该字段从写入的文件中省略,与 skills 相同。
集合身份是目录名:1–64 个字符,以字母开头,然后是字母、数字、_、. 或 -。没有 JSON name 或 id。面向模型的名称是 tools[].name(exec)或 ITool.Definition.Name(dotnet)。内置名称优先。默认 catalogs 是 Plan 和 Work。"catalogs": ["work"] 仅 Work。
| 运行器 | 行为 |
|---|---|
| exec | ProcessStartInfo.ArgumentList。没有 shell 模板。Stdin 是围栏内的参数对象(默认打开)。argv 映射把标量属性变成标志。工作目录是工作区根。 |
| dotnet | 实现 Crystal.Tools.ITool 或 Crystal.Multimodal.Tools.IMultimodalTool 的框架依赖类库。该集合的公共非抽象工具在一个隔离上下文中加载。 |
每个 exec 子进程收到 CRYSTAL_WORKSPACE、CRYSTAL_SESSION、CRYSTAL_APPROVAL、CRYSTAL_TOOL_DATA(全局数据目录)和 CRYSTAL_PROJECT_DATA(项目数据目录)。"output": "content" 使 stdout 成为带 text 和可选 images(base64 或工作区 path)的 JSON。仅文本的回合拒绝图像结果。支持图像的回合通过与其他工具相同的标记路径附加它们。
实现 CrystalCode.Tools.IHostTool 或 IHostMultimodalTool 的 dotnet 工具在每次调用时收到 ToolHostContext:工作区根、会话 id、审批模式,以及该集合的全局和项目数据目录。不实现这些接口的工具不变。共享类型是 Crystal、Crystal.Tools 和 CrystalCode.Tools。其他依赖对该集合保持私有。
每个外部工具默认至少是 Write + Workspace,并且仍然经过 ToolInvocationPolicy。作者可以把 approval 设为 always。Home 工具默认遵循该声明。Project 工具使用宿主策略,除非另行配置。
写入路径嵌在参数里时,dotnet 工具可以实现 IHostToolApprovalClassifier。宿主把该结果与自己的分类合并。结果只能提高风险或权限。失败会失败关闭。分类有单独的两秒预算,并且可以取消。超时或被取消的分类器在工具重新加载前保持禁用。宿主编写摘要,不采用工具的措辞。
| 命令 | 效果 |
|---|---|
/tools |
列出有效目录和审批,并标记自带分类器的工具 |
/tools home|project author|host |
更改来源信任 |
/tools on|off|reload |
控制发现 |
/tools enable|disable|show <directory> |
更改一个工具集 |
crystal tools list|show|enable|disable |
会话外做同样的事。除非 --format text,否则打印 Spectre.Console 表格 |
Full 自动放行限制在工作区内的外部写入。Edit 不会。清单字段和 dotnet 发布布局见外部工具。