Skip to content

Releases

v0.2.1 — 作用域解析双根回退(含一处判断更正)

Choose a tag to compare

@Amouren7 Amouren7 released this 11 Sep 05:17

修复

预设作用域解析改为双根回退。 @deepseek-ai/dsh-scope 原先只从 profile 根解析一次;该根不可用时 scopeModule 直接为 null,所有预设作用域静默降级为仅 global 覆盖,技能开关被闸门拒绝,而用户只看到「装不上」,看不到原因。

现在依次尝试 profile 根与 DSH 安装根(后者由 process.argv[1] 推导,与 lib/index.js 中包解析已有的第二基一致)。

差分实测 —— 人为把 profile 根的 junction 改名,重载插件后读 /skills:

代码版本 presetInstall.installed reason
旧(单根) [] @deepseek-ai/dsh-scope 不可解析(部署未提供)
新(双根) standard,ptc,minimal,cordis 空

恢复 junction 后两次读数均无差异。失败信息现在会列出实际尝试过的路径。

更正一处此前的错误说明

先前说明中称手工 junction ~/.dsh/profiles/node_modules/dsh-plugin-desk 是预设作用域生效的前提。该判断是错的。

实测:删除该 junction 后 presetInstall.installed 仍为 standard,ptc,minimal,cordis。它没有被任何代码路径解析——预设作用域靠运行时铸造 scope 建立,不靠这个 junction。

junction 已删除,并且没有为它添加自愈逻辑,因为要解决的问题并不存在。

结论:按 README 正常安装的用户不需要手工建任何东西。

测试

npm test 19 → 22 项全通过。

新增 3 项:

  • 解析根回退(第一个根解析不到时由第二个根赢下)
  • 全部根都失败时逐一列出尝试过的路径
  • 基顺序与去重

仍然未验证(如实标注)

  • 两维都关后从 / 命令目录消失(未端到端走一遍)
  • 只关模型维时 get() 仍返回真正文
  • 状态文件损坏时的降级行为

与本插件无关的既有问题

5 个用户预设(anchored-standard / router-spec / router-standard / whoami-standard / zero-anchored-standard)自身无法挂载,在 presetInstall.failed 里如实暴露:

preset "router-standard" failed to mount:
failed to apply loader entry persona (@deepseek-ai/dsh-persona): invalid config:
  - $.prefix missing required value

安装

dsh plugin --profile web add "github:Amouren7/dsh-plugin-desk#v0.2.1"

v0.2.0 — 技能管理

Choose a tag to compare

@Amouren7 Amouren7 released this 11 Sep 05:04

v0.2.0 — 技能管理

插件管家页新增 插件 | 技能 分段控制。技能页回答三个原来无解的问题:它是做什么的、怎么触发它、怎么关掉它。

新增

  • 技能盘点:60 个技能全量列出,含作用、whenToUse、来源、指令文件路径。

  • 标明唯一可用的触发方式。技能的 invocation 有两个独立维度,界面把它们翻成一句人话:

    模型自动加载 / 命令 界面直接告诉你
    ✓ ✓ 模型会自己调用;也可用 /name 手动唤起
    ✗ ✓ 模型看不到它 —— 只能用 /name 手动唤起
    ✓ ✗ 仅模型自动调用(/name 不可用)
    ✗ ✗ 已停用

    本机实测有 14 个技能落在第二行:它们在模型目录里完全不存在,靠翻文件夹发现不了。

  • 两个真开关(模型自动加载 / / 命令可用),热生效、可恢复默认,不修改任何 SKILL.md。

  • 清理线索:实测 40 个技能目录里躺着一份不生效的 SKILL.md(加载器只认 <技能名>/SKILL.md),且与生效那份内容不同;2 个目录混入了非技能文件。

  • 来源与升级对象:从路径反解归属包与版本(如 archify ← @tt-a1i/archify-dsh)。

实现要点

技能住在 agent preset 作用域,不在全局层。而服务读取走 topology-sensitive 属性代理 —— ctx.skills(声明式注入)返回绑定到访问上下文的反射,ctx.get('skills') 读的是全局存储。因此必须为每个 preset createScope 并走该作用域的 .skills 反射注册 rank-0 影子 provider,否则候选会被更近的层直接盖掉。这一步不需要修改任何预设文件,shipped 与用户预设一并覆盖。

停用是覆盖不是删除:技能文件仍在磁盘,ctx.skills.get() 直调仍可取到正文,但模型目录与 / 菜单都拿不到。删掉 ~/.dsh/plugin-desk-skills.json 即完全复原。

修复

  • 客户端错误硬化:不再吞成裸 SyntaxError: Unexpected end of JSON input,改为显示 HTTP 状态 + 响应体头部 + 15 秒超时提示。原先 404 空响应体、服务端崩溃、响应被别的路由接管三种情况完全无法区分。
  • 路由注册自愈:注册前先清自己的同名路由残留,避免上一代 fiber 的泄漏让本次 apply() 抛 duplicate prefix route 而整体失败。

验证

单元测试 19 项(npm test),覆盖路由自愈、客户端错误硬化、技能派生函数,以及一个能跑通 apply() 全链路的冒烟测试。

系统级验证停用真的生效(由 harness 自身确认,非插件自证)—— 观察本会话的 <available_skills> 目录:

动作 目录变化
设 brainstorming 模型自动加载 = 关 brainstorming 消失
恢复默认 回来
设 grilling 模型自动加载 = 关 grilling 消失
恢复默认 回来

完整实测记录(含未验证项的如实标注)见 tests/acceptance.md。

已知限制

  • 3 项验收未端到端验证:两维都关后从 / 命令目录消失、只关模型维时 get() 是否返回真正文、状态文件损坏降级。机制已证实,但没走完整链路,不计入通过。
  • 无自动升级按钮:实测 57 个技能 0 个是 git 仓库、无清单、无安装元数据,通用自动升级路径不存在,只标注该升级什么。
  • 5 个用户预设自身无法挂载(与本插件无关):anchored-standard / router-spec / router-standard / whoami-standard / zero-anchored-standard 的 persona 行缺少必填的 prefix。由于这些预设的技能同时也由可用的 shipped 预设提供,当前 60 个技能仍全部可开关。

安装

dsh plugin --profile web add "github:Amouren7/dsh-plugin-desk#v0.2.0"

v0.1.0 — 插件管家首发:说明 + 一键启停 + 安全卸载

Choose a tag to compare

@Amouren7 Amouren7 released this 11 Sep 02:56

插件管家 v0.1.0

补上 DSH 官方「设置 → 插件」页(只读清单)缺的两件事:看不懂插件是做什么的、关不掉/卸不掉。

安装后位置:设置 → 插件 → 插件管家(与官方 插件配置/插件列表 并列)。

功能

  • 一句话说明:按 dshhub.summary → package.json.description → README.md 首段 的优先级取说明,自动剥离 Markdown/HTML 并按语义边界截断
  • 来源徽章:官方 / 社区 / GitHub 直装 / 本地链接,判定读 pnpm-lock.yaml 的 specifier
  • 一键停用/启用:走 Cordis 官方 Entry.update({ disabled }),fiber 热 dispose / 重装配,不需要重启
  • 安全卸载:快照 → loader.remove → 校验 → 失败按快照恢复;@deepseek-ai/* 官方组件拒绝卸载
  • 噪声过滤:本机 168 个已安装包收敛为 5 个真插件(过滤 154 个非插件依赖 + 4 个框架内部条目)
  • 状态持久化:~/.dsh/plugin-manager.json,每次启动重放

实测环境

Windows 11 · DSH 0.1.5-rc.1 · Node 24.18.1 · web profile

  • 官方插件页 data-slot-error 为空,插件管家标签正常出现
  • 5 张卡片渲染齐全:名称 / 说明 / 来源徽章 / 版本 / 运行状态
  • 界面点「停用」→ fiber 已 dispose,工具与路由随即注销,徽章变「已停用」,按钮变「启用」
  • 界面点「启用」→ fiber 重新装配完成,徽章回「运行中」
  • 卸载:移除 → 校验确认 → 该插件路由端点随之失效(证明真 dispose)→ 记忆落盘

安装

dsh plugin --profile web add "github:Amouren7/dsh-plugin-desk#v0.1.0"

装完重启 dsh web,然后 Ctrl+Shift+R 强制刷新页面。

已知限制

  • 尚未发布到 npm,暂用 GitHub 源码安装(npm 上 dsh-plugin-manager / dsh-plugin-hub / dsh-plugin-console 均已被他人占用)
  • 兼容性验证仅覆盖 DSH 0.1.5-rc.1;更低版本缺少 settings.plugins.tab 插槽
  • 官方组件只能停用、不能卸载(卸载会破坏启动)

开发记录

docs/SLOT-CONTRACT.md 记录了设置页插槽的注册契约,以及排查过程中被实测推翻的几个假设(返回 DOM 节点、返回 { render() } 对象、在组件体内 require('react') 都会让官方页面变空白)。若你也在写 DSH 前端插件,这份记录能省掉同样的弯路。