dsh-fix
Skill0 starsChanged 3 months agoMITView on GitHub
修复 DeepSeek Harness 桌面端(DSH Desktop)的安装、启动、市场与插件问题:BOM/非法 JSON 启动崩溃、install-recovery 事务卡死、pnpm 供应链策略拦截、市场 agent guard 拒绝安装、插件冲突与禁用状态。遇到 DSH 报错、插件装不上、启动失败时使用。
In this repository12 other files it gives its agents.
- AGENTS.mdAGENTS.md
- academic-figure-skillSkill
- browserskillSkill
- github-repo-verificationSkill
- humanities-thesisSkill
- mcp-builderSkill
- prompt-craftSkill
- scipilot-figure-skillSkill
- study-coachSkill
- systematic-debuggingSkill
- verification-before-completionSkill
- web-researchSkill
The file
Files
DSH 修复(DSH Desktop / dshmarket / 插件排障)
何时使用
在 DeepSeek Harness Desktop(DSH Desktop 2.x,Windows)环境遇到以下问题时:
- 启动直接弹恢复界面 / 报
Unexpected token、not valid JSON(BOM 或编码问题) dsh plugin命令报another plugin install recovery transaction is pending- 市场卡片显示「无法安装 · 查看详情」(agent guard 或供应链策略)
- 插件装上了但不生效 / bundle 没加载 / 状态是 restart
- 想装/想卸插件但被各种策略拦
ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION(供应链策略)
关键环境事实(本机实测)
| 项 | 值 |
| DSH Desktop 版本 | 2.0.2(Electron, win32, node v24.18.1) |
| GUI 端口 | http://127.0.0.1:43120 |
| DSH_HOME | C:\Users\Administrator\.dsh |
| 实际使用的 profile | desktop(~/.dsh/profiles/desktop),不是 web! |
| web profile | ~/.dsh/profiles/web(市场默认命令常写 web,但 GUI 用的是 desktop) |
| 市场 registry | https://awesome-dsh-plugin.com/plugins.json(env DSHM_REGISTRY_URL 可覆盖) |
| npm 包名 | 卡片显示的作者 ≠ npm 发布者:如 dsh-memory-plugin 是 @openviking/dsh-memory-plugin(发布者 linxin666/volcengine);dsh-web-ui-all 是 @linxin666/dsh-web-ui-all |
| OpenViking 服务 | http://localhost:1933(必须运行,否则记忆插件只告警不工作) |
铁律
先诊断根因,再动手改。每一步改动前先备份,改动最小化。- 改任何 Desktop 持有的状态文件前,先
Copy-Item备份 - 不要手删 install-recovery 的 state.json 而不留备份(改名保留,不删除)
- 不要盲目
pnpm add一堆包——先确认目标 profile 和包名 - 所有
pwsh调用用& npm.cmd/pnpm.cmd(npm.ps1被执行策略拦截)
排障流程
1. 启动崩溃:Unexpected token '' ... is not valid JSON
根因:某个 JSON 配置文件开头多了 BOM(\uFEFF)。常见于上次用 PowerShell/编辑器保存时写成了带 BOM 的 UTF-8。
定位:检查目标文件前几个字节是否为 0xEF 0xBB 0xBF:
$raw = Get-Content "$HOME\.dsh\profiles\desktop\package.json" -Raw -Encoding Byte
Write-Host ($raw[0..2] -join ', ') # 123,10,32,... = 无 BOM;239,187,191 = 有 BOM修复:去掉 BOM,其余内容零改动(用 edit 工具重写首行,或:
$p = "$HOME\.dsh\profiles\desktop\package.json"
$bytes = [System.IO.File]::ReadAllBytes($p)
if ($bytes[0] -eq 0xEF -and $bytes[1] -eq 0xBB -and $bytes[2] -eq 0xBF) {
[System.IO.File]::WriteAllBytes($p, $bytes[3..($bytes.Length-1)])
}改完用 ConvertFrom-Json 验证合法。BOM 来源:PowerShell Set-Content -Encoding UTF8(Windows PowerShell 5.1 写 UTF8 带 BOM)→ 之后写 JSON 用 -Encoding UTF8 前的 | ConvertTo-Json 到 Set-Content 会带 BOM,需注意。安全写法:[System.IO.File]::WriteAllText($p, $content, [System.Text.UTF8Encoding]::new($false))。
2. dsh plugin 报 "another plugin install recovery transaction is pending"
根因:install-recovery WAL 里有遗留事务。WAL 路径:%APPDATA%\DSH Desktop\plugin-install-recovery\state.json + backups\。
关键理解(本机实测):
phase: awaiting-restart= 安装已 seal 成功,等 DSH Desktop 重启后 claim → verify → clear- 但如果事务的 profile 与 Desktop 当前 profile 不匹配(例如 CLI 装到了 web,而 Desktop 用 desktop),claim 会
profile-mismatch→ 永久 defer → 所有后续 CLI 安装全被阻塞 beginLocked只要 state.json 存在就抛错;clearLocked只允许 verified/rolled-back
修复(先确认安装本身已成功——package.json dependencies + bundles + node_modules 都在):
$sp = "$env:APPDATA\DSH Desktop\plugin-install-recovery"
Copy-Item "$sp\state.json" "$sp\state.json.orphan-bak" -Force
Remove-Item "$sp\state.json" -Force
Remove-Item "$sp\backups\<transactionId>" -Recurse -Force # 对应的事务目录之后所有 dsh plugin 命令恢复可用。
3. 市场卡片「无法安装 · 查看详情」
根因(两类叠加):
- agent guard:市场安装/更新/卸载时检测到任何 agent 正在运行(包括用户当前对话的 agent 会话本身!)→ HTTP 409 拒绝 → 操作记录 failed → 卡片锁定。
agentGuardAvailable: true(查/dsh-market/status)。 - 供应链策略:pnpm
minimumReleaseAge拦截太新的包(本机dsh-pocket@1.13.4曾触发)。dshmarket 会自动重试一次--config.minimumReleaseAge=0,但 CLI 直装不会。
判定:
$s = (Invoke-WebRequest -Uri "http://127.0.0.1:43120/dsh-market/status" -UseBasicParsing).Content | ConvertFrom-Json
$s.agentGuardAvailable # true = agent guard 生效
$s.installed # 实际已装的包(判定市场操作的 profile!)修复:CLI 直装绕过 agent guard(agent guard 只在 HTTP 路由层,CLI 不走它):
Push-Location "$HOME\.dsh\profiles\desktop"
& pnpm.cmd add <真实npm包名> --config.minimumReleaseAge=0
Pop-Location4. 装完不生效 / bundle 没加载
修复:把包加进 dsh.profile.bundles(dsh CLI 装完会自动 reconcile,但直装 pnpm 不会):
$pkgPath = "$HOME\.dsh\profiles\desktop\package.json"
$json = Get-Content $pkgPath -Raw -Encoding UTF8 | ConvertFrom-Json
$json.dsh.profile.bundles += '@xxx/dsh-plugin' # 去重后
$json | ConvertTo-Json -Depth 10 | Set-Content $pkgPath -Encoding UTF8 # 注意无 BOM验证 bundle 结构:插件包须有 cordis.patch.yml(- insert: 行)+ dsh.bundle.patch 字段。bundle 层插件必须重启 DSH Desktop 才激活(market 的 activation 状态会显示 restart)。
5. 查询插件激活/禁用状态
$r = Invoke-WebRequest -Uri "http://127.0.0.1:43120/dsh-market/installed" -UseBasicParsing
$r.Content | ConvertFrom-Json | % { $_.activation.PSObject.Properties | % { "$($_.Name): $($_.Value.state)" } }状态含义:live(已热挂载)/ restart(重启生效)/ disabled(被禁用)/ inert / broken / missing。
禁用状态存储(三处都可能):
{profileDir}/.dsh-market/state.json的disabled数组(market 开关){profileDir}/cordis.patch.yml的- id: X+disabled: true行- Desktop 私有:
%APPDATA%\DSH Desktop\startup-recovery\state.json的disabledBundles(启动恢复禁用)——这一处最隐蔽,dshmarket 感知不到
6. 恢复被禁用的插件(startup-recovery 层)
$sp = "$env:APPDATA\DSH Desktop\startup-recovery\state.json"
Copy-Item $sp "$sp.bak-$(Get-Date -Format yyyyMMdd-HHmmss)" -Force
# 把该 profile 的 disabledBundles 数组改为 [](空数组合法,parseState 只校验长度上限)改完重启 DSH Desktop 生效。
7. 供应链策略相关
- 策略配置在 profile 的
pnpm-workspace.yaml:minimumReleaseAgeExclude列表 - 但即使 exclude 里写了,
pnpm install仍可能拦截(本机实测dsh-pocket@1.13.4在 exclude 里却仍报 violation)→ 直接用--config.minimumReleaseAge=0绕过最可靠 - 忽略的构建脚本:
ERR_PNPM_IGNORED_BUILDS是警告不是失败;相关功能(node-pty/ssh2)不工作再处理allow-scripts白名单
常用验证命令
# 市场状态(活跃 profile / installed / agent guard)
Invoke-WebRequest http://127.0.0.1:43120/dsh-market/status
# 插件激活状态
Invoke-WebRequest http://127.0.0.1:43120/dsh-market/installed
# profile 依赖与 bundles
(Get-Content "$HOME\.dsh\profiles\desktop\package.json" -Raw | ConvertFrom-Json).dsh.profile.bundles
# install-recovery WAL
Get-Content "$env:APPDATA\DSH Desktop\plugin-install-recovery\state.json" -Raw
# 日志
Get-Content "$env:APPDATA\DSH Desktop\logs\dsh-2026-08-2*.log" -Tail 50反模式(不要做)
- ❌ 不诊断直接重装/删文件
- ❌ 手删 state.json 不留备份
- ❌ 装插件装到 web profile 而用户 GUI 用 desktop profile(先查
/dsh-market/status的 installed 确认活跃 profile) - ❌ 用
npm.ps1(执行策略拦截)——用npm.cmd - ❌ 改 Desktop 持有的状态文件时写成带 BOM 的 UTF-8
- ❌ 认为"market 显示无法安装 = 插件有问题"——多数是 agent guard 或策略,插件本身没问题
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

