dsh-tui-skill-mcp-panel
Identified★ 1Visual skill & MCP manager for dsh-TUI: full-screen scene behind /skill-mcp (M0 probe / M1 skeleton)
dsh-tui-skill-mcp-panel
给 dsh-TUI 的技能(skill)与 MCP 服务器可视化管理面板:在终端里输入 /skill-mcp 打开全屏管理场景,不用离开 TUI 就能查看、启用/停用、添加、分组技能与 MCP 服务器;改动尽量热加载,不要求重启 TUI。
开发状态(2026-11-13):技能管理与 MCP 列表/启停已实现;M4 已支持本面板新增 MCP 的编辑、删除与撤销,含 stdio/HTTP 表单、共享锁、冲突检测、备份和热加载等待。已有 profile 行仍仅支持启停,home 层只读。已支持按 profile 隔离的 MCP 分组、搜索与状态筛选;M5 的 manifest、打包检查与准入自查已补齐,首版 P1 已确认延后,P0 细项整改及完整人工验收仍待完成,npm 尚未发布。完整范围以 docs/需求文档.md §14 为准。
功能与进度
| 模块 | 能力 | 状态 |
|---|---|---|
| 技能 | 只读:全局/工作区列表、详情、作用域筛选、搜索;写入(M2 P0):启用/停用(*.disabled)、软删除 + 回收站撤销、本地路径添加/导入、分组、批量;迁移/复制、zip 导入为 P1(未实现) | ✅ 主要流程;P0 细项待补 |
| MCP | 列表/启停;stdio/HTTP 新增表单;本面板受管行编辑、删除、撤销;!!js 保留与脱敏;home 全局层只读。按 profile 分组、搜索与状态筛选;连接测试为 P1 可选 | ✅ 受管 CRUD / 分组筛选 |
| 分组 | 显示层分组、加入/移出、按组过滤;技能分组与 web 版共享 groups.json(v1);MCP 分组存私有配置并按 profile 隔离;组内批量动作(P1) | ✅ 基础 / 🚧 批量 |
| 诊断 | 发现根与路径、frontmatter 合法性、遮蔽/停用状态、宿主能力探测;锁 / 备份 / 回收站(M2+) | ✅ 基础 |
| 入口 | /skill-mcp 命令打开全屏场景 | ✅ |
热加载:技能靠磁盘 watcher,MCP 靠 HMR 重组合。保存后面板显示「已保存,热加载中…」,生效后改为「已生效」,不承诺瞬时生效。
安装
尚未发布到 npm。 本插件以 trusted-in-process 方式运行:与宿主同进程、无沙箱,能读写下方披露的文件;permissions: [] 不构成文件系统隔离。请先确认信任来源。发布后:
dsh plugin --profile dsh-tui add dsh-tui-skill-mcp-panel
从源码安装、构建与真机验证流程见 AGENT.md §7。维护者可运行 pnpm check:release;发布前完整测试步骤见发布准备与人工验收。
使用
在 dsh-TUI 中输入 /skill-mcp 回车打开管理场景,Esc / q 关闭。当前版本提供:
- 技能页:全局/工作区筛选、搜索、列表与详情;
空格启停、d软删除、u撤销、a本地路径导入、v多选后批量操作、g管理分组。o或点击工作区入口选择宿主登记的本地工作区,确认页显示完整目录与实际 Git 发现根;只切换面板管理目标,不切换聊天会话。窄终端下点击技能行或Enter进详情,Esc或[←返回]返回列表。启停后仍选中同一来源的技能。撤销遇占用时默认取消,可选择覆盖前备份或恢复到另一作用域;二次确认页显示完整路径,成功后显示备份位置。 - 诊断页:插件/宿主/DSH 内核/Node 的实际版本或 unavailable、发现根与路径、扫描统计、警告、宿主接缝能力探测;
v查看完整来源及不可读原因;按c或点击清理记录,查看清理前快照、结果和受保护项(只读)。 - MCP 页:
a新增,Enter编辑、d删除、u撤销本面板受管行;空格启停 profile 行。已有行仅启停,home/表达式控制行只读。编辑与删除前确认;文件被外部修改时停止写入,按r重新加载后重试。g加入/移出分组,f按状态及分组筛选,/搜索名称、entryId、transport、来源层与分组名,x清除 MCP 过滤。 - 分组页:
t切换技能/MCP,可新建、重命名、删除分组,Enter按组选出成员。共享技能分组保存遇到外部修改时会拒写,按大写R刷新后重试;写入备份路径可在诊断页查看。删除分组只改显示元数据;整组批量动作尚未实现。
界面按「焦点」操作,像文件管理器一样用方向键走过去:
↑/↓:当前区域内的选择/滚动;←/→:把焦点移到左边/右边的区域(技能列表 ⇄ 作用域、列表 ⇄ 详情),在页签栏上则是切换页签;- 列表顶部再按
↑会回到页签栏;在页签栏按↓↓或↓回到技能列表; Tab:快速切换页签(1–4直达),最后页签保存到私有配置,重新打开或重启后恢复;Enter:进入详情(窄终端下打开详情,Esc返回);/搜索 ·r重新扫描 ·?帮助 ·q关闭。
MCP 页按 i 打开已知配置字段的脱敏详情(只读,不展示未知配置键)。帮助、确认框和详情支持 ↑/↓、PgUp/PgDn、Home/End;长输入显示末尾,底部动作按钮随宽度换行。技能详情预览最多 16 KiB/前 400 行,路径与正文按终端宽度折行。按 i 或点击全文,读取原技能文件(含 frontmatter),支持 Home/End、翻页和滚轮;文件变化后按 r 重新读取。按 p 查看完整路径及所在目录的复制文本,长路径折行时请合并续行。全文只渲染当前页,建立索引时可关闭取消。场景可用区域至少需 40×16;更小时暂停操作并保留草稿,放大后继续,q/Esc 可关闭。该尺寸指宿主提供给场景的区域,终端窗口通常还需留出宿主边距。
当前焦点区域用主题色(accent)边框和 ❯ 指针标出;选中行用主题选中底色。fullscreen 布局下额外支持鼠标:点击页签/作用域/技能行,滚轮滚动列表、详情与诊断页(若终端未路由鼠标事件,键盘功能不受影响)。
MCP 表单点击字段或按 Enter 编辑,Ctrl+U 清空当前输入;选择框和输入框均提供可点击的 [Esc 取消],也可按 Esc 返回。args 使用 JSON 字符串数组,例如 ["--port", "3000"];env/headers 每行 KEY=VALUE,支持粘贴多行或 Shift+Enter 换行,${ENV} 保存为表达式。敏感值输入始终隐藏;留空保留原值、-KEY 删除单个键、! 清空该组。保存前只显示变更字段,不显示密钥。
MCP 分组存本插件的 config.json,按当前 profile patch 的绝对路径隔离,成员以 serverName + entryId 双键记录;同名服务器可独立归组。分组可包含只读行;服务器改名会同步本面板分组,删除服务器保留成员引用以便撤销恢复。搜索不读取密钥或命令参数,搜索词、状态与分组筛选可组合,且与技能页过滤独立。分组名不能重复于当前 profile;其他 profile 可使用同名分组。私有配置损坏时保留原文件并阻止写入,请先备份并手工修复;刷新可重新读取。
已知限制
| 限制 | 说明 |
|---|---|
| MCP 没有「工作区级」 | DSH 内核只有 profile 级 MCP 配置。面板提供「当前 profile(可写)+ home 全局层(跨 profile,只读)」;工作区维度只适用于技能。 |
| MCP 编辑/删除边界 | 只支持本面板新增的受管行;已有 profile 行保留启停。未知配置键与 !!js 保留;其他自定义 YAML 标签或歧义结构会拒写,请手工编辑。 |
| 技能只发现一层 | 与 DSH 内核一致:<root>/<name>/SKILL.md 或 <root>/<name>.md,不递归嵌套分类目录。 |
| 热加载有延迟 | MCP 配置写入后需要 HMR 重组合(实测约 2–2.5 秒),面板如实显示状态,不假装瞬时。 |
| 外部修改冲突 | 与 web 面板共用 patch 锁;写前核对 profile/home 内容,冲突后刷新重试。共享技能分组遇到文件变化时按大写 R 刷新后重试,写前备份并保留未编辑字段。MCP/分组没有强制覆盖入口;不遵守锁的写入与最终 rename 之间仍有极短竞争窗口。 |
| 旧版 MCP 启停配置 | 旧覆盖行会导致 web 2.3.7 开关不一致。新版启停精确修改定义的 disabled;旧条目在下次启停时清理,也可在 MCP 页按 m 查看目标并确认迁移,保留保存的启停状态。迁移遇歧义整批停止,不自动改 home/表达式。完整共存验收状态见开发文档。 |
| web / TTY 待验边界 | web 2.3.7 开关后的空值崩溃已由官方 2.3.12 修复;部分多行 flow 编辑缺陷在 2.3.12 仍存在。冷启动 Node MCP 继承终端 stderr、退出时恢复旧模式,可导致 TUI 按键失效,且宿主重复开启 raw 无法恢复。按现象确认、临时恢复及修复证据见 已知问题速查。当前选择保持原安装,未应用临时补丁,完整共存验收未通过。 |
| 场景内自绘交互 | 场景内不依赖宿主对话框 / toast(实测不可用);确认与表单输入在场景内完成。 |
| 工作区管理边界 | 优先读取场景的会话 cwd,再按最近 .git 求实际根。工作区列表来自公开 tuiWorkspaces;服务不可用/拒绝/超时可查看说明并继续管理当前本地目标和全局。远程 provider 目录不作本机路径扫描。其他工作区的写入只说明已保存,不声称当前会话已加载。工作区目标不跨进程记忆;最后页签会记忆。 |
| 面板只列文件来源技能 | 运行期/agent scope 注册的技能不在扫盘结果内;customSkillDirs 在宿主层不可读(按未配置处理)。 |
| 迁移/复制、zip 导入 | 首版未实现(P1);添加仅支持本地绝对路径的 .md 或目录束。 |
| 回收站保留 | 面板启动及删除后自动按清单删除时间清理:默认 7 天或最近 100 个正常技能批次,清理后无法撤销。诊断页 c 保留执行前快照与结果。MCP、未知/损坏、链接批次、待恢复和清理中断数据保留,不占正常批次预算;备份不自动清理。配置/清理记录异常时停止自动清理。 |
| 首版 P0 细项 | 删除确认已支持全部目标和完整路径;跨设备删除/撤销已支持复制校验及失败保护。撤销冲突已支持默认取消、确认后备份替换或另作用域恢复;清理生命周期已补齐;页签记忆与已知本地工作区入口已补齐;完整路径与分页全文已补齐;诊断版本已补齐;技能状态筛选、布局/性能核对和完整验收仍待完成,见范围与整改清单。P1 延后不取消这些 P0 要求。 |
| 全文读取边界 | 只读普通 UTF-8 技能文件(含指向普通文件的链接);按块读取、稀疏索引,初次打开或改变宽度需重新扫描文件并显示进度,可取消。检测到文件修改/替换后停止旧视图,按 r 重读;不编辑、不自动打开文件管理器,也不自动写系统剪贴板。路径提供终端选择复制文本。 |
| 版本来源 | 插件读取自身包元数据;宿主读取公开 host descriptor;内核读取已确认的当前 DSH CLI 入口解析到的 app-boot 包元数据;Node 读取当前进程。来源不可用/拒绝/无效时显示 unavailable,不以兼容范围或其他安装代替。包元数据不等于代码完整性校验,r 可重新读取。 |
| 首版不做 | 技能正文编辑、插件安装/更新、MCP OAuth、单工具禁用、伴随 CLI。 |
兼容性
- 目标宿主:
@deepseek-harness-tui/dsh-tui>=0.19.0 <0.20.0 - DSH 内核:
0.2.2-rc.1线;Node>=24.9 - 与 web 版
dsh-skill-mcp-panel共享磁盘约定(*.disabled、groups.json、补丁锁<patch>.panel.lock,但受管块标记不同名);技能分组已有 TUI 锁与快照冲突保护;web 2.3.7 未使用该分组锁,避免两端同时改同一分组文件。
权限与信任
- 插件
permissions: []:不申请额外权限,不安装插件、不执行用户命令、不eval用户表达式。 - 插件直接读写
~/.dsh下的技能文件与当前 profile 的cordis.patch.yml(trusted-in-process,非沙箱,安装前需信任);写前备份、原子写;配置编辑/删除限本面板受管行,已有 profile MCP 仅精确修改普通布尔disabled,其他内容保留;删除走回收站可撤销。 - 停用面板只释放面板的命令、场景和计时器;卸载面板保留技能、已保存的 MCP 配置、分组、备份和回收站,不提供 purge。MCP 与技能本身的启停状态不会随管理器卸载而恢复。
- MCP 的
env/headers可能含令牌:表单、诊断、dump 和日志脱敏。原配置、备份与回收站仍保留原值;插件新建的备份/清单使用私有目录与 0600 文件权限。
开发文档
需求与设计在 docs/:需求唯一权威 docs/需求文档.md、调研与真机实测 docs/research/README.md(含 M1 与内核发现一致性验证)、关键决策 docs/decisions/、仓库工作约定与开发流程 AGENT.md。
许可证
MIT。
Comments
Loading…