1. 先给结论
/plugins 第一版做成 TUI 里的插件管理页:看已安装插件、看能力清单、看错误、启用/禁用、卸载、从本地路径安装。
插件本身先是一个目录包,里面可以带 plugin.json、SKILL.md、工具脚本和可选 MCP 配置。
沿用 old kimi-cli 的 plugin.json 思路,并和当前 Kimi Code 的 Skills / MCP / tool 执行体系对接。
Claude 和 Codex 的 marketplace、分享、自动升级很完整,但会明显扩大实现和安全面,适合第二阶段以后。
插件工具不能绕开权限确认,远程安装必须显式触发,manifest 路径必须限制在插件目录内。
一句话拆解
现在的 Kimi Code 已经有“能力被发现、展示、执行”的基础。缺的是一个稳定的插件包格式、安装位置、管理界面,以及把插件声明的能力接入
Session 的 RPC。做 /plugins 时,不应该让 TUI 直接读 agent-core,而是走
packages/node-sdk 暴露出的会话 API。
第一期成功标准
- 用户输入
/plugins后,可以看到插件列表、插件来源、启用状态、能力摘要和加载错误。 - 用户可以从本地目录安装一个插件,也可以禁用、启用、卸载已安装插件。
- 插件里的 skill 可以出现在现有的 skill 列表和 slash 补全里。
- 插件声明的工具如果被模型调用,走现有权限/确认机制,不能静默执行。
- 旧 kimi-cli 的
~/.kimi/plugins至少有清楚的迁移提示,最好能做验证后迁移。
2. 当前仓库是什么
/Users/moonshot/code/kimi-code 是一个 TypeScript monorepo。核心产品是终端里的 Kimi Code CLI/TUI,
底层由 SDK 和 agent-core 提供会话、skills、tools、MCP、权限、后台任务等能力。
| 路径 | 作用 | 和 /plugins 的关系 |
|---|---|---|
apps/kimi-code |
CLI / TUI 应用,用户直接交互的地方。 | 新增 /plugins slash 命令、插件管理 UI、安装/卸载操作入口。 |
packages/node-sdk |
公开 TypeScript SDK 和 TUI 使用的 harness/session 包装。 | TUI 不直接依赖 agent-core,插件列表和操作应该通过这里暴露。 |
packages/agent-core |
Agent、Session、skills、tools、MCP、权限、records 等核心能力。 | 插件扫描、manifest 解析、工具注册、skill roots 扩展应主要落在这里。 |
packages/migration-legacy |
旧 kimi-cli 迁移探测和迁移材料。 | 已经检测旧 ~/.kimi/plugins,当前显示为“not yet supported”。 |
docs/en/customization |
Skills、MCP 等用户文档。 | 插件上线后需要新增或更新用户文档,说明插件和 skill/MCP 的区别。 |
apps/kimi-code 的仓库级规则要求它通过 @moonshot-ai/kimi-code-sdk 消费核心能力,不直接依赖
@moonshot-ai/agent-core。所以 /plugins 的 UI 可以在 app 里,但真正的插件扫描和执行不能只写在 TUI 里。
3. 当前已有可复用能力
Slash 命令
apps/kimi-code/src/tui/commands/registry.ts 存内置命令列表;
resolve.ts 先解析内置命令,再解析 skill 命令;未知 slash 会被当普通消息发送。
对 /plugins:新增 plugins 内置命令,再在 KimiTUI 的命令分发里打开管理界面。
Skills
packages/agent-core/src/skill/scanner.ts 负责扫描 .kimi-code/skills、
.agents/skills、显式目录和 built-in 目录。
对 /plugins:插件目录可以作为额外 skill root,让插件内的 SKILL.md 自动进入 slash 补全和模型可见列表。
MCP
当前已有 /mcp 状态面板和 /mcp-config 内置 skill,用户文档说明 MCP 配置来自用户和项目目录。
对 /plugins:插件可以后续声明 MCP server,但第一期可以只展示,不急着自动合并执行。
SDK RPC
packages/node-sdk/src/session.ts 已经有 listSkills()、activateSkill() 这类会话 API。
对 /plugins:新增 listPlugins()、installPlugin()、setPluginEnabled()、removePlugin() 比较自然。
旧迁移探测
packages/migration-legacy/src/detect.ts 和 paths.ts 已经会找旧
~/.kimi/plugins。
对 /plugins:这里是兼容 old kimi-cli 插件的入口,不需要从零设计迁移发现。
现有 TUI 面板
tasks-browser.ts、help-panel.ts、mcp-status-panel.ts 已经展示了搜索、选择、状态面板的写法。
对 /plugins:可以照着任务浏览器做一个插件浏览器,不必重做整套交互控件。
当前发现的一个小坑:TUI 可能没有传递 --skills-dir
apps/kimi-code/src/cli/commands.ts 定义了可重复的 --skills-dir <dir>;
run-prompt.ts 会把它传给 KimiHarness。但交互式
run-shell.ts 当前构造 KimiHarness 时没有明显传入 skillDirs。
如果 /plugins 复用“额外目录”接入 skills,需要顺手覆盖这个路径,避免 TUI 和非交互模式行为不一致。
4. 参考实现对比
下面四套参考实现的关注点不一样:old kimi-cli 最像第一期本地插件;Claude Code 是完整扩展平台;
Codex 是 marketplace 和 /plugins UI 的强参考;Pi 展示了 TypeScript 扩展系统的另一种边界。
| 项目 | 用户入口 | 插件包形态 | 能扩展什么 | 对 Kimi 的启发 |
|---|---|---|---|---|
| kimi-cli Python | kimi plugin install/list/remove/info |
目录或 zip/git,根目录 plugin.json,可带 SKILL.md。 |
可执行工具,启动时还把插件目录并入 skill roots。 | 最适合第一期兼容;实现简单,工具用 stdin JSON、stdout 文本。 |
| Claude Code | /plugin、CLI plugin 命令、--plugin-dir、/reload-plugins |
manifest + commands/agents/skills/hooks/outputStyles/MCP/LSP/userConfig/marketplace。 | 几乎所有用户可见能力:slash、agents、skills、hooks、MCP、LSP、样式和配置。 | 适合作为长期目标,但第一期照搬会过重;可借鉴“纯操作层 + TUI/CLI 包装”。 |
| Codex | /plugins TUI、app-server plugin RPC、配置里的 enable/disable。 |
.codex-plugin/plugin.json,路径字段必须以 ./ 开头。 |
skills、MCP servers、apps、hooks、marketplace、share/install/uninstall。 | 最像目标 UI;可借鉴 feature gate、cache 清理、插件 ID 和路径校验。 |
| Pi | skills 命令、--extension、自动发现、/reload。 |
skills 是标准目录;extensions 是 TS 模块或带 pi 字段的 package。 |
工具、命令、事件拦截、UI、prompt、provider、资源发现。 | 提醒我们区分“插件包管理”和“运行时扩展 API”;热刷新和来源标记值得借鉴。 |
old kimi-cli Python:最贴近第一期
文档在 /Users/moonshot/code/kimi-cli/docs/en/customization/plugins.md。
源码集中在 src/kimi_cli/plugin/ 和 src/kimi_cli/cli/plugin.py。
- 插件是目录包,根目录必须有
plugin.json。 plugin.json主要字段是name、version、description、config_file、inject、tools。- 工具命令运行在插件目录,stdin 是 JSON 参数,stdout 作为工具结果返回,非零退出和 stderr 会转成错误。
- 安装支持本地目录、zip、远程 zip、git URL、repo 子目录和分支 URL。
- 安装位置是旧的
~/.kimi/plugins;Kimi Code 应该使用新的~/.kimi-code/plugins。 - 启动时会刷新插件配置,把 host 的
api_key、base_url注入配置文件或运行时 env。 - 插件目录也会被纳入 skill roots,因此一个插件可以同时带工具和
SKILL.md。
Claude Code:完整插件平台参考
主要源码在 /Users/moonshot/code/claude-code/src/utils/plugins/、
src/services/plugins/ 和 src/commands/plugin/。
PluginManifestSchema支持 commands、agents、skills、hooks、outputStyles、MCP、LSP、userConfig、channels、dependencies。/plugin打开交互设置页,包含发现、已安装、marketplaces、错误等视图;还有/reload-plugins。- CLI 与 TUI 复用
pluginOperations.ts,CLI 只负责命令行输出和退出码。 --plugin-dir可以加载 session-only 插件,适合调试。- 插件缓存目录默认在
~/.claude/plugins,带 marketplace 和版本分层。 - userConfig 支持敏感值和模板替换,MCP/LSP/hooks/skills/agents 都可能引用配置。
Codex:/plugins UI 和 marketplace 参考
主要源码在 /Users/moonshot/code/codex/codex-rs/app-server-protocol/src/protocol/v2/plugin.rs、
app-server/src/request_processors/plugins.rs、
tui/src/chatwidget/plugins.rs 和 core-plugins/src/manifest.rs。
/plugins是 TUI 弹窗,支持 All Plugins、Installed、marketplace tab、Add Marketplace、搜索、详情、安装、卸载。- 插件 API 走 app-server protocol:list/read/install/uninstall/share/marketplace add/remove/upgrade。
- 安装或卸载后会清 plugin/skill cache,并触发已有 thread 的 MCP refresh。
- 配置用
[plugins."plugin@marketplace"] enabled = true/false记录启用状态。 - 插件 ID 形如
<plugin>@<marketplace>,两个段只允许 ASCII 字母、数字、_、-。 - manifest 路径字段必须以
./开头,不能包含..,保证不会越过插件根目录。
Pi:扩展 API 和热刷新参考
主要源码在 /Users/moonshot/code/pi/packages/coding-agent/src/core/skills.ts、
src/core/extensions/loader.ts、src/core/extensions/runner.ts 和
docs/extensions.md。
- skills 兼容 Agent Skills 标准,扫描
~/.pi/agent/skills、.pi/skills、.agents/skills、package 和 settings 指定目录。 - extension 是 TypeScript 模块,可以注册工具、命令、快捷键、provider、事件处理、UI、消息渲染。
- extension 自动发现目录是
~/.pi/agent/extensions和.pi/extensions,也可通过--extension临时加载。 /reload会重新加载 keybindings、extensions、skills、prompts、themes。- 多个 extension 注册同名 slash command 时,Pi 会保留多个并加数字后缀;工具则 first registration wins。
sourceInfo 很重要;插件列表里要告诉用户“这个能力来自哪个插件、哪个文件”,不要只显示名字。
5. /plugins 应该解决什么
对用户来说,/plugins 不应该只是列一个目录。它要回答四个问题:我装了什么、它能做什么、它有没有问题、我能怎么处理。
| 需求 | 第一期建议 | 后续再做 |
|---|---|---|
| 查看插件 | 显示 installed / disabled / error;展示 name、version、description、source path、能力数量。 | 按 marketplace、作者、分类、更新时间过滤。 |
| 查看详情 | 详情页显示 skills、tools、MCP、hooks、manifest 错误、安装路径。 | 展示 screenshots、README、版本历史、更新日志。 |
| 安装 | 从本地目录安装;可选支持本地 zip。 | 远程 zip、git、GitHub marketplace、npm 包。 |
| 启用/禁用 | 记录到 ~/.kimi-code/config.toml 或插件状态文件;当前 session 尽量刷新,否则明确提示重启或 /new。 |
按项目启用、workspace policy、管理员策略。 |
| 卸载 | 删除安装目录前确认;禁用状态和错误记录同步清理。 | 保留插件 data dir、版本回滚。 |
| 错误处理 | manifest 解析错误、路径越界、工具名冲突、缺少入口文件都展示清楚。 | 自动修复建议、诊断导出。 |
| 迁移 | 识别 old kimi-cli ~/.kimi/plugins,提供一键迁移或清楚提示。 |
迁移后自动转换 manifest 格式和配置注入方式。 |
用户流程建议
6. 插件包形态
最小可用的插件包应该容易手写,也能兼容 old kimi-cli 的目录插件。建议第一期固定根目录
plugin.json,允许同时带 SKILL.md 和工具脚本。
推荐目录结构
my-plugin/
├── plugin.json
├── SKILL.md
├── tools/
│ └── search.js
└── mcp.json # 可选,建议第二期再自动接入
第一期 manifest 建议
字段尽量少,先保证安装、展示和工具执行能闭环。
推荐 plugin.json 示例
{
"name": "repo-search",
"version": "0.1.0",
"description": "Search repository files and summarize matches.",
"skills": "./skills",
"tools": [
{
"name": "search",
"description": "Search files with ripgrep and return compact matches.",
"command": ["node", "./tools/search.js"],
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "The ripgrep query."
}
},
"required": ["query"]
}
}
]
}
字段建议
| 字段 | 是否第一期支持 | 说明 |
|---|---|---|
name |
必须 | 插件名。建议 lowercase + 数字 + -,避免路径和展示混乱。 |
version |
必须 | 用于展示、未来升级和迁移判断。 |
description |
必须 | 展示给用户,也可作为模型理解插件能力的简短说明。 |
skills |
可选 | 推荐路径字段必须以 ./ 开头;也可以第一期默认扫描插件根目录里的 SKILL.md。 |
tools |
可选但核心 | 每个工具有 name、description、command、parameters。执行时 stdin JSON,stdout 文本。 |
mcpServers |
建议延后 | 可以先解析和展示,不自动执行。后续再合并到 MCP 配置。 |
inject / config_file |
不建议第一期写配置 | old kimi-cli 有这个能力,但 Kimi Code 第一版不应默认把密钥写入插件目录。 |
7. 推荐实现方案
实现上建议分三层:core 负责发现和执行,SDK 负责暴露会话 API,TUI 负责展示和用户操作。
/plugins 打开浏览器,调用 SDK,不直接读 core。
~/.kimi-code/plugins 保存安装包,config 记录启用状态。
建议新增/修改路径
| 路径 | 改动 | 原因 |
|---|---|---|
packages/agent-core/src/plugin/manifest.ts |
新增 manifest schema、路径校验、错误诊断。 | 插件格式要有唯一入口,路径必须限制在插件根目录内。 |
packages/agent-core/src/plugin/manager.ts |
新增 list/install/remove/enable/disable,管理 ~/.kimi-code/plugins。 |
不要把文件系统逻辑散到 TUI。 |
packages/agent-core/src/plugin/tool.ts |
把 manifest tools 转成 agent-core tool,处理 stdin/stdout/timeout/权限。 | old kimi-cli 的可执行工具模型可以复用,但要接入当前权限体系。 |
packages/agent-core/src/skill/scanner.ts |
把已启用插件的 skill roots 加入扫描结果。 | 插件里的 skill 才能进入 /skill:name 和短 slash。 |
packages/agent-core/src/session/rpc.ts |
新增 plugin RPC handler。 | 让 SDK/TUI 可以管理插件。 |
packages/node-sdk/src/session.ts |
新增 listPlugins()、installPlugin()、setPluginEnabled()、removePlugin()。 |
保持 app 只通过 SDK 使用 core 能力。 |
apps/kimi-code/src/tui/commands/registry.ts |
新增 plugins 内置 slash 命令。 |
进入 /plugins 补全和帮助。 |
apps/kimi-code/src/tui/kimi-tui.ts |
新增 case "plugins" 和 showPluginsBrowser()。 |
接入现有命令分发。 |
apps/kimi-code/src/tui/components/dialogs/plugins-browser.ts |
新增插件管理界面。 | 展示列表、详情、安装、禁用、卸载、错误。 |
packages/migration-legacy 与 apps/kimi-code/src/migration |
把旧 plugins 从“未支持”改成可迁移或可引导。 | 用户从 old kimi-cli 升级时不会丢失插件。 |
工具命名建议
plugin__<plugin>__<tool>,展示时仍可以显示 <plugin> / <tool>。
这样不会和内置工具、MCP 工具、其他插件工具撞名。
old kimi-cli 遇到工具名冲突时直接跳过插件工具。这个做法简单,但用户很难发现为什么工具不可用。
新实现更应该在 /plugins 里明确显示“工具名冲突”或采用命名空间避免冲突。
安装目录和配置建议
- 安装目录:
~/.kimi-code/plugins/<plugin-name>。 - 临时安装 staging:
~/.kimi-code/plugins/.tmp-<random>,验证成功后原子替换。 - 启用状态:优先写入现有 config,例如
[plugins."repo-search"] enabled = true。 - 插件私有数据:后续可以加
~/.kimi-code/plugin-data/<plugin-name>,卸载时询问是否保留。 - 远程 marketplace:第一期不建缓存层,第二期再考虑
plugins/cache/<source>/<name>/<version>。
8. 分阶段落地
listPlugins()、TUI 列表/详情/错误态。不先执行任何插件工具。
SKILL.md 或 skills/ 加到 skill roots,保证 slash 补全和模型提示正常。
tools 字段,工具执行走权限确认、超时、stdout 限制和错误展示。
~/.kimi/plugins 纳入迁移。
最小第一 PR 建议
- 新增
packages/agent-core/src/plugin/manifest.ts,只支持本地已安装目录扫描和错误收集。 - 新增 SDK/RPC
listPlugins(),返回结构化列表,不做安装/执行。 - 新增
/plugins命令和只读 TUI 浏览器。 - 补测试:manifest 成功/失败、路径越界、TUI slash 注册、空列表 UI。
这个 PR 小,能先把用户界面和数据模型定下来;后续再接 skill、tools、安装操作,不会一口气改太多核心路径。
9. 风险和安全边界
| 风险 | 具体症状 | 建议防线 |
|---|---|---|
| 路径越界 | manifest 里写 ../secret、zip 解压覆盖外部文件。 |
所有路径必须归一化并确认在插件根目录内;zip 解压逐项检查。 |
| 静默执行命令 | 模型调用插件工具后直接跑本地脚本。 | 插件工具走和 shell/MCP 类似的权限确认;显示插件名、工具名、参数摘要。 |
| 密钥落盘 | 安装时把 API key 写进插件目录配置。 | 第一期不要写密钥文件;只允许运行时 env 注入,且 UI 明确展示。 |
| 工具名冲突 | 插件工具覆盖内置工具或 MCP 工具。 | 内部命名空间化;冲突在 /plugins 里作为诊断展示。 |
| 远程安装投毒 | 用户粘贴远程 URL,内容变化或来源伪装。 | 第一期只本地路径;远程来源需要显式确认、校验、缓存和来源展示。 |
| 输出过大 | 插件工具 stdout 很大,撑爆上下文或 UI。 | 限制 stdout 字节数和行数;超出时截断并提示。 |
| 长时间卡住 | 插件工具不退出。 | 默认 timeout,例如 120 秒;支持 abort signal。 |
第一期明确不要做
- 不要支持自动安装远程 marketplace 插件。
- 不要让插件声明任意 hook 并在启动时直接执行。
- 不要默认把用户密钥写入插件配置文件。
- 不要允许插件工具裸名覆盖内置工具。
- 不要让 TUI 绕过 SDK 直接操作 core 内部对象。
10. 测试清单
合法 manifest、缺少必填字段、未知字段、路径不是 ./、路径包含 ..。
本地目录安装、重复安装、staging 失败回滚、卸载后状态清理。
已启用插件的 SKILL.md 被扫描;禁用后不出现;短 slash 不覆盖内置命令。
stdin JSON、stdout 返回、非零退出、stderr、timeout、env 注入、权限拒绝。
插件工具与内置工具、MCP 工具、其他插件工具同名时可诊断或命名空间化。
Session.listPlugins() 等 API 返回稳定结构;错误不会让会话崩掉。
空列表、loading、error、search、详情、启用/禁用/卸载确认。
检测 ~/.kimi/plugins;提示或迁移到 ~/.kimi-code/plugins;无效插件可跳过并报告。
启用状态写入后可重新读取;保留未知 config 字段;禁用插件不加载工具和 skills。
说明插件、skills、MCP 的区别;说明安全风险和安装来源;更新 slash command 文档。
11. 需要先拍板的问题
- 第一期是否只支持本地插件?我建议是。远程 git/zip/marketplace 放第二期。
- 是否兼容 old kimi-cli 的
plugin.json?我建议兼容核心字段,尤其是tools和顶层SKILL.md。 - 插件工具是否允许裸工具名?我建议内部强制命名空间,UI 里再展示友好名。
- 安装后是否必须热刷新当前 session?最好支持,但可以第一期提示“新会话生效”;如果做工具执行,热刷新体验更重要。
- MCP 是否第一期自动接入?我建议第一期只解析和展示,第二期再合并执行。
- 启用状态是全局还是项目级?第一期全局更简单;项目级适合有 workspace policy 后再做。
12. 调研来源
本报告基于本机源码和文档检索,不依赖远程网络资料。下面是主要证据路径。
Kimi Code 当前仓库
/Users/moonshot/code/kimi-code/apps/kimi-code/AGENTS.md/Users/moonshot/code/kimi-code/apps/kimi-code/src/tui/commands/registry.ts/Users/moonshot/code/kimi-code/apps/kimi-code/src/tui/commands/resolve.ts/Users/moonshot/code/kimi-code/apps/kimi-code/src/tui/commands/skills.ts/Users/moonshot/code/kimi-code/apps/kimi-code/src/tui/kimi-tui.ts/Users/moonshot/code/kimi-code/packages/node-sdk/src/session.ts/Users/moonshot/code/kimi-code/packages/node-sdk/src/rpc.ts/Users/moonshot/code/kimi-code/packages/agent-core/src/session/rpc.ts/Users/moonshot/code/kimi-code/packages/agent-core/src/session/index.ts/Users/moonshot/code/kimi-code/packages/agent-core/src/skill/scanner.ts/Users/moonshot/code/kimi-code/packages/agent-core/src/skill/parser.ts/Users/moonshot/code/kimi-code/packages/migration-legacy/src/detect.ts/Users/moonshot/code/kimi-code/apps/kimi-code/src/migration/migration-screen.ts/Users/moonshot/code/kimi-code/docs/en/customization/skills.md/Users/moonshot/code/kimi-code/docs/en/customization/mcp.md/Users/moonshot/code/kimi-code/docs/en/reference/slash-commands.md
参考实现
| 项目 | 路径 | 看点 |
|---|---|---|
| kimi-cli Python | /Users/moonshot/code/kimi-cli/docs/en/customization/plugins.md/Users/moonshot/code/kimi-cli/src/kimi_cli/plugin//Users/moonshot/code/kimi-cli/src/kimi_cli/cli/plugin.py |
旧插件格式、安装、工具执行、配置注入、skill roots。 |
| Claude Code | /Users/moonshot/code/claude-code/src/utils/plugins//Users/moonshot/code/claude-code/src/services/plugins//Users/moonshot/code/claude-code/src/commands/plugin/ |
完整插件平台、marketplace、UI、纯操作层、reload。 |
| Codex | /Users/moonshot/code/codex/codex-rs/tui/src/chatwidget/plugins.rs/Users/moonshot/code/codex/codex-rs/app-server-protocol/src/protocol/v2/plugin.rs/Users/moonshot/code/codex/codex-rs/core-plugins/src/manifest.rs |
/plugins UI、plugin RPC、manifest 路径安全、配置启用状态。 |
| Pi | /Users/moonshot/code/pi/packages/coding-agent/docs/skills.md/Users/moonshot/code/pi/packages/coding-agent/docs/extensions.md/Users/moonshot/code/pi/packages/coding-agent/src/core/extensions/loader.ts |
Agent Skills 标准、TS extension、热刷新、动态工具和命令。 |
注:本文里的“第一期/第二期”是实现建议,不代表已有产品承诺。真正开工前建议先用上面的“需要拍板的问题”确认范围。