deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
DSH Web 插件「基础能力面板」:在 DSH 设置中可视化并管理 MCP 服务器、技能、规则 与 归档会话。采用模块化 feature 注册表,后续的 DSH 可视化功能只需新增一个 feature 目录并在注册表加一行即可,无需改动面板骨架。
A DSH web plugin: a native Settings panel for visualizing and managing MCP servers, skills, rules and archived sessions, built on a modular feature registry so future visualizations slot in without touching the shell.
兼容性:支持 DSH
0.1.2-rc.1~0.2.x(peer 按 minor 线开窗,见下方 0.2.0 适配段落)。0.2.0起适配 DSH0.1.2-rc.1:上游已移除@deepseek-ai/dsh-client-runtime,其slots/sessions/locale客户端服务改由标准 web 组合提供(ui-renderer/api-session-controller/client-locale),本插件不再声明对该包的注入依赖,构建外部模块清单同步收敛。归档会话兼容性:恢复优先使用上游公开的
unarchiveSession(0.1.7-rc.1已提供,运行中的0.1.5-rc.3尚无);在这类尚未提供该 API 的版本上,改用注册表自身的写入通道(操作队列 +setState,保证磁盘、进程内快照与工作区域变更三者一致);两者都不可用时面板置灰并明确提示,不会只改磁盘。DSH 0.1.7 适配(
0.4.0):客户端会话列表快照不再有current字段,面板改为按retainedBy.mainView找主视图会话(技能作用域靠它),并在宿主侧以最近的活动 Agent 兜底、在页面提示实际使用的会话;预设改为读取@deepseek-ai/dsh-agent-preset声明行的config.plugins(bundle 内声明的只读),不再读取已废弃的~/.dsh/.agent-presets/目录,也不再显示没有 MCP 行的空预设卡片;开关后会轮询热重载结果,避免把「正在连接」误报成「未生效」。DSH 0.2.0 适配(
0.4.1):DSH 启动的兼容性预检(@deepseek-ai/dsh-app-boot的evaluatePluginCompatibility)会把本插件package.json里每一条以@deepseek-ai/dsh开头的 peer 按semver.satisfies(宿主版本, 范围, { includePrerelease: true })判定,任一条不满足就让整条插件被启动预检拒绝(表现为设置里没有「基础能力」页签)。0.4.0声明的@deepseek-ai/dsh-home-paths@^0.1.2-rc.1上界是<0.1.3,虽然覆盖0.1.x全线(includePrerelease: true下预发布版照常参与比较),但覆盖不到0.2.0,对宿主0.2.0-rc.2判定为 false,插件因此被禁用;0.4.1改为按 minor 线逐条列出的^0.1.2-rc.1 || >=0.2.0-rc.1 <0.3.0,同时覆盖0.1.x与0.2.x两条线。四条@deepseek-ai/dsh-*devDependencies 同步升到0.2.0-rc.2,让pnpm typecheck按宿主的实际类型核对(本插件只从宿主取resolveDshHome/dshHomeDisplay两个稳定函数,实际类型无漂移)。
disabled 字段,profile 热重载、preset 新会话生效;开关后轮询到状态稳定)。~/.dsh/AGENTS.md)与项目链规则(项目根至当前目录的 AGENTS.md / CLAUDE.md / .local 覆盖),支持新建(全局 / 项目根 / 当前目录)与整文件编辑,保存后新会话生效。running 的会话不可删除;「已装载但空闲」的会话可删,确认条会点名提示。| 能力 | 全局 | 项目级 | 用户级 | 预设级 | 内置 |
|---|---|---|---|---|---|
| 技能 | — | <项目>/.dsh/skills、<项目>/.agents/skills |
~/.dsh/skills、~/.agents/skills |
— | 随发行版内置 |
| MCP | — | DSH 暂无项目级组合文件 | ~/.dsh/cordis.patch.yml、~/.dsh/profiles/*/cordis.patch.yml |
预设声明行(@deepseek-ai/dsh-agent-preset)的 config.plugins;bundle 内声明的只读 |
— |
| 规则 | ~/.dsh/AGENTS.md |
项目根至 cwd 链上的 AGENTS.md / CLAUDE.md / .local |
— | — | — |
同名技能按注册表优先级显示生效版本(项目级 > 自定义 > 用户级 > 内置)。
开发完成后,用官方通道安装(或手动挂载):
dsh plugin --profile web add dsh-basics-panel@<version>
手动挂载:将本包放入 profile 解析范围,并在 ~/.dsh/profiles/web/cordis.patch.yml 写入:
- insert:
- id: basics-panel
name: 'dsh-basics-panel'
file: 依赖:构建后必须同步安装副本本仓库当前以 file: 本地依赖挂在 web profile 上,pnpm 会在安装时把包复制到 $DSH_HOME/profiles/<profile>/node_modules/dsh-basics-panel,DSH 的宿主半边与客户端 bundle 都从该副本加载。也就是说 pnpm build 只更新仓库,不更新 DSH 实际运行的代码;cordis.patch.yml / LICENSE 这两个文件是手工硬链接的,所以配置改动会穿过去,代码改动不会——这是最容易踩的坑。
pnpm build
pnpm run sync:check # 只校验:影响运行的文件(lib/、package.json)不一致时列出差异并退出码 1
pnpm run sync # 同步产物到副本(默认 profile=web,可用 --profile / DSH_PROFILE / DSH_HOME 覆盖)
同步时目录整体替换、文件原地覆盖(保留 cordis.patch.yml / LICENSE 的硬链接),因此这两处配置改动依旧无需同步即生效。
同步后重启 DSH 进程(宿主半边在启动时载入)并硬刷新浏览器(Ctrl+F5)载入新的客户端 bundle。若想让后续构建免同步,可把 profile 依赖改成 link:(pnpm 会建符号链接),但那会改动 profile 的 package.json / lockfile。
pnpm install
pnpm typecheck # tsc --noEmit
pnpm test # vitest
pnpm build # tsc 声明 + tsdown(lib/index.js + lib/client.js + lib/client-registry.js)
pnpm run sync # 把构建产物同步到 profile 安装副本(见上一节)
pnpm run sync:check
Cordis 的 ctx.get(name) 默认是严格的:提供该服务的 fiber 还没进入 ACTIVE 时返回 undefined。本插件的 inject 只声明 webServer / webRuntime / sessions / skills / tools,而 workspaceRegistry(@deepseek-ai/dsh-workspace)、sessionPersistence、agentPresets 等都可能晚于本插件就绪——dsh-workspace 尤其慢,它要先 await 打开工作区域域存储、恢复未完成写入、索引会话头。
所以:
ctx.get(...),绝不在 apply() 阶段缓存(缓存会拿到 undefined 并固化到进程结束,症状就是页签提示「未挂载工作区注册表」);inject:那会让本面板在未挂载 dsh-workspace 的 profile 上永不挂载,并随该 fiber 的更替反复卸载重载。tests/archive-store.spec.ts 里的假 ctx 可以切换服务可用性,用于回归这类时序问题。
src/index.ts — Host 半边:fenced /basics/api 路由 + feature 合并src/features/<id>/ — Host 侧 feature 后端(MCP / skills / rules / archived)src/client/index.tsx — 客户端半边:注册 settings.sectionsrc/client/feature-registry.tsx — 客户端 feature 注册表(扩展点)docs/ — 使用文档与设计文档webRuntime.trustedHosts)AGENTS.md 与项目链候选文件)ctx.agents.get(id)?.status === 'running')的会话一律拒绝;恢复优先走上游 unarchiveSession,否则走注册表自身的写入通道,通道不可用时明确报错而不只改磁盘running(Agent 在处理回合,继承上游 AgentStatus)与 loaded(会话对象在本进程内存里,归档不会卸载它)。删除只拦 running;对 loaded 但空闲的会话,确认条会提示「仍装载在本次进程中」的风险后再执行MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。